<?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'><id>tag:blogger.com,1999:blog-1793630632384489392</id><updated>2010-03-10T09:50:19.546+03:00</updated><title type='text'>Журнал рабочих черновиков</title><subtitle type='html'>Наброски, заметки, статьи помогающие сделать правильный выбор. Обзор современных технологий.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.axet.ru/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default?start-index=26&amp;max-results=25'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>264</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-4728207929988685731</id><published>2010-03-07T21:16:00.000+03:00</published><updated>2010-03-07T21:16:08.420+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rhythmbox-shoutcast'/><title type='text'>rhythmbox-shoutcast small step</title><content type='html'>Немнго продвинулся в написании плагина (переборол лень) и добавил сохранение информации о жанрах и станциях в базу данных. В результате теперь между запусками программы а так же переключениями между жанрами станции не теряются и берутся мгновенно из базы.&lt;br /&gt;
&lt;br /&gt;
Изменения не большие, объеденил два типа данных (entry-type) в один общий. Так ближе к рекомендациям и интерфейсу разработчика.&lt;br /&gt;
&lt;br /&gt;
Так же, стал добавлять мягкое обновлений станций. Это когда программа не резко удаляет старые записи, и добавляет новые, а когда она удаляет\добавляет только изменения. Теперь новые станции будут появлятся без прыгания списков и тому подобное.&lt;br /&gt;
&lt;br /&gt;
После этих изменений наткнулся на баг в rhythmdb - отсутствие методов. iter_to_entry \&amp;nbsp; tree_path_to_entry. Данные методы присутствуют о полном API для С (С язык). Но отсутсвуют в обертках Python binding.&lt;br /&gt;
&lt;br /&gt;
Ссылка на документацию:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://library.gnome.org/devel/rhythmbox/0.12/rhythmbox-rhythmdb-query-model.html#rhythmdb-query-model-iter-to-entry"&gt;http://library.gnome.org/devel/rhythmbox/0.12/rhythmbox-rhythmdb-query-model.html#rhythmdb-query-model-iter-to-entry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Ссылка на python binding source:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://git.gnome.org/browse/rhythmbox/tree/bindings/python/rhythmdb.defs"&gt;http://git.gnome.org/browse/rhythmbox/tree/bindings/python/rhythmdb.defs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
В результате чего родилось желание сделать отчет об ошибке в bugzilla.gnome.org:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=612102"&gt;https://bugzilla.gnome.org/show_bug.cgi?id=612102&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
и ждать пока его испрвят, или исправить самому, когда надоест ждать.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Я еще не писал и планирую сделать более полный отчет о том, как создаются библиотеки\переходники на С\С++ и Python. У меня в журнале уже есть пара строчек о том как это делается для других языков. Но ни одного примера как это сделать для Питона.&lt;br /&gt;
&lt;br /&gt;
Что бы не писать много дам полезную ссылку, а когда дайдут руки напишу полный отчет:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/rhythmbox-shoutcast/wiki/PythonBinding"&gt;http://code.google.com/p/rhythmbox-shoutcast/wiki/PythonBinding&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Ссылка на последение изменения в плагине для rhythmbox:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/rhythmbox-shoutcast/source/detail?r=7f14e9d750c7d59c2d4a7d132c56b8cf5414b2e8"&gt;http://code.google.com/p/rhythmbox-shoutcast/source/detail?r=7f14e9d750c7d59c2d4a7d132c56b8cf5414b2e8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-4728207929988685731?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/4728207929988685731/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/03/rhythmbox-shoutcast-small-step.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4728207929988685731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4728207929988685731'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/03/rhythmbox-shoutcast-small-step.html' title='rhythmbox-shoutcast small step'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-4039635662555806696</id><published>2010-03-06T19:42:00.001+03:00</published><updated>2010-03-06T21:21:58.758+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google gears x64 linux</title><content type='html'>Несмотря на огрожающее "32-bit OS (64-bit not supported)" решил установить последнюю версию Google Gears на свой Linux-x64-Firefox-Box.&lt;br /&gt;
&lt;br /&gt;
И о чудо! Оно заработало!&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://gears.google.com/"&gt;http://gears.google.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-4039635662555806696?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/4039635662555806696/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/03/google-gears-x64-linux.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4039635662555806696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4039635662555806696'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/03/google-gears-x64-linux.html' title='Google gears x64 linux'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-1396273094011052717</id><published>2010-02-27T22:41:00.000+03:00</published><updated>2010-02-27T22:41:30.073+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Haskell</title><content type='html'>Очередное навождение мне предстало в лице Хаскел!&lt;br /&gt;
&lt;br /&gt;
Нет, нет. Это&amp;nbsp; не мужик мне приснился, а статья подвернулась об языке названном в его честь.&lt;br /&gt;
&lt;br /&gt;
Количество текста, который я планировал писать про erlang плавно замещается таким же объемом на более интересным и позитивным про новую, более обнадеживающую среду.&lt;br /&gt;
&lt;br /&gt;
erlang остался в моей памяти как нечто недоделаное и не родившееся, навроде вымерших диназавров. Оно появилось поздно и уже объективно отстало.&lt;br /&gt;
&lt;br /&gt;
Новое, и на мой взгляд очень перспективное называется Hackel. Оно содержит в себе все хорошее из декларативный языков навроде erlang'а и куда больше своего собсбственного и оригинального.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Что почитать?&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/ru/library/l-haskell/"&gt;http://www.ibm.com/developerworks/ru/library/l-haskell/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/ru/library/l-haskell2/"&gt;http://www.ibm.com/developerworks/ru/library/l-haskell2/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/ru/library/l-haskell3/"&gt;http://www.ibm.com/developerworks/ru/library/l-haskell3/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ru.wikipedia.org/wiki/Haskell"&gt;http://ru.wikipedia.org/wiki/Haskell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-1396273094011052717?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/1396273094011052717/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/02/haskell.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/1396273094011052717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/1396273094011052717'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/02/haskell.html' title='Haskell'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-5965841937174203610</id><published>2010-02-25T23:45:00.002+03:00</published><updated>2010-02-25T23:47:03.568+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>Жизнь в движении</title><content type='html'>&lt;span class="z19Dle" id="col-z123i54rdmv4h3b2v22qi1qplqfqvb0n0"&gt;&lt;span class="zo"&gt;А вы знаете почему метро в Москве ходит с такими большими перерывами? Так что между поездами скапливается здоровая толпа? Правильно. Они экономит ресурс составов, стараются пускать их реже, что бы каждый из них проходил меньше километража. А знаете засчет чего происходит экономия? &lt;br /&gt;
&lt;br /&gt;
За счет нас с вами, которые талкаются, давятся, злятся, ругаются, качают права, требуют и играют в игру дарвина. Каждый день, в каждом вогоне, постоянно уплотняясь, сдавливаясь, и раздражаясь. Экономя на вогонах, они каждый день отнимают несколько часов нашей жизни из за стрессов и нервотрепки, за это железо. &lt;br /&gt;
&lt;br /&gt;
А в офицальной статистике основная причина: пьянство, гибель на доргах и аборты.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;i&gt;Спуститесь вниз на землю с облаков!&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Поближе присмотритесь, кто ваш зритель?&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Он равнодушен, груб и бестолков.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Он из театра бросится к рулетке&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Или в объятья ветреной кокетки.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;А если так, я не шутя дивлюсь,&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;К чему без пользы мучить бедных муз?&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Валите в кучу, поверху скользя,&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Что подвернется, для разнообразья.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Избытком мысли поразить нельзя,&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Так удивите недостатком связи.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Но что случилось с вами? Вы в экстазе?&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: right;"&gt;&lt;i&gt;Иоганн Гете (в переводе Б. Пастернак) &lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-5965841937174203610?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/5965841937174203610/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/02/blog-post_25.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/5965841937174203610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/5965841937174203610'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/02/blog-post_25.html' title='Жизнь в движении'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-725476567991803396</id><published>2010-02-22T18:19:00.000+03:00</published><updated>2010-02-22T18:19:08.671+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='macbook pro'/><title type='text'>Macbook pro linux function keys</title><content type='html'>Настройка функциональных клавиш на Mac под линукс. Обновленная версия.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;chkconfig --add kbfix&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-style: italic;"&gt;/etc/init.d/kbfix&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: courier new;"&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new;"&gt;#&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new;"&gt;# chkconfig: 12345 90 01&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new;"&gt;# description: fix apple fn keys&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new;"&gt;echo "2" &amp;gt; /sys/module/hid_apple/parameters/fnmode&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-725476567991803396?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/725476567991803396/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/02/macbook-pro-linux-function-keys.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/725476567991803396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/725476567991803396'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/02/macbook-pro-linux-function-keys.html' title='Macbook pro linux function keys'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-346121178342546125</id><published>2010-02-11T17:39:00.001+03:00</published><updated>2010-02-11T18:29:47.380+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='talk'/><title type='text'>Google идет в перед</title><content type='html'>Гугл начал захват мира через подмену браузера от мозилла. Чужими руками, ребят создавших Firefox, они подвинули долю Internet Explorer в общем интернет трафике. Этот шаг сместил на шаг веру в единый стандарт интернет браузинга в сторону более открытой технологии. И что потом? Гугл выпускает свой бразуер, отказавшись от помощи тех&amp;nbsp; с кем начинали. (Firefox / Chrome)&lt;br /&gt;
&lt;br /&gt;
Что не смогли заменить - купили (Google Video / YouTube).&lt;br /&gt;
&lt;br /&gt;
Что не смогли купить - заменили (Twitter / Buzz).&lt;br /&gt;
&lt;br /&gt;
Что не подошло под их стандарт - отказалались (Flash / Html5).&lt;br /&gt;
&lt;br /&gt;
Что приносит деньги создали (Paypal / Google chekcout).&lt;br /&gt;
&lt;br /&gt;
Google voice, который пока еще, не добрался до России.&lt;br /&gt;
&lt;br /&gt;
Я начинаю терять уверенность в том, что остались службы, которые бы еще не были совмещены с google аккаунтом, или пока такие еще остались?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-346121178342546125?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/346121178342546125/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/02/google.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/346121178342546125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/346121178342546125'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/02/google.html' title='Google идет в перед'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-7819211515368168518</id><published>2010-02-02T12:41:00.001+03:00</published><updated>2010-02-02T12:44:35.433+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off topic'/><title type='text'>Вид из окна</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fzRajqtYI/AAAAAAAAEl8/dU4ZXtxlq9U/s1600-h/00013.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fzRajqtYI/AAAAAAAAEl8/dU4ZXtxlq9U/s640/00013.jpg" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-7819211515368168518?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/7819211515368168518/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/02/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/7819211515368168518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/7819211515368168518'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/02/blog-post.html' title='Вид из окна'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lxb0VufVhSw/S2fzRajqtYI/AAAAAAAAEl8/dU4ZXtxlq9U/s72-c/00013.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-6700506450442446819</id><published>2010-02-02T12:39:00.000+03:00</published><updated>2010-02-02T12:39:02.891+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='macbook pro'/><title type='text'>Ремонт Magsafe (зарядка)</title><content type='html'>Как оказалось разобрать и собрать штекер магсейф не такая большая проблема. И это легко сделать в домашних условиях.&lt;br /&gt;
&lt;br /&gt;
Однако в&amp;nbsp; моем случае штекер магсейф не перетерся как обычно бывает, а оторвалась магнитная гловка.&lt;br /&gt;
&lt;br /&gt;
Симптомы были следующие. В начале зарядка ноутбука перестала подсвечивать зеленый индикатор. Потом, где то через пол года, стала прерываться секунду-другую и на это время ноутбук переходил в режим пониженного энерго протребения. И после чего, совсем перестал заряжаться.&lt;br /&gt;
&lt;br /&gt;
Вот несколько фотографий:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fvgDfzIcI/AAAAAAAAEkM/1eL3LRUDF7o/s1600-h/00003.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fvgDfzIcI/AAAAAAAAEkM/1eL3LRUDF7o/s640/00003.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fvxd3uBoI/AAAAAAAAEkU/IT3CSt1eakE/s1600-h/00004.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fvxd3uBoI/AAAAAAAAEkU/IT3CSt1eakE/s640/00004.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_lxb0VufVhSw/S2fwBzstE2I/AAAAAAAAEk0/WvJdLaXS4Dk/s1600-h/00005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/_lxb0VufVhSw/S2fwBzstE2I/AAAAAAAAEk0/WvJdLaXS4Dk/s640/00005.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_lxb0VufVhSw/S2fwSakvDkI/AAAAAAAAEk8/csv99vOTCms/s1600-h/00006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/_lxb0VufVhSw/S2fwSakvDkI/AAAAAAAAEk8/csv99vOTCms/s640/00006.jpg" width="640" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_lxb0VufVhSw/S2fwivR2SNI/AAAAAAAAElE/iFd-BfkbfZc/s1600-h/00007.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/_lxb0VufVhSw/S2fwivR2SNI/AAAAAAAAElE/iFd-BfkbfZc/s640/00007.jpg" width="640" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://3.bp.blogspot.com/_lxb0VufVhSw/S2fwyimfrfI/AAAAAAAAElM/ckD2KLTWNOU/s1600-h/00008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/_lxb0VufVhSw/S2fwyimfrfI/AAAAAAAAElM/ckD2KLTWNOU/s640/00008.jpg" width="640" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fxCvGBgwI/AAAAAAAAElU/245DqqhhGus/s1600-h/00010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fxCvGBgwI/AAAAAAAAElU/245DqqhhGus/s640/00010.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_lxb0VufVhSw/S2fxSlqzSzI/AAAAAAAAElc/EHWofBDjELU/s1600-h/00011.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/_lxb0VufVhSw/S2fxSlqzSzI/AAAAAAAAElc/EHWofBDjELU/s640/00011.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_lxb0VufVhSw/S2fxlEZGPCI/AAAAAAAAElk/E29OoZ_mplg/s1600-h/00012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/_lxb0VufVhSw/S2fxlEZGPCI/AAAAAAAAElk/E29OoZ_mplg/s640/00012.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_lxb0VufVhSw/S2fx11L_HxI/AAAAAAAAEls/IjMcRobBiCg/s1600-h/00014.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/_lxb0VufVhSw/S2fx11L_HxI/AAAAAAAAEls/IjMcRobBiCg/s640/00014.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fyGRcmIjI/AAAAAAAAEl0/IvQs5tBJr8k/s1600-h/00015.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/_lxb0VufVhSw/S2fyGRcmIjI/AAAAAAAAEl0/IvQs5tBJr8k/s640/00015.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-6700506450442446819?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/6700506450442446819/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/02/magsafe.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/6700506450442446819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/6700506450442446819'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/02/magsafe.html' title='Ремонт Magsafe (зарядка)'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lxb0VufVhSw/S2fvgDfzIcI/AAAAAAAAEkM/1eL3LRUDF7o/s72-c/00003.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-4346806704181690884</id><published>2010-01-27T22:18:00.001+03:00</published><updated>2010-01-27T23:50:19.659+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Вывод чисел прописью</title><content type='html'>Одна из типовых задачек которые вы можете выполнять в институте на уроках информатики может быть задачей о переводе числового представление в прописное или перевод из десятичной системы в шестнадцатеричную.&lt;br /&gt;
&lt;br /&gt;
Так как все эти задачки уже давно решены, вам нет необходимости изобретать велосипед, а достаточно просто обратится к исходному коду и найти готовый пример.&lt;br /&gt;
&lt;br /&gt;
Так перевод чисел из различных систем исчисления в друг друга может быть найден в системной (POSIX) функции printf исходный код которой доступен в свободном доступе. Если вы не уверены в том где находится нужные вам исходники воспользуйтесь поиском codesearch.google.com и задайте в условиях требуемое имя фнукции (printf).&lt;br /&gt;
&lt;br /&gt;
Перевод делается по простому алгоритму.&lt;br /&gt;
&lt;br /&gt;
- В начале вы считываете входное значение и преобразуете его в числовой формат.&lt;br /&gt;
- Следующим шагом является перевод числа в требуемую систему исчисления&lt;br /&gt;
- Затем, перевод полученного значения в прописное представление:&lt;br /&gt;
- Пропись может иметь языковую ориентацию и иметь свои особенности перевода в русскую, английскую, немецкую или в еврит. Где по разному пишутся и взаимодействуют между собой числительные.&lt;br /&gt;
- Кроме того иметь различные переводы при сохранеии языковых конструкций.&lt;br /&gt;
&lt;br /&gt;
Таким образом мы получаем несколько ключевых объектов:&lt;br /&gt;
- Входной поток (реализован через stl::iostream)&lt;br /&gt;
- Перевод числа в текстовое представление (реализован через Encoding)&lt;br /&gt;
- Языковые особенности (реализован через Lingvo_RU)&lt;br /&gt;
- Локализация (реализован через Locale_RU)&lt;br /&gt;
&lt;br /&gt;
Комбинируя все возможные варианты представленных классов, и дописывая новые без труда можно получить перевод чисел в пропись для любого существующего языка.&lt;br /&gt;
&lt;br /&gt;
Перевод строкового представления числа (уже строки а не машинного числа) в пропись делается простыми шагами. Сам стиль реализации подразумевает атомарность всех вычислений (стиль erlang) и отсутствие классов состояния\отсутствие сайд эффектов. Вычисления производятся через рекурсивный вызов одной и той же функции, каждый раз откусывающей начало массива, и передающая сама в себя конец не обработанных данных.&lt;br /&gt;
&lt;br /&gt;
По просу говоря, функция обрабатывает только ту часть, которую может обработать в данный момент, и передает на следующий уровень остаток, который еще не обработан. Такая схема может предпологать создание распределенной сети вычислений. Позволяющий преобразовывать гигантские объемы входных чисел в текстовое представление. Так как большинство порядков чисел не коррелированы и одно строковое представление числа может быть преобразованно в текстовое представление на нескольких независмых машинах по схеме Map/Reduce. Но это отдельная тема.&lt;br /&gt;
&lt;br /&gt;
В нашем же случае, расчет делается следующими рекурсивными шагами, каждый из которых отъедает начало списка:&lt;br /&gt;
- Определение разрядности&lt;br /&gt;
- Перевод найденного разряда в текст&lt;br /&gt;
&lt;br /&gt;
например число 1000000 (один миллион) переводится в текст за следующее число операций:&lt;br /&gt;
&lt;br /&gt;
первый шаг:&lt;br /&gt;
1(0000000) = разрядность миллион, значение 1&lt;br /&gt;
&lt;br /&gt;
второй шаг:&lt;br /&gt;
000(000) = разрядность тысяча, значение отсутствует&lt;br /&gt;
&lt;br /&gt;
третий шаг:&lt;br /&gt;
000() = разрядность единицы, значение отсутствует.&lt;br /&gt;
&lt;br /&gt;
Еще один момент который я хотел бы рассмотреть подробно - это перевод разряда в текст.&lt;br /&gt;
&lt;br /&gt;
Любое число попадающее в эту функции подвергается анализу в лингвистическом модуле. Он определяет размерность числительного и пол разряда. Как это работает?&lt;br /&gt;
&lt;br /&gt;
Размерность числетельных влияет на то какое окончание будет у разряда. Например: одна тысяч(а), две тысяч(и), пять тысяч(). И в свою очередь, что бы совсем было не сладко, порядок будет влиять на числительное. Например: од(ин) миллион, од(а) тысяча и так далее до дрожи в коленках.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;locale&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Error : public std::exception&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; Error(const char* text) : std::exception(text)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Locale&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; enum Digits{ NONE, UNITS, TENS, HUNDRED, THOUSAND, MILLION, BILLION, TRILLION };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Locale_RU : public Locale&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; enum Sex {SEXNONE, MALE, FEMALE};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; // од(ин), двадцать один миллиард().&lt;br /&gt;
&amp;nbsp; // дв(а), три, четыре миллиард(а).&lt;br /&gt;
&amp;nbsp; // пять, шесть, семь, восемь, девять, десять миллиард(ов).&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; // одн(а), двадцать одина тысяч(а).&lt;br /&gt;
&amp;nbsp; // дв(е), три, четыри тысяч(и).&lt;br /&gt;
&amp;nbsp; // пять, шесть, семь, восемь, девять, десять тысяч().&lt;br /&gt;
&amp;nbsp; enum Count {COUNTNONE, ONE, TWOTHREEFOUR, FIVEMORE};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; static Sex get_grender(Locale::Digits type)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(type)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case THOUSAND:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FEMALE;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case MILLION:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case BILLION:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case TRILLION:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return MALE;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return SEXNONE;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; static Count to_simple(char number)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = number - '0';&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(index)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ONE;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 4:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TWOTHREEFOUR;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 5:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 6:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 7:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 8:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 9:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FIVEMORE;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("bad to_simple");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; static const char* to_simple(char number, Locale::Digits type)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::vector&amp;lt;const char*&amp;gt; table;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(get_grender(type))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case FEMALE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const char* t[]=&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {"ноль", "одна", "две", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять"};&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; table.assign(&amp;amp;t[0], &amp;amp;t[sizeof(t) / sizeof(const char*)]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case SEXNONE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case MALE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const char* t[]=&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {"ноль", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять"};&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; table.assign(&amp;amp;t[0], &amp;amp;t[sizeof(t) / sizeof(const char*)]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = number - '0';&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return table.at(i);&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; static const char* to_ten(int number)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = number - '0';&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; const char* table[]= {"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(index &amp;lt; 0 || index &amp;gt;= sizeof(table))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("to_hundred limit exception");&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return table[index];&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; static const char* to_ten_plus(int number)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = number - '1';&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; const char* table[]= {"десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "семьдесят", "восемьдесят", "девяносто"};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(index &amp;lt; 0 || index &amp;gt;= sizeof(table))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("to_hundred limit exception");&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return table[index];&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; static const char* to_hundred(char number)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = number - '1';&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; const char* table[]= {"сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "семьсот", "восемьсот", "девятьсот"};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(index &amp;lt; 0 || index &amp;gt;= sizeof(table))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("to_hundred limit exception");&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return table[index];&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; static std::string get_end(Locale::Digits type, Locale_RU::Count count)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string end;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(get_grender(type))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case NONE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case FEMALE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(count)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case ONE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end = "а";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TWOTHREEFOUR:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end = "и";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case FIVEMORE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case MALE:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(count)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case ONE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TWOTHREEFOUR:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end = "а";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case FIVEMORE:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end = "ов";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("bad count");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return end;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; static std::string to_text(Locale::Digits type, Locale_RU::Count count)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string end;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string word;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end = get_end(type, count);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(type)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case UNITS:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case THOUSAND:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; word = "тысяч";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case MILLION:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; word = "миллион";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case BILLION:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; word = "миллиард";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case TRILLION:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; word = "триллион";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("bad type");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return word + end;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Лингвистический оптимизатор. Адаптирует числовое предсталвение произношению\письму\языку.&lt;br /&gt;
class Lingvo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; std::string concat_word(const std::string&amp;amp; w1, const std::string&amp;amp; w2)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string str(w1);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; static std::locale loc = std::locale("");&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len = str.length();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(str.length() &amp;gt; 0 &amp;amp;&amp;amp; w2.length() &amp;gt; 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!std::isspace(str[len - 1], loc))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str += " ";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; str += w2;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return str;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template &amp;lt;class L&amp;gt;&lt;br /&gt;
class Lingvo_RU : public Lingvo&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; std::string to_simple(const std::string &amp;amp;str, Locale::Digits type)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string ret = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, L::to_simple(str[0], type));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Locale_RU::Count count = L::to_simple(str[0]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, L::to_text(type, count));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; std::string to_ten(const std::string &amp;amp;str, Locale::Digits type, int cut_len)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len = str.length();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string head = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string tail = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string ret = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; head = str.substr(0, cut_len);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tail = str.substr(0 + cut_len, len - cut_len);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_ten(tail, type));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; std::string to_ten(const std::string &amp;amp;str, Locale::Digits type)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len = str.length();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string ret = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(len)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //10-99&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(str[0])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case '0':&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_ten(str, type, 1));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case '1':&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, L::to_ten(str[1]));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, L::to_text(type, Locale_RU::FIVEMORE));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, L::to_ten_plus(str[0]));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_ten(str, type, 1));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0-9&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(str[0])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case '0':&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_ten(str, type, 1));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_simple(str, type));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, L::to_text(type, Locale_RU::FIVEMORE));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("wrong to_ten len");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; std::string to_hundred(const std::string &amp;amp;str, Locale::Digits type, int cut_len)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len = str.length();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string head = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string tail = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string ret = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; head = str.substr(0, cut_len);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tail = str.substr(0 + cut_len, len - cut_len);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_hundred(tail, type));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; std::string to_hundred(const std::string &amp;amp;str, Locale::Digits type)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len = str.length();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string ret = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(len)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //000-900&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(str == "000")&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(str[0])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case '0':&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_hundred(str, type, 1));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, L::to_hundred(str[0]));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_hundred(str, type, 1));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //10-99&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(str[0])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case '0':&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_hundred(str, type, 1));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_ten(str, type));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0-9&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(str[0])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case '0':&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_hundred(str, type, 1));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_simple(str, type));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, L::to_text(type, Locale_RU::FIVEMORE));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("wrong hundred len");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; // cut and parse&lt;br /&gt;
&amp;nbsp; std::string to_digits(const std::string &amp;amp;str, Locale::Digits type, int cut_len)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len = str.length();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string head = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string tail = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string ret = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; head = str.substr(0, cut_len);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; tail = str.substr(0 + cut_len, len - cut_len);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_hundred(head, type));&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_string(tail));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; std::string to_digits(const std::string &amp;amp;str, Locale::Digits type)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len = str.length();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string ret = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(len)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // триллион 1 000 000 000 000 - 100 000 000 000 000&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 15:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 14:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 13:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_digits(str, Locale::TRILLION, len - 12));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // миллиард 1 000 000 000 - 100 000 000 000&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 12:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 11:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 10:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_digits(str, Locale::BILLION, len - 9));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // миллион 1 000 000 - 100 000 000&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 9:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 8:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 7:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_digits(str, Locale::MILLION, len - 6));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // тысяча 1 000 - 100 000&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 6:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 5:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 4:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_digits(str, Locale::THOUSAND, len - 3));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // сотня 100&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_digits(str, Locale::UNITS, len - 0));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_ten(str, type));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0-9&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = concat_word(ret, to_simple(str, type));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("big value");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; std::string to_string(const std::string &amp;amp;str)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return to_digits(str, Locale::UNITS);&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Encoding&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; const char to_char(int i)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; static const char c[] = {"0123456789ABCDEF"};&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(i &amp;gt;= sizeof(c))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw Error("to_char limit exception");&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return c[i];&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Encoding_DEC : public Encoding&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; template &amp;lt;class T&amp;gt;&lt;br /&gt;
&amp;nbsp; std::string convert(T number)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string str = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (number &amp;gt;= 10)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str += to_char(number % 10);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; number /= 10;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; str += to_char((int)number);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::reverse(str.begin(), str.end());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return str;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Encoding_OCT : public Encoding&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; template &amp;lt;class T&amp;gt;&lt;br /&gt;
&amp;nbsp; std::string convert(T number)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string str = "";&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char last = 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last = to_char(number &amp;amp; 7);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str += last;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; number &amp;gt;&amp;gt;= 3;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } while (number);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( last != '0')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; number += '0';&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::reverse(str.begin(), str.end());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return str;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int _tmain(int argc, _TCHAR* argv[])&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; long long i = 111111111111111;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; setlocale(LC_ALL, "Russian");&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; while(true)&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::cout&amp;lt;&amp;lt;"Вводим: "&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::cin&amp;gt;&amp;gt;i;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::cout&amp;lt;&amp;lt;"Выводим: "&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encoding_DEC enc;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string s = enc.convert(i);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lingvo_RU&amp;lt;Locale_RU&amp;gt; locale;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string verb = locale.to_string(s);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::cout&amp;lt;&amp;lt;verb&amp;lt;&amp;lt;" в десятичной системе;"&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encoding_OCT enc;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string s = enc.convert(i);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lingvo_RU&amp;lt;Locale_RU&amp;gt; locale;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::string verb = locale.to_string(s);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::cout&amp;lt;&amp;lt;verb&amp;lt;&amp;lt;" в восьмеричной системе."&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; std::cout&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-4346806704181690884?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/4346806704181690884/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2010/01/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4346806704181690884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4346806704181690884'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2010/01/blog-post.html' title='Вывод чисел прописью'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-3218907631009937482</id><published>2009-12-30T21:59:00.001+03:00</published><updated>2009-12-30T22:01:52.724+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google bugs'/><title type='text'>Thanks to Google for keeping my home page fine!</title><content type='html'>В настоящий момент я не могу придерживаться утверждения обозначенного в заголовке к данной теме.&lt;br /&gt;
&lt;br /&gt;
Ребята из гугл тим, завалили службу маппинга имен для app engine &amp;amp;&amp;amp; sites. Старый сломанный мапинг, удалить нельзя, а новый нельзя добавить. И все случилось под новый год!!!&lt;br /&gt;
&lt;br /&gt;
Моя страничка www.axet.ru лежит с 18 декабря (возможно 18-24 судя по статистики с google analytics).&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.google.com/support/forum/p/Google+Apps/thread?fid=6421087ef73ca90a00047bcc2829fe1c&amp;amp;hl=en"&gt;http://www.google.com/support/forum/p/Google+Apps/thread?fid=6421087ef73ca90a00047bcc2829fe1c&amp;amp;hl=en&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-3218907631009937482?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/3218907631009937482/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/12/thanks-to-google-for-keeping-my-home.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/3218907631009937482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/3218907631009937482'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/12/thanks-to-google-for-keeping-my-home.html' title='Thanks to Google for keeping my home page fine!'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-4644223608931063818</id><published>2009-12-22T15:30:00.000+03:00</published><updated>2009-12-22T15:30:24.465+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Rhythmbox shoutcast</title><content type='html'>Если кто то хотел запустить шут-каст радио на своем линукс-rhythmbox плеере, а такого плагина не смог найти. То теперь эта мечта может осуществится. Я набросал пару строчек и теперь они выложены в интернете как плагин для этого плеера.&lt;br /&gt;
&lt;br /&gt;
Версия совсем сырая, не доработан интерфейс, нету ни какого обновления\сохранения плей листов скаченных с сервера, но со своей основной функцией он уже сейчас справляется.&lt;br /&gt;
&lt;br /&gt;
Если мне будет очень скушно, напишу еще немного кода и сделаю нормальный интерфейс.&lt;br /&gt;
&lt;br /&gt;
Адрес сайта: &lt;a href="http://code.google.com/p/rhythmbox-shoutcast/"&gt;http://code.google.com/p/rhythmbox-shoutcast/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-4644223608931063818?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/4644223608931063818/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/12/rhythmbox-shoutcast.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4644223608931063818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4644223608931063818'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/12/rhythmbox-shoutcast.html' title='Rhythmbox shoutcast'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-5595751917195248995</id><published>2009-12-17T11:02:00.000+03:00</published><updated>2009-12-17T11:02:59.603+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='languageobjects'/><title type='text'>Обман GoF (В сокращении)</title><content type='html'>Понимаю нежелание читать &lt;a href="http://blog.axet.ru/2009/12/blog-post_10.html"&gt;огромные тексты&lt;/a&gt;. Поэтому приведу тут сокращенный вариант.&lt;br /&gt;
&lt;br /&gt;
1. В книге постоянно путаются базовые определения. Классы называются объектами, объекты на памяти интсанциированными классами и вперемешку между собой. Такой подход очень сильно путает начинающего читателя, который может подумать что так оно и есть. И еще больше запутаться, в место того что бы наводить порядок в своей голове.&lt;br /&gt;
&lt;br /&gt;
2. В книге дается не достаточно конкретные инструкции о правилах применения паттернов. Что в свою очередь, так же сильно усложняет материал для начинающего программиста разобраться в том что же это такое паттерн, и когда его надо приминять.&lt;br /&gt;
&lt;br /&gt;
3. Книга не отвечает на вопросы качественной разработки, и реюз кода. Они создают обратное явление направленное на рождение кода, и акцентирование внимание только на объектной модели на памяти.&lt;br /&gt;
&lt;br /&gt;
4. Авторы книги создали культ программирования объектов на памяти, вместо программирования кодом. В результате получается не читаемый проект не подверженный статистическому анализу.&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/1793630632384489392-5595751917195248995?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/5595751917195248995/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/12/gof.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/5595751917195248995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/5595751917195248995'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/12/gof.html' title='Обман GoF (В сокращении)'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-6898924581621756439</id><published>2009-12-10T19:42:00.002+03:00</published><updated>2009-12-10T20:07:46.906+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='languageobjects'/><title type='text'>Обман GoF (Книга)</title><content type='html'>При выборе новой темы для журнала, или новой книги для изучения я стараюсь придерживаться простого правила: если материал в книге кажется абсурдным, мало информативным или ложном этот материал не достоин упоминания в моем журнале. Таким образом, можно добиться повышение общего качества материалов доступных в сети. Чем меньше будет ссылок на ерунду, тем быстрей про не забудут. Поэтому я не пишу (стараюсь) про дураков, глупости и авторские фантазии, что бы про них быстрей забыли или вообще не узнали.&lt;br /&gt;
&lt;br /&gt;
Однако, сегодня я сделаю исключение. И напишу об одной такой книге, которую считаю полностью недостойной внимания. Во всяком случае считаю не допустимым базированию обучения по шаблонному (паттерному) программированию на этой книжке. Хоть на мой взгляд эта книжка просто напичкана такими липовыми определениями, и ее содержимое (шаблонное программирование) лучше изучать по другим источникам. Но в силу ее популярности, считаю нужным поместить информацию на нее в своем журнале. Дело в том, что эта книга является чуть ли не библией некоторых горе разработчиков, которые стараются скакать по звонким, лишенным сути технологиям тем самым приукрашивая свои липовые наработки.&lt;br /&gt;
&lt;br /&gt;
Я говорю об достаточно известном труде, который мне достался в переводе А. Слинкина. Книга называется "Приемы объектно-ориентированного проектирования Паттерны проектирования". Иначе известная как GoF (Gang of Four) (Design Patterns Elements of Reusable Object-Oriented Software).&lt;br /&gt;
&lt;br /&gt;
Конечно, я сделаю небольшую оговорку, я читал именно перевод на русский. Оригинал возможно не содержал таких серьезных ошибок. И возможно я буду напрасно строчить тексты указывающие на недочеты. Но не смотря на возможные опусы перевода, в книге встречаются целые абзацы, содержимое которых у меня взывает откровенное возмущение. Поэтому нахожу важным поделится своим мнением, возможно эти выводы помогут кому-то не сделать ошибок в самом начале в выборе заведомо ложных утверждений. Что в последствии может привести к ловинному образованию ложного комка понятий, которые ни как не смогут выстроится в правильном направлении.&lt;br /&gt;
&lt;br /&gt;
Итак разберемся с понятиями, которые являются фундаментом для понимания книги. &lt;br /&gt;
&lt;br /&gt;
Ворох терминов используемых не согласованно и часто не правильно, будут только усугублять содержимое, которое выстраивается поверх обозначенных примитивов. Объект, класс, экземпляр класса, совсем забытое и почти не встречающееся, но не менее важное: среда исполнения - все это вместо четко обозначенных значений слов, превращается прямо на глазах у читателя в кашу взаимозаменяемых терминов.&lt;br /&gt;
&lt;br /&gt;
В книге нету четкого определения основных терминов, которые они используют. Давайте их перечислим, с правильным вложенным в них смысла:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;класс - код описывающий поведение объекта с данными&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;объект - экземпляр класса на памяти в среде исполнения&lt;/li&gt;
&lt;li&gt;реализация объекта - код отвечающий определению объекта&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;среда исполнения - среда подключенная к среде исполнения, библиотекам и операционной системе.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Что, кстати, относится к определению объекта, которое не правильно дается в книги, объекта как совокупность данных и функций. Это определение было прочитано авторами из какого-то космического триллера, современной попсовой литературы. Понятие объекта никогда не включало алгоритмы их обрабатывающие. Особенно это имеет отношение к С++, о котором они пишут. Почему? Если сказать просто, то вы одним определением переменной можете обратиться к любым данным и любой области памяти просто определив A* a; на желаемую область памяти и работать с ней. Что подтверждает что данные на которые указывает класс, есть нечто абстрактное то, что посчитал разработчик данными.&lt;br /&gt;
&lt;br /&gt;
Далее необходимо вспомнить, что процесс заполнения С++ шаблонов типами называется не созданием объекта, а инстанциацией класса. А результирующая сущность - классом или инстанциированным классом. Понятие же объекта может использоваться только к куску памяти, инициализированному в среде исполнения.&lt;br /&gt;
&lt;br /&gt;
На мой взгляд "дизайн паттерн", это еще одна революционная идея, которая была искусственна привита и раздута в первую очередь для бизнеса, помогающая делать из процесса разработки показуху. В редких случая помогает разработчикам лучше представлять о том, как необходимо работать с данными.&lt;br /&gt;
&lt;br /&gt;
Я находил подобную концепцию в среде КОБРА (CORBA). Когда цель разработки сделать не код эффективным, а управление процессом разработки. Сделав предсказуемый результат по времени и по приемлимому качеству в разработке вы напроч убиваете эффективное решение. Видимо этот заразный подход проник и в С++. Автор языка которого, был на как раз на стороне тврческих людей, изобретая творческий красивый язык в котором было бы приятно работать.&lt;br /&gt;
&lt;br /&gt;
И еще раз я хочу уточнить, что не плохо когда каждый человек это маленький винтик в процессе. Плохо когда этот винтик ничего не значит и ничего не понимает. В этом случае его легко обмануть и сделать из него дойную корову, забыв напрочь про идею и вообще живых людей.&lt;br /&gt;
&lt;br /&gt;
Я вообще много раз говорил о том, что новое в программирование это забытое старое (и один раз сказал в совсем журнале, в черновике "Это не история повторяется..."). Так те люди, которые придумали новую концепцию в программирование и стали супер-звездами рассказав миру про MVC (дизайн паттерн работы с данными, где данные отделяются от метода их отображения и алгоритмами обрабатывающими их), совсем не такие современные. На самом деле, эти ребята были двоечниками-маркетологами, которые вообще не знали, что такое машина Тьюринга и то, что она на этих принципах и работает.&lt;br /&gt;
&lt;br /&gt;
То есть то, что было прародителем всех современных компьютеров, уже давно в себе содержало основное определине разделения данных (ленты) и их механизма работы с ним (то что читает и мотает ленту). За то теперь, мы можем легко показать заказчикам концепцию на которой строется наша система, показать решения которые используются для ее построения, показать группу разработчиков включая архитектора, программиста, администратора, менежера и еще пачку людей из общего процесса. То в таком случае гораздо проще получить бюджет, чем показать одного программиста строчащего прозрачный код на лету.&lt;br /&gt;
&lt;br /&gt;
Не надо смотреть на меня косо, я не говорю что у такого подхода есть одни минусы. Я&amp;nbsp; говорю о том, что страшно, когда мы сидящие напротив мониторов и вбивающие *((void*)0)=0 не хотим понимать, как создается модель разработки и, что за профессия такая, давать безполезные советы с названием "Системного архитектора". И я хочу показать эту профессию в ее естественном, не извращенном бизнесом, понятии.&lt;br /&gt;
&lt;br /&gt;
Бизнес говорит, ваш Хумен ресурс говорит, ваш менеджер говорит, что надо работать как надо, и никто не понимает, что нужно делать на самом деле. А я хочу пролить свет на эту пролему, убрать это однобокое всоприятие обязанностей и задач и начать наконце концов работать вместе. Работать командой которая понимает свои функции, природу решения задачи свойственной не только бизнес решениям, но и адаптированию их на уровне среды исполнения (эффективных дизайн паттернов, в отношении этой самой среды), а не тупо дает возможность зарабатываеть денег владельцу компании. Ведь когда каждый участник процесса понимает свои и обязанности своего товарища, команда легко видит халтуру и халтурщиков, прикрывающихся звонкими формулами.&lt;br /&gt;
&lt;br /&gt;
Сейчас я хочу разрушить миф об "Дизайн паттернах".&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Начнем с плюсов. Вернее с тех определений которые, выдвигаются в пользу мнимых преимуществ, от использования дизайн паттернов.&lt;br /&gt;
&lt;br /&gt;
Я ни коим образом не могу согласится с определением "повторного использования кода" данного авторами в книге. Авторы утверждают, что повторным использованием является наследование классов и при том же не является использование библиотечных функций. То есть, если вы унаследовались от класса, то вы повторно используете функции это класса. Вопрос: зачем тогда наследовать если вам просто нужна таже самая логика? Если вы используете функции класса работы с данными, то вы должны создать экземпляр этого класса и работать с данными методами этого класса. То есть просто создать его экземпляр на памяти (объект). И в том что вы создали объект, никакого повторного использования кода нет и быть не может. Ведь когда вы вызываете системную функцию для выделения памяти вы не повторно используете системную функцию вызова памяти. Другими словами ведь из за того что вам на ум не пришло писать свои функции работы с памятью, вы не можете утверждать, что экономите уже написанный код.&lt;br /&gt;
&lt;br /&gt;
Видимо авторы хотят указать на другой аспект наследования - оно нужно, что бы переопределить логику объекта. То есть изменить концепцию работы класса с данными. Или иначе: сделать подстановку новой реализации.&lt;br /&gt;
&lt;br /&gt;
Если же говорить об повтором использовании, то это целая вереница условий: атомарность функций, классов, отсутствие глоабльных объектов и фиговин так любимых горе-дизайн-паттер разработчиками называемыми Сингелтон (еще один гвоздь, почему дизайн паттерн плох).&lt;br /&gt;
&lt;br /&gt;
Соответственно, речь о том что с помощью паттернов повторное использование кода увеличивается это утверждение не имеет силы. Паттерны придуманы для того что бы облегчить коллективное производство, соогласование действий в случае одновременного создания большого объема кода уменьшает это самое повторное использование. Во вторых, уже упомянутый Сингельтон, ставит вообще крест на наследовании и повтороном использовании кода, так как переопределение таких конструкций вообще не возможно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы демонстрируют пример наследования, у которого в недостатоках указывается наследование и отсутсвие возможнсти для переопределния иерархии наследования вовремя выполнения. Такую конструкцию лучше себе вообще не представлять перед сном. А как аргумент в пользу шаблонов проектирования, такой апофеоз вообще стыдно предъявлять.&lt;br /&gt;
&lt;br /&gt;
Видимо этот вывод не спешно делается из авторских утверждений о том, что код должен быть сам по себе, а объекты на памяти сами по себе. В результате получить не читаемый код, с множество виртуальных конструкций-объектов на памяти. Автор хочет показать что его орлиный взор, способен заниматься отладкой таких воздушных замков?&lt;br /&gt;
&lt;br /&gt;
Лишний раз идет подтверждение о том что создается не продукт, готовый к использованию. А создается бизнес решение для высасывания денег на поддержку виртуальной среды построенной на блестящих дизайн паттерн идеях. Конечно бизнес не виноват, он живет по правилам которые придумал не он, а государство - ему надо зарабатывать рубль. И программист не виноват он написал по заданию.&amp;nbsp; И архитектор не виноват, который нарисовал пару десятков дизайн-паттернов на доске делал это по этой вот книжке. Просто в этой истории все вместе, тихо погружаются в абсурд ни кто не задаваясь вопросом: "а хорошо ли это?"&lt;br /&gt;
&lt;br /&gt;
Большинство материалов так или иначе связанных с дизайн паттернами, это описание воздушных проблем, созданных не для решения зачад программирования, а для описание процессов которые могут происходить внутри приложения. И самое важное, что необхдимо помнить - писать так ненадо!&lt;br /&gt;
&lt;br /&gt;
Не буду танцевать дальше на абсурде тех утверждений и предлагать в таком случае яву машину, или реализацию виртуальной машины на С++, или использование RTTI или перевод проекта на python. Речь об эффективном программирование а не об мистических возможностях той или иной среды (да в указанных мной средах возможно изменять наследование при приложении определенной доли усилий).&lt;br /&gt;
&lt;br /&gt;
Я задам вопрос по другому, вы вообще зачем пишите такой код, который должен на лету быть пересобран? Задача программирования создать простой эффективный код, который бы удовлетворял принципам повторного использования. Код должен быть читаем без документации, без коментариев и быть понятен с первых минут его использования. А в парадигмах С++, код должен быть типизирован. То есть вообще отсутствовать какой либо намек на виртуализацию среды.&lt;br /&gt;
&lt;br /&gt;
Если же придерживаться тех идей, на которых построена эта книга - пиши код, и думай об объектах, то код такой и выйдет - черти прочтешь его без многолетней тренировки в абстракциях из этой книги. Это что то вроде розовых очков, один раз написав такой код в очках, другой разработчик тоже должен их надеть (купить предварительно) что бы разобраться в нем.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Следующий аргумент-паттерн, активно рекламируемый на страницах книжки есть Абстрактная фабрика. Это шаблон вообще унижение для С++. Язык в котором есть идеальное понятие класса, оптимизируемого для конкретного процессора и создающего оптимизрованный код путем инстанциирования шаблона не может идти в сравнение с ущербной абстрактной фабрикой родившейся в виртуальной машине. Постораюсь объяснить простым языком.&lt;br /&gt;
&lt;br /&gt;
Любой инстациированный класс из шаблона, образует набор самостоятельных классов с независимой реализаций. В результате чего, компилятор образует из них независимый объектный код, который в свою очередь оптимизируется процессором. Следовательно, любой параметр шаблона, будет индивидуально оптимизирован для процессора. А если этот параметр, является объектом (в этом случае java или C# generics отдыхают, так как поддерживают только примитивы) то это понятие объекта оптимизируется для процессора. Что является вообще уникальным явлением на сегодняшний день.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В определении даваемым в книге понятию дизайн паттерн, очень близко и родственно стоит понятие интерфейса. К сожалению, авторы книги делают лже-утверждение, на котором сыпятся множество разработчиков начиная писать абстрактный код перегруженный определением абстрактных конструкций. Нельзя говорить об отделении реализации не дав четких условий ее появлению. То есть нельзя говорить используйте интерфейсы у классов потому что вы получите масштабируемый проект. Это ерунда.&lt;br /&gt;
&lt;br /&gt;
СОВЕТ 1&lt;br /&gt;
&lt;br /&gt;
Такими простыми определениями вы только убьете проект. К сожалению другого определения авторы не дали. А я дам! Создавайте интерфейс, когда вы хотите скрыть реализацию в библиотеках (продаваемых, отдаваемых на сторону), когда вы хотите делать две реализации одного и того же алгоритма, и когда у вас появляется класс со схожей природой (два одинаковых класса).&lt;br /&gt;
&lt;br /&gt;
Еще раз хочу обратить внимание, что наследование реализаций это хороший код, в противовес тому утверждению, которое дается в книги. Плохо не наследовать реализацию класса, а не понимать что вы делаете.&lt;br /&gt;
&lt;br /&gt;
СОВЕТ2&lt;br /&gt;
&lt;br /&gt;
На что я хотел бы обратить внимание. Старайтесь записывать свои мысли (кодом), их проще оценить, исправить и отладить. Я вооще сторонник другого стиля разработки, его смысл в создании групп разработки базирующейся на потребоностях бизнеса, но не эксплуатирующий яркие конструкции. Я уверен, и знаю такую модель разработки , при которой программисты создают код, читаемый без специальных знаний, качественный, интересный и не пергруженный конструкциями которые требуют не только специальных сред разработки но и горы бесполезных знаний затмевающих основную цель - создание эффективного кода.&lt;br /&gt;
&lt;br /&gt;
К сожалению, это тоже довольно большой кусок размышений и я его не буду рассматривать в этой стате. Однако это не просто размышлизм, такие примеры есть - это открыте разработки. Это открыте конструкции, посмотрите как они это делают и вы поймете о чем я говорю.&lt;br /&gt;
&lt;br /&gt;
Так вот если вы начнете писать то что думате в коде, а не создавать воздушные замки. То код у вас будет выглдить по тем дизайн паттернам, рассмотреным в книге. Но написан он будет не на памяти а в коде ввиде конструкций наследования, шаблонов, интерфейсов.&lt;br /&gt;
&lt;br /&gt;
СОВЕТ3&lt;br /&gt;
&lt;br /&gt;
Несмотря на общую критику и безалаберный подход заложенный в концепции. Я нахожу очень интересным пример использования шаблонов проектирования на примере текстового редактора рассмотренного в книге. Хоть и рассмотренная в начале книги шаблонная техника не выдерживает ни какой критики, сами по себе они пишут не так плохой код.&lt;br /&gt;
&lt;br /&gt;
Если конечно не замечать таких ляпов как образование новых типов-строк. Это продолжение начатой авторами темы об всеобщей виртуализации, к которой так неудержно смотремится банда четырех.&lt;br /&gt;
&lt;br /&gt;
Писать в коде конструкции strcmp(nameName, "Value") все равно что образовывать новый тип данных. Язык С++, это прежде всего язык типов, и компилятор делает работу за вас только в том случае, если вы этой парадигмы придерживаетесь. И если вы не ходите дубировать код (как раз в этом месте можно использовать термин повторное использование кода) то вам необходимо отказываться от строчек на этапе обработки данных от пользователя.&lt;br /&gt;
&lt;br /&gt;
Так создавая новый тип const char* value = "Motif"; не забудьте создать одноименный класс и switch функцию, обеспечивающую создание одноименного объекта-свойсва на памяти. Хотя бы уж enum.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Необходимо заметить одну особенность изложения материала авторами. Банда четырех большие сторонники виртуализации и работы на памяти (с37). Парадигма, когда код становится несущественнным и менее приоритетным чем объект на памяти. Этим самым при чтении книги вас всегда подталкивают использовать паттеры как часть их концепции использующих память как ресурс. Тем самым как я уже говорил они создают воздушный замок, не читаемый сторонним наблюдателем. Отладка такой среды в разы трудней, так как вам необходима среда отладки с мощной системой визуализации.&lt;br /&gt;
&lt;br /&gt;
Другими словами, эти ребята писали код только под Microsot Visual Stidio.&lt;br /&gt;
&lt;br /&gt;
Хоть это и отдельная тема, которую я бы с удовольствием рассмотрел в отдельной статье. Я скажу пару слов и тут. Почему это интересно и большой объем для исследования? Приведу пример, вы никогда не задумывалиь почему большинство проектов под Линукс написано на простом плоском и могучем GObject (Objective-C)? Ответ простой: невозможно отлаживать виртуальный бред с кучей наследований на памяти. Но это нужно рассматривать подробней, в следующий раз...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основной мыслью, которую продвигают авторы книги сводится исключительно к работе с объектом на памяти. И все разговоры о том, что проект с испльзованием паттернов предполагает повторное использование, гибкость в модификации это всего лишь заблуждение авторов. Нельзя решить все проблемы в проекте, введя полную свободу в работу с объектом (с38). Утверждая что код не значит ничего, а виртуальная среда - все, меняя объект на памяти, а не в коде они получают виртуальную машину, а не язык паттернов. Это очень серезное заблуждение и ошибка приводящая к развалу проекта. Этот принцип, закрытости логических конструкций и перевод их&amp;nbsp; в виртуальную среду (память) усложняет процесс отладки и в корне лишает возможности проводить аналитический анализ исходного кода.&lt;br /&gt;
&lt;br /&gt;
Этот вывод подтерждает тот факт, что код это лишь отображение объектов и он имеет маленькую значимость (с37), то что с наследование на памяти нельзя переопределить (с38).&lt;br /&gt;
&lt;br /&gt;
Из чего я делаю вывод, что все паттерны&amp;nbsp; представленные в этой книге работающие с памятью это всего лишь плод воображения авторов считающих что язык их ограничивает. Таким путем были созданы не одни среды и новые языки, которые в полсдествии вернулись или постепенно начали возвращатся (к типизации, интерфейсам, шаблонам) к паратигмам С++. И эти структуры имеющют отношения к серезной разработке, и созданию качественного продукта. Абстрактные фабрики и другие паттерны, нуждающиеся в создании неконтролируемых структур, нужны в исключительных случаях, и за частую вносят большие затрудения в анализ исходного кода и повторное его использование.&lt;br /&gt;
&lt;br /&gt;
Я ожидают, что в скором времени эти ребята создадут новый язык, без типов, интерфейсов, без наследования и с возможностью переопределять любой метод любого класса. Конечно, такие среды уже есть, но как я уже сказал, все новое это хорошо забытое старое и авторы движутся именно по этому пути. Не делайте их ошибок!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Design_Patterns_%28book%29"&gt;http://en.wikipedia.org/wiki/Design_Patterns_%28book%29&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-6898924581621756439?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/6898924581621756439/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/12/blog-post_10.html#comment-form' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/6898924581621756439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/6898924581621756439'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/12/blog-post_10.html' title='Обман GoF (Книга)'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-4148348248724497169</id><published>2009-12-05T16:05:00.000+03:00</published><updated>2009-12-05T16:05:49.894+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>Больше вопросов...</title><content type='html'>Что бы вопросов становилось меньше, после публикации достаточно пространных текстов я хочу уточнить свою позицию.&lt;br /&gt;
&lt;br /&gt;
Почему я это пишу и вообще какое оно есть отношение к программированию и С++?&lt;br /&gt;
&lt;br /&gt;
Создается впечатление что вроде бы журнал не распологает к тем мыслям, которые я себе позволяю сюда писать. И вообще он о том как писать программы и развивать в себе системный подход к процессу программирования. А тексты, которые я иногда размещаю, похожы на филосовские размыление двоченика-шизофреника. Но!&lt;br /&gt;
&lt;br /&gt;
Материал излагается что в такой форме, что бы пролить свет на причины приводящие к образованию бизнеса и использованию той работы которую все программисты дружно не задумываясь делают. Создавая программу мы частенько не хотим знать, как наша программа попадет на рынок и будет помогать добрым людям решать их повседенвные проблеммы.&lt;br /&gt;
&lt;br /&gt;
Процесс разработки так же тесно связан с технологиями и методами работы на поле технических револци, с теми языками, средами, операцинными системами которые мы выбираем для решения наших задач. И вот эти все незаметные и проктически автоматически процессы выбора создают рынок, не заметный нашему потребителю - программисту. Такой рынок это ни что иное как еще один вид бизнеса, сосуществующего с остальной культурой программирования.&lt;br /&gt;
&lt;br /&gt;
Этот вид бизнеса мне особенно интересен и симпатичен в силу того, что он является образцом любой предпринимательской деятельности в отличии от типичного искуственного вставления нормативов и правил.&lt;br /&gt;
&lt;br /&gt;
Именно в такой незатейливой форме от простого к сложному, от незнания к совершенству создается и шлифуется любой процесс в том числе и разработки программ. И если вы сможете уловить эту суть, суть процесса, а не потоки денег, вы сможете зарабоать и добится большего успеха чем те, кто забыв обо всем стремится поднятся любыми честными и безчестными методами по карьерной лестнице.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;     В этой нелепости, противной здравому смыслу, было что-то символическое. И уступая ее многозначительности, доктору тоже хотелось выбежать на площадку и остановить гимназиста готовым, рвавшимся наружу изречением. Ему хотелось крикнуть и мальчику, и людям в вагоне что спасение не в верности формам, а в освобождении от них.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/i&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Б. Пастернак &lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-4148348248724497169?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/4148348248724497169/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/12/blog-post_05.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4148348248724497169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/4148348248724497169'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/12/blog-post_05.html' title='Больше вопросов...'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-8869206087412112461</id><published>2009-12-05T15:41:00.000+03:00</published><updated>2009-12-05T15:41:54.794+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>Это не история повторяется...</title><content type='html'>Это не история повторяется, это мы рождаемся и умераем и делаем ошибки тех, кто набив бобышки теперь мешает нам идти и поступать так же.&lt;br /&gt;
&lt;br /&gt;
Я уже писал о том, что программные среды появляющиеся как грибы на почве современных технологий под давлением глобализации являются следствием нескольких факторов. Во-первых: мы не хотим учится, нам проще делать ошибки и делать выводы о том, как не хорошо поступать. Во-вторых: нам навязывают идеи в интересах некоторых бизнес аудиторий, которая соориентирована на захват сфер влияния, пропаганды своих интересов и продвижении продуктов. В последствии для получения контроля над аудиторией (продвижение продуктов, и информационная пропоганда).&lt;br /&gt;
&lt;br /&gt;
Эти оба фактора способствуют созданию и росту среды вместе с ее адуиторией, несмотря на то что они все приходят всегда к одному и тому же и все что сейчас кажется новым уже было когда-то изобретено.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Начинать с начала свойствоенно людям. Они не хотят учится, хотят одним взмахом рукова создавать озера, бросив сотней баксов почувствовать себя сверх человеком, и за пять минут просмотра презентации понять и принять решение о "перспективности" идеи - разжеванная, кастированная информация лучше входит.&lt;br /&gt;
&lt;br /&gt;
Это касается не только развития большинства технологий и языковых средств, но так же свойственно в таких областях как хужожественная литература.&lt;br /&gt;
&lt;br /&gt;
Все любят фантастику, читать шизофрению о Сталине сражающемся с рептилиями, и борбе синих человечков с зелеными. Интересней (понятней так как у этих историй есть начало и конец) чем взять книгу Хокинга, и узнать как устроена вселенная (сложней, так как необходимо базироваться на опыте других людей).&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; &lt;i&gt;Пергаменты не утоляют жажды.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; Ключ мудрости не на страницах книг.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; Кто к тайнам жизни рвется мыслью каждой,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; В своей душе находит их родник.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;&lt;br /&gt;
Иоганн Гете (в переводе Б. Пастернак) &lt;/i&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-8869206087412112461?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/8869206087412112461/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/8869206087412112461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/8869206087412112461'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/12/blog-post.html' title='Это не история повторяется...'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-7050380433697452265</id><published>2009-11-21T18:57:00.002+03:00</published><updated>2009-11-21T21:34:06.045+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off topic'/><title type='text'>Купите нашу функцию...</title><content type='html'>Получил очередной красивый буклетик-открыту по почте с рекламмой авиакомпании. Написано о том как экономить, лучше и дельше летать, брать услуги в кридит с оформлением фирменной банковской карты. Потом написано, что еще можно делать с этой картой и на наших авиалиниях. Куда обращаться. Потом написано, мелким текстом, сноски в каких случаях действуют указанные условия, потом ссылка на сайт с дополнительной информацией, потом ссылка на номер и текст договора, потом еще какой-то pdf файл, потом я кинул эту бумажку в мусорку.&lt;br /&gt;
&lt;br /&gt;
Маркетинг просто переходит все мыслимые и не мыслимые границы. Сколько можно это терпеть нам потребителям их услуг? На плакатах, буклетах, в банерах, СМС рекламме всегда нам дают одну и туже сжатую, бесполезную информацию которая обрисованная одним красивым короткоим слогоном "Безлимитный интернет" и тонной мукулатуры с обезятельствами ползователя, которые вы должны прочитать, понять и принять.&lt;br /&gt;
&lt;br /&gt;
Я задаю вопрос: "Сколько еще это будет продолжаться?"&lt;br /&gt;
&lt;br /&gt;
Когда слова в рекламме наконец начнут отражать действительное положение вещей, а не быть ловким инструментом потоком легальной лжи со свех источников информации? Когда слогон "С нами быстрей" наконец будет объективен и мы точно будем знать принимая релкамный листок на что нам рассчитывать? Как облегчить потребителям, и рекламмодалеям взаимодействие не потеряв привыных моделей работы с аудиторией?&lt;br /&gt;
&lt;br /&gt;
Ведь я не против смотреть на контекстную реклмму от гугл, не против получать полезные и выгодные предложения от производителей тратуарной плитки или комерческих предложений в сфере мобильных услуг. Только текущее положение вещей не позволяет объективно оценть предложение по двум-трем словам и принять решение выгодно оно или нет. И вопрос заключается в том, как же так сделать что бы мне как потребителю было все понятно об условиях договора только по первому предложению?&lt;br /&gt;
&lt;br /&gt;
И я нашел выход из этой ситуации :)&lt;br /&gt;
&lt;br /&gt;
Вся сложность заключется в том, что получая такой реклмный буклетик, я первым делом представляю груды мукулатуры, которые мне предстоит изучить что бы принять объектинвое решение. Вся информация в рекламном листке это всего лишь миф родившийся в восполенном мозгу пиарщика, который ни каким образом не относится к реальному положению вещей (и вооще он не трезв был когда это писал). Так как в большинстве случаяв условия договоров просто грабительские или на худой конец ни чем не лучше уже имеющихся. Все что вы рискуете получить, начиная разбераться&amp;nbsp; с новым "кормерческим" предложением - это потреять время и понять что вам это ненужно.&lt;br /&gt;
&lt;br /&gt;
Так вот для облегчения этой работы я предлогаю на всех рекламных буклетах писать некоторое число, напирмер так: "Самый дешевый интернет [*3456/5]". Число в квардартных скобках это не сноска на договор, а отношение величины (или его обратная величина) всех сопутствующих материалов, документов, сносок и условий договора необходимых к прочтению (в словах) в соотношении с длинной данного слогона. Что бы исключить возможный перечень всех документов, в ключая и азбуку и школьным словарем необходимо вводить некоторые катергории относительной сложности документа, как в привиденном случае число 5 может означать среднее образование, или число 6 юридическое образование.&lt;br /&gt;
&lt;br /&gt;
Естественным образом введение такой системы привидет к сокращению объема общего объема метарилов к изучению буклета (первое число), удлиление слогонов и их больше объетивности (первое число) и их упрощении к восприятию, уменьшению сложности материала (второе число)!&lt;br /&gt;
&lt;br /&gt;
И потребители сразу оценив два числа смогут сказать, интересует их этот продукт или нет.&amp;nbsp; Скажем я не хочу читать больше 50 000 знаков для ознакомления с простыми решениями. И если содержимое буклета в словах длиной 100 слов в отношении к сопутствующей документации в 60 000 слов будет равно 600\5. Так я буду автоматически отбрасывать мелкие предложения в которых показатели выше 600\5 и читать показтель которых ниже :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-7050380433697452265?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/7050380433697452265/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/11/blog-post_21.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/7050380433697452265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/7050380433697452265'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/11/blog-post_21.html' title='Купите нашу функцию...'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-7344859105887643854</id><published>2009-11-11T00:11:00.000+03:00</published><updated>2009-11-11T00:11:30.248+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off topic'/><title type='text'>Вид из окна (реального, моего)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_lxb0VufVhSw/SvnW8hRCpTI/AAAAAAAAEhk/20w_mtz15ks/s1600-h/00001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_lxb0VufVhSw/SvnW8hRCpTI/AAAAAAAAEhk/20w_mtz15ks/s640/00001.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-7344859105887643854?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/7344859105887643854/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/11/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/7344859105887643854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/7344859105887643854'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/11/blog-post.html' title='Вид из окна (реального, моего)'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lxb0VufVhSw/SvnW8hRCpTI/AAAAAAAAEhk/20w_mtz15ks/s72-c/00001.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-9094911376771794207</id><published>2009-11-09T16:30:00.000+03:00</published><updated>2009-11-09T16:30:21.297+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><title type='text'>Snow Leopard USB Install</title><content type='html'>В сети можно найти довольно много материалов о том, как устновить новую операционную систему от Apple с помощью USB флешки. В большинстве инструкций (или во всех без исключения) необходимым компонентом является рабочая операционная система Mac OS X. То есть для того что бы выполнить указанную инструкцию по настройки USB stick на работу с Snow Leopard вам нужен рабочий компьютер с уже установленной операционной системой.&lt;br /&gt;
&lt;br /&gt;
Однако, основным поводом для создания этого резервного носителя с установщиком операционной системы является во первых: отстутствие работающего привода в копьютере (болезнь почти всех, если не всех, машин от apple под брендом MacBook), и само собой отсутствие работающей операционной системы.&lt;br /&gt;
&lt;br /&gt;
В таком случае куда возможней найти рабочий компьютер под управлением Windows или Linux машину, чем собственно компьютер под Mac OS X. Но к сожалению инструкции об настройки флешки под эти опреационные системы в сети нету.&lt;br /&gt;
&lt;br /&gt;
Я решил восполнить данный недостаток и написать инструкцию настройки USB флеш для установки Snow Leopard из под Linux.&lt;br /&gt;
&lt;br /&gt;
Для начала вам потребуется:&lt;br /&gt;
- Рабочая машина с Linux&lt;br /&gt;
- Образ Snow leopard в формате .iso&lt;br /&gt;
- Флешка размером минимум 8GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Первым делом загрузитесь в Linux и запустите утилиту &lt;a href="http://gparted.sourceforge.net/"&gt;gparted&lt;/a&gt;. И дале выполните следующие шаги:&lt;br /&gt;
&lt;br /&gt;
- инициализируйте диск с новой меткой разделов gpt (Device/Create Partition table).&lt;br /&gt;
- создайте 1 раздел 200 мегобайт с файловой системой fat32&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_lxb0VufVhSw/SvgWsv7z51I/AAAAAAAAEhM/liUkOKihDbM/s1600-h/Screenshot-Create+new+Partition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_lxb0VufVhSw/SvgWsv7z51I/AAAAAAAAEhM/liUkOKihDbM/s320/Screenshot-Create+new+Partition.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
- создайте 2 раздел под остальное место с файловой системой hfs+&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_lxb0VufVhSw/SvgWtisLa0I/AAAAAAAAEhU/0sLyI8L_aSg/s1600-h/Screenshot-Create+new+Partition-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_lxb0VufVhSw/SvgWtisLa0I/AAAAAAAAEhU/0sLyI8L_aSg/s320/Screenshot-Create+new+Partition-1.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- нажмите кнопку принять изменения.&lt;br /&gt;
&lt;br /&gt;
Затем, правой кнопкой мышки измените флаги первого раздела с msftree на boot.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_lxb0VufVhSw/SvgWuiEH4AI/AAAAAAAAEhc/a1iQtOAi41E/s1600-h/Screenshot-Manage+flags+on+-dev-sdb1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_lxb0VufVhSw/SvgWuiEH4AI/AAAAAAAAEhc/a1iQtOAi41E/s320/Screenshot-Manage+flags+on+-dev-sdb1.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После чего можете приступать к следующему этапу - записи раздела с образа snow leopard.iso&lt;br /&gt;
&lt;br /&gt;
Прежде чем начать запись раздела, вам необходимо определить где он на диске находится. Дело в том что формат диска с операционной системой Mac OS X не совсем стандартный образ. В нем записано два образа, первый с драйверами под Windows, а второй - установщик Mac OS X. Для того чтобы найти указанный рездел (смещение для него) необходимо использовать утилиту hexedit.&lt;br /&gt;
&lt;br /&gt;
Открываем образ snowleopard командой hexedit snow leopard.iso и выполняем поиск hex-последовательности "482b0004". Для моего образа snow leopard билда 10A432 (Snow Leopard 10.6.0) смещения такие:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3DA91400&amp;nbsp;&amp;nbsp; 48 2B 00 04&amp;nbsp; 00 00 01 00&amp;nbsp; 31 30 2E 30&amp;nbsp; 00 00 00 00&amp;nbsp; H+......10.0....&lt;br /&gt;
3DA91410&amp;nbsp;&amp;nbsp; C6 9B F3 4E&amp;nbsp; C6 9C 6F 67&amp;nbsp; 00 00 00 00&amp;nbsp; C6 9C 55 BE&amp;nbsp; ...N..og......U.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Что бы переместить указанную патицию прямо на патицию флешки выполняем следующую последовательность команд:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# /sbin/losetup -o 1034489856 /dev/loop0 snowleopard.iso &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# dd if=/dev/loop0 of=/dev/sdb2 bs=5M&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число 1034489856 - это шестнацатеричное 3DA91000.&lt;br /&gt;
Устройства /dev/sdb2 - это второй рездел флеш диска созданнго через программу gparted. &lt;br /&gt;
&lt;br /&gt;
Минут через десять команда dd выполнится и USB-stick готов для работы. &lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cat snow leopard.iso | md5&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;f303591a8cc124d68f10155b10696348&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cat snow leopard.iso | shasum&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;9e92a6c8c0b166fd8ea6442ccb6d32025e349cbd&amp;nbsp; -&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Snow Leopard 10.6 build 10A432 golden master&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ссылки по теме:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.64lines.com/mounting-hfs-plus"&gt;http://www.64lines.com/mounting-hfs-plus&lt;/a&gt;&lt;b&gt; &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.maciverse.com/install-os-x-snow-leopard-from-usb-flash-drive.html"&gt;http://www.maciverse.com/install-os-x-snow-leopard-from-usb-flash-drive.html&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-9094911376771794207?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/9094911376771794207/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/11/snow-leopard-usb-install.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/9094911376771794207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/9094911376771794207'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/11/snow-leopard-usb-install.html' title='Snow Leopard USB Install'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lxb0VufVhSw/SvgWsv7z51I/AAAAAAAAEhM/liUkOKihDbM/s72-c/Screenshot-Create+new+Partition.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-6818183260465745578</id><published>2009-11-02T15:13:00.000+03:00</published><updated>2009-11-02T15:13:56.523+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>VirtualBox 3 raw access to hard drive</title><content type='html'>Как подключить реальный жесткий диск к &lt;a href="http://blog.axet.ru/2007/09/virtualbox.html"&gt;VirtualBox 2.0&lt;/a&gt; я уже писал раньше. В предыдущей версии к сожалению были проблемы работы с подключением жесткого  диска из под OS X. В последней версии такая проблема была устранна.&lt;br /&gt;
&lt;br /&gt;
Вот примеры использования:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mac OS X:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Работать с реальым жестким диском не рекомендуется из под простого пользователя из за слижком больших прав на изменение данных. Поэтому будет лучше создать виртуальную машину из под учетной записи администратора, и уже специально для нее открыть доступ к жесткому диску. Для этого откройте консоль, и напишите &lt;i&gt;sudo su&lt;/i&gt;, после чего VirtualBox для запуска менеджера виртуальных машин. Тем самым вы запустите VirtualBox под учетной записью администратора, что не позволит случайно изменить данные на жестком диске простым пользователям. Виртуальную машину лучше создайте под именем localhost, без каких либо дополнительных параметров, только на всякий случай создайте вируальный жесткий диск с параметрами по умолчанию (ни размер, ни имя менять не нужно).&lt;br /&gt;
&lt;br /&gt;
Далее вам необходимо создать файл vmdk, открывающий доступ к жесткому диску для виртуальной машины. Для этого придется сделать несколько действий, так как в VB есть ошибка под номером &lt;a href="http://www.virtualbox.org/ticket/1461"&gt;1461&lt;/a&gt;. Если в будущем ее исправят, то процедура создания vmdk диска упростится до следующей:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;# sudo su&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;# VBoxManage internalcommands createrawvmdk -filename ~/Library/VirtualBox/HardDisks/localhost.vmdk -rawdisk /dev/disk0 -partitions 0,1,3,4&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При создании диска учитывайте какие разделы своего жесткого диска вы хотели использовать под виртуальной машиной, но учтите: необходимо пропустить все партиции которые использует операционная система, по просту она заблокирует создание диска со смантированными партициями. В моем случае я игнорирую партицию номер 2 с установленной и запущенной Mac OS X. Для того что бы увидеть список партиций введите команду:&lt;br /&gt;
&lt;br /&gt;
# VBoxManage internalcommands listpartitions -rawdisk /dev/disk0&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VirtualBox Command Line Management Interface Version 3.0.10&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(C) 2005-2009 Sun Microsystems, Inc.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;All rights reserved.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Number&amp;nbsp; Type&amp;nbsp;&amp;nbsp; StartCHS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EndCHS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size (MiB)&amp;nbsp; Start (Sect)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xee&amp;nbsp; 1023/254/63&amp;nbsp; 1023/254/63&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xaf&amp;nbsp; 1023/254/63&amp;nbsp; 1023/254/63&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40879&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 409640&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x83&amp;nbsp; 1023/254/63&amp;nbsp; 1023/254/63&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 395020&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 84557864&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x07&amp;nbsp; 1023/254/63&amp;nbsp; 1023/254/63&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40631&amp;nbsp;&amp;nbsp;&amp;nbsp; 893558872&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Кроме того, Mac OS X частенько монтирует виндус раздел при старте системы, поэтому для успешной работы команды createrawvmdk вам придется его вручную отмонтировать.&lt;br /&gt;
&lt;br /&gt;
Так как в настоящий момент ошибка 1461 не исправлена, то процедура создания vmdk файла несколько усложняется. Вы его просто напросто создадите руками. Для этого вызовите команду:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;# gpt -r show /dev/disk0&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;gpt show: /dev/disk0: Suspicious MBR at sector 0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&amp;nbsp; index&amp;nbsp; contents&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MBR&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pri GPT header&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pri GPT table&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 34&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 409600&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp; GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 409640&amp;nbsp;&amp;nbsp; 83722224&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp; GPT part - 48465300-0000-11AA-AA11-00306543ECAC&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 84131864&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 426000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; 84557864&amp;nbsp; 809001008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&amp;nbsp; GPT part - EBD0A0A2-B9E5-4433-87C0-68B6B72699C7&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; 893558872&amp;nbsp;&amp;nbsp; 83214256&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp; GPT part - EBD0A0A2-B9E5-4433-87C0-68B6B72699C7&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; 976773128&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; 976773135&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sec GPT table&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; 976773167&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sec GPT header&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Далее используя эту таблицу мы видим физическое распределение секторов на диске (предыдущая команда VBoxManage internalcommands listpartitions показывала логические сектора). Далее выполните команду создания жесткого диска через VirtualBox, как показано в рабочем примере, но создающую не правильный жесткий диск из за ошибки 1461.&lt;br /&gt;
&lt;br /&gt;
Вот пример части файла vmdk, который создала VirutualBox:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# Extent description&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RW 1 FLAT "localhost-pt.vmdk"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RW 409639 FLAT "/dev/disk0s1"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RW 83722224 ZERO &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RW 426000 ZERO &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RW 809001008 FLAT "/dev/disk0s3"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RW 83214256 FLAT "/dev/disk0s4"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RW 40 ZERO &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Как мы видим, первый сектор диска (загрузчик) помечан 1 сектором. И явно указывает на логическое разбиение диска, нам же нужно повторить физическую его структуру для этого меняем значения в секции # Extent description на следующие:&lt;br /&gt;
&lt;br /&gt;
# Extent description&lt;br /&gt;
RW 40 FLAT "localhost-pt.vmdk"&lt;br /&gt;
RW 409600 FLAT "/dev/disk0s1"&lt;br /&gt;
RW 83722224 ZERO &lt;br /&gt;
RW 426000 ZERO &lt;br /&gt;
RW 809001008 FLAT "/dev/disk0s3"&lt;br /&gt;
RW 83214256 FLAT "/dev/disk0s4"&lt;br /&gt;
RW 40 ZERO &lt;br /&gt;
&lt;br /&gt;
Как не солжно догадатся, мы просуммировали длинну gpt информации о диске взятой из вывода команды gpt show (1 + 1 + 32 + 6) == 40. Далее, чуть чуть подкорректировали размер первого раздела, и оставили без изменения остальные значения. Так как они полностью совпадают со значениями из вывода gtp show утилиты.&lt;br /&gt;
&lt;br /&gt;
В целом мы почти закончили. Нехватает только скопировать данные с нашего реального диска в файл раздела localhost-pt.vmdk. Делется это командой:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;# dd if=/dev/disk0 of=localhost-pt.vmdk count=40 bs=512&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
После чего запускаем VirtualBox и монтируем наш vmdk жесткий диск вместо виртуального присоединенного к localhost.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;# VirtualBox&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Linux:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Работа с родным жестим диском из под линукса схожа с работой из под OS X. Вам так же необходимо использовать две учетные записи из под пользователя и супер пользователя (root).&lt;br /&gt;
&lt;br /&gt;
Создание образа диска делается следующей командой:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;# VBoxManage internalcommands createrawvmdk -filename ~/.VirtualBox/HardDisks/localhost.vmdk -rawdisk /dev/sda&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее необходимо создать вайл для запуска хост машины:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;~/localhost.sh&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#!/bin/bash&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# монтирование папки с образами OS&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;gvfs-mount smb://mini.local/www&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/sbin/sfdisk&amp;nbsp; -A4 /dev/sda&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VBoxManage startvm localhost&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
И запускать его с помощью dbus-launch, обеспечив тем самым возможность монтирования файловой системы gvfs. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Windows XP&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Работа из под Windows XP несколько проще, так как вам ненужно запускать отдельную учетую запись.&lt;br /&gt;
&lt;br /&gt;
Для создание диска нажмите Win_key+R и выполните слудющую команду:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;"C:\Program Files\Sun\xVM VirtualBox\VBoxManage" internalcommands createrawvmdk -filename "%USERPROFILE%\.VirtualBox\HardDisks\localhost.vmdk" -rawdisk \\.\PhysicalDrive0 &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Запуск виртуальной ос лучше осуществлять следующими запускающими файлами:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;c:\soft\localhost.bat&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;diskpart /s localhost.txt&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;start "VB" "C:\Program Files\Sun\VirtualBox\VirtualBox"&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;c:\soft\localhost.txt&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sel disk 0 &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sel part 3 &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;act&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ссылки по теме:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.jardinmagique.info/2009/08/setup-virtualbox-on-macosx-to-boot.html"&gt;http://blog.jardinmagique.info/2009/08/setup-virtualbox-on-macosx-to-boot.html&lt;/a&gt;&lt;b&gt; &lt;br /&gt;
&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-6818183260465745578?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/6818183260465745578/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/11/virtualbox-3-raw-access-to-hard-drive.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/6818183260465745578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/6818183260465745578'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/11/virtualbox-3-raw-access-to-hard-drive.html' title='VirtualBox 3 raw access to hard drive'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-7197008750072527764</id><published>2009-10-02T00:24:00.000+04:00</published><updated>2009-10-02T00:24:00.191+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>Stay with Linux</title><content type='html'>&lt;span style="font-family: Courier New;"&gt;Не так просто понять, что значит счастье, но так просто быть вместе.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;span style="font-family: Courier New;"&gt;Вся  моя мысль в том, что ежели люди порочные связаны между, собой и составляют силу, то людям честным надо сделать только то же самое. Ведь как просто.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: right;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;i&gt;Л. Н. Толстой &lt;/i&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-7197008750072527764?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/7197008750072527764/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/10/stay-with-linux.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/7197008750072527764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/7197008750072527764'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/10/stay-with-linux.html' title='Stay with Linux'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-5797414080534968337</id><published>2009-09-28T10:11:00.004+04:00</published><updated>2009-09-28T14:27:47.963+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Stay away from Erlang</title><content type='html'>Если система не имеет устоявшихся правил и постоянно модифицируется это свидетельствует об ошибках проектирования в самом начале пути. Можно безконечно заниматся модификациями и улучшениями, стараясь достигнуть совершенства и баланса всех ее составляющих. Но такой путь возможен при соблюдении нескольких условий.&lt;br /&gt;
&lt;br /&gt;
Во-первых: при каждой существенной итерации система должна качественно улучшатся, избегая ошибок которые были допущены в плилотных версиях продукта.&lt;br /&gt;
&lt;br /&gt;
Во-вторых: частое испралвение ошибок, слабый рост, в догоняющей позиции должен компенсироваться революционными идеями способными вместить в себя все предыдущие технологии в наиболее выгодном свете.&lt;br /&gt;
&lt;br /&gt;
И, наконец, третье: такой рост возможен лишь с согласия всех лиц у чавствующих в разработке и использовании этой системы.&lt;br /&gt;
&lt;br /&gt;
Получается, что как только аудитория становится более грамотной, переростает систему и ее авторов система умерает. Это происходит постепенно и нужно лишь ждать когда автор, ее идейный вдохновитель поймет свое бессилие и откажется догонять впереди его идующую толпу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очень наглядный тому пример можно увидеть в этом интервью.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/interviews/armstrong-peyton-jones-erlang-haskell"&gt;http://www.infoq.com/interviews/armstrong-peyton-jones-erlang-haskell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;Беседуют два уже не молодых человека. Каждый придерживается своей системы и своих взглядов. У каждого свое представлние об одних и тех же технолгиях (функциональном программировании, например), но они продолжают улыбаться друг другу и вести дружелюбную беседу. Вот она: полит корректность.&lt;br /&gt;
&lt;br /&gt;
Для того чтобы двум людям, совершенно разных взглядов быть так приветливым необходимо: либо быть настоящим лицимером, политиком, либо иметь хорошую выдержку и понимать, что слабую технологию легче всего поглотить, чем воевать против нее.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
SPJ: Whenever you've got concurrency and multiple processes working, you need to be very careful about side effects. Otherwise it just does your head in. Something that Haskell and Erlang both share is being careful about effects. Haskell is sort of super-careful and Erlang is merely careful, but in both cases, we don't have this, unrestricted side effects all the time, the computational fabric being effectful. It seems to me it makes it jolly hard to write programs that exploit multithreads.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
JA: And the garbage collector doesn't need to know about what types are generated.&lt;br /&gt;
&lt;br /&gt;
SPJ: Oh the garbage collector, that's not a problem. Our garbage collectors are complicated, not because of types, it knows nothing of types.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
SPJ: Do you have any profiling tools? &lt;br /&gt;
&lt;br /&gt;
JA: Yes, sure. &lt;br /&gt;
&lt;br /&gt;
SPJ: So, you can see "Oh, this process is stalled."&lt;br /&gt;
&lt;br /&gt;
JA: What's interesting is when you are finding the sequentiality.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
JA: With each new generation of chips, it's... We don't know what's going to happen.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
JA: When you're developing Erlang, you don't have to write the entire program to get it to work, and you're not quite sure what the types are. In Erlang you just write some program here, and you evaluate something and it throws out this great big thing and you say: "Oh, that's what the type was". Then you can say: "Well that wasn't quite right, let's change it to that". But you're not restricted in having to get all the bits working before you can just do those experiments. Wouldn't you miss something like that?&lt;br /&gt;
&lt;br /&gt;
SPJ: You still don't have to get all the bits working, you have to think of what type you might have, but you might evolve that type. &lt;br /&gt;
&lt;br /&gt;
JA: Or you can just run it and see. We have things called parse transforms which allow you to change them. In a module you can say there's a parse transform, and the parse transform is given the parse tree of the program and it can turn it into another parse tree before it's given to the compiler. That's a way of doing deeply sinful things that you normally can't do. And the nice thing about that is, somebody has asked me "How do I get started with this?"&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ссылки по теме:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/interviews/armstrong-peyton-jones-erlang-haskell"&gt;http://www.infoq.com/interviews/armstrong-peyton-jones-erlang-haskell&lt;/a&gt; &lt;i&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://book.realworldhaskell.org/read/"&gt;http://book.realworldhaskell.org/read/&lt;/a&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-5797414080534968337?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/5797414080534968337/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/09/stay-away-from-erlang.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/5797414080534968337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/5797414080534968337'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/09/stay-away-from-erlang.html' title='Stay away from Erlang'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-2465314705584569061</id><published>2009-09-26T22:02:00.003+04:00</published><updated>2009-09-26T22:15:43.999+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ati'/><category scheme='http://www.blogger.com/atom/ns#' term='macbook pro'/><category scheme='http://www.blogger.com/atom/ns#' term='linux bugs'/><title type='text'>Macbook Pro USB flash boot (part 2)</title><content type='html'>&lt;a href="http://blog.axet.ru/2009/05/macbook-pro-usb-flash-boot.html"&gt;&amp;nbsp;- Macbook Pro USB flash boot (part 1)&lt;/a&gt;&lt;b&gt; &lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Fedora 12 Snap3&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Подготавливаясь к предстоящему резилу Fedora 12 решил провести основные тесты на своих машинах. У меня два ноутбука Asus M3N (живучий малый) и MacBook Pro 2.1 (железный малый), и один mac mini (Ну совсем маленький. Он не дорос доучастия в тестах). На обоих машинах я испытывал те или иные проблемы связанные с различными аспектами работы системы. Начиная от загрузки и заканчивая поддержкой различных устройств.&lt;br /&gt;
&lt;br /&gt;
Могу сказать сразу: результаты внушают оптимизм и некоторые старые ошибки оказались исправлены. Что же касается новых фукнций (автоматическая отправка ошибок, переработанный anaconda устновщик, и ряд других, которые я не успел толком опробовать) они заставляют ждать резил Fedora 12 с нетерпением.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Не буду описывать все составляющие моего щастья связанные с Fedora 12. Опишу только все еще не решенную проблему с загрузкой с usb через EFI loader.&lt;br /&gt;
&lt;br /&gt;
Всего существует 2 способа загрузки ноутбука MacBook Pro с usb насителя:&lt;br /&gt;
&amp;nbsp;- загрузка с использованием efi загрузчика&lt;br /&gt;
&amp;nbsp;- непосредственная загрузка с одного из 4 разделов mbr диска.&lt;br /&gt;
&lt;br /&gt;
Первый (efi) использует расширенные фукнции переферии (EFI) и ориентируясь на разделы gpt диска может произвести загрузку с одного из 128 разделов. Что выгодно отличает этот способ загрузки от старого проверенного bios загрузчика поддерживающего всего 4 раздела на жестком диске.&lt;br /&gt;
&lt;br /&gt;
Дальше больше. Так как современное ядро линукса научилось не только работать с жестким диском по всем современным технологиям, но уже начинает перенимать на себя и остальные фукнции операционной системы (постепенно разбухая и накапливая новый фукнционал). Так, совсем недавно, появилась новая фукнция ядра называемая KMS (Kernel mode settings). Мехнизм позволяющий иницилизировать видео карту в ядре с последующей передачей видео контекста в пользовательское приложение графического интерфейса (менеджера окон или других программ с поддержкой GUI). Эта новая фукнция не всегда работает хорошо и в некоторых случаях производит иницилаизацию ведео карты не правильно. Что в свою очередь приводит к зависанию системы сразу после загрузки ядра. Это еще одно условие успешной загрузки с usb flash. &lt;br /&gt;
&lt;br /&gt;
Кроме того, имеет место сборка grub, и сборка X-server.&lt;br /&gt;
&lt;br /&gt;
Так у нас получается некоторый набор условий неудачное совпадение которых может приводить к падению системы. Что мы и попробуем перечислить все возможные варианты:&lt;br /&gt;
&lt;br /&gt;
Вот приблизительные варианты загрузки:&lt;br /&gt;
&lt;br /&gt;
rEFIT \ Alt boot -&amp;gt; EFI \ BIOS -&amp;gt; USB \ HDD -&amp;gt; fedora grub \ grub2 -&amp;gt; KMS \ nomodeset&lt;br /&gt;
&lt;br /&gt;
Попробуем проверить все эти комбинации на практике:&lt;br /&gt;
&lt;br /&gt;
1) rEFIT -&amp;gt; EFI -&amp;gt; USB -&amp;gt; fedora grub -&amp;gt; В обоих случаях (KMS\nomodeset) зависание после включение grub, ядро не может инициализировать видео вывод и картинка menu grub не исчезает)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_lxb0VufVhSw/Sr5VBkyXy9I/AAAAAAAAEfM/d5PIqJ-_8zI/s1600-h/00011.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_lxb0VufVhSw/Sr5VBkyXy9I/AAAAAAAAEfM/d5PIqJ-_8zI/s320/00011.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) rEFIT -&amp;gt; EFI -&amp;gt; USB -&amp;gt; grub2 -&amp;gt; KMS (Порча экрана после загрузки ядра и зависание)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_lxb0VufVhSw/Sr5V-6BRAQI/AAAAAAAAEfU/EwGOndzAQ5k/s1600-h/00008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_lxb0VufVhSw/Sr5V-6BRAQI/AAAAAAAAEfU/EwGOndzAQ5k/s320/00008.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3) rEFIT -&amp;gt; EFI -&amp;gt; USB -&amp;gt; grub2 -&amp;gt; nomodeset -&amp;gt; Загрузка до запуска X server и падение x servera&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_lxb0VufVhSw/Sr5WWLrV-6I/AAAAAAAAEfc/RoeUB6KsJdo/s1600-h/00010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_lxb0VufVhSw/Sr5WWLrV-6I/AAAAAAAAEfc/RoeUB6KsJdo/s320/00010.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4) rEFIT -&amp;gt; BIOS -&amp;gt; USB -&amp;gt; В обоих случаях (KMS\nomodeset) остановка загрузки - проблема с прошивкой MacBook Pro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_lxb0VufVhSw/Sr5Wo1dO01I/AAAAAAAAEfk/-OvpHse3nTI/s1600-h/00006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_lxb0VufVhSw/Sr5Wo1dO01I/AAAAAAAAEfk/-OvpHse3nTI/s320/00006.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
5) rEFIT -&amp;gt; BIOS -&amp;gt; HDD -&amp;gt; fedora grub -&amp;gt; В обоих случаях (KMS/nomodeset) успешная загрузка&lt;br /&gt;
&lt;br /&gt;
Из выше привиденных тестов можно сделать вывод: во-первых прошивка macbook pro несколько старовата, apple не желает их поддерживать. во-вторых загрузка linux через EFI всегда приводит к проблемам инициализации контекста видео карты. И в противовес последнему утверждению, загрузка&amp;nbsp; через BIOS ядра линукса всегда успешная.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-2465314705584569061?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/2465314705584569061/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/09/macbook-pro-usb-boot-part-2.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/2465314705584569061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/2465314705584569061'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/09/macbook-pro-usb-boot-part-2.html' title='Macbook Pro USB flash boot (part 2)'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_lxb0VufVhSw/Sr5VBkyXy9I/AAAAAAAAEfM/d5PIqJ-_8zI/s72-c/00011.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-3899288914587766478</id><published>2009-09-26T16:09:00.004+04:00</published><updated>2009-09-26T20:09:40.861+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistic'/><title type='text'>Обзор ОС посетителей</title><content type='html'>&lt;table border="0" cellspacing="0" cols="3" frame="VOID" rules="NONE"&gt;&lt;colgroup&gt;&lt;col width="19"&gt;&lt;/col&gt;&lt;col width="204"&gt;&lt;/col&gt;&lt;col width="67"&gt;&lt;/col&gt;&lt;/colgroup&gt;  &lt;tbody&gt;
&lt;tr&gt;    &lt;td align="RIGHT" bgcolor="#000000" height="19" sdnum="1033;0;@" sdval="1" style="border-left: 1px solid rgb(0, 0, 0); border-top: 1px solid rgb(0, 0, 0);" width="19"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="color: white; font-family: Thorndale; font-size: small;"&gt;1&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff" style="border-top: 1px solid rgb(0, 0, 0);" width="204"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;Opera / Windows &lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff" style="border-right: 1px solid rgb(0, 0, 0); border-top: 1px solid rgb(0, 0, 0);" width="67"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;21,75&amp;nbsp;%&lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td align="RIGHT" bgcolor="#000000" height="19" sdnum="1033;0;@" sdval="2" style="border-left: 1px solid rgb(0, 0, 0);"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="color: white; font-family: Thorndale; font-size: small;"&gt;2&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;Firefox / Windows &lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff" style="border-right: 1px solid rgb(0, 0, 0);"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;19,46&amp;nbsp;%&lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td align="RIGHT" bgcolor="#000000" height="19" sdnum="1033;0;@" sdval="3" style="border-left: 1px solid rgb(0, 0, 0);"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="color: white; font-family: Thorndale; font-size: small;"&gt;3&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;Firefox / Linux &lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff" style="border-right: 1px solid rgb(0, 0, 0);"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;16,10&amp;nbsp;%&lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td align="RIGHT" bgcolor="#000000" height="19" sdnum="1033;0;@" sdval="4" style="border-left: 1px solid rgb(0, 0, 0);"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="color: white; font-family: Thorndale; font-size: small;"&gt;4&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;Internet Explorer / Windows &lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff" style="border-right: 1px solid rgb(0, 0, 0);"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;14,31&amp;nbsp;%&lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;   &lt;/tr&gt;
&lt;tr&gt;    &lt;td align="RIGHT" bgcolor="#000000" height="19" sdnum="1033;0;@" sdval="5" style="border-bottom: 1px solid rgb(0, 0, 0); border-left: 1px solid rgb(0, 0, 0);"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="color: white; font-family: Thorndale; font-size: small;"&gt;5&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff" style="border-bottom: 1px solid rgb(0, 0, 0);"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;Safari / Macintosh &lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;    &lt;td align="LEFT" bgcolor="#ffffff" style="border-bottom: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);"&gt;&lt;span style="color: black; font-family: Thorndale; font-size: small;"&gt;7,59&amp;nbsp;%&lt;/span&gt;&lt;br /&gt;
&lt;/td&gt;   &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-3899288914587766478?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/3899288914587766478/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/09/blog-post.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/3899288914587766478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/3899288914587766478'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/09/blog-post.html' title='Обзор ОС посетителей'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-744564765005137629</id><published>2009-09-24T22:28:00.001+04:00</published><updated>2009-09-24T22:29:01.673+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>t = malloc(...</title><content type='html'>Java 1.4, XSD, Java 1.5, Web2.0, Erlang, C, Flash, Flex SDK, HTML, IE, Opera, C#, docs.google.com, bing.com, QT4, C++, Eclipse, QT4.5, livejournal.com, XLT, Python, ICQ, OpenGL, VirtualBox, OpenSUSE, Skype, Google Talk, yandex.ru, kms, XEN, Bluetooth, Direct3D, WiMax, Firefox, google.com, blogspot.com, Netbeans, ... &lt;br /&gt;
&lt;br /&gt;
Разгоняемся... ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;span style="font-family: Courier New;"&gt;Пфуль был один из тех безнадежно, неизменно, до мученичества самоуверенных людей, которыми только бывают немцы, и именно потому, что только немцы бывают самоуверенными на основании отвлеченной идеи-науки, то есть мнимого знания совершенной истины. Француз бывает самоуверен потому,   что   он   почитает   себя   лично,  как   умом,  так   и   телом, непреодолимо-обворожительным  как  для мужчин, так и  для женщин. Англичанин самоуверен на  том  основании, что  он есть гражданин благоустроеннейшего  в мире государства,  и потому, как англичанин,  знает  всегда,  что ему делать нужно, и  знает, что  все, что он делает как англичанин,  несомненно хорошо. Итальянец самоуверен  потому, что он  взволнован и забывает  легко и  себя и  других. Русский самоуверен именно потому, что  он ничего не знает и знать не хочет, потому что не верит, чтобы можно было  вполне знать что-нибудь.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div style="text-align: right;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Л. Н. Толстой&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-744564765005137629?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/744564765005137629/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/09/t-malloc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/744564765005137629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/744564765005137629'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/09/t-malloc.html' title='t = malloc(...'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1793630632384489392.post-8131861421748306227</id><published>2009-09-20T15:23:00.001+04:00</published><updated>2009-09-20T15:28:29.382+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>gencodingconverter-1.1.0</title><content type='html'>После борьбы с непобедимой ленью я все же нашел в себе силы дописать плагин для конвертирования файлов на лету для &lt;a href="http://projects.gnome.org/gedit/"&gt;Gedit&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
В новой версии вы сможете:&lt;br /&gt;
- Настраивть список интересующих вас кодировок&lt;br /&gt;
- Использовать диалог наглядного преобразования кодировок&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Недостаки:&lt;br /&gt;
- слабая поддержка encoding API приложеиня gedit (в коде есть некоторые хаки)&lt;br /&gt;
- не удобный функционал Gtk.ComboBox который съеадет нажатие enter у диалога&lt;br /&gt;
- небольшие проблемы порядком следования кодировок (они сортируются произвольно)&lt;br /&gt;
&lt;br /&gt;
Получить эту утилиту можно по адресу: &lt;a href="http://code.google.com/p/gencodingconverter/"&gt;http://code.google.com/p/gencodingconverter/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1793630632384489392-8131861421748306227?l=blog.axet.ru' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.axet.ru/feeds/8131861421748306227/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://blog.axet.ru/2009/09/gencodingconverter-110.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/8131861421748306227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1793630632384489392/posts/default/8131861421748306227'/><link rel='alternate' type='text/html' href='http://blog.axet.ru/2009/09/gencodingconverter-110.html' title='gencodingconverter-1.1.0'/><author><name>axet</name><uri>http://www.blogger.com/profile/13818535575397404266</uri><email>kuznetsov.alexey@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01406980049468937479'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>