24 дек. 2011 г.

Static Code Analysis

Наткнулся на заметку Кармарка о статическом анализе кода написанную после выхода Rage.

Вот некоторые цитаты:
"There was a paper recently that noted that all of the various code quality metrics correlated at least as strongly with code size as error rate, making code size alone give essentially the same error predicting ability. Shrink your important code."
"If you aren’t deeply frightened about all the additional issues raised by concurrency, you aren’t thinking about it hard enough."
И особенно доставила вставка в конце:
@dave_revell The more I push code through static analysis, the more I’m amazed that computers boot at all.

8 авг. 2011 г.

Javascript Fuckup

Есть у меня репозиторий номеров журналов на CouchDB по ней есть map-reduce -> post-process (list function), который вываливают понятный клиентской программе JSON со списком номеров; номера имеют дату выхода в формате dd.mm.yyyy (дата храниться как строка). В старой версии номера сортировались на сервере. Дата на чиселки билась примерно так:

date.split('.').map(function(x) { return parseInt(x) })

Теперь попробуйте эту строчку повбивать, например, в консоли Chrome/Safari/etc:

вначале на01.10.2011
потом на02.10.2011
и так до07.10.2011
а потом08.10.2011

И получаем совершенно внезапно НЕ ТО. Тоже самое с 09; с 10 всё уже ок, как и с 8 и 9.

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

Кстати говоря, следующий код работает полностью корректно, что наталкивает на ответ

date.split('.').map(function(x) { return parseInt(x, 10) })

Типичный пример лютого нарушения принципа "наименьшего удивления". Собственно весь Javascript - пример нарушения этого принципа. За такоё по-моему надо убивать.

17 апр. 2011 г.

Ковыряние. Eventmachine vs Erlang.


Завтра у меня *большая и важная контрольная* по конструлям потому я зачем-то страдаю херней и решил наконец напостить в бложик. Тем более что есть о чем.



На работе случилась необходимость написать по-быстрому прототипчик сервера раздачи контента плагину для Adobe ID. Подключений много, все долгоживущие, но каждое по-отдлельности в основном простаивает.

На чем же писать асинхронный TCP сервер с потенциалом на несколько сотен, а то и тысяч, подключений? Поскольку пистон я не люблю выбор оказался между Eventmachine и Erlang. 

Helloworld'ы на eventmachine это действительно просто и сравнительно понятно. Сложная логика быстро превращается в спагетти из callback'ов. С этим приходиться бороться и даже иногда получается. Впрочем это проблема не столько Eventmachine, сколько event-based подхода вообще – тем же страдает Node.js (впрочем Node еще много чем страдает :) )

Поскольку цели сделать финальный вариант не было, а OTP я не знаю, то решил без него. Заодно Erlang лучше "распробовал".

Erlang вполне ожидаемо выиграл и по производительности (почти линейно размазывается по ядрам, можно еще по нодам, но я не пробовал) и по прямолинейности кода (отсутствию callback'ов и конечных автоматов). Синтаксис по-началу заставляет тосковать по оному в Haskell, и похоже не только меня. Но быстро привыкаешь. Есть ощущение что по-дороге изобрел немного OTP.

Когда уже закончил с Erlang версией сервера увидел Revactor. Можно лечить спагетти ценой ограничения кол-ва поддерживаемых платформ (только Ruby 1.9+), но императивную семантику Ruby все равно в мешке не утаишь. Производительность тоже, хотя 1.9 в этом плане получше. Насколько я понял автор сабжа полузабил и ушел делать Reia.

При желании перед Ruby скрыптами можно поставить load-balancer и получить горизонтальную масштабируемость, еще через это можно обновлять код сервров за балансировщиком по-очереди, создавая видимость горячей замены кода. Но это более костыльное решение чем большой и счастливый Erlang всему. Тем более, что при использовании OTP эти ништяки получаются совсем сами собой (без OTP надо следовать некоторым соглашениям).

Для полноты картины надо поиграть в асинхронную монаду (Haskell) и продолжения (Scheme). Предполагаю, что Haskell будет удобнее для front-end'а, Erlang для back-end'а. А Scheme неплоха и там и там, но медленнее обоих.

З.Ы.: У меня окончательно вызрела идея давно обещанной библиотеки анимации на JS. Надеюсь доживет в голове до лета.
З.З.Ы.: Старый добрый "Пушистик" получил воторое рождение на HackDay.
З.З.З.Ы.: Быть может скоро напостю про курсовик и Android vs iPhone

2 дек. 2010 г.

Машграфы


Тетрис – финал

Тетрис – поиск стиля

Грибной лес – почти финал

Грибной лес – второй вечер работ

Финал Леса:


Ежели кому по-нраву и охота поиграться самим пишите в комменты с указанием ОС.
Как кончиться курс машграфа есть вероятность что подчищу сорцы от говна и выложу на гитхабе.

Второго нет, потому что только самый обычный успел.
Четвертый – рейтрейсер. Дали в этот понедельник. Еще не брался.

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

Таймлайн вида: "Тетрис, большой перерыв, Распознование людишек, перенос срока 2 раза, небольшой перерыв, Лес с грибами, почти отсутствие перерыва, Рейтрейсер" какбы намекает на некоторую недодуманность дедлайнов/заданий. Стандартный срок 2 недели. Надо либо задания проще (в том году были проще), либо сроки изначально лучше продумать.

На время грибочков прям таки на неделю из жизни выпал, правда с шейдерами никто ковыряться не просил, да и опечатки за которыми я гонялся 1,5 дня с valgrind'ом исключительно мой fail.

16 нояб. 2010 г.

Псевдо-литературный высер

Он резко встал опрокинув случайность момента. Случайность неистово закричала, угрожая вызвать милицию. Но было уже поздно – отовсюду лезла вопиющая серость. Так случайность момента стала повседневной обыденностью.

25 июл. 2010 г.

LastCover alpha

Как я и обещал – я боле-менее допилил LastCover (потом лучше допилю) и выложил сорцы.
При этом я убил двух зайцев: я не просто выложил сорцы, я наконец заюзал github и собственно git. Тащем-то сугойно :)