среда, 29 июля 2015 г.

RegExp в Presto

Opera в своё время прославилась тем, что не поддерживала compile() у регулярных выражений. Дело было в движке Presto (которые почему-то не желает их копилировать).

И вот случилось - Opera переехала на Blink. Теперь compile() поддерживается.... но не в Opera Mini, которая как была на Presto, там так и остаётся.

понедельник, 1 июня 2015 г.

Показать в JavaScript alert без остановки таймера

Вообще, использовать стандартный JavaScript alert даже для отладки - плохая идея. Для сообщений есть отличные окошки из Bootstrap JS или jQueryUI, для отладочной информации - console.log.

Но иногда нужно написать окошко очень-очень быстро. Например, сдать бета-версию приложения, а окошко потом переделать.

В браузерах, основанных на WebKit (Chrome, Safari, JavaFX WebEngine) открытый alert считается чрезвычайным событием и останавливает все таймеры своей нити. Поэтому показывать его надо в отдельной нити, вот так:

function showMessage(text){
  setTimeout(function() { alert(text); }, 1);
}

среда, 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. Реализована совершенно редкая фича вместо фичи нужной ("прочитать начиная со смещения" смотрелось бы тут куда уместней).