Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Обсуждений тред (https://javascript.ru/forum/offtopic/47364-obsuzhdenijj-tred.html)

Vlasenko Fedor 25.12.2016 12:37

nerv_,
указать в readme лицензию распространения уже не модно ?

nerv_ 27.12.2016 08:58

Цитата:

Сообщение от Poznakomlus
указать в readme лицензию распространения уже не модно ?

не "уже не модно", а "тогда не модно было" :)

nerv_ 06.02.2017 13:18

Всем привет! :)

Вопрос: как вы описываете зависимости и подключаете их на фронтэнде?
О чем именно речь: допустим есть проект. Речь идет о фронтенде. В браузер подключается модуль X, у которого есть зависимость Y. В свою очередь у модуля Y есть зависимость Z.

Олдскульное подключение будет выглядеть следующим образом (условимся, что один файл -- один модуль):
<script src="Z.js"></script>
<script src="Y.js"></script>
<script src="X.js"></script>

Тут мы руками разруливаем подключение зависимостей. Этого хотелось бы избежать.

Хочется сделать так
<script src="X.js"></script>

и при этом, чтобы необходимые зависимости подключились автоматически.

Интересуют стратегии обе стратегии (development и production).

cyber 06.02.2017 13:21

nerv_, что мешает юзать webpack?

Подключаем X.js, далее
X.js

import "Z.js";

// или динмачески
import("./Y.js").then( y => ...)

nerv_ 06.02.2017 13:42

Цитата:

Сообщение от cyber
что мешает юзать webpack?

1. c webpack'ом каждый раз придется бандл(ы) пересобирать. Или я ошибаюсь? (стратегия production)
2.
X.js
import "Z.js"; // тут я не знаю, как подключены зависимости. Они могут быть подключены олдскульно [как глобальные переменные] (сv. мой пост выше) или через тот же вебпак

Вебпак так работает?

cyber 06.02.2017 13:52

Цитата:

Сообщение от nerv_
c webpack'ом каждый раз придется бандл(ы) пересобирать. Или я ошибаюсь? (стратегия production)

врубил webpack --watch и фигачешь код, для продакшена делаешь отдельный конфиг и запускаешь продакшн конфиг когда нужен продакшн бандлс, в чем проблема
Цитата:

Сообщение от nerv_
Они могут быть подключены олдскульно [как глобальные переменные] (сv. мой пост выше) или через тот же вебпак

С вебпаком есть много решений, например https://www.youtube.com/watch?v=7LSE...=102s&index=27
или так
Z.js
..
window.Z = (z) => ... ;


X.js
import "./Z";

window.Z("z");


За год использования вебпака, еще не нашлось такой проблемы которую не удалось решить вебпаком, хотя у меня куча легаси кода)

nerv_ 06.02.2017 13:53

Кажется, jspm -- то, что мне нужно:

Цитата:

For development, load modules as separate files with ES6 and plugins compiled in the browser.

For production (or development too), optimize into a bundle, layered bundles or a self-executing bundle with a single command.
http://jspm.io/

Посмотрим. Я с ним не знаком.

nerv_ 06.02.2017 14:04

Цитата:

Сообщение от cyber
врубил webpack --watch

в том то и проблема, что врубить требуется:
1) установить ноду
2) установить вебпак
3) локально разрабатывать
не всегда хочется этим заморачиватся.

cyber 06.02.2017 14:34

Цитата:

Сообщение от nerv_
1) установить ноду
2) установить вебпак

Имхо не вижу, проблемы в этом, раз установил и забыл.
Цитата:

Сообщение от nerv_
http://jspm.io/

Посмотрим. Я с ним не знаком.

судя по гитхабу он не развивается

annyrtd 06.03.2017 15:08

Вывод в файл

index.js
const {readFromFile, writeToFile} = require('./readFromFile');
...
case '11':
    return writeToFile('newFile.json', JSON.stringify(investors)); //investors.concat(deposits)


readFromFile.js:
.........

function writeToFile(file, data) {
  return new Promise((resolve, reject) =>{
    fs.writeFile(file, data, 'utf-8', function (err) {
      if (err) {
        reject(err);
      }

      resolve('Данные успешно сохранены')
    })
  })
}

module.exports = {readFromFile, writeToFile};



Выход:
app.js
case UI.EXIT:
    process.exit(0);


ui.js
constructor() {
   ....
   this.EXIT = 10;
}



Вывод существующих пунктов отправления:

app.js
case UI.MENU_PRINT_FLIGHTS_BY_POINTS:
            // получаем пункты назначения рейсов и фильтруем из общего списка
			departures = flights.map(flights => flights.departure);

            console.log('Возможные пункты направления');
            showAll(departures);

            return UI.getRangeValue('Выберите пункт отправления:', 1, departures.length).then(answer => {
                departure = departures[answer - 1];
                return UI.getDestination();
            }).then(destination => {

trikadin 06.03.2017 19:26

annyrtd, зачем это здесь?

destus 06.04.2017 11:38

Всем привет!

1) Кто что использует на сайте для картинок < 10 kb. Таких картинок, скажем, 40 штук. Спрайт или base64 ?

2) Кто как ресолвит пути к картинкам в gulp(<4) для sass файлов? Понятно, что можно делать и вебпаком, но интересует именно такая ситуация. Пример, структура папок
Код:

/frontend
    /scss
        /header
            header.scss
            loader.gif

header.scss
.header {
    width: 300px;
    height: 300px;
    border: 1px solid red;
    margin: 0 auto;
    background: url('loader.gif') left center no-repeat;
}

Если использовать типа такого
return combiner(
        gulp.src('frontend/scss/**/*.scss', {base: 'frontend/scss'}),
        $.sass({
            outputStyle: !isDevelopment ? 'compressed' : 'nested'
        }),
        $.concat('main.css'),
        gulp.dest('public')
    )

то в public будет такая картина
Код:

/public
    /header
        loader.gif
    main.css

И путь до картинки в main.css не изменится на header/loader.gif.

Написал небольшое решение. Оно работает. Но может как-то проще можно? :)

const through2 = require('through2').obj;
const rework = require('rework');
const reworkUrl = require('rework-plugin-url');

function prependUrls(css, prepend) {
    return rework(css)
        .use(reworkUrl(function(url) {
            if (url.indexOf('data:') === 0) {
                return url;
            } else {
                const newUrl = prepend + url;
                return newUrl.replace('//', '/');
            }
        }))
        .toString();
}

gulp.task('...', function(){
    return combiner(
        gulp.src('frontend/scss/**/*.scss', {base: 'frontend/scss'}),
        $.sass({
            outputStyle: !isDevelopment ? 'compressed' : 'nested'
        }),
        through2(
            function (file, enc, cb) {
                const prepend = path.dirname(file.relative) + '/';
                const css = prependUrls(file.contents.toString(), prepend);
                file.contents = Buffer.from(css);
                cb(null, file);
            }
        ),
        $.concat('main.css'),
        gulp.dest('public')
    )
})

join 07.04.2017 07:06

Цитата:

Сообщение от destus
1) Кто что использует на сайте для картинок < 10 kb. Таких картинок, скажем, 40 штук. Спрайт или base64 ?

Если применяю тег img - использую base64. Если css background использую спрайты transparent png (+ сжатие) or base64.
В вашем случае лучше спрайт.

cyber 12.05.2017 14:51

Как вы запускаете фоновые задачи для nodejs? Child process?
Например мне нужно что то трудоемкое сделать в фоне что бы не блокировать основной процесс.
Как вы решаете такую задачу? И какие инструменты юзаете?

Vlasenko Fedor 13.05.2017 00:33

Под linux exec command > /dev/null 2>&1

cyber 13.05.2017 00:37

Poznakomlus, да но мне нужно запустить код на ноде, только в другом процессе)

Vlasenko Fedor 13.05.2017 00:41

так напиши
exec('node myscript.js > /dev/null 2>&1');

таким образом запустишь скрипт в отдельном потоке
https://habrahabr.ru/post/138591/
возможные проблемы
использовать nohup (nohup node myscript.js)
использовать полный путь к бинарнику node

cyber 13.05.2017 13:23

Poznakomlus, ну если так подходить к делу то лучше использовать fork. Но мне я думал о чем то типо kue только без редис

nerv_ 17.05.2017 23:17

async / await
 
как же мы раньше без этой прелести жили :)

const fs = require('fs')
const path = require('path')


let rootDir = path.join(__dirname, '..')


// [url]https://github.com/nervgh/koa-architect[/url]
exports.get = {
  'index': async function (ctx) {
    ctx.state.root = await readRoutesRecursive(rootDir, new Node('', 'admin'))
    ctx.render(__dirname, 'views/index')
  }
}


// TODO: Should we move this code to a standalone package?
class Node {
  /**
   * @param {String} prefix
   * @param {String} name
   */
  constructor(prefix, name) {
    this.name = name
    this.path = `${prefix}/${name}`
    this.children = []
  }
  /**
   * @return {Object}
   */
  toJSON() {
    return Object.assign({}, this)
  }
}
/**
 * A few promisified fs methods
 * @type {Object}
 */
const fsp = {
  lstat: promisify(fs.lstat),
  readdir: promisify(fs.readdir)
}
/**
 * @param {String} dir
 * @param {Node} node
 * @return {Promise.<Node>}
 */
async function readRoutesRecursive(dir, node) {
  for(let name of await fsp.readdir(dir)) {
    if (await isDirectory(path.join(dir, name))) {
      let tryMiddleware = path.join(dir, name, 'middleware')
      if (await isDirectory(tryMiddleware)) {
        node.children.push(await readRoutesRecursive(tryMiddleware, new Node(node.path, name)))
      } else {
        node.children.push(new Node(node.path, name))
      }
    }
  }
  return node
}
/**
 * @param {String} pathString
 * @return {Promise.<Boolean>}
 */
async function isDirectory(pathString) {
  try {
    let stat = await fsp.lstat(pathString)
    return stat.isDirectory()
  } catch (err) {
    return false
  }
}
/**
 * @param {Function} fn
 * @param {*} ctx
 * @return {Function}
 */
function promisify(fn, ctx) {
  return (...args) => {
    return new Promise((resolve, reject) => {
      args.push((err, data) => err ? reject(err) : resolve(data))
      fn.apply(ctx, args)
    })
  }
}

cyber 17.05.2017 23:37

nerv_, мне тоже нравится async/await с koa получается не плохо и + мои декораторы)
@Controller("/test")
export default class {

    @RequestMapping({value: "add", method: RequestMethod.POST})
    async add(ctx) {
        await service.doAction(ctx.request.body.files);
        ctx.redirect("/plugin/list");
    }

    @RequestMapping("/")// by default method GET
    async uploadPageView({render}, params) {
        await render("upload.html");
    }

    @RequestMapping("list")
    async list(ctx) {
        return service.getList();
    }
}

cyber 25.05.2017 21:10

Не понимаю зачем некоторые люди пишут такую дичь и даже ее не коментируют (это java)
private void _write(byte a, byte b, byte c) throws IOException {
                out[0] = ENCODING_TABLE[(a>>2)&0x3F];
                out[1] = ENCODING_TABLE[((a<<4)&0x3F|(b>>4)&0x0F)];
                out[2] = ENCODING_TABLE[((b<<2)&0x3F|(c>>6)&0x03)];
                out[3] = ENCODING_TABLE[c&0x3F];
                super.out.write(out,0,4);
            }

cyber 04.06.2017 20:40

Инетерсует либа для очереди, что то похожее на https://github.com/Automattic/kue только без redis

nerv_ 21.06.2017 12:51

Вложений: 1
Кто-нибудь знает, как выстроить это всплывающее окно обратно в левую панель, рядом с "Favorites"?
Сейчас для достижения данного эффета приходится перезапускать IDE. Хотелось бы без перезапуска.

cyber 06.07.2017 12:28

Кто пишет на react, вы делали что то такое :
есть например root приложения redux,
ReactDOM.render(<App locale="en-US" userID={1} />, container);

и какой то внешний компонент который не зависит от основного приложения
ReactDOM.render(<OutsideComponent locale="en-US" userID={1} />, container);

?

Erolast 09.07.2017 22:37

Обнаружил интересную такую багофичу в V8 касательно геттеров.

Изначально я пытался сравнить производительность вызова геттера с вызовом обычного метода. Тестировал в node.js v8.1.3, Ubuntu 16.04 LTS, Intel Core i3-5005U вот таким кодом:
let object1 = {
  hello() {
    return Math.random();
  }
}

let object2 = {
  get hello() {
    return Math.random();
  }
}

let heap1 = [];
let heap2 = [];

console.time("object1");
for (let i = 0; i < 1000000; i++) {
  heap1.push(object1.hello());
}
console.timeEnd("object1");

console.time("object2");
for (let i = 0; i < 1000000; i++) {
  heap2.push(object2.hello);
}
console.timeEnd("object2");


Результат получился довольно обидный - вызов геттера оказался почти в три раза медленней вызова метода (~275ms против ~95ms). Полез в гугл разбираться, почему так (по логике, особой разницы быть не должно, ведь правда?), оказалось вот что: при объявлении геттера в литерале объекта отключаются какие-то оптимизации из-за каких-то проблем с памятью (https://codereview.chromium.org/714883003, в подробностях не секу), и чтобы этого избежать, нужно устанавливать геттер через Object.defineProperty или, внезапно, литералом, но в прототип:

let object3 = {};
Object.defineProperty(object3, "hello", {
  get() {
    return Math.random();
  }
})

let object4 = {
  __proto__: {
      get hello() {
        return Math.random();
      }
  }
}

let heap3 = [];
let heap4 = [];

console.time("object3");
for (let i = 0; i < 1000000; i++) {
  heap3.push(object3.hello);
}
console.timeEnd("object3");

console.time("object4");
for (let i = 0; i < 1000000; i++) {
  heap4.push(object4.hello);
}
console.timeEnd("object4");


Тогда всё классно: и тот, и другой вариант одинаково исполняются за приемлимые ~93ms, что даже немного быстрее прямого вызова (там при повторных запусках наблюдается такой же разброс значений, но на три-четыре миллисекунды выше).

В фф результат одинаково хреновый везде) у меня ~160ms. Всё в порядке :)

В общем вот так вот. Может, кому-нибудь пригодится :) Судя по тикету на chromium.org штука эта довольно древняя и исправлять её не торопятся, так что в высоконагруженных проектах вполне может быть актуально.

cyber 15.07.2017 19:29

Сегодня я понял как случайно можно удалить данные с сервера...
Сегодня вместо
rm *xsd

я написал
rm * xsd

Слава богам что без -r не удаляет подпапки

Tim 18.07.2017 00:37

Кто-нибудь умеет работать с портами из ноды? А то я костыль на go юзаю =(

cyber 18.07.2017 12:26

Tim, в каком смысле с портами? Можешь более конкретно написать вопрос?

join 17.08.2017 07:10

нейросеть-копипастерша
 
Вложений: 1
Вложение 3594

Задача выполнима?

Nexus 19.08.2017 00:00

Цитата:

Сообщение от join
Задача выполнима?

я думаю выполнима, но вряд ли для фрилансера.

nerv_ 20.08.2017 11:17

Цитата:

Сообщение от join
Задача выполнима?

за ту сумму, которя указана, скорее всего нет

join 21.08.2017 07:46

Nexus,
nerv_,

Мое мнение. Если эту задачу возмется реализовать какой-то гигант типо яндекса или гугла, с этой задачей они справятся, но результат все равно будет с ошибками и смешными несуразностями. Как например онлайн-переводчики.

SadBoy 01.09.2017 01:46

Цитата:

Сообщение от join (Сообщение 461838)
Вложение 3594

Задача выполнима?

думаю, да. сразу ассоциировалась с семантическим ядром и найросетями... но для начала бы научить эти самые нейросети генерировать адекватные фразы на 10-20 слов, не говоря уже о работах на 10-12 листов...

cyber 15.09.2017 11:41

Народ, кто-то занимается чем то связанным с криптовалютами?

cyber 13.10.2017 10:08

может у кого то будут идеи по этому вопросу https://toster.ru/q/469374

nerv_ 16.10.2017 13:07

Виктор Грищенко — Swarm: синхронизируем рой устройств

nerv_ 14.11.2017 16:22

Node.js & Typescript
 
Всем привет!

Исторически так сложилось, что есть Node.js на сервере. И вроде бы все хорошо, если бы не... отсутствие типизации в JS как таковом, и как следствие, ошибки времени выполнения, вместо ошибок компиляции (интерпретации).

В связи с чем, запрашиваю у вас шаринг опыта использования связки Node.js & Typescript. Конечно, если таковой имеется :)

Спасибо.

cyber 18.11.2017 14:30

КТо знает что такое cumulative ttl (time to live) ?

join 19.11.2017 06:44

cyber,
Википедия говорит, ttl - период жизни пакета данных в сети.Time_to_live

-"Контроль TTL часто используются провайдерами для обнаружения трафика несанкционированного подключенного устройства."

Предположу, что cumulative ttl - это момент взрыва пакета (окончательного его исчезновение):lol:

cyber 20.11.2017 18:40

Цитата:

Сообщение от join
Предположу, что cumulative ttl - это момент взрыва пакета (окончательного его исчезновение)

Тоже что то такое подумал, на собеседование было задание
Цитата:

Write a function to calculate the cumulative TTL of the following set of requests. (The provided answer is correct and should not be modified. )
let requests = [
{requestId: 'poiax',  startedAt: 1489744808, ttl: 8},
{requestId: 'kdfhd',  startedAt: 1489744803, ttl: 3},
{requestId: 'uqwyet', startedAt: 1489744806, ttl: 12}, 
{requestId: 'qewaz',  startedAt: 1489744810, ttl: 1}
]

let cumulativeTtl = 15



Часовой пояс GMT +3, время: 15:25.