Pull to refresh
15
0
Дмитрий Беляев @bingo347

Разработчик Rust

Send message
Насчет clipboard написал, так как в свое время долго мучился, как организовать копирование файлов в файловом менеджере (например nautilus в ubuntu) и вставку их в моем приложении, при абсолютной уверенности, что это возможно, так как Atom и VSCode написанные на электроне это умеют, пока методом тыка не ввел в консольке clipboard.readText() и получил строку с абсолютными путями до файлов
Читая статью вспоминал, как ковырял свое первое приложение на электроне чуть больше года назад (документация тогда была на порядок запутаннее, чем сейчас). Вроде бы и выглядит как пересказ основных моментов из документации, но сделано это качественно и доступным языком, за что хочу Вас поблагодарить.
Думаю было бы полезно в подобном же стиле расписать работу со следующими стандартными библиотеками электрона:
web-view-tag
clipboard
Особенно интересует webview так как позволяет запустить отдельный render процесс в том же рабочем окне
+ к Вашему комменту добавлю, что в node.js разные контексты VM приведут к такому же результату, а так же это истинно для любых объектов, а не только массивов
Все что делает оператор instanceof — проверяет, что в цепочке прототипов объекта слева от него присутствует ссылка на прототип конструктора справа
В то время как обычное равенство при наличии null в сравнении всегда возвращает false.
Вы случайно не спутали с NaN?
null == null // true
null === null // true
NaN == NaN //false


Насчет for-in цикла, использовать его, вообще плохая практика, кроме описанных Вами проблем, он еще и отключает оптимизатор во всех актуальных сегодня компиляторах (v8, SpiderMonkey, Chakra)
Вместо него лучше использовать
//es2015 simple
for(let key of Object.getOwnPropertyNames(object)) {}

//es5
for(var keys = Object.getOwnPropertyNames(object), i = 0, key = keys[0]; i < keys.length; i++, key = keys[i]) {}

//es2015 object iterator
function* objectIterator(object) {
  for(let key of Object.getOwnPropertyNames(object)) {
    yield [key, object[key]];
  }
}
for(let [key, value] of objectIterator(object)) {}


Любые манипуляции с arguments кроме чтения по индексам выключает оптимизацию в v8 и SpiderMonkey (про Chakra точно сказать не могу)
То же истинно для переменных-аргументов функции
То же истинно для передачи arguments во внешние функции или сохранения его в другую переменную, но есть исключение — 2 аргумент нативного Function.prototype.apply
То есть так — func.apply(this, arguments) — нормально

Хак для получения global объекта в strict режиме:
function getGlobal() {
  return (new Function('return this;'))();
}


Ну и напоследок, нестрогие сравнения — дурной тон, мало того что работают в разы медленнее, так еще подвержены ошибкам
Наверно именно поэтому у каждого третьего iPhone сейчас, притом у большинства взятый в кредит
Если браузер не поддерживает стандарты — это проблема браузера, и разработчиков этого браузера, но никак не проблема разработчиков сайтов, которые используют современные возможности, имхо
Нужно смотреть в корень проблемы. Не один квалифицированный разработчик не пойдет работать на госсектор.
Например мне в госсекторе, с моим стажем (5 лет в коммерческой разработке, 3 из них как ИП, так что не в счет) и непрофильным высшим (учитель информатики), предложат максимум 25 тыс…
Сейчас жизнь вынудила работать на дядю, и я ощущаю, что мой доход (сотка с хвостиком + премии) заметно упал…

Недавно случай был… жизненный
Сижу в баре, по соседству сидит компания, отмечает чей то ДР, один из них в определенный момент высказывается: «Я ж все таки программист!» Подхожу значит познакомится, «на чем пишешь?» — «на всем понемногу» — «а основной язык?» — «Java». Я про себя уже думаю, что если android, то знакомство крайне полезное…
Меж тем он у меня спрашивает «Зачем интересуешься? Тоже программист? Сам то на чем пишешь?» — «Во основном на JS изредка на Go»… И тут его понесло, на предмет «JS — говно, Java рулит», что я никак не ожидал от дяди за 40… Особенно убила фраза «Да в твоем JS пустой массив умножить на пустой массив будет NaN!» — «Вообще-то []*[] будет 0» — «Я сейчас про ванила-JS говорю, а не всякие там ангуляры и ноды»
Вообщем пришел он к выводу что я кодер-недоучка, так как после 5 кружки пива не могу дословно (как в википедии) дать определение рефлексии…
Уже разворачиваясь, но так как зацепило, спрашиваю: «А давно в программировании?» — «больше 20 лет» — «А что ты за эти 20 лет сделал?» — «Я сервера для налоговой пишу»
на js в одну строку
for(let s, i = 0; i < 100; i++) s = '', (i % 3 || (s += 'Fizz')), (i % 5 || (s += 'Buzz')), console.log(s || i);

и незачем мудрить
Иногда заказчик хочет именно подобную фигню, и ему до лампочки на юзабилити, если возвращаться к теме статьи — то это еще одна проблема, которая есть…
Ну а насчет задания, нужно было что-то, что можно было бы сделать быстро с одной стороны, с другой увидеть владеет ли кандидат css.
А так согласен с Вами, неудобно
Готовых фреймворков и библиотек — тьма тьмущая на все случаи жизни (это не большое преувеличение).

Как раз таки, на готовых фремворках и библиотеках «на все случаи жизни» и пишется ширпотреб. И проблема даже не в самих фреймворках…

Недавно потребовался в команду фронтенд разработчик, больше половины собеседуемых, позиционировавших себя middle-разработчиками не могут что-то сделать за пределами ангуляра, очень многие не в состоянии сделать ajax запрос на нативном апи браузера (а зачем, подтянем jquery ради одного только ajax), многие не в состоянии написать deapClone (а зачем, есть underscore/lodash), с заданием напишите простейший переключатель как в примере без использования js не справился вообще никто.
И это middle разработчики с опытом в фронтенде от 2х лет… Что они смогут написать?
Я правильно понимаю, что на живую конференцию продается только 100 билетов? и покупать их лучше как можно раньше?
Я тут не про рест аргументы, а про спред оператор в литерале массива, имеющий сходный синтаксис
var arr = [1, 2];
console.log([3, 4, 5, ...arr]); // [3, 4, 5, 1, 2]

Вместо arr допускается любой массиво-подобный объект
благодарю за ссылку, нашел для себе пару новшеств
Вы не вкурсе, в последних версиях бабеля поправили преобразование
[...arguments]

в
[].concat(Array.prototype.slice.call(arguments))

В исходном варианте утечки нет, после бабеля появилась
Причина деоптимизации «утечки аргументов» — связь между индексами объекта arguments и переменными в аргументах функции, при изменении одного — меняется другое, и это не ссылачная связь, а скорее биндинг, поэтому на машинном уровне такой код сложно анализировать.
Когда мы передаем объект arguments во вне функции, он передается по ссылке, внешний код может изменить значения объекта.
Поэтому оптимизатор отказывается менять код функции с подобным поведением, а так же функции подобные такой:
function f(arg) {
   arg = arg || DEFAULT; //Присвоили аргументу новое значение
}

2й аргумент нативного Function.prototype.apply исключение, так как вызываемая функция на наш arguments гарантировано воздействовать не сможет
До листал до середины, почти в каждом примере помеченным «хорошо» показаны bad-practices

[].slice.call(arguments)

Создали новый массив, только ради того чтоб обратится к прототипу, утечка аргументов это главный вырубатель оптимизаторов в v8 и SpiderMonkey, но к сожалению этим пестрит каждая 3я библиотека на npm, благодаря вот таким вот туториалам…
Сложно скопировать в функцию простой шаблон
var args; for(let i = arguments.length, a = args = new Array(i); i--; a[i] = arguments[i]);

Тогда скопируйте этот:
var args = Array.prototype.concat.apply(Array.prototype, arguments);


Создание новых функций для каждого инстанса быстрее чем копирование ссылок из прототипа? да ну?
Все методы, гетеры, сетеры должны быть в прототипе, все изменяемые свойства создаются в конструкторе, прототип обязан содержать свойство constructor — ссылку на свой конструктор.
Сложно запомнить? Используйте class из es2015

Ну и напоследок, функциональные выражения, которые живут дольше 1 вызова, должны быть именованны
someEmitter.on('event', function onSomeEmitterEvent() {
    //some code
});

не раз поможет при отладке
webpack --optimize-minimize

Вам в помощь
Лицензия BSD не разрешает нарушать авторские права. Если Вы форкните модуль, вы будете владельцем форка, но не самого модуля. А так же Вы обязаны оставить в своем модуле все копирайты, которые были в исходном модуле.
Спасибо за замечание, про пустой массив как то не подумал, поправил
Согласно спецификации, если нет инициирующего значения, в качестве него берется нулевой элемент, а перебор массива начинается с первого. В v8 и SpiderMonkey это работает согласно спецификации. Если действительно с этим где-то есть проблемы, то поправлю.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Backend Developer, Fullstack Developer
Lead