среда, 27 мая 2015 г.

Перефразируя классика

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

Суровые мужчины русского Интернета, знающие толк в Разработке и Сопровождении, объясняют друг другу, как именно написать на Erlang и так, чтобы всё многопоточно. Они смеются над неправильными IDE друг друга, уличают друг друга в незнании Closure, объясняют, почему в 2020-х в продакшне будет непротолнуться от LISP-а и в чем преимущество чисто функциональных языков перед смешаными.

Я сильно подозреваю, что это они же, но в свободное время, обмениваются знаниями в благородном искусстве Менеджмента, сообщая друг другу, что с Заказчиком нормальные люди работают не так и что техника фриланса на Одеске безбожно устарела.

Я не исключаю также, что это они, в совсем уж свободное от Разработки и Сопровождения  время, обмениваются Бытовой Мудростью. То есть публично просят у Интернета помощи в борьбе с Суровой, Мужской Скукой, из-за которой им в последнее время, после шестой настройки Gentoo, даже не захотелось больше ничего делать; советуют выбирать Суровый, Мужской vi для более успешного написания Hello World на Haskell; весьма лично ругают Страуструпа, Джаву, ООП, Фабрики и другие абстрактные величины.

Проблема лишь в одном.

Если вы посмотрите на код и прочие результаты работы любого из этих Суровых, Циничных Программистов --

-- Вас разберет длительный здоровый смех с легким привкусом горечи.

Космос гарантирует.

понедельник, 18 мая 2015 г.

SHA256 в Python

SHA256 в Python бывает и стандартный (из hashlib), и сторонний (из PyCrypto). Интересно, что при неосторожном использовании они дают разные результаты.

Во-первых, SHA256.new() из PyCrypto сразу после создания имеет digest. Это SHA от пустой строки - широко известное 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.

Во-вторых, каждый update накладывается в нём на предыдущий, поэтому если digest используется на следующей итерации, то SHA256.new() надо пересоздавать. То есть аналог

h = hashlib.sha256(data + h).digest()

Это

hsh_exec = SHA256.new()
hsh_exec.update(data + hsh)
h = hsh_exec.digest()

среда, 6 мая 2015 г.

Тайна неуязвимости Человека с чемоданчиком

Раскрыт секрет неуязвимости Человека с чемоданчиком (он же G-Man) из первых версий Half-Life. Если заглянуть в исходники, становится ясно, почему в него высаживали целую обойму, а он всё равно живой:

SetImpactEnergyScale( 0.0f ); // no physics damage on the gman

понедельник, 4 мая 2015 г.

Про offset в методу get у ByteBuffer

Что делает offset в методе get() у ByteBuffer?

Даже help не вновит ясности. Вроде как смещение - но при попытке сместить и прочитать начинают сыпаться ошибки переполнения буфера.

Справка написана не особо понятно, но, к счастью, есть исходник реализации. И, заглянув в него, мы узнаём, что это.... индекс, с которого надо начить запись в массив!!


...
int end = offset + buffer;
for(int i = offset; i < end; i++)
  dst[i] = get();
...

Конечно, с точки зрения проектирования это настоящий кошмар. Потому что:

  1. Даже со справкой не очень понятно, как использовать.
  2. Реализована совершенно редкая фича вместо фичи нужной ("прочитать начиная со смещения" смотрелось бы тут куда уместней).