Внезапно поймал себя на мысли о том, что различия в разработке софта для персоналок+десктопа от разработки софта для Web+мобильных устройств (смартфоны, планшеты) обусловлены областями применения того и другого.
Размышления и впечатления, которые не хочется держать в себе. О программировании в частности. Ну и о творчестве, и о жизни вообще.
суббота, 11 апреля 2015 г.
пятница, 10 апреля 2015 г.
[prog] Mxx_ru 1.6.5
Mxx_ru обновился до версии 1.6.5. Это простой баг-фикс релиз, исправлена ошибка с выставлением ключика "-std=c++14" для clang и GCC.
Обновиться можно командой gem update Mxx_ru
[prog.sobjectizer] Вот таким макаром и уменьшается многословность кода
Как можно было недавно убедиться, написанный с использованием SObjectizer код бывает многословным. Хотя работа в направлении уменьшения многословности ведется постоянно, процесс этот идет не быстро. Как раз тот случай, когда "простота не предшествует сложности, а следует за ней" ((с) Алан Перлис).
Время требуется на то, чтобы на своем опыте прочувствовать, что какая-то операция требует слишком большой писанины. Потом требуется время, чтобы в голову пришло подходящее решение. Потом -- чтобы это решение было воплощено, протестировано, задокументировано и вошло в релиз. Вроде бы нигде ничего сложного, но появление новых полезных фич иногда растягивается на месяцы.
Тем не менее, процесс идет. И ниже один из примеров в качестве подтверждения.
четверг, 9 апреля 2015 г.
[prog.sobjectizer] Продолжение флеш-моба по мотивам md5_bruteforce :)
Как заметил ув.тов.TheDeemon, представив свое решение md5_bruteforce на D, вокруг задачки образовался небольшой флешмоб :)
Ну и раз пошла такая пьянка, то можно взглянуть на мой вчерашний вариант другими глазами. В нем я преследовал цель сделать вариант, в котором рабочий агент делает запрос следующего диапазона у генератора диапазонов.
Однако, этот вариант имеет свои накладные расходы. Как по объему исходного кода (лишний сигнал get_next_range, агент-генератор), так и по времи работы, т.к. рабочему агенту приходится какое-то время ожидать, пока ему выдадут новый диапазон вместо обработанного.
Если же всю работу выдать рабочему агенту сразу, то можно и размер исходника несколько сократить, и в скорости работы выиграть. Поэтому появился вот такой вариант: md5_bruteforce-thedeemon-like (исходник в svn) ;) Там нет генератора и всю нагрузку рабочий агент сам себе создает сразу, как только начинает работать внутри SObjectizer Environment.
Ну а потом подумалось, что можно вообще сделать хитрый трюк: а почему бы не поручать обработку каждого диапазона отдельному агенту? Т.е. насоздавать сразу кучу агентов, запустить их на пул потоков и пускай они там работают :)))
Сказано -- сделано. Вот и этот вариант: md5_bruteforce-separate-agents (исходник в svn).
Оба эти варианта работают почти на секунду быстрее вчерашнего (5.9s против 6.7-6.9s).
[prog.opensource] Реализация MD5 на чистом C++11. Just For Fun :)
При реализации примера md5_bruteforce обнаружил, что практически все актуальные реализации MD5 находятся в больших или не очень больших библиотеках (вроде OpenSSL, PolarSSL, Crypto++, Botan, POCO и т.д.) И если отдельно лежащую, без лишних зависимостей, версию MD5 на чистом С еще можно найти, то вот с C++ными вариантами дело было плохо. Поэтому, взяв за основу код из POCO, сделал свое.
Получился один hpp-файл. В зависимостях только стандартная библиотека C++11. Проверял под MSVS2013, GCC 4.9.2 (Win, Linux), clang 3.4.1 (FreeBSD), clang 3.6.0 (Linux). (Upd. На длинных последовательностях (больше 4GiB), тоже проверял, работает, по крайней мере в 64-битном режиме).
Лицензия -- трехпунктная BSD + лицензия POCO + лицензия от RSA Data Security. Вроде как все OpenSource-ое, допускающее использование в любых проектах, в том числе и закрытых.
Сама реализация лежит здесь. Там же полный "проект", в котором все проверялось. Все под Svn, поскольку мне так удобнее. Если у кого-то будет время и желание взять и разместить где-то еще -- буду только рад.
Сам я вряд ли буду заниматься дальнейшим развитием этого кода, писать документацию, снабжать дополнительными примерами и т.д. Если кому-то это все нужно, спокойно берите мой код за основу и развивайте в том направлении, которое вам нужно/интересно. Если же требуются какие-то мелкие правки/дополнения/улучшения, можно написать мне, постараюсь сделать.
Под катом полный исходник реализации + примеры того, как ей можно пользоваться.
среда, 8 апреля 2015 г.
[prog.c++11] Решение md5_bruteforce на SObjectizer-5.5.4. Слишком много кода
Недавно в блоге ув.тов.asfikon-а промелькнула очередная интересная заметка. На этот раз про реализацию на языке Go простой программы для подбора MD5-хэша методом грубой силы (решение от Владимира Солонина). Реализовал ту же задачу средствами SObjectizer-5.5.4. Кода получилось в два раза больше, чем в программе на Go. Можно сравнить на pastbin: вот Go-ный вариант Владимира, вот мой C++ный (с минимумом комментариев).
Причем кода много, но он простой. Но много. И что с этим делать, пока ума не приложу. В частности, не очень понимаю, где здесь проблемы C++, а где мои собственные (т.е. недостатки SObjectizer-а).
Под катом, для тех кому интересно, тот же код, но разбавленный комментариями, поясняющими, что к чему и почему.
вторник, 7 апреля 2015 г.
[prog.c++11] Состоялся релиз SObjectizer-5.5.4
Состоялся релиз версии 5.5.4. Архивы с исходными текстами и бинарниками для Windows доступны для скачивания.
В двух словах версия 5.5.4 добавляет несколько мелких и не очень возможностей:
- вспомогательные шаблонные методы make_agent и make_agent_with_binder (аналоги make_shared и make_unique из C++11/14), упрощающие создание экземпляров объектов (описание в Wiki проекта);
- приватные диспетчеры. Приватный диспетчер можно использовать только по прямой ссылке, которую получает только тот, кто создает такой диспетчер. Так же приватные диспетчеры автоматически уничтожаются, когда ими больше никто не пользуется (описание в Wiki проекта);
- лимиты для сообщений, т.е. возможность ограничить количество сообщений конкретного типа в очереди заявок для агента, что позволяет реализовывать простую защиту агентов от перегрузок штатными средствами SObjectizer-а (описание в Wiki проекта);
- новый тип context_t и дополнительный конструктор для базового типа agent_t, за счет чего упрощается создание агентов, использующих лимиты для сообщений, особенно в случае наследования агентов (описание в Wiki проекта);
- простейший вариант сбора и распространения мониторинговой информации о том, что происходит внутри SObjectizer Run-Time. В первую очередь этот вариант предназначен для предоставления возможности сохранения мониторинговой информации посредством таких инструментов, как statsd+graphite, Zabbix, Nagios и т.д. (описание в Wiki проекта);
- новые примеры, демонстрирующие возможности SObjectizer-5.5 (#1, #2, #3, #4).
Версия 5.5.4 может быть загружена из раздела Files или получена из Subversion-репозитория.
Отдельную благодарность хочется высказать Алексею Сырникову, как за помощь в подготовке этого релиза, так и за работы по созданию зеркала SObjectizer на GitHub-е.
Более подробная информация о релизе, включая информацию о доступных для скачивания дистрибутивах и более развернутое описание нововведений, находится под катом.