Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Collection v5 (https://javascript.ru/forum/project/47717-collection-v5.html)

kobezzza 06.09.2014 22:37

То ли осень на меня так действует, то ли ещё чего, но всю эту неделю боролся с тотальной ленью и писал мало кода, а работу над 5.2 нормально возобновил только вчера. Бог даст - завтра закончу часть по коду и можно будет уже пощупать потоки в действии.

kobezzza 12.09.2014 16:08

Закончил работу на версией 5.2. Скоро обновлю документацию.

Сделал небольшой видео обзор: http://www.youtube.com/watch?v=K2GAANmWTgQ

Demo:
http://jsfiddle.net/kobezzza/hut2jhL9/

kobezzza 12.09.2014 17:01

Провёл стресс тестирование:

100 000 потоков ни одного лага
1 000 000 потоков начинает глючить уже :)

Zend 12.09.2014 17:44

чёта у меня демка не запустилась. но потоки меня убедили. заюзаю твою либу :)

kobezzza 12.09.2014 17:46

Цитата:

Сообщение от Zend (Сообщение 330277)
чёта у меня демка не запустилась

Какой браузер? Если хром, то проверь что включен ES6.

chrome://flags/#enable-javascript-harmony и перезапустить браузер

Тестил работу в ФФ, хроме и ноде.

Ноду запускать с флагом
--harmony

Safort 12.09.2014 18:08

kobezzza,
можно пару слов о том, как потоки внутри устроены?
Я просто не представляю как их возможно сделать без setInterval/setTimeout.
//в код не иду, т.к. всё равно мало что пойму)

kobezzza 12.09.2014 18:28

Цитата:

Сообщение от Safort (Сообщение 330293)
kobezzza,
можно пару слов о том, как потоки внутри устроены?
Я просто не представляю как их возможно сделать без setInterval/setTimeout.
//в код не иду, т.к. всё равно мало что пойму)

Общая схема проста:

Есть планировщик потоков и он на каждой итерации событийного цикла выбирает из очереди потоков те, которые выполнятся в рамках текущей итерации, причём общее время всех операций должно быть не более 60мс.

Логично, что чем выше приоритет, тем выше шанс что поток попадёт на исполнение и его максимальное время исполнения.

Само разбиение операции использует yield, т.е. после каждой итерации Collection считается затраченое время и если оно больше дозволенного, то операция прерывается (yield).

Если очередь потоков не пуста, то раз в заданный момент времени (по setTimeout) планировщик опять выбирает потоки для запуска и выполняет.

https://github.com/kobezzza/Collecti...rEach.es6#L688

Safort 12.09.2014 19:58

kobezzza,
спасибо за пояснение)
*ушёл делать конкурента Коллекшену *злобно смеётся* *

kobezzza 12.09.2014 20:03

Цитата:

Сообщение от Safort (Сообщение 330317)
kobezzza,
спасибо за пояснение)
*ушёл делать конкурента Коллекшену *злобно смеётся* *

:D

kobezzza 13.09.2014 12:31

Проверил работу в Safari на маке... чёртовы слоупоки всё ещё не поддерживают генераторы :( Остаётся надежда, что в обещаном релизе Safari 8 они введут поддержку.

Вообще Safari сейчас самый отсталый браузер по поддержки фич и скорости работы. Также не могу найти нормальный ресурс, где пишут о новых фичах / планах новых версий Safari для разработчика, а не для простого пользователя, а то складывается впечатление, что в кроме новой панели вкладок в Safari 8 ничего и нет :)

Octane 13.09.2014 12:42

да какие генераторы, в последнем Safari 7.0.6 даже Map и Set нет, даже IE уже обогнал в этом плане

kobezzza 13.09.2014 12:46

Цитата:

Сообщение от Octane (Сообщение 330368)
да какие генераторы, в последнем Safari 7.0.6 даже Map и Set нет, даже IE уже обогнал в этом плане

Во-во, слоупоки чёртовы.

Что касается ИЕ12, то там должны появится генераторы, объект Proxy и прочие радости, а про Safari 8 я даж хз где почитать можно:-E

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

*) Opera Next
*) Chrome Canary
*) FF Aurora , FF Nightly
*) IE Developer
*) Safari ???

Octane 13.09.2014 12:50

Proxy разве не заменили на Object.observe?

kobezzza 13.09.2014 12:53

Цитата:

Сообщение от Octane (Сообщение 330371)
Proxy разве не заменили на Object.observe?

Нет, это же разные вещи. observe это простое отслеживание изменений, а Proxy - это нормальная рефлексия, т.е. можно перегрузить "несуществующий метод", вызов instanceof, вызов delete и т.д.

melky 13.09.2014 12:54

Цитата:

Сообщение от kobezzza
Кстати поправьте меня, если я не прав, но помоему Safari единственный браузер, у которого нету публичной dev-сборки.

похоже, что это действительно так. только благодаря тебе и узнал)

kobezzza 13.09.2014 13:07

Кстати, Proxy позволяют делать настоящее множественное наследование, без каких либо оверхедов, т.е. вешаем обработчик на событие "отсутствия свойства или метода" и перенаправляем на другой Proto Chain и т.д.

Другое дело, что такая фича нужна крайне редко, но всё равно - приятно :)

Octane 13.09.2014 13:07

так вот же http://nightly.webkit.org/

kobezzza 13.09.2014 13:08

Цитата:

Сообщение от Octane (Сообщение 330376)
так вот же http://nightly.webkit.org/

О как! Спс, почему то не подумал, что искать нужно было по WebKit, а не по Safari.

kobezzza 13.09.2014 13:21

Поигрался с Nashorn, кто не в курсе - это новая JS VM от Oracle, построенная поверх JVM и входящая в стандартную поставку Java 8 в замен старичка Rhino.

Собственно что могу сказать: движок быстрый (по заверению авторов не уступает V8, хотя V8 уже не является флагманом), но к сожалению поддержка только ECMAScript 5.1.

Логичный плюс VM поверх JVM - это лёгкий биндинг Java вызовов, т.е. мы можем в полной мере юзать всю мощь библиотек Java и JVM.

***

Кто хочет поиграться, то запустить REPL очень просто, например,

cd '/c/Program Files/java/jre8/bin'
jjs


Использование в Java:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("print('Hello World!');");

kobezzza 13.09.2014 17:17

Выпустил хотфикс v5.2.4

kobezzza 16.09.2014 18:05

Обновил доку, добавил описание новых параметров методов и т.д. а также добавил отдельную главу с описанием механизма работы потоков:

https://github.com/kobezzza/Collecti...%B2-Collection

Также выпустил очередной хотфикс апдейт 5.2.7

kobezzza 22.09.2014 20:29

http://habrahabr.ru/post/237613/

В такие моменты мне становится грустно, т.к. в Collection похожий механизм есть уже несколько лет :( А впрочем пх :)

Safort 22.09.2014 20:45

kobezzza,
всё потому, что Коллекшену не хватает рекламы/пиара.

kobezzza 22.09.2014 21:06

Цитата:

Сообщение от Safort (Сообщение 331796)
kobezzza,
всё потому, что Коллекшену не хватает рекламы/пиара.

Я в курсе, но тут 2 НО:

1) Нужна дока на инглише (ну это пол беды и вроде как работа над эти идёт :) )
2) Нужен пиарщик :D

У меня просто нет времени заниматься пиаром и так каждый раз себя по руке бью, как трачу лишнее время. Да и пофиг в общем, Collection и прочее написан под реальный проект, над которым я работаю и решают мои задачи - это самое главное, просто иногда обидно, что не могу людям просто даже рассказать о своих изысканиях, разве что тут веду блог, но кому тут это интересно? От силы человек 5-6 :)

Safort 22.09.2014 21:28

kobezzza,
Цитата:

2) Нужен пиарщик
Я только SS могу пиарить, на остальное сил не хватит)

Цитата:

Collection и прочее написан под реальный проект, над которым я работаю и решают мои задачи
*Опять. Опять он дразнит своим проектом. Изверг!*

Цитата:

просто иногда обидно, что не могу людям просто даже рассказать о своих изысканиях, разве что тут веду блог, но кому тут это интересно? От силы человек 5-6
А не лучше ли писать чуть более подробные статьи для того же Хабра, а тут давать ссылку? Так ведь гораздо лучше.

kobezzza 22.09.2014 21:32

Цитата:

Сообщение от Safort (Сообщение 331815)
А не лучше ли писать чуть более подробные статьи для того же Хабра, а тут давать ссылку? Так ведь гораздо лучше.

Хз мне тут удобнее как то, т.к. я могу не писать статьи, а просто писать заметки прям из головы. Да и раздражает тамошняя публика, хз почему так, но комменты из серии: "lodash лучше, я люблю lodash, lodash, lodash, lodash!!!" меня угнетают :)

Safort 22.09.2014 22:00

kobezzza,
тогда сам выбирай или писать краткие заметки тут и иметь медленно растущую популярность, или полноценные статьи на Хабре и быть заваленным пулл реквестами и комментами про lodash :D

kobezzza 22.09.2014 22:05

Цитата:

Сообщение от Safort (Сообщение 331828)
kobezzza,
тогда сам выбирай или писать краткие заметки тут и иметь медленно растущую популярность, или полноценные статьи на Хабре и быть заваленным пулл реквестами и комментами про lodash :D

Я выбрал писать проект :) Ну а то что он рождает хорошие инструменты, думаю только плюс.

Safort 22.09.2014 22:10

kobezzza,
Цитата:

Я выбрал писать проект
ну что ж, успеха тебе)

Цитата:

Ну а то что он рождает хорошие инструменты, думаю только плюс.
Это да.

melky 23.09.2014 10:07

kobezzza, как можно быстро понять $C? какая кривая обучения?

kobezzza 23.09.2014 10:20

Цитата:

Сообщение от melky (Сообщение 331885)
kobezzza, как можно быстро понять $C? какая кривая обучения?

Ну с моей точки зрения, что самое сложное в понимании $C - это не $C, а сама концепция функционального программирования. По моим личным наблюдениям многие люди из всех методов массивов юзают всего 2:

forEach
some - причём some юзают, как forEach который можно сбросить :D

А всякие map / reduce / filter в глаза не видели и не знают.

Потом нужно понять, что $C - это антоним Unix Way, т.е.

// Классический Unix Way, супер избыточно и не эффективно
filter().filter().map().slice()

// $C, ни одной лишней операции, супер эффективно и быстро
map(filter(), filter(), slice())


А остальное - это дело техники. Ну просто нужно потратить некоторое время и поиграться: может день/два и всё, всё таки библиотека не большая и есть подробная русская документация.

С другой стороны можно взять сборку Collection.core, где в составе 1 forEach, а сама либа весит всего 10кб и юзать :) В отличии от нативного forEach Collection поддерживает все существующие виды коллекций, работает супер быстро и поддерживают кучу опций.

kobezzza 23.09.2014 19:05

Цитата:

мб есть какие-то функции, которые используются при написании кода чаще всего?
Ну у меня самое частое это forEach, map, reduce, search, get, length, extend.

Вообще полную сборку библиотеки по функционалу можно разбить на блоки:

1) Итерационное API - набор методов, большинство из которых напоминают нативные для массивов, для итерациям по коллекциями, самая главная часть

2) Контекстное API - набор методов для работы внутри итератора

$C([ ... ]).forEach(function () {
    this.break();
});


3) Ссылочное API - небольшой набор методов для универсального доступа к свойствам объектов

var obj = {a: new Map([[1, [1, 2, 3, 4]]])};

$C(obj).get(['a', 1, 0]);


4) Кластерное API - набор методов, для инкапсуляции разные параметров внутри экземпляров $C

$C().addFilter({
    filter1: function () { ... },
    filter2: function () { ... }
})

$C([ ... ]).get('filter1 && filter2')


5) API для хранения данных - набор методов для загрузки / выгрузки коллекций в различные локальны хранилища

$C({ ... }).save({
    namespace: 'myData',
    lib: 'indexedDB'
})

...


$C().load({
    namespace: 'myData',
    lib: 'indexedDB'
})


6) Статичные методы - полезные функции, вроде extend

Цитата:

я б мог заняться этим на досуге - заодно и выучу её
Ну, если сделаешь, то честь и хвала :) Хотя мне кажется, что для тебя выучить $C будет вопросом дня :)

Цитата:

есть ли какой-нибудь сайт для $C (gh-pages), чтобы начать?
Когда то был, но я его потёр, когда перешёл на Gh, сейчас всё в вики.

Цитата:

PS. кстати, $C выглядит очень даже многообещающе, серьёзно говоря. и отлично подходит, например, для React
Спасибо :) Но мне кажется, что $C это в первую очередь очередь универсальных хэлпер для коллекций, т.е. замена underscore / lodash и т.д. Т.е. библиотека на каждый день: ну я собственно её так и юзаю :)

kobezzza 24.09.2014 10:05

В канарейке хрома новые виды коллекций и генераторы уже работают без включённого флага --harmony. Ура!

kobezzza 05.10.2014 14:50

Выпустил патч 5.2.9

melky 05.10.2014 17:12

kobezzza, ты в travis ci тестируешь? видел коммит в поддписке)

kobezzza 05.10.2014 17:20

Цитата:

Сообщение от melky (Сообщение 333574)
kobezzza, ты в travis ci тестируешь? видел коммит в поддписке)

Угу, хотя для Collection пока просто биндинг добавил :)

travis удобен тем, что можно забить сразу несколько версий ноды для теста + автоматическая синхронизация с комитами гита.

kobezzza 22.10.2014 15:40

Выпустил патч 5.2.10

kobezzza 31.10.2014 13:31

Выпустил патч 5.2.12

kobezzza 01.11.2014 22:01

Выпустил версию 5.3.1.

Добавлен новый метод .contains

kobezzza 05.11.2014 23:42

Выпустил патч 5.3.7


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