<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:dixx</id>
  <title>tcsh# ls -Al | more</title>
  <subtitle>segmentation fault. core dumped.</subtitle>
  <author>
    <name>Dixx aka CProgrammer</name>
  </author>
  <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom"/>
  <updated>2006-04-28T23:30:29Z</updated>
  <lj:journal userid="1119785" username="dixx" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://dixx.livejournal.com/data/atom" title="tcsh# ls -Al | more"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:13360</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/13360.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=13360"/>
    <title>dixx @ 2006-04-29T03:26:00</title>
    <published>2006-04-28T23:26:47Z</published>
    <updated>2006-04-28T23:30:29Z</updated>
    <content type="html">Давеча &lt;span class='ljuser ljuser-name_titov' lj:user='titov' style='white-space: nowrap;'&gt;&lt;a href='http://titov.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://titov.livejournal.com/'&gt;&lt;b&gt;titov&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; скинул линк с утверждением Торвальдса о том, что copy-on-write при fork()'ах- это плохо. В частности потому, что игры тормозят. Ну мудак, подумал я, и вроде забыл.&lt;br /&gt;&lt;br /&gt;А тут вот какая мысль пришла. Copy-on-write не просто резко облегчает fork() как единственный способ создания нового процесса в UNIX (в особенности с учётом того, что чаще всего после fork'а дочерний процесс выполняет совсем другой код и часть кода/данных родительского процесса оказывается невостребованной), таки его отсутствие категоричестки утяжеляет exec() и, как следствие, например, может сильно замедлять шелл. Так, при вызове /bin/ls из bash придётся скопировать при fork'е весь большой bash вместо небольшого куска кода, отвечающего за запуск маленького ls. Расходы на загрузку и запуск самого ls, понятно, сохраняются в обоих случаях.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:13105</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/13105.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=13105"/>
    <title>Single UNIX Specification</title>
    <published>2006-04-23T12:31:20Z</published>
    <updated>2006-04-23T12:32:44Z</updated>
    <content type="html">Полезная ссылка. Читать и вкуривать до просветления&lt;br /&gt;&lt;a href="http://www.opengroup.org/onlinepubs/009695399/toc.htm"&gt;The Open Group Base Specification Issue 6 (IEEE Std 1003.1, 2004 Edition)&lt;/a&gt; - Single UNIX Specification</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:12899</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/12899.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=12899"/>
    <title>Вывод ошибок и сопутствующей информации</title>
    <published>2006-04-23T01:33:25Z</published>
    <updated>2006-04-23T12:50:29Z</updated>
    <content type="html">Никогда не выводите ошибки в &lt;code&gt;stdout&lt;/code&gt;! Для этого есть &lt;code&gt;stderr&lt;/code&gt;. Если вам необходимо это сделать в шелле, то проще всего сказать &lt;code&gt;echo "an error occured" 1&amp;gt;&amp;amp;2&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Причина тому достаточно проста и кроется в группе стандартных утилит, именуемых в &lt;i&gt;Single UNIX Specification&lt;/i&gt; фильтрами. К их числу относятся &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt; и т.п. Если ваша программа вернёт пустой вывод, то последующие фильтры будут работать предсказуемо - они тоже ничего не вернут. А вот если вы захерачите ошибки в &lt;code&gt;stdout&lt;/code&gt; - то результат работы фильтров будет произвольным.&lt;br /&gt;&lt;br /&gt;Кроме того, существует добрая традиция информацию об использовании программы (номер версии, список ключей и т.д., т.е. то, что обычно получается по ключам &lt;code&gt;-h&lt;/code&gt;/&lt;code&gt;-v&lt;/code&gt;) также запихивать в &lt;code&gt;stderr&lt;/code&gt;. По тем же причинам (например, если существует несколько вариантов реализации утилиты, то на неправильный ключик в командной строке она вполне может ругнуться кратким списком ключиков).&lt;br /&gt;&lt;br /&gt;Теперь непосредственно о том, как правильно выводить ошибки, не изобретая велосипед.&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Во-первых, существует функция &lt;code&gt;perror()&lt;/code&gt; (определена в &lt;code&gt;&amp;lt;stdio.h&amp;gt;&lt;/code&gt;. Выводит как положено (имя процесса: сообщение: текстовый вариант &lt;code&gt;errno&lt;/code&gt;). Неудобна тем, что не понимает printf()-like аргументов и всегда выводит текстовый вариант &lt;code&gt;errno&lt;/code&gt;, даже когда это не нужно.&lt;br /&gt;&lt;br /&gt;Во-вторых, существует целая группа функций, определённых в &lt;code&gt;&amp;lt;err.h&amp;gt;&lt;/code&gt;, состоящая из &lt;code&gt;err()&lt;/code&gt;, &lt;code&gt;verr()&lt;/code&gt;, &lt;code&gt;errx()&lt;/code&gt;, &lt;code&gt;verrx()&lt;/code&gt; и аналогичных вариантов &lt;code&gt;warn()&lt;/code&gt;. Выводят тоже в стандартном формате. Варианты с префиксом &lt;code&gt;v&lt;/code&gt; принимают &lt;code&gt;va_list&lt;/code&gt; вместо списка аргументов, с постфиксом &lt;code&gt;x&lt;/code&gt; - &lt;u&gt;не&lt;/u&gt; выводят текстовый вариант &lt;code&gt;errno&lt;/code&gt;. Группа функций &lt;code&gt;[v]err[x]()&lt;/code&gt; при этом не возвращает управление назад, а внутри себя вызывает &lt;code&gt;exit()&lt;/code&gt; с переданным ей кодом завершения, что на мой взгляд не совсем правильно - я предпочитаю полноценную корректную финализацию.&lt;br /&gt;&lt;br /&gt;Исходя из удобства, наиболее полезными можно считать &lt;code&gt;[v]warn[x]()&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;В-третьих, есть ручной вариант, если хочется собственного формата (что есть зло - не изобретайте велосипед, ибо наверняка предыдущие изобретатели, принимая во внимание то, сколько API &lt;i&gt;UNIX&lt;/i&gt; прожило, учитывали кучу факторов, о которых вы можете не догадываться). Заключается в определении функции или макроса, которые дёргают &lt;code&gt;fprintf(stderr)&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Для получения имени процесса в таком варианте можно воспользоваться классикой (&lt;code&gt;basename(argv[0])&lt;/code&gt;, либо специфичным для ОС функциями (&lt;code&gt;getprogname()&lt;/code&gt; в &lt;i&gt;BSD&lt;/i&gt;). Так как все они возвращают указатель на статический буфер, лучше сразу сделать от их результата &lt;code&gt;strdup()&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Также следует учитывать, что если вы пишете демона и он уже освободил управляющий терминал или просто &lt;code&gt;fork()&lt;/code&gt;'анулся - не надо на оный терминал кидать ошибки. Ничего хорошего из этого не выйдет. В лучшем случае вы огребёте некрасивый вывод, в худшем - &lt;code&gt;SIGPIPE&lt;/code&gt;. Есть более правильный, удобный, универсальный и быстрый (да-да) стандартный способ - &lt;code&gt;syslog&lt;/code&gt;. Заодно он избавляет вас в большинстве случаев от написания собственного вывода в логи.&lt;br /&gt;&lt;br /&gt;Пример:&lt;br /&gt;&lt;pre&gt;
#include &amp;lt;sys/types.h&amp;gt;
#include &amp;lt;syslog.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;libgen.h&amp;gt;

int
main(int argc, char *argv[])
{
  pid_t pid;

  pid = fork();
  if (pid &amp;lt; 0)
    err(EXIT_FAILURE, "fork() failed");
  if (pid &amp;gt; 0)
    return EXIT_SUCCESS;

  openlog(basename(argv[0]), LOG_CONS | LOG_NDELAY, LOG_DAEMON);

  if (myfunc() &amp;lt; 0)
    syslog(LOG_ERR, "myfunc() failed: %s", strerror(errno));

  return EXIT_SUCCESS;
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;И в данном случае сделать удобный макрос для дописывания &lt;code&gt;strerror(errno)&lt;/code&gt; последним аргументом в вызов &lt;code&gt;syslog()&lt;/code&gt; сам бог велел. А ещё есть &lt;code&gt;vsyslog()&lt;/code&gt;, который, понятно из названия, принимает &lt;code&gt;va_list&lt;/code&gt;.&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:12665</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/12665.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=12665"/>
    <title>PID-файлы</title>
    <published>2006-04-22T22:47:34Z</published>
    <updated>2006-04-23T01:36:12Z</updated>
    <content type="html">Актуальность темы подтвердил сегодня &lt;span class='ljuser ljuser-name_titov' lj:user='titov' style='white-space: nowrap;'&gt;&lt;a href='http://titov.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://titov.livejournal.com/'&gt;&lt;b&gt;titov&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. Так вот, PID-файлы - очень полезная штука, не только в случае демонов, но и в случае всяких скриптов, запускаемых из &lt;code&gt;cron&lt;/code&gt;'а.&lt;br /&gt;&lt;br /&gt;Я достаточно часто встречался с ситуацией, когда такой скрипт, который по мнению его разработчика, отработает очень быстро и всё будет чики-пуки, в реальности через какое-то время засирает таблицу процессов подвисшими экземплярами себя. Правильное поведение в данном случае - проверять наличие других экземпляров процесса и в случае нахождения ругаться в лог.&lt;br /&gt;&lt;br /&gt;Кроме того, pid-файлы крайне удобны в случае, когда процесс надо прибить. Чем делать &lt;code&gt;ps | grep myprocess | grep -v grep&lt;/code&gt;, куда проще сделать &lt;code&gt;cat /var/run/myproc.pid&lt;/code&gt;. В принципе, есть ещё &lt;code&gt;pidof&lt;/code&gt;, но есть он не везде.&lt;br /&gt;&lt;br /&gt;Также существует заблуждение, что работа с PID-файлами - это как два пальца обоссать. Это не так, тут есть тоже куча хитростей. Собственно...&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;Жить правильно надо примерно так (некоторые комментарии будут даны после кода):&lt;br /&gt;&lt;pre&gt;
#include &amp;lt;sys/types.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;fcntl.h&amp;gt;
#include &amp;lt;errno.h&amp;gt;
#include &amp;lt;err.h&amp;gt;

static int initialize(void);
static void finalize(void);

static char *pid_fname = "/var/run/myproc.pid";
static int   pid_fd    = -1;

int
main(int argc, char *argv[])
{
  if (initialize() &amp;lt; 0)
    return EXIT_FAILURE;

  /* здесь мы что-нибудь делаем */

  finalize();

  return EXIT_SUCCESS;
}

static int
initialize(void)
{
  int   ok      = 0;
  char *pid_buf = NULL;
  int   pid_len;

  do {
    /* собственно, открываем файл */
    pid_fd = open(pid_fname, O_CREAT | O_WRONLY);
    if (pid_fd &amp;lt; 0) {
      warn("can't open pid file: %s", pid_fname);
      break;
    }

    /* пытаемся его заблокировать - собственно проверка наличия копий процесса */
    if (flock(pid_fd, LOCK_EX | LOCK_NB) &amp;lt; 0) {
      if (errno == EWOULDBLOCK)
        warnx("already running?");
      else
        warn("flock() failed: %s", pid_fname);
      break;
    }

    /* файл заблокирован - всё хорошо, надо записать туда наш pid */

    /* получаем строковое представление идентификатора (getpid() не может вернуть ошибку) */
    pid_len = asprintf(&amp;amp;pid_buf, "%ll\n", (long long)getpid());
    if (!pid_buf) {
      warn("asprintf() failed");
      break;
    }

    /* теперь надо обрезать pid-файл до нужного размера, иначе после записи там может остаться лишнее */
    if (ftruncate(pid_fd, (off_t)pid_len) &amp;lt; 0) {
      warn("ftruncate() failed");
      break;
    }

    /* собственно, записываем pid. ввод/вывод блокирующий, поэтому достаточно одного вызова */
    if (write(pid_fd, (void *)pid_buf, (size_t)pid_len) &amp;lt; (ssize_t)pid_len) {
      warn("write() failed");
      break;
    }

    /* вот теперь всё чики-пуки */
    ok = 1;
  } while (0);

  /* корректно завершаемся при ошибках */
  if (!ok) {
    /* закрываем и удаляем pid-файл, если мы его таки открыли */
    if (pid_fd &amp;gt;= 0) {
      unlink(pid_fname);
      close(pid_fd);
    }
  }

  /* освобождаем память */
  if (pid_buf)
    free(pid_buf);

  return ok ? 0 : -1;
}

static void
finalize()
{
  /* закрываем и удаляем pid-файл */
  if (pid_fd &amp;gt;= 0) {
    unlink(pid_fname);
    close(pid_fd);
  }
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь немного комментариев к коду.&lt;br /&gt;&lt;br /&gt;1) Почему flock(), а не fcntl()?&lt;br /&gt;&lt;br /&gt;В прицнипе, похрену, какой из вариантов блокировок использовать. Но у &lt;code&gt;flock()&lt;/code&gt; есть ряд преимуществ:&lt;br /&gt;&lt;br /&gt;а) он проще (так как не требует заполнения &lt;code&gt;struct flock&lt;/code&gt;).&lt;br /&gt;б) он наследуется при &lt;code&gt;fork()&lt;/code&gt;'е (да-да, если кто не знает - блокировки fcntl() не наследуются при разветвлении процесса, а в каком-то из мануалов BSD это было законно названо System V stupidity :).&lt;br /&gt;&lt;br /&gt;Последнее особенно важно. Ибо в случае демона по моему мнению всю возможную инициализацию следует делать до освобождения управляющего терминала, чтобы иметь возможность кинуть юзеру мессаг в консоль, а не в лог.&lt;br /&gt;&lt;br /&gt;2) asprintf()?&lt;br /&gt;&lt;br /&gt;Можно обойтись и статическим буфером. Но с asprintf() не надо париться с его размером (ведь никто не обещал 32-битность pid_t).&lt;br /&gt;&lt;br /&gt;3) unlink() до close()?&lt;br /&gt;&lt;br /&gt;Так и только так. Потому что только в таком случае гарантируется отсутствие одновременного доступа к файлу двух экземпляров процесса. Так мы удаляем сначала ссылку на inode (после чего второй процесс просто создаст другой inode), а только потом закрываем файл (в результате чего, собственно, снимается блокировка).&lt;br /&gt;&lt;br /&gt;4) BSD-specific?&lt;br /&gt;&lt;br /&gt;Есть в BSD-системах маленькая удобная мулька, которая позволяет избавиться от вызова &lt;code&gt;flock()&lt;/code&gt;. Но она есть только в BSD, посему её лучше не использовать. Мулька заключается в атомарной блокировке файла при его открытии (т.е. атомарность пары операций). Выглядит так:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;pid_fd = open(pid_fname, O_CREAT | O_EXLOCK | O_NONBLOCK | O_WRONLY);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Если файл не получится одновременно с открытием заблокировать - он просто не откроется и &lt;code&gt;open()&lt;/code&gt; вернёт ошибку.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Вот где-то так :)&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:12312</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/12312.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=12312"/>
    <title>Эмуляция обработки исключений в C</title>
    <published>2006-04-22T20:23:57Z</published>
    <updated>2006-04-22T23:05:17Z</updated>
    <content type="html">Итак, приступим. Я по многим причинам не люблю C++, предпочитая ему обычный C. Почему - вопрос отдельный. Тем не менее, в C++ есть много полезных вещей, и одна из них - обработка исключений. Понятно, что простыни вложенных if'ов с обработкой ошибок очень сильно напрягают. Лечится, на самом деле, просто:&lt;br /&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;
int
myfunc1()
{
  int ok = 0;

  do {
    /* тут делаем что нам надо */
    fp = fopen("myfile.txt", "r");
    if (!fp)
      break;

    /* и ещё что-нибудь */
    if (myfunc2() &amp;lt; 0)
      break;

    ok = 1;
  } while (0);

  if (!ok) {
    /* а тут обрабатываем ошибки */
  }

  return ok ? 0 : -1;
}
&lt;/pre&gt;&lt;br /&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:12196</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/12196.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=12196"/>
    <title>Disclaimer</title>
    <published>2006-04-22T16:54:41Z</published>
    <updated>2006-04-23T12:35:59Z</updated>
    <content type="html">Таки данный журнал возобновляет свою работу, но уже в контексте чисто программерских заметок. Всё остальное по-прежнему останется в основном ЖЖ &lt;span class='ljuser ljuser-name_dnovikoff' lj:user='dnovikoff' style='white-space: nowrap;'&gt;&lt;a href='http://dnovikoff.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://dnovikoff.livejournal.com/'&gt;&lt;b&gt;dnovikoff&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:12006</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/12006.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=12006"/>
    <title>%)</title>
    <published>2004-02-13T17:14:30Z</published>
    <updated>2004-02-13T17:14:30Z</updated>
    <content type="html">Всё ж таки, до чего ебанутый у нас народ. Пятница, вечер, 20:00. Я сижу, таки жду, когда же все к чертям собачьим уйдут с работы, чтобы можно было нормально поработать самому. И тут выясняется, что ни одна сволочь и не думает сваливать. Засада просто. Полная.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:11673</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/11673.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=11673"/>
    <title>dixx @ 2004-02-12T18:27:00</title>
    <published>2004-02-12T15:30:32Z</published>
    <updated>2004-02-12T15:30:32Z</updated>
    <lj:music>Pink Floyd</lj:music>
    <content type="html">Странный день. Даже музыка не помогает прийти в нужное для работы состояние. Или вокруг просто слишком много людей. Пересчитал - вроде пятеро. Слишком много.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:11475</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/11475.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=11475"/>
    <title>О как!</title>
    <published>2004-02-08T21:20:26Z</published>
    <updated>2004-02-08T21:20:26Z</updated>
    <lj:music>Pink Floyd - The division bell - High hopes</lj:music>
    <content type="html">Со мной очередной раз случился приступ экстремального минимализма, выражающийся в снесении с ноутбука всей графики вообще. Был приятно удивлён, когда выяснил, что при помощи lynx можно вполне адекватным образом шариться в инете (собственно сей пост пишется именно из-под lynx 2.8.5). Поставил себе старый добрый MP3Blaster заместо XMMS, настроил 16 pty на syscons'е и сижу тащусь. ВОТ.&lt;br /&gt;Причиной же тому, судя по всему, стали тяжёлые роды FreeBSD 5.2.1-RC (никому не пожелаю). Началось с того, что ента сволочь с GENERIC-ядром при первой загрузке рухнула в kernel panic. Немного удивившись, пробутался с FreeBSD 5.1 Live filesystem и пересобрал ядро. Чего глюкало - хз, но после пересборки оно пришло в себя и даже загрузилось. Далее выяснилось, что хруники из BSD за каким-то поменяли номера syscall'ов, в результате чего половина софта (включая тот же mergemaster падала по SIGSEGV с воплями invalid system call number). В итоге угробил день.&lt;br /&gt;Кстати, на удивление, в 5.2.1 на моём ноуте наконец-то нормально заработало ACPI + APM, хотя, по свидетельствам очевидцев :-) именно ACPI  в 5.2.1 более всего нерабочее. Сплошные парадоксы, блин.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:11145</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/11145.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=11145"/>
    <title>dixx @ 2003-12-31T13:55:00</title>
    <published>2003-12-31T11:01:34Z</published>
    <updated>2003-12-31T11:02:31Z</updated>
    <content type="html">&lt;table border="0" width="300" cellspacing="1" cellpadding="5" bgcolor="#404040"&gt;&lt;tr&gt;&lt;td bgcolor="#FFFFFF" align="center"&gt;&lt;big&gt;&lt;big&gt;&lt;font color="#FF0000"&gt;&lt;b&gt;Я спецназовец ГРУ!&lt;/b&gt;&lt;/font&gt;&lt;/big&gt;&lt;/big&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left" bgcolor="#FFFFFF"&gt; Вы – ужас, летящий на крыльях ночи. Вас втихаря боится вся Европа, а остальным крупно повезло что они про вас не знают. Остальные спецназы мира услышав про вас, нервно курят и поминают вас матерным словом. Для вас нет такого понятия – невыполнимая задача. Единственное что вас может остановить – направленный ядерный взрыв, и то не факт... Вы можете захватить АЭС, убить любого президента, обесточить Брюссель, проехать по Парижу на танке, устроить кошмар в тылу бундесвера и уйти непойманым. Вы – суперсолдат, вы – элита, ваш голубой берет – это круче всех орденов!&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" bgcolor="#002080"&gt;&lt;a href="http://www.aeterna.ru/cgi-bin/maina.cgi?page=test0&amp;amp;link=000000:000003:000062:000002"&gt;&lt;big&gt;&lt;font color="#FFFFFF"&gt;Какой вы спецназовец?&lt;/font&gt;&lt;/big&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:10828</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/10828.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=10828"/>
    <title>dixx @ 2003-12-30T18:51:00</title>
    <published>2003-12-30T15:58:00Z</published>
    <updated>2003-12-30T15:58:00Z</updated>
    <content type="html">Коньяк, лимончик, наблюдение за коллегами, режущимися в преферанс... Плюс ремиксы на Delerium из колонок... Что ещё надо для хорошего настроения? :)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:10604</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/10604.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=10604"/>
    <title>Merry Christmas, мать его %)</title>
    <published>2003-12-26T17:37:56Z</published>
    <updated>2003-12-26T17:37:56Z</updated>
    <lj:music>Pink Floyd - Meddle - Echoes</lj:music>
    <content type="html">Странный новый год выходит, очень странный. Пожалуй, по прошествии некоторых событий как на работе, так и в прочих местах, единственное, что остаётся - сходить в магазин, купить бутылку какого-нить Bowen или Courvoiser XO и тихо заснуть в обнимку с оной бутылкой и баальшой плюшевой собакой.&lt;br /&gt;&lt;br /&gt;Удивительно, что подобные перспективы не вызывают никаких отрицательных эмоций. Ровно так же, как и положительных. Ровно так же, как не вызывают вообще никаких эмоций. Они просто есть. И есть усталость на пару с кучей предновогодних геморроев, не имеющих к самому новому году никакого отношения.&lt;br /&gt;&lt;br /&gt;Ещё можно провести новый год на рабочем месте. Тоже весело. Учитывая, что планов всё равно никаких. В сравнении со всем остальным получается однохуйственно. Или монопенисуально, если выражаться несколько изящнее.&lt;br /&gt;&lt;br /&gt;Интересно, почему-то мурлыкание Гилмора на гитаре, датируемое 1971-м годом, вызывает у меня эмоций на порядок больше, нежели общение с людьми.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:10313</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/10313.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=10313"/>
    <title>dixx @ 2003-12-25T14:05:00</title>
    <published>2003-12-25T11:15:03Z</published>
    <updated>2003-12-25T11:15:03Z</updated>
    <lj:music>Pink floyd - Dark side of the moon - Time</lj:music>
    <content type="html">Люди, а что по-вашему время? И зачем его считать? :)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:10234</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/10234.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=10234"/>
    <title>%))</title>
    <published>2003-12-25T10:11:52Z</published>
    <updated>2003-12-25T10:11:52Z</updated>
    <content type="html">Сегодня всю ночь пытался уснуть мордой в подушку так, чтобы ещё при этом и не задохнуться. Обычно сплю на боку. На спине совсем не получается - не знаю, почему. А тут мешались свежекупленные Beyerdynamic DT990. Музыки, в общем, хотелось. В итоге я-таки умудрился улечься на бок, посредством помещения головы в щель между подушкой и подлокотником дивана - щель как раз примерно с ухо размером.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:9975</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/9975.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=9975"/>
    <title>dixx @ 2003-12-24T12:56:00</title>
    <published>2003-12-24T10:03:07Z</published>
    <updated>2003-12-24T10:03:07Z</updated>
    <content type="html">Решил, что хочется чего-то позитивного и весёлого. Новый год-таки на дворе. Ну или почти на дворе. Перед работой купил mp3-диск Linkin Park + Papa Roach. И ХДЕ МОЙ ЛЮБИМЫЙ Reanimation? Сволочи, одним словом. А ещё полное собрание называется :(&lt;br /&gt;&lt;br /&gt;P.S. Или я чего-то путаю?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:9611</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/9611.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=9611"/>
    <title>Kill'em all!</title>
    <published>2003-12-22T14:04:26Z</published>
    <updated>2003-12-22T14:04:26Z</updated>
    <content type="html">Бля, ну почему из-за какого-то ленивого мудака приходится разгребать кучи говна вместо того, чтобы пить в красивом ресторане на халяву коктейли?! Что за педерастия такая? Почему за две с лишним недели (если не больше) нельзя проставить мониторинг количества inodes через snmp?! даже скрипт уже готов, ток проставить осталось. И в результате такая вот ХУЙНЯ. С большой буквы капсом.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:9426</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/9426.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=9426"/>
    <title>userpic</title>
    <published>2003-12-21T14:24:28Z</published>
    <updated>2003-12-21T14:24:28Z</updated>
    <content type="html">А у меня наконец-то появился юзерпик! %)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:9136</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/9136.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=9136"/>
    <title>dixx @ 2003-12-11T14:29:00</title>
    <published>2003-12-11T11:33:13Z</published>
    <updated>2003-12-11T11:33:59Z</updated>
    <content type="html">БЛЯ! Ну что ж за неделя такая ебанутая?! Ещё и пятница обломалась. Пиздец просто какой-то.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:8758</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/8758.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=8758"/>
    <title>dixx @ 2003-12-11T11:26:00</title>
    <published>2003-12-11T08:45:56Z</published>
    <updated>2003-12-11T08:55:48Z</updated>
    <lj:music>Deep Purple - Deep Purple - April</lj:music>
    <content type="html">Час X наступил. Здоровый пофигизм перерос в нездоровый и отныне на неопределённый срок девиз мой - "а ебись оно всё конём". Все недовольные же могут идти лесом. Сие заявление прошу считать официальным %)&lt;br /&gt;&lt;br /&gt;Позавчера &lt;span class='ljuser ljuser-name_morigan' lj:user='morigan' style='white-space: nowrap;'&gt;&lt;a href='http://morigan.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://morigan.livejournal.com/'&gt;&lt;b&gt;morigan&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; вскользь бросила фразу: "Димк, а у тебя руки трясутся". Вчера посмотрел и удивился - реально трясутся. Плюс ко всему ещё и повышение зарплаты оказалось премией. Блин, я могу понять повышение зарплаты на 12,5%, но премия в виде 12,5% от зарплаты - imho, издевательство.&lt;br /&gt;&lt;br /&gt;Тут ишшо начальник выдал "так как тасков будет много всегда, надо делать какие-то шаги для плавного перехода к топу2". Какой в жопу плавный переход?!!! Да это говно выкинуть надо и новое написать. Короче, нет счастья в жизни. Ещё приходить вовремя надо.&lt;br /&gt;&lt;br /&gt;Да и после зарплаты в альфе работать на сии копейки... В общем, ЗАЕБАЛО гробить своё здоровье без всякого оргазма от работы, будь то оргазм финансовый либо творческий.&lt;br /&gt;&lt;br /&gt;Итог прост: сей мессаг можно считать заявлением о начале поиска работы. Так что, кто готов предложить з/п от 1500EUR (именно ОТ без всяких там приколов на испытательный срок и именно EUR) программеру C/C++/Perl/Java/Asm(x86/x51/x48/21xx(x)) с опытом разработки крупных информационных систем (в частности, веб-ориентированных) как на Unix(FreeBSD,Solaris,QNX)/Linux, так и на виндах - обращайтесь за резюме на cprog@rambler.ru.&lt;br /&gt;&lt;br /&gt;P.S. Ибо нехуй.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:8506</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/8506.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=8506"/>
    <title>dixx @ 2003-11-27T20:31:00</title>
    <published>2003-11-27T13:08:33Z</published>
    <updated>2003-11-27T13:08:33Z</updated>
    <content type="html">Точно день ебанутый. Написал предыдущий пост. Посмотрел на код. И увидел баг. 2 минуты. Херь какая-то просто...</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:8287</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/8287.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=8287"/>
    <title>dixx @ 2003-11-27T20:21:00</title>
    <published>2003-11-27T13:02:10Z</published>
    <updated>2003-11-27T13:02:10Z</updated>
    <content type="html">Бля, ну что ж за день сегодня ебанутый такой?! Час смотрю на 15 строчек кода и не могу найти баг. Ладно б, еще segfault'ы какие-нить плавающие, так ни хуя - цикл с двумя переменными. Жопа. Которая вездесуща. Ещё и не выспался, к тому же.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:8041</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/8041.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=8041"/>
    <title>dixx @ 2003-11-23T19:02:00</title>
    <published>2003-11-23T16:23:35Z</published>
    <updated>2003-11-23T16:23:35Z</updated>
    <content type="html">Наконец-таки купил себе давно потерянный диск Орфа... Слушал и тащился. Заебал всех. Но это их проблемы.&lt;br /&gt;&lt;br /&gt;А потом дома выключили электричество. Преимущества ноута стали явно видны. ))</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:7930</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/7930.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=7930"/>
    <title>... %))))</title>
    <published>2003-11-20T17:02:29Z</published>
    <updated>2003-11-20T17:03:07Z</updated>
    <lj:music>Morcheeba - Almost done</lj:music>
    <content type="html">Оно.... РАБОТАЕТ! %) Мать его в ..., но оно работает! %) Конечно, остались ещё баги, осталось ещё достаточно много рутины... но! %)&lt;br /&gt;&lt;br /&gt;Когда был установлен сей факт, я понял, что хочу нажраться. И настучать кому-нить по физиономии. От души так... И под хорошую музыку. А потом лечь спать. На сутки.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:7490</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/7490.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=7490"/>
    <title>dixx @ 2003-11-20T14:50:00</title>
    <published>2003-11-20T11:52:20Z</published>
    <updated>2003-11-20T11:52:20Z</updated>
    <content type="html">Всё-таки возможность пить пиво на работе открывает потрясающие горизонты для развития сей привычки ;)))) Надо с этим как-то бороться %)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:dixx:7343</id>
    <link rel="alternate" type="text/html" href="http://dixx.livejournal.com/7343.html"/>
    <link rel="self" type="text/xml" href="http://dixx.livejournal.com/data/atom/?itemid=7343"/>
    <title>dixx @ 2003-11-19T12:01:00</title>
    <published>2003-11-19T09:03:06Z</published>
    <updated>2003-11-19T09:29:39Z</updated>
    <content type="html">Опять опоздал на работу - всю ночь отрывались с &lt;span class='ljuser ljuser-name_lekar' lj:user='lekar' style='white-space: nowrap;'&gt;&lt;a href='http://lekar.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://lekar.livejournal.com/'&gt;&lt;b&gt;lekar&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;'ем и &lt;span class='ljuser ljuser-name_morigan' lj:user='morigan' style='white-space: nowrap;'&gt;&lt;a href='http://morigan.livejournal.com/profile'&gt;&lt;img src='http://l-stat.livejournal.com/img/userinfo.gif' alt='[info]' width='17' height='17' style='vertical-align: bottom; border: 0; padding-right: 1px;' /&gt;&lt;/a&gt;&lt;a href='http://morigan.livejournal.com/'&gt;&lt;b&gt;morigan&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. Результаты позитивные - снятие псих.усталости %) Но вот с сонливостью всё иначе... С утра поймал себя на том, что пофигизм начинает вновь приобретать нездоровые формы :)</content>
  </entry>
</feed>
