metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-03-24 11:16 pm

А теперь о Ruby и Redmine

Я таки нашел, в чем причина вот этого бага:
no method error [] for class nil
https://bugs.launchpad.net/ubuntu/+source/ruby1.8/+bug/949011

Вкратце: недавно в большинстве реализаций хэш таблиц была найдена имманентная уязвимость к потенциальным DDOS атакам на веб-приложения, связанная с тем что атакующий мог посылать запросы такого вида, что внутри приложения они приводили к обращению к хэш-таблице всегда к одному bucket. Т.е. передавать ключи, которые после обработки hash-функцией всегда давали одно и то же значение, убивая эту таблицу из O(1) в O(N) и съедая тем самым процессор.

В руби это дело исправили:
https://launchpad.net/ubuntu/+source/ruby1.8/1.8.7.249-2ubuntu0.1
http://launchpadlibrarian.net/94639065/ruby1.8_1.8.7.249-2_1.8.7.249-2ubuntu0.1.diff.gz

конкретно эти строки:
++extern unsigned long rb_genrand_int32(void);
++
++void
++Init_st(void)
++{
++ hash_seed = rb_genrand_int32();
++}

+- register int key = 0;
++ register unsigned long key = hash_seed;

Формально, в норме бы ничего не поменялось, после этого.
НО: в редмайне оказалось место, где работа зависит от порядка элементов в хэше:
/usr/share/redmine/app/models/setting.rb,166
setting ||= new(:name => name, :value => @@available_settings[name]['default'])

тут происходит примерно такое: создается новый объект Setting и ему устанавливаются атрибуты name и value. И, это ключевой момент, установка атрибута value ЗАВИСИТ от наличия уже установленного атрибута name:
  def value=(v)
    v = v.to_yaml if v && @@available_settings[name]['serialized']
    write_attribute(:value, v.to_s)
  end

т.е. оно использует name чтобы получить значение по умолчанию из @@available_settings и далее пытается из него получить значение атрибута 'serialized'

Раньше это работало, а после секьюрити-фикса - работает в зависимости от rb_genrand_int32.

Так что ошибка, вообще говоря, в редмайне. Надеятся на порядок в хэш-таблице, это бред.

PS: а вот и фикс, месяц назад: http://www.redmine.org/projects/redmine/repository/revisions/8909/diff/trunk/app/models/setting.rb

[identity profile] metaclass.livejournal.com 2012-03-25 06:29 am (UTC)(link)
Скобочку я хоть вижу, в логах да диффах, да и баланс скобок проверить гораздо проще.

[identity profile] nivanych.livejournal.com 2012-03-25 06:58 am (UTC)(link)
Я стараюсь вообще хеши не использовать — обычно, никакой в этом нужды нет, исключения довольно редки.
Когда-то, помню, я довольно преуспел в создании хеш-функций и оптимизации всяких хешевых структур.

[identity profile] darkdrip.livejournal.com 2012-03-25 07:02 am (UTC)(link)
джира стоит 5 штук. и сжирает гиг памяти. но она лучше, да

[identity profile] metaclass.livejournal.com 2012-03-25 07:11 am (UTC)(link)
В рубях, кложурах и прочих вебоориентированных лиспах хэш практически основная структура данных.

[identity profile] aamonster.livejournal.com 2012-03-25 07:59 am (UTC)(link)
Блджад. Косяк, вообще говоря, и в ruby тоже: не должно быть итераторов по неупорядоченным коллекциям.

[identity profile] metaclass.livejournal.com 2012-03-25 08:06 am (UTC)(link)
Да ну нахер, это же перечислимое множество очевидно.
А итератор никаких умолчаний на тему упорядоченности не предполагает вообще-то.

[identity profile] mend0za.livejournal.com 2012-03-25 09:24 am (UTC)(link)
Имеется в виду предсказуемость синтаксиса или поведения питона?

С синтаксисом питона как раз плохо, пока не заучишь N странных конструкций (оптимизированных для интерпретатора, а не человека) не взлетишь.

[identity profile] mend0za.livejournal.com 2012-03-25 09:25 am (UTC)(link)
ага, в динамических языках хэши очень любят и очень используют.

[identity profile] mend0za.livejournal.com 2012-03-25 09:25 am (UTC)(link)
изумительный баг

[identity profile] metaclass.livejournal.com 2012-03-25 09:26 am (UTC)(link)
Ну. Вчера не смог справится с искушением разобраться, что же такого они утворили.

[identity profile] avnik.livejournal.com 2012-03-25 09:33 am (UTC)(link)
Поведение, но там и с синтаксисом все предсказуемо.
Там только декораторы выглядят марсианскими (но все равно к ним быстро привыкаешь) -- но они как я понимаю тянуты из джавы целиком

[identity profile] mend0za.livejournal.com 2012-03-25 09:51 am (UTC)(link)
Была уже в G+ заруба про синтаксическую дичь питоновскую.
https://plus.google.com/111512356605658929685/posts/Ry4Kpdd9cfx

Плавно с около-руби тем свернули на питон.
Влом повторяться.

[identity profile] avnik.livejournal.com 2012-03-25 10:33 am (UTC)(link)
Ребе, а вы специально табики ставите -- чтобы попсеть?
Уже никто их не ставит, никогда.
У меня они запрещены -- в редакторе -- раз, прекоммит-хуком два.

[identity profile] kkirsanov.livejournal.com 2012-03-25 12:02 pm (UTC)(link)
Кстати, в питоне 3 добавили OrderedDict

[identity profile] nivanych.livejournal.com 2012-03-25 12:26 pm (UTC)(link)
В смысле, в ихних стандартных библиотеках.

[identity profile] nivanych.livejournal.com 2012-03-25 04:49 pm (UTC)(link)
Причём, не втихушку под одеялом, а открыто и не стесняясь!!

[identity profile] nivanych.livejournal.com 2012-03-25 04:50 pm (UTC)(link)
Надо подсветку синтаксиса, табики подсвечивать по-особенному! ;-)

[identity profile] slonopotamus.livejournal.com 2012-03-25 05:05 pm (UTC)(link)
Что характерно -аналогичная история была и с петоном, когда в очередном релизе dict'ы перестали быть упорядоченными (хотя они никогда порядка не обещали).
wizzard: (Default)

[personal profile] wizzard 2012-03-25 06:29 pm (UTC)(link)
дык во всех нормальных редакторах табики, & nbsp;, CR/LF/CRLF/NL/PS/LS, EOF, FEFF и прочая невидибня уже давно подсвечивается по-разному (как минимум VS, SciTe, Sublime, eTextEditor)
Edited 2012-03-25 18:30 (UTC)

[identity profile] nivanych.livejournal.com 2012-03-26 03:04 am (UTC)(link)
;-) Не знаю, что это за редакторы. И почему в списке нет emacs или vim.

[identity profile] theiced.livejournal.com 2012-03-26 08:49 am (UTC)(link)
а у кого то разрешены. и от поставит. в либе на 400 килобайт в одном месте. и вы ПОСЕДЕЕТЕ пока найдёте.

[identity profile] avnik.livejournal.com 2012-03-26 09:12 am (UTC)(link)
git filter-branch -f --prune-empty --tree-filter "find . -name \*.py -a -type f | xargs /home/avn/bin/reindent.py -n" stage..tmpmerge
(reindent -- скрипт из стандартной поставки петона,

Я пару раз импортил ветки от таких умельцев ;)

PS du -sh ./eggs -- 37mb, табов нету.
wizzard: (Default)

[personal profile] wizzard 2012-03-26 09:39 am (UTC)(link)
Потому что лично для меня под Windows работать продуктивнее, а скриптовать Sublime питоном приятнее, чем скриптовать Emacs elisp'ом.

Зачем приводить ссылки на редакторы, существенного опыта работы с которыми не имеется? Хотя, в емаксе такое тоже было, ЕМНИП.

(Anonymous) 2012-03-26 11:03 am (UTC)(link)
пфф.
руби бы сильно выиграл от табовой разметки.


c:wicked ayerrow

[identity profile] metaclass.livejournal.com 2012-03-26 11:43 am (UTC)(link)
От отступов да, но не от смеси табов и пробелов.

Page 2 of 3