<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4156767234908194810</id><updated>2012-01-13T10:59:47.171+04:00</updated><category term='facebook'/><category term='scala'/><category term='архитектура'/><category term='java'/><category term='bugs'/><category term='as3'/><category term='dsl'/><category term='ocaml'/><category term='variants'/><category term='blog'/><category term='flex'/><category term='программирование'/><category term='haxe'/><title type='text'>Программистские записки Алексея Фомкина</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yelbota.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yelbota.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Aleksey Fomkin</name><uri>https://profiles.google.com/115851697505469154771</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-RKvJQCq57KU/AAAAAAAAAAI/AAAAAAAAA2U/9fJBfplByD4/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4156767234908194810.post-7983737761454266574</id><published>2012-01-13T10:15:00.003+04:00</published><updated>2012-01-13T10:15:57.526+04:00</updated><title type='text'>О старых знакомых</title><content type='html'>Пару лет назад, у адоби был такой проект, назывался Flex Builder Linux. Основан он был на кодовой базе Flex Builder 2, в нем отсутствовали профайлер и дизайн-вью, он находился в вечной "альфе", за то работал автокомплит и дебагер (с горем пополам). Это было единственное вменяемое средство разработки для флеш, под линуксом, которое я знал, по этому выбирать не приходилось. Естественно приходилось мириться с гюками, которые я списывал на "альфу". Потом JetBrains сделали поддержку AS3/Flex в IDEA, а умные люди посоветовали мне на нее перейти. Что я собственно сделал, и забыл о проблемах. Потом в моей жизни появился мавен, и к середине 2011 года я наслаждался созданием проектов из архетипов и настройкой среды в один клик. Как же это здорово, когда твой проект, состоящий из нескольких flex-модулей, java-модулей, кодогенераторов и прочего дерьма, разворачивается в один клик и работает, да. Так вот, к чему это я: вчера я поработал, в течении вечера, с Flash Builder 4.6, и знаете, что? Я встретил все старые добрые глюки из той самой "альфы" для линукса. После стольких лет разлуки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4156767234908194810-7983737761454266574?l=yelbota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yelbota.blogspot.com/feeds/7983737761454266574/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://yelbota.blogspot.com/2012/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/7983737761454266574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/7983737761454266574'/><link rel='alternate' type='text/html' href='http://yelbota.blogspot.com/2012/01/blog-post.html' title='О старых знакомых'/><author><name>Aleksey Fomkin</name><uri>https://profiles.google.com/115851697505469154771</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-RKvJQCq57KU/AAAAAAAAAAI/AAAAAAAAA2U/9fJBfplByD4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4156767234908194810.post-3838810375311915824</id><published>2011-09-05T09:47:00.000+04:00</published><updated>2011-09-05T09:49:22.927+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='as3'/><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='архитектура'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><title type='text'>Забор вокруг туалета.</title><content type='html'>&lt;p&gt;Есть такой проект Facebook ActionScript API (&lt;a href="http://code.google.com/p/facebook-actionscript-api"&gt;http://code.google.com/p/facebook-actionscript-api&lt;/a&gt;). Так как работа под браузер, дестктоп и девайсы несколько различаются, ребята сделали несколько реализаций своего API. Но как они это сделали!&lt;/p&gt;&lt;p&gt;Есть три класса-синглтона: Facebook, FacebookDesktop и FacebookMobile, отнаследованные от некого AbstractFacebook. Пока все хорошо, идем дальше. Каждый из классов имеет набор статических методов, которые в свою очередь вызывают методы приватного инстанса того же класса. То же не плохо, но вот теперь начинается жопа - все методы инстанса и getInstance() объявлены, как protected! То есть использовать их можно только через статику или отнаследовавшись от нужной платформенной реализации (что в свою очередь то же не правильно). Таким образом ребята перекрывают естественный путь для повторного использования кода при создании мультиплатформенного приложения, а именно приложение работает с чистым платформонезависимым интерфейсом, реализации которого подставляются исходя из цели компиляции.&lt;/p&gt;&lt;p&gt;Синглтон в данном случае весьма уместен. Согласитесь, глупо создавать инстанс API-класса, такскать его по всему приложению, учитывая, что в 99% случаев оно будет работать только с одним фейсбук-профилем одновременно. Это не тот случай, когда нам нужны инъекции, синглтон оберегает нас от желания некоторых тащить зависимость через параметры конструкторов. Но получилось так, что отрезая пути быдлокодеров, ребята отрезали и нормальные юзкейсы.&lt;/p&gt;&lt;p&gt;В программировании нужно руководствоваться здравым смыслом. Глупо строить забор с калиткой вокруг общественного туалета.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4156767234908194810-3838810375311915824?l=yelbota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yelbota.blogspot.com/feeds/3838810375311915824/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://yelbota.blogspot.com/2011/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/3838810375311915824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/3838810375311915824'/><link rel='alternate' type='text/html' href='http://yelbota.blogspot.com/2011/09/blog-post.html' title='Забор вокруг туалета.'/><author><name>Aleksey Fomkin</name><uri>https://profiles.google.com/115851697505469154771</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-RKvJQCq57KU/AAAAAAAAAAI/AAAAAAAAA2U/9fJBfplByD4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4156767234908194810.post-8456867983094702431</id><published>2010-08-11T18:13:00.000+04:00</published><updated>2010-08-11T19:18:06.630+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ocaml'/><category scheme='http://www.blogger.com/atom/ns#' term='variants'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>После отсутствия.</title><content type='html'>Всегда хочется писать что-то монументальное, но это к сожалению не всегда получается. Я тут все ждал и ждал, когда появится интересная тема, что бы написать большую пребольшую статью, но тема так и не появилась. Что бы блог не простаивал без дела, попробую писать сюда про всякие рабочие моменты, сообщения про которые не умещаются в твиттере.&lt;br /&gt;&lt;br /&gt;Для работы в своих проектах мы используем разнообразные предметно-ориентированные языки. Один из них служит для описания структур данных (будем называть его SL). Структуры описанные на нем используются для клиент-серверного обмена. Иметь промежуточный язык очень удобно, когда клиентская и серверная части написаны на разных платформах и языках (к примеру Flash и &lt;подставьте сюда то, что вам больше нравится&gt;). Многие в этом случае пишут свой код дважды. В нашем случае транслятор SL подготавливает структуры данных и методы сереализации под все используемые в проекте платформы.&lt;br /&gt;&lt;br /&gt;В OCaml есть такая интересная штука, как &lt;a href="http://www.ocaml-tutorial.org/data_types_and_matching#Variants__qualified_unions_and_enums_"&gt;Variants&lt;/a&gt;. В Scala подобную роль выполняют &lt;a href="http://www.scala-lang.org/node/107"&gt;Case Classes&lt;/a&gt;. Поддержка такой языковой конструкции есть и в SL. К сожалению почти во всех императивных языках ее поддержки нет, что создает сложности для трансляции кода из SL в эти языки. На пример для AS3 нет способа реализовать подобное типобезопасно. Недавно понадобилось сделать кодогенерцию SL в Java.&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#696969; '&gt;// SL&lt;/span&gt;&lt;br /&gt;variant game-resource&lt;br /&gt;  float money&lt;br /&gt;  float energy&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#696969; '&gt;// Генерированный код.&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;class&lt;/span&gt; PGameResource &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;interface&lt;/span&gt; Matcher &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; energy&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; '&gt;float&lt;/span&gt; value&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; money&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; '&gt;float&lt;/span&gt; value&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;        &lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;private&lt;/span&gt; &lt;span style='color:#bb7977; font-weight:bold; '&gt;Object&lt;/span&gt; __storage&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;private&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;byte&lt;/span&gt; __variance&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; match&lt;span style='color:#808030; '&gt;(&lt;/span&gt;Matcher matcher&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;switch&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;__variance&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800000; font-weight:bold; '&gt;case&lt;/span&gt; &lt;span style='color:#008c00; '&gt;0&lt;/span&gt;&lt;span style='color:#808030; '&gt;:&lt;/span&gt;&lt;br /&gt;            matcher&lt;span style='color:#808030; '&gt;.&lt;/span&gt;energy&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;Float&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; __storage&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;                &lt;span style='color:#800000; font-weight:bold; '&gt;break&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span style='color:#800000; font-weight:bold; '&gt;case&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;:&lt;/span&gt;&lt;br /&gt;            matcher&lt;span style='color:#808030; '&gt;.&lt;/span&gt;money&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;Float&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; __storage&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;                &lt;span style='color:#800000; font-weight:bold; '&gt;break&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;            &lt;br /&gt;        &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; set_energy&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; '&gt;float&lt;/span&gt; value&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        __variance &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#008c00; '&gt;0&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        __storage &lt;span style='color:#808030; '&gt;=&lt;/span&gt; value&lt;span style='color:#800080; '&gt;;&lt;/span&gt;        &lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; set_money&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; '&gt;float&lt;/span&gt; value&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        __variance &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        __storage &lt;span style='color:#808030; '&gt;=&lt;/span&gt; value&lt;span style='color:#800080; '&gt;;&lt;/span&gt;        &lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style='color:#696969; '&gt;// ...&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#696969; '&gt;// Разбор&lt;/span&gt;&lt;br /&gt;value.match(new PGameResource.Matcher() &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; money&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; '&gt;float&lt;/span&gt; value&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        quest&lt;span style='color:#808030; '&gt;.&lt;/span&gt;reward&lt;span style='color:#808030; '&gt;.&lt;/span&gt;add&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;new&lt;/span&gt; AddResourceAction&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;Quest&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;br /&gt;                FunholeResourceKind&lt;span style='color:#808030; '&gt;.&lt;/span&gt;MONEY&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;                value&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; energy&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; '&gt;float&lt;/span&gt; value&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        quest&lt;span style='color:#808030; '&gt;.&lt;/span&gt;reward&lt;span style='color:#808030; '&gt;.&lt;/span&gt;add&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;new&lt;/span&gt; AddResourceAction&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;Quest&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;br /&gt;                FunholeResourceKind&lt;span style='color:#808030; '&gt;.&lt;/span&gt;ENERGY&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;                value&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;)&lt;span style='color:#808030; '&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Вообще я не слишком искушен в Java, так что если среди читателей есть Java-программисты, то было бы здорово выслушать их мнения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4156767234908194810-8456867983094702431?l=yelbota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yelbota.blogspot.com/feeds/8456867983094702431/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://yelbota.blogspot.com/2010/08/blog-post.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/8456867983094702431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/8456867983094702431'/><link rel='alternate' type='text/html' href='http://yelbota.blogspot.com/2010/08/blog-post.html' title='После отсутствия.'/><author><name>Aleksey Fomkin</name><uri>https://profiles.google.com/115851697505469154771</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-RKvJQCq57KU/AAAAAAAAAAI/AAAAAAAAA2U/9fJBfplByD4/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4156767234908194810.post-2719453423910005590</id><published>2009-12-14T12:08:00.000+03:00</published><updated>2009-12-14T13:11:59.798+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haxe'/><title type='text'>Разочарование в NME.</title><content type='html'>&lt;p&gt;Для тех, кто не в курсе. &lt;a href="http://code.google.com/p/nekonme/"&gt;NekoNME&lt;/a&gt; это набор биндингов &lt;a href="http://www.libsdl.org/"&gt;SDL&lt;/a&gt; для Neko. В сочетании с &lt;a href="http://code.google.com/p/neash/"&gt;Neash&lt;/a&gt; представляет собой реализацию Flash API для neko/hxcpp. Простыми словами, эти библиотеки позволяют создавать флеш-приложения в машинном коде для разных платформ (включая IPhone). Звучит очень здорово. Я на пример просто слюной истекаю, когда представлю себе скачиваемый клиент для флешовой MMO, который не тормозит (машинный код + видеокарта).&lt;/p&gt;&lt;p&gt;Некоторое время назад мною была написана серия тестов анимации (что-то вроде &lt;a href="http://gamehaxe.com/1000Ogres.html"&gt;1000 Ogres&lt;/a&gt;) и я решил попробовать скомпилировать их в neash/nme. Пришлось дописать Loader::loadBytes, переписать BitmapData::copyPixels и исправить одну критическую ошибку в реализации Input для hxcpp. На все про все ушло примерно четыре часа и тест запустился в режиме software-rendering. В режиме OpenGL он пускаться не захотел.&lt;/p&gt;&lt;p&gt;Производительность будем мерить в FPS :) Итак NME-версия отставала от обыкновенного flashplayer на 10 FPS, хотя таймеры работали субъективно быстрее. Я списал тормоза на software-rendering и отправился ковырять, почему не работает OpenGL. Немного погуглив по ошибке&lt;/p&gt;&lt;pre&gt;Couldn't set OpenGL mode: Couldn't find matching GLX visual&lt;/pre&gt;&lt;p&gt;мне стала понятна проблема, я внес соответствующие &lt;a href="http://code.google.com/p/nekonme/source/browse/trunk/project/nme.cpp#828"&gt;изменения&lt;/a&gt; и пересобрал NME (про пересборку отдельная история). Увеличение производительности по сравнению с flashplayer всего 10 FPS. Обидно. Я ожидал, что сейчас все полетит на третьей космической скорости, графика ведь не сложная: ~1000 двадцатикадровых анимаций на разрешении 1024x768. Для современной видеокарты это не задача.&lt;/p&gt;&lt;p&gt;Меня не напрягали бы сложности связанные с портированием, реализованы не все методы, поведение некоторых методов отличается от аналогов в оригинальном API, если бы производительность была бы на порядок выше. Судя по &lt;a href="http://code.google.com/p/nekonme/source/list"&gt;изменениям&lt;/a&gt; в репозитории, авторы сейчас все полностью переписывают. Остается надеяться, что новый NME будет лучше прежнего.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4156767234908194810-2719453423910005590?l=yelbota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yelbota.blogspot.com/feeds/2719453423910005590/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://yelbota.blogspot.com/2009/12/nme.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/2719453423910005590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/2719453423910005590'/><link rel='alternate' type='text/html' href='http://yelbota.blogspot.com/2009/12/nme.html' title='Разочарование в NME.'/><author><name>Aleksey Fomkin</name><uri>https://profiles.google.com/115851697505469154771</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-RKvJQCq57KU/AAAAAAAAAAI/AAAAAAAAA2U/9fJBfplByD4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4156767234908194810.post-5189216164602675956</id><published>2009-11-16T18:20:00.000+03:00</published><updated>2009-11-16T19:21:50.110+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='haxe'/><title type='text'>Первое сообщение и проблемы с Socket в haXe/cpp</title><content type='html'>&lt;p&gt;Приветствую всех. О жизни я обычно пишу в &lt;a href="http://yelbota.livejournal.com"&gt;ЖЖ&lt;/a&gt;, а о работе в &lt;a href="http://juick.com/yelbota/"&gt;Жуйк&lt;/a&gt;. Однако в жуйк не всегда помещается все, что хочется написать, по этому я решил завести «большой» блог. На супер статьи не претендую, однако постараюсь осветить здесь те технологические проблемы, с которыми сталкиваюсь сам.&lt;/p&gt;&lt;p&gt;Что бы не плодить сообщения, перейду сразу же к делу. Думаю, что читателю известно, что компилятор языка &lt;a href="http://haxe.org"&gt;haXe&lt;/a&gt; имеет C++ бэкэнд. То есть исходный код haXe транслируется в C++ код, что бы затем быть скомпилированным в машинный. Сейчас я экспериментирую с haXe, как с серверным языком, но изначально пишу все под &lt;a href="http://nekovm.org"&gt;NekoVM&lt;/a&gt;, но как-то на днях решил попробовать скомпилировать свои поделки в машинный код, ведь API стандартной библиотеки haXe/cpp совместимо с API haXe/neko.&lt;/p&gt;&lt;p&gt;Значит есть у меня сервер, клиент (haXe/Flash9), и бот, что бы нагрузочно тестить. Сервер у меня не собрался вообще, но с этим я пока не разбирался, клиент собирать не пробовал (хотя такая возможность есть за счёт библиотеки &lt;a href="http://code.google.com/p/neash"&gt;Neash&lt;/a&gt;), а бот нормально собрался, но работать не захотел.&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;Runtime error:&lt;br /&gt;Terminal error not bytebuffer, File.//libs/std/Socket.cpp, line 186&lt;/pre&gt;&lt;p&gt;Начал рыться в исходниках стандартной библиотеки (в этом самом Socket.cpp), но ничего не нашёл. Оказалось, что ошибка находится в SocketOutput.hx. В нативную функцию записи буффера вместо буффера передаётся ссылка на функцию Bytes.getData (). Совершенно глупая опечатка: автор забыл скобки! Между прочим этот случай раскрывает прелесть динамической типизации:) Нативные функции загружаются как динамический объект, по этому мы не имеем проверки типов аргументов во время компиляции.&lt;/p&gt;&lt;p&gt;Создаётся ощущение, что библиотеку не тестировали вообще. В этом есть минус opensource: ребята пишущие cpp бэкэнд просто не сталкивались с записью данных в сокет через Output, а пользовались writeString, по этому целый кусок кода оказался не оттестированным. Самое интересное, что их нельзя за это винить, ведь они пишут библиотеку для себя и делают свой вклад, не обязуясь создать безглючный «продукт». С другой стороны это плюс opensource: каждый может взять исходный код и исправить инструмент под свои нужды. Хорошо, когда открытость сочетается с enterprise-качеством.&lt;/p&gt;&lt;p&gt;Мой патч исправляющий проблему: &lt;a href="http://hxcpp.googlecode.com/issues/attachment?aid=-7013333957780095441&amp;amp;name=socketoutput.patch"&gt;http://hxcpp.googlecode.com/issues/attachment?aid=-7013333957780095441&amp;amp;name=socketoutput.patch&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4156767234908194810-5189216164602675956?l=yelbota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yelbota.blogspot.com/feeds/5189216164602675956/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://yelbota.blogspot.com/2009/11/socket-haxecpp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/5189216164602675956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4156767234908194810/posts/default/5189216164602675956'/><link rel='alternate' type='text/html' href='http://yelbota.blogspot.com/2009/11/socket-haxecpp.html' title='Первое сообщение и проблемы с Socket в haXe/cpp'/><author><name>Aleksey Fomkin</name><uri>https://profiles.google.com/115851697505469154771</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-RKvJQCq57KU/AAAAAAAAAAI/AAAAAAAAA2U/9fJBfplByD4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
