tag:blogger.com,1999:blog-4356346225700807042024-03-13T04:06:17.231+03:00UnterweltAnonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-435634622570080704.post-18590006127345410342014-02-23T21:38:00.000+04:002014-02-23T21:40:06.779+04:00Кастомизация виртуальных машин в Vagrant<h4>Введение</h4>
<p><a href="http://www.vagrantup.com/" title="Vagrant homepage">Vagrant</a> является удобной утилитой для быстрого развертывания виртуальных машин (для разработки, тестирования и т. п.).
В 1 версии в качестве системы виртуализации поддерживался только <a href="https://www.virtualbox.org/" title="VirtualBox homepage">VirtualBox</a>.
Во второй версии появилась поддержка иных систем виртуализации (например, <a href="http://www.vmware.com/" title="VMware homepage">VMware</a>, облачных провайдеров типа <a href="http://aws.amazon.com/ec2/" title="Amazon AWS EC2">Amazon</a>,
<a href="http://www.rackspace.com/" title="Rackspace">Rackspace</a> и т. п.). Более-менее полный список можно посмотреть на <a href="https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins#providers" title="Vagrant providers list">github'е</a>.</p>
<p>Из приятных моментов стоит отметить, что есть большое количество готовых сборок виртуальных машин.
Загрузка такой сборки -- довольно тривиальное занятие, описанное на сайте <a href="http://www.vagrantbox.es/">vagrantbox.es</a>.</p>
<pre><code class="bash">vagrant box add precise64 https://dl.dropbox.com/u/14292474/vagrantboxes/precise64-ruby-1.9.3-p194.box
mkdir test-box && cd test-box
vagrant init precise64
vagrant up
</code></pre>
<h4>Кастомизация</h4>
<p>В случае vagrant'а существует два совершенно различных подхода к кастомизации:</p>
<ul>
<li>использование SCM-систем (<a href="http://puppetlabs.com/">puppet</a> или <a href="http://www.opscode.com/chef/">chef</a>)</li>
<li>сборка нового образа системы</li>
</ul>
<p>В некоторых ситуациях более удобен первый подход, в некоторых -- второй.
Оставляя за кадром SCM и provisioning с использованием <code>chef</code> и <code>puppet</code>, рассмотрим второй подход.
И подводные камни, встречающие нас на нём.</p>
<h5>Пересборка box'а</h5>
<p>В любой момент текущий образ виртуальной машины vagrant может упаковать в box-контейнер.
На самом деле это обыкновенный <code>tar.gz</code>, в котором лежат Vagrantfile и необходимые системе виртуализации компоненты
(в случае VirtualBox -- диск в формате <code>vmdk</code>, файл экспорта настроек виртуальной машины <code>ovf</code>;
в случае LXC -- образ rootfs и конфиги LXC etc).</p>
<p>В текущий момент автоматизированная пересборка box'а возможна только для машин, использующий VirtualBox в качестве
провайдера виртуализации.</p>
<p>После подготовки виртуальной машины (установка необходимого софта, конфигов, создание пользователей и т. п.) достаточно
выполнить</p>
<pre><code class="bash">vagrant package --output=<some-box-file-name.box>
vagrant box add <box-name> <some-box-file-name.box>
</code></pre>
<p>По окончанию операции будет импортирована полученная сборка.
Теперь на её основе можно создавать новые виртуальные машины командой <code>vagrant init <box-name></code>.</p>
<h4>Подводные камни</h4>
<p>Без них бы не появилась статья. Vagrant активно использует VirtualBox Guest Additions.
Для проброса портов, монтирования общих директорий между хостом и гостевой машиной.</p>
<p>А guest additions требуют пересборки в случае обновления ядра.
При этом, необходимо загрузить виртуальную машину с новым ядром, после чего выполнить команду</p>
<pre><code class="bash">/etc/init.d/vboxadd setup
</code></pre>
<p>В общем случае она может сообщить о невозможности собрать часть компонентов (например, интеграция Xorg/X11,
если они не установлены). После чего надо перезагрузиться и проверить, что VirtualBox Guest Additions,
представленные модулями ядра и демонами запущены.</p>
<p>Убедившись, что всё работает можно-таки паковать новый box.</p>
<p>P. S. Описание этой проблемы можно найти в документации к 1 версии (в разделе <a href="http://docs-v1.vagrantup.com/v1/docs/troubleshooting.html">troubleshooting</a>).
В актуальной версии vagrant 2 оно не находится.</p>
P. P. S. Статья в оригинал публиковалась на хабре, но сейчас в черновиках.Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-44858879726307290742012-01-15T01:29:00.001+04:002012-01-15T01:29:17.723+04:00Зная про тулзу для двухфакторной аутентификации в гугле с использованием yubikey, решил реализовать аналогичную вещь и в linux.
Удобства ради решил использовать python-yubico, предоставляющую нормальный интерфейс. И увидел прелестный пакет python-yubico-tools, в котором и была найдена утилита yubikey-totp.
Неприятной неожиданностью стало то, что код, возвращаемый этой утилитой не соответствовал тому, что возвращал google-authenticator или моя прога на python'e, реализующая totp из rfc6238.
Основное, что следует помнить про g-a, что он хранит ключ в base32, а большинство библиотек хотят шестнадцатеричное представление. Но это не вызывает проблем.
Опасаясь, что косяк мой -- с загрузкой ключа в yubikey (нужен в обычном шестнадцатеричном виде с паддингом нулями), проверил на ключе из вышеупомянутого rfc. И увидел, что всё нормально.
С другой стороны yubikey-totp с параметром --time давал тот же результат, что и написан в стандарте. Меня озадачило это поведение.
Как выяснилось при дебагге, эти товарищи умудрились использовать
<blockquote>int(time.mktime(time.gmtime()))</blockquote>
что при tz отличной от +0000 давало не время от начало Эпохи, а его же с поправкой на временную зону. Т. е. на компе с tz MSK (+0400) это число было на 4 * 3600 меньше текущего unix-time.
Почему эти странные "товарищи" не воспользовались куда более очевидным
<blockquote>int(time.time())</blockquote>
мне не ведомо.
Написал в соответствующую гуглогруппу, посмотрим.Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-87035493161839630352011-01-24T03:06:00.000+03:002011-01-24T03:06:38.700+03:00hg & git. Как унифицировать workflow.<div>Недавно повторно наткнулся на хорошо и логично организованный <a href="http://nvie.com/posts/a-successful-git-branching-model/">пример</a> организации веток в git. Но так как последнее время по работе общаюсь с mercurial, то решил опробовать этот подход и в hg.</div><br />
<div>Сначала кратко об идеологии данного подхода. Фактически краткий перевод оригинальной статьи.<br />
<ul><li>Ветка <b>master</b> (<b>default</b>) содержит только <i>релизы</i>.</li>
<li>Ветка <b>develop</b> предназначена для <i>интеграции</i> (содержит готовые фичи, в неё же вливаются багфиксы).</li>
<li>Ветки <b>release-*</b> являются freeze-ветка для подготовки к <i>релизу</i>. В момент создания этой ветки в <b>develop</b> должен быть только набор фич, которые войдут в релиз. В конце жизненного цикла ветка вливается в <b>master</b> (<b>default</b>), выпуская релиз. Также эта ветка вливатся в <b>develop</b>, внося багфиксы.</li>
<li>Ветки <b>hotfix-*</b> начинаются от релизов и возвращаются в релизную ветку для внесения исправлений. Также ветка вливается в <b>develop</b>.</li>
<li>Ветки для разработки новых фич начинаются от <b>develop</b> и возвращаются на неё же.</li>
</ul></div><div class="separator" style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlN6wXBZJuRp8q2j3ykBvdR4ITcw1E1bRRDLs7T61H7Rod-2l-uOH_gXLTuwQIEjjR-tqAi7rQnd4T4s2IutLdiEb_QyPfsFvhNNzi0ipUbqq7-OwfsvHyLZ9npw0hPv0AXl8int84g8iZ/s1600/Screen-shot-2009-12-24-at-11.32.03.png" imageanchor="1" style="margin-right:1em; margin-bottom:1em"><img border="0" width="100%" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlN6wXBZJuRp8q2j3ykBvdR4ITcw1E1bRRDLs7T61H7Rod-2l-uOH_gXLTuwQIEjjR-tqAi7rQnd4T4s2IutLdiEb_QyPfsFvhNNzi0ipUbqq7-OwfsvHyLZ9npw0hPv0AXl8int84g8iZ/s320/Screen-shot-2009-12-24-at-11.32.03.png" /></a></div><div>Картинка <a href="http://nvie.com/posts/a-successful-git-branching-model/">отсюда</a>.<br />
</div><br />
<div>В случае git'a всё реализуется очень просто. Ветки легковесные, удалять их по истечению необходимости не проблема. Чего не скажешь о hg, где веток несколько типов.</div><div>В mercurial для этих целей подходят две: именованные ветки (named branches) и метки (bookmarks).</div><div>Основное отличие в том, что bookmark - легковесная ветка, наиболее близкая к git'овским. Она хранится в репозитории, как указатель на последнюю ревизию. А named branch - пишется в коммит и является его частью.</div><br />
<div>Подход с именованными ветками обладает тем недостатком, что для того, чтобы не образовывалось много голов надо очень аккуратно сливать и вовремя удалять эти ветки (перед последним слиянием). А поведении bookmark'а более похоже на поведение ветки в git (если проставить свойство <i>track.current = True</i> в разделе [bookmarks] в hgrc). Недостаток - что нельзя слить, если не было коммитов после ответвления. В таком случае можно сделать аналог fast-forward, что не является необходимым поведением. Это происходит из-за того, что bookmarks - всего лишь легкие метки над анонимными ветками.</div><br />
<div>Получилось несколько сумбурно, потом подредактирую.</div>Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-68651343292063671422010-11-22T01:46:00.000+03:002010-11-22T01:46:54.063+03:00Осторожно. Телефонное мошенничество.Вечером получил смс следующего содержания: "Вам пришло MMS, просмотр с мобильного - http://j.mp/bHZxO9".<br />
<br />
Переходим, получаем редирект на скачивание<br />
<pre>HTTP/1.1 301 Moved
Server: nginx/0.7.67
Date: Sun, 21 Nov 2010 21:06:27 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Set-Cookie: _bit=4ce989d3-000d4-02065-d8ac8fa8;domain=.j.mp;expires=Fri May 20 17:06:27 2011;path=/; HttpOnly
Location: http://fastmms.ru/bee/per7097.jar
MIME-Version: 1.0
Content-Length: 295</pre><br />
Естественно, сайт-однодневка, с него получаем jar-ник<br />
<pre>HTTP/1.1 200 OK
Date: Mon, 22 Nov 2010 05:40:20 GMT
Server: Apache/2
Last-Modified: Mon, 22 Nov 2010 04:56:25 GMT
ETag: "eb8007-21d4-4959d14033040"
Accept-Ranges: bytes
Content-Length: 8660
Vary: Accept-Encoding,User-Agent
Keep-Alive: timeout=1, max=100
Connection: Keep-Alive
Content-Type: application/java-archive</pre><br />
Из манифества этого jar-ника можно почерпнуть, что он очень хочет javax.wireless.messaging.sms.send - отправлять смски =)<br />
<br />
Скачав и запустив этот мидлет вы отправите сообщение на прелестный номер 844473 с текстом "p:60 n:9233187097", т е пополните некому абоненту мегафон-сибирь баланс на 60 рублей. И так, пока не закончатся деньги ,)) <br />
Для удобства между отправкой смс будут выдерживаться задержки, чтобы выглядело, как реальное отправление.<br />
<br />
Это было выявлено при чтении декомпилированных class-файлов.<br />
<br />
Пришло все с номера +79131841672.Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-59464428199415191932010-04-28T03:12:00.003+04:002010-09-20T00:51:14.525+04:00"The Raven" by Ricardo de MontreuilAnonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-46556692205692656212010-04-13T14:45:00.002+04:002010-04-13T15:42:30.677+04:00git-svn. Проблема отката svn-репозитория<h4>Введение.</h4>После ошибки при dcommit'е в svn из git-репозитория пришлось откатить svn из бэкапа. Далее git-svn отказывался выполнять dcommit, т к в git-репозитории номер коммита выше, чем в svn (который был восстановлен).<br />
<br />
<h4>Предыстория.</h4>Возникла необходимость совместной разработки. Так как с DVCS я толком знаком не был, решил использовать svn. Просто, удобно. Легко обучить человека, который систем контроля версий не видел ни разу.<br />
Разработка под винды, соответственно, выбран консольный svn + tortoiseSvn (лишний раз <code>svn status</code> набирать не надо, все такое).<br />
<br />
В какой-то момент пришлось дорабатывать систему на стенде, где сети уже не было. А VCS хотелось. Выбор пал на git, хотя, наверное, тогда стоило обратить внимание на mercurial.<br />
<br />
<h4>git-svn.</h4>git-svn прекрасно подцепился к репозиторию в сети, выкачал некоторое количество коммитов и прекрасно работал. До тех пор, пока не добавил нечаянно <i>файл с русским именем</i>.<br />
git не испытывал никаких сложностей с этим. Зато на очередном <code>git-svn dcommit</code> svn не оценил такой шутки и остановился на коммите с кривым именем файла. Пришлось откатить svn из бэкапа.<br />
Во избежание повторения баги этот файл был вычищен из истории (той, что не было в svn, ессно, т к в репозитории теперь номер ревизии ниже, чем считает git).<br />
<br />
Дальнейшие попытки выполнить <code>git-svn dcommit</code> привели к провалу. git считал, что пора заливать 137 коммит, а svn - 118. Все это происходило в git версии 1.6.3 (текущей в ubuntu 9.10). Попытки исправления метаданных руками не помогли.<br />
<br />
<h4>Решение.</h4>Прочтение man'а помогло не сильно. Решив поискать решение в сети, наткнулся на man новой версии.<br />
<br />
В новом релизе 1.7.0 появилась прелестная команда <code>git-svn reset -rXX</code> позволяющая откатить метаданные до соответствующей ревизии.<br />
<br />
Итак, запускаем <code>git-svn reset -r117</code>, git рапортует, что <code>refs/remotes/git-svn</code> соответствует ревизии 117 и прочие прелести.<br />
<br />
После этого можно спокойно делать <code>git-svn fetch</code>, чтобы обновить <code>refs/remotes/git-svn</code>. И <code>git rebase --onto remotes/git-svn <upstream> <branch></code>, чтобы перенести ветку на новое дерево.<br />
<br />
В принципе, все.<br />
<br />
Возможно, статья поможет тем, кто попал в аналогичную ситуацию и не смог найти адекватного решения в сети.<br />
<br />
<i>P. S. Это то, что не прошло-таки модерацию на хабре..</i>Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-51557433277018096322010-04-11T17:40:00.001+04:002010-09-20T00:51:38.162+04:00ТруЪ-евый апокалипсисAnonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-63481716869050258962010-04-10T23:28:00.001+04:002010-04-10T23:39:17.434+04:00gitosis на домашней машине.<div>Поднял сервак gitosis (реализует доступ к git-репозиториям через ssh с контролем доступа). Для этого спокойно воспользовался описанием <a href="http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way">http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way</a>.</div><br />
<div>На этой же машине поднят клиент <a href="http://www.dyndns.org">dyndns</a> (ddclient или inadyn). Так, конечно, есть удобная опция "custom dns", позволяющая поставить ttl и обновлять некоторые поля с помощью dyndns-клиента.
Получится запись вида (на своем, подконтрольном домене):
<pre>git 60 IN A xxx.xxx.xxx.xxx</pre>
Но стоит это удовольствие $30.</div><br />
<div>Есть красивый обходной путь. На бесплатном аккаунте dyndns free привязываемся к домену 3 уровня. Например, my_git_example.dyndns.org. Далее на своей DNS'ке добавляем
<pre>git IN CNAME my_git_example.dyndns.org.</pre>
<br />
Тогда по адресу git.our_domain.tld мы получим доступ к нашему git-репозиторию.</div><br />
<div>Вот и все дела ,)</div>Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-40368201742291955852010-04-03T06:41:00.001+04:002010-04-03T06:44:56.651+04:00Город теней.<div>Наконец-то, добрались. Прошло уже целых 10 месяцев. Время летит, к сожалению.</div>
<div>Пока еще не рассвело, город теней и лунного света. Как его портит реклама и уличное освещение. Может, успеем в Петропавловскую крепость до рассвета. Было б забавно.</div>
<div>Жалею, что не взяли роллы, народ уже катает. И в МСК, и в СПБ. Хотя, можем успеть побольше музеев посмотреть, поменьше по городу покатать. На все времени не найдешь.</div>
<div style="text-color: grey;">За всеми безумными делами и не замечаешь, как оно утекает сквозь пальцы. Распыляешь его на то, на сё. Прочитал очередной роман Желязны/Бестера/Саймака/et cetera - хорошо. А стоило б почитать "Code complete", patterns, библию java. Оглянуться на c#/mono. Поглазеть на python. Рассмотреть GAE+GWT <strike>корпорации зла</strike>google.<br/>
Чего-то меня совсем не в ту степь занесло. Пока "можно пить и веселиться, не работать и не бриться" ,)</div>
<div>С днем геолога =)</div>Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-27074611993209253072010-03-22T20:40:00.000+03:002010-03-22T20:40:24.307+03:00С доменом разобрались..Закончилось на сегодня все прозаично.. <a href="http://whois.domaintools.com/grossws.net">whois</a>. Прислали мне ссылочку на этот whois-serv. При необходимости переноса домена другого регистратора (по словам техподдержки) они чинно-мирно выдадут мне <i>secret code</i>.
Осталось понять, зря или нет я указал там левый телефон?Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-73428019823895191192010-03-22T15:42:00.000+03:002010-03-22T15:42:29.086+03:00Завел твитПосмотрим, что из этого выйдет..Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-3937441177200064132010-03-22T15:25:00.001+03:002010-03-22T15:43:04.324+03:00Доменные развлеченияЗарегал себе домен в NET. Теперь развлекаюсь. Пока привязал к нему этот блог.
Вся регистрация на leaseweb.com заняла чуть больше суток (нерабочие дни были) + написание одного письма, на которое они сегодня утром ответили. Единственное, что смутило - в качестве администратора домена фигурирует "KEY-SYSTEMS GMBH". Жду когда ответят. Как ни странно, домен уже поднят и работает, а зарегистрирован будет только 01/04. Может тогда там и появятся мои данные. Посмотрим.Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-87881532064540172792010-02-16T23:25:00.001+03:002010-03-22T15:43:25.433+03:00ох, кеды-кедыНедавно решил еще разок глянуть на 4 кеды (пока еще 4.3).. посмотрел-посмотрел, решил что лучше я процессорное время и память буду тратить на что-нить другое.. при всей "навороченности" это дело тормозит на двухядерном селероне с 2Гб памяти.. гном, конечно тоже не так, чтоб лековесен, но все же даже с компизом, прозрачностью, всякими приятными эффектами по сворачиваю/разворачиванию/появлению/изменению окон, тенями и др. развлечениями работает куда быстрее, чем кеды с десятком виджетов.
Так у меня и останется в качестве основного - гном/xfce, а легкого - dwm =)
в dwm надо поковыряться поподробнее.. просто для работы в dwm+dmenu его реально надо чуток поковырять.. зато весь dwm - это dwm.c + config.h + Xlib(который, ессно, есть с иксами). работать-то он и без этого прекрасно будет, но для удобства - хочется улучшить.
воть такие пироги с котятами..Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com2tag:blogger.com,1999:blog-435634622570080704.post-33918517464209233752009-12-28T20:31:00.000+03:002009-12-28T20:31:25.900+03:00шуточки..<form name="frm" method="get" action="http://aeterna.ru/ftell.php"><input type="hidden" name="link" value="ftells:785"><table border="0" style="width: 400px; border: 1px solid #EEEEEE;"><tr><td style="text-align: center; margin: 0px; padding: 8px; background-color: #006680; color: #FFFFFF; font: 16px Arial"><a href="http://aeterna.ru/ftell.php?link=ftells:785" style="display: block; padding-top: 4px; color: #FFFFFF" target="_blank">Ричард Бах "Карманный справочник мессии" (электронная версия:-)</a></td></tr><tr><td style="text-align: left; padding: 8px; background-color: #FFFFFF; color: #000000; font: 12px Arial"><table border="0" width="100%"><tr><td style='text-align: left; padding: 2px; background-color: #FFFFFF; color: #000000; font: 12px Arial'>Ваше имя</td><td style='text-align: left; padding: 2px; background-color: #FFFFFF; color: #000000; font: 12px Arial'><input type="text" name="yourname" value="gross"></td></tr><tr><td style='text-align: left; padding: 2px; background-color: #FFFFFF; color: #000000; font: 12px Arial'>Страничка…</td><td style='text-align: left; padding: 2px; background-color: #FFFFFF; color: #000000; font: 12px Arial'>Тебе никогда не было дано желание, вместе с которым не дана была бы сила для его осуществления. Правда, ради этого приходится еще и потрудиться.</td></tr></table></td></tr><tr><td style="text-align: center; margin: 0px; padding: 8px; background-color: #006680; font: 12px Arial"><input type="submit" value="Узнать"><br><small><a href="http://aeterna.ru/ftells.php?link=ftells" target="_blank" style="display: block; padding-top: 4px; color: #FFFFFF">все гадания на aeterna.ru</a></small></td></tr></table></form>Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-63978291555631472522009-12-23T23:35:00.001+03:002009-12-23T23:35:59.383+03:00Овощное<i>
Состояние, к сожалению, описывается исключительно этим термином.
</i><br />
<div>
Сессия ползет очень неравномерно. Иногда по двое суток жесткого напряга, иногда - день почти ничегонеделанья. Вынужденного лишь отчасти.
<br />
Кажется, что какие-то разрывы в мировосприятии связаны исключительно с сессией/работой, которые очень неудачно наложились. Плюс к этому еще и моя помощь окружающим приводят к дополнительному недосыпу. Друзья-товарищи, не обижайтесь, я не жалею времени потраченного на общение с вами =)
<br />
Когда-таки оказываюсь в сети, натыкаюсь на разные интересные, странные и всякую дребедень. И начинаю засыпать. Aus.
</div>Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0tag:blogger.com,1999:blog-435634622570080704.post-81220149164255202512009-12-23T09:35:00.000+03:002009-12-23T09:37:51.660+03:00OriginВ начале было Слово. Потом появился байт.Anonymoushttp://www.blogger.com/profile/07562113317183327931noreply@blogger.com0