<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Журнал системного программиста &#187; xsystem</title>
	<atom:link href="http://sadko.xskernel.org/archives/tag/xsystem/feed" rel="self" type="application/rss+xml" />
	<link>http://sadko.xskernel.org</link>
	<description>блог обо всём и ни о чём</description>
	<lastBuildDate>Wed, 14 Dec 2011 20:21:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Развитие XSystem</title>
		<link>http://sadko.xskernel.org/archives/1375</link>
		<comments>http://sadko.xskernel.org/archives/1375#comments</comments>
		<pubDate>Thu, 27 Aug 2009 11:42:34 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1375</guid>
		<description><![CDATA[Tweet Как-никак, а развитие ядра потихоньку идёт. В последнее время мною был реализован загрузчик PE-файлов в память с последующим запуском в user level. Реализация загрузчика PE немножко замедлила реализацию загрузчика файлов формата ELF, так как я обнаружил серьёзные изъяны в функциях, работающих с файлами. Нужно будет переписывать их реализацию. А так, надеюсь, к сентябрю успею [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1375',
  title: 'Развитие XSystem',
  description: 'Как-никак, а развитие ядра потихоньку идёт.\nВ последнее время мною был реализован загрузчик PE-файлов в память с последующим запуском в user level. Реализация загрузчика PE немножко замедлила реали...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1375"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&nbsp;&ETH;&deg;&ETH;&middot;&ETH;&sup2;&ETH;&cedil;&Ntilde;&ETH;&cedil;&ETH;&micro; XSystem" data-url="http://sadko.xskernel.org/archives/1375">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Как-никак, а развитие ядра потихоньку идёт.<br />
В последнее время мною был реализован загрузчик PE-файлов в память с последующим запуском в user level. Реализация загрузчика PE немножко замедлила реализацию загрузчика файлов формата ELF, так как я обнаружил серьёзные изъяны в функциях, работающих с файлами. Нужно будет переписывать их реализацию. А так, надеюсь, к сентябрю успею выпустить новый релиз.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1375/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Менеджер виртуальной памяти</title>
		<link>http://sadko.xskernel.org/archives/1104</link>
		<comments>http://sadko.xskernel.org/archives/1104#comments</comments>
		<pubDate>Thu, 25 Jun 2009 22:21:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[os]]></category>
		<category><![CDATA[virtual memory]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1104</guid>
		<description><![CDATA[Tweet Всё-таки нашёл в себе силы реализовать менеджер виртуальной памяти в XSystem. Конечно, готов он не на все 100%, но бОльшая часть уже действительно оттестирована и работает. Как подтверждение этого ядро было переведено на новый менеджер, а старый был выкинут из дерева проекта. Теперь ядро умеет одинаково хорошо обращаться с обычной страничной адресацией и PAE [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1104',
  title: 'Менеджер виртуальной памяти',
  description: 'Всё-таки нашёл в себе силы реализовать менеджер виртуальной памяти в XSystem. Конечно, готов он не на все 100%, но бОльшая часть уже действительно оттестирована и работает. Как подтверждение этого ...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1104"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&ETH;&micro;&ETH;&frac12;&ETH;&micro;&ETH;&acute;&ETH;&para;&ETH;&micro;&Ntilde; &ETH;&sup2;&ETH;&cedil;&Ntilde;&Ntilde;&Ntilde;&ETH;&deg;&ETH;&raquo;&Ntilde;&ETH;&frac12;&ETH;&frac34;&ETH;&sup1; &ETH;&iquest;&ETH;&deg;&ETH;&frac14;&Ntilde;&Ntilde;&ETH;&cedil;" data-url="http://sadko.xskernel.org/archives/1104">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Всё-таки нашёл в себе силы реализовать менеджер виртуальной памяти в XSystem. Конечно, готов он не на все 100%, но бОльшая часть уже действительно оттестирована и работает. Как подтверждение этого ядро было переведено на новый менеджер, а старый был выкинут из дерева проекта.<br />
Теперь ядро умеет одинаково хорошо обращаться с обычной страничной адресацией и PAE (Page-Address Extension). Для этого достаточно перекомпилировать ядро с соответствующими параметрами.<br />
В ближайшее время на wiki постараюсь разместить документацию по сделанному менеджеру. Зато сейчас как гора с плеч: пришлось очень долго и очень много думать, как правильнее реализовать менеджер. Теперь же можно потихоньку начинать разделять user-space и kernel-space для процессов.<br />
Механизм подкачки пока не реализован, но это уже &#8212; отдельный разговор.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1104/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Inline assembly: GCC + Watcom.</title>
		<link>http://sadko.xskernel.org/archives/1055</link>
		<comments>http://sadko.xskernel.org/archives/1055#comments</comments>
		<pubDate>Tue, 07 Apr 2009 23:40:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[openwatcom]]></category>
		<category><![CDATA[watcom]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1055</guid>
		<description><![CDATA[Tweet Задумался о кросс-компиляции моего ядрышка GCC (сейчас пока компилируется только Watcom&#8217;ом). Первый большой и краеугольный камень &#8212; это, конечно, ассемблерные вставки. Поэтому был придуман механизм, чтобы минимизировать писанину и дублирование ассемблерного кода для обоих компиляторов. С этой целью я сделал некий заголовочный файл, в котором объявил: #ifdef __WATCOMC__ // Define Pragmas #define inline_func(prag_d, ret_t, [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1055',
  title: 'Inline assembly: GCC + Watcom.',
  description: 'Задумался о кросс-компиляции моего ядрышка GCC (сейчас пока компилируется только Watcom\'ом).\n\nПервый большой и краеугольный камень - это, конечно, ассемблерные вставки. Поэтому был придуман механ...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1055"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Inline assembly: GCC + Watcom." data-url="http://sadko.xskernel.org/archives/1055">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Задумался о кросс-компиляции моего ядрышка GCC (сейчас пока компилируется только Watcom&#8217;ом).</p>
<p>Первый большой и краеугольный камень &#8212; это, конечно, ассемблерные вставки. Поэтому был придуман механизм, чтобы минимизировать писанину и дублирование ассемблерного кода для обоих компиляторов. С этой целью я сделал некий заголовочный файл, в котором объявил:</p>
<p><span id="more-1055"></span></p>
<pre>
#ifdef __WATCOMC__
    // Define Pragmas
    #define inline_func(prag_d, ret_t, body)    ret_t __pragma(#prag_d) body;
    #define inline_proc(prag_d, body)           void  __pragma(#prag_d) body;
#endif /* __WATCOMC__ */

#ifdef __GNUC__
    // Define Pragmas
    #define inline_func(prag_d, ret_t, body)        \
        static __inline ret_t body                  \
        {                                           \
            ret_t __result;                         \
            __asm__ __volatile__ (                  \
                    &quot;.intel_syntax noprefix&quot;        \
                    prag_d                          \
            );                                      \
            return __result;                        \
        }

    #define inline_proc(prag_d, body)               \
        static __inline void body                   \
        {                                           \
            __asm__ __volatile__ (                  \
                    &quot;.intel_syntax noprefix&quot;        \
                    prag_d                          \
            );                                      \
        }
#endif /* __GNUC__ */
</pre>
<p>Заметим, что для GNU GCC я заведомо врубил синтаксис интела (ну не люблю я синтаксис AT&amp;T, да и нафиг он не нужен на i386, на мой взгляд).</p>
<p>Теперь, допустим, захотел я сделать функцию __strlen на ассемблере. Для этого я ворочу соответствующие макросы:</p>
<pre>

#define __I386_STREND_IMPL          \
        &quot;mov    ecx, -1&quot;            \
        &quot;xor    al, al&quot;             \
        &quot;repne  scasb&quot;

// macro for strlen() function
#define __I386_STRLEN               \
        __I386_STREND_IMPL          \
        &quot;mov    eax, -2&quot;            \
        &quot;sub    eax, ecx&quot;
</pre>
<p>И связываю эти макросы с параметрами для каждого компилятора по-своему:</p>
<pre>
#if defined(__WATCOMC__)
    // strlen function bindings for Watcom
    #pragma aux I386_STRLEN     =       \
            __I386_STRLEN               \
            parm caller [edi]           \
            value [eax]                 \
            modify [edi ecx]
#elif defined(__GNUC__)
    // strlen function bindings for GCC
    #define I386_STRLEN                 \
            __I386_STRLEN               \
            : &quot;=a&quot;(__result)            \
            : &quot;D&quot;(str)
#endif /* compiler detection */
</pre>
<p>После чего осталось объявить прототип функции:</p>
<pre>
inline_func(I386_STRLEN,    size_t,     __strlen(const char *str)                       )
</pre>
<p>Всё, теперь я могу использовать функцию __strlen, и она будет инлайниться во всех участках кода как для GCC, так и для Watcom. Замечательно, не правда ли?</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1055/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Hand-made синхронизация репозиториев Subversion</title>
		<link>http://sadko.xskernel.org/archives/1050</link>
		<comments>http://sadko.xskernel.org/archives/1050#comments</comments>
		<pubDate>Sun, 29 Mar 2009 13:25:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1050</guid>
		<description><![CDATA[Tweet Несмотря на то, что репозиторий ОС XSystem мигрировал ко мне на домашний сервер, всё же хорошо было бы хранить бэкапы на каком-нибудь удалённом сервере. Для этого я решил воспользоваться уже имеющимся репозиторием subversion на http://sourceforge.net/. Идея работы такая: раз в сутки мой репозиторий должен синхронизироваться с удалённым репозиторием. При этом, все изменения в одном [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1050',
  title: 'Hand-made синхронизация репозиториев Subversion',
  description: 'Несмотря на то, что репозиторий ОС XSystem мигрировал ко мне на домашний сервер, всё же хорошо было бы хранить бэкапы на каком-нибудь удалённом сервере.\nДля этого я решил воспользоваться уже имею...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1050"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Hand-made &Ntilde;&ETH;&cedil;&ETH;&frac12;&Ntilde;&Ntilde;&ETH;&frac34;&ETH;&frac12;&ETH;&cedil;&ETH;&middot;&ETH;&deg;&Ntilde;&ETH;&cedil;&Ntilde; &Ntilde;&ETH;&micro;&ETH;&iquest;&ETH;&frac34;&ETH;&middot;&ETH;&cedil;&Ntilde;&ETH;&frac34;&Ntilde;&ETH;&cedil;&ETH;&micro;&ETH;&sup2; Subversion" data-url="http://sadko.xskernel.org/archives/1050">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Несмотря на то, что репозиторий <a href="http://xskernel.org/">ОС XSystem</a> мигрировал ко мне на домашний сервер, всё же хорошо было бы хранить бэкапы на каком-нибудь удалённом сервере.<br />
Для этого я решил воспользоваться уже имеющимся репозиторием subversion на <a href="http://sourceforge.net/">http://sourceforge.net/</a>.</p>
<p>Идея работы такая: раз в сутки мой репозиторий должен синхронизироваться с удалённым репозиторием. При этом, все изменения в одном репозитории должны однозначно отражаться на другом. С версии subversion 1.4 появилась такая тулза, как <b>svnsync</b>, но она для моего случая не подходит: оба репозитория не предоставляют прямого доступа к svnroot.</p>
<div text="Мой solution..." class="ljcut">Поэтому, немного порывшись в гугле, решил прибегнуть к собственному механизму синхронизации. Идея простая: раз в сутки сливается содержимое первого и второго (будем называть source и destination) репозитория. После этого сверяем содержимое source-репозитория с содержимым destination-репозитория: создаём несуществующие каталоги и копируем несуществующие файлы. Файлы, имеющие различные контрольные суммы md5, также перезаписываем. Но это не всё. После того, как мы влили новое файло в локальное дерево destination-репозитория, мы должны удалить из него те файлы, которых уже нет в source-репозитории. Для этого осуществляем обратную сверку снимка destination-репозитория с source-репозиторием и удаляем из него лишние файлы.</p>
<p>В результате всё это было сведено к скрипту на PERL.</p>
<pre>
#!/usr/bin/perl

use strict;

my @blacklist   =
(
    qr(^\.svn|\/\.svn$),
    qr(^\.{1,2}$|\/\.{1,2}$)
);

my $src_path  = 'xsystem';
my $dst_path  = 'xskernel-sync';
my $svn_user  = '<destination-username>';
my $svn_pass  = '<destination-password>';

# Update repositories
`svn update $src_path`;
`svn update $dst_path`;

# now search files in src_path and compare to dst_path

add_files();
remove_files();

`svn commit $dst_path -m &quot;Synchronization commit&quot; --username $svn_user --password $svn_pass`;</destination-password></destination-username></pre>
<p>Как видно, работа скрипта достаточно примитивна. Для его работы нужно иметь два рабочих снимка репозитория: source и destination. У меня source-репозиторий находится в каталоге xsystem, а destination &#8212; в каталоге dst_path.<br />
Скрипт сначала обновляет снимки репозиториев, затем осуществляет вливание новых файлов в destination-репозиторий при помощи функции add_files(). После этого удаляются устаревшие файлы и каталоги из destination-репозитория функцией remove_files() и производится коммит изменений в destination-репозиторий.</p>
<p>Дело осталось за малым &#8212; разобрать функции добавления и удаления файлов и каталогов. Для этого сначала напишем функцию, которая получает md5sum файла:</p>
<pre>
sub md5sum
{
    my $fname = shift;
    if (open PIPE, &quot;md5sum $fname |&quot;)
    {
        my $line =
<pipe>;
        close PIPE;
        my ($sum) = ($line =~ /^(\w+)\s+/o);
        return $sum;
    }
    return undef;
}</pipe></pre>
<p>В принципе, ничего нового. Вызывается утилита md5sum и анализируется её вывод.</p>
<p>Также необходимо игнорировать каталоги &quot;.svn&quot;, &quot;.&quot; и &quot;..&quot;, для чего вводится массив @blacklist и пишется функция банинга файлов:</p>
<pre>
sub ban_file
{
    my $src_file = shift;
    foreach (@blacklist)
    {
        ($src_file =~ $_) and
            return 1;
    }
    return undef;
}</pre>
<p>После этого можно спокойно разобрать функцию add_files():</p>
<pre>

sub add_files
{
    my @directories = ();
    my $curr_dir = '';

    do
    {
        # Открываем каталог
        if (opendir DIRHDL, &quot;$src_path$curr_dir&quot;)
        {
            CYCLE: # Читаем содержимое каталога
            while (my $fname = readdir DIRHDL)
            {
                # Баним ненужные файлы
                my $src_file = &quot;$src_path$curr_dir/$fname&quot;;
                (ban_file($src_file)) and
                    next CYCLE;

                my $dst_short = &quot;$curr_dir/$fname&quot;;
                my $dst_file  = &quot;$dst_path$dst_short&quot;;

                # Файл является каталогом?
                if (-d $src_file)
                {
                    # необходимо проверить, что он есть в destination-репозитории
                    unless (-d $dst_file)
                    {
                        # если каталога нет - его нужно создать
                        print &quot;mkdir   $dst_short\n&quot;;
                        `mkdir -p $dst_file`;
                        `svn add $dst_file`;
                    }

                    # Запомним каталог для того, чтобы в будущем его просмотреть
                    push @directories, $dst_short;
                }
                else
                {
                    # проверяем, существует ли файл в destination-репозитории
                    unless (-e $dst_file)
                    {
                        # файл не существует, его нужно скопировать и добавить
                        print &quot;add     $dst_short\n&quot;;
                        `cp -f $src_file $dst_file`;
                        `svn add $dst_file`;
                    }
                    else
                    {
                        # файл существует, вычисляем md5sum обоих файлов
                        my $sum1 = md5sum($src_file);
                        my $sum2 = md5sum($dst_file);

                        # если суммы не совпадают - заменяем файл новым
                        if ($sum1 ne $sum2)
                        {
                            print &quot;replace $dst_short\n&quot;;
                            `cp -f $src_file $dst_file`;
                        }
                    }
                }
            }
        }
        else
        {
            print &quot;Can't open dir $src_path$curr_dir\n&quot;;
        }

        # закрываем каталог и получаем следующий каталог, который следует обработать
        closedir DIRHDL;
        $curr_dir = shift @directories;
    }
    while (defined $curr_dir); # крутимся, пока в списке присутствуют обрабатываемые каталоги.
}</pre>
<p>При удалении функция будет очень похожа, только теперь надо осуществлять поиск файлов в destination-репозитории и смотреть, есть ли они в source-репозитории:</p>
<pre>
sub remove_files
{
    my @directories = ();
    my $curr_dir = '';

    do
    {
        # опять же, открываем каталог destination-репозитория
        if (opendir DIRHDL, &quot;$dst_path$curr_dir&quot;)
        {
            CYCLE: # читаем файлы
            while (my $fname = readdir DIRHDL)
            {
                # баним недопустимые diren'ы
                my $src_file = &quot;$dst_path$curr_dir/$fname&quot;;
                (ban_file($src_file))
                    and next CYCLE;

                my $src_short = &quot;$curr_dir/$fname&quot;;
                my $dst_file  = &quot;$src_path$src_short&quot;;

                # проверяем, является ли это каталогом
                if (-d $src_file)
                {
                    # проверяем, существует ли этот каталог в source-репозитории
                    unless (-d $dst_file)
                    {
                        # каталога нет - удаляем его из destination-репозитория
                        print &quot;rmdir   $src_short\n&quot;;
                        `svn delete $src_file`;
                    }
                    else
                    {
                        # каталог существует, запоминаем его для дальнейшей обработки
                        push @directories, $src_short;
                    }
                }
                else
                {
                    # Это обычный файл, проверяем, есть ли он в source-репозитории
                    unless (-e $dst_file)
                    {
                        # Файла нет, удаляем его из destination-репозитория
                        print &quot;unlink  $src_short\n&quot;;
                        `svn delete $src_file`;
                    }
                }
            }
        }
        else
        {
            print &quot;Can't open dir $dst_path$curr_dir\n&quot;;
        }

        # Закрываем каталог, получаем следующий
        closedir DIRHDL;
        $curr_dir = shift @directories;
    }
    while (defined $curr_dir);
}
</pre>
</div>
<p>Недостаток этой тулзы один: если файл был перемещён, то он будет распознан как новый файл. Хотя, я не думаю, что файлы и каталоги так часто перемещаются в логически корректно построенном дереве проекта.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1050/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Как я поднимал SVN</title>
		<link>http://sadko.xskernel.org/archives/1049</link>
		<comments>http://sadko.xskernel.org/archives/1049#comments</comments>
		<pubDate>Sun, 29 Mar 2009 12:09:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Свободное ПО]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[opensuse]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1049</guid>
		<description><![CDATA[Tweet Собственно, данный пост я решил написать после ночных бдений с SVN. Да, у меня были проблемы, которые пришлось решить, возможно, нестандартными методами, но зато теперь всё работает так, как я хотел. Управление репозиторием Итак, для всего этого нам нужнен сам Apache (я использовал Apache 2) и дополнительные модули: dav и dav_svn. Помимо этого, я [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1049',
  title: 'Как я поднимал SVN',
  description: 'Собственно, данный пост я решил написать после ночных бдений с SVN. Да, у меня были проблемы, которые пришлось решить, возможно, нестандартными методами, но зато теперь всё работает так, как я хо...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1049"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&ETH;&deg;&ETH;&ordm; &Ntilde; &ETH;&iquest;&ETH;&frac34;&ETH;&acute;&ETH;&frac12;&ETH;&cedil;&ETH;&frac14;&ETH;&deg;&ETH;&raquo; SVN" data-url="http://sadko.xskernel.org/archives/1049">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Собственно, данный пост я решил написать после ночных бдений с SVN. Да, у меня были проблемы, которые пришлось решить, возможно, нестандартными методами, но зато теперь всё работает так, как я хотел.</p>
<div text="It's a kind of Magic..." class="ljcut">
<h3> </h3>
<h3>Управление репозиторием</h3>
<p>Итак, для всего этого нам нужнен сам <b>Apache</b> (я использовал <b>Apache 2</b>) и дополнительные модули: <b>dav</b> и <b>dav_svn</b>.</p>
<p>Помимо этого, я ещё поставил просматривалку репозитория <b>ViewVC</b>, с которой потом долго и провозился.</p>
<p>Для того, чтобы заставить работать <b>subversion</b> через http, достаточно сделать следующее (делал в <b>OpenSUSE 10.3</b>):<br />
Сначала включаем модули при помощи <b>a2enmod</b>:</p>
<pre>

a2enmod dav
a2enmod dav_svn</pre>
<p>Теперь можно перезагрузить конфигу апача (либо через <b>restart</b>, либо через <b>reload</b>):</p>
<pre>

/etc/init.d/apache2 restart</pre>
<p>или </p>
<pre>

/etc/init.d/apache2 reload</pre>
<p>После этого необходимо сконфигурировать виртуальный хост. Лично я хотел, чтобы у меня SVN-репозиторий был как отдельный поддомен в домене <b>xskernel.org</b> &#8212; то есть, <b>svn.xskernel.org</b>.</p>
<p>Для этого заводим отдельный виртуальный хост в апаче:</p>
<pre>

&lt;VirtualHost *:80&gt;
    ServerName svn.xskernel.org
    ErrorLog    /var/log/apache2/svn-error.log
    TransferLog /var/log/apache2/svn-access.log

    &lt;Location /svn &gt;
      DAV svn
      SVNPath /home/svn/repositories/svn.xskernel.org
      SVNListParentPath on
      AuthType Basic
      AuthName &quot;XSystem Kernel Team repository&quot;
      AuthBasicProvider file
      AuthUserFile /home/svn/auth/svn.xskernel.org.htpasswd
      SetOutputFilter DEFLATE

      &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
        Require valid-user
      &lt;/LimitExcept&gt;
    &lt;/Location&gt;

&lt;/VirtualHost&gt;</pre>
<p>Как видно, здесь в конфиге заводится локейшн <b>/svn</b>, который используется для работы DAV. Именно DAV позволяет полноценно работать с репозиторием через http.</p>
<p>Рассмотрим некоторые параметры:<br />
<b>SVNPath</b> задаёт каталог, в котором располагается репозиторий, который будет ассоциирован с данным виртуальным хостом. Естественно, сам SVNRoot я спрятал (не стал использовать SVNRootPath).<br />
<b>AuthUserFile</b> &#8212; файл, в котором будут в дальнейшем храниться пользователи и хэши их паролей, которым будет разрешён доступ в SVN.<br />
<b>LimitExcept</b> накладывает ограничения на все команды кроме <b>GET</b>, <b>PROPFIND</b>, <b>OPTIONS</b> и <b>REPORT</b>, требуя авторизации (<b>Require valid-user</b>).</p>
<p>Отлично, теперь нужно завести соответствующий репозиторий. Я решил хранить все репозитории в отдельном каталоге <b>/home/svn/repositories</b>, поэтому создал репозиторий таким образом:</p>
<pre>

mkdir -p /home/svn/repositories
svnadmin create /home/svn/repositories/svn.xskernel.org</pre>
<p>Отлично, теперь репозиторий есть, надо сделать авторизацию. Для этого создаю файл паролей и завожу в нём пользователя:</p>
<pre>

mkdir -p /home/svn/auth
touch /home/svn/auth/svn.xskernel.org.htpasswd
htpasswd2 /home/svn/auth/svn.xskernel.org.htpasswd username</pre>
<p>Теперь апачу нужно дать права на пользование репозиторием и файлами паролей, для чего присваиваю всем файлам пользователя, под которым работает апач:</p>
<pre>

chown -Rv webserver:web /home/svn</pre>
<p>Сохраняем конфигурационный файл виртуальных хостов апача, перезагружаем конфигурацию по <b>reload</b>, и пробуем зайти по адресу <a href="http://svn.xskernel.org/svn/">http://svn.xskernel.org/svn/</a>. WebDAV работает!</p>
<h3>Просматривание репозитория</h3>
<p>Вот с просматривалкой у меня и возникло много проблем. Хотелось, чтобы при заходе на <a href="http://svn.xskernel.org/">http://svn.xskernel.org/</a> автоматически запускалась просматривалка, при этом она отображала бы только тот репозиторий, который ассоциирован с данным виртуальным хостом. Я перепробовал много различных вариантов и, в конце-концов, остановился на том, что изложу ниже.</p>
<p>WebDAV я поставил штатными средствами <b>OpenSUSE</b> &#8212; из репозитория, после чего забрал его из /srv/www и переместил в каталог /home/svn.<br />
Для своего виртуального хоста завёл отдельную конфигу /home/svn/viewvc-svn.xskernel.org.conf, в которой прописал следующие параметры:</p>
<pre>

# Доступные репозитории для просмотра
svn_roots:
        svn.xskernel.org : /home/svn/repositories/svn.xskernel.org
# Репозиторий, который следует просматривать по умолчанию
default_root = svn.xskernel.org
# Адрес обратной связи
address = <a href="mailto:team@xskernel.org">team@xskernel.org</a>
# Не использовать корень как компонент URL (то есть, не отображаются остальные репозитории в корне)
root_as_url_component = 0
# Путь к файлам с шаблонами отображения веб-страницы
template_dir = /home/svn/viewvc/svn.xskernel.org/templates
# компонент URL, по которому будут располагаться ресурсы для просматривалки (картинки и пр.)
docroot = /viewvc-docroot</pre>
<p>Теперь заводим скрипт, который цепляет эту конфигу, копируя стандартный:</p>
<pre>

cp /home/svn/bin/cgi/viewvc.cgi /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi</pre>
<p>И редактируем строки, прописывая:</p>
<pre>

LIBRARY_DIR = r&quot;/home/svn/lib&quot;
CONF_PATHNAME = r&quot;/home/svn/viewvc-svn.xskernel.org.conf&quot;</pre>
<p>Теперь скрипт /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi хватает конфигу /home/svn/viewvc-svn.xskernel.org.conf.<br />
После всего этого заводим свои темплейты для <b>ViewVC</b>:</p>
<pre>

mkdir -p /home/svn/viewvc/svn.xskernel.org
cp -R /home/svn/templates /home/svn/viewvc/svn.xskernel.org
cp -R /home/svn/templates/docroot /home/svn/viewvc/svn.xskernel.org/viewvc-docroot</pre>
<h3>Прикручивание ViewVC к апачу</h3>
<p>Теперь надо в каталоге /home/svn/viewvc/svn.xskernel.org завести файл index.html, который редиректит на подкаталог &quot;/viewvc&quot;:</p>
<pre>

&lt;pre&gt;
&lt;html&gt;&lt;head&gt;&lt;META HTTP-EQUIV=&quot;Refresh&quot; CONTENT=&quot;0; URL=/viewvc&quot;&gt;&lt;head&gt;
&lt;body&gt;&lt;/body&gt;
&lt;/html&gt;
&lt;/pre&gt;
</pre>
<p>Сделано это так потому, что если сам Апач осуществит редирект, SVN-клиент начнёт ругаться, что не может выполнить <b>PROPFIND</b> при импорте репозитория (проверено уже часовыми бдениями над <b>mod_rewrie</b>).</p>
<p>Прописываем <b>ViewVC</b> в конфиге виртуального хоста:</p>
<pre>

&lt;VirtualHost *:80&gt;
    #...
    ScriptAlias /viewvc &quot;/home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi&quot;
    Alias / /home/svn/viewvc/svn.xskernel.org/

    &lt;Directory /home/svn/viewvc/svn.xskernel.org/ &gt;
        Order allow,deny
        Allow from all
        DirectoryIndex index.html
    &lt;/Directory&gt;
&lt;/VirtualHost&gt;</pre>
<p>Параметр <b>ScriptAlias</b> указывает, какой скрипт следует запускать, когда URL содержит &quot;/viewvc&quot;.</p>
<p>Перезагружаем конфигу апача, пробуем: <a href="http://svn.xskernel.org/">http://svn.xskernel.org/</a>.<br />
Грузится страничка index.html, которая автоматом нас редиректит на <a href="http://svn.xskernel.org/viewvc/">http://svn.xskernel.org/viewvc/</a> и запускается скрипт /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi .</p>
<h3>Заключение</h3>
<p>Как видно, не всё так красиво в моей настройке, как хотелось бы. Если есть соображения/советы, как сделать лучше, то я их внимательно выслушаю.</p>
<p>Тем не менее, репозиторий <a href="http://xskernel.org/">ОС XSystem</a> переехал с <a href="http://sourceforge.net/">SourceForge.net</a> ко мне на домашний сервер. Работает на порядок быстрее, чем тормозной сервис от SourceForge.net. Однако, от SF.net я не стал отказываться, а сделал его зеркалом моего репозитория. Как &#8212; в следующем посте.</div>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1049/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Не все виртуалки превосходны.</title>
		<link>http://sadko.xskernel.org/archives/1011</link>
		<comments>http://sadko.xskernel.org/archives/1011#comments</comments>
		<pubDate>Wed, 05 Nov 2008 23:22:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[bochs]]></category>
		<category><![CDATA[parallels]]></category>
		<category><![CDATA[qemu]]></category>
		<category><![CDATA[virtualbox]]></category>
		<category><![CDATA[vmware]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1011</guid>
		<description><![CDATA[Tweet В связи с тем, что на форуме появился очень интересный баг: http://forum.xskernel.org/viewtopic.php?f=10&#038;t=18 Решил поиграться с виртуальными машинами, а именно проверить, как на них запускается XSystem. Вот что из этого получилось: В общем, APIC Timer дохнет по неизвестной причине в VirtualBox, что можно наблюдать на видео (в правом верхнем углу нет красных счётчиков как на [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1011',
  title: 'Не все виртуалки превосходны.',
  description: 'В связи с тем, что на форуме появился очень интересный баг:\nhttp://forum.xskernel.org/viewtopic.php?f=10&amp;t=18\n\nРешил поиграться с виртуальными машинами, а именно проверить, как на них запускается XSystem.\n\nВот что и...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1011"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&ETH;&micro; &ETH;&sup2;&Ntilde;&ETH;&micro; &ETH;&sup2;&ETH;&cedil;&Ntilde;&Ntilde;&Ntilde;&ETH;&deg;&ETH;&raquo;&ETH;&ordm;&ETH;&cedil; &ETH;&iquest;&Ntilde;&ETH;&micro;&ETH;&sup2;&ETH;&frac34;&Ntilde;&Ntilde;&ETH;&frac34;&ETH;&acute;&ETH;&frac12;&Ntilde;." data-url="http://sadko.xskernel.org/archives/1011">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>В связи с тем, что на форуме появился очень интересный баг:</p>
<p>http://forum.xskernel.org/viewtopic.php?f=10&#038;t=18</p>
<p>Решил поиграться с виртуальными машинами, а именно проверить, как на них запускается <b>XSystem</b>.</p>
<p>Вот что из этого получилось:<br />
<object width="425" height="350"><param value="http://www.youtube.com/v/JeHQk9QrMqA" name="movie" /><embed width="425" height="350" type="application/x-shockwave-flash" src="http://www.youtube.com/v/JeHQk9QrMqA"></embed></object></p>
<p><span id="more-1011"></span><br />
<object width="425" height="350"><param value="http://www.youtube.com/v/jvCne-Oc1K4" name="movie" /><embed width="425" height="350" type="application/x-shockwave-flash" src="http://www.youtube.com/v/jvCne-Oc1K4"></embed></object></p>
<p>В общем, <b>APIC Timer</b> дохнет по неизвестной причине в VirtualBox, что можно наблюдать на видео (в правом верхнем углу нет красных счётчиков как на остальных эмуляторах). Мало того, обычный <b>ISA Timer</b> работает очень медленно (обратите внимание на счётчик в левом верхнем углу).</p>
<p>Ну <b>ISA Timer</b> ещё можно простить, а вот <b>APIC Timer</b> почему дохнет &#8212; для меня загадка.<br />
Создал баг на сайте virtual box:</p>
<p>http://www.virtualbox.org/ticket/2573</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1011/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>А развитие идёт дальше&#8230;</title>
		<link>http://sadko.xskernel.org/archives/1009</link>
		<comments>http://sadko.xskernel.org/archives/1009#comments</comments>
		<pubDate>Sun, 02 Nov 2008 21:12:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1009</guid>
		<description><![CDATA[Tweet Выпущен новый релиз ОС XSystem &#8212; October 2008 Fishes: Carp. Основные нововведения: - Из дерева проекта удалены утилиты &#8216;xarch&#8217; и &#8216;fontcut&#8217;. - Полностью переписан планировщик (теперь более быстрый и надёжный). - Блочный распределитель памяти теперь выделяет блоки с адресом, кратным 8 байтам. - Исправлены ошибки в контроллере клавиатуры (теперь работает в Bochs). - Оптимизации [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1009',
  title: 'А развитие идёт дальше...',
  description: 'Выпущен новый релиз ОС XSystem - October 2008 Fishes: Carp.\nОсновные нововведения:\n- Из дерева проекта удалены утилиты \'xarch\' и \'fontcut\'.\n- Полностью переписан планировщик (теперь более быстрый и надёжный).\n- Блочн...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1009"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH; &Ntilde;&ETH;&deg;&ETH;&middot;&ETH;&sup2;&ETH;&cedil;&Ntilde;&ETH;&cedil;&ETH;&micro; &ETH;&cedil;&ETH;&acute;&Ntilde;&Ntilde; &ETH;&acute;&ETH;&deg;&ETH;&raquo;&Ntilde;&Ntilde;&ETH;&micro;&amp;#8230;" data-url="http://sadko.xskernel.org/archives/1009">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Выпущен новый релиз ОС XSystem &#8212; <b>October 2008 Fishes: Carp</b>.<br />
<u>Основные нововведения:</u><br />
- Из дерева проекта удалены утилиты &#8216;xarch&#8217; и &#8216;fontcut&#8217;.<br />
- Полностью переписан планировщик (теперь более быстрый и надёжный).<br />
- Блочный распределитель памяти теперь выделяет блоки с адресом, кратным 8 байтам.<br />
- Исправлены ошибки в контроллере клавиатуры (теперь работает в Bochs).<br />
- Оптимизации реализации библиотеки &lt;string.h&gt;.<br />
- Частично перенесён код Watcom C++ Runtime Library, необходимый для использования C++ &#8212; конструкций.<br />
- Изменены сборочные скрипты.<br />
- Кодовые страницы перемещены в &#8216;media/share/codepages&#8217;.<br />
- Изменён метод &#8216;for_file&#8217; в утилите &#8216;xsmake&#8217;.<br />
- Большинство архитектурно-зависимого кода вынесено в ветку &#8216;include/arch&#8217; ядра.<br />
- Написан прототип будущего механизма подкачки виртуальной памяти.<br />
- Добавлена поддержка записи конфигурационного пространства шины PCI (экспериментальное).<br />
- Реализована поддержка загрузки/сохранения контекстов FPU/MMX/SSE при переключении задач.<br />
- Добавлена защита от ошибочного прерывания со стороны PIC.<br />
- Доступна загрузка с USB Flash Drive.<br />
- Первичный загрузчик (&#8216;bootload&#8217;) полностью переписан для поддержки файловых систем FAT12 и FAT16.<br />
- Вторичный загрузчик &#8216;xload&#8217; переписан на C++.<br />
- Добавлены функции &#8216;unlink&#8217;, &#8216;cp&#8217; в утилите &#8216;xsmake&#8217;.<br />
- Добавлена условная конструкция &#8216;if-else&#8217; в утилиту &#8216;xsmake&#8217;.<br />
- Добавлена проверка зависимостей в OMF-файлах утилитой &#8216;xsmake&#8217;.<br />
- Переписана утилита &#8216;rawmake&#8217; (поддержка создания образов FAT12 и FAT16-дисков).<br />
- Утилиты &#8216;xsmake&#8217;, &#8216;exe2bin&#8217; и &#8216;rawmake&#8217; теперь также можно собрать с помощью GNU GCC под Linux.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1009/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Форум</title>
		<link>http://sadko.xskernel.org/archives/1004</link>
		<comments>http://sadko.xskernel.org/archives/1004#comments</comments>
		<pubDate>Tue, 14 Oct 2008 20:42:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1004</guid>
		<description><![CDATA[Tweet Вот и дожили до того, что открыл форум своего проекта. Расположен он здесь: http://forum.xskernel.org/ Если есть желание реально поучаствовать в проекте и/или обсудить его &#8212; приветствую гостей. Основной сайт тут: http://xskernel.org/ . А здесь можно найти кое-какую полезную документацию: http://wiki.xskernel.org/ .]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1004',
  title: 'Форум',
  description: 'Вот и дожили до того, что открыл форум своего проекта.\nРасположен он здесь: http://forum.xskernel.org/\nЕсли есть желание реально поучаствовать в проекте и/или обсудить его - приветствую гостей.\nОсновной ...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1004"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&curren;&ETH;&frac34;&Ntilde;&Ntilde;&ETH;&frac14;" data-url="http://sadko.xskernel.org/archives/1004">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Вот и дожили до того, что открыл форум своего проекта.<br />
Расположен он здесь: http://forum.xskernel.org/<br />
Если есть желание реально поучаствовать в проекте и/или обсудить его &#8212; приветствую гостей.<br />
Основной сайт тут: http://xskernel.org/ .<br />
А здесь можно найти кое-какую полезную документацию: http://wiki.xskernel.org/ .</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1004/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Странно&#8230;</title>
		<link>http://sadko.xskernel.org/archives/1003</link>
		<comments>http://sadko.xskernel.org/archives/1003#comments</comments>
		<pubDate>Sun, 05 Oct 2008 17:56:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1003</guid>
		<description><![CDATA[Tweet Уже где-то вторую или третью неделю непроизвольно соблюдаю правило &#171;ни дня без коммита&#187;. Хм&#8230; К чему бы это? Наверное, к новому релизу&#8230; Написал статейку на WIKI про планировщик потоков: http://wiki.xskernel.org/doku.php/xskernel/ipc/scheduler Новый планировщик пофиксил много неприятных багов и корявостей в ядре. И (о чудо!), казалось бы, для более сложной реализации планировщика новая версия работает на [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1003',
  title: 'Странно...',
  description: 'Уже где-то вторую или третью неделю непроизвольно соблюдаю правило &quot;ни дня без коммита&quot;.\n\nХм... К чему бы это? Наверное, к новому релизу...\n\nНаписал статейку на WIKI про планировщик потоков:\nhttp://wiki...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1003"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&iexcl;&Ntilde;&Ntilde;&ETH;&deg;&ETH;&frac12;&ETH;&frac12;&ETH;&frac34;&amp;#8230;" data-url="http://sadko.xskernel.org/archives/1003">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Уже где-то вторую или третью неделю непроизвольно соблюдаю правило &#171;ни дня без коммита&#187;.</p>
<p>Хм&#8230; К чему бы это? Наверное, к новому релизу&#8230;</p>
<p>Написал статейку на WIKI про планировщик потоков:</p>
<p>http://wiki.xskernel.org/doku.php/xskernel/ipc/scheduler</p>
<p>Новый планировщик пофиксил много неприятных багов и корявостей в ядре. И (о чудо!), казалось бы, для более сложной реализации планировщика новая версия работает на порядок быстрее старой.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1003/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>xskernel.org жив!</title>
		<link>http://sadko.xskernel.org/archives/997</link>
		<comments>http://sadko.xskernel.org/archives/997#comments</comments>
		<pubDate>Sat, 30 Aug 2008 11:01:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[XSystem]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[xsystem]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/997</guid>
		<description><![CDATA[Tweet Домен xskernel.org после долгого пребывания в небытии снова вернулся ко мне! Ура ура ура!]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/997',
  title: 'xskernel.org жив!',
  description: 'Домен xskernel.org после долгого пребывания в небытии снова вернулся ко мне!\nУра ура ура!',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/997"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="xskernel.org &ETH;&para;&ETH;&cedil;&ETH;&sup2;!" data-url="http://sadko.xskernel.org/archives/997">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Домен <a href="http://xskernel.org/">xskernel.org</a> после долгого пребывания в небытии снова вернулся ко мне!<br />
Ура ура ура!</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/997/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

