Автор Тема: Небольшая инструкция по самостоятельной сборке дистрибутивов на базе бранча 5.1  (Прочитано 1473 раз)

NotHAM

  • Гость
Тема выделена из https://forum.altlinux.org/index.php?topic=3321.new#new

Начинаю выкладывать небольшую инструкцию по самостоятельной сборке
дистрибутивов на базе бранча 5.1 АЛЬТ-линукс.

Основная информация по сборке дистрибутивов находится на странице вики:
http://www.altlinux.org/Mkimage/Profiles/Desktop
а также по многочисленным ссылкам с этой страницы. Год назад читать это
непосвященному пользователю было невозможно, но в последнее время ситуация
меняется  в лучшую сторону (в основном благодаря усилиям М. Шигорина).
Попытаюсь пересказать основное содержимое этой страницы на языке, понятном
продвинутому пользователю АЛЬТ-линукса.

Основные инструменты:
- бранч 5.1 (р5, сизиф - это для особо продвинутых), крайне желательно иметь
локальное зеркало, сборка через интернет - "врагу не пожелаешь", хотя и работает,
но делать что-то кроме минималки через интернет - это проще скачать готовое;
- makeimage-profiles-desktop (не пакет из бранчей-сизифа, а гит boyarch@ - комбайн
с "вертикальным взлётом и посадкой", известный как m-p-d);

Дополнительные инструменты (это уже пакеты из бранчей-сизифа):
- git;
- hasher;
- autoconf_2.60 (самой свежей версии);
- mkimage;
- установленный АЛЬТ-линукс (любой, хотя все примеры в дальнейшем буду прогонять
на antique-full (с доустановленными pidgin-mini и seamonkey):
http://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/iso/

Для создания локального зеркала (5.1) нужно иметь дополнительный раздел достаточного
размера либо большой раздел /home (чтобы всем места хватило).
Создать зеркало можно командой (в дальнейшем обновлять ей же):
$ rsync <опции> <источник> <получатель>,
 у меня это выглядит так:
rsync --timeout=6000 -avlpztc --exclude 'SRPMS' --exclude 'SRPMS.all' --exclude 'SRPMS.classic' --exclude 'i686' --exclude 'x86_64' --exclude 'x86_32' --stats --delete-after --verbose rsync.altlinux.org::ALTLinux/5.1/branch/ /mnt/sda5/mirror/ALTLinux/5.1Здесь
<источник> = rsync.altlinux.org::ALTLinux/5.1/branch/
<получатель> = /mnt/sda5/mirror/ALTLinux/5.1
остальное - опции. Зеркало занимает примерно 21 ГБ (только бинарники).
Если что-то не эксклюдить - займёт больше.

Устанавливаем git (и всё что потянет). Сразу после установки - представляемся ему:
$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email "you@yourdomain.example.com"

Устанавливаем autoconf_2.60, mkimage.

Устанавливаем hasher (и всё что потянет), добавляем пользователя:
# hasher-useradd USERЗдесь USER - это ваш логин.
Это единственный запуск хашера из под root. Перезагружаемся.

Создаём рабочие каталоги, например ~/mkiso/branch, ~/mkiso/sisyphus,
~/out (не обязательно - автоматически, здсь будут лежать "блины").
Теперь (согласно вики) нужно склонировать гит boyarch@, но мы пойдём
другим путём. Скачиваем отсюда тарбол (mkimage-profiles-desktop.tar.bz2):
http://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/
Это тот же самый клон, но по состоянию на 26.01.2010. Он как-то лучше
приспособлен к работе с бранчами (имхо). Тарбол распаковываем в каталог
~/mkiso/branch/. Там должен появиться /mkimage-profiles-desktop (гит).
Все дальнейшие примеры будут на основе этого клона. Особенно это касается
редактирования конфигов (буду указывать номера строк).
Хотя желающие могут сделать как по вики, в каталоге  ~/mkiso/sisyphus
выполнить команду:
$ git clone git://git.altlinux.org/people/boyarsh/packages/mkimage-profiles-desktop.gitТолько про расхождения номеров строк потом вопросов не задавайте.
Во всех случаях необходимо сделать резервные копии m-p-d (мало-ли что).

Для начала рекомендую ознакомиться с содежимым файлов:
.../m-p-d/Makefile.in, configure.ac, use-mk.in (их будем редактировать),
а также с содержимым .../m-p-d/profiles/pkg/lists/... Туда файлы будем добавлять.
Обратить особое внимание на файлы base.in, kernel.in, xorg.in. Редактировать не будем,
но их содержимое нужно представлять себе достаточно четко.

Продолжение следует.
« Последнее редактирование: 11.10.2017 18:13:25 от ruslandh »

NotHAM

  • Гость
Продолжение. "Первые блины".
Сначала исправим мою ошибку из предыдущего сообщения - доустановим пакет make.

Как известно, всякая сложная машина перед первой поездкой требует некоторой
подготовки. Точно так-же и комбайн "m-p-d" - подготавливаем для себя. Чтобы не
повторять некоторые ошибки других:
http://forum.altlinux.org/index.php/topic,7274.msg101496.html#msg101496
Здесь, повидимому, пользователь запустил сборку не сделав перезагрузку
после команды ...# hasher-useradd USER. Я обращал на это Ваше внимание
в предыдущем сообщении (и на вики об этом есть). Да и делать всё начал
по советам на вики, у нас будет несколько другой путь.
Ещё рекомендую глянуть тут:
http://forum.altlinux.org/index.php/topic,7274.msg101513.html#msg101513
Это не наш случай, потому игнорируем.

Подготовка:
1. Открываем в любом текстовом редакторе, умеющем показывать номера строк,
файл /mkiso/branch/m-p-d/configure.ac (вполне подходит xfce-mousepad из сборки
antique, или любой другой). Ищем в файле строки:
31    APTCONF_PACKAGE="platform5"
.....
210    APTCONF_PACKAGE="desktop"

Переменная APTCONF_PACKAGE (используется в base.in) определяет, какой пакет
будет подложен в нашу сборку для начальных настроек apt-get и синаптика.
Допустимые значения: "desktop"(5.0), "platform5"(p5), "branch"(5.1), "sisyphus".
Поскольку мы собираем на бранче 5.1 - наш выбор - "branch". Заменяем и сохраняем
файл. Наши первые сборки будут использовать строку 210, а дальше видно будет.
Для желающих - если в "m-p-d" ещё ничего не запускали (нет мусора), можно
закоммитить изменения (не обязательно):
git add . # Пробел и точка в конце команды - обязательны.
git commit -m "small changes for branch 5.1"

2. Настраиваем apt-get. Проще всего это сделать с помощью синаптика,
выбрав нужные репозитории. У меня это выглядит так (/etc/apt/sources.list):
rpm file:///mnt/sda5/mirror/ALTLinux/5.1/ i586 classic
rpm file:///mnt/sda5/mirror/ALTLinux/5.1/ noarch classic
# rpm file:///mnt/sda5/mirror/Branch5.1/ i586 hasher
# rpm file:///mnt/sda5/mirror/Branch5.1/ noarch hasher
# rpm ftp://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/Branch5.1/ i586 hasher
# rpm ftp://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/Branch5.1/ noarch hasher
Т. е. apt-get направлен на зеркало, хотя могу подключить и любые другие из списка,
всё совместимо. У кого зеркала ещё нет - просто подключите в синаптике бранч 5.1.

Ну вот. Всё готово. Поехали. В каталоге mkimage-profiles-desktop делаем:
$ autoconf # для того пакет и ставили, сейчас он сделает файл *configure
$ ./configure # пока без параметров
$ make rescue.cd
После удачного завершения сборки (надеюсь что у всех), занимает несколько
минут или примерно 150 МБ трафика, сразу же делаем (обязательно!):
$ make distcleanДело в том, что "комбайн" в процессе работы создаёт в m-p-d в подкаталогах
несколько рабочих каталогов, нужных только ему, в т. ч. хашерниц, с которыми
он умеет обращаться гораздо лучше нас, и после работы там остаётся очень много
мусора (до нескольких ГБ - в основном распакованные пакеты). Нужно подчищать за ним.

Теперь идём в каталог /out/desktop/ и смотрим на наше творение altlinux-5.0...rescue.cd.iso,
размером примерно 112 МБ. Между прочим вполне рабочий. Можете проверить.
Только вот с версией что-то не то, нам нужна 5.1.

Исправляем свой недочет: опять идём в /mkimage-profiles-desktop  и делаем:
$ ./configure --with-version=5.1
$ make minimal.cd
.... несколько минут или примерно 400 МБ трафика.
$ make distclean
Опять идём в /out/desktop/ и опять смотрим altlinux-5.1-...install.cd.iso
размером примерно 260 МБ, и тоже рабочая, урезанная минималка (без синаптика).

Проверим, правильно ли мы выбрали значение APTCONF_PACKAGE, для этого заныриваем
с помощью mc в iso-образ (у кого не antique - проверьте, установлен ли пакет
cdrkit-utils, если нет - доустановите), там идём в каталог /ALTLinux/RPMS.main
и ищем пакет apt-conf-branch-5.1.1..., если есть - всё сделано правильно.

Домашнее задание: сделать самим сборку М. Шигорина с KDE3.
Подсказка: (version=5.1 make kde3.cd), кто забудет distclean - тому незачёт.

Продолжение следует.
« Последнее редактирование: 08.06.2010 04:25:26 от NotHAM »

NotHAM

  • Гость
Продолжение: "А как свой?"
Сначала сохраним где нибудь собранную ранее урезанную минималку,
она скоро понадобится для сравнения.
Далее читаем вики, начиная с фразы "А как свой?". Там много полезного.

Открываем в редакторе с нумерацией строк файл /mkiso/branch/m-p-d/Makefile.in
и в промежутке между строками (45)slinux.cd и (47)minimal.cd вписываем
следующее (кроме строк 45 и 49):
(45)slinux.cd: | use-slinux use-gdm install2 main install-cd.@IMAGETYPE@
(46)# ***********************************************************************
(47)console.cd: | install2 main rescue install-cd.@IMAGETYPE@
(48)# ***********************************************************************
(49)minimal.cd: | use-icewm use-xdm install2 main install-cd.@IMAGETYPE@

Номера строк проставит редактор (вписывать не нужно). На вики, то что мы сделали,
называется "крупноблочная" настройка. По сравнению с minimal - мы удалили
"крупный" блок icewm, с содержимым можно ознакомиться в /m-p-d/profiles/pkg/lists/
файл icewm (hi!), удалили блок xdm (в данном случае это просто пакет) и
добавили блок rescue (действительно крупный). Теперь в каталоге /m-p-d делаем
$ ./configure --with-version=5.1
$ make console.cd
...
$ make distclean

Идём в каталог /out/desktop/ и смотрим результат. Там лежит образ консольной
сборки, которую многие знают и пробовали, но опять под названием desktop, как
и предыдущая сборка. Это происходит потому, что при запуске ./configure мы не
использовали параметр --with-distro=..., т. к. пока не знаем, что тут написать
(Файл configure.ac мы ещё толком не правили, попозже поправим). Это не страшно,
т. к. сборка полностью рабочая и переименовать несложно.
Теперь "заныриваем" с помощью mc в свежий блин, а другой панелью - во вчерашний,
и начинаем сравнивать. В корне образов сразу видны отличия, если во вчерашнем
есть крупный блок altinst (81М), то в сегодняшнем добавился блок rescue (95 M).
Далее в /ALTLinux/RPMS.main смотрим - в сегодняшнем отсутствуют большинство
шрифтов, ndiswrapper, ну и ещё кое-что, что предусмотрено в файле xorg.in (я не
просто так просил обратить внимание на файлы base.in, kernel.in, xorg.in. в самом
начале). Делаем вывод - xorg.in в сегодняшнюю сборку попал лишь частично - только
то, что притянулось по зависимостям инсталлером. Кто на это повлиял? В Makefile.in
про xorg нет ни слова (можете не искать).
Значит "крупноблочная" коррекция может иногда и напакостить (но не в этом случае),
поэтому требуется вникать в более "более тонкую" настройку (use.mk.in).
Открываем в редакторе (с нумерацией строк конечно) файл use.mk.in и начинаем
искать:
...
(39) $(DESKTOP_TARGETS): | $(AUTOCFG) use-xorg
...
(44) use-xorg:
(45)        echo GLOBAL_BASE_PACKAGE_LISTS+='xorg' >> "$(call scfg,main)"
...
(107) use-desktop: use-xorg use-alterator-desktop
...
Мда..., ну и который из них наш? Оказывается самый первый (39), но там есть
какой-то $(DESKTOP_TARGETS), про который в строке (35) написано:
(35) DESKTOP_TARGETS = $(DE_TARGETS) $(WM_TARGETS) $(FEATURE_TARGETS)

Уже легче, в строках 17-22 есть про WM_TARGETS. Всё понятно, убрав из
строки в Makefile.in "use-xdm", мы тем самым оторвали подключение к сборке
файла xorg (по зависимостям что-то притянулось, но не всё).

Цитата с вики:
Цитировать
"Чем более краткими, ясными, устойчивыми к изменениям являются его составляющие — тем удобней браться за разработку или продолжать её через год.
Чем более запутанными и неявно взаимосвязанными они остаются — тем больше времени приходится сперва тратить на отслеживание, кто куда зачем пошёл и надо ли это ещё."

Что-то я не пойму - это "ясность" или "запутанность", и что делает ndiswrapper
в файле xorg.in, они что - жить друг без друга не могут?   :D

Ну да ладно. Другого комбайна всё равно нет, а этот работает. Причем хорошо.
Иногда. Вот сегодня сборка получилась со 2-го раза, первый раз обломалась
с ошибкой: find не смог найти "find" (бывает). Закрыл seamonkey (2 экз.),
закрыл оба текстовых редактора, закрыл один из терминалов и отключил погремушку
(gkrellm-монитор). Оставил один терминал urxvt. После этого всё собралось.
Имейте в виду, если что.

Домашнее задание: Будем делать слегка продвинутую минималку с WindowMaker-ом, и с
wdm конечно. Xorg по понятной причине, должен отвалиться (см. строки 17-22 в use.mk.in).
Потому придётся настраивать "крупноблочно", "более тонко" и "совсем тонко" (вики).
Всем заготовить файл WM-mini и положить в /m-p-d/profiles/pkg/lists/...Будем настраивать.
В качестве образца можно использовать файл icewm, который там уже есть.

NotHAM

  • Гость
"А как свой?" - Продолжение.
А так: "крупноблочно", "более тонко" и "совсем тонко". Как на вики сказано.

Сначала делаем WM-mini.

1. "крупноблочно".
В файл /mkiso/branch/m-p-d/Makefile.in добавляем строки (48-49):
46 # ***********************************************************************
47 console.cd: | install2 main rescue install-cd.@IMAGETYPE@
48 WM-mini.cd: | use-WM-mini use-wdm install2 main install-cd.@IMAGETYPE@
49 #icewm-mini.cd: | use-icewm-mini use-xdm install2 main install-cd.@IMAGETYPE@
50 # ***********************************************************************
Строку (49) пока оставляем закомментированой. Надеюсь что здесь уже всё понятно.

2. "более тонко".
В файл /mkiso/branch/m-p-d/use.mk.in добавляем строку (21), об этом было в
прошлый раз и тоже понятно (чтобы xorg не отвалился).
17 WM_TARGETS = \
18 use-fvwm \
19 use-icewm \
20 use-wmaker \
21 use-wdm \
22 use-xdm \
23 use-gdm
Всё? - конечно нет. Комбайн - он слегка туповатый и не знает, что значит use-wdm,
потому будем обучать. А как? А так-же как он обучен использовать use-xdm. Ищем.
50 use-xdm:
51 echo GLOBAL_BASE_PACKAGES+='xdm' >> "$(call scfg,main)"
52 # TODO: tune it as well, see live/image-scripts.d/05xdm
53 $(call done,$@)
Оказывается всё довольно просто, осталось добавить нужные строки, но сначала
посмотрим, куда нас отсылает строка (52) /m-p-d/profiles/live/image-scripts.d/05xdm,
Там этот скриптик называется чуть по другому, но понять можно. Читаем, и, к изумлению
обнаруживаем, что он приделывает кнопки к нашему xdm, а мы голову ломали, в интернете
искали, а в комбайне это уже предусмотрено на будущее ..., да и дизайн там уже
заложен, ну дела ... (Правда это всё для live.cd, но почитать можно).
Добавляем строки:
55 use-wdm:
56 echo GLOBAL_BASE_PACKAGES+='wdm' >> "$(call scfg,main)"
57 $(call done,$@)
Строки 56-57 теперь подсунут в нашу сборку wdm, а строка 21, совместно с бывшими
35, 39, 45 (теперь номера поменялись) подсунут xorg. Всё просто.

3. "совсем тонко".
Ну а тут совсем просто (именно тут и определяется основной состав сборки).
Открываем в редакторе заготовленный файл /m-p-d/profiles/pkg/lists/WM-mini
(однострочный) и добавляем всё, что нужно для минималки.
# WindowMaker
WindowMaker

#synaptic
synaptic
synaptic-usermode

#alterator
alterator-browser-qt
alterator-standalone
alterator-xkb
alterator-mkbootflash
alterator-net-pppoe
alterator-net-pptp
alterator-net-openvpn
alterator-nsswitch
#alterator-packages
#alterator-pkg
alterator-profile
alterator-proxy

# for system
sound-scripts
hal-laptop
dbus-tools
dbus-tools-gui
cdrkit-utils
Тут, самое главное, не наделать опечаток, иначе сборка обломается и долго
потом искать будете, почему. Имена пакетов должны быть написаны строго так,
как в бранче (как их синаптик видит). Иначе apt-get их не найдёт.

Теперь делаем icewm-mini (многим известная минималка).

1. "крупноблочно".
В файле /mkiso/branch/m-p-d/Makefile.in раскомментируем строку (49).

2. "более тонко".
Ничего не делаем, всё уже сделано до нас.

3. "совсем тонко".
Делаем копию файла WM-mini, переименовываем в icewm-mini, WindowMaker
в тексте заменяем на icewm и закидываем файл в /m-p-d/profiles/pkg/lists/.

Всё готово. Собираем свои поделки.
$ ./configure --with-version=5.1
$ make WM-mini.cd
...
$ make distclean
Переименовываем результат в ...WM-mini...iso (достал уже этот desktop).
Второй раз запускать ./configure не обязятельно (файлы ***.in не изменяли).
$ make icewm-mini.cd
...
$ make distclean
И опять ...desktop... (переименовываем), мы с ним ещё разберёмся.

Сравниваем исошки, видим, что с icewm получилась поменьше, потому
её в основном и собирал. Проверить комплектацию xorg очень просто,
заныриваем в образ (mc) и смотрим наличие шрифтов из xorg.in.
Шрифты все есть, значит всё сделали правильно (подключился весь).

Домашнее задание. Изучить файл /mkiso/branch/m-p-d/configure.ac
на предмет использования разных --with...=, у нас desktop получается
вблизи от строки (210), но редактировать будем совсем в другом месте.
Следующий раз будем собирать antique (base и full). Всем взять профили
http://forum.altlinux.org/index.php/topic,6091.msg102014.html#msg102014
(во вложении), переименовать как нужно (без .txt).
Приготовить для закидывания в /m-p-d/profiles/pkg/lists/

NotHAM

  • Гость

"А как свой?" - окончание.

Сначала попытаемся решить проблему с надоедливым "desktop". На самом деле
параметр --with-distro может принимать множество всевозможных значений,
в файле configure.ac это хорошо видно в операторе case, который начинается
в строке (32) и тянется до строки (195). Там есть заготовки для всех Альтовских
дистров "...на каждый чих отдела маркетинга..." (ц) Вики WhiteLabel. Даже
для произвольного distro что-то предусмотрено.
Только вот незадача. Если запустить сборку с произвольным distro, она обломается
с ошибкой "cannot find package doc", пойдём искать почему:
189     *)
190 BRANDING=${with_branding:-"altlinux-desktop"}
191 INSTALLER=${with_installer:-"desktop"}
192 DOCS="$with_docs"
193 LABEL="Desktop"
194 DEFAULT_ISO="kde.dvd";;

А всё потому, что в строке (192) DOCS должно получить какое-то значение, а
получает какую-то фигню, которую apt-get не может потом найти. Кстати для
варианта custom* (стр. 182 - ситуация аналогичная, да и в свежем клоне гита
boyarch@ всё то-же самое, только номера строк другие). Наверное никто не чихнул??
Щас поправим (подсмотрим в строке 168 и сделаем так-же):
192 DOCS=${with_docs:-"desktop"}Теперь быстренько проверим (сначала сохранив файл):
$ autoconf # файл *configure нужно перегенерить, configure.ac изменился!
$ ./configure --with-version=5.1 --with-distro=icewm-mini
$ make icewm-mini.cd
...
$ make distclean

И бегом в ~/out/desktop ... хм, а теперь там есть каталог /out/icewm-mini, в
котором лежит altlinux-5.1-...-icewm-mini-...iso, заработало что-ли?
Проверим ещё раз (с другим distro):
$ ./configure --with-version=5.1 --with-distro=icewm
$ make icewm-mini.cd
...
$ make distclean
Точно. Заработало. Для нашей цели вполне сойдёт. На строку (194) уже можно
и не смотреть. Комбайн нас правильно понял и всё сделал как заказывали.
Оказывается, что не такой уж он и тупой.

Для справки- теперь APTCONF_PACKAGE использует значение из строки (31) а не (210),
не зря мы её в самом начале исправили.

Начинаем собирать antique.
А что тут собирать-то, уже всё просто и понятно.

1. "крупноблочно".
Как обычно - добавляем пару строк в главный Makefile.in (50-51):
46 # ***********************************************************************
47 console.cd: | install2 main rescue install-cd.@IMAGETYPE@
48 WM-mini.cd: | use-WM-mini use-wdm install2 main install-cd.@IMAGETYPE@
49 icewm-mini.cd: | use-icewm-mini use-xdm install2 main install-cd.@IMAGETYPE@
50 antique-full.cd: | use-antique-base disk-antique-disk use-xdm install2 main rescue install-cd.@IMAGETYPE@
51 antique-base.cd: | use-antique-base use-xdm install2 main install-cd.@IMAGETYPE@
52 # ***********************************************************************

Тут появилось всего одно незнакомое слово "disk-...", что оно означает
смотрим в файле use.mk.in:
78 # put on first disk, but don't install by default
79 disk-%::
80 echo GLOBAL_DISK_PACKAGE_LISTS+='$(subst disk-,,$@)' >> "$(call scfg,main)"
81 @echo "*** added $(subst disk-,,$@) to main" >&2
Если что-то непонятно открываем словарь stardict и переводим строку (78)

2. "более тонко".
Ничего не делаем, всё уже сделано.

3. "совсем тонко".
Переименовываем скачанные профили (ссылка выше) в antique-base и antique-disk,
подправляем ***-disk (комметируем 2 строки, иначе сборка обломается):
#WindowMaker -base
#wmsystemtray -base
Apt-get увидит лишние слова в конце строки, и не сможет найти пакеты.

Закидываем оба файла в /m-p-d/profiles/pkg/lists/...

Настраиваем apt-get  (/etc/apt/sources.list):
rpm file:///mnt/sda5/mirror/ALTLinux/5.1/ i586 classic
rpm file:///mnt/sda5/mirror/ALTLinux/5.1/ noarch classic
rpm ftp://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/Branch5.1/ i586 hasher
rpm ftp://ftp.linux.kiev.ua/pub/Linux/ALT/people/_anatoly/packages/Branch5.1/ noarch hasher
У меня одновременно подключены - бранч 5.1 (зеркало) и киевский бранч (они совместимы).
И делаем (в каталоге .../m-p-d/...):
$ ./configure --with-version=5.1 --with-distro=antique-base
$ make antique-base.cd
...
$ make distclean
...
$ ./configure --with-version=5.1 --with-distro=antique-full
$ make antique-full.cd
...
$ make distclean
Вот и всё. Всё собралось и всё работает. И названия у исошек правильные.

Общее пожелание: Делайте локальное зеркало. Интернет - штука дорогая и
бывают обломы, как правило - в конце сборки (когда трафик уже использован).

ЗЫ. Всем удачи в дистростроительстве. И почаще заглядывайте на вики.
Там много полезного есть (если поискать хорошенько).

kostyalamer

  • Гость
Анатолий спасибо ! Надо бы твой учебник в отдельную тему выделить из минимала и прибить гвоздем .
Ну и на wiki продублировать конечно. Если хочешь можешь еще его у меня на сайте повесить. В общем, очень полезный и хорошо написанный материал  :)

NotHAM

  • Гость
Анатолий спасибо ! Надо бы твой учебник в отдельную тему выделить из минимала и прибить гвоздем .
Ну и на wiki продублировать конечно. Если хочешь можешь еще его у меня на сайте повесить. В общем, очень полезный и хорошо написанный материал  :)

Это не учебник, а небольшое пособие в том виде, в котором я хотел-бы его почитать год
незад, когда начинал это дело.
Прибить - это пусть модераторы решают.
Для вики это не годится, стиль не тот. Да и достаточно там информации.
А у себя можешь и сам повесить, со ссылкой сюда конечно (GPL-2, 3 etc.)