<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4327883890491130768</atom:id><lastBuildDate>Thu, 16 Feb 2012 10:17:25 +0000</lastBuildDate><category>ruby</category><category>школа</category><category>Visual Studio</category><category>Microsoft</category><category>MingW</category><category>web</category><category>локаль</category><category>Rails</category><category>locale</category><category>DLL</category><category>Tcl</category><category>iTV</category><category>IDE</category><category>кириллица</category><category>C++</category><category>C#</category><category>суперкомпьютер</category><category>бесплатные среды разработки</category><category>Linux</category><category>книги</category><category>html</category><category>RoR</category><category>Ubuntu</category><category>Android</category><category>программирование</category><title>Программерские заметки</title><description /><link>http://alexeyprogrammer.blogspot.com/</link><managingEditor>noreply@blogger.com (Алексей)</managingEditor><generator>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/alexeyprogrammer" /><feedburner:info uri="alexeyprogrammer" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-3668268847669342231</guid><pubDate>Tue, 21 Sep 2010 21:07:00 +0000</pubDate><atom:updated>2010-09-22T01:29:24.385+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android</category><title>Перспективы Windows Phone 7</title><description>Пару дней назад я из интереса посмотрел средства разработки под Андроид и после этого понял, что перспективы у Windows Phone 7 таки есть. &lt;br /&gt;&lt;br /&gt;В качестве средств разработки Гугл предлагает Eclipce с соответствующим плагином. В комплекте так же идёт эмулятор устройств на базе Android. Редактировать и отлаживать Java-код при этом вполне удобно. Но потом я посмотрел на редактор интерфейсов... Он просто ужасен. Я честно старался, но так и не смог найти, можно ли в нём перемещать уже размещённые на форме контролы. К счастью, есть и отдельный редактор - &lt;a href="http://www.droiddraw.org/"&gt;DroidDraw&lt;/a&gt;. Он также весьма далёк от совершенства, но им по крайней мере можно пользоваться. Похоже что Гуглу придётся приложить крайне много усилий, чтобы хотя бы приблизится к Apple с их Interface Builder или Microsoft с Visual Studio и Expression Blend. &lt;br /&gt;&lt;br /&gt;Так что для разработчиков сейчас платформа WP7 имхо представляет больше возможностей для быстрого создания красивых и удобных приложений, чем Андроид.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-3668268847669342231?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/3wObFKQ3ulE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/3wObFKQ3ulE/windows-phone-7.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>1</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2010/09/windows-phone-7.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-8369202965505895175</guid><pubDate>Thu, 27 Nov 2008 14:28:00 +0000</pubDate><atom:updated>2008-12-11T15:55:55.857+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">суперкомпьютер</category><title>Суперкомпьютер</title><description>В этом году я решил продолжить своё образование и поступил учиться в аспирантуру. В немалой степени меня на это сподвигло появление в университете суперкомпьютера. Да и школа меня успела весьма утомить. =)&lt;br /&gt;Основная моя цель - получить практический опыт реализации параллельных распределённых вычислений. В рамках научной работы нужно будет построить вычислительную модель определённых физических процессов, использующую возможности, предоставляемые значительной вычислительной мощью суперкомпьютера.&lt;br /&gt;В данный момент я изучаю общие принципы реализации параллельных алгоритмов в системах с распределённой памятью с использованием MPI.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-8369202965505895175?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/KCFNx4E58VE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/KCFNx4E58VE/blog-post.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/11/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-1547841390198389994</guid><pubDate>Wed, 22 Oct 2008 07:52:00 +0000</pubDate><atom:updated>2008-10-22T10:58:40.565+03:00</atom:updated><title>Позновательный блог</title><description>Мне тут попалась ссылка на интересный блог о полезных мелочах в Visual Studio. В основном речь идёт о комбинациях клавиш. Я для себя увидел несколько, которые буду использовать. Так что читайте &lt;a href="http://blogs.msdn.com/rusaraford/default.aspx"&gt;Секреты Visual Studio&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-1547841390198389994?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/wH_FX9xQdL0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/wH_FX9xQdL0/blog-post.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>1</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/10/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-7366937879726021186</guid><pubDate>Fri, 11 Jul 2008 09:43:00 +0000</pubDate><atom:updated>2008-07-11T13:00:51.069+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Прикольная штука</title><description>Только что обнаружил в &lt;a href="http://blogs.gotdotnet.ru/personal/mbakirov/PermaLink.aspx?guid=654d1181-c71f-4058-8983-0a26cf71688c"&gt;инете &lt;/a&gt;достаточно интересную возможность в Visual Studio.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-7366937879726021186?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/OA6IAQtG1Fw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/OA6IAQtG1Fw/blog-post_11.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/07/blog-post_11.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-6383594865061609510</guid><pubDate>Thu, 10 Jul 2008 07:30:00 +0000</pubDate><atom:updated>2008-07-10T13:56:52.934+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">книги</category><title>Разработка пользовательского интерфейса</title><description>Недавно прочитал достаточно интересную книгу, посвящённую разработке пользовательских интерфейсов. Это &lt;a href="http://www.ozon.ru/context/detail/id/3441925/"&gt;Разработка пользовательских интерфейсов&lt;/a&gt; Дженифер Тидвелл. Автор - дизайнер и программист из компании MathWorks, разработчика MatLab. Книга содержит в себе большое количество шаблонов(паттернов) проектирования пользовательских интерфейсов. Подход к формированию материала книги аналогичен классическому труду &lt;a href="http://www.ozon.ru/context/detail/id/2457392/"&gt;Паттерны проектирования&lt;/a&gt;. В книге представлено большое количество шаблонов различных вариантов пользовательских интерфейсов. При этом речь идёт как о компоновке интерфейса в целом, так и об отдельных его элементах. Каждый паттерн снабжён описанием ситуации, в которой его стоит применять, и примерами использования.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-6383594865061609510?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/r8WgAFTMDtY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/r8WgAFTMDtY/blog-post.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/07/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-3101685890853227422</guid><pubDate>Tue, 01 Jul 2008 11:54:00 +0000</pubDate><atom:updated>2008-07-01T15:14:27.785+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MingW</category><category domain="http://www.blogger.com/atom/ns#">локаль</category><category domain="http://www.blogger.com/atom/ns#">кириллица</category><category domain="http://www.blogger.com/atom/ns#">locale</category><title>Кодировка в MingW</title><description>Я уже &lt;a href="http://alexeyprogrammer.blogspot.com/2007/10/blog-post_09.html"&gt;писал&lt;/a&gt; о проблемах с выводом в консоль кирилического текста с использованием компилятора MingW. Сегодня мне наконец-то удалось &lt;a href="http://rsdn.ru/Forum/Message.aspx?mid=3005636&amp;only=1"&gt;найти &lt;/a&gt;информацию в чём проблема и как с ней бороться. Оказалось, что проблема заключается в том, что в MingW просто напросто отсутствует необходимая локаль. По приведённой выше ссылке есть решение этой проблемы для C++ потоков.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-3101685890853227422?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/dNfZiFtMqCU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/dNfZiFtMqCU/mingw.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>2</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/07/mingw.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-7993679012449280614</guid><pubDate>Mon, 23 Jun 2008 07:52:00 +0000</pubDate><atom:updated>2008-06-23T11:16:06.804+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C++</category><title>Забавная бага</title><description>Вот &lt;a href="http://blogs.technet.com/eldar/archive/2008/05/02/3048973.aspx"&gt;здесь&lt;/a&gt; я нашёл пример кода с забавной ошибкой. 60 секунд мне хватило для того, чтобы догадаться что же не так. =)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="cpp"&gt;&lt;br /&gt;int ar[5];&lt;br /&gt;for (unsigned int i = 4; i &gt;= 0; i--) {&lt;br /&gt;printf("%d\n", ar[i]);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-7993679012449280614?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/H0fihxDJQMM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/H0fihxDJQMM/blog-post_23.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/06/blog-post_23.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-1046090364494927065</guid><pubDate>Wed, 11 Jun 2008 17:23:00 +0000</pubDate><atom:updated>2008-06-23T11:24:14.636+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C++</category><title>Офигеть!</title><description>Офигеть! Сегодня узнал, что в C++ можно прямо в описании класса задавать значение статических членов.&lt;br /&gt;&lt;pre&gt;&lt;code class=cpp&gt;&lt;br /&gt;class Foo&lt;br /&gt;{&lt;br /&gt;    static int comeData = 10;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-1046090364494927065?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/Iw4Kp2Phd6s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/Iw4Kp2Phd6s/blog-post.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/06/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-1529292424284673555</guid><pubDate>Tue, 10 Jun 2008 16:37:00 +0000</pubDate><atom:updated>2008-06-23T11:25:51.562+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">RoR</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Rails и XML</title><description>Любая модель(ActiveRecord) в Rails умеет сохраняться в виде xml. Это позволяет без проблем в зависимости от запроса выдавать результат в html или xml виде. А это значит, что появляется возможность прикрутить клиент отличный от браузера.&lt;br /&gt;Сделать это можно следующим образом.&lt;br /&gt;&lt;pre&gt;&lt;code class=ruby&gt;&lt;br /&gt;class TestController &lt; ApplicationController&lt;br /&gt;def get_data&lt;br /&gt;   res = FooObject.find(params[:id])&lt;br /&gt;   respond_to do |format|&lt;br /&gt;      format.html&lt;br /&gt;      format.xml  { render :xml =&gt; @res}&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;По запросу http://localhost:3000/test/1 будет получена html-страница, созданная в по соответствующему шаблону, а вот по запросу http://localhost:3000/test/1.xml получится xml-представление объекта FooObject. Что именно окажется в xml-файле опредляется строчкой&lt;br /&gt;&lt;pre&gt;&lt;code class=ruby&gt;&lt;br /&gt;      format.xml  { render :xml =&gt; @res}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Без проблем сериализуются как отдельные объекты, так их объекты, находящиеся в контейнере.&lt;br /&gt;Программу для запроса xml-файла я написал на C#. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class=cpp&gt;&lt;br /&gt;//создаём запрос&lt;br /&gt;   WebRequest request = WebRequest.Create(queryUrl);&lt;br /&gt;   request.ContentType = "text/xml";&lt;br /&gt;   WebResponse myWebResponse = request.GetResponse();&lt;br /&gt;   long len = myWebResponse.ContentLength;&lt;br /&gt;   byte[] buff = new byte[len];&lt;br /&gt;//считываем результат в буффер&lt;br /&gt;   myWebResponse.GetResponseStream().Read(buff, 0, (int)len);&lt;br /&gt;   string responseXml = &lt;br /&gt;new String(System.Text.Encoding.ASCII.GetString(buff).ToCharArray());&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Таким образом в responseXml окажется интересующий нас xml-файл, с которым можно делать всё, что душе угодно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-1529292424284673555?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/koMQ8Z8xW3I" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/koMQ8Z8xW3I/rails-xml.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/06/rails-xml.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-3974115697600620098</guid><pubDate>Fri, 18 Apr 2008 08:37:00 +0000</pubDate><atom:updated>2008-06-10T19:37:14.497+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">RoR</category><category domain="http://www.blogger.com/atom/ns#">IDE</category><category domain="http://www.blogger.com/atom/ns#">Rails</category><title>IDE для Ruby</title><description>Удобная IDE в состоянии сильно облегчить жизнь программисту. Для C++ и C# я практически всегда использую Visual Studio. Для Ruby я пробовл использовать несколько других редакторов.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://scite.ruteam.ru/"&gt;SciTE&lt;/a&gt;&lt;br /&gt;Достаточно простой и легковесный редактор кода, не заточенный под какой-либо конкретный язык или набор языков. SciTE подсвечивает код и умеет заканчивать некоторые языковые конструкции. Список поддерживаемых языков очень велиек и при необходимости можно добавить и описание своих языков. Отлаживать код с помощью SciTE нельзя. Зато этит редактор без проблем работает на моём стареньком ноуте со 128 метрами памяти.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.activestate.com/Products/komodo_ide/index.mhtml"&gt;Komodo Edit&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;Гораздо более продвинутый редактор. Он поддерживает ограниченый набор языков, но делает это в более полной степени, чем SciTE. Для Ruby есть автодополнение, показ списка доступных методов. Кроме Ruby поддерживаются Tcl, Pyton, Php, JavaScript. Есть возможность отладки кода. Komodo годаздо тяжеловеснн SciTE.&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;Это наиболее развороченная система из этих трёх. NetBeans написана нак Java, вследствие чего жрёт немало памяти. NetBeans - одна из самых используемых Java-разработчиками IDE. Интеграция с RubyOnRails сделана очень мощно - в контексте можно посмотреть не только список функций, но и описание к ним. В сэмплах Rails-проктов лежит Depot =)&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-3974115697600620098?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/Fmy9aSjuDXU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/Fmy9aSjuDXU/ide-ruby.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/04/ide-ruby.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-5806841053926798077</guid><pubDate>Wed, 16 Apr 2008 16:56:00 +0000</pubDate><atom:updated>2008-04-16T20:06:50.607+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">RoR</category><category domain="http://www.blogger.com/atom/ns#">web</category><category domain="http://www.blogger.com/atom/ns#">html</category><category domain="http://www.blogger.com/atom/ns#">Rails</category><title>Rails Depot</title><description>Ну вот я и осилил первую часть книги Agile Web Development, в которой описывается, как создать простейший интернет-магазин. Далее идёт более детальное описание того, почему всё делается так, как делается. По объёму это примерно половина книги. Параллельно с чтением я решил попробовать написать свой небольшой проектик. Дело пошло, но оказалось, что значительные затруднения у меня вызвала собственно вёрстка страничек. Всё ж таки программирую я постоянно(на разных языках), а вот с html'ем я в последний раз работал года этак 3 назад. А CSS вообще выглядит магией =). Не говоря уже о всяких AJAX'ах.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-5806841053926798077?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/oBNNIYlGXXo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/oBNNIYlGXXo/rails-depot.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>5</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/04/rails-depot.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-1479855267818843649</guid><pubDate>Fri, 07 Mar 2008 16:47:00 +0000</pubDate><atom:updated>2008-03-07T19:00:40.689+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">RoR</category><category domain="http://www.blogger.com/atom/ns#">Rails</category><title>Ruby On Rails</title><description>После того, как я начал разбираться и использовать Ruby, я пришёл к мысли, что было бы неплохо разобраться и с Ruby On Rails - вэб-фрэймворком, который является важной движущей силой распространения языка. Как оказалось, разобраться с RoR совсем не просто. Этот фреймворк обладает значительным когнитивным сопротивлением. Хотя в определённой степени проблемы возникают из-за того, что для последней версии Rails ещё не появилось достаточно хороших туториалов, а старые не работают. Удалось найти только одну книгу, ориентированную на RoR 2.0 - Rails Way by Obie Fernandez. Это примерно 900 страниц на английском. На следующей неделе попробую взяться за эту книгу.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-1479855267818843649?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/QkzAZmief28" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/QkzAZmief28/ruby-on-rails.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/03/ruby-on-rails.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-4562398235712130411</guid><pubDate>Tue, 19 Feb 2008 19:49:00 +0000</pubDate><atom:updated>2008-06-23T11:26:49.342+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Оптимизация  кода</title><description>Сегодня удалось добиться примерно десятикратного ускорения работы моего парсера. Проблема вообще возникла из-за того, что я относился к обработке строк в С/С++ стиле - преобразовывал строку с массив символов и переберал их для нахождения начала и  окончания блоков. Делать это на Ruby - далеко не лучшая идея. На языке высокого уровня нет смысла использовать низкоуровневый подход. Если в С при переборе символов строки достаточно инкрементировать значение указателя, то здесь будет создан(а затем и  уничтожен) объект для каждого символа. В общем совершенно ничего хорошего. Поэтому использовавние функции String#index с простейшим регекспом даёт значительный эффект. Что конечно же не может не радовать.&lt;br /&gt;Для обзначения начала и окончания блоков используются символы '{' и '}'. Для поиска конца блока  использовалась следующая функция&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class=ruby&gt;&lt;br /&gt;def find_end(str)&lt;br /&gt; arr = str.split(//)&lt;br /&gt; open_count = 0&lt;br /&gt; close_count = 0&lt;br /&gt; pos = 0&lt;br /&gt; arr.each do |x|&lt;br /&gt;  open_count += 1 if(x == "{")&lt;br /&gt;  close_count += 1 if(x == "}")&lt;br /&gt;  if(open_count == close_count)&lt;br /&gt;   return pos&lt;br /&gt;  end&lt;br /&gt;  pos += 1&lt;br /&gt; end&lt;br /&gt; nil&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь эта функция выглядит так:&lt;br /&gt;&lt;pre&gt;&lt;code class=ruby&gt;&lt;br /&gt;def find_end(str)&lt;br /&gt; open_count = 0&lt;br /&gt; close_count = 0&lt;br /&gt; pos = 0&lt;br /&gt; while(pos != nil)&lt;br /&gt;  pos = str.index(/\{|\}/, pos)&lt;br /&gt;  if(pos != nil)&lt;br /&gt;   open_count += 1 if str[pos] == 123&lt;br /&gt;   close_count += 1 if str[pos] == 125&lt;br /&gt;  end&lt;br /&gt;  if(open_count == close_count)&lt;br /&gt;   return pos&lt;br /&gt;  end&lt;br /&gt;  pos += 1&lt;br /&gt; end&lt;br /&gt; nil&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вероятно этот код можно ещё ускорить, но я пока не знаю как. Кроме ускорения за счёт оптимального использования возможностей языка, значительного эффекта можно добиться за счёт применения более эффективного алгоритма. Здесь у меня тоже есть над чем поработать. =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-4562398235712130411?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/A8DxB4YYatM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/A8DxB4YYatM/blog-post_19.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/02/blog-post_19.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-2145731571339298258</guid><pubDate>Fri, 15 Feb 2008 08:43:00 +0000</pubDate><atom:updated>2008-02-15T13:43:28.844+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Проблемы с производительностью</title><description>В проекте, над которым я сейчас работаю, достаточно активно используются файлы в xml-подобном формате. И я решил написать для него парсер на Ruby. Сделать это оказалось достаточно просто, но вылезла другая проблема - проблема производительности. Файл в 650 строк на моём стариньком ноутбуке (500 МГц P3) парсится примерно 20 секунд. В Ruby есть очень полезаная библиотека profiler, позволяющая посмотреть сколько именно времени занимает каждая из частей программы. Причём для того, чтобы её применить не нужно ничего менять в своём коде, а достаточно только подключить профайлер. Так вот использование профайлера показало мне, что больше всего работы происходит внутри Array#each. Сейчас думаю, каким образом можно всё ускорить. Возможность сделать всё быстро доказывается наличием парсера rexml, полностью написаного на Ruby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-2145731571339298258?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/TA9NwVlsktE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/TA9NwVlsktE/blog-post_15.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/02/blog-post_15.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-421747016368049969</guid><pubDate>Fri, 08 Feb 2008 17:23:00 +0000</pubDate><atom:updated>2008-02-08T19:35:30.486+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">книги</category><title>Ещё одна книжка.</title><description>Предыдущую книгу я осилил почти неделю назад. Теперь взялся за следующую - Everyday Scripting with Ruby: for Teams, Testers, and You by Brian Marick. Эта книга также из той же серии, что и Programming Ruby. Здесь рассмотрено несколько практических примеров использования Ruby для всяческой автоматизации работы. Например инвентаризация файла или подсчёт количества изменений в SVN.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-421747016368049969?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/pH1Zi1o69tI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/pH1Zi1o69tI/blog-post.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>1</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/02/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-9000067578000909911</guid><pubDate>Mon, 21 Jan 2008 11:36:00 +0000</pubDate><atom:updated>2008-01-21T16:40:23.836+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">книги</category><title>Книжка по Ruby</title><description>Нашёл и скачал в интернете неплохую книгу по Ruby - Programming Ruby. The Pragmatic Programmer's by Guide. David Thomas Andrew Hunt. Это книга тех же авторов, что и книги под названием "Программист-прагматик. Путь от подмастерья к мастеру", которую я читал &lt;a href="http://alexeyprogrammer.blogspot.com/2007/11/blog-post_26.html"&gt;ранее&lt;/a&gt;. Несмотря на то, что эта книга на английском, читается достаточно легко, чтобы я не бросил это занятие =).&lt;br /&gt;Книга состоит из четырёх основных частей.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Facets of Ruby. В этой части рассмотрены основные особенности Ruby и его отличия от других языков.&lt;/li&gt;&lt;li&gt;Ruby in Its Setting. Здесь рассмотрено каким образом Ruby взаимодействует со своим окружением. &lt;/li&gt;&lt;li&gt;Ruby Crystallized. Эта часть содержит в себе более продвинутый материал, относящийся к "сложным" частям языка.&lt;/li&gt;&lt;li&gt;Ruby Library Reference. Описание встроенных классов и функций языка.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-9000067578000909911?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/ca-QxHvNL6g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/ca-QxHvNL6g/ruby_21.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/01/ruby_21.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-3476469897966816802</guid><pubDate>Thu, 17 Jan 2008 17:11:00 +0000</pubDate><atom:updated>2008-01-17T19:21:24.934+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Реальное применение</title><description>Вчера на работе понадобилось преобразовать файл из SVG-формата, в наш собственный. И для этого я решил написать скрипт. Вначале попробовал это сделать на Tcl, но у него таки несколько грамоздкий синтаксис, когда нужно заниматься поиском подстрок и тому подобными вещами(допускаю, что я просто недостаточно хорошо разобрался). Поэтому я использовал Ruby. Здесь проблем вообще не возникло. Я использовал то, что уже делал &lt;a href="http://alexeyprogrammer.blogspot.com/2007/12/xml.html"&gt;раньше&lt;/a&gt; и всё легко получилось. Так что похоже это и есть первый случай реального применения мной Ruby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-3476469897966816802?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/XkA-mwaIBiM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/XkA-mwaIBiM/blog-post_17.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/01/blog-post_17.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-6214471190711717599</guid><pubDate>Tue, 15 Jan 2008 15:08:00 +0000</pubDate><atom:updated>2008-01-15T17:15:56.394+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">Tcl</category><title>Странная находка</title><description>Неожиданно обнаружил, что в составе Ruby присутствует библиотека tcltk, позволяющая использовать интерпритатор Tcl в Ruby-программе. Никак не могу придумать зачем это может понадобиться...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-6214471190711717599?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/UwTAHdYd-7U" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/UwTAHdYd-7U/blog-post_15.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>2</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/01/blog-post_15.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-6717993941677661698</guid><pubDate>Mon, 14 Jan 2008 20:08:00 +0000</pubDate><atom:updated>2008-01-14T22:36:56.016+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>А теперь на  Ruby</title><description>Сегодня я реализовал на Ruby ту же программу для копирования с пропусками, что &lt;a href="http://alexeyprogrammer.blogspot.com/2008/01/blog-post.html"&gt;ранее&lt;/a&gt; сделал на Tcl. На Ruby получилось следующее:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code class=ruby&gt;&lt;br /&gt;require 'find'&lt;br /&gt;require 'fileutils'&lt;br /&gt;#счётчики количества файлов и папок&lt;br /&gt;file_count = 0&lt;br /&gt;dir_count = 0&lt;br /&gt;&lt;br /&gt;if(ARGV.size != 2)&lt;br /&gt; puts "Script usage:"&lt;br /&gt; puts "ruby no_svn_copy.rb source destination"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;#получаем и нормализуем пути&lt;br /&gt;src = File.expand_path(ARGV[0])&lt;br /&gt;dst = File.expand_path(ARGV[1])&lt;br /&gt;puts src + ' =&gt; ' + dst&lt;br /&gt;&lt;br /&gt;#обрабатываем всё что есть в директории src&lt;br /&gt;Find.find(src) do |path|&lt;br /&gt; if(path.scan(".svn").size != 0)&lt;br /&gt;  next&lt;br /&gt; end&lt;br /&gt; #формируем путь к цели&lt;br /&gt; filename = dst + path.gsub(src, '')&lt;br /&gt; &lt;br /&gt; puts path&lt;br /&gt; #если это директория, то создаём её в новом месте&lt;br /&gt; if (FileTest.directory?(path))&lt;br /&gt;  dir_count += 1&lt;br /&gt;  FileUtils.mkdir_p filename&lt;br /&gt; end&lt;br /&gt; #если файл, то копируем его&lt;br /&gt; if (FileTest.file?(path))&lt;br /&gt;  file_count += 1&lt;br /&gt;  FileUtils.cp path, filename&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;#выводим статистику&lt;br /&gt;puts "dirs: " + dir_count.to_s + &lt;br /&gt;      " files: " + file_count.to_s&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Основное отличие программы на Ruby от Tcl заключается в том, что я использовал возможности модуля Find, что позволило сразу получить список всех исходных файлов и папок, а затем обойти его в цикле, а не делать это самостоятельно с помощью рекурсии. Время выполнения в обоих случаях примерно одинаковое.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-6717993941677661698?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/r6iC-HmNqCo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/r6iC-HmNqCo/ruby.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/01/ruby.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-35495667759624738</guid><pubDate>Sun, 13 Jan 2008 22:11:00 +0000</pubDate><atom:updated>2008-01-14T01:11:29.352+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tcl</category><title>SVN и копирование проекта</title><description>Системы контроля версий вещь крайне полезная для работы в команде (и не  только). В нашей компании используется svn. Под контролем обычно находятся не только исходные файлы, но и всяческие ресурсы, что создаёт определённые неудобства при подготовке версий для мэйлстоунов. Приходится копировавть папку с  ресусрсами, а потом удалять все служебные svn-файлы. Дабы немного упростить себе жизнь, я написал небольшой скрипт на Tcl для копирования с исключением папок  .svn.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class=cpp&gt;&lt;br /&gt;#переменные для подсчёта количества &lt;br /&gt;#файлов и директорий&lt;br /&gt;set files_count 0&lt;br /&gt;set dirs_count 0&lt;br /&gt;&lt;br /&gt;proc copy_files {dir_name parent_dir} {&lt;br /&gt; global files_count&lt;br /&gt; global dirs_count&lt;br /&gt; set target $parent_dir/[file tail $dir_name]&lt;br /&gt; puts "d $target =&gt; $target"&lt;br /&gt; file mkdir $target&lt;br /&gt; #получаем список фалов в директории&lt;br /&gt; set files [glob -nocomplain -types f $dir_name/*]&lt;br /&gt; #получаем список поддиректорий в директории&lt;br /&gt; set dirs [glob -nocomplain -types d $dir_name/*]&lt;br /&gt; &lt;br /&gt; incr dirs_count&lt;br /&gt; &lt;br /&gt; #копируем файлы&lt;br /&gt; foreach f $files {&lt;br /&gt;  puts "\tf $f =&gt; $target/[file tail $f]"&lt;br /&gt;  incr files_count&lt;br /&gt;  file copy -force $f $target&lt;br /&gt; }&lt;br /&gt; #рекурсивно обрабатываем все&lt;br /&gt; #поддиректории кроме .svn&lt;br /&gt; foreach d $dirs {&lt;br /&gt;  if {[string match -nocase */.svn $d] } {&lt;br /&gt;   continue&lt;br /&gt;  }&lt;br /&gt;  copy_files $d $target&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#проверяем наличие параметров&lt;br /&gt;if { $argc != 2 } {&lt;br /&gt; puts "Script usage:"&lt;br /&gt; puts "no_svn_copy.tcl source destination"&lt;br /&gt; return&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set src_dir [lindex  $argv 0]&lt;br /&gt;set target_dir [lindex $argv 1]&lt;br /&gt;#нормализуем пути, чтобы и source и destination&lt;br /&gt;#могли содержать как '\', так и '/'&lt;br /&gt;set src_dir [file normalize $src_dir]&lt;br /&gt;set target_dir [file normalize $target_dir]&lt;br /&gt;&lt;br /&gt;#провевряем существование директории-источника&lt;br /&gt;if { [file isdirectory $src_dir] == 0 } {&lt;br /&gt; puts "Source dir not exists"&lt;br /&gt; return&lt;br /&gt;}&lt;br /&gt;puts "Copyng $src_dir =&gt; $target_dir\n"&lt;br /&gt;#вызываем рекурсивную функцию копирования&lt;br /&gt;copy_files $src_dir $target_dir&lt;br /&gt;&lt;br /&gt;puts "$dirs_count dirs, $files_count files"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-35495667759624738?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/W1mw8V0PDUw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/W1mw8V0PDUw/blog-post.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2008/01/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-1225752565408651599</guid><pubDate>Mon, 24 Dec 2007 10:00:00 +0000</pubDate><atom:updated>2008-07-10T13:58:09.905+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">книги</category><title>Совершенный код</title><description>Вчера наконец-то доставили заказаную мной две недели назад книгу Стива Макконнелла &lt;a href="http://www.ozon.ru/context/detail/id/3159814/"&gt;Совершенный код&lt;/a&gt;. Практическое руководство по разработке программного обеспечения. Это более 850 страниц в твёрдой обложке. Судя по отзывам, эту книгу определённо стоит прочитать(и соответственно стоило заказывать =) ). Как только закончу читать Александреску Современное проектирование на С++, примусь за Макконнелла.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-1225752565408651599?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/5Z5ZJE-T3d0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/5Z5ZJE-T3d0/blog-post_23.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>1</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2007/12/blog-post_23.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-2041518920432930094</guid><pubDate>Tue, 11 Dec 2007 11:53:00 +0000</pubDate><atom:updated>2007-12-18T17:00:53.196+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">Tcl</category><title>Интеграция Tcl в программу на C/C++</title><description>&lt;div&gt;Книжку по Tcl, про которою я говорил &lt;a href="http://alexeyprogrammer.blogspot.com/2007/11/tcl.html"&gt;ранее&lt;/a&gt;, я дочитал. В ней есть глава, посвяшённая теме моего поста. Использование Tcl оказывается весьма и весьма простым.&lt;br /&gt;Есть три задачи, которые необходимо решать при работе с любым скриптовым языком: &lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Вызов из основной программы скриптовых функций.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Вызов из под скрипта функций основной программы.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Передача данных между скриптом и основной программой.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;В принципе третий пункт вполне можно реализовать через первые два. &lt;br /&gt;В следующем примере создаётся инстанс интерпретатора, создаётся Tcl функция equal, которая реализуется на C и вызывается в интерпретаторе.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include "tcl.h"&lt;br /&gt;&lt;br /&gt;//Хэндл интерпретатора&lt;br /&gt;Tcl_Interp* interp = NULL;&lt;br /&gt;&lt;br /&gt;//функция, которая будет вызвана интерпретатором&lt;br /&gt;int EqualCmd(ClientData clientData, &lt;br /&gt;Tcl_Interp* interp, int argc, char** argv)&lt;br /&gt;{&lt;br /&gt;//устанавливаем возвращаемое значение&lt;br /&gt;Tcl_SetObjResult(interp, Tcl_NewBooleanObj(strcmp(argv[1], argv[2]) ? 0 : 1 ) );&lt;br /&gt;return TCL_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc,char** argv)&lt;br /&gt;{&lt;br /&gt;//создаётся инстанс интерпретатора&lt;br /&gt;interp = Tcl_CreateInterp();&lt;br /&gt;int bResult;&lt;br /&gt;//создаётся Tcl функция equal, которая обрабатывается в ф-ции EqualCmd&lt;br /&gt;Tcl_CreateCommand(interp, "equal", (Tcl_CmdProc*)EqualCmd, &lt;br /&gt;(ClientData*)NULL, (Tcl_CmdDeleteProc*)NULL);&lt;br /&gt;//вызываем функцию equal для значений 10 и 10&lt;br /&gt;if(TCL_OK == Tcl_Eval(interp, "equal 10 10"))&lt;br /&gt;{&lt;br /&gt;Tcl_Obj* pResult = Tcl_GetObjResult(interp);&lt;br /&gt;Tcl_GetBooleanFromObj(interp, pResult, &amp;bResult);&lt;br /&gt;printf("result = %i\n", bResult);&lt;br /&gt;}&lt;br /&gt;//вызываем функцию equal для значений 20 и 10&lt;br /&gt;if(TCL_OK == Tcl_Eval(interp, "equal 20 10"))&lt;br /&gt;{&lt;br /&gt;Tcl_Obj* pResult = Tcl_GetObjResult(interp);&lt;br /&gt;Tcl_GetBooleanFromObj(interp, pResult, &amp;bResult);&lt;br /&gt;printf("result = %i\n", bResult);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//удалякм инстанс интерпретатора&lt;br /&gt;Tcl_DeleteInterp(interp);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Для обмена данными между интерпретатором и программой используются функции Tcl_SetVar и Tcl_GetVar, которые позволяют устанавливать и получать значение переменных. Кроме этих вполне ожидаемых средств в Tcl есть и другая интересная фишка - возможность линковать между собой переменную в C коде и переменную в Tcl скрипте. Когда меняется одна, меняется и другая.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-2041518920432930094?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/tykWk3ZtcFI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/tykWk3ZtcFI/tcl-cc.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2007/12/tcl-cc.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-5191675085799520321</guid><pubDate>Sun, 02 Dec 2007 20:36:00 +0000</pubDate><atom:updated>2007-12-03T17:22:00.828+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">Tcl</category><title>Парсинг XML</title><description>Продолжаю экспериментировать с Ruby и Tcl. И я решил написать на каждом из этих языков парсер xhtml-документов. Задача - преобразовать все xhtml-документы в текущей директории в текстовые документы. Преобразование самое простое - в сущности оно заключается просто в удалении тэгов из документа. На обоих языках задача была выполнена.&lt;br /&gt;&lt;br /&gt;Програма на Tcl выглядит следующим образом&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package require xml&lt;br /&gt;&lt;br /&gt;set skip_data false&lt;br /&gt;set result ""&lt;br /&gt;&lt;br /&gt;#колбэк для обработки текста xml-элемента&lt;br /&gt;proc cdata {data args} {&lt;br /&gt; global  skip_data&lt;br /&gt; global  result&lt;br /&gt; if {$skip_data == false } {&lt;br /&gt;  append result $data&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; set skip_data false&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#колбэк для обработки начала xml-элемента.&lt;br /&gt;#если встречаются тэги &amp;lt;style&amp;gt; или &amp;lt;title&amp;gt;, то мы их пропускаем&lt;br /&gt;proc elem {data attlist args} {&lt;br /&gt; global skip_data&lt;br /&gt; if {$data == "style"} {&lt;br /&gt;  set skip_data true&lt;br /&gt; } elseif {$data == "title"} {&lt;br /&gt;  set skip_data true&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set l [eval glob *.html]&lt;br /&gt;set b [split $l]&lt;br /&gt;# b - список html-файлов в текущей директории&lt;br /&gt;&lt;br /&gt;foreach fn $b {&lt;br /&gt; #считываем содержимое файла&lt;br /&gt; set f [eval open $fn]&lt;br /&gt; set data [eval read $f]&lt;br /&gt; close $f&lt;br /&gt; #создаём парсер и указываем колбэки&lt;br /&gt; set parser [::xml::parser -characterdatacommand cdata -elementstartcommand elem]&lt;br /&gt; $parser parse $data&lt;br /&gt; set result [string trim $result]&lt;br /&gt; set ofn $fn&lt;br /&gt; append ofn {.txt}&lt;br /&gt; #записываем результат в файл&lt;br /&gt; set res_file [open $ofn w]&lt;br /&gt; puts $res_file $result&lt;br /&gt; close $res_file&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;На Ruby получился следующий код&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;require 'rexml/parsers/PullParser'&lt;br /&gt;&lt;br /&gt;$result = ""&lt;br /&gt;#получаем список html-фалов&lt;br /&gt;h_files = Dir.glob("*.html")&lt;br /&gt;#обрабатываем в цикле все эти файлы&lt;br /&gt;for fn in h_files&lt;br /&gt;#считываем данные&lt;br /&gt;f = File.open(fn, "r")&lt;br /&gt;if(f.eof)&lt;br /&gt; p "empty"&lt;br /&gt; return&lt;br /&gt;end&lt;br /&gt;res = f.read&lt;br /&gt;#создаём парсер&lt;br /&gt;lp = REXML::Parsers::PullParser.new(res)&lt;br /&gt;skip_element = 0&lt;br /&gt;while(lp.has_next?)&lt;br /&gt; data = lp.pull&lt;br /&gt; if(skip_element &gt; 0)&lt;br /&gt;  skip_element -= 1&lt;br /&gt;  next&lt;br /&gt; end&lt;br /&gt; #если попадается ненужный элемент, то пропускаем его&lt;br /&gt; if(data.start_element?  &amp;amp;&amp;amp; (data[0] == "style"  data[0] == "title"))&lt;br /&gt;  skip_element = 2&lt;br /&gt; end&lt;br /&gt; if(data.text?)&lt;br /&gt;  #а если нужный, то сохраняем его&lt;br /&gt;  $result =  $result + data[0].to_s&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;#записываем результат в файл&lt;br /&gt;res = File.open(fn.to_s + ".txt", "w")&lt;br /&gt;res.write($result.strip)&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Несмотря на то, что текст програмы на Ruby получился лаконичнее, чем на Tcl, на Ruby вариант у меня ушло значительно больше времени, большую часть из которого я потратил на то, чтобы найти и использовать подходящий xml-парсер. Кроме того результат, который выдаёт Ruby, некорректен - в тексте сохранились значки "&amp;amp;nbsp;". Хотя конечно это недостаток парсера, а не языка... Тем не менее Tcl в данном случае показал себя гораздо лучше. Правда при этом програма на Ruby работает примерно в два раза быстрее.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-5191675085799520321?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/dHO05t39bf4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/dHO05t39bf4/xml.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2007/12/xml.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-3810186987072073766</guid><pubDate>Sun, 02 Dec 2007 11:54:00 +0000</pubDate><atom:updated>2007-12-02T14:21:30.131+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">программирование</category><title>Сортировка на Ruby</title><description>А теперь тоже самое, но на Ruby.&lt;br /&gt;&lt;blockquote&gt;a = [2, 1, 26, 14]&lt;br /&gt;for i in (0..a.length - 1)&lt;br /&gt;       for j in  (i..a.length - 1)&lt;br /&gt;              if a[i] &gt; a[j]&lt;br /&gt;                     tmp = [i]&lt;br /&gt;                     a[i] = a[j]&lt;br /&gt;                     a[j] = tmp&lt;br /&gt;              end&lt;br /&gt;       end&lt;br /&gt;end&lt;br /&gt;p a&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Естественно в Ruby присутствуют и встроенные средства сортировки массивов&lt;br /&gt;&lt;blockquote&gt;data =  data.sort&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;На написание этой программы на Ruby мне потребовалось меньше времени и услилий, чем на Tcl за счёт более удобного и привычного доступа к элементам массивов в Ruby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-3810186987072073766?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/y5cElXN4bnI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/y5cElXN4bnI/ruby.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2007/12/ruby.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4327883890491130768.post-4051248598091855090</guid><pubDate>Sun, 02 Dec 2007 11:34:00 +0000</pubDate><atom:updated>2007-12-02T13:44:32.314+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">программирование</category><category domain="http://www.blogger.com/atom/ns#">Tcl</category><title>Пузырьковая сортировка на Tcl</title><description>Только что написал на Tcl сортироку  пузырьком. Выглядит это следующим образом&lt;br /&gt;&lt;blockquote&gt;set a  {23 4 3 7 6 10}&lt;br /&gt;puts $a&lt;br /&gt;for { set i 0 } { $i &lt; [llength $a] } { incr i } {&lt;br /&gt;              for { set j $i } { $j &lt; [llength $a] } { incr j } {&lt;br /&gt;                         if { [lindex $a $i] &gt; [lindex $a $j]} {&lt;br /&gt;               set tmp [lindex $a $i]&lt;br /&gt;               lset a $i [lindex $a $j]&lt;br /&gt;               lset a $j $tmp&lt;br /&gt;           }&lt;br /&gt;      }&lt;br /&gt;}&lt;br /&gt;puts $a&lt;/blockquote&gt;&lt;br /&gt;Естественно того же эффекта можно добиться одной строчкой с&lt;br /&gt;использованием средств языка.&lt;blockquote&gt;set a [lsort  -integer $a]&lt;/blockquote&gt;&lt;br /&gt;Просто хотелось  написать на этом языке что-нибудь простое. Хотя конечно Tcl предназначен для решения совершенно других задач.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4327883890491130768-4051248598091855090?l=alexeyprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexeyprogrammer/~4/ifYBSNxuIPQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/alexeyprogrammer/~3/ifYBSNxuIPQ/blog-post.html</link><author>noreply@blogger.com (Алексей)</author><thr:total>0</thr:total><feedburner:origLink>http://alexeyprogrammer.blogspot.com/2007/12/blog-post.html</feedburner:origLink></item></channel></rss>

