new elements in Alchemy 1.8 // новые элементы в Алхимии 1.8
| aluminium | алюминий |
| bow | лук |
| cat | кот |
| continent | континент |
| country | страна |
| Fabergé egg | Яйца Фаберже |
| fugu | фугу |
| Ghostbusters | Охотники за привидениями |
| ice | лёд |
| jedi | джедай |
| juice | сок |
| lawn mower | газонокосилка |
| Mentos | Ментос |
| mirror | зеркало |
| Moon | Луна |
| mouse | мышь |
| mummy | мумия |
| old man | старик |
| perfume | духи |
| Robin Hood | Робин Гуд |
| Santa Claus | Дед Мороз |
| Sex and the City | Секс в большом городе |
| silver | серебро |
| sith | ситх |
| Star Wars | Звёздные войны |
| sunflower | подсолнух |
| The Beatles | Битлз |
| tractor | трактор |
не суйте в EC2 что попало
Решил завести себе гентушный облачный сервер в амазоне.
Нашел AMI-шку ami-30cb2059
А там вот такая вот фигня в `/root/.ssh/authorized_keys`:
1 |
ssh-dss AAAAB3NzaC1kc3MAAACBAMhFaleO5K ...(скипнуто)... xAO20dHNKJAs= rich@rich64 |
т.е. добрый дядя Rich собрал образ Gentoo, и положил туда руту в authorized keys свой public key.. ну мало ли что, помочь там чего наверное.. или просто забыл..
так что мойте продукты амазоновские образы перед употреблением.
Android Alchemy
по мотивам Алхимии 0.3
на первую версию ушла почти неделя “грязного” (т.е. свободного от работы и активного отдыха) времени
игровой процесс заключается в перетаскивании элементов друг на друга и получении при этом новых элементов
(например: огонь+земля=лава)
цель: открыть все 117 элементов

QR:
ссылка на androlib: Android Alchemy
upd: в Сети начинают появляться положительные отзывы: android.mak-sim.ru :)
An error occurred during a connection to light.webmoney.ru
Нашел решение проблемы когда фаерфокс не может подконнектиться к light.webmoney.ru с сабжевой ошибкой – тут.
Вкратце:
1 |
NSS_SSL_ENABLE_RENEGOTIATION=1 /usr/bin/firefox |
Возможно снижение безопасности SSL.
поиск утечек памяти в ruby/rails
0. Введение
Для начала – что такое классические утечки памяти? Это когда мы (или не мы) сделали malloc(), но забыли сделать free(). Но на деле эта память уже не используется и должна бы быть давно уже возвращена системе через free().
Что такое утечки памяти в ruby? Это висящие в памяти объекты(А), на которые есть ссылки с каких-то глобальных объектов(Б), но фактически (А) уже никому не нужны, а с них, в свою очередь еще есть кучи и кучи ссылок на другие объекты, которые занимают туеву хучу памяти, и не могут быть освобождены сборщиком мусора, потому что на них есть ссылки с других объектов.
Сложно? Сейчас будет еще сложнее :) Плюс к упомянутым выше специфичным для ruby утечкам памяти из-за ссылок на объекты, в ruby также могут быть (и есть!) и классические утечки памяти. В основном в различных экстеншнах, обычно подключаемых через gem’ы. Но и в самом интерпретаторе ruby вероятно где-то еще остались необнаруженные утечки.. только и количество и вероятность их обнаружения на пару-тройку порядков ниже, чем в сторонних gem’ах. Потому что в разработке ruby явно участвует больше и людей и тестеров, чем в разработке любого gem’а.
1. Как узнать что память течет?
Банально :) Смотрим периодически на наш ruby-процесс через ps или top, и если размер памяти процесса постоянно увеличивается, и вскоре начинает занимать всю физическую память + своп – то серьезные утечки памяти скорее всего есть.
Но это способ эмпирический, а вот более практический – нужно ограничить процессу память каким-нибудь значительным объемом (например 512Мб)
1 |
Process.setrlimit Process::RLIMIT_AS, 512*1024*1024, 512*1024*1024 |
и погонять процесс. Если он через какое-то время (минуты, часы, дни, месяцы, … :) выпадает с криком [FATAL] failed to allocate memory – значит утечки есть.
Этот способ не сработает, или сработает неправильно, если работа процесса связана с обработкой больших объемов данных (сопоставимых с 512Мб в данном случае).
2. Как бороться?
Для того чтобы бороться надо сначала узнать с кем конкретно бороться :) А мы пока узнали только тот факт что память течет. Далее нужно определить виновника. Для этого есть как минимум три ортогональных способа:
- valgrind – для поиска утечек в самом ruby и экстеншнах. для нормальной работы требует специально-фигурно-выпиленный бинарник ruby. патчи тут. К текущей версии ruby (ruby-1.8.7-p249) подходят с трудом.
- bleak_house – инструмент для отслеживания аллокейшнов ruby-объектов. Подходит для Rails.
- метод эмпирической дихотомии – универсальный способ :) – во-первых, надо определить что память течет (п.1), во-вторых, берем большой топор и начинаем вырезать или комментировать куски кода.. после каждой ампутации заново проверям осталась ли утечка. если осталась – продолжаем ампутацию, если исчезла – смотрим внутрь отрезанного куска, вплоть до локализации “текущего” метода экстеншна либо присвоения глобальной переменной (
$global_var) или переменной класса (@@class_var).
P.S. Все утечки актуальны только во время исполнения приложения. Как только приложение завершается, вся память всегда возвращается системе.
переносим контакты с SonyEricsson'а на андроид
(работает на любом(?) SyncML-совместимом телефоне, т.е. как минимум на всех SE-шках, выпущенных c 2005 года)
To set up Google Sync on a Sony Ericsson W800i phone, please follow these steps:
- Click the ‘Menu’ key and open the ‘Organizer’.
- Select ‘Synchronization’.
- Select ‘New Account’ and enter ‘Google Sync’ or any name of your choice.
- Enter the following values:
- Server address: https://m.google.com/syncml
- Username: your Google Account username, e.g. you@googlemail.com
- Password: your Google password
- Connection: select the Internet access point for your carrier
- Applications: mark ‘Contacts’ only and click ‘OK’
- App. settings: open ‘Contacts’ and for ‘Database name’ enter ‘contacts’ (lower case), leave other fields blank
- Sync. interval: choose how frequently you would like to synchronize with Google
- Leave other settings unchanged
- Click ‘Save’ to exit this screen and save your Sync profile.
- Highlight your new Sync profile and press ‘Start’.
и вуаля – все наши контакты в гмыле! ^___^
проверено на SonyEricsson k790i.
RuCTF 2010 Quals: отчет
Случайно и неожиданно попал на “квалификационный заезд” RuCTF 2010 в составе команды Lobotomy.
Буквально так:
1 2 3 4 5 6 7 8 9 |
linkoln: свободен? zed: смотря для чего ) linkoln: тут мы в ructf участвуем, может глянешь пару задачек zed: ок давай ....... zed: решил реверс100 ^__^ ! ....... zed: решил реверс200 ^____^ ! вписывайте меня в команду! :) linkoln: ок, все только за :) |
Дело это продолжалось двое суток, участвовало порядка 40 команд.
Всего было 7 категорий задач, по 5 задач в каждой, от 100 до 500 баллов за решение.
результаты
Скажу сразу что мы заняли почетное 9-е место.. причем нас таких команд получилось аж 3:
| 1 | SiBears | 6800 |
| 2 | Smoked_Chicken | 6600 |
| 3 | CIT | 6300 |
| 4 | Bushwhackers | 6100 |
| 5 | Vulnbugs | 5600 |
| 6 | x0r | 5200 |
| 7 | KEVA | 5000 |
| 7 | Space_Invaders | 5000 |
| 9 | Quinque | 4900 |
| 9 | ForkingBugs | 4900 |
| 9 | Lobotomy | 4900 |
Проходящими в финал по правилам являются “10 лучших команд”, так что, видимо, в финал мы прошли.. но еще не факт.
задачи
= Crypto100 =
расшифровать “S[bgXGO DVG JT UJF CHVU DVG PO UJF XSXPE@”
алгоритм: вычесть из каждой первой и последней буквы слова 1, из остальных букв слова вычесть больше чем 1 :) четкого алгоритма не нашел
ответ: RUSSIAN CTF IS THE BEST CTF ON THE WORLD
= Forensics500 =
дан образ диска злоумышленника [ссылка], известно что на нем спрятан пароль от аккаунта “[Dervish]”, найти md5 этого пароля
решение: на диске нет загрузочных систем, но есть MBR и GPT партиции. берем gdisk (аналог fdisk, но с поддержкой GPT) и начинаем выковыривать из образа разделы. на разделах лежат картинки, являющиеся частями одного большого изображения, на котором ручкой написаны разные пароли, в т.ч. искомый.
главная подляна в том, что последний кусок запрятан в FAT разделе, в удаленном(!) файле, да еще и в совершенно ##баническом формате SCT
= Reverse300 =
дан кейген [ссылка], нужно сгенерить ключ для юзера %username%. проблема в том что keygen expired и работать отказывается.
решение: всё просто. берем hiew, правим в кейгене условный переход по проверке даты на безусловный, запускаем, генерим
= Reverse400 =
дан файл omar.plc [ссылка], нужно найти все числа между 1300 и 1500 где алгоритм неточен.
решение: данный файл – это скомпиленный перловый байткод, в чем можно убедиться заглянув внутрь файла, и погуглив на “ByteLoader”.
далее проблема была найти такую машину, где бы и архитектура машины, и версия перла совпадала бы с той, на которой код был скомпилен: x86_64-linux-thread-multi.0.07
машину я нашел, но очень не сразу. код на ней запустился (просто perl omar.plc XXXX, где XXXX – это входное число)
программа на выходе выдает 0 или 1, в зависимости от чисел.
погуглив на слово Omar можно догадаться что это имеет отношение к Омару Хайяму, а внимательно посмотрев на числа, на которые программа выдает “1” (4,8,12,16,20,15,29,33,…) можно предположить что это что-то типа алгоритма вычисления високосного года.
дальше по гуглу и педивикии смотрим какой там календарь придумал Хайям, и как его считать, и сравниваем с данными программы.
тут был некоторый косяк в том что на все мои попытки чекер возвращал что результат неверный, а потом орги зачли задачу вручную.. так что хз какой именно был правильный ответ
= Stegano100 =
текст задачи: “Поехали! Вот только скажите, куда [ссылка] ?”
решение:
а) выписываем регионы в порядке соответсвующих им чисел
б) выписываем рядом с каждым регионом его автомобильный госномер http://bit.ly/bwzDfJ
в) замечаем что несколько раз повторяется 32 (ASCII пробел) и оканчивается на 33 (воскл.знак)
г) конвертим числа в буквы по ASCII
д) получаем “WELCOME TO RUCTF 2010!”
= Stegano300 =
расшифруйте сообщение: message [ссылка]
решение (слабонервным не смотреть!): оооооооооооочень жестокая задача… файлик надо было догадаться тупо переименовать в *.com и запустить под dos-compatible системой…. >_<
…а я его в base64 сначала декодил (причем он декодировался без ошибок) и пытался дальше gzip-ом распаковывать, предварительно приклеив gzip-хидер..
= CTB400 =
злоумышленник проник в нашу систему, и оставил бекдор. найдите этот бекдор.
хинт: злоумышленник ядро не трогал.
образ системы [ссылка] (vmware image, 400Mb), или с торрента, если еще жив [тоже ссылка]
решение: внутри – Debian 5.0.4 minimal + sshd + apache + kernel sources + всякие dev либы. пароль рута неизвестен.
сначала натравил на образ strings, грепал на backdoor, passwd, root – ничего особо не нашел.
потом поставил его в VMWare Player, загрузился, понял, что паролей у меня нет :), качнул system rescue cd, загрузился с него, но пароли менять не стал, так с него и изучал.
примечательно что в системе удалена вся история команд рута, а также всем файлам в системе сделан touch на одну и ту же дату :)
поковыряв систему так ничего и не нашел.
качнул Debian 5.0.4, поставил в соседнюю VM, сделал find / type f -ls на обеих машинах, и скриптом вычел один список из другого. получил список файлов с первой ВМ, отличающихся от оригинальных, либо отсутствующих в свежем истоле. сначала грешил на sudo или измененный initrd.. но потом он спалился на
/etc/apache2/mods-available/security.conf 65
/etc/apache2/mods-available/security.load 72
/usr/lib/apache2/modules/mod_security.so 7029
:) внутри модуль который ловит GET запросы на /hack, причем http request header должен быть ructf/2010 :)
telnet 10.2.3.4 80
GET /hack/etc/ ructf/2010\n\n
GET /hack/root/secret.tar.gz ructf/2010\n\n
в ответ возвращает либо список файлов в каталоге, если URI заканчивается на “палку”, либо содержимое запрошенного файла
mysql: пробелы без пробелов
хитрый ход для ситуаций, когда пробел поставить нельзя, но ооооооооочень хочется:
1 2 3 4 5 6 7 |
mysql> select/**/count(*)/**/from/**/users; +----------+ | count(*) | +----------+ | 7 | +----------+ 1 row in set (0.01 sec) |
// подсмотрен в процессе участия в RuCTF 2010 quals :)
fork() в нужный момент экономит время
rspec_bisect и с чем его едят
Есть у меня скриптик rspec_bisect, предназначенный для выискивания в rails-проекте спеков, которые в процессе своего выполнения что-то глобально меняют/трогают/expect-ают или stub-ают (а то и, даже страшно сказать, any_instance-ют!..) в результате чего потом другие спеки успешно натыкаются на расставленные грабли, и FAIL-ятся с довольно фантастическими ошибками.
Показанием к применению данного скрипта можно считать случай когда запуск одной спеки через spec /spec/models/first_model_spec.rb завершается успешно и без FAIL-ов, а на запуск ее же вместе с другими спеками через rake spec получаем гарантированные FAIL-ы.
причем здесь fork() ?..
Притом что изначально для поиска иголки в стоге сена я запускал наборы спеков через `spec /spec/models/m1_spec.rb spec/models/m2_spec.rb ...`, т.е. через вызов system() (чтобы получить изолированное окружение, не влияющее ни на родителя, ни на соседей).
При этом каждый раз рельсы упорно грузили весь свой арсенал, каждый раз отъедая что-то около 10с (на довольно тяжелом проекте).
Зерном идеи оптимизации послужила давняя попытка запуска Spork. Почему-то она не никаким приростом скорости не увенчалась, но полезный осадок в виде особенностей работы Kernel.fork оставила.
Суть в том (если кто не знает), что “fork() creates a new process by duplicating the calling process.” © man 2 fork. Т.е. если вовремя форкнуться, то не надо 10 раз грузить весь Rails environment, достаточно будет загрузить его всего один раз, а все запуски тестов делать уже в fork-нутых child-ах.
На том и порешили. После непродолжительной борьбы rspec сдался и раскололся чем и как он запускает спеки ( оказалось – через at_exit.. старый извращенец :), и был слегка поmonkeyпатчен, чтоб не делал лишних телодвижений.
Сравнение запусков “до” и “после”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
### ДО ### [.] running 62 specs.. Done. ( 19s) (105/0/4) : target OK [.] running 63 specs.. Done. ( 60s) (384/2/6) : target FAIL [.] running 32 specs.. Done. ( 35s) (157/0/2) : target OK [.] running 32 specs.. Done. ( 47s) (236/2/4) : target FAIL [.] running 16 specs.. Done. ( 35s) (129/2/1) : target FAIL [.] running 8 specs.. Done. ( 28s) (73/0) : target OK [.] running 9 specs.. Done. ( 22s) (65/2/1) : target FAIL [.] running 5 specs.. Done. ( 18s) (52/2/1) : target FAIL [.] running 3 specs.. Done. ( 17s) (33/0) : target OK [.] running 3 specs.. Done. ( 17s) (28/2/1) : target FAIL [.] running 2 specs.. Done. ( 17s) (27/2/1) : target FAIL ### ПОСЛЕ ### [.] running 62 specs.. Done. ( 9s) (105/0/4) : target OK [.] running 63 specs.. Done. ( 49s) (384/2/6) : target FAIL [.] running 32 specs.. Done. ( 21s) (157/1/2) : target OK [.] running 32 specs.. Done. ( 34s) (236/3/4) : target FAIL [.] running 16 specs.. Done. ( 24s) (129/3/1) : target FAIL [.] running 8 specs.. Done. ( 20s) (73/1) : target OK [.] running 9 specs.. Done. ( 9s) (65/3/1) : target FAIL [.] running 5 specs.. Done. ( 8s) (52/3/1) : target FAIL [.] running 3 specs.. Done. ( 4s) (33/1) : target OK [.] running 3 specs.. Done. ( 8s) (28/3/1) : target FAIL [.] running 2 specs.. Done. ( 7s) (27/3/1) : target FAIL |
В результате время запуска тестового набора сократилось с 315с до 193с, т.е. чуть больше чем на треть.
magenta?.. there's no magenta!
Интересные штуки, оказывается, вытворяет наше зрение..
1. первая картинка
концентрируем взгляд на точке в центре. стараемся не моргать. (не более минуты)

эффект: все цвета должны исчезнуть, останется только серый фон.
2. вторая картинка
смотрим на крест в середине.

эффект: розовые круги исчезнут, останется один бегающий зеленый круг.
3. ссылки и факты
Thanks to abbra and Magenta Ain’t A Colour, or another link: Magenta Ain’t A Colour
rails3: link_to + image_tag
было: (rails 2.x)
1 2 3 |
<%= link_to image_tag('rainbow.png'), '/' -%>
<%= link_to "#{image_tag('rainbow.png')}Главная", '/' -%>
|
стало: (rails 3.x)
1 2 3 |
<%= link_to image_tag('rainbow.png'), '/' -%>
<%= link_to "#{image_tag('rainbow.png')}Главная".html_safe, '/' -%>
|
Первый вариант (просто image_tag) не изменился, а вот второй вариант (image_tag внутри строки) теперь требует явного указания html_safe.
rails3: link_to_function
1 |
ActionView::Template::Error (undefined method `link_to_function' for #<Class>) |
теперь link_to_function находится в плагине prototype_legacy_helper:
1 |
./script/rails plugin install git://github.com/rails/prototype_legacy_helper.git |
возможно, ребята придумали чем-то заменить, а потом и задепрекейтить, но никаких постов на эту тему я в нете не нашел.
rspec bisect
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#./rspec-bisect.rb spec/**/*_spec.rb spec/controllers/spaces/tickets_controller_spec.rb [.] rspec runner: ./script/spec [.] target spec : spec/controllers/spaces/tickets_controller_spec.rb [.] 123 candidate specs [.] running 62 specs.. Done. ( 19s) (105/0/4) : target OK [.] running 63 specs.. Done. ( 64s) (386/2/6) : target FAIL [.] running 32 specs.. Done. ( 34s) (157/0/2) : target OK [.] running 32 specs.. Done. ( 43s) (238/2/4) : target FAIL [.] running 16 specs.. Done. ( 38s) (129/2/1) : target FAIL [.] running 8 specs.. Done. ( 27s) (73/0) : target OK [.] running 9 specs.. Done. ( 19s) (65/2/1) : target FAIL [.] running 5 specs.. Done. ( 19s) (52/2/1) : target FAIL [.] running 3 specs.. Done. ( 16s) (33/0) : target OK [.] running 3 specs.. Done. ( 18s) (28/2/1) : target FAIL [.] running 2 specs.. Done. ( 17s) (27/2/1) : target FAIL [*] found matching spec: spec/models/mailman_spec.rb |
Download @ github.





