Tuesday, July 15, 2008

migration postgresql => mysql



есть достаточно большое количество statements, которые после запуска не могут быть rollback. список: для 5.0, для 5.1, то есть mysql не является ACID compliant, хотя оно заявлено.


drop table if exists temp_test_one, temp_test_two;

begin;
create table temp_test_one (a int, b int);
rollback;

-- fail here, create table caused implicit commit
create table temp_test_one (a int);


begin;
alter table test1 drop b;
rollback;

-- fail here, because alter table also caused implicit commit
alter table test1 drop b;


по непонятным для меня причинам, второе поле типа timestamp не может принимать значение now() при вставке, что делает возможным создание поля created только с помощью триггера. зато первое поле такого типа по умолчанию апдейтится при каждом обновлении записи. вот такая долбаная магия.


-- fail here, error: Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause (WHY?)
create table temp_test_two (created timestamp default now(), updated timestamp default now());

-- fail here because first timestamp column have default now()
create table temp_test_two (updated timestamp, created timestamp default now());

create table temp_test_two (updated timestamp, created timestamp);

-- now updated column being updated on any update


триггеры может создавать только пользователь с правами super (вроде, в 5.1 они это поправили)


-- fail here if you don't have super privilege (5.0)
create trigger temp_test_two_bcreate before insert on temp_test_two for each row set new.created = now();


чюваки из mysql до сих пор не смогли написать нормального парсера, чтобы разграничивать внутренности процедур от остального sql кода.


-- fail because you don't set delimiter (stupid mysql parser can't recognize trigger end without separation delimiters inside trigger and outside)
create trigger contact_aupdate after update on contact
for each row begin
if new.contact_auth = 'ok' then
update domain set domain_authenticated = true, domain_state = 'auth' where auth_contact_id = new.contact_id;
end if;
end;


теперь про перл

mysql не может запускать сразу два statement в одном do; если сделать fork, то придется создавать новое соединение, так как старое привязано к process id.


my $dbh = DBI->connect;

my $pid = fork;
if ($pid) {
# failed because you can't launch two statements at same time
$dbh->do ('drop table if exists temp_test_one; drop table if exists temp_test_two; ');
} else {
# failed because cloned dbh doesn't work
$dbh->do ('drop table if exists temp_test_one, temp_test_two;');
}


короче, если нет возможности использовать что–то другое, то можно, иначе — нужно как можно быстрее избавляться от mysql в пользу postgresql и/или sqlite.

Sunday, July 13, 2008

perl death is postponed

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

меня больше тянет к ruby, потому что по архитектуре java меньше подходит в качестве web языка. но, судя по последним данным, вряд ли я стану ruby или java специалистом.

давайте посмотрим на вот эту картинку:


по ней явно видно, что перл держится молодцом между enterprise level java и активно продвигаемым одной небезызвестной компанией ASP.NET.

как всем уже давно известно, perl не развивается. но не в том смысле, что не появляется чего–то нового. а скорее в том плане, что без большого объема общения сложно выяснить, что же стоит использовать и для каких целей. для тех же accessors в перле есть не один десяток модулей. то же касается web frameworks, ORM. короче, трендов нет, есть одна глобальная помойка под названием cpan. нет инструментов и удобных frameworks. но есть куча перлового кода, который был написан и будет написан и все это барахло нужно поддерживать.

волшебные слова типа Catalyst и Moose оставьте при себе. в реалиях сегодняшнего дня у них нет достаточного уровня производительности: http://www.alrond.com/en/2007/jan/25/performance-test-of-6-leading-frameworks/ . если охота более свежих тестов, то в компании, где я сейчас работаю, используется Catalyst и при потреблении памяти в 500 мегабайт он умеет обслуживать не более 10 простых запросов в секунду. Moose же работает в 10 раз медленнее моих самописных accessors, и это в самом простом случае, когда они не типизированы. простите, но это лажа.

Tuesday, July 1, 2008

memory organization and management in mac os x

только для 10.5



некоторые из указанных здесь данных справедливы только для 10.5. то есть я предполагаю, что, как минимум в 10.4 inactive память не могла быть помещена в swap.

чипы и диски


системе доступны кэш память процессора (cpu cache), физическая или оперативная память (ram) и память подкачки (swap). кэш память процессора — самая быстрая из имеющейся памяти. она напрямую отдает данные процессору, но за все приходится платить: она же самая дорогая и поэтому размер ее чрезвычайно мал. управление ею возможно, но при программировании под mac os x скрыто, можно лишь сравнивать насколько архитектура процессора соответствует размеру кэш памяти — что является темой для отдельной статьи. в обозримом будущем интел обещает сильное увеличение объемов процессорного кэша, так что посмотрим, может все сильно поменяется. физическая память - это микросхемы оперативной памяти, память подкачки же - это файлы на диске. также система может показывать виртуальную память, но она настолько виртуальна, что не имеет отображения ни в оперативной памяти, ни на диске. не стоит путать память подкачки и виртуальную память - они не имеют вообще ничего общего. суть виртуальной памяти в том, что она выделяется по запросу приложения. но отображаться в реальной памяти начинает только тогда, когда приложение начинает операции с выделенной памятью.

так получилось, что чем медленнее сама память, тем дешевле запихать побольше ее в компьютер. поэтому кэша у процессора в пределах нескольких мегабайт, оперативной памяти в макбук можно поставить 4 гигабайта, а более медленной дисковой — аж 300 гигабайт.

приложения потребляют память при запуске и своей работе. чем интенсивнее приложение работает с объектами и чем больше количество объектов используется, тем больше потребляет памяти данное приложение. когда активное приложение перестает помещаться в оперативную память, то часть данных неактивного приложения сбрасывается на диск, в файл подкачки. впоследствии, при переключении на такое неактивное приложение вы почувствуете, что оно совсем небыстро отвечает в течении небольшого промежутка времени - это данные, попавшие в файл подкачки, возвращаются в физическую память, а другое неактивное приложение помещается в swap. привет, пляжный мячик!


системная память


система различает в оперативной памяти несколько секций: wired, active, inactive и free. обычно, пользователь, замечая, что у него почти не осталось свободной (free) памяти, начинает выгружать приложения. количество свободной памяти после данной процедуры увеличивается, но несильно. система с двумя гигабайтами памяти, в которой запущен один только finder, может иметь свободной лишь 100 мегабайт. и это нормально.

wired память - это, зачастую, лишь память ядра системы (ну и WindowServer). wired память не имеет шансов попасть в swap. больше она ничем не интересна.

active память - это память всех приложений. то есть если приложение загрузилось, то оно «отъело» кусок active памяти. если приложение загрузило файл и держит содержимое в памяти, то оно отъест еще кусок. возможно, часть такой памяти превращается в inactive, но условия, при которых это происходит и что именно становится «неактивным» — мне неизвестно.

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

free - это память, которую не использует ни одно приложение. количество свободной памяти не может опуститься ниже некоторого предела, поэтому вы вряд ли сможете увидеть значения типа 500 килобайт памяти свободно. но если значение опустилось менее 5 мегабайт, то скорее всего либо у вас уже все тормозит, или вы очень скоро это почувствуете.

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

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

приоритеты



память подчиняется определенным приоритетам, которые выглядят как (у всех так нарисовано):

wired > active > inactive > swap

это не совсем верно. wired не имеет шансов попасть в swap. кроме того, я за много попыток не смог добиться (или не смог увидеть) попадания active памяти в inactive.

так что схема примерно такова:

inactive > swap, active > swap

то есть в случае нехватки памяти, active и inactive могут быть помещены в swap, причем сначала помещается inactive память, а потом active. если насчет active все понятно, то почему inactive, которая (фактически) является файловым кэшем, помещается в swap? этого я понять не могу, но результаты тестов показывают нам именно это.

волшебная inactive память



поработав за компьютером некоторое время я наблюдаю следующую картину:



для того, чтобы определиться с inactive памятью, я решил скопировать 1 гигабайт данных с помощью команды «cp» в терминале («Finder» не использует кэширование при копировании файлов):



все параметры в норме, полет нормальный, inactive память подросла на гиг. давайте посмотрим, что будет, если я попрошу у системы 2 гига памяти и запишу в них данных, а потом освобожу эту память. на первой картинке — процедура отъедания памяти, а на второй — после того, как я покликал по активным GUI приложениям и проверил, что они не залезли в swap:





вроде бы все в норме, только там есть волшебная строчка, на которую стоит обратить внимание: swap used. если сравнить с начальной картинкой, то в свопе оказалось полгига inactive памяти. фигасе, сказал я себе, когда это увидел. может, у меня скриншоты неправильно скриншотятся? я выгрузил все приложения и увидел следующую картину:



то есть в свопе находится inactive память, которая не была нужна ни одному из загруженных приложений. дальнейшие мои опыты не смогли вытащить эту память из swap. она осталась там до перезагрузки. естественно, после перезагрузки памяти у нас до фига:



еще одно наблюдение, которое я сделал по мере тестов — mach_kernel и WindowServer кушают память (wired память). причем, в случае выгрузки приложений, они ее не возвращают системе, а в силу того, что это wired память, то и в swap ее не отдают. а это значит, что в случае, если они выросли слишком сильно (у меня бывало и по полгига на каждого), никаким образом, кроме перезагрузки, нельзя вернуть память, сожранную этими двумя процессами, в систему.

inactive, active => free


в случае необходимости, вы можете освободить большую часть inactive и active памяти. как показывает вышеприведенный эксперимент, часть inactive памяти действительно освободится, часть же перейдет в swap. для этого вы можете воспользоваться программой ifreemem или волшебным скриптом, который просто нужно запустить в терминале или сделать action в automator:


perl -e 'my $a = []; $a[5*10**8] = 1;'


меняя циферки, вы можете управлять размером освобождаемой памяти. вышеприведенный пример освобождает почти два гига памяти. с помощью perl вам не удастся освободить больше, чем три с небольшим гигабайта. насчет ifreemem не знаю.

после запуска подобного скрипта в системе с небольшим количеством свободной (free) памяти, фотошоп начинает грузиться и работать быстрее, потому что ему не приходится биться за каждый килобайт оперативки с неактивной памятью. но за все нужно платить. в случае, когда у вас действительно немного неактивной памяти, а большая часть памяти активна, то активная память уйдет в своп и вы получите однозадачную операционную систему — переключение на другие приложения будет исключительно мучительным (конечно, если у вас не mac pro с raid 5 из 8–ми дисков).

Saturday, June 21, 2008

modding

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

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

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

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

Monday, June 9, 2008

wwdc 2008

техника молодежи



я отфильтровал лог по хитам с учетом исключительно «картинок с выставки».

цифры:

сервер стоял раком с 21:05 по час ночи


811 430 хитов
4 022 уникальных ip адреса
35.6 гигабайт трафика
197 842 799 байт в лог файле

ояебу

про, собственно, выставку




Пункт приема устаревших айфонов.


беременным пенсионерам и за 100 баксов можно без очереди.


Thursday, June 5, 2008

snow leopard?

снова о леопарде



на днях вышла версия 10.5.3 — которую я склонен считать стабильной и подходящей для каждодневного использования. если вспомнить, что леопард был выпущен 26 октября, то до конца мая, когда было выпущено последнее стабильное обновление, прошло ни много ни мало, а целых 7 месяцев. немало для отлаживания на пользователях, не правда ли? можно сказать, что и другие версии, начиная с 10.5.0 были стабильны, но позволю не согласиться. леопард явно был глючный с самого начала и новость о том, что билд 981 будет выпущен на рынок — меня просто шокировала.

кроме того, часть функциональности просто осталась за бортом — в обновлениях не появилось запоминания раскладок, address book навсегда попрощался с bluetooth. мои ожидания что они все–таки добавят эту функциональность, потерпело фиаско — «вы чё, чуваки, у нас тут айфоны, тайм машины в капсулах — а вы нам насчет ваших паршивых проблем с раскладкой клавиатуры. мы же америкосы! нам похер ваши раскладки, учите английский!»

леопард добавил не так уж много нового, но это новое не то, чтобы нормально не отлажено, оно просто скрипит по швам. небольшой пример — поставьте в настройках файрволла «только необходимые сервисы» и попробуйте расшарить интернет на айфон по wifi. ну как? работает?

грустно, но леопард — явно неудачное детище эппла, рожденное в муках и муки эти не закончились до сих пор. ну что ж, посмотрим насколько правдивыми окажутся слухи, которые предрекают 10.6 с возможным именем snow leopard.

с другой стороны, леопард — это сильная заявка на совместимость с сторонним железом и широкое тестирование под PC. начиная с бета версий, леопард сильно проще устанавливался на обычное железо, чем тигр и обновление 10.5.2 прошло практически безболезненно. некоторая фирма даже решила продавать openmac, который в других кругах называется попросту «хакинтош». но эппл тоже не лыком шита и обновление 10.5.3 сильно расставляет точки над I. последнее обновление неприятное для владельцев хакинтошей. потестировали, ребятки, и хватит.

теперь немного о intel-only составляющей возможной новой системы. если честно, процессорные мощности последних PPC машин вполне приемлемые для сегодняшнего дня. G3 уже маловато, а вот G4 800+ вполне хватает для каждодневного использования. правда есть небольшая проблема — часто на таких машинах серьезно не хватает памяти, потому что (по моим ощущениям) леопарду для шустрого шевеления нужен как минимум гиг памяти. но тут скорее вопрос политический — для отладки и разработки приложений сразу на 4–х архитектурах нужно много усилий. и было бы круто взять и отказаться сразу от трех архитектур, оставив только 64bit x86. плюсов масса да и многие современные программы не имеют в принципе PPC составляющей — даже эппловский iMovie 08 не умеет импортировать AVCHD файлы с видеокамер, используя PowerMac G5. intel only, понимаете ли! сразу можете дополнить список играми, которые вышли в intel–only, vmware fusion & parallels. считайте, почти весь системный софт.

но давайте посмотрим пристально — при отказе от 32 bit библиотек сразу перестают работать два мастодонта платформы — adobe photoshop и microsoft office. перестает работать флэш в браузере, для системы требуется больше памяти. в принципе, такое тоже возможно, но я надеюсь, что это не произойдет.

Friday, May 16, 2008

king's bouny and russian gamedev

о российском игродеве и местных продуктах.

вообще мне пофигу игродев и все, что с ним связано. но недавно вышедший king's bounty заставил меня написать. можете рассматривать это как крик души.

играю я нечасто и поэтому игр–то особо не видел. но года два назад собрал железку специально для игр и поддерживаю ее конфигурацию в актуальном состоянии. поэтом за последний год через мои руки прошло небольшое количество продуктов, которые давали мне возможность тряхнуть стариной. переводные игры я отказываюсь покупать по вполне объективной причине — перевод на редкость уёбищный. а здесь, в москве, очень сложно купить продукт с оригинальной локализацией. поэтому до недавних пор я все скачивал из сети и все было замечательно. fallout 1/2, heroes of might and magic IV, psychonauts, orange box, gta: san andreas, bioshock, guitar hero 3 — отличные игры, хотя некоторые и довольно старые.

сказ о «продуктах».

кучу лет назад моей девушкой был куплен диск с игрой «казаки». не знаю, какой версии и модификации, но после проверки компьютера на вирусы, оказалось, что папка с казаками заражена. переустановка системы и установка на чистую систему только игры дала тот же результат. судя по тому, что в интернет (http://playingworld.0pk.ru/viewtopic.php?pid=2113) есть аналогичные отзывы, проблема касалась не только моего диска. диск не был пиратским, была лицензия, книжица с кодом, которую нужно было куда–то послать. нафиг такое дерьмо, диск был выкинут. в саму игру я не играл — меня такие не интересуют.

совсем недавно, после очередной смены «железа», мной был скачан дистрибутив разрекламированного сталкера. время игры составило 15 минут. после orange box игра кажется пресной. суперэффектов на максимальных настройках я не разглядел. то есть может дальше будет интереснее, но как–то уже не хочется. соответственно, хорошо что не купил.

две недели назад был приобретен диск с king's bounty. игра хорошая, затягивает. то есть если уж сел, то оторваться будет сложно. но есть ряд нерешенных проблем, которые, по всей видимости и не будут решены. для начала расскажу о баг–трекинге этой игры. есть ее форум, где люди оставляют сообщения о багах соответственно патчам игры. патч 1.2 породил ветку на 35 страниц (на момент моего последнего просмотра). я оставил сообщение о проблеме, но не получил никакого подверждения о том, что мои проблемы будут учтены. у меня возникло подозрение о том, что они ничего и не исправят. так и оказалось. патч 1.3 не учел проблем, которые были описаны в ветке 1.2; например http://kingsbounty.ru/forum/index.php?showtopic=496&st=60&p=12190&#entry12190.

дополнительно к таким клевым условиям для разработчиков и игроков на форуме есть некоторое количество долбоёбов–модераторов, которые закрывают и удаляют ветки, которые им не нравятся.

теперь от поддержки плавно перейдем к игре.

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

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

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

ссылку на еще один баг я давал выше, при описании системы баг–трекинга.

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

сказ об издателях.

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

небольшое отступление. многие зарубежные издатели выпускают так называемые hybrid iso, на котором содержится версия под PC и для Mac. ни один из продуктов, которые поставляются в росиию, не содержит мак секции. возьмите fallout 1/2 из старого или guitar hero 3 из нового — как минимум эти продукты поставляются в hybrid iso. но нет, зачем пользователям маков играть, решают мудаки в новом диске и 1c. пускай купят себе PC для игр. ведь известно же, что маки — унылое говно.