<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://old.lug-mgn.ru" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Статьи</title>
 <link>http://old.lug-mgn.ru/articles</link>
 <description>Список статей</description>
 <language>ru</language>
<item>
 <title>Настраиваем VPN Магинфо средствами NetworkManager</title>
 <link>http://old.lug-mgn.ru/articles/nastraivaem-vpn-maginfo-sredstvami-networkmanager</link>
 <description>&lt;p&gt;Итак, в мои руки наконец-то попала система с установленным NetworkManager и pptp-плагином с необходимостью настройки на ней vpn Магинфо.&lt;/p&gt;
&lt;p&gt;Внимание: для работы нижеописанного у вас в системе должен быть установлен NetworkManager, pptp + плагин для NetworkManager для работы с pptp. Об этом вам придется позаботиться самим. Скажу только что в попавшей в мои руки Fedora Russian remix DVD все это есть.&lt;br /&gt;
Инструкции по установке для других дистрибутивов можно писать в комментарии к статье.&lt;/p&gt;
&lt;p&gt;Как я и говорил - делается это предельно просто:&lt;/p&gt;
&lt;p&gt;1) Нужно поправить текущее подключение по сети (я создал новое, но можно просто исправить то, что подключается по умолчанию). А именно в нем нужно прописать дополнительные маршруты:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lug-mgn.ru/files/ default_001.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lug-mgn.ru/files/ IPv4 для магинфо_003.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;2) Создаем VPN-соединение с настройками по умолчанию (я только ставлю галочку в &quot;Advanced&quot; на mppe для шифрования, но и без нее с настройками полностью по умолчанию должно работать). Не забываем только прописать сервер, логин и пароль (можно ещё поставить галочку &quot;подключать автоматически&quot;):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lug-mgn.ru/files/ соединения_004.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lug-mgn.ru/files/ _005.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lug-mgn.ru/files/ магинфо vpn_006.png&quot;&gt;&lt;/p&gt;
</description>
 <comments>http://old.lug-mgn.ru/articles/nastraivaem-vpn-maginfo-sredstvami-networkmanager#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/450</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/mgn">mgn</category>
 <category domain="http://old.lug-mgn.ru/keywords/pptp">pptp</category>
 <category domain="http://old.lug-mgn.ru/keywords/vpn">VPN</category>
 <category domain="http://old.lug-mgn.ru/keywords/maginfo">Магинфо</category>
 <enclosure url="http://old.lug-mgn.ru/files/ default_001.png" length="46403" type="image/png" />
 <pubDate>Wed, 29 Jun 2011 15:13:29 +0400</pubDate>
 <dc:creator>vyazovoi</dc:creator>
 <guid isPermaLink="false">450 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>Материалы семинара 19.03</title>
 <link>http://old.lug-mgn.ru/articles/materialy-seminara-1903</link>
 <description>Т.к. на прошедшем 19 марта семинаре было не так уж много народу (даже меньше, чем записалось), выкладываем все материалы семинара, чтобы с ними могли ознакомиться все желающие.&lt;br /&gt;
&lt;br /&gt;
Лицензия — CC BY SA 3.0.&lt;br /&gt;
&lt;br /&gt;
&lt;table&gt;&lt;br /&gt;
&lt;tr&gt;&lt;td&gt;1. А. Бармин. «Управление требованиями к IT-проектам в OSRMT»:&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Presentations/osrmt.pdf&quot;&gt;Презентация&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Sound/1%20barmin%20alexander.ogg&quot;&gt;Запись выступления&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2. А. Новикова: Багтрекер Mantis:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Sound/2%20novikova%20anna.ogg&quot;&gt;Запись выступления&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3. Е. Ерошин «JavaScript-фреймворк jQuery»:&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Sound/3%20eroshin.ogg&quot;&gt;Запись выступленпия&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4. И. Портнов: &quot;Использование asciidoc и docbook для подготовки технической документации&quot;:&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Presentations/asciidoc_docbook.pdf&quot;&gt;Презентация&lt;/a&gt;, &lt;a href=&quot;http://iportnov.blogspot.com/2011/03/asciidoc-docbook.html&quot;&gt;текст доклада&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Sound/4%20portnov.ogg&quot;&gt;Запись выступления&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5. М. Сорокин: «Автоматизация рутинной работы с помощью ant,izpack,hudson»:&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Presentations/AntIzPackHudson1903m.odp&quot;&gt;Презентация&lt;a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Sound/5%20sorokin%20maxim.ogg&quot;&gt;Запись выступления&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6. Г. Канин: &quot;Нюансы проектирования в OpenOffice.org Base&quot;:&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Presentations/oo_base.odp&quot;&gt;Презентация&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Sound/6%20kanin%20gleb.ogg&quot;&gt;Запись выступления&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7. И. Попова «Система управления бизнес-процессами Activiti BPM 5.3»:&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Presentations/Activiti%20BPM%205.pdf&quot;&gt;Презентация&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/files/march_2011/Sound/7%20popova.ogg&quot;&gt;Запись выступления&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;
См. также &lt;a href=&quot;/albums/seminar-19032011&quot;&gt;фотоальбом&lt;/a&gt;.</description>
 <comments>http://old.lug-mgn.ru/articles/materialy-seminara-1903#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/397</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/materialy">материалы</category>
 <category domain="http://old.lug-mgn.ru/keywords/prezentatsii">презентации</category>
 <category domain="http://old.lug-mgn.ru/keywords/seminar">семинар</category>
 <pubDate>Tue, 22 Mar 2011 17:01:50 +0300</pubDate>
 <dc:creator>portnov</dc:creator>
 <guid isPermaLink="false">397 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>Настройка VPN от Магинфо на роутере DLink DIR-300 rev.B1 с прошивкой DD-WRT</title>
 <link>http://old.lug-mgn.ru/articles/maginfo-vpn-dlink-dir300-dd-wrt</link>
 <description>&lt;p&gt;Родная прошивка у распространённого в наших краях WiFi-роутера (точки доступа) DLink DIR-300 весьма глючная, так что многие предпочитают заменить её на прошивку DD-WRT. Только вот в настройке VPN от Магинфо в DD-WRT есть пара неочевидных моментов.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Важно.&lt;/strong&gt; Речь здесь идёт только об одной конкретной модели устройства — «DLink DIR-300», причём именно в ревизии B1.&lt;/p&gt;
&lt;p&gt;Установка DD-WRT на этот роутер описана, например, &lt;a href=&quot;http://www.dd-wrt.com/wiki/index.php/%D0%9F%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0_DIR-300NRU&quot;&gt;здесь&lt;/a&gt;. Настройка VPN от Магинфо на другой модели роутера DLink описана &lt;a href=&quot;http://wiki.mgn.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_DD-WRT&quot;&gt;здесь&lt;/a&gt; (доступно только из сети Магинфо).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Предупреждение.&lt;/strong&gt; Последняя имеющаяся сейчас на dd-wrt.com версия прошивки (14896) содержит кривой pptp-клиент, при запуске он вываливается с Segmentation Fault. Так что эту версию скачивать не надо, берём предыдущую (14311) или следующую, когда эти следующие версии появятся. &lt;/p&gt;
&lt;p&gt;Настройка VPN в dd-wrt включает следующие шаги:&lt;/p&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Прописать общие настройки VPN (адрес сервера, логин, пароль итп);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Добавить нужные записи в таблицу роутинга;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Удалить одну ненужную, но появляющуюся по умолчанию запись из таблицы роутинга;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Прописать в конфигурационный файл pptp пару неочевидных опций, специфичных для Магинфо.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;_&quot;&gt;Общие настройки&lt;/h2&gt;
&lt;p&gt;В веб-интерфейсе роутера идём на вкладку «Services | VPN», там ставим переключатель «PPTP Client Options» в положение «Enable», и прописываем остальные опции:&lt;/p&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;
Server IP or DNS Name.&lt;br /&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Адрес VPN-сервера. У нас это vpn.mgn.ru.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;
Remote Subnet, Remote Subnet Mask.&lt;br /&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Оставляем по умолчанию (0.0.0.0).&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;
MPPE Encryption.&lt;br /&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Параметры шифрования MPPE. В упомянутой выше статье на wiki.mgn.ru предлагается сюда вписать «mppe required,no40,no56,stateless».&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;
MTU, MRU.&lt;br /&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Похоже, оптимальные значения зависят от конкретных роутеров, находящихся между вами и VPN-сервером. Я сейчас выставляю 1500, работает. Когда-то приходилось выставлять 1300, чтобы добиться нормальной работы сети. &lt;strong&gt;Замечание.&lt;/strong&gt; Веб-интерфейс сильно умный и, согласно стандартам, не даёт выставлять здесь значения больше 1500. Между тем, при некоторых условиях может понадобиться указать MTU и MRU равными 1512 (разъяснено, например, &lt;a href=&quot;http://lug-mgn.ru/articles/nastroika-interneta-maginfo-v-linux-v2#comment-1006&quot;&gt;здесь&lt;/a&gt;).&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;
NAT.&lt;br /&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Оставляем по умолчанию (Enable).&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;
User Name, Password.&lt;br /&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Логин и пароль вашего VPN-соединения.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Ну и жмём Save. Пытаться делать Apply сейчас бесполезно, всё равно не заработает.&lt;/p&gt;
&lt;h2 id=&quot;__2&quot;&gt;Добавляем нужные роуты&lt;/h2&gt;
&lt;p&gt;В веб-интерфейсе идём на вкладку «Setup | Advanced Routing» и добавляем следующие роуты:&lt;/p&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;79.134.0.0 netmask 255.255.255.252 gw YOUR_GATEWAY.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;192.168.55.32 netmask 255.255.255.224 gw YOUR_GATEWAY;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Здесь YOUR_GATEWAY — это IP вашего шлюза. В параметре «Interface» для обоих роутов выставляем «WAN», метрику оставляем 0.&lt;/p&gt;
&lt;h2 id=&quot;__3&quot;&gt;Немного плясок с бубном&lt;/h2&gt;
&lt;p&gt;В веб-интерфейсе роутера идём на вкладку «Administration | Commands», и в качестве Startup-комманд вписываем следующее заклинание:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(while [ ! -f /tmp/pptpd_client/options.vpn ]; do sleep 10; done&lt;br /&gt;
route del default dev vlan2&lt;br /&gt;
sed -e &#039;s/lcp-echo-failure 3/lcp-echo-failure 5/&#039; -e &#039;s/lcp-echo-interval 2/lcp-echo-interval 30/&#039; /tmp/pptpd_client/options.vpn &amp;gt; /tmp/pptpd_client/temp.vpn&lt;br /&gt;
cp /tmp/pptpd_client/temp.vpn /tmp/pptpd_client/options.vpn )&amp;amp;&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Здесь происходит следующее. При запуске роутера ждём, пока появится файл /tmp/pptpd_client/options.vpn (это актуальный конфиг pptp, формируемый скриптом на основе шаблона, лежащего где-то в /etc). Когда он появился — это означает, что pptp-клиент вот-вот запустится. В этот момент удаляем дефолтный маршрут через ваш шлюз (правда, это можно делать и в самом начале скрипта) и с помощью sed-а правим конфиг pptp, а именно, указываем там опции lcp-echo-failure 5 и lcp-echo-interval 30.&lt;/p&gt;
&lt;p&gt;Такой неочевидный способ сделать вроде бы простые вещи (удалить маршрут и поправить пару строчек в конфиге) вызван тем, что 1) в веб-интерфейсе не предусмотрено способа удалить маршрут, можно только добавить, 2) в веб-интерфейс вынесены далеко не все настройки pptp-клиента, при этом 3) шаблонный конфиг pptp находится на read-only файловой системе, а актуальный формируется только при запуске.&lt;/p&gt;
&lt;p&gt;Ну и после сохранения настроек перезагружаем роутер, теперь всё должно работать.&lt;/p&gt;
&lt;p&gt;Если кто-нибудь предложит способ сделать всё то же самое прямее, буду очень благода.&lt;/p&gt;
</description>
 <comments>http://old.lug-mgn.ru/articles/maginfo-vpn-dlink-dir300-dd-wrt#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/382</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/dd-wrt">dd-wrt</category>
 <category domain="http://old.lug-mgn.ru/keywords/dlink">dlink</category>
 <category domain="http://old.lug-mgn.ru/keywords/vpn">VPN</category>
 <category domain="http://old.lug-mgn.ru/keywords/maginfo">Магинфо</category>
 <pubDate>Mon, 10 Jan 2011 09:38:08 +0300</pubDate>
 <dc:creator>portnov</dc:creator>
 <guid isPermaLink="false">382 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>Настройка интернета Магинфо в BSD</title>
 <link>http://old.lug-mgn.ru/articles/nastroika-interneta-maginfo-v-bsd</link>
 <description>Инструкция для BSD: (Паша, добавь)&lt;br /&gt;
Всё просто, настраивается через /etc/hostname.xxx, где xxx - имя интерфейса&lt;br /&gt;
&lt;br /&gt;
#ifconfig - смотрим как наз-ся наши интерфейсы&lt;br /&gt;
обычно: rl0 - Realtek8139, re0 - Realtek8169, xl0 - 3c905(возможно, и другие 3Com)&lt;br /&gt;
&lt;br /&gt;
Сначала настраиваем опорную сеть:&lt;br /&gt;
&lt;pre class=&quot;bb-code-block&quot;&gt;root@bsd:~# cat /etc/hostname.rl0
inet 192.168.xxx.yyy 255.255.255.0
!route delete -inet 79.134.0.0/30
!route delete -inet 192.168.55.32/27
!route add -inet 79.134.0.0/30 192.168.xxx.1
!route add -inet 192.168.55.32/27 192.168.xxx.1&lt;/pre&gt;Где xxx - подсеть, yyy - хост&lt;br /&gt;
Можно просто написать:&lt;br /&gt;
inet dhcp&lt;br /&gt;
Но в этом случае я не знаю как поднять статические маршруты до DNS &amp; VPN&lt;br /&gt;
&lt;br /&gt;
Далее, настраиваем интерфейс для VPN:&lt;br /&gt;
&lt;pre class=&quot;bb-code-block&quot;&gt;root@bsd:~# cat /etc/hostname.tun0
!/usr/sbin/ppp -unit0 -ddial mgn &amp;gt;/dev/null 2&amp;gt;&amp;1&lt;/pre&gt;Где mgn - название нашего провайдера, см.ниже. Может быть любым(разумным).&lt;br /&gt;
unit0 задает что интерфейс поднимется именно tun0 - актуально для файрвола&lt;br /&gt;
&lt;br /&gt;
Теперь самая сложная часть, собсно конфиг PPP:&lt;br /&gt;
&lt;pre class=&quot;bb-code-block&quot;&gt;root@bsd:~# cat /etc/ppp/ppp.conf
default:
 set log Phase Chat LCP IPCP CCP tun command

mgn:
 set device &quot;!/usr/local/sbin/pptp --loglevel 0 --nobuffer --nolaunchpppd vpn.mgn.ru&quot;
 set timeout 0
 set lqrperiod 15
 set cd 5
 set redial 5
 set authname ВАШ_VPN_ЛОГИН
 set authkey ВАШ_VPN_ПАРОЛЬ
 set dial
 set login
 set mppe 128 stateless
 accept MSChapV2
 enable lqr
# enable mssfixup
 disable acfcomp protocomp
 disable ipv6cp
 deny acfcomp
# set mtu max 1462
# set mru max 1462
 add! default HISADDR&lt;/pre&gt;С такими mtu/mru у меня не ходили большие пакеты, потому закомментил.&lt;br /&gt;
Обратите ОСОБОЕ внимание на строку authkey - пароль хранится в конфиге!!!&lt;br /&gt;
Перед тем как показывать свой конфиг кому-то, не забудьте удалить/заменить пароль)&lt;br /&gt;
Обязательно выполните команды:&lt;br /&gt;
#chown 0.0 /etc/ppp/ppp.conf&lt;br /&gt;
#chmod 400 /etc/ppp/ppp.conf - так будет безопаснее.&lt;br /&gt;
Во всяком случае vi так просто его не перезапишет - ругнется: Read-only file, not written; use ! to override.&lt;br /&gt;
&lt;br /&gt;
#sh /etc/netstart - (пере)запуск всех интерфейсов&lt;br /&gt;
&lt;br /&gt;
Один важный момент. Пакета pptp на свежепоставленной машине может не быть. Его придется скачать предварительно.&lt;br /&gt;
Текущие:&lt;br /&gt;
&lt;a href=&quot;ftp://mirror.corbina.net/pub/OpenBSD/4.7/packages/i386/pptp-1.7.2p1.tgz&quot;&gt;ftp://mirror.corbina.net/pub/OpenBSD/4.7/packages/i386/pptp-1.7.2p1.tgz&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;ftp://mirror.corbina.net/pub/OpenBSD/4.7/packages/amd64/pptp-1.7.2p1.tgz&quot;&gt;ftp://mirror.corbina.net/pub/OpenBSD/4.7/packages/amd64/pptp-1.7.2p1.tgz&lt;/a&gt;&lt;br /&gt;
Для NetBSD чет ваще пакетов не нашел... В-общем ищите сами) Втч для FreeBSD&lt;br /&gt;
Устанавливаем при помощи команды:&lt;br /&gt;
pkg_add pptp - в текущем каталоге должен сам найти нужную версию, но точно уже не помню&lt;br /&gt;
&lt;br /&gt;
На будущее рекомендую прописать в ~/.profile&lt;br /&gt;
export PKG_PATH=ftp://mirror.corbina.net/pub/OpenBSD/4.7/packages/`machine -a`/&lt;br /&gt;
&lt;br /&gt;
На этом пока всё. О настройке PF(PacketFilter) в следующий раз)&lt;br /&gt;
&lt;br /&gt;
ЗЫ Если после поднятия сети не пингуется vpn.mgn.ru - проверьте свой /etc/resolv.conf&lt;br /&gt;
&lt;pre class=&quot;bb-code-block&quot;&gt;root@bsd:~# cat /etc/resolv.conf
lookup file bind
search mgn.ru vpn.mgn.ru ll.mgn.ru
nameserver 79.134.0.1
nameserver 79.134.0.2&lt;/pre&gt;</description>
 <comments>http://old.lug-mgn.ru/articles/nastroika-interneta-maginfo-v-bsd#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/364</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/bsd">bsd</category>
 <category domain="http://old.lug-mgn.ru/keywords/mgn">mgn</category>
 <category domain="http://old.lug-mgn.ru/keywords/vpn">VPN</category>
 <category domain="http://old.lug-mgn.ru/keywords/maginfo">Магинфо</category>
 <pubDate>Thu, 14 Oct 2010 18:45:20 +0400</pubDate>
 <dc:creator>vyazovoi</dc:creator>
 <guid isPermaLink="false">364 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>Настройка интернета Магинфо в Linux v.2</title>
 <link>http://old.lug-mgn.ru/articles/nastroika-interneta-maginfo-v-linux-v2</link>
 <description>&lt;p&gt;Я решил не трогать старую статью со старыми комментариями, а
опубликовать новую, пусть будет свежее обсуждение. В этой версии я
постарался описать шаги по настройке подробнее, чтобы меньше возникало вопросов.&lt;/p&gt;

&lt;p&gt;Редактировать буду по мере накопления информации&lt;/p&gt;

&lt;hr /&gt;

&lt;h1&gt;Настройка интернета магинфо в Linux&lt;/h1&gt;

&lt;h2&gt;Настройка через NetworkManager в Ubuntu 10.04+, Fedora Russian remix и других дистрибутивах (другие не проверял)&lt;/h2&gt;

&lt;p&gt;Настройка описана здесь: &lt;a href=&quot;http://lug-mgn.ru/articles/nastraivaem-vpn-maginfo-sredstvami-networkmanager&quot;&gt;lug-mgn.ru/&amp;#8230;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Старый способ - правка конфигурации pptp&lt;/h2&gt;

&lt;p&gt;Во-первых, для подключения вам понадобится pptp-клиент. Скорее всего
он уже есть в вашем дистрибутиве, убедиться в его наличии можно:
необходимо открыть терминал и ввести pptp, если выйдет несколько строк
типа &amp;#8220;pptp version 1.7.2&amp;#8221; и т.д. - он у вас есть. Иначе вылетит
что-нибудь типа &amp;#8220;нет такого файла&amp;#8221;, &amp;#8220;неверная комманда&amp;#8221;, &amp;#8220;command not
found&amp;#8221;, &amp;#8220;no such file or directory&amp;#8221; и т.п.&lt;/p&gt;

&lt;p&gt;Если у вас не оказалось pptp и вы не можете установить его средствами
дистрибутива, т.к. вы ещё не настроили интернет - постарайтесь скачать
пакет вручную на сайте дистрибутива и установить. Пакет должен
называться pptp, pptp-linux или pptp-client, но может называться и по
другому. Например, вот несколько адресов:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu: http://packages.ubuntu.com/search?keywords=pptp-linux&lt;/li&gt;
&lt;li&gt;Debian: http://packages.debian.org/search?keywords=pptp-linux&lt;/li&gt;
&lt;li&gt;Archlinux: http://www.archlinux.org/packages/pptpclient&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Теперь процесс настройки по шагам:&lt;/p&gt;

&lt;p&gt;1) Необходимо отредактировать конфиг pptp (все действия производятся в
окне терминала):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Предположим, что вы имеете настроенную средствами дистрибутива
локальную сеть (т.е. &lt;code&gt;ping vpn.mgn.ru&lt;/code&gt; даёт положительный результат)&lt;/li&gt;
&lt;li&gt;Делаем резервную копию файла /etc/ppp/options: &lt;code&gt;sudo cp /etc/ppp/options /etc/ppp/options.backup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Открываем конфиг на запись: &lt;code&gt;sudo nano /etc/ppp/options&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Пишем в него следующее (поменяйте ВАШ-VPN-ЛОГИН на свой vpn-логин):&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;
local
lock
detach
persist
maxfail 10

mtu 1512
mru 1512

require-mppe-40
require-mppe-8
require-mppe

lcp-echo-interval 30
lcp-echo-failure 5

require-mschap-v2
refuse-pap
refuse-chap
refuse-mschap
refuse-eap

defaultroute

user ВАШ-VPN-ЛОГИН
noauth
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Сохраняем и выходим из редактора nano (Ctrl+o затем Ctrl+x)&lt;/p&gt;

&lt;p&gt;2) Теперь необходимо отредактировать файл /etc/ppp/chap-secrets, пишем
туда:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
ВАШ_VPN-ЛОГИН * ВАШ_ПАРОЛЬ *
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Сохраняем. Далее в консоли выполняем:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo chmod 400 /etc/ppp/chap-secrets&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3) Теперь завершающий шаг: при каждом подключении необходимо поднимать
маршруты до впн-сервера и днс-серверов и запускать pptp-клиент. Мы
запишем все эти действия в простейший скрипт, при запуске которого
будет подниматься интернет. Этого вам хватит для того, чтобы выйти в
интернет и начать осваивать linux в поисках более адекватного
решения. Думаю самое адекватное решение - настройка через Network
Manager (описана в начале статьи).&lt;/p&gt;

&lt;p&gt;Итак, открываем редактор: &lt;code&gt;nano ~/vpn.sh&lt;/code&gt; и пишем следующее:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
sudo /sbin/route del default
sudo /sbin/route add -net 192.168.55.32 netmask 255.255.255.224 gw &lt;ваш_шлюз&gt;
sudo /sbin/route add -net 79.134.0.0 netmask 255.255.255.252 gw &lt;ваш_шлюз&gt;
# для 100-мбит локалки
sudo /sbin/route add -net 172.16.0.0 netmask 255.240.0.0 gw &lt;ваш_шлюз&gt;
sudo /sbin/route add -net 192.168.0.0 netmask 255.255.0.0 gw &lt;ваш_шлюз&gt;
sudo pptp vpn.mgn.ru
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Не забудьте заменить &amp;lt;ваш_шлюз&gt; на адрес вашего основного шлюза. Его
можно узнать у техподдержки провайдера, или, если вы знаете свой
ip-адрес, заменив в этом адресе цифры после третьей точки на единицу.&lt;/p&gt;

&lt;p&gt;Теперь необходимо дать скрипту права на выполнение:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chmod +x ~/vpn.sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Запускать интернет следующей коммандой:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~/vpn.sh&lt;/code&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Примечание для старых дистрибутивов:&lt;/strong&gt; в старых ядрах (не скажу
  точно до какой версии) поддержка шифрования (MPPE) для ppp была
  отдельным модулем (а когда-то вообще требовалось накладывать
  патчи). Так что можно попробовать сделать find /lib/modules -name
  &amp;#8220;*mppe*&amp;#8221; и подгрузить найденный модуль. Пользователям более-менее
  современных дистрибутивов - не забивайте голову, примечание не для вас.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Может быть ещё для BSD-семейства описать процесс кто-то
сможет?  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.P.S&lt;/strong&gt; Опечатки и ошибки пишите в комментариях, или мне лично в
 конференции lug-mgn@conference.jabber.ru - буду править.&lt;/p&gt;
</description>
 <comments>http://old.lug-mgn.ru/articles/nastroika-interneta-maginfo-v-linux-v2#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/340</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/maginfo-0">maginfo</category>
 <category domain="http://old.lug-mgn.ru/keywords/mgn">mgn</category>
 <category domain="http://old.lug-mgn.ru/keywords/network-manager">network manager</category>
 <category domain="http://old.lug-mgn.ru/keywords/nm">nm</category>
 <category domain="http://old.lug-mgn.ru/keywords/pptp">pptp</category>
 <category domain="http://old.lug-mgn.ru/keywords/ubuntu">Ubuntu</category>
 <category domain="http://old.lug-mgn.ru/keywords/vpn">VPN</category>
 <category domain="http://old.lug-mgn.ru/keywords/internet">интернет</category>
 <category domain="http://old.lug-mgn.ru/keywords/maginfo">Магинфо</category>
 <pubDate>Tue, 22 Jun 2010 21:40:07 +0400</pubDate>
 <dc:creator>vyazovoi</dc:creator>
 <guid isPermaLink="false">340 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>Документирование PHP-кода</title>
 <link>http://old.lug-mgn.ru/articles/dokumentirovanie-php-koda</link>
 <description>Извините за кривое форматирование, некогда править. Рекомендую смотреть красивый документ здесь: &lt;a href=&quot;http://vyazovoi.github.com/pages/phpdoc.html&quot;&gt;http://vyazovoi.github.com/pages/phpdoc.html&lt;/a&gt;&lt;br /&gt;
Слайды в pdf брать здесь: &lt;a href=&quot;http://vyazovoi.github.com/files/phpdoc.pdf&quot;&gt;http://vyazovoi.github.com/files/phpdoc.pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;table-of-contents&quot;&gt;&lt;br /&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;br /&gt;
&lt;div id=&quot;text-table-of-contents&quot;&gt;&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;#sec-1&quot;&gt;1 Введение &lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;#sec-2&quot;&gt;2 phpdoc &lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;#sec-2.1&quot;&gt;2.1 Теги &lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;#sec-2.2&quot;&gt;2.2 Пакеты &lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;#sec-3&quot;&gt;3 phpDocumentor &lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;#sec-4&quot;&gt;4 Doxygen &lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;#sec-5&quot;&gt;5 Сравнение &lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;outline-container-1&quot; class=&quot;outline-2&quot;&gt;&lt;br /&gt;
&lt;h2 id=&quot;sec-1&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;1&lt;/span&gt; Введение &lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Каким бы хорошим не был код, без комментирев и документации он сложен для&lt;br /&gt;
восприятия. В любом случае - считаете вы так или нет, а документировать код придется, особенно если он будет использоваться другими&lt;br /&gt;
людьми.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Для удобства программистов существуют специальные комментарии, которые служат для автоматической генерации документации.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Хороший пример правильного комментария - это комментарий, содержащий:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;ol&gt;&lt;br /&gt;
&lt;li&gt;&lt;br /&gt;
Информацию об авторе модуля/класса/функции - бывает очень полезно в больших и&lt;br /&gt;
сложных проектах, которые пишут большое количество программистов.&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;br /&gt;
Назначение описываемого кода.&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;br /&gt;
Описание возвращаемого значения и входных параметров функции - в имени переменной много информации не уместишь.&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;br /&gt;
Любая другая полезная информация&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;outline-container-2&quot; class=&quot;outline-2&quot;&gt;&lt;br /&gt;
&lt;h2 id=&quot;sec-2&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;2&lt;/span&gt; phpdoc &lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Начнем с теории:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Генератор документации - это программа, которая анализирует исходный код и генерирует&lt;br /&gt;
документацию для программистов или для пользователей с такими удобствами как поиск и&lt;br /&gt;
глоссарий.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Для того, чтобы анализатор мог считывать дополнительную информацию, нужен стандарт на&lt;br /&gt;
документирующие комментарии. Также интегрированные среды разработки могут использовать&lt;br /&gt;
такие комментарии для, например, вывода всплывающих подсказок.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Первым стоит упомянуть phpdoc - это адаптация javadoc под php. Написан на&lt;br /&gt;
PHP. Популярностью не пользуется, тем не менее его формат комментариев стал стандартом де-факто&lt;br /&gt;
для документирования php-кода.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Блок с комментарием называется DocBlock. Вот примеры DocBlock&#039;ов:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
&lt;span style=&quot;text-decoration:underline;&quot;&gt;Слайд №1&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Первый докблок в файле - комментарий для всего файла.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Базовые элементы любого док-блока это короткое описание, развернутое&lt;br /&gt;
описание и теги.&lt;br /&gt;
Длинное описание отделяется от короткого пустой строкой или точкой.&lt;br /&gt;
Развернутое описание может содержать в себе html-форматирование.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;outline-container-2.1&quot; class=&quot;outline-3&quot;&gt;&lt;br /&gt;
&lt;h3 id=&quot;sec-2.1&quot;&gt;&lt;span class=&quot;section-number-3&quot;&gt;2.1&lt;/span&gt; Теги &lt;/h3&gt;&lt;br /&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2.1&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
&lt;span style=&quot;text-decoration:underline;&quot;&gt;Слайд №2&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Теги это специальные ключевые слова, которые начинаются с символа &quot;собака&quot;. Все теги&lt;br /&gt;
являются опциональными.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;outline-container-2.2&quot; class=&quot;outline-3&quot;&gt;&lt;br /&gt;
&lt;h3 id=&quot;sec-2.2&quot;&gt;&lt;span class=&quot;section-number-3&quot;&gt;2.2&lt;/span&gt; Пакеты &lt;/h3&gt;&lt;br /&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-2.2&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Пакеты обозначаются тегом &quot;@package&quot;. Пакеты объединяют константы, переменные, функции и классы&lt;br /&gt;
в группы. Если взять в пример сам PHP - каждый его подключаемый модуль может быть отдельным пакетом.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
На этом месте мы закончим с теорией и перейдем к генераторам документации.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;outline-container-3&quot; class=&quot;outline-2&quot;&gt;&lt;br /&gt;
&lt;h2 id=&quot;sec-3&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;3&lt;/span&gt; phpDocumentor &lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
&lt;span style=&quot;text-decoration:underline;&quot;&gt;Слайд №3&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
phpDocumentor является стандартом де-факто для документирования PHP-кода. Как&lt;br /&gt;
результат - он поддерживается в большинстве PHP-ориентированных сред разработки, например, в популярном&lt;br /&gt;
Zend Studio. Более того, Zend Studio работает корректно только с DocBlock&#039;ами&lt;br /&gt;
phpDocumentor.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Надо отметить, что phpDocumentor пока не поддерживает нововведения недавнего PHP версии 5.3.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Что касается кроссплатформенности: т.к. phpDocumentor написан на PHP - он работает везде, где работает PHP.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;outline-container-4&quot; class=&quot;outline-2&quot;&gt;&lt;br /&gt;
&lt;h2 id=&quot;sec-4&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;4&lt;/span&gt; Doxygen &lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-4&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
&lt;span style=&quot;text-decoration:underline;&quot;&gt;Слайд №4&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Первое, что бросается в глаза - большое количество поддерживаемых языков.&lt;br /&gt;
Doxygen очень популярен и используется во многих opensource проектах. Среди них такие&lt;br /&gt;
проекты как KDE и Mozilla. Из известных PHP-приложений, которые используют Doxygen,&lt;br /&gt;
стоит упомянуть Drupal.&lt;br /&gt;
Doxygen также поддерживается многими средами разработки. Например Kdevelop и Eclipse (с&lt;br /&gt;
помощью стороннего плагина). Но среды, завязанные на PHP, предпочитают phpDocumentor.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div id=&quot;outline-container-5&quot; class=&quot;outline-2&quot;&gt;&lt;br /&gt;
&lt;h2 id=&quot;sec-5&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;5&lt;/span&gt; Сравнение &lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-5&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
&lt;span style=&quot;text-decoration:underline;&quot;&gt;Слайд №5&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Есть у doxygen очевидные плюсы: поддержка нескольких языков и диаграммы связей.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
Тем не менее, есть в нем и жирный минус, который я не упомянул ранее: не полная&lt;br /&gt;
поддержка PHP, связанная с тем, что doxygen ориентирован на язык си.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div id=&quot;postamble&quot;&gt;&lt;br /&gt;
&lt;p class=&quot;author&quot;&gt; Author: Pavel Vyazovoi&lt;br /&gt;
&lt;a href=&quot;mailto:vyazovoi@googlemail.com&quot;&gt;&amp;lt;vyazovoi@googlemail.com&amp;gt;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p class=&quot;date&quot;&gt; Date: 2010-03-14 21:00:40 YEKT&lt;/p&gt;&lt;br /&gt;
&lt;p class=&quot;creator&quot;&gt;HTML generated by org-mode 6.34c in emacs 23&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;</description>
 <comments>http://old.lug-mgn.ru/articles/dokumentirovanie-php-koda#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/329</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/doxygen">doxygen</category>
 <category domain="http://old.lug-mgn.ru/keywords/php">php</category>
 <category domain="http://old.lug-mgn.ru/keywords/phpdoc">phpdoc</category>
 <category domain="http://old.lug-mgn.ru/keywords/phpdocumentor">phpDocumentor</category>
 <category domain="http://old.lug-mgn.ru/keywords/doklad">доклад</category>
 <pubDate>Sun, 14 Mar 2010 19:24:02 +0300</pubDate>
 <dc:creator>vyazovoi</dc:creator>
 <guid isPermaLink="false">329 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>Материалы доклада &quot;Open source OLAP-система Jedox Palo BI Suite&quot;</title>
 <link>http://old.lug-mgn.ru/articles/materialy-doklada-open-source-olap-sistema-jedox-palo-bi-sui</link>
 <description>Публикую материалы доклада &quot;Open source OLAP-система Jedox Palo BI Suite&quot;:&lt;br /&gt;
1. текст доклада в pdf&lt;br /&gt;
2. презентация в pdf</description>
 <comments>http://old.lug-mgn.ru/articles/materialy-doklada-open-source-olap-sistema-jedox-palo-bi-sui#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/327</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/bi">bi</category>
 <category domain="http://old.lug-mgn.ru/keywords/jedox">jedox</category>
 <category domain="http://old.lug-mgn.ru/keywords/olap">olap</category>
 <category domain="http://old.lug-mgn.ru/keywords/open-source">open source</category>
 <category domain="http://old.lug-mgn.ru/keywords/palo">palo</category>
 <category domain="http://old.lug-mgn.ru/keywords/doklad">доклад</category>
 <category domain="http://old.lug-mgn.ru/keywords/seminar">семинар</category>
 <enclosure url="http://old.lug-mgn.ru/files/Palo.pdf" length="1135755" type="application/pdf" />
 <pubDate>Wed, 10 Mar 2010 17:37:42 +0300</pubDate>
 <dc:creator>DropC</dc:creator>
 <guid isPermaLink="false">327 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>MyPaint. Обзор и What&#039;s new</title>
 <link>http://old.lug-mgn.ru/articles/mypaint-obzor-i-whats-new</link>
 <description>&lt;p&gt;&lt;em&gt;Это конспект для доклада; Полноценный обзор MyPaint 0.8.0 можно найти &lt;a href=&quot;http://linuxgraphics.ru/articles.php?article_id=88&quot;&gt;здесь&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;_&quot;&gt;Обзор&lt;/h2&gt;
&lt;p&gt;Как несложно догадаться из названия, MyPaint (&lt;a href=&quot;http://mypaint.intilinux.com&quot;&gt;http://mypaint.intilinux.com&lt;/a&gt;) - это программа для рисования (дословно - что-то вроде &quot;моя живопись&quot;; исторически, это название - ссылка на программу paint.exe от microsoft). Программ для рисования сейчас довольно много, в том числе и свободных, и под Linux (конечно, в первую очередь на ум приходит Gimp). Особенность MyPaint - это программа в первую очередь именно для рисования, а не для обработки готовых изображений (собственно, MyPaint даже не умеет таких вещей, как &quot;кроп&quot; или &quot;уровни&quot;; за такими функциями добро пожаловать в тот же Gimp). На самом деле, ближайшие конкуренты MyPaint - это Corel Painter и ArtRage.&lt;/p&gt;
&lt;p&gt;Главным отличием программ этого класса от программ класса Gimp или Photoshop является максимально полная поддержка соответствующего &quot;рисовального&quot; оборудования (в первую очередь, планшетов) и мощный движок кистей. Например, Corel Painter имеет несколько встроенных алгоритмов расчёта (&quot;акварель&quot;, &quot;масло&quot; итп), у каждого из алгоритмов есть некоторое количество параметров (размер кисти, степень размазывания, степень стекания краски итп), и каждый из параметров можно сделать зависимым от любых входных параметров (сила нажатия, направление движения, скорость итд). Каждый из алгоритмов кистей Corel Painter старается максимально полно имитировать физику соответствующего процесса (растекание акварели по бумаге, например). Это требует немалых вычислительных ресурсов, на машине четырёхлетней давности его запускать смысла не имеет.&lt;/p&gt;
&lt;p&gt;MyPaint имеет всего один алгоритм расчёта кистей, и он не пытается имитировать физику. Но этот алгоритм оказался достаточно общим, чтобы при соответствующих настройках создавать вполне реалистичные впечатления акварели или масла. Кроме того, при некоторых настройках этот алгоритм порождает материалы, явно невозможные в традиционной живописи - например, сочетающие свойства пастели, масла и акварели.&lt;/p&gt;
&lt;p&gt;Все кисти, доступные в MyPaint, являются, на самом деле, вариантами одной кисти (так как расчитываются по одному алгоритму), просто с разными настройками. Кисть имеет, на настоящий момент, 35 параметров (размер, степень непрозрачности и мн.др.). Каждый из параметров кисти может зависеть от любого набора из 8 входных параметров (сила нажатия, направление движения, скорость, случайный параметр итп). Причём, зависимость может быть как линейной (например, можно указать, что размер кисти равен 0.9 умножить на силу нажатия), так и нелинейной (можно задать любой график зависимости). Это порождает огромное количество вариантов кистей, которые, на первый взгляд, совершенно непохожи друг на друга. В комплекте MyPaint поставляется порядка двухсот кистей.&lt;/p&gt;
&lt;p&gt;Над MyPaint работает довольно мало разработчиков. Начал разработку швейцарец Martin Renold. Сейчас над программой также работают норвежец Jon Norbdy, швейцарец Jonas Wagner и ваш покорный слуга. Кроме того, перевод на французский и китайский языки выполнил француз Oliver Gonduin, ну и т.д., всех уж перечислять не стану. Коллектив, как видим, интернациональный.&lt;/p&gt;
&lt;h2 id=&quot;__2&quot;&gt;Что нового&lt;/h2&gt;
&lt;p&gt;Я сделаю небольшой обзор изменений, появившихся в дереве разработки MyPaint со времени выхода предыдущей версии - 0.7.1.&lt;/p&gt;
&lt;h3 id=&quot;__3&quot;&gt;Интернационализация&lt;/h3&gt;
&lt;p&gt;MyPaint теперь может быть переведена на любой язык, с использованием инфраструктуры gettext. Я сделал перевод на русский. Уже есть переводы на французский, норвежский, шведский, немецкий и упрощённый китайский.&lt;/p&gt;
&lt;h3 id=&quot;__4&quot;&gt;Палитра&lt;/h3&gt;
&lt;p&gt;Эта функциональность основана на работе Jon Norbdy, но я переписал практически весь код. Многие графические программы имеют ту или иную реализацию палитры - возможности запоминать наиболее часто используемые цвета. Однако текущая реализация палитры в MyPaint уникальна. Этот инструмент позволяет не только запоминать цвета, но и создавать новые. Палитра представляет собой прямоугольную таблицу из ячеек, каждая из которых может хранить цвет. Пользователь может &quot;положить цвет&quot; в некоторые из ячеек, а остальные ячейки будут заполнены автоматически, по принципу &quot;растяжки&quot;. Например, если положить в одну ячейку красный цвет, в другую - жёлтый, то ячейки между ними будут заполнены плавным переходом от красного через оранжевый к жёлтому. Палитру можно организовывать в виде именованных групп (например, &quot;оранжевые цвета&quot; или &quot;цвета для неба&quot;). Палитра сохраняется между сеансами работы и, кроме того, она автоматически сохраняется в рабочий файл при сохранении в формат по умолчанию - OpenRaster.&lt;/p&gt;
&lt;h3 id=&quot;__5&quot;&gt;Диалог слоёв&lt;/h3&gt;
&lt;p&gt;MyPaint поддерживает концепцию слоёв, аналогичную реализаци Gimp или Photoshop, начиная с версии 0.5.0. Однако, до сих пор управление слоями было довольно неудобным - например, переключиться на другой слой можно было либо через меню, либо по горячей клавише. Теперь в MyPaint есть диалог слоёв, более-менее похожий на диалог слоёв в Gimp или Photoshop. Можно перетаскивать слои, переименовывать их, устанавливать степень непрозрачности&amp;#8230; Режимы слоёв в основном дереве разработки пока не поддерживаются, но работа над ними идёт вовсю.&lt;/p&gt;
&lt;h3 id=&quot;__6&quot;&gt;Группы кистей&lt;/h3&gt;
&lt;p&gt;Как я уже упоминал, в MyPaint обычным делом являются сотни различных кистей. До сих пор MyPaint имел только один способ упорядочивать их - кисти можно было перетаскивать вверх-вниз в списке. Теперь кисти можно организовывать в группы. Каждая кисть может принадлежать сразу к нескольким группам (таким образом, на самом деле более точным термином здесь является &quot;тег&quot;, а не &quot;группа&quot;). Кроме того, диалог выбора кисти теперь показывает несколько кистей, использовавшихся последними.&lt;/p&gt;
&lt;h3 id=&quot;__7&quot;&gt;Поддержка наклона пера&lt;/h3&gt;
&lt;p&gt;Многие планшеты (хотя и не самые дешёвые) распознают не только силу нажатия, но и угол наклона пера (стилуса) к планшету. Поддержка этой функции позволяет создавать более реалистичные по ощущениям материалы - например, каллиграфические перья или аэрографы.&lt;/p&gt;
&lt;h3 id=&quot;__8&quot;&gt;Подбор цвета&lt;/h3&gt;
&lt;p&gt;В MyPaint к версии 0.7.1 уже было несколько способов выбрать цвет. Сюда относятся стандартный диалог выбора цвета, предоставляемый Gtk+, &quot;цветовое колесо&quot;, и &quot;пипетка&quot;, позволяющая взять цвет с холста. Теперь в MyPaint есть ещё один способ выбора цвета, называемый в английской версии Color Sampler. В основе его - цветовой круг для выбора оттенка и квадрат для выбора светлоты и насыщенности. Кроме того, внутри цветового круга показываются 12 ячеек с цветами, отличающимися только оттенком (светлота и насыщенность совпадают с выбранным цветом). Это простой инструмент, подсказывающий простые цветовые гармонии. В настройках инструмента можно попросить подсвечивать самые стандартные из гармоний - например, три цвета, расположенные на цветовом круге в вершинах равностороннего треугольника. Этот же инструмент может добавлять в палитру наборы цветов, основанные на выбранных гармониях.&lt;/p&gt;
&lt;h2 id=&quot;_durian&quot;&gt;Использование в Durian&lt;/h2&gt;
&lt;p&gt;Сейчас Blender Foundation ведёт работу над очередным &quot;свободным мультфильмом&quot; из серии Elephants Dream и Big Buck Bunny. Кодовое название проекта - Durian (напомню, кодовые названия первых двух проектов были Orange и Peach - апельсин и персик; дуриан - это фрукт, произрастающий в юго-восточной азии, выглядит как очень большой колючий огурец, имеет резкий специфический запах и приятный вкус). Известно, что это будет что-то фентезийное, с замками и драконами. Для подготовки концепции (conceptual art) в проекте используется текущая разрабатываемая версия MyPaint.&lt;/p&gt;
&lt;p&gt; Version 1.0&lt;/p&gt;
&lt;p&gt; Last updated 2009-11-12 22:44:52 YEKST&lt;/p&gt;
</description>
 <comments>http://old.lug-mgn.ru/articles/mypaint-obzor-i-whats-new#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/326</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/mypaint">mypaint</category>
 <category domain="http://old.lug-mgn.ru/keywords/grafika">графика</category>
 <category domain="http://old.lug-mgn.ru/keywords/doklad">доклад</category>
 <category domain="http://old.lug-mgn.ru/keywords/seminar">семинар</category>
 <pubDate>Sat, 06 Mar 2010 18:43:49 +0300</pubDate>
 <dc:creator>portnov</dc:creator>
 <guid isPermaLink="false">326 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>Ядро Linux за 10 минут (обзор)</title>
 <link>http://old.lug-mgn.ru/articles/yadro-linux-za-10-minut-obzor</link>
 <description>&lt;h2 id=&quot;_&quot;&gt;Немного истории&lt;/h2&gt;
&lt;p&gt;Относительно подробную историю создания ядра Linux можно найти в известной книге Линуса Торвальдса «Just for fun». Нас из неё интересуют следующие факты:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ядро создал в 1991 году студент университета Хельсинки Линус Торвальдс;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;В качестве платформы он использовал ОС Minix, написанную его преподавателем Эндрю Таненбаумом, запущенную на персональном компьютере с процессором Intel 80386;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;В качестве примера для подражания он использовал ОС семейства Unix, а в качестве путеводителя — сначала стандарт POSIX, а затем просто исходные коды программ из комплекта GNU (bash, gcc и пр).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Эти факты в значительной мере определили пути развития ядра в дальнейшем, их следствия заметны и в современном ядре.&lt;/p&gt;
&lt;p&gt;В частности, известно, что Unix-системы в своё время разделились на два лагеря: потомки UNIX System V Release 4 (семейство SVR4) против потомков Berkley Software Distribution v4.2 (BSD4.2). Linux по большей части принадлежит к первому семейству, но заимствует некоторые существенные идеи из второго.&lt;/p&gt;
&lt;h2&gt;Ядро в цифрах&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;  Около 30 тыс. файлов&lt;/li&gt;
&lt;li&gt;  Около 8 млн. строк кода (не считая комментариев)&lt;/li&gt;
&lt;li&gt;  Репозиторий занимает около 1 Гб&lt;/li&gt;
&lt;li&gt;  linux-2.6.33.tar.bz2: 63 Mb&lt;/li&gt;
&lt;li&gt;  patch-2.6.33.bz2: 10Mb, около 1.7 млн  изменённых строк&lt;/li&gt;
&lt;li&gt;  Около 6000 человек, чей код есть в ядре&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;__2&quot;&gt;Об архитектуре ядра&lt;/h2&gt;
&lt;p&gt;Все (или почти все) процессоры, которыми когда-либо интересовались производители Unix-подобных ОС, имеют аппаратную поддержку разделения привелегий. Один код может всё (в т.ч. общаться напрямую с оборудованием), другой — почти ничего. Традиционно говорят о «режиме ядра» (kernel land) и «режиме пользователя» (user land). Различные архитектуры ядер ОС различаются прежде всего подходом к ответу на вопрос: какие части кода ОС должны выполняться в kernel land, а какие — в user land? Дело в том, что у подавляющего большинства процессоров переключение между двумя режимами занимает существенное время. Выделяют следующие подходы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Традиционный: монолитное ядро. Весь код ядра компилируется в один большой бинарный файл. Всё ядро исполняется в режиме ядра;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Противоположный, новаторский: микроядро. В режиме ядра выполняются только самые необходимые части, всё остальное — в режиме пользователя;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;В традиционном подходе позже появился вариант: модульное ядро. Всё исполняется в режиме ядра, но при этом ядро компилируется в виде одного большого бинарного файла и кучки мелких модулей, которые могут загружаться и выгружаться по необходимости;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;И, конечно, всевозможные варианты гибридных архитектур.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ядро Linux начиналось как монолитное (глядя на существовавшие тогда Unix-ы). Современное Linux-ядро модульное. По сравнению с микроядром монолитное (или модульное) ядро обеспечивает существенно бо́льшую производительность, но предъявляет существенно более жёсткие требования к качеству кода различных компонентов. Так, в системе с микроядром «рухнувший» драйвер ФС будет перезапущен без ущерба для работы системы; рухнувший драйвер ФС в монолитном ядре — это Kernel panic и останов системы.&lt;/p&gt;
&lt;h2 id=&quot;_linux&quot;&gt;Подсистемы ядра Linux&lt;/h2&gt;
&lt;p&gt;Существует довольно широко известная диаграмма, изображающая основные подсистемы ядра Linux и их взаимодействие. Вот она:&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.makelinux.net/kernel_map_intro&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;/files/kernel/linux-kernel-big.png&quot; alt=&quot;linux-kernel-big.png&quot; /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Собственно, в настоящий момент видно только, что частей много и их взаимосвязи очень сложные. Поэтому мы будем рассматривать упрощённую схему:&lt;/p&gt;
&lt;p&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/files/kernel/linux-kernel-simple.png&quot; alt=&quot;linux-kernel-simple.png&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;__3&quot;&gt;Системные вызовы&lt;/h3&gt;
&lt;p&gt;Уровень системных вызовов — это наиболее близкая к прикладному программисту часть ядра Linux. Системные вызовы предоставляют интерфейс, используемый прикладными программами — это API ядра. Большинство системных вызовов Linux взяты из стандарта POSIX, однако есть и специфичные для Linux системные вызовы.&lt;/p&gt;
&lt;p&gt;Здесь стоит отметить некоторую разницу в подходе к проектированию API ядра в Unix-системах с одной стороны и в Windows[NT] и других идеологических потомках VMS с другой. Дизайнеры Unix предпочитают предоставить десять системных вызовов с одним параметром вместо одного системного вызова с двадцатью параметрами. Классический пример — создание процесса. В Windows функция для создания процесса — CreateProcess() — принимает 10 аргументов, из которых 5 — структуры. В противоположность этому, Unix-системы предоставляют два системных вызова (fork() и exec()), первый — вообще без параметров, второй — с тремя параметрами.&lt;/p&gt;
&lt;p&gt;Системные вызовы, в свою очередь, обращаются к функциям более низкоуровневых подсистем ядра.&lt;/p&gt;
&lt;h3 id=&quot;__4&quot;&gt;Управление памятью&lt;/h3&gt;
&lt;p&gt;Ядро Linux использует в качестве минимальной единицы памяти страницу. Размер страницы может зависеть от оборудования; на x86 это 4Кб. Для хранения информации о странице физической памяти (её физический адрес, принадлежность, режим использования и пр) используется специальная структура page размером в 40 байт.&lt;/p&gt;
&lt;p&gt;Ядро использует возможности современных процессоров для организации виртуальной памяти. Благодаря манипуляциям с каталогами страниц виртуальной памяти, каждый процесс получает адресное пространство размером в 4Гб (на 32х-разрядных архитектурах). Часть этого пространства доступна процессу только на чтение или исполнение: туда отображаются интерфейсы ядра.&lt;/p&gt;
&lt;p&gt;Существенно, что процесс, работающий в пространстве пользователя, в большинстве случаев «не знает», где находятся его данные: в ОЗУ или в файле подкачки. Процесс может попросить у системы выделить ему память именно в ОЗУ, но система не обязана удовлетворять такую просьбу.&lt;/p&gt;
&lt;h3 id=&quot;__5&quot;&gt;Управление процессами&lt;/h3&gt;
&lt;p&gt;Ядро Linux было многозадачным буквально с первого дня. К настоящему моменту оно имеет довольно хорошую поддержку вытесняющей многозадачности.&lt;/p&gt;
&lt;p&gt;В истории было известно два типа многозадачности:&lt;/p&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;
&lt;p&gt;Корпоративная многозадачность. &lt;/p&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;В этом варианте каждый процесс передаёт управление какому-нибудь другому, когда сочтёт нужным. Это экономит время на переключение режимов процессора, но, очевидно, о надёжности такой системы говорить не приходится: зависший процесс не передаст управление никому. В современных ОС этот вариант не используется.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;
&lt;p&gt;Вытесняющая многозадачность. &lt;/p&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Ядро ОС выделяет каждому процессу определённый квант процессорного времени и «насильно» передаёт управление другому процессу по истечении этого кванта. Это создаёт накладные расходы на переключение режимов процессора и расчёт приоритетов, но повышает надёжность и производительность.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Переключение процессов в linux может производиться по наступлению двух событий: аппаратного прерывания или прерывания от таймера. Частота прерываний таймера устанавливается при компиляции ядра в диапазоне от 100Гц до 1000Гц. Аппаратные прерывания возникают чуть ли не чаще: достаточно двинуть мышку или нажать кнопку на клавиатуре, да и внутренние устройства компьютера генерируют прерывания. Начиная с версии 2.6.23, появилась возможность собрать ядро, не использующее переключение процессов по таймеру. Это позволяет снизить энергопотребление в режиме простоя компьютера.&lt;/p&gt;
&lt;p&gt;Планировщик процессов использует довольно сложный алгоритм, основанный на расчёте приоритетов процессов. Среди процессов выделяются те, что требуют много процессорного времени и те, что тратят больше времени на ввод-вывод. На основе этой информации регулярно пересчитываются приоритеты процессов. Кроме того, используются задаваемые пользователем значения nice для отдельных процессов.&lt;/p&gt;
&lt;p&gt;Кроме многозадачности в режиме пользователя, ядро Linux использует многозадачность в режиме ядра: само ядро многопоточно.&lt;/p&gt;
&lt;p&gt;Традиционные ядра Unix-систем имели следующую&amp;#8230; ну если не проблему, то особенность: само ядро не было вытесняемым. Пример: процесс /usr/bin/cat хочет открыть файл &lt;em&gt;/media/cdrom/file.txt&lt;/em&gt; и использует для этого системный вызов &lt;em&gt;open()&lt;/em&gt;. Управление передаётся ядру. Ядро обнаруживает, что файл расположен на CD-диске и начинает инициализацию привода (раскручивание диска и пр). Это занимает существенное время. Всё это время управление не передаётся пользовательским процессам, т.к. планировщик не активен в то время, когда выполняется код ядра. Все пользовательские процессы ждут завершения этого вызова open().&lt;/p&gt;
&lt;p&gt;В противоположность этому, современное ядро Linux полностью вытесняемо. Планировщик отключается лишь на короткие промежутки времени, когда ядро никак нельзя прервать — например, на время инициализации некоторых устройств, которые требуют, чтобы определённые действия выполнялись с фиксированными задержками. В любое другое время поток ядра может быть вытеснен, и управление передано другому потоку ядра или пользовательскому процессу.&lt;/p&gt;
&lt;h3 id=&quot;__6&quot;&gt;Сетевая подсистема&lt;/h3&gt;
&lt;p&gt;Сетевая подсистема ядра ОС, теоретически, почти вся может выполняться в пространстве пользователя: для таких операций, как формирование пакетов TCP/IP, никакие привелегии не нужны. Однако в современных ОС, тем более применяемых на высоконагруженных серверах, от всего сетевого стека — всей цепочки от формирования пакетов до работы непосредственно с сетевым адаптером — требуется максимальная производительность. Сетевой подсистеме, работающей в пространстве пользователя, пришлось бы постоянно обращаться к ядру для общения с сетевым оборудованием, а это повлекло бы весьма существенные накладные расходы.&lt;/p&gt;
&lt;p&gt;Сетевая подсистема Linux обеспечивает следующую функциональность:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Абстракцию сокетов;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Стеки сетевых протоколов (TCP/IP, UDP/IP, IPX/SPX, AppleTalk и мн. др);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Маршрутизацию (routing);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Пакетный фильтр (модуль Netfilter);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Абстракцию сетевых интерфейсов.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В различных Unix-системах использовалось два различных прикладных интерфейса, обеспечивающих доступ к функциональности сетевой подсистемы: Transport Layer Interface (TLI) из SVR4 и sockets (сокеты) из BSD. Интерфейс TLI, с одной стороны, тесно завязан на подсистему STREAMS, отсутствующую в ядре Linux, а с другой — не совместим с интерфейсом сокетов. Поэтому в Linux используется интерфейс сокетов, взятый из семейства BSD.&lt;/p&gt;
&lt;h2 id=&quot;__7&quot;&gt;Файловая система&lt;/h2&gt;
&lt;h3 id=&quot;_vfs&quot;&gt;Виртуальная файловая система (VFS)&lt;/h3&gt;
&lt;p&gt;С точки зрения приложений, в Unix-подобных ОС существует только одна файловая система. Она представляет собой дерево директорий, растущее из «корня». Приложениям, в большинстве случаев, не интересно, на каком носителе находятся данные файлов; они могут находиться на жёстком диске, оптическом диске, флеш-носителе или вообще на другом компьютере и другом континенте. Эта абстракция и реализующая её подсистема называется виртуальной файловой системой (VFS).&lt;/p&gt;
&lt;p&gt;Стоит заметить, что VFS в ядре Linux реализована с учётом идей из ООП. Например, ядро рассматривает набор структур inode, каждая из которых содержит (среди прочего):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Данные из on-disk inode (права доступа, размер файла и др);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Указатель на структуру, описывающую драйвер ФС, к которой принадлежит данный inode;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Указатель на струкруру операций с inode, которая, в свою очередь, содержит указатели на функции для создания inode, изменения его атрибутов и т.д., реализованные в конкретном драйвере ФС.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Аналогично устроены структуры ядра, описывающие другие сущности ФС — суперблок, элемент каталога, файл.&lt;/p&gt;
&lt;h3 id=&quot;__8&quot;&gt;Драйверы ФС&lt;/h3&gt;
&lt;p&gt;Драйверы ФС, как можно заметить из диаграммы, относятся к гораздо более высокому уровню, чем драйверы устройств. Это связано с тем, что драйверы ФС не общаются ни с какими устройствами. Драйвер файловой системы лишь реализует функции, предоставляемые им через интерфейс VFS. При этом данные пишутся и читаются в/из страницы памяти; какие из них и когда будут записаны на носитель — решает более низкий уровень. Тот факт, что драйверы ФС в Linux не общаются с оборудованием, позволил реализовать специальный драйвер FUSE, который делегирует функциональность драйвера ФС в модули, исполняемые в пространстве пользователя.&lt;/p&gt;
&lt;h3 id=&quot;__9&quot;&gt;Страничный кэш&lt;/h3&gt;
&lt;p&gt;Эта подсистема ядра оперирует страницами виртуальной памяти, организованными в виде базисного дерева (radix tree). Когда происходит чтение данных с носителя, данные читаются в выделяемую в кэше страницу, и страница остаётся в кэше, а драйвер ФС читает из неё данные. Драйвер ФС пишет данные в страницы памяти, находящиеся в кэше. При этом эти страницы помечаются как «грязные» (dirty). Специальный поток ядра, pdflush, регулярно обходит кэш и формирует запросы на запись грязных страниц. Записанная на носитель грязная страница вновь помечается как чистая.&lt;/p&gt;
&lt;h3 id=&quot;__10&quot;&gt;Уровень блочного ввода-вывода&lt;/h3&gt;
&lt;p&gt;Эта подсистема ядра оперирует очередями (queues), состоящими из структур bio. Каждая такая структура описывает одну операцию ввода-вывода (условно говоря, запрос вида «записать вот эти данные в блоки ##141-142 устройства /dev/hda1»). Для каждого процесса, осуществляющего ввод-вывод, формируется своя очередь. Из этого множества очередей создаётся одна очередь запросов к драйверу каждого устройства.&lt;/p&gt;
&lt;h3 id=&quot;__11&quot;&gt;Планировщик ввода-вывода&lt;/h3&gt;
&lt;p&gt;Если выполнять запросы на дисковый ввод-вывод от приложений в том порядке, в котором они поступают, производительность системы в среднем будет очень низкой. Это связано с тем, что операция поиска нужного сектора на жёстком диске — очень медленная. Поэтому планировщик обрабатывает очереди запросов, выполняя две операции:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Сортировка: планировщик старается ставить подряд запросы, обращающиеся к находящимся близко секторам диска;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Объединение: если в результате сортировки рядом оказались несколько запросов, обращающихся к последовательно расположенным секторам, их нужно объединить в один запрос.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В современном ядре доступно несколько планировщиков: Anticipatory, Deadline, CFQ, noop. Существует версия ядра от Con Kolivas с ещё одним планировщиком — BFQ. Планировщики могут выбираться при компиляции ядра либо при его запуске.&lt;/p&gt;
&lt;p&gt;Отдельно следует остановиться на планировщике noop. Этот планировщик не выполняет ни сортировки, ни слияния запросов, а переправляет их драйверам устройств в порядке поступления. На системах с обычными жёсткими дисками этот планировщик покажет очень плохую производительность. Однако, сейчас становятся распространены системы, в которых вместо жёстких дисков используются флеш-носители. Для таких носителей время поиска сектора равно нулю, поэтому операции сортировки и слияния не нужны. В таких системах при использовании планировщика noop производительность не изменится, а потребление ресурсов несколько снизится.&lt;/p&gt;
&lt;h3 id=&quot;__12&quot;&gt;Обработка прерываний&lt;/h3&gt;
&lt;p&gt;Практически все актуальные архитектуры оборудования используют для общения устройств с программным обеспечением концепцию прерываний. Выглядит это следующим образом. На процессоре выполняется какой-то процесс (не важно, поток ядра или пользовательский процесс). Происходит прерывание от устройства. Процессор отвлекается от текущих задач и переключает управление на адрес памяти, сопоставленный данному номеру прерывания в специальной таблице прерываний. По этому адресу находится обработчик прерывания. Обработчик выполняет какие-то действия в зависимости от того, что именно произошло с этим устройством, затем управление передаётся планировщику процессов, который, в свою очередь, решает, кому передать управление дальше.&lt;/p&gt;
&lt;p&gt;Тут существует определённая тонкость. Дело в том, что во время работы обработчика прерывания планировщик задач не активен. Это не удивительно: предполагается, что обработчик прерывания работает непосредственно с устройством, а устройство может требовать выполнения каких-то действий в жёстких временных рамках. Поэтому если обработчик прерывания будет работать долго, то все остальные процессы и потоки ядра будут ждать, а это обычно недопустимо.&lt;/p&gt;
&lt;p&gt;В ядре Linux в результате любого аппаратного прерывания управление передаётся в функцию do_IRQ(). Эта функция использует отдельную таблицу зарегистрированных в ядре обработчиков прерываний, чтобы определить, куда передавать управление дальше.&lt;/p&gt;
&lt;p&gt;Чтобы обеспечить минимальное время работы в контексте прерывания, в ядре Linux используется разделение обработчиков на верхние и нижние половины. Верхняя половина — это функция, которая регистрируется драйвером устройства в качестве обработчика определённого прерывания. Она выполняет только ту работу, которая безусловно должна быть выполнена немедленно. Затем она регистрирует другую функцию (свою нижнюю половину) и возвращает управление. Планировщик задач передаст управление зарегистрированной нижней половине, как только это будет возможно. При этом в большинстве случаев управление передаётся нижней половине сразу после завершения работы верхней половины. Но при этом нижняя половина работает как обычный поток ядра, и может быть прервана в любой момент, а потому она имеет право исполняться сколь угодно долго.&lt;/p&gt;
&lt;p&gt;В качестве примера можно рассмотреть обработчик прерывания от сетевой карты, сообщающего, что принят ethernet-пакет. Этот обработчик обязан сделать две вещи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Взять пакет из буфера сетевой карты и сигнализировать сетевой карте, что пакет получен операционной системой. Это нужно сделать немедленно по получении прерывания, через милисекунду в буфере будут уже совсем другие данные;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Поместить этот пакет в какие-либо структуры ядра, выяснить, к какому протоколу он относится, передать его в соответствующие функции обработки. Это нужно сделать как можно быстрее, чтобы обеспечить максимальную производительность сетевой подсистемы, но не обязательно немедленно.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Соответственно, первое выполняет верхняя половина обработчика, а второе — нижняя.&lt;/p&gt;
&lt;h3 id=&quot;__13&quot;&gt;Драйвера устройств&lt;/h3&gt;
&lt;p&gt;Большинство драйверов устройств обычно компилируются в виде модулей ядра. Драйвер устройства получает запросы с двух сторон:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;От устройства — через зарегистрированные драйвером обработчики прерываний;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;От различных частей ядра — через API, который определяется конкретной подсистемой ядра и самим драйвером.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; Version 1.0&lt;/p&gt;
&lt;p&gt; Last updated 2010-03-05 20:25:06 YEKST&lt;/p&gt;
</description>
 <comments>http://old.lug-mgn.ru/articles/yadro-linux-za-10-minut-obzor#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/325</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/kernel">kernel</category>
 <category domain="http://old.lug-mgn.ru/keywords/linux">linux</category>
 <category domain="http://old.lug-mgn.ru/keywords/doklad">доклад</category>
 <category domain="http://old.lug-mgn.ru/keywords/seminar">семинар</category>
 <enclosure url="http://old.lug-mgn.ru/files/linux-kernel-presentation.pdf" length="499707" type="application/pdf" />
 <pubDate>Sat, 06 Mar 2010 18:20:39 +0300</pubDate>
 <dc:creator>portnov</dc:creator>
 <guid isPermaLink="false">325 at http://old.lug-mgn.ru</guid>
</item>
<item>
 <title>Системы контроля версий. Git, Gitosis</title>
 <link>http://old.lug-mgn.ru/articles/sistemy-kontrolya-versii-git-gitosis</link>
 <description>&lt;p&gt;Начну я с краткого введения в системы контроля версий вообще.&lt;/p&gt;
&lt;h2 id=&quot;_&quot;&gt;Что такое управление версиями и зачем оно?&lt;/h2&gt;
&lt;p&gt;Итак, предположим, вы разрабатываете программу. Для простоты сначала предположим, что вы разрабатываете ее в одиночку и для собственного удовольствия. Как это выглядит?&lt;/p&gt;
&lt;p&gt;Создаем директорию MyApplication, в ней - собственно файлы программы (скажем, *.c). Далее начинается итерационный процесс: написали некоторое количество кода &amp;#8594; скомпилировали &amp;#8594; запустили &amp;#8594; обнаружили ошибки или недоработки &amp;#8594; отредактировали исходники &amp;#8594; &amp;#8230; Всё просто, в целом. Но через некоторое время начинаются нетривиальные вещи.&lt;/p&gt;
&lt;p&gt;Неочевидности:
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Последнее изменение сделало программу хуже, чем она была до того. Хочется вернуть всё &quot;как было&quot;. Хорошо, если не успели закрыть редактор - делаем $Undo. А если закрыли?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Хотим приделать к программе новую функциональность, но сразу ясно, что, во-первых, сразу после написания она будет глючить (т.к. еще не отлажена), а во-вторых, в сложной программе добавление новой функциональности может добавить ошибок в ранее работавшую часть программы. Хочется, в случае чего, откатиться к заведомо работающему варианту и начать всё сначала.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Если программа предназначена не только для вас лично, то вам придется делать &quot;релизы&quot;, т.е. выпускать заведомо работающие версии программы. Для подготовки релиза вам придется фиксить некоторое количество багов. Это довольно скучный процесс, хочется разбавлять его добавлением новых возможностей в программу (это, как правило, интереснее). Но нельзя: добавление новых фич обязательно добавит багов, и вы никогда не доедете до релиза.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Первое, что приходит в голову для решения всех этих проблем - резервные копии. Скажем, каждую работающую версию программы упаковывать в MyApplication_v0.001.tar.gz, в случае чего - откатываться. Для подготовки к релизу - сделать копию директории MyApplication, в которой только фиксить баги, а в основной - добавлять функционал. При этом подходе через некоторое время разработки у вас появится куча *.tar.gz и не меньше копий рабочей директории. Очень быстро вы начнете путаться, где что.&lt;/p&gt;
&lt;p&gt;Если вы разрабатываете программу не в одиночку, а, скажем, с группой товарищей, появляются новые неочевидности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Вы добавили в программу (в свою копию) возможность A, а ваш товарищ (в свою) - возможность B. Хотелось бы, чтобы у обоих была версия с обоими возможностями.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Вы добавили в программу некоторую функцию, ваш товарищ добавил ее же, но реализовал по-другому. Какую версию выпускать и поддерживать дальше?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ваш товарищ в какой-то момент разработки понял, что программу можно улучшить и упростить, если изменить ее архитектуру, что-то обобщить, что-то вынести в отдельный модуль и т.п., и начал переделку (это называется умным словом рефакторинг). Вы же в это время в старой версии программы находите баги и фиксите их. Т.к. в версии вашего товарища в основном тот же код, эти баги наверняка есть и там - хотелось бы их сразу пофиксить.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Даже в случае двух разработчиков, при &quot;ручном&quot; согласовании изменений после определенного объема программы эти неочевидности превращаются в окончательную неразбериху. При разработке сколько-нибудь большой программы в конторе &quot;ручное&quot; согласование изменений видится почти невозможным.&lt;/p&gt;
&lt;p&gt;Все эти проблемы призваны решить специальные программы - системы контроля версий (version control systems, vcs).&lt;/p&gt;
&lt;h2 id=&quot;_vcs&quot;&gt;Общие свойства VCS&lt;/h2&gt;
&lt;p&gt;Если вы работаете с vcs, то у вас есть место, где хранится вся история изменений в программе - это место называется репозиторий (repository). Для внесения изменений в программу вам нужно получить копию текущей разрабатываемой версии - она называется вашей рабочей копией (working copy). Процесс получения рабочей копии традиционно называется словом &quot;чекаут&quot; (checkout). В случае коллективной разработки, вам придется поддерживать актуальность вашей рабочей копии (проверять, что там остальные наработали) - это обычно называется &quot;апдейт&quot; (update). Чтобы ваши изменения попали в репозиторий, вам нужно сделать коммит (commit) (еще это называется словом checkin). Часто словом commit называют собственно сам набор изменений, зафиксированный этой операцией (более точный термин - changeset). Каждое зафиксированное изменение называют ревизией. Вы можете в любой момент откатить свою рабочую копию к любой предыдущей ревизии - это называется revert.&lt;/p&gt;
&lt;p&gt;Для того, чтобы отслеживать такие вещи, как релизы, или варианты рефакторинга программы, или тестировать версии с новыми функциями - в репозитории создаются ветви разработки (branches). Для согласования хода разработки в разных ветках (она может вестись, и обычно ведется, параллельно) время от времени делают слияние веток (merge) - когда к одной ветке применяются те же изменения, что были проделаны в другой. Если какое-то место какого-то файла было по-разному изменено в разных ветках, при слиянии возникает конфликт (merge conflict) - его приходится решать вручную, выбирая один из вариантов или как-то логично их объединяя.&lt;/p&gt;
&lt;p&gt;Так как ревизий в репозитории обычно довольно много, возникает необходимость некоторые из них как-то помечать (например, выпущенные релизы, или просто состояния программы, в которых она заведомо работала). Такие пометки называют тегами (tags). Таким образом, теги - это поименованные ревизии в репозитории.&lt;/p&gt;
&lt;p&gt;Автоматизация всех перечисленных операций - дело VCS.&lt;/p&gt;
&lt;h2 id=&quot;_vs_vcs&quot;&gt;Централизованные vs распределенные VCS&lt;/h2&gt;
&lt;p&gt;Всё множество VCS можно разделить на два класса - централизованные и распределенные.&lt;/p&gt;
&lt;p&gt;В случае с централизованной VCS репозиторий хранится на одном сервере, и все разработчики работают с ним. Очевидное преимущество: простое управление выпуском релизов и вообще ходом развития программы, раз весь код в одном месте. Очевидный недостаток: если с сервером что-то случится, работа всех разработчиков пропадет (даже в случае регулярных бэкапов - пропадет работа всех разработчиков, скажем, за последнюю неделю). Известные примеры централизованных vcs - CVS, Subversion, Perforce.&lt;/p&gt;
&lt;p&gt;В случае с распределенной VCS, каждый разработчик имеет полную копию репозитория и работает с ним, время от времени синхронизируясь с репозиториями остальных. Таким образом, для организации целенаправленной разработки потребуются какие-то не технические, а организационно-административные средства. Зато получаем множество преимуществ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Раз у каждого есть полная копия репозитория, работа &#039;всех&#039; разработчиков пропасть не может вообще.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Часто выполняемые операции - прежде всего, commit - происходят почти мгновенно, т.к. не требуют соединения по сети.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Каждый разработчик может создавать в своем репозитории ветки для каких-то экспериментов, всем остальным даже не нужно знать об этом.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Т.к. в распределенных VCS предполагается регулярная синхронизация репозиториев, в них гораздо более эффективно реализована операция слияния веток (здесь это одна из базовых операций, в отличие от централизованных VCS, где это делается нечасто).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Каждый разработчик может взять (&quot;утянуть&quot;) у другого один или несколько коммитов, применив их к своему коду.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;_git&quot;&gt;Git&lt;/h2&gt;
&lt;p&gt;Git - это одна из распределенных VCS (distributed version control system, dvcs). Другими примерами dvcs являются Mercurial, Bazaar, Monotone.&lt;/p&gt;
&lt;p&gt;Git выделяется на их фоне главным образом из-за того, что он применяется для разработки ядра Linux (&lt;a href=&quot;http://www.kernel.org&quot;&gt;http://www.kernel.org&lt;/a&gt;). Собственно, именно для этого Git и разрабатывался. Ядро Linux - весьма немаленький проект, как по объему исходного кода, так и по числу участников, поэтому при разработке Git большое внимание было уделено производительности и легкости слияния веток.&lt;/p&gt;
&lt;h3 id=&quot;__2&quot;&gt;Создание репозитория&lt;/h3&gt;
&lt;p&gt;Одна из особенностей распределённых VCS и Git в частности состоит в лёгкости создания репозитория. В случае svn, например, вам надо поднимать специальный сервер, настраивать его&amp;#8230; В случае с Git, вы даёте одну команду:&lt;/p&gt;
&lt;p&gt;$ git init&lt;/p&gt;
&lt;p&gt;и всё, в текущей директории готов репозиторий Git. Вся информация репозитория хранится в директории ./.git.&lt;/p&gt;
&lt;p&gt;Bare-репозитории.Иногда бывает нужно создать репозиторий без рабочей копии (т.е. состоящий только из директории .git). Такие репозитории называются bare-репозиториями. Директория такого репозитория содержит всё то же, что содержит директория .git обычного репозитория. Для создания bare-репозиториев предназначена опция --bare.&lt;/p&gt;
&lt;h3 id=&quot;__3&quot;&gt;Коммит&lt;/h3&gt;
&lt;p&gt;Ещё одна особенность Git - он не отслеживает автоматически все подряд файлы, находящиеся в директории проекта. Вместо этого, у него есть такое понятие как индекс. Индекс - это некоторое временное хранилище, в котором Git хранит список изменившихся файлов. Чтобы сообщить Git-у, что файл изменился, надо дать команду&lt;/p&gt;
&lt;p&gt;$ git add имя-файла&lt;/p&gt;
&lt;p&gt;(конечно, можно добавить все файлы по маске, или сразу всю директорию). У команды git add есть интересные параметры. git add --interactive покажет список изменившихся файлов и позволит вам в интерактивном режиме выбрать, какие из них включать в коммит. git add --patch работает аналогично, но не с файлами, а с отдельными изменения (hunks в терминологии diff).&lt;/p&gt;
&lt;p&gt;Чтобы сделать собственно коммит, используется команда&lt;/p&gt;
&lt;p&gt;$ git commit&lt;/p&gt;
&lt;p&gt;или&lt;/p&gt;
&lt;p&gt;$ git commit -a&lt;/p&gt;
&lt;p&gt;чтобы предварительно добавить в индекс все изменившиеся файлы. Команда git commit -i (--interactive) работает аналогично последовательности git add --interactive; git commit.&lt;/p&gt;
&lt;p&gt;Если сразу после коммита вы обнаружили, что что-то забыли включить в него, можно поправить:&lt;/p&gt;
&lt;p&gt;$ git commit --amend      # Добавить последние изменения в последний коммит, &quot;заодно&quot;.&lt;/p&gt;
&lt;p&gt;Особенность Git состоит в том, что ревизии (коммиты) обозначаются не номерами, как, например, в svn или cvs, а 40-значными идентификаторами типа a21b96&amp;#8230;. Идентификаторы можно сокращать до первых нескольких знаков, лишь бы они однозначно определяли коммит. Кроме того, если нужный вам коммит помечен тегом, то можно использовать имя тега вместо идентификатора коммита. На последний коммит в текущей ветке можно также ссылаться по имени HEAD, на предпоследний - HEAD^, пред-предпоследний - HEAD^\^ итп. Существуют и другие способы обозначить нужный коммит, подробности см. в документации.&lt;/p&gt;
&lt;h3 id=&quot;__4&quot;&gt;Состояние репозитория&lt;/h3&gt;
&lt;p&gt;Увидеть, какие файлы были изменены, добавлены итп после последнего коммита можно командой&lt;/p&gt;
&lt;p&gt;$ git status&lt;/p&gt;
&lt;p&gt;Сами изменения, сделанные с момента последнего коммита, можно посмотреть командой&lt;/p&gt;
&lt;p&gt;$ git diff&lt;/p&gt;
&lt;p&gt;У этой команды есть варианты: git diff &amp;lt;идентификатор&amp;gt; - посмотреть изменения с указанного коммита по текущее состояние, git diff &amp;lt;идентификатор1&amp;gt; &amp;lt;идентификатор2&amp;gt; - различия между двумя ревизиями.&lt;/p&gt;
&lt;p&gt;Посмотреть журнал последних коммитов - git log.&lt;/p&gt;
&lt;h3 id=&quot;__5&quot;&gt;Работа с клонированным репозиторием&lt;/h3&gt;
&lt;p&gt;Чтобы создать новый репозитоий, взяв за основу существующий, используется команда&lt;/p&gt;
&lt;p&gt;$ git clone git://remote.server/repo.git&lt;/p&gt;
&lt;p&gt;Кроме собственного протокола, git поддерживает http://, ssh:// и мн. др.&lt;/p&gt;
&lt;p&gt;Если вы создавали свой репозиторий как клон другого, то загрузить изменения исходного репозитория к себе можно командой&lt;/p&gt;
&lt;p&gt;$ git pull&lt;/p&gt;
&lt;p&gt;Если вам разрешено вносить изменения в исходный репозиторий (это называется push access, предполагает договоренность с владельцем репозитория, и, в зависимости от протокола доступа (ssh или еще что-то), какие-то пароли итп), это делается командой&lt;/p&gt;
&lt;p&gt;$ git push&lt;/p&gt;
&lt;p&gt;При этом ваши изменения вливаются в репозиторий, который вы клонировали.&lt;/p&gt;
&lt;h3 id=&quot;__6&quot;&gt;Карман&lt;/h3&gt;
&lt;p&gt;Git ппредоставляет такую удобную вещь, как &quot;карман&quot; (stash). Это временное хранилище для изменений. Рассмотрим следующий простой пример. Вы начали вносить изменения в программу, но вдруг обнаружили, что забыли переключиться на свою ветку и правите чужую. Делать commit в такой ситуации бессмысленно. Тогда достаточно сделать следующее&lt;/p&gt;
&lt;p&gt;$ git stash              # спрятать изменения в карман&lt;/p&gt;
&lt;p&gt;$ git checkout my-branch # переключиться на нужную ветку&lt;/p&gt;
&lt;p&gt;$ git stash apply        # применить изменения из кармана&lt;/p&gt;
&lt;p&gt;$ git stash clear        # очистить карман&lt;/p&gt;
&lt;h3 id=&quot;__7&quot;&gt;Теги, ветки&lt;/h3&gt;
&lt;p&gt;Пометить только что созданный коммит можно командой&lt;/p&gt;
&lt;p&gt;$ git tag имя-тега&lt;/p&gt;
&lt;p&gt;Любой другой коммит помечается так:&lt;/p&gt;
&lt;p&gt;$ git tag имя-тега идентификатор-коммита&lt;/p&gt;
&lt;p&gt;Посмотреть список веток в репозитории -&lt;/p&gt;
&lt;p&gt;$ git branch&lt;/p&gt;
&lt;p&gt;(изначально создается одна ветка под названием master).&lt;/p&gt;
&lt;p&gt;Создать новую ветку -&lt;/p&gt;
&lt;p&gt;$ git branch имя-ветки&lt;/p&gt;
&lt;p&gt;или&lt;/p&gt;
&lt;p&gt;$ git branch имя-ветки идентификатор-коммита-начинающего-ветку&lt;/p&gt;
&lt;p&gt;Переключиться на вновь созданную или любую другую ветку (в рабочей копии окажутся файлы той ветки, и последующие коммиты будут заноситься в нее) -&lt;/p&gt;
&lt;p&gt;$ git checkout имя-ветки&lt;/p&gt;
&lt;p&gt;С тем же успехом этой командой можно переключиться на любой коммит - git checkout some-commit. Командой git checkout -b new-branch commit-id можно переключиться на указанный коммит и сразу создать новую ветку, начинающуюся с него.&lt;/p&gt;
&lt;p&gt;Влить изменения из другой ветки в текущую -&lt;/p&gt;
&lt;p&gt;$ git merge имя-ветки-с-которой-сливаем&lt;/p&gt;
&lt;p&gt;Можно взять из другой ветки один конкретный коммит (например, багофикс) -&lt;/p&gt;
&lt;p&gt;$ git cherry-pick идентификатор-коммита&lt;/p&gt;
&lt;h3 id=&quot;_merge_rebase&quot;&gt;Merge и Rebase&lt;/h3&gt;
&lt;p&gt;Постановка задачиКак я уже говорил, в случае распределённых VCS объединение (merge) веток - очень частая операция. Но в некоторых ситуациях этой операции оказывается недостаточно. На самом деле, merge делает следующее. Пусть у нас есть такая схема:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/files/git/merge1.png&quot; alt=&quot;merge1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;(здесь овалами обозначены коммиты; цветом я выделил коммиты в ветке yours, остальные - в ветке master). Так вот, команда git merge yours (при условии, что вы находитесь в ветке master), сделает из этой диаграммы следующее:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/files/git/merge2.png&quot; alt=&quot;merge2.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Здесь &quot;New commit&quot; - это коммит, содержащий все изменения коммитов YC1 и YC2 с предыдущей схемы. Таким образом, изменения из ветки yours будут перенесены в конец ветки master. Заметим, что это изменяет саму ветку master. В случае, когда ветка master находится в некотором &quot;главном&quot; репозитории, а ветка yours - в вашем, это означает, что объединение может выполнять только владелец главного репозитория. И ему же придётся разрешать все конфликты. Однако во многих случаях владелец главного репозитория не желает (не может) вникать во все эти конфликты. Для таких случаев предназначена команда git rebase master (находясь в ветке yours). Она сделает из первой диаграммы следующее:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/files/git/rebase.png&quot; alt=&quot;rebase.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Т.е. получится, что теперь ваша ветка будет базироваться на последнем коммите ветки master (и, таким образом, будет включать все изменения ветки master). Конечно, при такой операции тоже возможны конфликты, но разрешать их будете вы, а не владелец ветки master. Ему достаточно будет сделать git merge yours - такое объединение теперь пройдёт заведомо без конфликтов.&lt;/p&gt;
&lt;p&gt;Кроме этого, команда git rebase -i (--interactive) позволяет делать ещё многое. По этой команде откроется текстовый редактор со списком коммитов в вашей ветке. Изменяя этот список, вы можете, например, исключить некоторые коммиты из операции, или попросить подредактировать некоторые. Отсюда же можно выполнять операцию squash - когда изменения нескольких подряд идущих коммитов сливаются в один.&lt;/p&gt;
&lt;h3 id=&quot;__8&quot;&gt;Работа с удалёнными репозиториями&lt;/h3&gt;
&lt;p&gt;Как я уже многократно говорил, модель Git предполагает, что в одном проекте используется множество репозиториев. Соответственно, нужны некие инструменты для работы с другими (отличными от текущего) репозиториями. Благодаря тому, что git прозрачно поддерживает разные протоколы доступа, принципиальной разницы между репозиторием, находящимся на данном компьютере и репозиторием, находящимся где-то в интернете нет.&lt;/p&gt;
&lt;p&gt;Для работы с удалёнными репозиториями используется команда git remote с подкомандами. Команда&lt;/p&gt;
&lt;p&gt;git remote show&lt;/p&gt;
&lt;p&gt;покажет список зарегистрированных удалённых репозиториев. Если вы получили свой репозиторий командой git clone, то у вас уже есть одна запись в git remote show под названием origin - она описывает исходный репозиторий. Новые репозитории добавляются командой вида&lt;/p&gt;
&lt;p&gt;git remote add reponame ssh://host/path/to/repo.git&lt;/p&gt;
&lt;p&gt;Для обмена кодом с удалёнными репозиториями служат всё те же команды - git pull, git push, git cherry-pick. Например, после предыдущей команды команда&lt;/p&gt;
&lt;p&gt;git push reponame&lt;/p&gt;
&lt;p&gt;пошлёт все изменения в текущем репозитории в репозиторий на хосте host.&lt;/p&gt;
&lt;p&gt;Тут же следует заметить, что команду git push редко имеет смысл выполнять в направлении не-bare-репозиториев. Ведь если в репозитории есть рабочая копия, то, вероятно, в ней есть незафиксированные изменения. Изменение состояния репозитория без предварительной фиксации изменений вряд ли приведёт к чему-то хорошему. Обычно вместо того, чтобы делать git push vanya-repo, лучше позвонить этому Ване и сказать &quot;сделай, пожалуйста, pull моих изменений&quot;. А команду git push обычно выполняют в направлении репозитория на сервере, который предусмотрительно создаётся в виде bare-репозитория. Или любого другого репозитория, если заранее известно, что в нём точно не может быть никаких своих изменений.&lt;/p&gt;
&lt;h2 id=&quot;_gitosis&quot;&gt;Gitosis&lt;/h2&gt;
&lt;p&gt;Одним из следствий распределённой модели VCS является отсутствие проблемы разграничения прав доступа. У каждого разработчика есть свой репозиторий, и он имеет на него все возможные права. &quot;Главный&quot; репозиторий принадлежит главному разработчику, и главный разработчик может брать у других изменения и вносить их в свой (главный) репозиторий.&lt;/p&gt;
&lt;p&gt;Однако, во многих случаях распределённые VCS используются в централизованном режиме. В такой схеме главный репозиторий не принадлежит никому, push в него могут делать все кому положено (а не только один человек). На самом деле, эта схема оправдана только в двух случаях:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Все разработчики находятся в разных локальных сетях, за NAT-ами итп, и из-за этого не могут делать pull друг у друга; в этом случае для обмена кодом нужен отдельный сервер, видимый из всех сетей (например, в интернете);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ситуация, когда нужно организовать публичный хостинг - например, аналог github.org или gitorious.org.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В таких ситуациях нужно раздавать разные права на центральный репозиторий разным разработчикам. Сам Git не имеет никакой модели прав доступа по указанной выше причине. Однако это можно организовать с помощью отдельного ПО. Самый распространённый вариант - gitosis. Gitosis предоставляет доступ к репозиториям, расположенным на сервере (сложенным в одной директории), по протоколу ssh.&lt;/p&gt;
&lt;p&gt;Gitosis использует для хранения своей конфигурации git-репозиторий. Для авторизации используются SSH-ключи разработчиков.&lt;/p&gt;
&lt;p&gt;Для настройки gitosis нужно:
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Создать системного пользователя git, имеющего доступ ко всем репозиториям на сервере (но больше никуда);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Разрешить ему вход по ssh; я не привожу конкретных команд, как это делать - это описано в документации gitosis; Суть в том, что средствами ssh-сервера этому пользователю разрешается выполнять только очень небольшой набор команд (git push итп);&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;В репозиторий с настройками gitosis, в папку keydir, положить открытые ssh-ключи всех разработчиков, назвав файлы по шаблону &lt;a href=&quot;mailto:user@host&quot;&gt;user@host&lt;/a&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Написать конфиг для gitosis, в котором описать, какие разработчики имеют доступ к каким проектам.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример конфига:&lt;/p&gt;
&lt;p&gt;[gitosis]&lt;/p&gt;
&lt;p&gt;[group gitosis-admin]&lt;/p&gt;
&lt;p&gt;writable = gitosis-admin&lt;/p&gt;
&lt;p&gt;members = kossnocorp@kossnocorp-desktop&lt;/p&gt;
&lt;p&gt;[group octolab]&lt;/p&gt;
&lt;p&gt;writable = zfk&lt;/p&gt;
&lt;p&gt;members = kossnocorp@kossnocorp-desktop edward@amilo&lt;/p&gt;
&lt;p&gt;После этого доступ к репозиториям возможен по URL ssh://git@server.org:repo.git. Заметим, что доступ всегда выполняется под пользователем git (это тот пользователь, от имени которого работает на сервере gitosis). Разработчику совсем не обязательно иметь свою учётную запись на сервере.&lt;/p&gt;
&lt;p&gt;Презентация к докладу: &lt;a href=&quot;http://lug-mgn.ru/files/git/vcss-presentation.ps&quot; title=&quot;http://lug-mgn.ru/files/git/vcss-presentation.ps&quot;&gt;http://lug-mgn.ru/files/git/vcss-presentation.ps&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; Version 1.0&lt;/p&gt;
&lt;p&gt; Last updated 2009-11-25 01:04:21 YEKST&lt;/p&gt;
</description>
 <comments>http://old.lug-mgn.ru/articles/sistemy-kontrolya-versii-git-gitosis#comments</comments>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://old.lug-mgn.ru/crss/node/324</wfw:commentRss>
 <category domain="http://old.lug-mgn.ru/keywords/git">git</category>
 <category domain="http://old.lug-mgn.ru/keywords/gitosis">gitosis</category>
 <category domain="http://old.lug-mgn.ru/keywords/vcs">vcs</category>
 <category domain="http://old.lug-mgn.ru/keywords/doklad">доклад</category>
 <category domain="http://old.lug-mgn.ru/keywords/seminar">семинар</category>
 <pubDate>Sat, 06 Mar 2010 17:59:29 +0300</pubDate>
 <dc:creator>portnov</dc:creator>
 <guid isPermaLink="false">324 at http://old.lug-mgn.ru</guid>
</item>
</channel>
</rss>
