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. Тащем-то сугойно :)

15 июл. 2010 г.

Textual defecation

Что-то давненько я не ходил в бложик по-большому :)

Итак: на кафедру АЯ – попал, притом на желанный семинар, на отличные концерты (DSO и Xandria) сходил (кому интересно – в интернетах полно отчетов и фото), сессию закрыл (как ни странно чем меньше парюсь, тем лучше сдаю), на работу устроился (пограммистом под iOS, чсх – выцепили меня в контактике – вот уж от чего пользы не ожидал).

Заимел в пользование MacBookPro 13" (рабочий, охуительный девайс) и бас Ibanez ^_^ (от знакомых, видимо куплю с зарплаты).

Ощущения от MacOS X – вцелом все удобно и хорошо, но не без проблем. Действительно почти идеальная ось для повседневных задач, большая часть неудобств была связанна с непривычностью, теперь комфортно.
Самый шикарный охуец: нету никакой галки чтобы ноут не засыпал при закрытии крышки (но если подключить моник – не засыпает). Решинем стала InsomniaX, несчастная софтина устнанавливает модуль ядра, что какбы намекает на степень костльности решения.
Guake мне заменил Visor. Отдельно отмечу Better Touch Tool, которая позволяет по-настоящему утилизовать возможности тачпэда. Quicksilver какой-то глючный, да и спотлайт его почти заменяет. Доставляет остутствие Cmd-X в Finder от того, что это противоречит философским воззрениям Ябла :)
Не хватет полноценного менеджера пакетов, впрочем есть сторонние решения.

iTunes тема отдельная, ибо количество анальных гвоздей зашкаливает, особенно в момент подключения я-планшетки. Попробовал переползти на Songbird, тот оказался тормозным и глючным (xulrunner жеж), но оч классно интегрировался с last.fm и прочими около музыкальными интернетами (xulrunner жеж). Хныкая уполз обратно к Тунцу. И тут меня поджидал ещё один охуец - вместо плагнов и скриптов большинство обвесов являет собой отдельные софтинки висящие в системе и взаимодействующие с тунцом через его pubic API (кстати очень многоие приложения для мака могут управляться Apple Script'ом как раз через подобный API). Некоторые умеют запускаться и убиваться вместе с тунцом, что приятно.
Нашел маленький, уютный скробблер, который так же умеет выводить нотификации. Нашел ещё кучу всякого прикольного, но бесполезного для меня.
А вот со стягиванием обложек все как-то очень грустно – из всех что я нашел – только один платный умеет стягивать с ласта обложки для моей (видимо слишком экзотической для стягивалок с амазона) коллекции, но он платный и перегруженый. Потому взялся вечерами пилить свой. Через час полностью заработал, но пока управляется правками кода, а допиливать некогда, как только доведу до адекватного состояния - выложу на гуглокод.

Да, с инструменатами для разработки проблем не обнаружено, многое уже есть в пакетике для девелоперов, чего нет – нетрудно доставить, unix жеж.

Из того, чем духовно обогатился могу посоветовать: Caprice, Carnival in Coal, The Vision Bleak, Mr. Nobody, Star Trek TOS, Первые книги про Ведьмака (Анжей Сапковский), Игра про ведьмака (The Witcher)

5 июн. 2010 г.

Как нам обустроить Россию

by Костарев Иван aka ChaoX

Считается, что социальное неравенство по финансовому признаку является одной из причин бед в обществе. Как известно, попытки добиться всеобщего равенства путём отмены денег успехом не увенчались.
Однако, это ни в коем случае не значит, что надо опускать руки! Буквально утром мне в голову пришло настолько простое решение проблемы, что удивительно, что до сих пор никто ещё до него не додумался!
Всё, что требуется - это переход к измерению количества денег в комплексных числах!
Действительно, множество комплексных чисел нельзя упорядочить, а значит финансовая дифференциация общества потеряет всякий смысл - и вот оно, идеальное всеобщее равенство!

29 мая 2010 г.

Ебанариум

Меня и одну подругу конкретно так накрыло:

- Между прочим чебурашка 2жды винни-пух и посему чернослив

- а как же его еврейские и немного норвежские корни? заблудились в ушах?

- Так развсему виной внезапно из мацы с кровью снегопад по празднованию случая случайности преслучайно приключившейся в славный праздник неслучайной чайности со вкусными плюшакми и вафельками аппетитно обсыпанными маком с фиговыми листами.
Во время которого наш герой как-то весело и с задором стал чебураница и распшуаться, да распухать и фруктовиться.

- О_О чудеса... и как он так расчебуранился скрипно? совсем забыл сопесть? почему же ему под пятку ничего не нашептали? нужно же правовое регулирование! и кто его теперь съест? чего ради он гольфы носит на ушах?

- Да что уж теперь-то уж? Разве чтож под нож! По капельке скальпелюшечке да на стол писаный маслом между прочим по холсту. "Ах какая страсть-то" - взвизгивали молодые, ещё не вполне княжны глядя на ту вполне искусную работу мастера века этак цатого.

- а какая судьба у этих дамочек? они таки стали княжнами?) или их тоже... расписали..?

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

- так и во мраке ведь есть что-то.. не видно просто.. о_О может, там моржинки прячутся?

- Вот и я о чем: холод мороженый и мрак лупоглазый!

З.Ы. Никаих наркотиков, только матан и чего-то-что-учат-на-юрфаке

13 мая 2010 г.

Power of Differential Equations Elixir

Эликсир Мощь Диффуров: кровь Хайлова, моск личинки Хайлова(аспиранта), горелая страница Филлипова, слезы неcдавшей первокурсницы. Гарантирует сдачу диффуров.

Что характерно - я сегодняшние (до)сдал. Кто не был на первой контрольной - можно ещё в следующий четверг, но уже не в "наставнике"

6 апр. 2010 г.

Как сломать vim шаблонной магией

Симптомы:
Пишу в vim'е  objname. в момент написания точки vim, консолька а потом и весь гуй повисают.
Жму Ctrl+Alt+F1 через ~минуту вижу черноту текстовой консоли. Логинюсь. Отстает даже ввод текста в текстовом терминале. Таки умудряюсь глянуть top, узреть что все сожрал именно vim. Снимаю его. Переключаюсь обратно в графику. Наступаю снова на те же грабли. Снова привожу все в порядок. Догадываюсь наконец что происходит. Добиваюсь своего :)

Что происходило:
Vim у меня настроен таким образом, что если сгенерированы теги, он пытается провернуть code completion. Точка после слова в cpp файле - один из триггеров. В коде шаманский рекурсивно определенный класс-шаблон вида:

tempate <class T>
class A: public A<T> {
 ...
};

template <>
class A<NullT> { 
};

Означенный объект как раз этого чудо-класса. Vim, пытаясь предложить возможные варианты уходит все глубже и глубже в это наследование, которое несчастному редактору кажется вечным, ведь в его обязанности не входит разбираться со специализациями. Хотя разрабы могли бы хоть ограничение на поиск воткнуть. Быть может соберусь с силами и починю vim :)
Такие дела.

5 апр. 2010 г.

Свежие альбомы Pagan'цев

Итак по порядку. Все ниже написанное ИМХО.

Butterfly Temple - Земля
Альбом хорош, если не сказать больше. Присутствуют "цепляющие" треки. "Смерть" вообще шедевр. 4,5 из 5.














Невидь - Янтарное сердце Арктиды
У меня очень противоречивые чувства относительно этого альбома. С одной стороны звучание стало другим, присутствуют довольно интересные моменты. А с другой - слишком тяжело, нету ничего похожего на "Ярым оком" или "Мокоши прядь храню". Нет даже лютого и бешеного драйва как в "Тени от сейдов" и "Зов новой гипербореи". (Совершенно непонятно почему). Звучание стало намного тяжелее, но нету драйва. Даже скучновато как-то, все наверно потому, что драйва мало. :)
Хотя есть и забавные моменты, только благодаря им и дослушал альбом до конца.

P.S.: Особо доставил следующий текст:

"Постой, не уходи, подруга!
В петлях не болтались мы,
В озорных объятиях друг друга
Не смотрели с мертвой высоты…

Птицы не клевали наши лица,
Ветер не раскачивал тела.
Это ж надо было умудриться-
Не узнать, как вянет голова!

Я и так уже давно без блеска,
Что играл в моих сухих глазах.
Нету в этой жизни интереса,
Кроме нежных слов в твоих устах…

Остальное все туман, пустое,
Головокружение в бреду…
Если счастье есть, оно простое -
Быть в петле с тобою на ветру…" 




Путь Солнца - Победитель всегда остается один
Отдельно хочется сказать, что обложка говно. И куда подевалось относительно вменяемое лого группы? 
Звук записан весьма годно. Но вокал звучит как-то "приклеено" и совсем не так яростно. Местами вокал блевотен. Вокал на "Эффекте бабочки" мне нравился куда больше. На концерте они забавнее чем в записи. =)

4 апр. 2010 г.

Template Magic Applied

Вот интересно что лучше: скрипт на Ruby, который генерирует:
    1 #ifndef __ENCODING__
    2 #define __ENCODING__
    3 
    4 template <typename T>
    5 struct encode_type {
    6     static const char code = '?';
    7 };
    8 
    9 template <typename T>
   10 struct encode_type<T *> {
   11     static const char code = '*';
   12 };
   13 
   14 template <>
   15 struct encode_type<char> {
   16     static const char code = 'c';
   17 };
   18 
   19 template <>
   20 struct encode_type<int> {
   21     static const char code = 'i';
   22 };
   23 
...

Или шаблонная магия:

    1 #include <cstdlib>
    2 #include <cstdio>
    3 #include <iostream>
    4 
    5 using namespace std;
    6 
    7 namespace Encodings {
    8  template <typename H, typename T>
    9  struct EL {
   10   typedef H Head;
   11   typedef T Tail;
   12  };
   13 
   14  template <typename T, char c>
   15  struct EP {
   16   typedef T Type;
   17   static const char code = c;
   18  };
   19 
   20  struct NullType;
   21 
   22  typedef EL<EP<int, 'i'>, EL<EP<char, 'c'>, EL<EP<float, 'f'>, EL<EP<double, 'd'>, EL<EP<bool, 'b'>, NullType> > > > > Encodings;
   23 
   24  template <typename List, typename T>
   25  struct EncFor {
   26   static const char result = 0;
   27  };
   28 
   29  template <typename T>
   30  struct EncFor<NullType, T> {
   31   static const char result = 0;
   32  };
   33 
   34  template <typename T, typename Tail, char c>
   35  struct EncFor<EL<EP<T, c>, Tail>, T> {
   36   static const char result = EP<T, c>::code;
   37  };
   38 
   39  template <typename T, typename Wrong, typename Tail, char c>
   40  struct EncFor<EL<EP<Wrong, c>, Tail>, T> {
   41   static const char result = EncFor<Tail, T>::result;
   42  };
   43 
   44  template <typename T>
   45  char encode_type(void) {
   46   return EncFor<Encodings, T>::result;
   47  }
   48 
   49  template <typename T>
   50  char encode_var_type(T t) {
   51   return encode_type<T>();
   52  }
   53 }
   54 
   55 int main(int argc, char **argv) {
   56  cout << Encodings::encode_type<int>() << endl;
   57 
   58  return EXIT_SUCCESS;
   59 }

Первое - проще осознать, проще дописать потом ещё тип, быстрее компилируется.
Второе - наркоманство, чтобы дописать ещё тип, надо осознать, долго компилируется. НО проще переделать все encoding'и, и нет внешнего генератора.
Мне больше нравится первый вариант, но отдельные личности против генерации кода внешней тулзой :( Интересно какой из вариантов попадет в release :)