• Альтернативный WPF язык JAML = XAML − XML + JSON
    0
    Именно так, только yaml более сложный язык даже чем xml. А тут предельно простой. И переписать на C# или даже на C проще пареной репы — он специально так задумывался, чтобы можно было написать простой и эффективный парсер. Вот подробней об этом формате: hyoo.ru/?article=XML+%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE+Tree;author=Nin+Jin
  • readyto.travel — как сэкономить 30% и более при покупке авиабилетов
  • Создание модулей JS
    –1
    Я бы рекомендовал не заниматься ерундой с «изоляцией» пространств имён. Прям религиозный фанатизм.
    1. Иногда всё-таки нужно залезть в потроха, потому что нужный метод не был вытащен в апи. И не надо рассказывать, что это нехорошо и я не должен этого хотеть. Мне нужно решить задачу здесь и сейчас, а не когда там разработчики библиотеки решат принимать мой патч ИЛИ НЕТ.
    2. В целях дебага удобно опять же иметь доступ ко всем потрохам прямо из консоли, не занимаясь ерундой с расстановкой брейкпоинтов и исполнением своего кода в точке останова.
    3. Тезис про то, что мы можем под Window в разных модулях понимать разные вещи — на самом деле очень вредный совет. Ибо легко запутаться, когда одна сущность в разных местах называется по разному и наоборот разные одинаково — лишняя путаница. Гораздо лучше, когда одна сущность имеет строго одно глобальное имя. Пространства имён рулят, «модули» не рулят.
    4. Зависимости между модулями тут никак не отражены. Но если брать в пример попсовый RJS, то зависимости указываются как строки, являющиеся глобальным идентификатором модуля. Собственно какая разница, где будут глобально храниться все модули: в window или в require. Суть одна и та же.
    5. У всех функций есть «отображаемое имя» — оно показывается в профайлере, консоли и вообще очень полезная штука при дебаге. Удобно, когда имя функции представляет из себя глобальный ее идентификатор. Например, при таком объявлении:

    JSui.Div.prototype.title = function(){}

    Имя функции будет «JSui.Div.prototype.title»

    А при таком:

    function getNewId(){}

    Всего лишь «getNewId» и гадай потом из какого модуля эта веселая функция.

    «one var statement» — антипаттерн, поработай с системами контроля версий и поймёшь почему.

    «use strict» — разное поведение в разных браузерах. Нафиг оно надо. Защиту от протечек локальных переменных в глобальную область видимости обеспечит вам любой валидатор. Больше ничего полезного в этом стрикте нет.

    Зачем заводить константы для литералов? Надо не для минификатора код писать, а для программистов. А умный минификатор может и сам сгруппировать одинаковые литералы в переменную.

    В каждом файле у тебя лишних 8 строк копипасты. Я бы переписал эти монструозные divs.js и labels.js попроще:

    //divs.js
    this.JSui = JSui || {}
    JSui.Div = function(){

    }

    //labels.js
    this.JSui = JSui || {}
    JSui.Label = function(){

    JSui.Div()

    }
  • 6 мифов, мешающих разработчикам использовать Git
    +5
    В hola.org вообще cvs используют и слушать не хотят про эти ваши гиты)
  • Удобная документация для тех, кто хочет изучать FRP
    +1
    RxJS — это не FRP, это просто RP.
    Для тех кто не в теме, функциональное программирование — это не о функциях первого порядка, это о вычислениях без побочных действий.
  • Почему вы никогда не должны использовать MongoDB
    +3
    На второй же иллюстрации нарисован граф. Почему же вы пытаетесь упихнуть его в документы или таблицы? Используйте графовые базы и не будете иметь проблем. Серьёзно. Расширяйте свой кругозор, вместо того, чтобы в очередной раз менять шило на мыло.
  • Существуют только структурная и объектная парадигмы программирования
    0
    По секрету скажу, что SQL как и прочие *языки запросов* может быть применён не только к реляционным структурам.
  • Что такое HTML импорт и как это работает?
    +4
    Кроссбраузерные HTML инклуды: habrahabr.ru/post/90373/
  • Mapcode — простой и короткий адрес любого места на Земле
    +1
    Для повседневного использования не хватает избыточных данных. А то можно ошибиться в одной букве и заехать в ебеня.
  • Ожидающая функция fnDelay
  • Разбираем ACID по буквам в NoSQL
    0
    Я просто оставлю это здесь. Причащайтесь)
    www.orientechnologies.com/orientdb-vs-mongodb/
  • Разгоняем JavaScript вместе (Внимание, конкурс!)
    +1
    Особенно веселит «специальный приз» за самое медленное решение на эвалах, которое сливает даже выполненным в функциональном стиле)
    Эвалы дают +1 к скорости в микробенчмарках и -1 к поддерживаемости в реальных проектах.
  • Ключевое отличие AngularJS от Knockout
    0
    Эти «приёмы» правильнее всё же называть «костылями». Агнуляр умудряется тормозить и требовать применения «приёмов» там, где более толковые решения даже не затыкаются. Рендерить только видимые ячейки хорошо, когда они все одного размера и представляют из себя плоский список. Но стоит им начать подстраиваться под размер содержимого, динамически меняться в размерах и представлять из себя иерархическую структуру, так сразу определение что видимо, а что нет становится весьма нетривиальной задачей.

    И да, в более других решениях биндинги ничего не стоят (не считая небольшого потребления памяти) и их не надо отключать, лишая себя автоматической актуализации вьюшки.
  • Революция дата-байндинга с Object.Observe()
    0
    Как я описал выше — будут лишние вызовы обработчиков, от которых придётся избавляться дополнительными костылями, которые будут буферизировать события.

    Кстати, куда можно написать, чтобы предложить разработчикам браузеров реализовать более полезное апи?
  • Революция дата-байндинга с Object.Observe()
    0
    Как «автор фреймворков» не вижу особого повода для радости.
    1. Многие всё ещё поддерживают ie8 где даже акцессоров толком нет.
    2. В сравнении с ангуляровскими грязными проверками любой фреймворк выглядит как манна небесная.
    3. Никто находясь в трезвом уме не будет светить полями наружу — только через акцессоры. Соответственно вся подписка/отписка/нотификации будут делаться как и сейчас — вручную. Новое апи тут вносит лишь неоднородность реализации не давая ощутимого профита.
    4. Единственное полезное применение — отслеживать изменение в чужих объектах. Особенно полезно это было бы для хостовых объектов. Но о них в статье ни слова и что-то мне подсказывает, что с ними будет всё как обычно — плохо.
    5. Никак не решена проблема холостых вычислений. Например, переменная А зависит от C и B, а B зависит от C. В результате когда изменится С сначала будет вычислена А, потом В, а потом снова А. В общем с этим АПИ будет та же беда, что и с нокаутом:
    диаграмма: nin-jin.github.io/slide/#slide=induction
    тест: jsperf.com/reactive-libraries-comparison
    6. Они это апи точно согласовали с остальными игроками? А то получится, что в хроме Object.observe, в мозилле watch, а ie вообще не при делах.
  • Что не так с Google+
    0
    Простите, но средний пользователь интернета считает вас балаболом, поэтому вы нам не подходите.
  • Зачем нам нужен Rust?
    +1
    tenshi: А при чём тут множество значений Integer?) Map — это сюръекция множества ключей _засунутых в структуру_ на множество значений _тоже засунтых в структуру_. Как ключи, так и значения в общем случае могут быть любых типов. Важно лишь то, что для любого значения найдётся какой-нибудь ключ.

    Сюръекция, в строгом математическом смысле, это «отображение на», т.е. такая функция, у которой образ совпадает со множеством значений. В общем случае образ функции может быть меньше области значений. Например, есть функция f(x) = x^2. Ясно, что мы можем считать, что f: R → R. Но Im f = [0, ∞) ⊂ R. Т.е. f — не сюръекция. Это, я думаю, вы знаете.

    Аналогично с Map. В декларации Map явно указываются области определения и значения (собственно, почему словарь и назвали «отображением» в английском): Map. Если бы Map m было бы сюръекцией, то для любого Integer i всегда бы нашлось такое String s, что m.get(s).equals(i), что, понятно, не соответствует действительности.

    Googolplex: Да, любое отображение можно рассматривать как сюръекцию на его образ. Однако, строго говоря, это будет уже другое отображение, потому что отображение — это тройка множеств (dom f, Im f, f ⊆ dom f × Im f), и если одно из множеств поменяется, то формально само отображение тоже будет другим. В контексте структур данных это существенно. В частности, Java не позволяет описать тип «Множество чисел типа Integer, являющихся значениями данного экземпляра Map», поэтому нельзя говорить о «множестве значений, засунутых в структуру». Следовательно, когда вы имеете на руках Map, вы можете его понимать только как отображение f: String → Integer, и никак иначе. А это уже, очевидно, не сюръекция. Если бы в Java можно было бы описать такой тип (возможно, Agda2 и аналогичные языки с зависимыми типами такое могут), хотя я лично сомневаюсь в его полезности, то тогда, вероятно, можно было бы говорить о сюръекциях, хотя я тут тоже утверждать ничего не могу — не работал особенно с этими языками.

    tenshi: Отображение типа на тип — это уже полноценная функция. Map и подобные структуры работают не с типами (которые в общем случае — бесконечные множества), а с конкретным конечным множеством значений. При этом одни значения помещаются в «образ» (ключи), а другие в «отображение» (значения). А Map гарантириует сюръективное отображение первого множества на второе. А запись вида Map — не более чем ограничение на типы ключей и значений. Если вы запросите значение по ключу, которого нет в мапе, то получите что угодно, но только не Integer.
  • Зачем нам нужен Rust?
    +1
    Есть же красивый термин «сюръекция» :-)
  • Разгоняем JavaScript вместе (Внимание, конкурс!)
    0
    Вы это, напишите, что всё надо писать на английском, ибо проверять это будет не русскоговорящий человек.
    Не понятно требование реализовать в точности такой же интерфейс. Все эти однобуквенные сокращения просто невозможно запомнить — приходится безконца лазить в шпоргалки. Кроме того, передавать паттерн при каждом вызове — не удобно и несколько медленнее.
    Такое апи было бы куда предпочтительнее:

    var formatTime = $jin.date.formatter( 'Weekday, YYYY-MM-DD hh:mm' )
    formatTime( new Date ) // Thursday, 2014-05-23 11:45
  • Разгоняем JavaScript вместе (Внимание, конкурс!)
    0
    jsdoc — это прикрученная сбоку кривая статическая типизация. Лучше уж typescript.
  • Настройка IDEA для чистокодеров
    0
    Она не для людей. Она необходима для среды разработки, чтобы корректно отрабатывали такие функции как «перейти к определению», «контекстные подсказки», «найти символ по имени». К сожалению в вебшторме нет поддержки апи для добавления js-фреймворков (которая, есть, например, для java). Так что приходится довольствоваться либо 10 предопределенными, либо генерировать jsodc-и. Я бы лучше на тайпскрипт перешёл, чем заниматься этой ерундой. Но, к сожалению, архитектурные вопросы решаю не я.

    Кроме того, по ним же с помощью jsduck генерируется документация. При этом приходится дублировать определения в разных нотациях, чтобы это понимала и IDEA и jsduck.

  • Настройка IDEA для чистокодеров
    0
    Насчет автосохранения — это не очень хорошо, когда исходник постпроцессится по мере сохранения. Например, я сейчас сделал, чтобы автоматом генерировались jsdoc/jsduck аннотации. При сохранении при потере фокуса и обновлении при его приобритении получается все пучком: уходим, возвращаемся, а там уже доки появились. При постоянном сохранении же постоянно происходят конфликты между версией в памяти и версией на диске.
  • Никто не умеет обрабатывать ошибки
    +1
    Что лишний раз подтверждает, что исключения не справляются со своей основной задачей — обработкой исключительных ситуаций. А хорошем приложении ничего кроме библиотек быть и не должно.
    И мне не надо, чтобы функция возвращала ошибку, мне надо, чтобы я мог ей сказать, что в случае определенных ситуаций нужно использовать такую-то стратегию восстановления. На выбор:
    1. остановить загрузку всех картинок, написать в консоль ошибку
    2. написать в консоль, продолжить грузить остальное
    3. попробовать загрузить то же самое с другого домена
    4. отложить загрузку на 5 минут
    и 100500 других стратегий, про которые библиотека не должна знать превращаясь в кухонный комбайн.

    вообще без исключений в календарике я не могу обойтись банально потому, что они сами чуть что возникают в самых интересных местах.
  • Никто не умеет обрабатывать ошибки
    0
    Никак не адекватно, если их нужно руками ловить в одном месте, а потом перекидывать в другое. Это ничем не лучше пресловутых «кодов возврата» Представь себе 5 параллельно запущенных воркеров, каждый качает по сотне файлов. Что делать при ошибке загрузки одного из них? Библиотека не знает и кидает исключение, останавливая все файлы. Занимайтесь ерундой с перезапуском воркеров. Для этих целей кто во что горазд пишет костыли. Например, можно кидать событие «ошибка загрузки файла», на которое можно подписаться и реализовать свою стратегию. Но это все вручную и зачастую переопределить стратегию на 2 уровня ниже уже не получится ибо автор либы поленился реализовать соответствующее прокидывание событий и стратегий. Как это должно реализовываться: мы создаем домен и описываем в нем стратегии реагирования на различные исключительные ситуации и далее все запускаемые, создаваемые и любые другие сущности имеют связь с этим доменом. В случае ахтунга — исполняется обработчик домена, который реализует альтернативные стратегии, либо инициирует освобождение всех привязанных к нему ресурсов — откручивается стек, останавливаются потоки, освобождаются файлы и тп.

    более наглядный пример — есть календарик, он ловит события клика, нажатия на клавиатуру, скролл мышью, прикосновения пальцами и кучу других событий из разных мест. С исключениями приходится в каждый обработчик вставлять try-catch чтобы в случае ошибки календарик не умирал благородной смертью японского самурая. А с доменами можно было бы сделать так: объявяляем домен в котором указываем обработчик ошибок, в этом домене создаем календарик — все обработчики автоматом наследуют домен и в случае любых ошибок раскручиваться будет стек доменов, а не стек исполнения. в ноде как раз долгое время была проблема из-за отсутствия доменов — если разработчик библиотеки, в которой используются асинхронные операции, забыл где-то поставить try-catch, то ронялась вся нода и никак из внешнего кода на это было не повлиять, потому что стек честно раскручивался до конца.
  • Никто не умеет обрабатывать ошибки
    0
    У исключений есть еще одна беда — они замечательно раскручивают стек в случае синхронного кода, но совершенно бесполезны в случае использования колбэков или многопоточности.

    Например, нам нужно собрать проект, для этого мы запускаем параллельно 3 задачи. Если хотябы одна из них упадет, то нужно остановить и другие 2, после чего завершиться с ошибкой. Исключения тут идут лесом. А если нам нужно при указании специального параметра не завершать приложение, а вывести сообщение в консоль, продолжая параллельные задачи, после чего ожидая изменения файлов, после чего запускать только те задачи, которые зависят от измененных файлов?

    Исключения — это и правда зло, потому что полагаются на стек. Вместо этого хорошо иметь отдельный стек «доменов» (что-то типа nodejs.org/api/domain.html) и при создании колбэка привязывать к нему текущий домен. А в домене уже при его создании устанавливать стратегию реагирования на исключительные ситуации.
  • Начинаем работать с графовой базой данных Neo4j
    0
    Все тут принялись советовать всякие поисковые движки, которые являются не более чем костылями сверху неполноценных субд, не способных делать хитрые фильтрации за приемлемое время и без монструозных запросов. В итоге у вас получится не одна субд с шардингом, репликацией, транзакциями и прочими плюшками, а две с дополнительными проблемами синхронизации и прочим геморроем.

    Я бы рекомендовал посмотреть на OrientDB db-engines.com/en/system/Neo4j%3BOrientDB
  • Топ-5 простых изменений, которые значительно увеличили конверсию
    0
    Аж даже превышала 90%?) То есть более чем в 9 случаях из 10 исследование «крупной фирмы с огромным количеством заказчиков» дает ложноположительный результат?
  • Топ-5 простых изменений, которые значительно увеличили конверсию
    +8
    Как я обожаю эти дилетантские исследования с громкими выводами)

    Как происходила рандомизация и сколько было параллельных А/В тестов?
    Как отсекались новые пользователи? Старые пользователи подвержены эфекту новизны, а куки имеют свойство протухать.
    Какова статистическая значимость ваших гипотез?

    Без всего этого вам не сюда, а в хаб «астрология и эзотерика».
  • 8 ловушек программирования
    0
  • Fail Fast! принцип: Отлаживайте меньше и создавайте более надежное ПО
    +1
    А как связаны «информирование разработчика об исключительной ситуации» с «восстановлением после сбоя»? Это перпендикулярные понятия. Ничто не мешает показывать разработчику ошибку большими красными буквами, отсылать ему отчеты и тп, при этом сохраняя потребительские свойства насколько возможно. В примере с фонтаном в случае с быстрым падением предупреждающего сообщения вообще выведено не будет. Это сильно лучше, чем очевидно некорректное «Осторожно! Пожалуйста, пейте воду из фонтана»? Предупреждение с непонятным текстом как минимум насторожит. Отсутствие предупреждения — нет.

    Вот за что я не люблю эти «постулаты» так это за то, что они решают одни проблемы за счет других. В результате оказывается, что все приложение оказывается неработоспособным из-за маленькой никому не нужной кнопочки в углу экрана. И самое печальное, что я так и не смог убедить «ведущего разработчика», что это не правильно, ибо «fail fast — best practice».

  • Руководство по basis.js. Часть 1: Начало работы, представления, модули, инструменты
    –1
    Очень попахивает экстом и его ужасными фичами вида «перегрузка свойств в конструкторе» и «автосоздание вьюшек по конфигам». Тем не менее есть и много свежих идей.

    Смутило, что вы удаляете элелементы, а потом добавляете в нужном порядке. Это конечно очень просто, но ресурсоёмко и теряет фокус. Я у себя пробегаюсь по спискам и трогаю элементы только если их действительно надо переместить.

    Также я не разделяю эту любовь к requireJS. Какая разница будет у вас глобальная переменная или же зарегистрированный модуль, который доступен по глобальному имени? Те же глобальные переменные, но зачем-то спрятанные в недра глобальной функиции require. Относительные пути — это тоже зло, потому что при переносе модуля нужно фигурно исправлять относительные ссылки в него и из него. Лучше ссылаться ко всем модулям по глобальному имени и при переносе просто пробегаться реплейсом по всем файлам. Просто и надёжно. И если не плодить иерархию сверх меры, то вполне юзабельно.

    Почитай про мою реализацию: hyoo.ru/?article=%D0%90%D1%82%D0%BE%D0%BC%D1%8B+%D0%BD%D0%B0+JS;author=Jin
  • Сказка о потерянном московском времени, или в чем ошиблись ребята из Microsoft
    0
    И зачем может потребоваться иметь на сервере таймзону отличную от utc?)
  • Сказка о потерянном московском времени, или в чем ошиблись ребята из Microsoft
    +6
    И зачем может потребоваться передавать куда либо время не в utc?)
  • Вы до сих пор не любите JavaScript?
    +5
    > программы с высочайшим уровнем стабильности.

    Наоборот. При некорректных значениях программа работает непредсказуемо. И если в более иных случая программа завершится, то яваскрипт продолжит жить «своей жизнью» и например может уничтожить друды последних десяти минут пользователя, что мы часто наблюдаем на многочисленных кривых веб-страницах.
  • LocalForage: кроссбраузерное локальное хранилище от Mozilla
    0
    А что мешает добавить этот функционал в предлагаемую библиотеку, раз уж она позиционирует себя как замена localStorage?
  • LocalForage: кроссбраузерное локальное хранилище от Mozilla
    +1
    А что с нотификациями? Основная фича localStorage в возможности отслеживать изменения в хранилище.
  • Вы можете обойтись без jQuery
    +1
    Зачем же бросаться из крайности в крайность? Разрабатывайте микромодули. Подключайтесь) github.com/nin-jin/pms-jin
    Каждый модуль имеет максимум 10кб исходного кода. Можно сбилдить любой набор модулей со всеми их зависимостями. Например, библиотека $jin.atom (http://hyoo.ru/?article=%D0%90%D1%82%D0%BE%D0%BC%D1%8B+%D0%BD%D0%B0+JS;author=Jin) собирается в 20кб ни от чего не зависящих исходников.
  • Как я взломал Гитхаб еще раз
    +2
    Какого уровня? баги то детские. Просто Егор задавался вопросом «а что будет если», а те кто делал авторизацию в гитхабе нет.

    Мне вот однажды надо было внедрить санитайзер, который уже использовался много где в яндексе. тоже дырок много понаходил, но заводил сразу баги в джире. Надо ли говорить, что никакого вознаграждения я не получил?) да, Егор, я тебе завидую. Почему то вечно узнаю об этих баунтях лишь когда все уже все нашли(
  • Игры под угрозой
    +1
    Не потому ли что большинство игр и $0.99 не стоят. А уж за $4.99 тем более.
  • Ключевое отличие AngularJS от Knockout
    0
    50мс — это очень дофига, если у анс идёт пересчёт при скроллинге, например, или при движении мыши