<?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-22341336</id><updated>2011-08-14T07:49:49.914-07:00</updated><category term='linux'/><category term='string'/><category term='source'/><category term='decoding'/><category term='hint'/><category term='devel'/><category term='python'/><category term='motionx'/><category term='fonts'/><category term='iconv'/><category term='unicode'/><category term='vim'/><category term='fun'/><category term='xne'/><category term='c++'/><category term='вендекапец'/><title type='text'>Неспящий</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-22341336.post-5808246474823757149</id><published>2009-05-24T14:25:00.000-07:00</published><updated>2009-05-24T21:18:51.640-07:00</updated><title type='text'>C++ 0x</title><content type='html'>Поставил себе gcc 4.5 из лямбда бранча. Поиграюсь пока с тем, что успели реализовать из С++0x.&lt;br /&gt;Заодно на виртуальную машину поставил windows7 + msvs 2010beta. Там тоже частично реализован C++0x (lambda, auto, static_assert).&lt;br /&gt;Интересно сравнить подоходы реализации тех же лямбд и замыканий у микрософта и gcc.&lt;br /&gt;&lt;br /&gt;Пока что нашёл баг в студии.&lt;br /&gt;В таком коде&lt;br /&gt;&lt;code&gt;auto a = []() { return [](){return 0.0f;}; };&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Компилятор ругается, что лямбда верхнего уровня имеет возвращаемый тип void, поэтому функция не должна ничего возвращать. Но ведь тип возвращаемого значения должен выводится, если он не указан, а не считаться что он void?&lt;br /&gt;&lt;br /&gt;gcc на этой строчке вообще умирает с sigsegv&lt;br /&gt;&lt;br /&gt;upd.&lt;br /&gt;Ещё баг в gcc нашёл.&lt;br /&gt;Такой вот код:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;function&lt;void(void)&gt; Foo::GetEventHandler()&lt;br /&gt;{&lt;br /&gt;   return  [=](){this-&gt;onSomeEvent();};&lt;br /&gt;}&lt;br /&gt;&lt;/void(void)&gt;&lt;/code&gt;&lt;br /&gt;при попытке вызова функтора получим sigsegv, так как this почему-то в лямбду захватывается нулевой.&lt;br /&gt;&lt;br /&gt;если написать вот так:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;return  [this](){this-&gt;onSomeEvent();};&lt;/code&gt;&lt;br /&gt;то всё ок.&lt;br /&gt;&lt;br /&gt;в vc10 корректно работают оба варианта&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5808246474823757149?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5808246474823757149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5808246474823757149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5808246474823757149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5808246474823757149'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2009/05/c-0x.html' title='C++ 0x'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-5705467315036487119</id><published>2009-03-02T07:47:00.000-08:00</published><updated>2009-03-02T07:49:21.490-08:00</updated><title type='text'></title><content type='html'>&lt;a href="http://www.trumphurst.com/cpplibs/cpplibs.php"&gt;http://www.trumphurst.com/cpplibs/cpplibs.php&lt;/a&gt;&lt;br /&gt;Довольно полезный сайт, содержащий базу различных С++ библиотек и небольшое описание к ним. Как я понял, база постоянно обновляется.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5705467315036487119?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5705467315036487119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5705467315036487119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5705467315036487119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5705467315036487119'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2009/03/httpwww.html' title=''/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-5765356037017598398</id><published>2009-01-16T09:19:00.000-08:00</published><updated>2009-01-16T09:26:18.045-08:00</updated><title type='text'>Подборка документов.</title><content type='html'>Ужас не писал сюда почти год. Буду исправляться.&lt;br /&gt;&lt;br /&gt;На своей страничке &lt;a href="http://cyberzx.com/"&gt;cyberzx.com&lt;/a&gt; начал вести подборку различных статей, касающихся программирования и создания игр. Пока там собрал в основном статьи по анимации, которые мне показались очень полезными и интересными.&lt;br /&gt;Но так же добавлю туда статьи по компьютерной графике, С++, ФП, компьютерной математике, коих у меня набралось довольно большое количество.&lt;br /&gt;В первую очередь я это делаю для себя, удобно когда всё находится под рукой и в одном месте. Но если кому-то собранный материал тоже пригодиться, я буду только рад.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5765356037017598398?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5765356037017598398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5765356037017598398' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5765356037017598398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5765356037017598398'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2009/01/blog-post.html' title='Подборка документов.'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-8701569324507459597</id><published>2008-04-21T19:47:00.000-07:00</published><updated>2008-04-21T19:55:30.141-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>списки и кортежи</title><content type='html'>Вот не могу понять, зачем Питону - языку с динамической типизацией нужны одновременно и списки и кортежи? Ведь основное различие между ними это то, что списки представляют гомомогенное множество, а кортежи - гетерогенное. К тому же часто бывает, что кортежи в отличии от списков иммутабельны. &lt;br /&gt;В питоне же, что списки, что кортежи являются гетерогенными множествами, которые к тому же можно динамически изменять. &lt;br /&gt;Зачем вводить лишние сущности? Может их того... бритвой товарища Оккама?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-8701569324507459597?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/8701569324507459597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=8701569324507459597' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/8701569324507459597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/8701569324507459597'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2008/04/blog-post.html' title='списки и кортежи'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-4139066178568303094</id><published>2008-04-16T17:05:00.000-07:00</published><updated>2008-04-16T17:10:03.684-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='source'/><title type='text'>Linux комментарии</title><content type='html'>Тема конечно не новая, но просто стало интересно. Ввёл вот эту комманду в директории с исходниками линукса&lt;br /&gt;grep fuck -Rn ./*&lt;br /&gt;&lt;br /&gt;вот результат её&lt;br /&gt;&lt;br /&gt;./arch/mips/kernel/irixelf.c:795:#if 0 /* XXX No fucking way dude... */&lt;br /&gt;./arch/mips/kernel/irixioctl.c:2: * irixioctl.c: A fucking mess...&lt;br /&gt;./arch/mips/pci/ops-bridge.c:43:         * IOC3 is fucked fucked beyond believe ...  Don't even give the&lt;br /&gt;./arch/mips/pci/ops-bridge.c:63:         * IOC3 is fucked fucked beyond believe ...  Don't even give the&lt;br /&gt;./arch/mips/pci/ops-bridge.c:72:         * IOC3 is fucked fucked beyond believe ...  Don't try to access&lt;br /&gt;./arch/mips/pci/ops-bridge.c:105:        * IOC3 is fucked fucked beyond believe ...  Don't even give the&lt;br /&gt;./arch/mips/pci/ops-bridge.c:126:        * IOC3 is fucked fucked beyond believe ...  Don't even give the&lt;br /&gt;./arch/mips/pci/ops-bridge.c:135:        * IOC3 is fucked fucked beyond believe ...  Don't try to access&lt;br /&gt;./arch/mips/pci/ops-bridge.c:176:        * IOC3 is fucked fucked beyond believe ...  Don't even give the&lt;br /&gt;./arch/mips/pci/ops-bridge.c:200:        * IOC3 is fucked fucked beyond believe ...  Don't even give the&lt;br /&gt;./arch/mips/pci/ops-bridge.c:207:        * IOC3 is fucked fucked beyond believe ...  Don't try to access&lt;br /&gt;./arch/mips/pci/ops-bridge.c:244:        * IOC3 is fucked fucked beyond believe ...  Don't even give the&lt;br /&gt;./arch/mips/pci/ops-bridge.c:268:        * IOC3 is fucked fucked beyond believe ...  Don't even give the&lt;br /&gt;./arch/mips/pci/ops-bridge.c:275:        * IOC3 is fucked fucked beyond believe ...  Don't try to access&lt;br /&gt;./arch/mips/sgi-ip22/ip22-setup.c:44:    * fucking with the memory controller because it needs to know the&lt;br /&gt;./arch/ppc/syslib/ppc405_pci.c:71:       * the kernel try to remap our BAR #1 and fuck up bus&lt;br /&gt;./arch/sparc/kernel/process.c:582:      /* fuck me plenty */&lt;br /&gt;./arch/sparc/kernel/sunos_ioctl.c:62:   /* Binary compatibility is good American knowhow fuckin' up. */&lt;br /&gt;./arch/x86/kernel/cpu/cpufreq/powernow-k7.c:577: * Some Athlon laptops have really fucked PST tables.&lt;br /&gt;./arch/x86/kernel/cpu/mtrr/generic.c:141:/*  Some BIOS's are fucked and don't set all MTRRs the same!  */&lt;br /&gt;./Documentation/DocBook/kernel-locking.tmpl:1408:       If you don't see why, please stay the fuck away from my code.&lt;br /&gt;./drivers/ide/pci/cmd640.c:16: *  These chips are basically fucked by design, and getting this driver&lt;br /&gt;./drivers/media/video/bt819.c:204:                                         BUG? Why does turning the chroma comb on fuck up color?&lt;br /&gt;./drivers/mtd/mtd_blkdevs.c:351:           registered, to prevent the link/init ordering from fucking&lt;br /&gt;./drivers/net/sunhme.c:1000:/* Only Sun can take such nice parts and fuck up the programming interface&lt;br /&gt;./drivers/net/sunhme.c:2077:            /* This card is _fucking_ hot... */&lt;br /&gt;./drivers/scsi/NCR53C9x.c:1771: * how bad the target and/or ESP fucks things up.&lt;br /&gt;./drivers/scsi/NCR53C9x.c:2691:         /* Be careful, we could really get fucked during synchronous&lt;br /&gt;./drivers/scsi/qlogicpti.h:64:/* Am I fucking pedantic or what? */&lt;br /&gt;./drivers/watchdog/shwdt.c:116:  * brain-damage, it's managed to fuck things up one step further..&lt;br /&gt;./include/asm-cris/arch-v32/spinlock.h:109: * writers) in interrupt handlers someone fucked up and we'd dead-lock&lt;br /&gt;./include/asm-m68k/sun3ints.h:30:/* master list of VME vectors -- don't fuck with this */&lt;br /&gt;./include/asm-sparc64/system.h:195:     /* If you fuck with this, update ret_from_syscall code too. */  \&lt;br /&gt;./include/linux/netfilter/xt_limit.h:18:        /* Ugly, ugly fucker. */&lt;br /&gt;./lib/vsprintf.c:9: * Wirzenius wrote this portably, Torvalds fucked it up :-)&lt;br /&gt;./net/ipv4/netfilter/nf_nat_snmp_basic.c:1015: * (And this is the fucking 'basic' method).&lt;br /&gt;./net/netfilter/nf_queue.c:158:         /* James M doesn't say fuck enough. */&lt;br /&gt;./sound/oss/opl3.c:833:  * What the fuck is going on here?  We leave junk in the beginning&lt;br /&gt;&lt;br /&gt;Линукс всё же народная ось :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-4139066178568303094?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/4139066178568303094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=4139066178568303094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/4139066178568303094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/4139066178568303094'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2008/04/linux.html' title='Linux комментарии'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-1696748098387069218</id><published>2008-03-02T15:07:00.001-08:00</published><updated>2008-03-02T16:14:39.131-08:00</updated><title type='text'>полезные инструменты</title><content type='html'>Оказалось, мне &lt;a href="http://deepencpp.blogspot.com/2008/02/5.html"&gt;тут&lt;/a&gt; передали эстафету в одном интересном флешмобе. Чтож, придётся поучаствовать. &lt;br /&gt;&lt;br /&gt;1. Yakuake. Очень удобная консоль, которая выезжает сверху как в продвинутых играх. Позволяет экономить место и время на мелких операциях в консоли. Но если нужно что-то сложное делать, типа подебажить в gdb, то предпочитаю полноэкранную konsole, благо у меня два монитора и я могу себе это позволить. &lt;br /&gt;&lt;br /&gt;2. Subversion. Система контроля версий нужна не только команде разработчиков, но и одному человеку. Можно смело удалять большие куски кода и вносить значительные изменения, не волнуясь, что что-то сломаешь. Ведь всегда можно посмотреть на то, что было раньше. Также удобно использовать эту систему не только для своих больших проектов, но и для мелких наработок, вроде полезных скриптов, документации, тестов, демок и т.д.&lt;br /&gt;Так как база данных SVN легко бекапится, то легко обеспечить сохранность всей своей интеллектуальной собственности, не боясь что твой хард диск полетит. Можно перенести все свои наработки на другую машину\платформу. Или выложить на сервер и иметь доступ к ним с любого другого места.&lt;br /&gt;&lt;br /&gt;3. locate. Индексирует файловую систему и позволяет осуществлять быстрый поиск файлов в своей базе данных. Это очень удобно. В среднем на моих 500+ гигабайтах дискового пространства поиск конкретного файла занимает менее 1 секунды. Раньше пользовался для этих целей утилитой find, но locate позволяет сократить время на несколько порядков. Ну и find всё-таки довольно сложная утилита. Для простого поиска файла по имени надо написать find / -name 'blabla', куда лаконичнее писать locate 'blabla'&lt;br /&gt;&lt;br /&gt;4. vixie-cron. Как я жил без шедулера раньше - не представляю. Теперь мой компьютер делает 80% рутинных действий за меня. Он и создаёт бекапы SVN репозитория с записью на болванки раз в 2 недели, и индексирует базу для locate каждый день в 12 часов ночи, и синхронизирует portage для gentoo каждое воскресенье. Вообщем, если у вас есть какой-то набор действий, которые вам надо повторять периодечески, лучше их прописать в крон и тем самым сэкономить своё время и силы. &lt;br /&gt;&lt;br /&gt;5. gVim. vim, как оказалось, очень мощный и удобный редактор. Да, порог вхождения в него весьма высок. Сначала надо читать туториалы и мануалы, запоминать многочисленные клавиатурные комбинации. Но зато потом эффективность работы с текстом повышается на порядки. После vim`а работать в Microsoft Visual Studio это всё равно, что рубить деревья топором, после того, как ты это делал бензопилой. &lt;br /&gt;&lt;br /&gt;6. bash, find, grep, sed, wget, etc. жизнь свою без этого уже не представляю. unix way работы с системой очень удобен и комфортен, особенно для программиста. Вместо того, что бы тыкать мышкой в ограниченное по функциональности гуи, я просто пишу то, что мне надо сделать и система это делает.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-1696748098387069218?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/1696748098387069218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=1696748098387069218' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/1696748098387069218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/1696748098387069218'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2008/03/blog-post.html' title='полезные инструменты'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-4819734426242785627</id><published>2008-02-19T00:36:00.000-08:00</published><updated>2008-02-19T01:09:50.893-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fonts'/><category scheme='http://www.blogger.com/atom/ns#' term='вендекапец'/><title type='text'>Шрифты</title><content type='html'>Наткнулся на очень интересную &lt;a href="http://antigrain.com/research/font_rasterization/index.html#FONT_RASTERIZATION"&gt;статью&lt;/a&gt;   Максима Шемарёва, автора замечательной библиотеки двухмерной растеризации antigrain. &lt;br /&gt;&lt;br /&gt;В ней автор раскрывает вопросы различия субпиксельной растеризации шрифтов у MS, Apple и под линуксом. &lt;br /&gt;&lt;br /&gt;Выводы неутешительные. &lt;br /&gt;MS использует очень грубый метод растеризации. Они отказываются от субпиксельной точности и с помощью агрессивного хинтинга вбивают символы в жёсткие границы пикселей. В результате шрифты очень чёткие, но эта чёткость даётся ценой отказа от масштабируемости. В результате все приложения под MS хорошо выглядят лишь при одном DPI - 96. Если у нас монитор имеет больший DPI, например 300. То мы не сможем смасштабировать весь интерфейс под него и придётся ломать глаза на очень маленьких элементах интерфейса и шрифтах. &lt;br /&gt;&lt;br /&gt;Но так как большинство пользовательских приложений в мире написано под винды и не масштабируется, то у производителей железа просто нет мотивации выпускать high-DPI мониторы. А у нас нет шансов когда-либо иметь возможность читать текст на мониторе с качеством изображения сопоставимым печатному. &lt;br /&gt;&lt;br /&gt;У Apple дела обстоят получше. У них есть субпиксельная точность. Поэтому шрифты обладают масштабируются. Но они излишне размываются, что даёт некий дискомфорт. &lt;br /&gt;&lt;br /&gt;Под линуксом шрифты выглядят ужасно. Это не секрет. Во всём виноват опять же хинтинг. Причём проприетарный хинтинг основанный на TT байтовом интерпретаторе. &lt;br /&gt;Но библиотека freetype позволяет достичь качественного и корректного рендеринга шрифтов, даже без использования патентованных технологий. Как это сделать, описывается в статье. &lt;br /&gt;&lt;br /&gt;Хотелось бы всё же, что бы MS встали на путь истинный и начали бы поддерживать нормальную масштабируемость шрифтов и элементов GUI. Но в висте пока этого &lt;a href="http://www.istartedsomething.com/20061211/vista-dpi-scaling"&gt;нет&lt;/a&gt;&lt;br /&gt;Если пипл хавает помои, то зачем его кормить деликатесами? Стандартный подход монополиста.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-4819734426242785627?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/4819734426242785627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=4819734426242785627' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/4819734426242785627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/4819734426242785627'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2008/02/blog-post.html' title='Шрифты'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-1219893537106385619</id><published>2008-02-12T02:37:00.000-08:00</published><updated>2008-02-19T00:10:39.670-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='devel'/><category scheme='http://www.blogger.com/atom/ns#' term='motionx'/><title type='text'>MotionX приготовление к релизу.</title><content type='html'>Вообщем написание библиотеки MotionX на текущий момент закончено. Проект на sf.net зарегистрирован. В ближайшие выходные буду комментировать интерфейсы в формате doxygen и генерировать документацию. Настрою системы сборки, к текущей Scons добавлю CMake. Проведу серию тестов, что бы выявить стабильность системы, утечки памяти и прочие ошибки. И если всё будет благополучно, то выложу первый релиз на sf.net. &lt;br /&gt;&lt;br /&gt;Кстати, оказалось, что xmmintrin.h это не только MS-specific, оно есть и под GCC на x86 платформе. А значит и под линуксом библиотека сможет использовать SSE.&lt;br /&gt;&lt;br /&gt;Я вчера запустил анимацию 50 персонажей, с 50-ти костями на каждом. С SSE фпс было в районе 700, а без SSE - 30. &lt;br /&gt;То есть SSE даёт, в моём случае, более чем двадцати кратное увеличение производительности! Я сам такого не ожидал. &lt;br /&gt;Так что польза от этой технологии иногда может быть весьма ощутимой.&lt;br /&gt;Хотя отключить применение SSE всегда можно флагами компиляции.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-1219893537106385619?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/1219893537106385619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=1219893537106385619' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/1219893537106385619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/1219893537106385619'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2008/02/motionx_12.html' title='MotionX приготовление к релизу.'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-736287587220121404</id><published>2008-02-03T12:47:00.000-08:00</published><updated>2008-02-19T00:11:15.841-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='devel'/><category scheme='http://www.blogger.com/atom/ns#' term='motionx'/><title type='text'>рефакторинг в motionx</title><content type='html'>Продолжаю делать мощный рефакторинг в библиотеке MotionX. Сегоня сделал inplace загрузку анимаций. Получилось неплохо, особенно если сравнить со старым вариантом.&lt;br /&gt;&lt;br /&gt;Было:&lt;br /&gt;&lt;br /&gt;&lt;div class="cpp" style="font-family: monospace; color: #000000;"&gt;template&amp;lt;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; motionx::&lt;span style="color: #00eeff;"&gt;FrameSetCPtr&lt;/span&gt;&amp;nbsp; &amp;nbsp;Create&amp;lt;motionx::&lt;span style="color: #00eeff;"&gt;FrameSet&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; std::&lt;span style="color: #00eeff;"&gt;string&lt;/span&gt;&amp;amp; &lt;span style="color: #0000ff;"&gt;file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; motionx::&lt;span style="color: #00eeff;"&gt;FrameSetPtr&lt;/span&gt;&amp;nbsp; &amp;nbsp; anim&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;new&lt;/span&gt; motionx::&lt;span style="color: #00eeff;"&gt;FrameSet&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std::&lt;span style="color: #00eeff;"&gt;ifstream&lt;/span&gt;&amp;nbsp; &amp;nbsp;in;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; in.&lt;span style="color: #00eeff;"&gt;open&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;file&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;c_str&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;, std::&lt;span style="color: #00eeff;"&gt;ios_base&lt;/span&gt;::&lt;span style="color: #00eeff;"&gt;in&lt;/span&gt; | std::&lt;span style="color: #00eeff;"&gt;ios_base&lt;/span&gt;::&lt;span style="color: #00eeff;"&gt;binary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;io::&lt;span style="color: #00eeff;"&gt;get&lt;/span&gt;&amp;lt;int&amp;gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;in&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; != anim_file_magic_number&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw&amp;nbsp; &amp;nbsp;motionx::&lt;span style="color: #00eeff;"&gt;bad_resource&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;Wrong file type.&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;io::&lt;span style="color: #00eeff;"&gt;get&lt;/span&gt;&amp;lt;int&amp;gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;in&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt; != anim_file_version&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw&amp;nbsp; &amp;nbsp;motionx::&lt;span style="color: #00eeff;"&gt;bad_resource&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #666666;"&gt;&amp;quot;Wrong file version.&amp;quot;&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; frames_count = io::&lt;span style="color: #00eeff;"&gt;get&lt;/span&gt;&amp;lt;int&amp;gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;in&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; frame_size&amp;nbsp; &amp;nbsp;= io::&lt;span style="color: #00eeff;"&gt;get&lt;/span&gt;&amp;lt;int&amp;gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;in&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;; i &amp;lt; frames_count; ++i&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;float&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #0000dd;"&gt;time&lt;/span&gt; = io::&lt;span style="color: #00eeff;"&gt;get&lt;/span&gt;&amp;lt;float&amp;gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;in&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; motionx::&lt;span style="color: #00eeff;"&gt;Frame&lt;/span&gt;&amp;nbsp; frame;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; frame.&lt;span style="color: #00eeff;"&gt;resize&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;frame_size&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; frame.&lt;span style="color: #00eeff;"&gt;Pivot&lt;/span&gt; = io::&lt;span style="color: #00eeff;"&gt;get&lt;/span&gt;&amp;lt;mtl::&lt;span style="color: #00eeff;"&gt;rigid_tm&lt;/span&gt;&amp;gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;in&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std::&lt;span style="color: #00eeff;"&gt;generate&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;frame.&lt;span style="color: #00eeff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;, frame.&lt;span style="color: #00eeff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;, boost::&lt;span style="color: #00eeff;"&gt;bind&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;io::&lt;span style="color: #00eeff;"&gt;get&lt;/span&gt;&amp;lt;mtl::&lt;span style="color: #00eeff;"&gt;rigid_tm&lt;/span&gt;&amp;gt;, boost::&lt;span style="color: #00eeff;"&gt;ref&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;in&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; anim-&amp;gt;AddFrame&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;frame, &lt;span style="color: #0000dd;"&gt;time&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&amp;nbsp; anim;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;a href="http://syhi.stworks.ru/"  style="display: block; text-align: right; font-size: 9px;"&gt;Syhi-подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Стало:&lt;br /&gt;&lt;div class="cpp" style="font-family: monospace; color: #000000;"&gt;Animation*&amp;nbsp; LoadBinaryAnimation&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;MotionXLib* lib, &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* filename&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IFileSystem*&amp;nbsp; &amp;nbsp;fs = lib-&amp;gt;FileSystem&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AutoFileHandle f = &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;fs-&amp;gt;Open&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;filename, &lt;span style="color: #666666;"&gt;&amp;quot;r+b&amp;quot;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;, fs&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;!f&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; OnError&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;IOError&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;filename&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;size_t&lt;/span&gt;&amp;nbsp; fileSize = fs-&amp;gt;Size&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;f&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; magicNumber = &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; version&amp;nbsp; &amp;nbsp; &amp;nbsp;= &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fs-&amp;gt;Read&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;f, &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&amp;amp;magicNumber, &lt;span style="color: #0000dd;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fs-&amp;gt;Read&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;f, &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&amp;amp;version, &lt;span style="color: #0000dd;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;magicNumber != anim_file_magic_number || version != anim_file_version&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; OnError&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;BadResource&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;filename&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InplaceAnimation* animData = AllocateMemory&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;fileSize - &lt;span style="color: #0000dd;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fs-&amp;gt;Read&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;f, animData, fileSize - &lt;span style="color: #0000dd;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;new&lt;/span&gt; Animation&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;animData&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;a href="http://syhi.stworks.ru/"  style="display: block; text-align: right; font-size: 9px;"&gt;Syhi-подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В результате вместо N+1 аллокаций памяти на один файл анимации, получил всего лишь 2. &lt;br /&gt;Где N - количество кадров. Учитывая то, что анимации могут занимать весьма ощутимое количество памяти, это неплохой выигрышь. Причём тут куда важнее не скорость загрузки, хотя и она сильно возрасла, а то, что память меньше фрагментируется таким образом.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-736287587220121404?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/736287587220121404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=736287587220121404' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/736287587220121404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/736287587220121404'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2008/02/motionx.html' title='рефакторинг в motionx'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-1118825850481801231</id><published>2008-01-07T18:40:00.000-08:00</published><updated>2008-02-19T00:13:21.117-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xne'/><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>топологическая сортировка</title><content type='html'>Недавно передо мной встала интересная алгоритмическая проблема. &lt;br /&gt;Как я уже говорил, движок XNE основывается на микроядре. То есть есть ядро, обладающее минимальным функционалом и есть куча модулей, которые уже и реализуют основные функции движка. &lt;br /&gt;&lt;br /&gt;Модули находятся на разных уровнях абстракциях. Есть низкоуровневые, а есть высокоуровневые. Поэтому от одних модулей зависят другие, от которых, в свою очередь, зависят третьи. В результате получаем направленный граф. Который должен быть так же и ацикличным. &lt;br /&gt;&lt;br /&gt;Что бы правильно загружать и уничтожать модули надо соблюдать строгую последовательность этих операций. При инициализации текущего модуля должны быть проинициализированы все его зависимые модули. При разрушении тоже самое, но в обратной последовательности. &lt;br /&gt;&lt;br /&gt;Допустим есть следующие модули: filesystem, logging, render, audio, scene manager, game&lt;br /&gt;&lt;br /&gt;filesystem не зависит ни от какого модуля&lt;br /&gt;logging зависит от filesystem&lt;br /&gt;render -&gt; filesystem, logging&lt;br /&gt;audio -&gt; filesystem, logging&lt;br /&gt;scene manager -&gt; filesystem, logging, render, audio&lt;br /&gt;game -&gt; scene manager, filesystem, logging&lt;br /&gt;&lt;br /&gt;Тут мы имеем сложный граф зависимостей. Который не является деревом. Этот граф надо преобразовать в список, проходя по которому можно будет последовательно запустить или остановить модули. &lt;br /&gt;Например вот такой: filesystem -&gt; logging -&gt; audio -&gt; render -&gt; scene manager -&gt; game&lt;br /&gt;Хотя различных списков может быть много. &lt;br /&gt;Также надо как-то проверять наличие циклов в графе зависимостей, иначе построить такой список будет невозможно. &lt;br /&gt;&lt;br /&gt;Вообщем, я уже почти сам построил нужный алгоритм, как нашёл у себя в сундуке древний манускрипт, называется он "C++ Boost Graph Library", открыв его я узнал, что моя проблема является довольно тривиальной и очень общей. Мне просто надо пройти граф зависимостей по алгоритму depth first search, а построение списков зависимостей является, так называемой, топологической сортировкой. Ну в принципе я тоже самое и придумал, только не знал как называть. &lt;br /&gt;&lt;br /&gt;К счастью, в BGL это всё уже реализовано, так что не надо придумывать велосипеды. &lt;br /&gt;Вот небольшой пример кода использования топологической сортировки. При наличии циклов, алгоритм выкинет исключение, которое можно перехватить самому и поругаться. &lt;br /&gt;&lt;br /&gt;&lt;div class="cpp" style="font-family: monospace; color: #000000;"&gt;&lt;span style="color: #339900;"&gt;#include&amp;nbsp; &amp;nbsp; &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #339900;"&gt;#include&amp;nbsp; &amp;nbsp; &amp;lt;utility&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #339900;"&gt;#include&amp;nbsp; &amp;nbsp; &amp;lt;algorithm&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #339900;"&gt;#include&amp;nbsp; &amp;nbsp; &amp;lt;list&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #339900;"&gt;#include&amp;nbsp; &amp;nbsp; &amp;lt;vector&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #339900;"&gt;#include&amp;nbsp; &amp;nbsp; &amp;lt;boost/graph/vector_as_graph.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #339900;"&gt;#include&amp;nbsp; &amp;nbsp; &amp;lt;boost/graph/topological_sort.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&amp;nbsp; &amp;nbsp;boost;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;* modules&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt; = &lt;span style="color: #000000;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #666666;"&gt;&amp;quot;render&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #666666;"&gt;&amp;quot;filesystem&amp;quot;&lt;/span&gt;,&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #666666;"&gt;&amp;quot;scene manager&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #666666;"&gt;&amp;quot;game&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #666666;"&gt;&amp;quot;audio&amp;quot;&lt;/span&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #666666;"&gt;&amp;quot;physics&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; nModules = &lt;span style="color: #0000dd;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;modules&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;/&lt;span style="color: #0000dd;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;*&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; std::&lt;span style="color: #00eeff;"&gt;vector&lt;/span&gt;&amp;lt;std::&lt;span style="color: #00eeff;"&gt;list&lt;/span&gt;&amp;lt;int&amp;gt; &amp;gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;nModules&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// render -&amp;gt; filesystem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// scene manager -&amp;gt; render&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// scene manager -&amp;gt; filesystem&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// scene manager -&amp;gt; audio&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// scene manager -&amp;gt; physics&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// game -&amp;gt; scene manager&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// game -&amp;gt; filesystem&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// game -&amp;gt; render&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// audio -&amp;gt; filesystem&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; modulesGraph&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #00eeff;"&gt;push_back&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000dd;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; &lt;span style="color: #ff0000;"&gt;// physics -&amp;gt; filesystem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; std::&lt;span style="color: #00eeff;"&gt;vector&lt;/span&gt;&amp;lt;int&amp;gt;&amp;nbsp; &amp;nbsp; modulesOrder;&lt;br /&gt;&amp;nbsp; &amp;nbsp; topological_sort&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;modulesGraph, std::&lt;span style="color: #00eeff;"&gt;back_inserter&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;modulesOrder&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;, vertex_index_map&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;identity_property_map&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;std::&lt;span style="color: #00eeff;"&gt;vector&lt;/span&gt;&amp;lt;int&amp;gt;::&lt;span style="color: #00eeff;"&gt;iterator&lt;/span&gt; it = modulesOrder.&lt;span style="color: #00eeff;"&gt;begin&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; it != modulesOrder.&lt;span style="color: #00eeff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;; ++it&lt;span style="color: #000000;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std::&lt;span style="color: #0000dd;"&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; modules&lt;span style="color: #000000;"&gt;&amp;#91;&lt;/span&gt;*it&lt;span style="color: #000000;"&gt;&amp;#93;&lt;/span&gt; &amp;lt;&amp;lt; std::&lt;span style="color: #00eeff;"&gt;endl&lt;/span&gt;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;EXIT_SUCCESS&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&amp;#125;&lt;/span&gt;&lt;a href="http://syhi.stworks.ru/"  style="display: block; text-align: right; font-size: 9px;"&gt;Syhi-подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;на выходе получим следующее:&lt;br /&gt;filesystem&lt;br /&gt;render&lt;br /&gt;audio&lt;br /&gt;physics&lt;br /&gt;scene manager&lt;br /&gt;game&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-1118825850481801231?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/1118825850481801231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=1118825850481801231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/1118825850481801231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/1118825850481801231'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2008/01/blog-post.html' title='топологическая сортировка'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-3167440859957924114</id><published>2008-01-07T14:58:00.000-08:00</published><updated>2008-02-19T00:21:40.530-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xne'/><title type='text'>XNE</title><content type='html'>Некоторое время назад решил собрать воедино все свои наработки и организовать их в виде рабочего игрового движка. &lt;br /&gt;&lt;br /&gt;Нужно это мне для закрепления всех своих программистских навыков, полученных за предыдущие годы. То есть это разработка ради фана и самореализации. Хотя получение конечного продукта тоже является первоочередной целью. &lt;br /&gt;&lt;br /&gt;Проект будет кроссплатформенным, но без фанатизма. Пока ориентация только на POSIX и Windows. Графический API - OpenGL. Мультиапи не планируется.&lt;br /&gt;&lt;br /&gt;Сейчас мне интересно, в первую очередь, разработка правильной фундаментальной архитектуры. Что такое правильная архитектура? Для меня такая архитектура должна быть простой и расширяемой. Что бы работа с системой не вызывала головной боли. &lt;br /&gt;В качестве основы я взял паттерн &lt;a href="http://www.vico.org/pages/PatronsDisseny/Pattern%20MicroKernel/index.html"&gt;microkernel&lt;/a&gt;. &lt;br /&gt;Конечно там будут и layers, и subsystems, и pipes и много чего другого. Вообще хочу поэкспериментировать с паттернами. Но это уже будет в деталях. Сейчас пока сконцентрируюсь на построении модульной архитектуры с микроядром. &lt;br /&gt;&lt;br /&gt;Так же вплотную займусь организацией проекта. Документация, системы сборки, вспомогательные утилиты, code standart и т.д. Это у меня слабое место. Из-за отсутствии чёткой организации всё никак не могу выпустить свою анимационную библиотеку.  Надо практиковаться в этом.&lt;br /&gt;&lt;br /&gt;В будущем хотелось бы собрать небольшую команду программистов для совместной работы. Но это месяца через два три. Пока надо самому сделать что-нибудь осязаемое. &lt;br /&gt;&lt;br /&gt;Проект будет c открытыми исходниками, лицензия, скорее всего, BSD или другая либеральная. А может быть и GPL. Я пока не определился окончательно. &lt;br /&gt;&lt;br /&gt;Называется он XNE, расшифровывается как "XNE is Not Engine". Люблю акронимы :)&lt;br /&gt;&lt;br /&gt;Ход разработки буду описывать тут, хотя может быть и заведу специальный блог.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-3167440859957924114?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/3167440859957924114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=3167440859957924114' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/3167440859957924114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/3167440859957924114'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2008/01/xne.html' title='XNE'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-7550646489328423843</id><published>2007-12-12T14:44:00.000-08:00</published><updated>2007-12-12T15:03:43.421-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iconv'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='string'/><category scheme='http://www.blogger.com/atom/ns#' term='decoding'/><title type='text'>раскодировка</title><content type='html'>Допустим вам пришло сообщение "äîïóñòèì âàì ïğèøëî ñîîáùåíèå". И ваш зоркий глаз в нём сразу же увидел кодировку cp1251 набранную символами западноевропейской кодировки iso8859-9&lt;br /&gt;Казалось бы дело за малым. Первое, что хочется сделать это скопировать текст сообщения в файл(жалко нет устройства /dev/clipboard) и выполнить над ним операцию iconv -f iso8859-9 -t cp1251. &lt;br /&gt;Но почему-то iconv вежливо ругнётся, указав на ошибки в последовательности. Ну конечно же. Ведь тех символов, которые мы видим в сообщении, нет и в помине в кодировке cp1251. &lt;br /&gt;Важно понять, iconv не делает текстовой конвертации, как это получается в редакторах или браузере при смене кодировки. Он делает бинарную конвертацию, оставляя сами симвы, меня лишь их двоичное представление. &lt;br /&gt;&lt;br /&gt;В данном случае нам нужна двухступенчатая конвертация. Зашифрованное сообщение мы видим в системной кодировке(у меня это utf8). Из неё нужно получить двоичное представление в однобайтовой кодировке. Поэтому делаем iconv -f utf8 -t iso8859-9.  Выход этой комнады и является исходным сообщением, но уже в кодировке cp1251. Которую мы преобразуем в системную, что бы увидеть текст. &lt;br /&gt;Вся операция расшифровки будет выглядеть следующим образом:&lt;br /&gt;&lt;br /&gt;echo äîïóñòèì âàì ïğèøëî ñîîáùåíèå | iconv -t iso8859-9 | iconv -f cp1251&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-7550646489328423843?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/7550646489328423843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=7550646489328423843' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/7550646489328423843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/7550646489328423843'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/12/blog-post.html' title='раскодировка'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-5507817156549052888</id><published>2007-12-06T08:45:00.000-08:00</published><updated>2008-01-10T03:24:24.625-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='hint'/><title type='text'>password generator</title><content type='html'>генерируем пароли подручными средствами в линуксе&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;tr -cd [:alnum:] &lt; /dev/urandom | head -c16&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;на выходе получаем строки такого типа&lt;br /&gt;LngOnPEW3zJbUCFD&lt;br /&gt;Mtx5PGf923omiaUD&lt;br /&gt;mq40bfdIdY23LihM&lt;br /&gt;&lt;br /&gt;количество символов пароля определяется параметром в head&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5507817156549052888?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5507817156549052888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5507817156549052888' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5507817156549052888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5507817156549052888'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/12/hint.html' title='password generator'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-5044277164309657679</id><published>2007-11-21T16:03:00.000-08:00</published><updated>2007-11-21T16:08:06.622-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>vim</title><content type='html'>В последнее время пытаюсь освоить Vim. Редактор очень мощный и интересный. Прочитал кучу доков и мануалов и с нетерпением хочу начать его использовать... Но, к сожалению, наткнулся на одну проблему, которую решить не могу и которая нигде не описывается. &lt;br /&gt;Мне не понятно, как в этом редакторе поменять текущий путь. !cd &lt;new_path&gt; -- не помогает. shell/cd &lt;new_path&gt; также не помогает. После выхода из командного режима путь остаётся прежним. &lt;br /&gt;Обидно. Проблема настолько тривиальная, видимо, что никто не стал её описывать. А с этим ни программу сбилдить, ни теги построить, да и вообще работать нельзя. &lt;br /&gt;&lt;br /&gt;Приходится пока оставаться в KDevelop&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5044277164309657679?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5044277164309657679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5044277164309657679' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5044277164309657679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5044277164309657679'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/11/vim.html' title='vim'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-5058298908731647328</id><published>2007-11-16T06:47:00.000-08:00</published><updated>2007-11-16T06:49:57.972-08:00</updated><title type='text'>Деликатес</title><content type='html'>Создал себе аккаунт на деликатесе - &lt;a href="http://del.icio.us/cyberzx"&gt;http://del.icio.us/cyberzx&lt;/a&gt;&lt;br /&gt;Буду туда добавлять ссылки IT тематики. Удобная штука, как оказалось.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5058298908731647328?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5058298908731647328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5058298908731647328' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5058298908731647328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5058298908731647328'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/11/blog-post_16.html' title='Деликатес'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-3628297194228960456</id><published>2007-11-05T05:20:00.000-08:00</published><updated>2007-11-05T05:21:41.191-08:00</updated><title type='text'>О кошерном</title><content type='html'>* Messages for package sys-libs/glibc-2.6.1:&lt;br /&gt;&lt;br /&gt; * You still haven't deleted //etc/locales.build.&lt;br /&gt; * Do so now after making sure //etc/locale.gen is &lt;b&gt;kosher.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Хаха. Юмор оценил :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-3628297194228960456?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/3628297194228960456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=3628297194228960456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/3628297194228960456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/3628297194228960456'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/11/blog-post_05.html' title='О кошерном'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-4880620168619078711</id><published>2007-11-03T10:08:00.000-07:00</published><updated>2007-11-03T10:19:07.657-07:00</updated><title type='text'>былое</title><content type='html'>Вот разгребал я тут старые программы свои. Эдак готов 2002-2005го. На некоторый код смотрю и думаю: "OMG!!! Что за ламер писал такой ужасный код!?".  На другие же программки наоборот вызывают мысль: "ну ничего себе, неужели это я такое сделал? круто!".&lt;br /&gt;Ну это уже ближе к нашему времени.&lt;br /&gt;&lt;br /&gt;Вообще полезно. Смотришь как ты рос в профессиональном плане, как менялись твои навыки, философия программирования и, даже, мировоззрение. Это очень полезно.&lt;br /&gt;&lt;br /&gt;Но заметил одну странную вещь. Раньше была куча идей, но не хватало умения для их реализовывания. Сейчас умений выше крыши, но вот с идеями туговато... Надо как-то выходить из этой стагнации.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-4880620168619078711?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/4880620168619078711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=4880620168619078711' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/4880620168619078711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/4880620168619078711'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/11/blog-post_03.html' title='былое'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-3258818929766178611</id><published>2007-11-02T23:20:00.000-07:00</published><updated>2007-11-05T02:19:20.023-08:00</updated><title type='text'>Реализация</title><content type='html'>Вот написал реализации калькуляторов к прошлому посту.&lt;br /&gt;на &lt;a href="http://pastebin.com/f6b8d61cf"&gt;Хаскелле&lt;/a&gt; и на &lt;a href="http://pastebin.com/f6b845f03"&gt;С&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Сейчас ещё напишу его на питоне. Ну а потом, если будет настроение, сделаю это на С++ без буста. Хотя это мне не особо интересно, так как С++ мой родной язык.&lt;br /&gt;&lt;br /&gt;upd:&lt;br /&gt;&lt;a href="http://pastebin.com/f2e155cae"&gt;http://pastebin.com/f2e155cae&lt;/a&gt; - программа на петоне.&lt;br /&gt;&lt;a href="http://pastebin.com/f356d13b0"&gt;http://pastebin.com/f356d13b0&lt;/a&gt; - реализация на хаскелле от VoidEx. с использованием монад.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-3258818929766178611?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/3258818929766178611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=3258818929766178611' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/3258818929766178611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/3258818929766178611'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/11/blog-post_02.html' title='Реализация'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-6011969354661957696</id><published>2007-11-02T11:50:00.000-07:00</published><updated>2007-11-02T11:52:59.330-07:00</updated><title type='text'>Об ассоциативностях</title><content type='html'>&lt;p style="margin-bottom: 0in;"&gt;Вообщем, почитал я немного &lt;a href="http://en.wikipedia.org/wiki/Compilers:_Principles%2C_Techniques%2C_and_Tools"&gt;Книгу Дракона&lt;/a&gt;. Думал, что это нечто страшное типа "Искусства Программирования" Кнута. Оказалось, что совсем не так, книга написа довольно внятным языком и легка для восприятия, жалею что раньше не прочитал её.&lt;br /&gt;&lt;br /&gt;Я понял, почему мне так не удалось сходу написать калькулятор. Проблема, как я и думал, лежала в математической области. О ней и хочу поговорить. Но обо всём по порядку. Начну я с ассоциативности.&lt;br /&gt;&lt;br /&gt;И так, что такое &lt;i&gt;&lt;b&gt;ассоциативность&lt;/b&gt;&lt;/i&gt; и зачем она нам нужна?&lt;br /&gt;&lt;br /&gt;Пусть есть некоторая бинарная операция &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;@&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Значит некоторой сущности &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; мы можем поставить в соответсвие y &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;@ z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;x = y @ z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Но &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; и &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; сами могут быть результатами выполнения операции &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;@&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;. &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;y = a @ b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;x = (a @ b) @ z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Times New Roman, serif;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;или&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;z = b @ c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;x = y @ (b @ c)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Times New Roman, serif;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Ну и дальше по индукции, рекурсивно расширяя до какого угодно количества членов в выражении. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Назовём операцию &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;@&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; лево-ассоциативной, если запись &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;a @ b @ c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; эквивалентна выражению &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;(a @ b) @ c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. Если же &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;a @ b @ c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; эквивалентно выражению &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;a @ (b @ c)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, то операция &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;@&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; является право-ассоциативной.&lt;br /&gt;&lt;br /&gt;Можно запомнить, что если оператор стоит слева от терминального операнда(того,  который нельзя разбить на под-выражения), то операция — лево-ассоциативная, иначе она право-ассоциативная. То есть, с какой стороны операция прилепливается к терминальному операнду, такая и ассоциативность у неё.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Пример.&lt;/i&gt;&lt;br /&gt;Во многих языках программирования операция присваивания является право-ассоциативной. То есть &lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;a = b = c =&gt; a = (b = c)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt;. &lt;/b&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Это вполне резонно, так как вычесление операндов идёт справа и в конечном итоге доходит до самого левого. &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;Но арифметические операции являются лево-ассоциативными. &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;a - b - c =&gt; (a - b) - c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;. &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Тут вычесление идет начиная с самого левого операнда.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Перейдёт к собственно проблеме. &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Вот как выглядят грамматики для выражений с операторами с разной ассоциативностью.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;expr -&gt; term op expr&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt; &lt;/b&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; —  право-ассоциативная операция&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;expr -&gt; expr op term&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt; &lt;/b&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; —  лево-ассоциативная операция &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Тут term это операнд, который в контексте данной операции не разбивается на составные части, хотя он может разбиваться на них для операции с более высоким приоритетом.&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Вот тут-то уже можно увидеть проблему. Заметим, что грамматика для лево-ассоциативной операции образует, так называемую, &lt;a href="http://en.wikipedia.org/wiki/Left_recursion"&gt;левую рекурсию&lt;/a&gt;. Но я хотел реализовть парсинг выражений за один проход слева направо. То есть &lt;a href="http://en.wikipedia.org/wiki/Recursive_descent_parser"&gt;&lt;span style=""&gt;predictive parser.&lt;/span&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style=""&gt;Одной из особенностей таких парсеров является то, что они не поддерживают грамматики с левой рекурсией. Но зато их очень просто реализовать, особенно на функциональных языках. &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style=""&gt;Так что делать? Неужели для такой простой задачки, как разбор арифмитических выражений придётся писать сложный bottom-up парсер с бэктрейсингом? Ну уж нет. Я так просто не сдамся!&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style=""&gt;Тут нам на помощь приходит математика. Оказывается есть простой способ избавления от левой рекурсии путём добавления новых нетреминальных символов в грамматику. &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style=""&gt;Если есть грамматика вида &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;A -&gt; Aa | Ab | c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;то мы можем трансформировать её в грамматику с правой рекурсией&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;A -&gt; cR&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;R -&gt; aR | bR | eps&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; Вот пример:  &lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;expr -&gt; expr + term |&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;    expr - term |&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;    term&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; заменяется на&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;expr -&gt;   term rest&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;rest -&gt;  +term rest |&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;     -term rest |&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;      eps&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; А эта грамматика очень легко парсится на predictive parser.&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; Ну и приведу полную грамматика для арифметических выражений.  &lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;expr   -&gt;  term rest_e&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;rest_e -&gt; (+ | -) term rest_e | eps&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;term   -&gt;  factor rest_t&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt; &lt;span style="font-family:Courier New, monospace;"&gt;rest_t -&gt; (* | / | ^) factor rest_t | eps&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;factor -&gt; -factor | +factor | (expr) | function | number&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;function -&gt; unary_func_name (expr) |&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Courier New, monospace;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;    binary_func_name(expr, expr)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Times New Roman, serif;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Очень маленькая, простенькая и без левых рекурсий!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-6011969354661957696?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/6011969354661957696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=6011969354661957696' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/6011969354661957696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/6011969354661957696'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/11/blog-post.html' title='Об ассоциативностях'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-5773963573827664578</id><published>2007-10-26T22:59:00.001-07:00</published><updated>2007-10-27T10:10:49.941-07:00</updated><title type='text'>Калькулятор на Хаскеле</title><content type='html'>Решил в рамках укрепления навыков работы с Хаскеллем написать простенький калькулятор.&lt;br /&gt;При этом без предаврительного лексического разбора и перевода в обратную польскую нотацию. Задача получилось интересной.&lt;br /&gt;Но так я до конца её не решил, так как при таком подходе не получается сделать функции сложения и вычитания левоассоциативными. То есть выражение 1 - 3 +2 у меня считается как 1 - (3+2).&lt;br /&gt;Что-то я туплю, знаю что решение есть у этой задачи. Но найти его не могу.&lt;br /&gt;&lt;br /&gt;А пока попробую сделать каклькулятор с предаврительным лексическим разбором и последующей синтаксической обработкой. Думаю, это поможет немного освоить систему типов в Haskell.&lt;br /&gt;&lt;br /&gt;Вот код с грамматикой:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;module&lt;/span&gt;&lt;span style="color: #000000;"&gt; Calculator &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;where&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- epxression grammar &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;--                        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- expression  ::= &amp;lt;addsub_expr&amp;gt; | &amp;lt;muldiv_expr&amp;gt; | &amp;lt;term&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- addsub_expr ::= &amp;lt;term2&amp;gt; + &amp;lt;expression&amp;gt; | &amp;lt;term2&amp;gt; - &amp;lt;expression&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- muldiv_expr ::= &amp;lt;term&amp;gt; * &amp;lt;term2&amp;gt; | &amp;lt;term&amp;gt; / &amp;lt;term2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- term2       ::= &amp;lt;muldiv_expr&amp;gt; | &amp;lt;term&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- term        ::= -&amp;lt;term&amp;gt;  | (&amp;lt;expression&amp;gt;) | unary_func | binary_func | &amp;lt;number&amp;gt; | const&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- unary_func  ::= (ln | exp | sin | cos | ...) (&amp;lt;expression&amp;gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- binary_func ::= (pow| add | sub | mul | div | ...) (&amp;lt;expression&amp;gt;, &amp;lt;expression&amp;gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- const       :: = pi | e | ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;type&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser = &lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; (&lt;/span&gt;&lt;span style="color: #800000;"&gt;Float&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;Bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- external functions tables&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;unary_functions = [(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"ln"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000080;"&gt;log&lt;/span&gt;&lt;span style="color: #000000;"&gt;), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"exp"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000080;"&gt;exp&lt;/span&gt;&lt;span style="color: #000000;"&gt;), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"sin"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000080;"&gt;sin&lt;/span&gt;&lt;span style="color: #000000;"&gt;), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"cos"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000080;"&gt;cos&lt;/span&gt;&lt;span style="color: #000000;"&gt;), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"inc"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (+) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;binary_functions= [(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"pow"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (**)), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"add"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (+)), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"sub"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,(-)), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"mul"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, (*)), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"div"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,(/))]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;constants      = [(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"pi"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000080;"&gt;pi&lt;/span&gt;&lt;span style="color: #000000;"&gt;), (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"e"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000080;"&gt;exp&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- syntax parsers&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;expr            ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;parentheses     ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;number          ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;muldiv_expr     ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;addsub_expr     ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;minus_term      ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;term            ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;term2           ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;const_p         ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;unary_func      ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;binary_func     ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- entry function&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;calc ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;Float&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- useful functions&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;find_table_element ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; [(&lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt;, a)] -&amp;gt; a -&amp;gt; (a, &lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;Bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;failParse s = (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, s, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;False&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;isSucceed (val, s, res) = res&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;getVal (val, s, res) = val&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;getEndStr (val, s, res) = s&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000080;"&gt;check_str ::&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; (&lt;/span&gt;&lt;span style="color: #800000;"&gt;Bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;String&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;check_str [] s2 = (&lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;, s2)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;check_str s1 [] = (&lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;False&lt;/span&gt;&lt;span style="color: #000000;"&gt;, [])&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;check_str s1 s2 = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt;(s1) == &lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt;(s2) ) &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; check_str (&lt;/span&gt;&lt;span style="color: #000080;"&gt;tail&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1) (&lt;/span&gt;&lt;span style="color: #000080;"&gt;tail&lt;/span&gt;&lt;span style="color: #000000;"&gt; s2)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;False&lt;/span&gt;&lt;span style="color: #000000;"&gt;, s2)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;-- parsers selection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;infixr&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt; &amp;gt;|&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;(&amp;gt;|) :: ExprParser -&amp;gt; ExprParser -&amp;gt; ExprParser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;(p1 &amp;gt;| p2) s = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; isSucceed (p1 s) &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; p1 s &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; p2 s&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;calc s = getVal (expr (&lt;/span&gt;&lt;span style="color: #000080;"&gt;filter&lt;/span&gt;&lt;span style="color: #000000;"&gt; (\x-&amp;gt; x /= &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;' '&lt;/span&gt;&lt;span style="color: #000000;"&gt;) s))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;expr s = (addsub_expr &amp;gt;| term2) s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;number s = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000080;"&gt;readsPrec&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; s &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                x:xs -&amp;gt; (&lt;/span&gt;&lt;span style="color: #000080;"&gt;fst&lt;/span&gt;&lt;span style="color: #000000;"&gt; x, &lt;/span&gt;&lt;span style="color: #000080;"&gt;snd&lt;/span&gt;&lt;span style="color: #000000;"&gt; x, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                [] -&amp;gt; failParse s&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;parentheses s@(x:xs) = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (x /= &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'('&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; failParse s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                       &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; expr xs &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        (_, fs, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;False&lt;/span&gt;&lt;span style="color: #000000;"&gt;) -&amp;gt; failParse fs&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        (val, xr:sr, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;) -&amp;gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (xr == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;')'&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; (val, sr, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000080;"&gt;error&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"parse error: incorent parentheses"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        (_, [], _) -&amp;gt; &lt;/span&gt;&lt;span style="color: #000080;"&gt;error&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"parse error: expression parsing failed"&lt;/span&gt;&lt;span style="color: #000000;"&gt;                                                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;minus_term s@(x:xs) = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (x == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'-'&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; isSucceed (term xs) &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                            ((-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)*getVal(term xs), getEndStr(term xs), &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000080;"&gt;error&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"parse error: expression parsing failed "&lt;/span&gt;&lt;span style="color: #000000;"&gt; ++ getEndStr(term xs))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; failParse s                           &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                                               &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;term [] = failParse []&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;term s  = (minus_term &amp;gt;| parentheses &amp;gt;| unary_func &amp;gt;| binary_func &amp;gt;| number &amp;gt;| const_p) s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;          &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;term2 s = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; isSucceed (muldiv_expr s) &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; muldiv_expr s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; term s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;muldiv_expr s = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;let&lt;/span&gt;&lt;span style="color: #000000;"&gt; (v1, s1, r1) = term s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                    (v2, s2, r2) = term2 (&lt;/span&gt;&lt;span style="color: #000080;"&gt;drop&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; r1 &amp;amp;&amp;amp; r2 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1 &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'*'&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; (v1*v2, s2, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'/'&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; (v1/v2, s2, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                &lt;/span&gt;&lt;span style="color: #000080;"&gt;otherwise&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; failParse s1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; r1 &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; failParse s2 &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; failParse s1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------               &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;addsub_expr s = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;let&lt;/span&gt;&lt;span style="color: #000000;"&gt; (v1, s1, r1) = term2 s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                    (v2, s2, r2) = expr (&lt;/span&gt;&lt;span style="color: #000080;"&gt;drop&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; r1 &amp;amp;&amp;amp; r2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1 &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'+'&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; (v1 + v2, s2, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'-'&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; (v1 - v2, s2, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                &lt;/span&gt;&lt;span style="color: #000080;"&gt;otherwise&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; failParse s1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; r1 &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; failParse s2 &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; failParse s1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;find_table_element s table df = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;let&lt;/span&gt;&lt;span style="color: #000000;"&gt; sl = &lt;/span&gt;&lt;span style="color: #000080;"&gt;map&lt;/span&gt;&lt;span style="color: #000000;"&gt; (\x -&amp;gt; (x, check_str (&lt;/span&gt;&lt;span style="color: #000080;"&gt;fst&lt;/span&gt;&lt;span style="color: #000000;"&gt; x) s)) table&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                    found = &lt;/span&gt;&lt;span style="color: #000080;"&gt;filter&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000080;"&gt;fst&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000080;"&gt;snd&lt;/span&gt;&lt;span style="color: #000000;"&gt;) sl&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; found &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;of&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                        [] -&amp;gt; (df, [], &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;False&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                        &lt;/span&gt;&lt;span style="color: #000080;"&gt;otherwise&lt;/span&gt;&lt;span style="color: #000000;"&gt; -&amp;gt; ((&lt;/span&gt;&lt;span style="color: #000080;"&gt;snd&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000080;"&gt;fst&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt;) found, (&lt;/span&gt;&lt;span style="color: #000080;"&gt;snd&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000080;"&gt;snd&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt;) found, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;const_p s = find_table_element s constants &lt;/span&gt;&lt;span style="color: #800080;"&gt;0.0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;get_unary_func s = find_table_element s unary_functions (\_-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;get_binary_func s = find_table_element s binary_functions (\_ _-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                                                                        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;------------------------------------------------------------                                                   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;unary_func s = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;let&lt;/span&gt;&lt;span style="color: #000000;"&gt; (f, s1, r) = get_unary_func s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                   (var, s2, r2) = expr (&lt;/span&gt;&lt;span style="color: #000080;"&gt;drop&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; r &amp;amp;&amp;amp; r2 &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1 == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'('&lt;/span&gt;&lt;span style="color: #000000;"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt; s2 == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;')'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; (f(var), &lt;/span&gt;&lt;span style="color: #000080;"&gt;drop&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; s2, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; failParse s1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;binary_func s = &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;let&lt;/span&gt;&lt;span style="color: #000000;"&gt; (f, s1, r) = get_binary_func s&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                    (var1, s2, r2) = expr (&lt;/span&gt;&lt;span style="color: #000080;"&gt;drop&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                    (var2, s3, r3) = expr (&lt;/span&gt;&lt;span style="color: #000080;"&gt;drop&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; s2) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; r &amp;amp;&amp;amp; r2 &amp;amp;&amp;amp; r3 &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt; s1 == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;'('&lt;/span&gt;&lt;span style="color: #000000;"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt; s2 == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;','&lt;/span&gt;&lt;span style="color: #000000;"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style="color: #000080;"&gt;head&lt;/span&gt;&lt;span style="color: #000000;"&gt; s3 == &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;')'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;then&lt;/span&gt;&lt;span style="color: #000000;"&gt; (f var1 var2, &lt;/span&gt;&lt;span style="color: #000080;"&gt;drop&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; s3, &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;True&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                        &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; failParse s1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;                                &lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5773963573827664578?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5773963573827664578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5773963573827664578' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5773963573827664578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5773963573827664578'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/10/calculator-on-haskell.html' title='Калькулятор на Хаскеле'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-5338039865646596177</id><published>2007-10-19T04:21:00.000-07:00</published><updated>2007-10-19T04:26:08.903-07:00</updated><title type='text'>Intel STM</title><content type='html'>Интересная новость. Интел разрабатывает С++ компилятор, который поддерживает технологию Software Transaction Memory(STM). Эта технология используется для синхронизации доступа к общей памяти конкурирующих задач без использования блокировок.&lt;br /&gt;Что должно увеличить общую производительность параллельных программ и упростить их разработку.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://softwarecommunity.intel.com/articles/eng/1460.htm"&gt;Intel® C++ STM Compiler, Prototype Edition&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5338039865646596177?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5338039865646596177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5338039865646596177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5338039865646596177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5338039865646596177'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/10/intel-stm.html' title='Intel STM'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-8868408771000643261</id><published>2007-10-10T05:28:00.000-07:00</published><updated>2007-10-11T05:18:22.413-07:00</updated><title type='text'>linux shed</title><content type='html'>&lt;a href="http://mydebianblog.blogspot.com/2007/08/complete-preemption.html"&gt;Тут&lt;/a&gt; интересная статья с обзором патча реального времени для ядра Linux.&lt;br /&gt;&lt;br /&gt;Хороший &lt;a href="http://www-128.ibm.com/developerworks/linux/library/l-scheduler/"&gt;обзор&lt;/a&gt; устройства стандартного планировщика процессов в Linux.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ccrma.stanford.edu/planetccrma/man/man2/sched_setscheduler.2.html"&gt;Man страничка&lt;/a&gt; с описанием некоторых политик планирования задач в POSIX-системах. FIFO и RR политики, насколько я понимаю, являются стандартными, но мне кажется реально они редко используются. Надо бы провести на эту тему research.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kerneltrap.org/node/8059"&gt;Вот&lt;/a&gt; ещё описание CFS планировщика, который вроде бы гарантирует более равномерное распределение процессорного времени между тасками. Таски собираются не в очереди, а в красно-чёрные деревья. Короче, тема интересная, надо бы поизучать.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://linux.slashdot.org/comments.pl?sid=297945&amp;amp;cid=20605013"&gt;Debating the Linux Process Scheduler&lt;/a&gt; - тоже может быть интересно.&lt;br /&gt;&lt;br /&gt;Ну и до кучи &lt;a href="http://lwn.net/Articles/250967/"&gt;What every programmer should know about memory&lt;/a&gt; via  &lt;a href="http://sim0nsays.livejournal.com/25142.html"&gt;Семён&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Кстати, интересно бы было посмотреть на алгоритм планирования задач в под windows. Но в гугле я что-то так ничего по этой теме не нашёл.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-8868408771000643261?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/8868408771000643261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=8868408771000643261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/8868408771000643261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/8868408771000643261'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/10/linux-boost.html' title='linux shed'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-5175571799651637678</id><published>2007-10-08T09:02:00.000-07:00</published><updated>2007-10-08T09:06:04.581-07:00</updated><title type='text'>haskell monads</title><content type='html'>Вот &lt;a href="http://haskell.org/all_about_monads/html/analogy.html"&gt;тут&lt;/a&gt; довольно интересная аналогия касательно монад в хаскелле. Монады представляются в виде сборочной линии.&lt;br /&gt;Очень понятно описывается логика их работы и применения.&lt;br /&gt;&lt;br /&gt;Да и саму &lt;a href="http://haskell.org/all_about_monads/html/index.html"&gt;статью&lt;/a&gt; могу порекомендовать тем, кто хочет разобраться в монадах хаскелля и как заставить чисто функциональный язык прикинуться императивным.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-5175571799651637678?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/5175571799651637678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=5175571799651637678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5175571799651637678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/5175571799651637678'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/10/haskell-monads.html' title='haskell monads'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-4322031814654719049</id><published>2007-09-28T08:02:00.000-07:00</published><updated>2007-09-28T08:04:52.223-07:00</updated><title type='text'>gcc defines</title><content type='html'>Небольшой хинт. Для того, что бы посмотреть список всех внутрених дефайнов компилятора GCC, надо запустить следующую команду&lt;br /&gt;gcc -dM -E - &lt; /dev/null&lt;br /&gt;&lt;br /&gt;ну или gcc -dM -E empty.c если в вашей системе нет устройства /dev/null&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-4322031814654719049?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/4322031814654719049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=4322031814654719049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/4322031814654719049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/4322031814654719049'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/09/gcc-defines.html' title='gcc defines'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-8546059511200409510</id><published>2007-03-29T16:47:00.000-07:00</published><updated>2007-03-29T16:49:47.174-07:00</updated><title type='text'>баг с поиском в VS2003/2005</title><content type='html'>Если у кого-то сломался поиск в файлах в этих средах разработки. И на любой запрос студия выдаёт "No files were found to look in". То достаточно нажать ctrl + scroll lock, и поиск снова заработает.&lt;br /&gt;Странно, что этот весьма известный баг перекочевал из 2003-ей студии в 2005-ую.&lt;br /&gt;За столько лет могли бы и пофиксить.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-8546059511200409510?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/8546059511200409510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=8546059511200409510' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/8546059511200409510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/8546059511200409510'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/03/vs20032005.html' title='баг с поиском в VS2003/2005'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-116771660586232296</id><published>2007-01-01T21:43:00.000-08:00</published><updated>2007-01-01T21:43:25.903-08:00</updated><title type='text'>memory</title><content type='html'>Что-то меня CRT-шный аллокатор памяти совсем не устраивает по функциональности. _aligned_malloc/_alligned_free, которые мне так необходимы, не являются ANSI функциями. Стандартного способа узнать количества выделенного блока памяти не существует. &lt;br /&gt;Слабенько как-то... Написать что ли свой?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-116771660586232296?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/116771660586232296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=116771660586232296' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116771660586232296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116771660586232296'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2007/01/memory.html' title='memory'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-116552406893731796</id><published>2006-12-07T12:41:00.000-08:00</published><updated>2006-12-07T12:41:09.010-08:00</updated><title type='text'>ANSI C</title><content type='html'>попытался написать конвертор мешей на ANSI C. &lt;br /&gt;Такой извращёный язык! Я на нём совершенно не умею писать :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-116552406893731796?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/116552406893731796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=116552406893731796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116552406893731796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116552406893731796'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/12/ansi-c.html' title='ANSI C'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-116403426241070342</id><published>2006-11-20T06:51:00.000-08:00</published><updated>2006-11-20T06:51:03.656-08:00</updated><title type='text'>dsound note</title><content type='html'>Как менять громкость звука в DirectSound линейно, а не экспоненциально? Очень просто! &lt;br /&gt;&lt;br /&gt;void SetVolume(double vol)&lt;br /&gt;{&lt;br /&gt;   double dbVol = 20 * log10(clamp(vol, 1e-3f, 1.0f));&lt;br /&gt;   pSndBuffer-&gt;SetVolume(dbVol * 100);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Таким образом, меняя vol от 0 до 1, получаем линейное изменение громкости звука.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-116403426241070342?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/116403426241070342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=116403426241070342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116403426241070342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116403426241070342'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/11/dsound-note.html' title='dsound note'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-116310688014573687</id><published>2006-11-09T13:14:00.000-08:00</published><updated>2006-11-09T13:19:25.580-08:00</updated><title type='text'>functional style</title><content type='html'>Люблю функциональный стиль кода и рекурсию. Надоели мне for/while циклы. Ну их :)&lt;br /&gt;&lt;br /&gt;Короче, вот как у меня создаётся гео-сфера. Всего несколько строчек кода.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;P&gt;//--------------------------------------------------------------------------------------&lt;br /&gt;//--------------------------------------------------------------------------------------&lt;br /&gt;MeshCPtr&amp;nbsp;SmoothGeoSphere(GLuint iter, MeshCPtr in)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;if (!iter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;in;&lt;br /&gt;&amp;nbsp;return&amp;nbsp;SmoothGeoSpehre(--iter, SphereNormalize(Subdivide(in)));&lt;br /&gt;}&lt;/P&gt;&lt;P&gt;//--------------------------------------------------------------------------------------&lt;br /&gt;MeshCPtr&amp;nbsp;CreateGeoSphere(GLuint iterations)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;return&amp;nbsp;SmoothGeoSphere(iterations, CreateIcosahedron());&lt;br /&gt;}&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-116310688014573687?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/116310688014573687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=116310688014573687' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116310688014573687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116310688014573687'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/11/functional-style.html' title='functional style'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-116251522635904019</id><published>2006-11-02T16:53:00.000-08:00</published><updated>2006-11-02T16:53:46.403-08:00</updated><title type='text'>MotionX release</title><content type='html'>Вот и наступил момент, когда я вполне удовлетворен качеством библиотеки MotionX. Она опробывана, так сказать, в боевых условиях, то есть в коммерческом проекте. И все мелкие косяки и глюки, которые в ней были, я вроде устранил.&lt;br /&gt;Библиотека обладает достаточной функциональностью, но пока не все, что я задумал, реализовано. &lt;br /&gt;Но есть всё, что необходимо для внедрения в игру скелетной покадровой анимации, в том числе и экспортёр из 3dsmax. &lt;br /&gt;Но главное - положить начало публичной жизни библиотеки, дальше будет проще. Я думаю. &lt;br /&gt;Осталось написать небольшую демку c использыванием glut и sdl. &lt;br /&gt;И написать туториал по экспорту анимации. И документацию... &lt;br /&gt;Вот в этом вся проблема. Придется писать много текста на английском. А в этом я никогда не практиковался. Хотя читать могу абсолютно любые тексты. &lt;br /&gt;Ну ладно. Главное начать, что-то делать в этом направлении. Возможно излагать свои мысли на английском не так уж и сложно, как это кажеться. &lt;br /&gt;&lt;br /&gt;И еще надо определиться с выбором лицензии. Сначала подумывал об LGPL, но слишком уж сильные ограничения она накладывает. Не хочу никого ни в чём ограничивать. Надо что-нибудь либеральнее.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-116251522635904019?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/116251522635904019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=116251522635904019' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116251522635904019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116251522635904019'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/11/motionx-release.html' title='MotionX release'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-116231583222283846</id><published>2006-10-31T09:30:00.000-08:00</published><updated>2006-10-31T10:09:10.123-08:00</updated><title type='text'>floating point</title><content type='html'>Думаю написать статью по теме работы с floating point числами в графических и физических real-time приложениях.&lt;br /&gt;Из чего должна состоять статья? Вот набросал несколько пунктов.&lt;br /&gt;&lt;br /&gt;- Краткое описание формата чисел с плавающей точкой стандарта IEEE 754&lt;br /&gt;- Погрешности. какие бывают и как их расчитывать. &lt;br /&gt;- Расчёт погрешностей для базовых математических операций. Сложения, вычитания, умножения и деления. &lt;br /&gt;- Расчёт погрешностей для векторных операций. Сложение, вычитание векторов. Нормализация. Матричное перемножение(в том числе и умножение матрицы на вектор).&lt;br /&gt;- Стабильность по численным погрешностям некоторых алгоритмов. Пока в голову пришли алгоритмы интегрирования. Вот думаю, для каких алгоритмов еще надо провести research? &lt;br /&gt;&lt;br /&gt;Вот пока всё. &lt;br /&gt;Но гложет меня сомнения о нужности подобной статьи. Может быть таких уже десятки и я их пропустил? Не хотелось бы заниматься ненужной работой.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;upd:&lt;br /&gt;сюда буду добавлять линки на статьи, по данной тематике которые мне удалось найти.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.sun.com/source/806-3568/ncg_goldberg.html"&gt;What Every Computer Scientist Should Know About Floating-Point Arithmetic&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-116231583222283846?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/116231583222283846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=116231583222283846' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116231583222283846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116231583222283846'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/10/floating-point.html' title='floating point'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-116225539976545040</id><published>2006-10-30T16:43:00.000-08:00</published><updated>2006-10-30T16:43:19.876-08:00</updated><title type='text'>gDEBugger</title><content type='html'>Помоему это ужасная не справедливость. То что под проприетарный D3DX есть такие удобные и бесплатные утилиты для отладки как NVPerfHUD. А для свободного OpenGL мы имеем в наличии лишь корявенький и платный gDEBugger. Причем NV распространяет его со своим SDK, что значит не стоит надеятся на выход аналогичной NVPerfHUD утилиты для OGL. &lt;br /&gt;Это ли не саботаж разработчиков на OGL? Ну что стоит NV выпустить удобную и бесплатную утилиту для отладки OGL графики?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-116225539976545040?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/116225539976545040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=116225539976545040' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116225539976545040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/116225539976545040'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/10/gdebugger.html' title='gDEBugger'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-115671263222707518</id><published>2006-08-27T14:03:00.000-07:00</published><updated>2006-08-27T14:06:18.166-07:00</updated><title type='text'>MotionX</title><content type='html'>За две недели полностью, то есть абсолютно с нуля переписал свою систему анимации. Очень долго выбирал как называть библиотеку. Решил не оригинальничать и назвал ее MotionX :)&lt;br /&gt;&lt;br /&gt;Вот что есть из возможностей.&lt;br /&gt;- Возможность анимировать любые структуры жестких тел(Rigid Bodies). То есть связи могут быть не обязательно в виде скелета(то есть дерева), как это обычно делается. Например, можно анимировать сложные механизмы, моделировать физические взаимодействия тел(используя Havoc в 3дмаксе или другие физические движки). Ну и вообще. При использывании только кейфреймовой анимации, связи между объектами вообще не обязательны.&lt;br /&gt;&lt;br /&gt;- Перемещение персонажа в мировом пространстве может расчитываться на основе анимации, а не алгоритмически в движке. Это дает более плавное и реалистичное движение, при которой полностью отсутсвует эффект проскальзывания ног у персонажа. И значительно облегчает управление положением персонажа в пространстве.&lt;br /&gt;Так же при блендинге анимаций корректно смешивается и скорость перемещения.&lt;br /&gt;&lt;br /&gt;- Есть возможность анимировать разные части скелета персонажа в разных потоках. Например на ногах у нас стоит walk, а для верхней части туловища можно переключать различные анимации(attack, shoot, walk и т.д.). Ну и вообще дает большую гибкость в анимировании объектов.&lt;br /&gt;&lt;br /&gt;- Модульная архитектура библиотеки. Помимо покадрового контролёра, можно подлючать другие контроллёры управления положением объектов. Например всё возможные варианты инвресной кинематики. Правда я пока не реализовал ни одного IK контролёра, но добавить их можно очень просто.&lt;br /&gt;&lt;br /&gt;- Легкость в сериализации. Описание контроллёров, списки анимаций и связи между ними(время блендинга) находятся в xml файлах. Сами кейфреймовые анимации лежат в бинарном представлении. Есть экспортёр анимации из 3дмакса. Планирую написать экспорт из коллады. Таким образом можно будет охватить и Маю и XSI и другие пакеты моделирования.&lt;br /&gt;&lt;br /&gt;- Мультиплатформенность. Библиотека компилируется под vc7.1, vc8.0 и gcc3.4 другие компиляторы пока не тестировал. Привязка к ОС или графическому API отсутсвует. Библиотеку тестировал под линуксом всё работает как надо. Если надо будет сделать поддержку других платформ, то займусь и этим.&lt;br /&gt;&lt;br /&gt;- Перфоманс. В математике активно используется SSE, хотя есть возможность компиляции просто на FPU. Так же дизайн библиотеки спроектирован таким образом, что все тяжелые операции по интерполяции матриц и расчёту матриц анимаций выполняются в одном месте. В будущем планирую сделать поддержку многопоточности, что даст значительное приемущество при работе на многоядерных платформах.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Через пару недель планирую все это дело выложить на sourceforge. Лицензию пока не выбрал, но вряд ли это будет GPL. Выберу что-нибудь по-мягче.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-115671263222707518?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/115671263222707518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=115671263222707518' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/115671263222707518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/115671263222707518'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/08/motionx.html' title='MotionX'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-114974185929136518</id><published>2006-06-07T21:44:00.000-07:00</published><updated>2006-06-07T21:44:19.333-07:00</updated><title type='text'>Lua</title><content type='html'>Уф... похоже битва с Lua и luabind закончилась моей победой.&lt;br /&gt;Сначала я сбилдил lua.lib через msys, просто под mingw. Но в таком варианте там тольео билдинг dll, что вообщем-то мне не надо,  не хочу плодить дллки. Тогда сбилдил либу вроде под posix, получил заветный liblua.a, переименовал её в lua.lib и подключил к своему проекту.&lt;br /&gt;Вот зачто я испытываю нежные чувства к языку Си, являясь адептом С++, так за то, что можно сбилдить либу на одном компиляторе, а слинковать совсем на другом. Главное что бы формат объектников совпадал, к счатью и mingw и vc используют coff формат, во всём остальном ABI у них идентичный.&lt;br /&gt;Всё было бы замечательно, если бы не одно но. В отладочной конфигурации у меня проект собирался без проблем и луа работала как надо. Но стоило сбилдить его в релизе, как начинались непонятные глюки. Линкер ругался, что отсутсвуют функции из lua.lib, причем имена функций начинались без подчеркиваний, что не соответсвует cdecl конвенции. Я так не разобрался, что это значит, но по-моему, такие имена у функций в либах, которые указывают на dll. Потом к ним прибавляется префкис __imp_. Так вот, как бы я не менял конфигурации проекта, сколько бы не копался в его настройках, но в релизе из под студии линковаться он у меня отказывался. При этом у меня вместо экзешника появлялись .lib и .exp файлы. Откуда? Я так и не понял.&lt;br /&gt;Удивительнее всего оказалось то, что билдинг релиза используя boost.build работал без проблем. Чудеса да и только.&lt;br /&gt;Совсем отчаявшись, я подумал что придется руками собирать библиотеку Луа в студии. Но вместо этого скомпилировал её в ansi конфигурации. И в моём проекта она вполне корректно слинковалась! Видимо я напоролся на какой-то баг линкера, который присутсвует как в VC7.1, так и в VC8.0.&lt;br /&gt;&lt;br /&gt;С компиляцией lualib у меня проблем тоже вроде не было. Хоть это и С++ библиотека, но она использует boost.build для сблорки, а я с ним вполне так дружу :). Слинковалась библиотека с моим проектом тоже без проблем. Но вот работать отказывалась. Падала с совсем непонятными ошибками, в совершенно неожиданных местах. То есть там, где по логике вообще падать не должно. И еще все тесты оказались проваленными.&lt;br /&gt;Тут я тоже промучался несколько часов, пока не заметил, что у меня путь к бусту в project-root.jam прописан не совсем правильно. У меня использывался буст из CVS репозитория, а он там очень корявый лежит.  Исправил проблему, прописав путь к дистрибутиву 1.33.1 и всё заработало. Хотя под vc8.0 несколько тестов всё же провалилось, а в vc7.1 все прошли успешно. Странно как-то.&lt;br /&gt;Кстати, версия luabind из sourceforge не работает с последней версией lua5.1, надо забирать luabind из CVS. Тоже весьма неприятный момент.&lt;br /&gt;&lt;br /&gt;Но к счастью, весь этот секс остался позади. И теперь у меня открылись новые архитектурные возможности. Например используя скрипты будет проще наладить взаимодействие между потоком, обрабатывающим GUI и основным потоком приложения. Так как задавать отложенные скрипты всё же лаконичнее, чем задавать отложенные функции. Хотя второе и удобно благодоря boost::lambda, но всё же С++, к сожалению, не функциональный язык и boost::lambda не может придать ему всех свойств ФЯ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-114974185929136518?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/114974185929136518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=114974185929136518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/114974185929136518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/114974185929136518'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/06/lua.html' title='Lua'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-114700556906959717</id><published>2006-05-07T05:39:00.000-07:00</published><updated>2006-05-07T05:39:29.146-07:00</updated><title type='text'>Проблемы с WTL</title><content type='html'>Поставил сегодня себе Visual C++ Express Edition и Microsoft Platform SDK. Думал что мой проект скомпилируется без проблем. Ха! Наивный.&lt;br /&gt;Проблема в том, что мой проект использует WTL 7.5, он конечно же лежит отдельно и не входит в Platform SDK. Но требует наличия файла atlbase.h, который уже являются частью Platform SDK.&lt;br /&gt;Все было бы хорошо, но atlbase.h инклюдит файл shlwapi.h, которого у меня в наличии не оказалось.&lt;br /&gt;После блужданий по сети, я нашел информацию о том, что этот файл появится после установки компонента Microsoft Web Workshop(IE) SDK.&lt;br /&gt;Какая логическая связь между этим компонентом и ATL я так и не понял. Ну ладно, поставил его, у меня появился shlwapi.h.&lt;br /&gt;Все было бы хорошо, но у меня появилась новая проблема. При линковке проект требует библиотеку atlthunk.lib, которой опять же не оказалось в Platform SDK.&lt;br /&gt;&lt;br /&gt;Опять &lt;a href="http://forums.microsoft.com/msdn/showpost.aspx?postid=64509&amp;siteid=1"&gt;поиск&lt;/a&gt; в сети очень помог мне. Оказалось что PSDK не поддерживает 32-ух битные ATL библиотеки. Только 64-ех битные. А что бы иметь доступ к первой надо перейти на полную платную версию Visual Studio... ну или просто закоментировать #pragma comment(lib, "atlthunk.lib")  в файле atlbase.h. Я выбрал второй вариант.&lt;br /&gt;Еще хотелось бы заметить, что WTL под vc8.0 не компилируется, из-за использывании не совместимых со стандартом С++ приемов. В файле atlwin.h на 1753-ей строчке используется не объявленная переменная в качестве счетчика цикла. Всё же VC6.0 очень развращает людей.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-114700556906959717?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/114700556906959717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=114700556906959717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/114700556906959717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/114700556906959717'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/05/wtl.html' title='Проблемы с WTL'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-114488159226072153</id><published>2006-04-12T15:35:00.000-07:00</published><updated>2006-04-12T15:39:52.273-07:00</updated><title type='text'>С++ жив!</title><content type='html'>&lt;p class="MsoNormal"&gt;Наконец-то руки дошли до boost::multi_index. Очень красивая концепция и замечательная реализация. Одна из самых красивых вещей в бусте. А почему? Да потому что стиль программирования контейнеров объектов, с различными отношениями порядка, похож на стиль программирования динамических систем в моей DSP библиотечке :) Даже идею с метками использовали.&lt;br /&gt;Вообще не перестаю удивляться мощности языка С++, а в особенности, его возможностей в области метапрограммирования.&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;br /&gt;На форуме программистов на КРИ звучали мнения о том что С++ язык неудобный, сложный и неповоротливый, что лучше переходить на С#, Java, Дельфи и прочие гадости. В тоже время те самые люди плевались в сторону буста, шаблонов и вообще modern C++ programming. Странные какие. Конечно, если не использовать одну из самых сильных сторон языка, он не будет очень удобен.&lt;br /&gt;&lt;br /&gt;Да, компиляторы пока оставляют желать лучшего. Но все же большинство современных компиляторов С++ предоставляют все возможности для вполне комфортного метапрограммирования. Главное что бы у программиста руки откуда надо росли и все будет хорошо :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-114488159226072153?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/114488159226072153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=114488159226072153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/114488159226072153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/114488159226072153'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/04/blog-post.html' title='С++ жив!'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-22341336.post-113996193057720754</id><published>2006-02-14T16:05:00.000-08:00</published><updated>2006-02-14T16:05:30.576-08:00</updated><title type='text'>Будни разработчика</title><content type='html'>&lt;a href="http://cyberzx.blogspot.com/"&gt;Будни разработчика&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22341336-113996193057720754?l=cyberzx.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cyberzx.blogspot.com/feeds/113996193057720754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=22341336&amp;postID=113996193057720754' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/113996193057720754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/22341336/posts/default/113996193057720754'/><link rel='alternate' type='text/html' href='http://cyberzx.blogspot.com/2006/02/blog-post_14.html' title='Будни разработчика'/><author><name>CyberZX</name><uri>http://www.blogger.com/profile/03839965963685383013</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
