<?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:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2946293286669973681</id><updated>2024-10-25T03:40:29.769+03:00</updated><category term="Vim"/><category term="autocomplete"/><category term="my project"/><category term="ogre3d"/><category term="skills"/><category term="tag cloud"/><category term="хак"/><category term="эффективность"/><title type='text'>Интуитивное программирование</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2946293286669973681.post-3834542446853433728</id><published>2010-12-31T22:06:00.001+02:00</published><updated>2010-12-31T22:07:19.359+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="skills"/><category scheme="http://www.blogger.com/atom/ns#" term="tag cloud"/><title type='text'>Облако тэгов</title><content type='html'>В процессе блуждания по интернету набрел на&amp;nbsp;&lt;a href=&quot;http://www.wordle.net/&quot;&gt;http://www.wordle.net/&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;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRPMNZdXK6yIYTZle8vfaWcwUuJpkGKYFAjZtpJrc5y2yPbdI_28GNp_bQmUcO-pG2WWqFWk-u0pPoPBhLm1aPaHF0KaCRI-KmuLGzkkqMwHwcI44-ZXTWGVcBGkYuY1OizMfx0Uy8zC8/s1600/tag+cloud.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRPMNZdXK6yIYTZle8vfaWcwUuJpkGKYFAjZtpJrc5y2yPbdI_28GNp_bQmUcO-pG2WWqFWk-u0pPoPBhLm1aPaHF0KaCRI-KmuLGzkkqMwHwcI44-ZXTWGVcBGkYuY1OizMfx0Uy8zC8/s640/tag+cloud.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/3834542446853433728/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/blog-post_31.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/3834542446853433728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/3834542446853433728'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/blog-post_31.html' title='Облако тэгов'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRPMNZdXK6yIYTZle8vfaWcwUuJpkGKYFAjZtpJrc5y2yPbdI_28GNp_bQmUcO-pG2WWqFWk-u0pPoPBhLm1aPaHF0KaCRI-KmuLGzkkqMwHwcI44-ZXTWGVcBGkYuY1OizMfx0Uy8zC8/s72-c/tag+cloud.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2946293286669973681.post-6212964067061551850</id><published>2010-12-19T14:42:00.000+02:00</published><updated>2010-12-19T14:42:37.032+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="my project"/><category scheme="http://www.blogger.com/atom/ns#" term="ogre3d"/><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>Подсветка синтаксиса материалов в Ogre3D</title><content type='html'>В последнее время я постоянно стараюсь узнавать про &lt;a href=&quot;http://vim.org/&quot;&gt;vim&lt;/a&gt; что-то новое. Одним из такого нового для меня стали синтаксические файлы, позволяющий описать, как собственный код будет подсвечен.&lt;br /&gt;
&lt;br /&gt;
Я решил попрактиковаться и сделал подсветку для файлов материалов Ogre3D. Итоговый результат получился размером на 530 строк зато может подсвечивать некоторые ошибки!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg31zkCPeBZpddVmAVuZEb-AfvlbrxBk5GhiYBgYepyg72pQFtCwlU1enx__5lSMn1OKFVGpeBHSmDb1F973y8LVXeUuNsbQYOdPeMFDPUQJ4SVmL6P6oruxzYc2YLqpunS-0ga1njMK1I/s1600/vim+syntax+highlighting.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;409&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg31zkCPeBZpddVmAVuZEb-AfvlbrxBk5GhiYBgYepyg72pQFtCwlU1enx__5lSMn1OKFVGpeBHSmDb1F973y8LVXeUuNsbQYOdPeMFDPUQJ4SVmL6P6oruxzYc2YLqpunS-0ga1njMK1I/s640/vim+syntax+highlighting.png&quot; width=&quot;640&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div align=&quot;left&quot; class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;Итоговый результат доступен &lt;a href=&quot;https://bitbucket.org/rride_a/myvim/src&quot;&gt;здесь&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/6212964067061551850/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/ogre3d.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/6212964067061551850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/6212964067061551850'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/ogre3d.html' title='Подсветка синтаксиса материалов в Ogre3D'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg31zkCPeBZpddVmAVuZEb-AfvlbrxBk5GhiYBgYepyg72pQFtCwlU1enx__5lSMn1OKFVGpeBHSmDb1F973y8LVXeUuNsbQYOdPeMFDPUQJ4SVmL6P6oruxzYc2YLqpunS-0ga1njMK1I/s72-c/vim+syntax+highlighting.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2946293286669973681.post-8687483877878468841</id><published>2010-12-13T22:50:00.000+02:00</published><updated>2010-12-13T22:50:56.294+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="autocomplete"/><category scheme="http://www.blogger.com/atom/ns#" term="эффективность"/><title type='text'>Autocomplete</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG96A7fDqXpkivRplS7cI76CTHU0ZYI6hKa2Xpakm1dlFnT6gxQMa_UqDwa4Uj9-3tX6c18ayz5rDPBl-SYwBW2q04acZzMDpiBFPgzVzKmmKTRrdaSuLcBcAKIk1EfcXy-GSIVekLvws/s1600/autocompletion.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG96A7fDqXpkivRplS7cI76CTHU0ZYI6hKa2Xpakm1dlFnT6gxQMa_UqDwa4Uj9-3tX6c18ayz5rDPBl-SYwBW2q04acZzMDpiBFPgzVzKmmKTRrdaSuLcBcAKIk1EfcXy-GSIVekLvws/s640/autocompletion.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
На днях принял решение значительным образом сократить использование autocomplete. Вызвано это было следующими причинами:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;обнаружил, что после дня использования autocomplete-а серьезно сокращается скорость ввода английского текста и руки некоторое время приходится приучать заново. :)&lt;/li&gt;
&lt;li&gt;периодически &quot;умный&quot; механизм подсказки ошибается и подставляет на место уже практически набранного слова полный бред; ужасно бесит. Позвольте пользователям самим совершать ошибки!&lt;/li&gt;
&lt;li&gt;автоматически всплывающая подсказка переводит (да, это так) внимание с текущей мысли на выбор нужного варианта.&lt;/li&gt;
&lt;li&gt;код, на мой взгляд, запоминается куда как хуже, когда работаешь не своими руками, а пользуешься виртуальным помощником.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;В разумных количествах autocomplete - несомненное добро, но то, к чему приводит VS2010 + VAssist с максимальным уровнем подсказок - точно перебор.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/8687483877878468841/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/autocomplete.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/8687483877878468841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/8687483877878468841'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/autocomplete.html' title='Autocomplete'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG96A7fDqXpkivRplS7cI76CTHU0ZYI6hKa2Xpakm1dlFnT6gxQMa_UqDwa4Uj9-3tX6c18ayz5rDPBl-SYwBW2q04acZzMDpiBFPgzVzKmmKTRrdaSuLcBcAKIk1EfcXy-GSIVekLvws/s72-c/autocompletion.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2946293286669973681.post-8645193399705306257</id><published>2010-12-12T14:36:00.001+02:00</published><updated>2010-12-13T22:52:43.401+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="хак"/><title type='text'>Наследование в C!</title><content type='html'>Как реализовать наследование в C? Скажете, там и классов-то нет!&lt;br /&gt;
&lt;br /&gt;
Разбираюсь с &lt;a href=&quot;http://www.gtk.org/&quot;&gt;GTK+&lt;/a&gt; - кроссплатформенным набором инструментов для создания GUI. Там достаточно часто встречается код подобного вида&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect( GTK_OBJECT(window), &quot;delete_event&quot;, GTK_SIGNAL_FUNC(delete_event), NULL );
&lt;/pre&gt;&lt;br /&gt;
где GTK_OBJECT - фактически макрос приведения указателя на структуру GtkWidget к указателю на структуру GtkObject.&lt;br /&gt;
&lt;br /&gt;
Так вот. Идея заключается в том, что если GtkWidget имеет вид&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;struct GtkWidget
{
  GtkObject innerObject;
};
&lt;/pre&gt;&lt;br /&gt;
то такое приведение действительно будет работать в C, а это значит, что одиночное наследование реализуется достаточно просто.&lt;br /&gt;
&lt;br /&gt;
P.S. Следует учитывать, что в самом GTK макрос кроме непосредственно приведения указателей выполняет еще и проверку типов, так что будьте внимательны!</content><link rel='replies' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/8645193399705306257/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/c.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/8645193399705306257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/8645193399705306257'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/c.html' title='Наследование в C!'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2946293286669973681.post-1908653417098035627</id><published>2010-12-10T00:38:00.000+02:00</published><updated>2010-12-10T00:38:25.586+02:00</updated><title type='text'>Paged Geometry или почему я не люблю STL streams, а также как их правильно готовить.</title><content type='html'>Небольшое вступление, не совсем в тему, зато весьма поучительное и отражающее основную суть вопроса.&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;i&gt;File copy circa 1975:&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
int main() {
int c;
while ((c = getchar()) != EOF)
    putchar(c);
    return errno != 0;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;i&gt;Fast forward 20 years, and...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;iterator&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;
int main() {
    // (forgot the try/catch around main)
    copy(istream_iterator&amp;lt;string&amp;gt;(cin),
    istream_iterator&amp;lt;string&amp;gt;(),
    ostream_iterator&amp;lt;string&amp;gt;(cout,&quot;\n&quot;));
}
&lt;/pre&gt;&lt;i&gt;Something, somewhere, went terribly wrong.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Andrei Alexandrescu.&lt;/i&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;
Я помню, как еще шесть с половиной лет назад, начиная изучать C++ я читал о потоках в STL и думал &quot;Как это круто! Они так неожиданно и здорово перегрузили оператор &amp;lt;&amp;lt;&quot;. Однако время идет, а ореола очарования постепенно сошел на нет.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Первая проблема&lt;/i&gt;. They are too verbose! (В них&amp;nbsp;чересчур&amp;nbsp;много буков).&lt;br /&gt;
Пример из реально работающего кода.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;std::cout&amp;nbsp;&amp;lt;&amp;lt; std::setw(2) &amp;lt;&amp;lt; std::setfill(&#39;0&#39;) &amp;lt;&amp;lt; (pTime-&amp;gt;tm_mon + 1)
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&amp;lt; std::setw(2) &amp;lt;&amp;lt; std::setfill(&#39;0&#39;) &amp;lt;&amp;lt; pTime-&amp;gt;tm_mday
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&amp;lt; std::setw(2) &amp;lt;&amp;lt; std::setfill(&#39;0&#39;) &amp;lt;&amp;lt; (pTime-&amp;gt;tm_year + 1900)
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&amp;lt; &quot;_&quot; &amp;lt;&amp;lt; std::setw(2) &amp;lt;&amp;lt; std::setfill(&#39;0&#39;) &amp;lt;&amp;lt; pTime-&amp;gt;tm_hour
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&amp;lt; std::setw(2) &amp;lt;&amp;lt; std::setfill(&#39;0&#39;) &amp;lt;&amp;lt; pTime-&amp;gt;tm_min
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&amp;lt; std::setw(2) &amp;lt;&amp;lt; std::setfill(&#39;0&#39;) &amp;lt;&amp;lt; pTime-&amp;gt;tm_sec
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&amp;lt; std::setw(3) &amp;lt;&amp;lt; std::setfill(&#39;0&#39;) &amp;lt;&amp;lt; (mTimer-&amp;gt;getMilliseconds() % 1000);
&lt;/pre&gt;&lt;br /&gt;
В C-стиле это будет выглядеть как &lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;printf( &quot;%02d%02d%02d_%02d%02d%02d%03d&quot;, 
        (pTime-&amp;gt;tm_mon + 1),
        pTime-&amp;gt;tm_mday,
        (pTime-&amp;gt;tm_year + 1900),
        pTime-&amp;gt;tm_hour,
        pTime-&amp;gt;tm_min,
        pTime-&amp;gt;tm_sec,
        (mTimer-&amp;gt;getMilliseconds() % 1000 
);
&lt;/pre&gt;&lt;br /&gt;
Как по мне, так второй код читается лучше, а пишется короче. Так почему же &quot;something has gone wrong?&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Вторая причина.&lt;/i&gt; Работаем мы с open-source движком&amp;nbsp;&lt;a href=&quot;http://www.ogre3d.org/&quot;&gt;Ogre3D&lt;/a&gt;, таким большим, толстым с очень длинными именами классов навроде Ogre::HardwareVertexBufferSharedPtr и достаточно интенсивным использованием строк.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXUH1dO1PWgPv9_TUoEZmMgCm54MsLsjMz87WulyAWkkpNwkDNG85W-H6-UPvwliFn1F53ViOVbpoD0VudmLR5EYLlriI_5iBuNYc32W8WtpejKvqEtY9ncWMGLDw-EQ75GsRbBBwzNp8/s1600/PagedGeometryScreen1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXUH1dO1PWgPv9_TUoEZmMgCm54MsLsjMz87WulyAWkkpNwkDNG85W-H6-UPvwliFn1F53ViOVbpoD0VudmLR5EYLlriI_5iBuNYc32W8WtpejKvqEtY9ncWMGLDw-EQ75GsRbBBwzNp8/s320/PagedGeometryScreen1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Делаем в проекте рендеринг огромных массивов растительности (бескрайний лес:)), используя &lt;a href=&quot;http://www.ogre3d.org/wiki/index.php/PagedGeometry_Engine&quot;&gt;PagedGeometry&lt;/a&gt;&amp;nbsp;-&amp;nbsp;плагин к огру; как раз подошла необходимость заняться оптимизацией. Проблема заключается в том, что у нас единовременно подгружаются достаточно большие участки леса и при этом наблюдается заметный лаг.&lt;br /&gt;
&lt;br /&gt;
Включаю профайлер и что же я вижу? (Обратите внимание на Forests::BatchedGeometry::SubBatch::build/)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbMacY03PveKVNvpDqiJRp90L7LvJwQy5zfPH98Zrwixvw9hE1htS8oa69kRJGYesMWpoSCsG9K6kzBwgpnurAYU5aAHz4fbtJpUQKm3G5dvEBMj1rxpPtl5uINUt4uME_K1NTqqnVwbE/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbMacY03PveKVNvpDqiJRp90L7LvJwQy5zfPH98Zrwixvw9hE1htS8oa69kRJGYesMWpoSCsG9K6kzBwgpnurAYU5aAHz4fbtJpUQKm3G5dvEBMj1rxpPtl5uINUt4uME_K1NTqqnVwbE/s1600/%25D0%2591%25D0%25B5%25D0%25B7%25D1%258B%25D0%25BC%25D1%258F%25D0%25BD%25D0%25BD%25D1%258B%25D0%25B9.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Функция которая должна вызываться не чаще, чем раз в 10 кадров пятая по времени среди &quot;горячих точек&quot;!&lt;br /&gt;
&lt;br /&gt;
Копаем дальше! Это результаты еще одной сессии профилирования, где BatchedGeometry::build заняло в целом около 1.4 с. времени.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHgOM7-0x_GXu_KoGom0SUI4uWSywFkMzEZ1-hN3mm4tOGp4iVONEXDOxT2iaDEiWK9fOvKrk_yA6uZlbRXC0Mv4wXdQSravAv9qb5-TNTIo_VxaHYUTWlnodSlnuPO4Pa-BNidkVQJzE/s1600/profiling2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHgOM7-0x_GXu_KoGom0SUI4uWSywFkMzEZ1-hN3mm4tOGp4iVONEXDOxT2iaDEiWK9fOvKrk_yA6uZlbRXC0Mv4wXdQSravAv9qb5-TNTIo_VxaHYUTWlnodSlnuPO4Pa-BNidkVQJzE/s1600/profiling2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Ничего себе. В коде &lt;i&gt;генерации деревьев&lt;/i&gt;&amp;nbsp;больше половины времени занимают &lt;i&gt;операции со строками!&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/div&gt;Как только код c &lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;String BatchedGeometry::getFormatString(SubEntity *ent)
{
 StringUtil::StrStreamType str;
 
 str &amp;lt;&amp;lt; ent-&amp;gt;getMaterialName() &amp;lt;&amp;lt; &quot;|&quot;;
 str &amp;lt;&amp;lt; ent-&amp;gt;getSubMesh()-&amp;gt;indexData-&amp;gt;indexBuffer-&amp;gt;getType() &amp;lt;&amp;lt; &quot;|&quot;;
 
 const VertexDeclaration::VertexElementList &amp;amp;elemList = ent-&amp;gt;getSubMesh()-&amp;gt;vertexData-&amp;gt;vertexDeclaration-&amp;gt;getElements();
 VertexDeclaration::VertexElementList::const_iterator i;
 for (i = elemList.begin(); i != elemList.end(); ++i)
 {
  const VertexElement &amp;amp;element = *i;
  str &amp;lt;&amp;lt; element.getSource() &amp;lt;&amp;lt; &quot;|&quot;;
  str &amp;lt;&amp;lt; element.getSemantic() &amp;lt;&amp;lt; &quot;|&quot;;
  str &amp;lt;&amp;lt; element.getType() &amp;lt;&amp;lt; &quot;|&quot;;
 }
 
 return str.str();
}
&lt;/pre&gt;&lt;br /&gt;
был заменен на&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;String BatchedGeometry::getFormatString(SubEntity *ent)
{
   const int BufSize = 1024;
   char buf[BufSize];


   int countWritten = 
         _snprintf_s( buf, BufSize,
               &quot;%s|%d&quot;,
                ent-&amp;gt;getMaterialName().c_str(), 
                ent-&amp;gt;getSubMesh()-&amp;gt;indexData-&amp;gt;indexBuffer-&amp;gt;getType() 
         );

   const VertexDeclaration::VertexElementList &amp;amp;elemList = ent-&amp;gt;getSubMesh()-&amp;gt;vertexData-&amp;gt;vertexDeclaration-&amp;gt;getElements();
   VertexDeclaration::VertexElementList::const_iterator i;
   for (i = elemList.begin(); i != elemList.end(); ++i)
   {
      const VertexElement &amp;amp;element = *i;
      countWritten += _snprintf_s( buf + countWritten, BufSize - countWritten, BufSize - countWritten,
                         &quot;|%d|%d|%d&quot;,
                          element.getSource(),
                          element.getSemantic(),
                          element.getType()
                        );
   }

   return buf;
}
&lt;/pre&gt;&lt;br /&gt;
Время генерации деревьев сократилась в 2-2.2(!!!!!!) раза: вместо средних 4.8-5.6 мс на один вызов стало 2.2-2.8. Не знаю, ругаться на разработчиков PagedGeometry или на реализацию стримов у Майкрософта?&lt;br /&gt;
&lt;br /&gt;
Такая низкая скорость работы объясняется тем, что&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;сами потоки - объекты, которые любят выделять память, в частности на создании и удалении;&lt;/li&gt;
&lt;li&gt;реализация STL от майкрософта по умолчанию вставляет локи на работу с потоками, если проект собирается, как multithreaded.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;br /&gt;
Итак, они &lt;i&gt;медленные&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Так что я буду по-прежнему использовать printf или класс StringFormatter и пусть меня убеждают &amp;nbsp;и дальше о пользе некоторых абстракций STL. :)&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;font-family: consolas;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: black; font-family: &#39;Times New Roman&#39;; white-space: normal;&quot;&gt;P.S. Между прочим у Александреску есть отличная&amp;nbsp;&lt;a href=&quot;http://erdani.com/publications/cuj-2005-08.pdf&quot;&gt;статья&lt;/a&gt;&amp;nbsp;на тему типо-безопасного printf-а!&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: consolas;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: black; font-family: &#39;Times New Roman&#39;; white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;font-family: consolas;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: blue;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: black; font-family: &#39;Times New Roman&#39;; white-space: normal;&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/1908653417098035627/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/paged-geometry-stl-streams.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/1908653417098035627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/1908653417098035627'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/paged-geometry-stl-streams.html' title='Paged Geometry или почему я не люблю STL streams, а также как их правильно готовить.'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXUH1dO1PWgPv9_TUoEZmMgCm54MsLsjMz87WulyAWkkpNwkDNG85W-H6-UPvwliFn1F53ViOVbpoD0VudmLR5EYLlriI_5iBuNYc32W8WtpejKvqEtY9ncWMGLDw-EQ75GsRbBBwzNp8/s72-c/PagedGeometryScreen1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2946293286669973681.post-2723721302829569482</id><published>2010-12-08T00:15:00.001+02:00</published><updated>2010-12-08T00:16:54.339+02:00</updated><title type='text'>Dynamic vs. pregenerated content</title><content type='html'>Вот что странно. За всю свою историю путешествий по интернету я НИ РАЗУ не встречал рассказа о том, как организована система сборки в том или ином игровом проекте (мультимедиа проекте; проекте, связанном с 3D графикой - нужное подчеркнуть).&lt;br /&gt;
А интересных тем там будет немало:&lt;br /&gt;
&lt;div&gt;&lt;ul&gt;&lt;li&gt;как храним&amp;nbsp;код и файлы ресурсов?&lt;/li&gt;
&lt;li&gt;какую make систему использовать?&lt;/li&gt;
&lt;li&gt;как копируем файлы?&lt;/li&gt;
&lt;li&gt;как делаем препроцессинг ресурсов? много утилит или одна со множеством плагинов?&lt;/li&gt;
&lt;li&gt;должны ли все утилиты быть отправлены в систему контроля версий или каждый разработчик самостоятельно ставит себе, все, что надо?&lt;/li&gt;
&lt;li&gt;как, в конце концов, интегрируем эту систему с нашим любимым супер навороченным редактором/IDE?&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Все эти вопросы начинают занимать голову, когда билд приходит в неуправляемое состояние.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;В следующем посте я постараюсь рассказать о том, как это все сделано у нас, а пока что...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Я до сих пор очень люблю pre-generated content(PreGC), то есть все данные, которые генерируется до запуска приложения. Это, по сути дела, чем-то похоже на конфиг файлы, куда можно все записать заранее, проверить(что очень важно!) отдельно, а потом использовать. В результате получаем отдельный модуль, который не нужно доводить до 100% оптимального состояния: алгоритмы в офлайне можно использовать самые простые и быстрые для написания.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;У динамического контента(DynGC) &amp;nbsp;те же недостатки, что и преимущества у заранее сгенерированного:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;код приложения усложняется, могут понадобиться различные изощренные оптимизации;&lt;/li&gt;
&lt;li&gt;модульность куда как сложнее организовать;&lt;/li&gt;
&lt;li&gt;данные проверить становится уже сложно, потому что не всякий разработчик DynGC озаботится модульностью (к сожалению, это так!).&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Так что второй вариант выбирать логичнее в случае либо его излишней простоты, либо когда объем данных становится излишне большим.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Хотя вообще &amp;nbsp;спор на эту тему напоминает некий холивар, в котором побеждает тот, у кого больше звездочек на погонах. :)&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/2723721302829569482/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/dynamic-vs-pregenerated-content.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/2723721302829569482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/2723721302829569482'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/dynamic-vs-pregenerated-content.html' title='Dynamic vs. pregenerated content'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2946293286669973681.post-3369570553112026006</id><published>2010-12-04T00:00:00.002+02:00</published><updated>2010-12-08T00:04:40.833+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Vim"/><title type='text'>Vim. Чем же он так хорош?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVBC_azqT22udvufQ__s-rQ3DaL2c35afwrx0qF0yUcLbvjC38cKp-FB1NC8DkvHFlF6mcCYB0xjvtNRBcsQ0SXigJDNhu3QT20FfBVhEfpZQw7XSeUFJLZVjAfMRTTJ75o6LSx02SJTg/s1600/vim_header.gif&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVBC_azqT22udvufQ__s-rQ3DaL2c35afwrx0qF0yUcLbvjC38cKp-FB1NC8DkvHFlF6mcCYB0xjvtNRBcsQ0SXigJDNhu3QT20FfBVhEfpZQw7XSeUFJLZVjAfMRTTJ75o6LSx02SJTg/s1600/vim_header.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Решил изучить Vim, в планах было давно, но все как-то откладывал.&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Помню раньше, работая с сервером под Линухой пользовался вимом для редактирования конфигов - и не понимал всей его прелести. Поэтому меня очень удивило, когда в одной презентации от господ&amp;nbsp;&lt;a href=&quot;http://www.insomniacgames.com/&quot;&gt;Инсомниаков&lt;/a&gt;(проекты -&amp;nbsp;&lt;a href=&quot;http://www.insomniacgames.com/games/ratchet_clank&quot;&gt;раз&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://www.insomniacgames.com/games/resistance&quot;&gt;два&lt;/a&gt;;&amp;nbsp;вики -&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Insomniac_Games&quot;&gt;три&lt;/a&gt;&amp;nbsp;),я увидел скриншот кода, в котором было окошко вима. Это резко изменило мое представление о&amp;nbsp;виме, и я&amp;nbsp;поставил зарубку на память.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Итак, с чего же я начал?&lt;/div&gt;&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Для начала, я нашел несколько вариантов для работы с вимом под виндой.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.vim.org/download.php&quot;&gt;gvim&amp;nbsp;&lt;/a&gt;-&amp;nbsp;официально-родная графическая оболочка для vim, существует как под виндой, так и под линухой.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.viemu.com/&quot;&gt;VimEmu&amp;nbsp;&lt;/a&gt;- плагин для студий версий 2002 и выше, в том числе и 2010. Однако, оказалось, что он платный и не лечится, а отдавать порядка 100$ на что-то, что я еще не изучил...=)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/en-us/59ca71b3-a4a3-46ca-8fe1-0e90e3f79329&quot;&gt;VsVim &lt;/a&gt;- плагин для студии 2010. Open Source проект от одного из разработчиков Microsoft; начат в декабре прошлого года, так что находится уже в достаточно зрелом состоянии. Именно на нем я и остановил свой выбор.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Об этом много уже говорилось, но основное преимущество вима - в том, что не надо прыгать руками по всей клавиатуре, чтобы сделать чтов-то и большинство действий можно выполнить не сходя с буквенно-цифровой части клавиатуры.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Как же работает сам редактор? У него есть несколько режимов функционирования:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;режим вставки - работает так же, как и ввод текста в &quot;обычном&quot; текстовом редакторе.&lt;/li&gt;
&lt;li&gt;командный режим - в нем можно вводить команды: перемещения по тексту и редактирования.&lt;/li&gt;
&lt;li&gt;визуальный режим - можно выделять текст и выполнять команды редактирования уже над выделенным текстом.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;В командном режиме команда действия частенько может сочетаться с командой перемещения. Так, для того, чтобы удалить слово нужно набрать - &amp;lt;Удалить&amp;gt;&amp;lt;Переместиться на слово вперед&amp;gt;, а на клавиатуре - это будет dw. Приятнее, чем Ctrl +Shift + Right -&amp;gt; Del, не так ли? :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Для начала я выучил основные команды для работы с текстом:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;перемещения (h, j, k, l - вниз, влево, вправо, вверх; w,b - на слово вперед и назад)&lt;/li&gt;
&lt;li&gt;редактирования текста (d - удалить, p - вставить ) и проч.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;И начал пробовать. Первые несколько дней мозг ломало по-страшному. У меня с трудом получалось думать о том, что же именно я пишу, а большую часть времени занимало обдумывание следующего действия, примерно так( &quot;джей-джей-эйч-ди-ви&quot;). До сих иногда начинаю разговаривать с собой, когда использую команду, которая еще не записалась на подкорку.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Через неделю такое чувство прошло, и уже сейчас руки иногда начинают срабатывать на автомате. С удивлением иногда замечаю, как совершенно машинально для удаления текущей линии нажимаю dd.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Скорость редактирования действительно увеличивается, но для этого желательно обладать навыками слепой печати.&amp;nbsp;В других текстовых редакторах руки машинально тянутся к Esc и пытаются вставить новую строку над текущей с помощью Shift+o, замечаю, что некоторых функций в них мне уже не хватает - вводить в виме приходится куда как меньше буков. Признаюсь правда, что иногда все-таки использую мышку. На мой взгляд текст ею прокручивать все-таки удобнее)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Еще больше преимущество вима осознал, когда пришлось повозиться с вот этим фрагментом кода:&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;// Set up root attribute parsers
mRootAttribParsers.insert(AttribParserList::value_type(&quot;material&quot;, (ATTRIBUTE_PARSER)parseMaterial));
mRootAttribParsers.insert(AttribParserList::value_type(&quot;vertex_program&quot;, (ATTRIBUTE_PARSER)parseVertexProgram));
mRootAttribParsers.insert(AttribParserList::value_type(&quot;geometry_program&quot;, (ATTRIBUTE_PARSER)parseGeometryProgram));
mRootAttribParsers.insert(AttribParserList::value_type(&quot;fragment_program&quot;, (ATTRIBUTE_PARSER)parseFragmentProgram));

//////////////////////////
// a lot of lines of codes
//////////////////////////
mPassAttribParsers.insert(AttribParserList::value_type(&quot;polygon_mode&quot;, (ATTRIBUTE_PARSER)parsePolygonMode));
mPassAttribParsers.insert(AttribParserList::value_type(&quot;polygon_mode_overrideable&quot;, (ATTRIBUTE_PARSER)parsePolygonModeOverrideable));
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Нужно было извлечь все строки, присутствующие в коде. Не знаю, сколько я бы возился в студии, даже с учетом прямоугольного выделения текста, но в виме это получилось за нажатие порядка 15 клавиш - всего-то записать макрос и воспроизвести его!&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Сейчас очень доволен тем, что решил его таки изучить и сделал его своим текстовым редактором по умолчанию. Все - на вим! Хотя бы попробовать, чтобы понять, как работают программисты в другом мире =)&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinT01C3e95PPnvxL40PJjsj0hV6fm5cECaXtZ8yD4R1pTyzg6wDky6F2GtonIqPFhoK69Fa73FMt0AQkVIwwYPKTbbV67y2OJFG8hqbY5_zx_l1DFpea9ze3G5YTRKbnr7zqS6WwJCFV0/s1600/GVim.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;187&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinT01C3e95PPnvxL40PJjsj0hV6fm5cECaXtZ8yD4R1pTyzg6wDky6F2GtonIqPFhoK69Fa73FMt0AQkVIwwYPKTbbV67y2OJFG8hqbY5_zx_l1DFpea9ze3G5YTRKbnr7zqS6WwJCFV0/s320/GVim.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/3369570553112026006/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/vim.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/3369570553112026006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/3369570553112026006'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/vim.html' title='Vim. Чем же он так хорош?'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVBC_azqT22udvufQ__s-rQ3DaL2c35afwrx0qF0yUcLbvjC38cKp-FB1NC8DkvHFlF6mcCYB0xjvtNRBcsQ0SXigJDNhu3QT20FfBVhEfpZQw7XSeUFJLZVjAfMRTTJ75o6LSx02SJTg/s72-c/vim_header.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2946293286669973681.post-7776120487060683335</id><published>2010-12-02T00:07:00.001+02:00</published><updated>2010-12-05T10:04:10.922+02:00</updated><title type='text'>Декларация этого блога!</title><content type='html'>1) Заводя этот блог я не претендую на то, что он будет обладать исключительным качествами, полезным эффектом (повышения уровня программинга +10, скорости печати +3 и удовлетворения от чтения +4), но собираюсь наполнять его материалом, интересным мне, а, значит, могущим быть интересным кому-то еще.&lt;br /&gt;
2) Заводя этот блог, я надеюсь найти единомышленников, которые будут высказывать свое профессиональное и авторитетное мнение по интересным им вопросам.&lt;br /&gt;
3) Я хочу не только получать знания, но и делиться с ними, так как в этом я чувствую сильную потребность.&lt;br /&gt;
&lt;br /&gt;
Вот и все. Поехали!</content><link rel='replies' type='application/atom+xml' href='http://intuitive-prog.blogspot.com/feeds/7776120487060683335/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/7776120487060683335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2946293286669973681/posts/default/7776120487060683335'/><link rel='alternate' type='text/html' href='http://intuitive-prog.blogspot.com/2010/12/blog-post.html' title='Декларация этого блога!'/><author><name>R-ride</name><uri>http://www.blogger.com/profile/01684987526847028467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEznP3XKGTl-zuFi7Batwr8cR9uuY-NPR9md8H8wvy74yFxtG72q27MHM-RppvaVyvXmTlCuRz5jZbjRr0HTCQoljqpLN2ioDRIQDDlJ-sRiwVmHMds_30RJzwhUESew/s220/%D0%B0%D0%B2%D0%B0%D1%82%D0%B0%D1%80%D0%BA%D0%B0.png'/></author><thr:total>0</thr:total></entry></feed>