Tuesday, May 18, 2010

ukijs

я слишком долго работал с xml.

после flex с его mxml и после ms wpf и после сайтов с их html хочется сделать mxml подобную обвязку для ukijs

xml головного мозга

но если подумать, то это все–таки удобно. и логично. взять интерфейс на xml и компилировать его во что угодно, хоть во flash, хоть в js, хоть в cocoa

тут я вспомнил, какой уродец вышел у capuccino и тихо заплакал

Monday, May 17, 2010

html5

это вам не шутки.

после переверстки на выходных deepapple.com решил не останавливаться и потихоньку рассказать всю подноготную.

начнем с простого. ютуб позволяет embed только для флеша. решил поделиться правильным решением, которое на прогрессивных браузерах (и ipad) будет показывать mp4, а на всех остальных — flash

всего–то делов — добавить следующий букмарклет:

http://pastebin.com/s1JpnSxh

Friday, March 26, 2010

strings vs regexp


Rate regexp strings
regexp 130890/s -- -46%
strings 240964/s 84% --

strings

my ($dir_info, $file_name, $file_extension);
if (defined $path_info) {
my $file_info = $path_info;
my $file_info_rindex = rindex $path_info, '/';
if ($file_info_rindex) {
$dir_info = substr $path_info, 0, $file_info_rindex;
$file_info = substr ($path_info, $file_info_rindex + 1) || '';
}
my $file_extension_rindex = rindex $file_info, '.';
if ($file_extension_rindex) {
$file_extension = substr $file_info, $file_extension_rindex + 1;
$file_name = substr $file_info, 0, $file_extension_rindex;
} else {
$file_name = $file_info;
}
}

regexp

($dir_info, $file_name, $file_extension) = ($path_info =~ /^(?:(.*)\/+)?([^\/]+)\.([^\.\/]+)$/s)
if defined $path_info;


удручает только количество строк кода

Thursday, December 3, 2009

blocking read

посовещавшись с людьми в отделе, мы тут поняли, что несмотря на то, что почитать из файла в objective-c в блокирующем режиме очень сложно, программисты кварка, адоба и майкрософта таки смогли это сделать под mac os x

вот уже минут 40 напротив меня возятся чуваки, пытающиеся настроить авторизацию по ключам и получить данные из git репозитория на машине под управлением windows. втроем.

Sunday, September 13, 2009

zfs

вот уже почти год я использую zfs в качестве отказоустойчивого хранилища; на трех терабайтных дисках собран raid 5 (господа из sun называют его raidz1). в целом меня устраивает как это все работает, но хочется заострить внимание на некоторых моментах.

кэширование

начиная с mac os x 10.5 для открываемых файлов было введено кэширование. причем, работает оно по умолчанию. для того, чтобы его отключить, нужно после открытия файла принудительно выставить флаг F_GLOBAL_NOCACHE или F_NOCACHE. гугл дает достаточно информации для того, чтобы составить представление о значении этих флагов. в целом, это не проблема, до тех пор, пока пользователь не начинает пользоваться терминалом и transmission.app. в силу того, что с помощью transmission.app выкачиваются большие объемы данных, то и места в памяти под кэш отдается изрядно. в результате объем неактивной памяти растет, приложения тормозят. то же самое происходит и в терминале при копировании файлов (как минимум).

zfs относится к этому тем местом, что кэширование содержимого файлов на zfs не работает. для системя это в целом плохо, но для transmission — хорошо.

snapshots

zfs поддерживает технологию copy-on-write. суть ее состоит в том, что в случае перезаписи содержимого файла, реальная запись производится в свободное место. поэтому старые данные остаются доступными даже после изменения файла. на этом основан механизм snapshot'ов. при создании снимка состояния диска просто указывается время, когда считать данные измененными. и такой снимок совсем не занимает места, потому как место на диске занимают только измененные по сравнению с неким состоянием snapshot данные. в целом, это такой аналог тайм машины, только без резервного копирования.

raidz

это аналог raid5. то есть когда данные равномерным слоем размазаны по дискам, при этом данных — 2/3, а контрольных сумм — 1/3 от объема. поэтому емкость raidz в 2 терабайта достигается тремя дисками по терабайту. не так давно один из диско вышел из строя, для его замены оказалось достаточным поставить диск для замены, разметить его аналогично и запустить процедуру миграции данных с помощью команды zpool replace. аналогичных бесплатных решений для mac os x не существует.

с raidz связана одна не самая приятная особенность. в силу того, что building blocks для zfs являются файлы, то и перестройка raidz оказалась очень длительной — около 20–ти часов.




zpool status
pool: ultra
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress, 0.00% done, 1665h13m to go
config:

NAME STATE READ WRITE CKSUM
ultra DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
replacing DEGRADED 0 0 0
disk2s3/old UNAVAIL 0 0 0 cannot open
disk2s3 ONLINE 0 0 0
disk1s3 ONLINE 0 0 0
disk3s3 ONLINE 0 0 0





частичная поддержка

в настоящее время zfs имеется для 10.5 и при этом часть функциональности просто не работает: очистка корзины, поддержка из disk utility и некотрые другие мелочи.

Friday, August 14, 2009

cafeteria refactoring

1. выручка


в РИА «Новости» есть столовая. не буду придираться к качеству питания, меня устраивает, но не фонтан, конечно же. сотрудники питаются со скидкой 15%; чеки у сотрудников и людей со стороны разные.

так как во время еды часто идет обсуждение всякой всячины, я однажды предложил обсудить суммы на чеках. как оказалось, на чеках есть сведения, достаточные для получения средней суммы

проанализировав чеки, оказалось, что у них есть два счетчика — сквозной для всех касс номер чека и уникальная для кассы сумма, на которую отобедали люди со скидкой. получилось, что в среднем за сутки столовая выдает 1300 чеков. если учесть, что не все люди ходят обедать (хотя, большинство все–таки ходит), некоторые ходят завтракать и вечером пить кофе, то, наверное, можно получить около тысячи чеков, которые входят в «обеденную» выборку. с учетом средней суммы чека в 100 рублей, выходит оборот в сто тысяч рублей в день.

вечернюю выборку чеков по всем кассам мы не делали.

2. рефакторинг


рефакторинг кухни я не рассматриваю, так как знаю про кухню понаслышке. например, возьмем очереди в столовой. они возникают на раздаче, где люди заказывают еду. заказ — положить на тарелку — отдать тарелку. вполне можно организовать на каждое блюдо одного человека, который просто следит за тем чтобы каждого блюда было достаточно для того, чтобы люди подошли и просто взяли тарелку (спасибо, tinsdale). очередь уменьшается, но при этом растет очередь на кассе. дажен разгрузив кассу, придется найти дополнительное место в столовой и так далее. то есть оказывается, что текущий подход оказывается выигрышным из–за того, что ожидая везде понемногу, человеку не приходится стоять перед занятыми столами.

3. маржа


столовая находится в здании с пропускным режимом. увеличение прибыли возможно при выполнении любого из двух условий: увеличение суммы чека или увеличение количества человек, которое прошли через столовую. второй вариант вследствие описанных условий сложен.

что же делать с суммой чека? увеличить стоимость основных блюд столовая (скорее всего) не может, поэтому за последние месяцы в ассортименте появилась паста и блины, мороженое и молочные коктейли. если даже это влияет, то не очень сильно, потому как блины берут не вместе с остальными блюдами, а вместо основного блюда.

4. все просто


потребности пользователей и получение прибыли редко работают в одной и той же плоскости. поэтому любой рефакторинг работающего механизма должен подвергаться глубоком осмыслению и всегда нужно понимать — у рефакторинга есть как минимум две плохие стороны:
а) отрицательный экономический эффект, который не всегда сможет быть покрыт доходами даже в дальней перспективе;
б) постепенное расширение узких мест может оказаться фатальным для какого–то узкого места, на котором зиждется вся система.

Sunday, August 9, 2009

HTTPOnly

это будет добрый пост.

почти без мата.

волшебный параметр для кук (cookies), который управляет отдачей их клиенту. например, скрипту.

документация: http://www.owasp.org/index.php/HTTPOnly

судя по поддержке, все нормальные/современные браузеры поддерживают. а вот чуваки из оперы сосут хуй.

вообще, исходя из поддержки всякого стаффа, нужно оставить только два движка — вебкит и gecko (и то, последний — только до тех пор, пока все не перетянутся на хром/сафари). потому что IE любой версии все хуево рендерит и вообще, для них приходится часто другие страницы писать, а опера — просто говно браузер.