<?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-1360099436301425435</id><updated>2024-10-07T11:38:18.639+06:00</updated><title type='text'>Записки мультиплатформщика</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-6279757954781605636</id><published>2011-12-07T15:15:00.001+07:00</published><updated>2011-12-07T15:21:28.070+07:00</updated><title type='text'>Останавливаем сервер или kill -0 $PID</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Иногда бывает полезно, а в некоторых случаях нужно, чтобы скрипт старта - остановки сервера не завершался до полной остановки. Например - типичная ситуация, когда сервер работает с локальной базой данных и нам нужен рестарт - а в простейшем случае это совокупность стоп и старт. При медленной остановке сервера, мы получим в данном случае ошибку при старте - база, например, будет заблокирована оостанавливающимся сервером.&lt;br /&gt;
В скрипте, всегда, в таком случае, использовал недокументированную в некоторых unix команду:&lt;br /&gt;
kill -0 $PID, для проверки существования процесса.&lt;br /&gt;
Но недавно нам попался solaris на котором данная команда приводила к core на остановке.&lt;br /&gt;
pstack выводил следующее:&lt;br /&gt;
 ffffffff7b8ca03c sigacthandler (0, ffffffff7ffff150, ffffffff7fffee70, ffffffff7d100200, 0, ffffffff7ba3c000) + 54&lt;br /&gt;&amp;nbsp;--- called from signal handler with signal 0 (SIGEXIT) ---&lt;br /&gt;&amp;nbsp;ffffffff7b8da240 __lwp_wait (15, ffffffff7ffff3bc, 0, 0, 0, 0) + 8&lt;br /&gt;что вызывало недоумение, ведь согласно мануалу - такого сигнала в solaris нету.&lt;br /&gt;
Переносимое решение пришло такое - вместо kill -0 $PID использовать ps -p $PID, причем, данная команда работает заметно быстрее.&lt;br /&gt;
Финальный стоп скрипт такой:&lt;br /&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;
while ps -p $PID 2&amp;gt;&amp;amp;1 &amp;gt;/dev/null
do
 sleep 1
 echo -n&amp;nbsp;.
done 
&lt;/pre&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/6279757954781605636/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/12/kill-0-pid.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/6279757954781605636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/6279757954781605636'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/12/kill-0-pid.html' title='Останавливаем сервер или kill -0 $PID'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-2501811436478080302</id><published>2011-12-02T19:40:00.001+07:00</published><updated>2011-12-02T20:44:15.438+07:00</updated><title type='text'>Как нам обмануть libtool.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
В проектах, собираемых для множества платформ, иногда бывает необходимо использовать статическую версию библиотек времени выполнения. С нашими проектами все хорошо. Мы их делаем, заботимся о корректных файлах сборки и. т. д. Но как быть со сторонними проектами, у которых система сборки autoconf/libtool? Это хорошо, когда авторы проекта предусматривают такую возможность, допустим при помощи опции для configure. Ну еще, как вариант, можно иногда поправить все эти config.in, m4 - но коварный libtool все равно съедает опцию -static-libgcc.&lt;br /&gt;
И все это требует времени, т.к. autoconf не быстр, а казалось бы надо - всего то ничего - добавить опцию на командную строку gcc.&lt;br /&gt;
Итак, какие же для этого существуют возможности?&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Переопределить CC=&quot;gcc -static-libgcc&quot;. Самое простое. Иногда этого достаточно. Мне попадались экземпляры, которые анализировали данное переопределение убирая второй аргумент. Иногда, пробел между аргументами в каких то&amp;nbsp; тестах давал сбой. &lt;/li&gt;
&lt;li&gt;Переопределить CC=gcc-wrap.sh. В gcc-wrap.sh поместить следующее:
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;/usr/bin/bash
exec gcc -shared-libgcc $*
&lt;/pre&gt;
Этого в большинстве случаев достаточно. Медленно правда - лишний вызов интерпретатора. Если на командную строку попадают кавычки, то такая конструкция их съест. Кавычки используются например для передачи литералов в командную строку.&lt;/li&gt;
&lt;li&gt;Самый лучший и быстрый по скорости вариант: переопределить CC=gcc-wrap на простейшую программу - оболочку gcc-wrap.c:&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;#include &amp;lt;stdio.h&amp;gt; 
#include &amp;lt;unistd.h&amp;gt; 
#define GCCEXE &quot;/usr/bin/gcc&quot;
int main(int argc, char *argv[]) {
char **my_arg = malloc(sizeof(char *) * (argc + 2));
int i;&lt;br /&gt;my_arg[0] = &quot;gcc&quot;;
my_arg[1] = &quot;-static-libgcc&quot;;
for(i=1; i&amp;lt; (argc + 2); i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_arg[i+1] = argv[i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; execvp(GCCEXE, my_arg );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror(GCCEXE);
&amp;nbsp;&amp;nbsp; return 1;
}
&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
Все. Теперь библиотеки собираются как нам надо.&lt;br /&gt;
Кстати, таким образом можно также убирать из командной строки ненужные нам аргументы.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/2501811436478080302/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/12/libtool.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/2501811436478080302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/2501811436478080302'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/12/libtool.html' title='Как нам обмануть libtool.'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-1511405122906947669</id><published>2011-12-01T09:37:00.001+07:00</published><updated>2011-12-01T11:18:37.658+07:00</updated><title type='text'>C++ библиотека-плагин для Unix. Часть 6-я. Локальные статические объекты и чем они страшны.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre&gt;&lt;a href=&quot;http://lib.ru/CPPHB/cppref.txt&quot; target=&quot;_blank&quot;&gt;См. Бьeрн Страустрап. Справочное руководство по C++&lt;/a&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
Все так и работает, как Страустрап прописал. Но однажды столкнулись со следующей проблемой:&lt;br /&gt;
Используя &lt;a href=&quot;http://boost-spirit.com/home/&quot; target=&quot;_blank&quot;&gt;boost::spirit&lt;/a&gt;, богатую выражениями вида:&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;//spirit\home\classic\core\primitives\impl\numerics.ipp
&amp;nbsp; static RT parse(ScannerT const&amp;amp; scan)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static self_t this_;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return impl::implicit_lexeme_parse&amp;lt;RT&amp;gt;(this_, scan, scan);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;/pre&gt;
столкнулись со странными падениями при обращении нашей библиотеки к локальным статическим объектам. Дело это было на нашем любимом HP-UX и главное приложение, вызывающее (через dl_open) нашу библиотеку собрано на aCC. При &lt;a href=&quot;http://gcc.gnu.org/ml/gcc/2002-12/msg00379.html&quot; target=&quot;_blank&quot;&gt;таком раскладе&lt;/a&gt; конструкторы локальных статических объектов не вызываются. Пришлось spirit патчить на предмет всех локальных &lt;i&gt;статиков&lt;/i&gt;, типа:&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;static boost::shared_ptr&amp;lt;object_with_id_base_supply&amp;lt;IdT&amp;gt; &amp;gt; static_supply;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!static_supply.get())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static_supply.reset(new object_with_id_base_supply&amp;lt;IdT&amp;gt;());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id_supply = static_supply;
&lt;/pre&gt;
&lt;br /&gt;
заменяем на синглтон из &lt;a href=&quot;http://www.cs.wustl.edu/%7Eschmidt/ACE.html&quot; target=&quot;_blank&quot;&gt;ACE&lt;/a&gt;:&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;#define BOOST_SPIRIT_SINGLE_PTR(T)\
 (* ACE_Singleton&amp;lt;T, ACE_Thread_Mutex&amp;gt;::instance())
... 
boost::shared_ptr&amp;lt;object_with_id_base_supply&amp;lt;IdT&amp;gt; &amp;gt;&amp;amp; static_supply =
 BOOST_SPIRIT_SINGLE_PTR(
  boost::shared_ptr&amp;lt;object_with_id_base_supply&amp;lt;IdT&amp;gt; &amp;gt;
);
if (!static_supply.get())
  static_supply.reset(new object_with_id_base_supply&amp;lt;IdT&amp;gt;());
  id_supply = static_supply;
&lt;/pre&gt;
Ну и так далее.Кстати, у Clang есть опция &lt;span style=&quot;color: blue;&quot;&gt;-Wexit-time-destructors&lt;/span&gt;, &lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;ru&quot;&gt;&lt;span class=&quot;hps&quot;&gt;предупреждающая&lt;/span&gt;&lt;span class=&quot;&quot;&gt;, о том, что глобальные&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;объекты вызывают&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;деструкторы&lt;/span&gt;&lt;span class=&quot;hps&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;Надо будет как нибудь попробовать&lt;/span&gt;&lt;span class=&quot;hps&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/1511405122906947669/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/12/c-unix-6.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/1511405122906947669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/1511405122906947669'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/12/c-unix-6.html' title='C++ библиотека-плагин для Unix. Часть 6-я. Локальные статические объекты и чем они страшны.'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-2029537774659059448</id><published>2011-11-30T13:31:00.001+07:00</published><updated>2011-11-30T13:51:07.921+07:00</updated><title type='text'>Мультиплатформенная среда разработки</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Вот уже 10 лет пользуюсь такой замечательной средой для разработки, как &lt;a href=&quot;http://fte.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;FTE&lt;/a&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/AVvXsEi9XY2VW1Kw1WEY_WPHHtfUECdxZ69NT4bIggBQY-08coFEAn1Ex2uUtL9nyGex_jzpalAObXylDbBakdYzj30NFA2GADSR5W1ynwPpes8q3Pp5wIVfloXNp5muYEc1fmh0Tr0uqAHAb0M/s1600/fte.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9XY2VW1Kw1WEY_WPHHtfUECdxZ69NT4bIggBQY-08coFEAn1Ex2uUtL9nyGex_jzpalAObXylDbBakdYzj30NFA2GADSR5W1ynwPpes8q3Pp5wIVfloXNp5muYEc1fmh0Tr0uqAHAb0M/s320/fte.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Главное достоинство - мультиплатформенность. Не нужно каждый раз при переходе с одной платформы на другую (например с windows на unix) привыкать к среде разработки.&lt;br /&gt;
&lt;br /&gt;
Кстати, разработчики данного продукта, до сих пор еще вносят новый функционал.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/2029537774659059448/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/blog-post_30.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/2029537774659059448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/2029537774659059448'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/blog-post_30.html' title='Мультиплатформенная среда разработки'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9XY2VW1Kw1WEY_WPHHtfUECdxZ69NT4bIggBQY-08coFEAn1Ex2uUtL9nyGex_jzpalAObXylDbBakdYzj30NFA2GADSR5W1ynwPpes8q3Pp5wIVfloXNp5muYEc1fmh0Tr0uqAHAb0M/s72-c/fte.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-8431643370769017357</id><published>2011-11-29T11:53:00.001+07:00</published><updated>2011-11-29T12:14:32.599+07:00</updated><title type='text'>Разработка и компиляция на удаленных серверах</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Ситуация, когда платформы находятся на другой стороне земного шара - хорошо знакома многим из нас. И хотя сейчас, в век оптоволокна, все не так и плохо, но все же локальная разработка и компиляция все же предпочтительнее.&lt;br /&gt;
Итак, какие инструменты на сегодняшний день доступны?&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Хорошо зарекомендовавший себя, терминальный доступ по протоколу SSH (например через &lt;a href=&quot;http://www.chiark.greenend.org.uk/%7Esgtatham/putty/download.html&quot; target=&quot;_blank&quot;&gt;putty&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Удаленный доступ по различным десктоп-ориентированным протоколам, таким как RDP, X, и.т.п.&lt;/li&gt;
&lt;li&gt;Различные Web приложения для удаленной разработки.&lt;/li&gt;
&lt;li&gt;Приложения - редактирую локально - компилирую удаленно.&lt;/li&gt;
&lt;/ol&gt;
От себя могу рекомендовать приложение четвертого типа:&lt;br /&gt;
 &lt;a href=&quot;http://bvrde.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;BVRDE&lt;/strong&gt;&lt;/a&gt; &lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;ru&quot;&gt;&lt;span class=&quot;hps&quot;&gt;- &lt;/span&gt;&lt;span class=&quot;hps&quot;&gt;интегрированная среда разработки&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;(IDE&lt;/span&gt;&lt;span class=&quot;&quot;&gt;) для&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;C&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;и&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;C + +.&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;ru&quot;&gt;&lt;span class=&quot;hps&quot;&gt;Как пишет автор, &quot;разработан разработчиком для разработчиков&quot;&lt;/span&gt;&lt;span class=&quot;hps&quot;&gt;.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;http://bvrde.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;BVRDE&lt;/strong&gt;&lt;/a&gt; у&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;ru&quot;&gt;меет &lt;span class=&quot;hps&quot;&gt;управлять проектами,&lt;/span&gt; есть &lt;span class=&quot;hps&quot;&gt;интегрированный&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;интерактивный отладчик&lt;/span&gt;&lt;span class=&quot;&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;hps&quot;&gt;мощный&lt;/span&gt; &lt;span class=&quot;hps&quot;&gt;современный редактор исходного&lt;/span&gt; кода&lt;span class=&quot;hps&quot;&gt;. В общем, то, что доктор прописал.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;ru&quot;&gt;&lt;span class=&quot;hps&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://bvrde.sourceforge.net/screenshot1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;237&quot; src=&quot;http://bvrde.sourceforge.net/screenshot1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;ru&quot;&gt;&lt;span class=&quot;hps&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;ru&quot;&gt;&lt;span class=&quot;hps&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;&quot; id=&quot;result_box&quot; lang=&quot;ru&quot;&gt;&lt;span class=&quot;hps&quot;&gt;Кстати, отладчик там управляет gdb, и все очень наглядно, с эволюцией переменных и всеми плюшками.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/8431643370769017357/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/8431643370769017357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/8431643370769017357'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/blog-post.html' title='Разработка и компиляция на удаленных серверах'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-8656075114098163725</id><published>2011-11-28T11:19:00.001+07:00</published><updated>2011-12-02T20:44:00.881+07:00</updated><title type='text'>C++ библиотека-плагин для Unix. Часть 5-я. Cannot dlopen или как исключить LD_PRELOAD</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
На HP-UX иногда возникает ситуация, когда стороннее приложение не сможет загрузить нашу библиотеку динамически (dlopen/shl_load). Ошибка возникает когда библиотека содержит внутри статические Thread Local Storage (TLS) либо ссылается на другие библиотеки ее содержащие.&lt;br /&gt;
Ошибка выводится на консоль в виде строки: &lt;br /&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;/usr/lib/pa20_64/dld.sl: Cannot dlopen load module 
&#39;/usr/lib/pa20_64/libcl.2&#39; because it contains thread specific data.&lt;/pre&gt;
&lt;br /&gt;
В интернете можно встретить на эту тему советы использовать LD_PRELOAD, например &lt;a href=&quot;http://docs.oracle.com/html/A97297_01/ch1_admin.htm#CHDBGDDE&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;.&lt;br /&gt;
Это неплохой совет, если у вас небольшое приложение, использующее стандартные менеджеры памяти например.&lt;br /&gt;
LD_PRELOAD опасен тем, что он переопределяет естественный порядок нахождения символов в библиотеках и при более сложных зависимостях библиотек - приложения - ведет к ошибкам во времени выполнения.&lt;br /&gt;
Как-же быть? Наверно нужно исключить из нашей библиотеки статические секции TLS.&lt;br /&gt;
Как я уже говорил выше, статические секции TLS могут содержатся в нашей библиотеке или в сторонних. В большинстве случаев, нужно и можно найти замену сторонней библиотеке, либо, в случае если доступен исходный код, то можно легко заменить статическую секцию на динамическую. Статические секции в коде декларируются определением &lt;span style=&quot;color: blue; font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;&quot;&gt;__thread&lt;/span&gt;.&lt;br /&gt;
Есть еще один источник статической секции TLS - это библиотека времени выполнения g++: libsupc++.a - при статической линковке или libstdc++.so - при динамической. Динамическую линковку (libstdc++.so) мы можем использовать, если только приложение и наша библиотека собраны одной версией компилятора. Т.е. это не наш случай.&lt;br /&gt;
В libsupc++.a статическая секция TLS содержится в объектном файле eh_globals.o:
&lt;br /&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;nm -C eh_globals.o | grep tbss
[12] |0| 0|SECT |LOCAL|0|.tbss._ZZN12_GLOBAL__N_110get_globalEvE6global|
[9]  |0| 8|TLS  |LOCAL|0|.tbss._ZZN12_GLOBAL__N_110get_globalEvE6global|
{_GLOBAL__N_1::get_global()} global&lt;/pre&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;&quot;&gt;
&lt;br /&gt;
&amp;nbsp;Для ее устранения, нужно либо компилятор пересобрать, чтобы не использовал статические секции (почитать про опции --with-tls --with-__thread), либо - более простой способ - пересобрать данный файл: eh_globals.c. Для этого, потребуется всего лишь немного его подправить, на предмет зависимостей. Затем из локальной копии удаляем из libsupc++.a оригинальный eh_globals.o и добавляем туда наш.&lt;/div&gt;
&lt;div style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;&quot;&gt;
ar d  libsupc++.a eh_globals.o&lt;/div&gt;
&lt;div style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;&quot;&gt;
ar r&amp;nbsp;   libsupc++.a eh_globals_no_tls.o&lt;/div&gt;
&lt;div style=&quot;font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;&quot;&gt;
&lt;/div&gt;
Используем при линковке локальную копию библиотеки.&lt;br /&gt;
Все. Теперь нашей библиотеке не нужен никакой LD_PRELOAD.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/8656075114098163725/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-5-cannot-dlopen-ldpreload.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/8656075114098163725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/8656075114098163725'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-5-cannot-dlopen-ldpreload.html' title='C++ библиотека-плагин для Unix. Часть 5-я. Cannot dlopen или как исключить LD_PRELOAD'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-5350075829234298231</id><published>2011-11-25T11:52:00.001+07:00</published><updated>2011-11-30T22:09:57.201+07:00</updated><title type='text'>C++ библиотека-плагин для Unix. Часть 4-я. Сетевые засады: POSIX vs BSD</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Есть такая замечательная OS, называется &lt;a href=&quot;http://www.hp.com/go/hpux/&quot; target=&quot;_blank&quot;&gt;HP-UX&lt;/a&gt;. Имеет она целых 2 стека TCP: - &lt;a href=&quot;http://ru.wikipedia.org/wiki/POSIX&quot; target=&quot;_blank&quot;&gt;POSIX&lt;/a&gt; и &lt;a href=&quot;http://ru.wikipedia.org/wiki/BSD&quot; target=&quot;_blank&quot;&gt;BSD&lt;/a&gt;. И разработчики этой замечательной системы такие юмористы - сделали одинаковые имена функций, но разные типы аргументов (а еще усугубили тем, что аргументы указатели).&lt;br /&gt;
Допустим, я разработал библиотеку с учетом использования BSD реализации, а приложение (не мое), которое данную библиотеку использует, было разработано с учетом использования POSIX реализации сокетов. Это приведет к тому, что при любой сетевой активности моей библиотеки (допустим при вызове из нее функции приложением) - мы получаем &lt;a href=&quot;http://en.wikipedia.org/wiki/General_protection_fault&quot; target=&quot;_blank&quot;&gt;GPF&lt;/a&gt;.&lt;br /&gt;
Конечно, мы можем договорится с разработчиком приложения использовать одну и ту же реализацию сокетов. Это если приложение одно такое - использует мою библиотеку. А если их несколько? Как быть с уже не поддерживаемыми приложениями?&lt;br /&gt;
&lt;br /&gt;
Выход мне подсказал клиент oracle - libclntsh.so. Ведь правда, линкуй хоть с POSIX хоть с BSD - все работает и не падает. Стал рыть дальше. Посмотрел какие вызовы sockets использует libclntsh.so. Например: setsockopt&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;elfdump -t libclntsh.so.10.1 | grep setsockopt
3253   FUNC GLOB 0     UNDEF      0x0000000000000000 0      _setsockopt
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Ага, использует вызовы из libc (с подчерком перед символом). Как он это делает, интересно?&lt;br /&gt;
Ищем дальше. Смотрим в архивах *.o файлы - ничего там не находим. И вот оно - то что надо (для краткости, я опустил часть вывода): &lt;br /&gt;
&lt;div style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;/div&gt;
&lt;pre class=&quot;shell&quot; name=&quot;code&quot;&gt;nm xnetstubs.o
[28]     |                     0|       0|FUNC |GLOB |0|   UNDEF|_accept
[29]     |                     0|       0|FUNC |GLOB |0|   UNDEF|_bind
[30]     |                     0|       0|FUNC |GLOB |0|   UNDEF|_connect
[31]     |                     0|       0|FUNC |GLOB |0|   UNDEF|_getpeername
...

[39]     |                     0|      80|FUNC |GLOB |0|   .text|accept
[40]     |                     0|      80|FUNC |GLOB |0|   .text|bind
[41]     |                     0|      80|FUNC |GLOB |0|   .text|connect
[42]     |                     0|      80|FUNC |GLOB |0|   .text|getpeername
...
&lt;/pre&gt;
Смотрим, как он это дело линкует. Находим в clntsh.map на первой же строчке:
&lt;pre name=&quot;code&quot; class=&quot;shell&quot;&gt;
-h accept -h bind -h connect -h getpeername -h getsockname -h getsockopt -h setsockopt -h recv -h recvfrom -h send -h sendto -h setsockopt /u01/app/oracle/product/10.2.0/db/lib/xnetstubs.o
&lt;/pre&gt;
В документации по линкеру - -h это значит скрыть символ. Теперь при линковке&amp;nbsp; нашей библиотеки добавляем:&lt;br /&gt;
&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;shell&quot;&gt;
-Wl,-h,accept -Wl,-h,bind -Wl,-h,connect -Wl,-h,getpeername 
-Wl,-h,getsockname -Wl,-h,getsockopt 
-Wl,-h,setsockopt -Wl,-h,recv -Wl,-h,recvfrom 
-Wl,-h,send -Wl,-h,sendto -Wl,-h,setsockopt 
${ORACLE_HOME}/lib/xnetstubs.o
&lt;/pre&gt;
Все. Теперь наша библиотека будет использовать BSD сокеты при любых способах линковки основного приложения.&lt;br /&gt;
&lt;br /&gt;
Кстати, таким образом можно и другие вызовы перенаправлять в требуемые библиотеки. (но об этом в другой раз)&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/5350075829234298231/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-4-posix-vs-bsd.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/5350075829234298231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/5350075829234298231'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-4-posix-vs-bsd.html' title='C++ библиотека-плагин для Unix. Часть 4-я. Сетевые засады: POSIX vs BSD'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-3228864640376716133</id><published>2011-11-24T10:27:00.001+07:00</published><updated>2011-11-28T13:50:21.216+07:00</updated><title type='text'>C++ библиотека-плагин для Unix. Часть 3-я. Наводим порядок с Makefile.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Ни для кого не секрет, что &lt;a href=&quot;http://www.gnu.org/s/make/&quot; target=&quot;_blank&quot;&gt;make&lt;/a&gt; - самая распространенная система сборки и особенно для unix.&lt;br /&gt;
Но make требует особого ухода за Makefile либо каких-то иных, сторонних утилит для его обслуживания. В GNU мире широкое распространение получил autoconf и наверное по праву. У него много достоинств для охвата широкого спектра конфигураций на разных инсталляциях.&lt;br /&gt;
В моем же случае &lt;a href=&quot;http://www.gnu.org/s/autoconf/&quot; target=&quot;_blank&quot;&gt;autoconf&lt;/a&gt; слишком &quot;жирен&quot; и для сборки на моих одних и тех - же машинах повторяет все шаги, тестирует и.т.д.&lt;br /&gt;
&lt;br /&gt;
Для себя же, уже давно выбрал &lt;a href=&quot;http://www.ociweb.com/products/MPC&quot; target=&quot;_blank&quot;&gt;Makefile Project Creator&lt;/a&gt; (MPC). Я использую MPC из библиотеки &lt;a href=&quot;http://www.cs.wustl.edu/%7Eschmidt/ACE.html&quot; target=&quot;_blank&quot;&gt;ADAPTIVE Communication Environment&lt;/a&gt; (ACE) тем более, что я и саму библиотеку часто использую и в поставке имеются дополнения и улучшения. Также MPC умеет создавать файлы проектов для Visual Studio и других распространенных сред. &lt;br /&gt;
Итак, что нам нужно для сборки на разных платформах?&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Библиотека &lt;a href=&quot;http://download.dre.vanderbilt.edu/&quot; target=&quot;_blank&quot;&gt;ACE&lt;/a&gt;. Даже если вам данная библиотека не нужна, MPC в ее поставке отлажен и требует наименьших усилий по доработке.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Распаковываем ее, ставим переменную окружения ACE_ROOT, указывающую на каталог&amp;nbsp; ACE_wrappers. &lt;/li&gt;
&lt;li&gt;На каждой платформе в каталоге ACE_wrappers/makeinclude/include создаем файл platform_macros.GNU . Включаем туда одну строчку, например для linux:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Создаем для нашего проекта mpc файл:&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;project (ourproject)&amp;nbsp; {&lt;/span&gt;&lt;br style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot; /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp; sharedname&amp;nbsp;&amp;nbsp; = ourlibname&lt;/span&gt;&lt;br style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot; /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp; Source_Files {&lt;/span&gt;&lt;br style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot; /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; main.cpp&lt;/span&gt;&lt;br style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot; /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; util.cpp&lt;/span&gt;&lt;br style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot; /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;br style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot; /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Получаем наши проектные Makefile - запускаем в каталоге проекта: &lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;perl ${ACE_ROOT}/bin/mwc.pl&amp;nbsp;&amp;nbsp; -type gnuace&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Запускаем make для сборки.&lt;/li&gt;
&lt;li&gt;Добавляем в наш mpc файл другие опции (смотрим в документации в составе ACE).&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&amp;nbsp;Кстати, с помощью MPC очень легко переносить приложения с одной платформы на другую, но об этом в другой раз.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/3228864640376716133/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-makefile.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/3228864640376716133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/3228864640376716133'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-makefile.html' title='C++ библиотека-плагин для Unix. Часть 3-я. Наводим порядок с Makefile.'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-5387816056067927091</id><published>2011-11-23T10:00:00.001+07:00</published><updated>2011-11-23T13:27:51.739+07:00</updated><title type='text'>Использование SVN в связке с ClearCase</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Так уж исторически сложилось, что ClearCase наше все. Что уж тут поделаешь?! Это интегрированная система с большими возможностями для анализа и других дел, непонятных простому разработчику. И про тормознутость этого ClearCase рассказывать не приходится. Да еще известная фича - когда ClearCase сервер на виндах то и работает с виндовыми клиентами, и наоборот с unix. Ну да где наша не пропадала?!&lt;br /&gt;
&lt;br /&gt;
Создаем отдельную инфраструктуру на SVN - для этого, погуглив, я нашел то, что доктор прописал: &lt;a href=&quot;http://www.visualsvn.com/server/download/&quot; target=&quot;_blank&quot;&gt;VisualSVN&lt;/a&gt;. Это виндовый сервер SVN, есть бесплатная лицензия для коммерческого ипользования, HTTPS опять-же.&lt;br /&gt;
&lt;br /&gt;
Клиенты для VisualStudio есть, но я остановился на &lt;a href=&quot;http://tortoisesvn.net/&quot; target=&quot;_blank&quot;&gt;TortoiseSVN&lt;/a&gt;, как более удобном в эксплуатации. Для своих unix машинок - скомпилял в хоме svn из оригинальных &lt;a href=&quot;http://subversion.apache.org/source-code.html&quot; target=&quot;_blank&quot;&gt;исходников&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь об самом интересном: требуется из SVN периодически переливать изменения в ClearCase. Пришлось перебрать несколько способов, в поиске находились такие, которые или не работали или требовали какие то запредельные права для ClearCase типа CREATE VIEW. Наконец нашел один замечательный проект, написанный на java: &lt;a href=&quot;http://svn2cc.sarovar.org/&quot; target=&quot;_blank&quot;&gt;svn2cc&lt;/a&gt;.&lt;br /&gt;
Использую его так:&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;С помощью svndump создаю изначально полный дамп базы SVN (тут нужен локальный доступ к базе, но подойдет и read-only шара).&lt;/li&gt;
&lt;li&gt;Сохраняю последнюю ревизию базы svn в файле.&lt;/li&gt;
&lt;li&gt;С помощью svn2cc переливаю все в ClearCase.&lt;/li&gt;
&lt;li&gt;Далее использую сохраненную ревизию, чтобы полного дампа не делать, а только инкрементальный.&lt;/li&gt;
&lt;li&gt;Опять повторяем шаг 3 и так по кругу, как только надо залить изменения. &lt;/li&gt;
&lt;/ol&gt;
Правда есть некоторые ограничения этого способа: например не работает переименование каталога в svn - наверно нужно доработать svn2cc - пока просто: если нужно переименовать - то удаляю и создаю заново в svn.&lt;br /&gt;
&lt;br /&gt;
И на последок: если не нужно в ClearCase переливать историю всех изменений - то достаточно&lt;br /&gt;
залить туда вывод svn export с помощью cleartool import и уже потом инкрементально лить изменения.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/5387816056067927091/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/svn-clearcase.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/5387816056067927091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/5387816056067927091'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/svn-clearcase.html' title='Использование SVN в связке с ClearCase'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-8443748713715858390</id><published>2011-11-22T12:38:00.000+07:00</published><updated>2011-12-02T18:15:57.526+07:00</updated><title type='text'>C++ библиотека-плагин для Unix. Часть 2-я. OpenVMS.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Openvms назвать unix-ом скорее всего нельзя. Ну хотя, там за последние 20 лет появились какие то зачатки posix-образности, даже есть GNV (эта так у них GNU называется). Командный процессор (DCL) там тоже не подарок. Хотя, дело привычки. &lt;br /&gt;
Итак, о чем это я?!&lt;br /&gt;
Как то раз, подкинули мне задачку портировать одну замечательную библиотечку с unix на openvms. Библиотечка c++-ная, многопоточная, внешняя библиотека oracle, да еще к тому же сама&lt;br /&gt;
по OCI с соседним oracle работает. Про назначение ее&amp;nbsp; распространяться не буду.&lt;br /&gt;
Один разработчик эту библиотеку месяца три потихоньку на этот предмет до меня ковырял, и сказал мне, что жутко все там тормозит, почему-то. Хоть у нас и не ахти какая быстрая openvms машинка была (alfa какая то, уже не помню), но наши приложения с oracle там довольно таки шустро работали. К нам, в гости, даже по этому поводу приезжал из представительства HP сотрудник&lt;strike&gt; отдела openvms&lt;/strike&gt;. Настроил нам как следует машинку. Библиотечка чуть по шустрее стала работать, но все равно как то не на много.&lt;br /&gt;
Как оказалось, все довольно просто. Раньше, в бытность VAX в VMS не слыхивали о нитях (появились только в последних релизах). По этой причине, видимо для совместимости, по умолчанию никаких нитей нет. Чтобы были нити - нужно при линковке указать линкеру специальный квалификатор &lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;/THREADS_ENABLE.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Все опции и квалификаторы - смотрим &lt;a href=&quot;http://h71000.www7.hp.com/doc/83final/4548/4548pro_002.html&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;
Как уточнил &lt;a href=&quot;http://www.starlet.spb.ru/&quot; target=&quot;_blank&quot;&gt;@RRL&lt;/a&gt;, и я сам тоже начал вспоминать,&lt;br /&gt;
&lt;br /&gt;
&lt;dl class=&quot;avatar-comment-indent&quot; id=&quot;comments-block&quot;&gt;&lt;dd class=&quot;comment-body&quot; id=&quot;Blog1_cmt-2959088654949569587&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;для компилера:&lt;br /&gt;&lt;br /&gt;/reentrancy=multithread&lt;br /&gt;&lt;br /&gt;для линкера:&lt;br /&gt;/threads=(multiple_kernel_threads,upcalls)
&lt;/b&gt;&lt;/blockquote&gt;
&lt;/dd&gt;&lt;/dl&gt;
И сразу же этой библиотеке полегчало. Правда об еще одном камне на дороге стоит упомянуть:&lt;br /&gt;
В openvms размер стека у нити не вмещает OCI-ную нить (которая там штатно, средствами OCI создается), так что пришлось реализовывать вручную для OCI мультинитевость на posix threads.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/8443748713715858390/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-2-openvms.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/8443748713715858390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/8443748713715858390'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-2-openvms.html' title='C++ библиотека-плагин для Unix. Часть 2-я. OpenVMS.'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>3</thr:total><georss:featurename>Россия</georss:featurename><georss:point>62.226996151355472 92.021483999999987</georss:point><georss:box>41.73597715135547 6.3184739999999806 82.718015151355473 177.724494</georss:box></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-3066605907554539039</id><published>2011-11-21T13:31:00.000+07:00</published><updated>2011-11-30T21:55:59.342+07:00</updated><title type='text'>C++ библиотека-плагин для Unix. Часть 1-я. Visibility</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Современные версии g++ (а я решил взять последнюю 4.6.2) обзавелись замечательным атрибутом visibility. Атрибут позволяет как и в windows dll скрывать символы (раньше, все символы в разделяемых библиотеках торчали наружу). &lt;br /&gt;
Подробнее об этом замечательном атрибуте можно почитать в первоисточнике &lt;a href=&quot;http://gcc.gnu.org/wiki/Visibility&quot; target=&quot;_blank&quot;&gt;GCC Wiki Visibility&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Беда в том, что внося новое, обязательно что нибудь старое сломается. Это как в бородатом анекдоте про программиста, его сына и солнце :) А задача у меня, как я уже писал в предыдущем посте, собрать такую старую добрую большую библиотеку, и чтобы не было ссылок на libgcc_s и libstdc++. Вот эта штука, visibility, мне, как оказалось все портила.&lt;br /&gt;
&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;shell&quot;&gt;/usr/bin/ld: /usr/local/gcc/lib/i386-redhat-linux/4.6.2/libgcc_eh.a(unwind-dw2.o)(.text+0x2c3): unresolvable R_386_PLT32 relocation against symbol `_Unwind_Find_FDE@@GCC_3.0&#39;
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: выполнение ld завершилось с кодом возврата 1
gmake[1]: *** [libsnmp_int_stlport.so.5.2.1] Ошибка 1&lt;/pre&gt;
Т.е. как видим из ошибки, линкер не нашел _Unwind_Find_FDE в libgcc_eh.a. Но оно там есть, сам видел:&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;shell&quot;&gt;
ar x libgcc_eh.a
nm unwind-dw2-fde-glibc.o | grep Find
   00001af0 T _Unwind_Find_FDE
&lt;/pre&gt;
Грешил я, что gcc при сборке libgcc_eh.a не добавляет -fPIC - но это зря, все он добавляет.&lt;br /&gt;
Оказалось, что он просто скрыл данный символ этой новой модной штукой visibility. &lt;br /&gt;
Проблему решил, изменив определение
&lt;pre name=&quot;code&quot; class=&quot;cpp&quot;&gt;extern const fde * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *);&lt;/pre&gt;
на
&lt;pre name=&quot;code&quot; class=&quot;cpp&quot;&gt;extern __attribute__ ((visibility (&quot;default&quot;))) const fde * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *);&lt;/pre&gt;
в файле заголовка unwind-dw2-fde.h в исходниках gcc.&lt;br /&gt;
Пересобирать весь gcc не надо. Заходим в каталог сборки boot/i686-pc-linux-gnu/libgcc,&lt;br /&gt;
удаляем *.o и запускаем gmake libgcc_eh.a. Затем подменяем оригинальную libgcc_eh.a или используем прямое указание компилятору рантаймных библиотек. (об этом позже)&lt;br /&gt;
Кстати, в версии 4.3.2. та-же самая проблема .&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/3066605907554539039/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-1-visibility.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/3066605907554539039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/3066605907554539039'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix-1-visibility.html' title='C++ библиотека-плагин для Unix. Часть 1-я. Visibility'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-5041056727905740885</id><published>2011-11-20T21:52:00.000+07:00</published><updated>2011-11-30T21:29:42.589+07:00</updated><title type='text'>Простой способ использования Lua в программе на c++</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Пересмотрев большинство библиотек, предназначенных для вызова Lua из C++ и наоборот, пришел к выводу что наиболее удачным и простым будет сочетание &lt;a href=&quot;https://github.com/prapin/LuaClassBasedCall&quot; target=&quot;_blank&quot;&gt;LuaClassBasedCall&lt;/a&gt; и &lt;a href=&quot;http://lua-users.org/wiki/CppBindingWithLunar&quot; target=&quot;_blank&quot;&gt;Lunar&lt;/a&gt;.&lt;br /&gt;
Из c++ вызов выглядит так (используем&amp;nbsp; &lt;a href=&quot;https://github.com/prapin/LuaClassBasedCall&quot; target=&quot;_blank&quot;&gt;LuaClassBasedCall&lt;/a&gt; ):
&lt;br /&gt;
&lt;pre class=&quot;cpp&quot; name=&quot;code&quot;&gt;double result; 
const char* errmsg = L.PCall(&quot;local a,b = ...; return a*b&quot;,
                     Inputs(3, 2.5), Outputs(result));
&lt;/pre&gt;
Для обратного вызова, используем &lt;a href=&quot;http://lua-users.org/wiki/CppBindingWithLunar&quot; target=&quot;_blank&quot;&gt;Lunar&lt;/a&gt;. Ну и напоследок, чтобы упростить распаковку и упаковку аргументов обратного вызова из Lua (Lunar), применяем аналогичную технологию шаблонов, как было сделано в &lt;a href=&quot;https://github.com/prapin/LuaClassBasedCall&quot; target=&quot;_blank&quot;&gt;LuaClassBasedCall:&lt;/a&gt;
&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;cpp&quot;&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const T&amp;amp; t);&lt;br /&gt;&lt;br /&gt;template&amp;lt;typename T&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const T*&amp;amp; t);&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const int&amp;amp; p) {&lt;br /&gt;&amp;nbsp; lua_pushnumber(L, p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const unsigned int&amp;amp; p) {&lt;br /&gt;&amp;nbsp; lua_pushnumber(L, p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const long&amp;amp; p) {&lt;br /&gt;&amp;nbsp; lua_pushnumber(L, p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const unsigned long&amp;amp; p) {&lt;br /&gt;&amp;nbsp; lua_pushnumber(L, p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const double&amp;amp; p) {&lt;br /&gt;&amp;nbsp; lua_pushnumber(L, p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;inline void push(lua_State* L, const char *p) {&lt;br /&gt;&amp;nbsp; lua_pushstring(L, p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const std::string&amp;amp; p) {&lt;br /&gt;&amp;nbsp; lua_pushlstring(L, p.c_str(), p.length());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const unsigned long long&amp;amp; p) {&lt;br /&gt;&amp;nbsp; push(L, lstrutl::to_str(p));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt;&lt;br /&gt;inline void push(lua_State* L, const bool&amp;amp; p) {&lt;br /&gt;&amp;nbsp; lua_pushboolean(L, p ? 1 : 0);&lt;br /&gt;}&lt;/pre&gt;
и.т.д.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/5041056727905740885/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/lua-c.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/5041056727905740885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/5041056727905740885'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/lua-c.html' title='Простой способ использования Lua в программе на c++'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1360099436301425435.post-7391973708955094575</id><published>2011-11-20T18:20:00.000+07:00</published><updated>2011-11-20T18:20:08.247+07:00</updated><title type='text'>C++ библиотека-плагин для Unix. Вступление.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Иногда хочется странного: как в старых добрых виндах собрать shared библиотеку, и через dlopen использовать ее в других приложениях. На первый взгляд все хорошо, собираешь библиотеку с помощью g++, линкуешься с опцией -shared, и .... . Но тут вспоминаешь, что эта библиотека С++ , приложения могут быть собраны другой версией g++ и вообще другим компилятором.... Понимаешь, что ты попал. Но как говорится - прорвемся! Об этом в следующий раз. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://malexzx.blogspot.com/feeds/7391973708955094575/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/7391973708955094575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1360099436301425435/posts/default/7391973708955094575'/><link rel='alternate' type='text/html' href='http://malexzx.blogspot.com/2011/11/c-unix.html' title='C++ библиотека-плагин для Unix. Вступление.'/><author><name>Александр</name><uri>http://www.blogger.com/profile/06595238888330723419</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMmVOO4sAc_4VtHbQrU_bNsWkgP0xhFiDiDTuEjBP3vMlU1SteXpqWPAA1O18yL4hMXYRMZ9-UzYl8gDSTp7qB6Xn5SY3JYG31A5csEs7QHwDq44Zt_s29ihkRxAlxOeI/s220/DSCN9128.JPG'/></author><thr:total>0</thr:total></entry></feed>