Использование UNIX : Часть 12. Проекты «Сделай сам»

Сборка ПО из исходных текстов

Если в UNIX®-системе недостает какой-либо нужной вам утилиты, то с большой долей вероятности подходящее решение можно найти в огромном море программ в интернете. В этой статье объясняется, как компилировать программы из исходных кодов.

Мартин Стрейчер (Martin Streicher), независимый web-разработчик, WSO2 Inc

Мартин Стрейчер (Martin Streicher) (Jeff J. Li) - фотографияМартин Стрейчер (Martin Streicher) - независимый web-разработчик и бывший главный редактор Linux Magazine. Он имеет степень магистра компьютерных наук Университета Пардью (Purdue University) и занимается программированием в UNIX-подобных операционных системах с 1986 года. Он коллекционирует предметы искусства и игрушки.


developerWorks Contributing author
        level

18.05.2009

В системах

UNIX® имеются сотни утилит, или команд. Некоторые команды управляют файловой системой, другие опрашивают саму операционную систему и управляют ею. Большое число команд обеспечивают возможности сетевых подключений, а еще большее число команд могут создавать данные, менять их порядок, модифицировать, фильтровать и анализировать. Учитывая долгую и богатую историю UNIX, высока вероятность того, что в системе уже имеется под рукой подходящая утилита как раз для возникшей задачи

Более того, если ни одна утилита вас не устраивает, можно объединить любое число утилит UNIX различными способами и создать свой собственный инструмент. Как мы уже убедились ранее, можно эффективно использовать каналы, перенаправления и условные операторы для создания импровизированного инструмента тут же в командной строке, а скрипты командной оболочки сочетают мощь небольшого, легкого в изучении языка программирования с командами UNIX, что позволяет создать инструмент, который можно использовать вновь и вновь.

Конечно, бывают случаи, когда ни командная строка, ни скрипт не подходят. Например, если необходимо применить новый демон для работы нового сетевого сервиса, то можно перейти на настоящий язык, например, C или Python, и написать собственное приложение. И, поскольку большое количество приложений свободно доступны в интернете—«свободно» означает, что они бесплатные и/или лицензируются на либеральных условиях —можно скачать, скомпилировать и установить подходящее, работающее решение, удовлетворяющее нужным требованиям.

Многие версии UNIX (и Linux®) предоставляют специальную утилиту, называемую менеджер пакетов (package manager), предназначенную для добавления, удаления и обслуживания программного обеспечения в системе. Менеджер пакетов как правило ведет инвентаризацию всего программного обеспечения, установленного локально, а также каталог всего программного обеспечения, имеющегося на одном или нескольких удаленных репозиториях. С помощью менеджера пакетов можно искать в репозиториях нужные программы. Если в репозитории имеется то, что нужно, потребуется всего одна команда или несколько щелчков мышкой, чтобы установить новый пакет в систему.

Менеджер пакетов неоценим. С его помощью можно удалять пакеты целиком, обновлять существующие пакеты и автоматически обнаруживать и выполнять необходимые предварительные условия для установки любого пакета. Например, если нужна программа для обработки изображений, такая, например, как старый, верный ImageMagick, а в системе отсутствует библиотека для поддержки JPEG-изображений, менеджер пакетов обнаружит и установит то, чего не хватает, перед тем как установить нужный пакет.

Тем не менее бывают случаи, когда нужное программное обеспечение имеется, но (пока) не содержится ни в одном репозитории. Принимая во внимание доминирующий приоритет пакетного менеджера, большинство программ поставляется собранными в виде пакетов, которые загружаются и устанавливаются с его помощью. Однако поскольку имеется множество версий и разновидностей UNIX, трудно сделать доступным любое приложение в любом пакетном формате для любого конкретного варианта. Если используемая версия UNIX является одной из основных и популярных, с многочисленным сообществом пользователей, то увеличивается вероятность того, что удастся найти скомпилированное и готовое к использованию программное обеспечение. В противном случае время закатать рукава и приготовиться собирать программы самостоятельно.

Да, молодой джедаи, настало время воспользоваться исходным кодом.

Подобно старту звездного истребителя из болота, сборка программного обеспечения из исходных текстов может поначалу напугать, особенно если вы не программист. Но на самом деле на весь процесс в большинстве случаев требуется лишь ввести несколько команд, а все остальное делается автоматически.

Следует отметить, что некоторые программы сложно компилировать—либо на их сборку требуются часы—либо требуется ручное вмешательство во время процесса компиляции. Однако даже эти программы обычно составлены из небольших частей, скомпилировать которые совсем несложно. Усложняют процесс сборки множество зависимостей и последовательность сборки. У многих программ имеется множество опций, которые могут быть не нужны пользователю. Например, можно собрать PHP с поддержкой протокола IPv6, однако если сеть еще не поддерживает IPv6, то нет необходимости включать эту функцию. Проверка множества параметров исходных данных добавляет трудности в процесс сборки.

В этой статье нам предстоит рассмотреть, как собрать стандартное приложение UNIX. Прежде чем продолжить, нужно убедиться, что в системе имеется компилятор C , например, GCC (GNU Compiler Collection), и набор стандартных UNIX-утилит разработчика, в том числе make, m4, pkg-config и awk. Также нужно убедиться, что все инструменты разработчика доступны через переменную окружения PATH.

Хорошие вещи приходят в пакетах программного обеспечения

В качестве примера мы сконфигурируем, скомпилируем и установим SQLite—небольшую библиотеку, реализующую механизм базы данных, которая использует SQL (Structured Query Language—структурированный язык запросов). Для использования SQLite не требуется настройка, и она может быть целиком встроена в любое приложение, а все базы данных содержатся в одном файле. Для хранения данных можно вызывать SQLite с помощью многих языков программирования. SQLite также содержит утилиту для командной строки с удачным названием sqlite3 для управления базами данных на SQLite.

Для начала нужно загрузить SQLite (см. Ресурсы). Выбираем самый последний пакет исходных текстов и скачиваем его. (На момент написания этой статьи самой последней версией SQLite была 3.3.17, выпущенная 25 апреля 2007 года.) В этом примере используется файл, находящийся по адресу http://www.sqlite.org/sqlite-3.3.17.tar.gz.

Получив файл, нужно распаковать его. Расширение .tar.gz показывает, как был создан архив. В данном случае это архив tar, сжатый с помощью gzip. Последнее расширение, .gz, означает gzip (сжатие); первое расширение, .tar, говорит о tar (формат архива). Для извлечения содержимого архива нужно просто обработать файл в обратном порядке—сначала извлечь файл, а затем открыть архив:

$ gunzip sqlite-3.3.17.tar.gz
$ tar xvf sqlite-3.3.17.tar

Эти две команды создают точную копию первоначального исходного текста в новом каталоге с именем sqlite-3.3.17. Между прочим, формат .tar.gz довольно распространен (он называется архив тар), и его можно распаковать, используя команду тар:

$ tar xzvf sqlite-3.3.17.tar.gz

Одна эта команда эквивалентна двум предыдущим командам.

Затем переходим в каталог sqlite-3.3.17 и используем команду ls для получения списка содержимого. Вывод этой команды должен быть аналогичен выводу в листинге 1.

Листинг 1. Список файлов пакета SQLite
$ ls
Makefile.in             contrib                 publish.sh
Makefile.linux-gcc      doc                     spec.template
README                  ext                     sqlite.pc.in
VERSION                 install-sh              sqlite3.1
aclocal.m4              ltmain.sh               sqlite3.pc.in
addopcodes.awk          main.mk                 src
art                     mkdll.sh                tclinstaller.tcl
config.guess            mkopcodec.awk           test
config.sub              mkopcodeh.awk           tool
configure               mkso.sh                 www
configure.ac            notes

Исходный текст и дополнительные файлы для SQLite хорошо организованы и представляют образец того, как большинство программных проектов распространяют исходные тексты:

  • В файле README описывается сама программа и обычно объясняется, как её собрать. (В файле README приводятся также сведения об условиях использования или о лицензии. Значительное число проектов лицензируют программу в соответствии с условиями GNU Public License версии 2—так называемая лицензия "copyleft"
  • В каталоге src находится исходный текст программы.
  • В каталоге test содержится набор тестов для проверки правильности работы программы после первоначальной сборки или после любого изменения.
  • В каталоге contrib содержатся дополнительные программы, которые созданы не основной командой разработчиков SQLite, а другими программистами. Для такой библиотеки как SQLite каталог contrib может содержать программные интерфейсы для таких популярных языков как C, Perl, PHP и Python. В нем могут быть также оболочки для графического пользовательского интерфейса (GUI) и многое другое.
  • В числе других файлов файлы Makefile.in, configure, configure.ac и aclocal.m4 используются для создания скриптов и правил для сборки SQLite на конкретной разновидности UNIX. Если программа достаточно простая, то для сборки может потребоваться лишь короткая команда компиляции. Но поскольку существует так много разновидностей UNIX—Mac OS X, Solaris, Linux, IBM® AIX®, а также HP/UX, среди прочих,—то необходимо изучить хост-машину, чтобы определить ее возможности и аппаратное исполнение. Например, приложение для чтения почты может попытаться определить, каким образом местная система хранит почтовые ящики, и включить поддержку этого формата.

Сосредоточиться. Сосредоточиться. Почувствовать в себе движение источника.

Следующий шаг состоит в том, чтобы изучить систему и настроить программное обеспечение так, чтобы оно правильно скомпилировалось. (Можно представить себе этот шаг как шитье костюма: предмет одежды уже во многом правильного размера, но нуждается в некотором изменении для подгонки с точки зрения стиля). Настраивает и подготавливает к сборке локальный скрипт ./configure . В командной строке набираем:

$ ./configure

Configure проводит ряд тестов, чтобы классифицировать систему. Например, запуск ./configure на компьютере Apple MacBook (на котором работает один из вариантов FreeBSD® UNIX) выдает следующее ( листинг 2):

Листинг 2. Результат запуска ./configure на Mac OS X
checking build system type... i386-apple-darwin8.9.1
checking host system type... i386-apple-darwin8.9.1
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for a sed that does not truncate output... /usr/bin/sed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for ld used by gcc... /usr/bin/ld
...

Здесь ./configure определяет тип системы, на которой делается сборка и для запуска на которой предназначается исполняемый код (параметры могут различаться, если выполняется кросс-компиляция), подтверждает, что компилятор GNU C (GCC) установлен и находит пути к утилитам, которые могут потребоваться в остальной части процесса сборки. Если просмотреть остальную часть вывода configure, то можно увидеть длинный список проверок, характеризующий систему в тех пределах, которые понадобятся для успешной сборки SQLite.

Примечание. Команда ./configureможет завершиться ошибкой, особенно если необходимое условие для сборки (например, системная библиотека или важная системная утилита) отсутствует.

Нужно просмотреть вывод ./configure и проверить, нет ли в нем аномалий, например, специализированных или локальных версий команд, которые нельзя применять при сборке такого стандартного приложения как SQLite. Например, если системный администратор установил альфа-версию GCC и configure предпочитает использовать ее, то может потребоваться вручную сделать выбор. Чтобы увидеть список (зачастую длинный) параметров, которые можно изменить, нужно ввести ./configure --help, как показано в листинге 3:

Листинг 3. Параметры общего назначения для скрипта ./configure
$ ./configure --help
...
По умолчанию, `make install' установит все файлы в
`/usr/local/bin', `/usr/local/lib' и т.д. Можно указать другой
префикс для установки вместо `/usr/local' с помощью `--prefix',
например, `--prefix=$HOME'.

Более точное управление можно получить с помощью приведенных ниже параметров.

Точное задание каталогов для установки:
  --bindir=DIR           исполняемые файлы пользователя [EPREFIX/bin]
  --sbindir=DIR          исполняемые файлы системного администратора [EPREFIX/sbin]
  --libexecdir=DIR       исполняемые файлы программы [EPREFIX/libexec]
...

Вывод ./configure --help содержит параметры общего назначения, используемые для системы настройки, и специфические параметры, имеющие отношение только к собираемому программному обеспечению. Чтобы ознакомиться с последним (более коротким) списком, нужно ввести ./configure --help=short ( листинг 4):

Листинг 4. Относящиеся к пакетам параметры для компилируемого ПО
$ ./configure --help=short
Опции:
  --disable-FEATURE       не включать FEATURE (то же, что и --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  включить FEATURE [ARG=yes]
  --enable-shared[=PKGS]  создать разделяемые библиотеки [default=yes]
  --enable-static[=PKGS]  создать статические библиотеки [default=yes]
  --enable-fast-install[=PKGS]
                          оптимизировать для быстрой установки [default=yes]
  --disable-libtool-lock  избежать блокировки (может нарушить параллельные сборки)
  --enable-threadsafe     поддержка операций с потоками
  --enable-cross-thread-connections
                          разрешить соединение, разделяемое между потоками
  --enable-threads-override-locks
                          потоки могут отменять блокировки друг друга
  --enable-releasemode    поддерживать связывание libtool в режиме версий
  --enable-tempstore      использовать базу данных в памяти для временных таблиц 
  (never,no,yes,always)
  --disable-tcl           не создавать TCL-расширения
  --disable-readline      отключить поддержку readline [default=detect]
  --enable-debug          включить отладку и подробные разъяснения

Вернёмся к ./configure --help. Вывод команды в самом верху показывает, что каталогом установки для исполняемых файлов по умолчанию является /usr/local/bin, каталогом установки библиотек по умолчанию—/usr/local/lib, и так далее. Во многих системах используются альтернативные структуры каталогов для хранения не основного программного обеспечения.

Например, многие системные администраторы предпочитают использовать /opt вместо /usr/local в качестве места для локально установленного или локально измененного программного обеспечения. Если вам нужно установить SQLite не в стандартный каталог, его нужно указать с помощью параметра --prefix=. Ещё один возможный вариант (и это общепринятый подход, если пользователь—единственный, кто использует пакет, или у него нет прав администратора на установку программного обеспечения глобально)—установить программу в собственной структуре каталогов в домашнем каталоге:

$ ./configure --prefix=$HOME/sw

При использовании этой команды во время установки создается структура каталогов программного обеспечения в каталоге $HOME/sw, как, например, $HOME/sw/bin, $HOME/sw/lib, $HOME/sw/etc, $HOME/sw/man и другие, если понадобится. Для простоты в нашем примере программа устанавливается в каталоги по умолчанию.

Компиляция программы

Результатом работы ./configure является файл Makefile, совместимый с конкретной версией UNIX. Утилита для разработки, называемая make, использует Makefile для выполнения шагов, требуемых для компилирования и связывания файлов программы и получения исполняемого файла. Makefile можно открыть и просмотреть, но не стоит его редактировать, потому что все произведенные изменения будут замечены во время повторного запуска ./configure.

Makefile содержит список исходных файлов для компиляции, а также константы, которые включают, либо исключают и выбирают определенные фрагменты исходного текста в пакете SQLite. Например, может быть включена часть исходного текста, специфичная для 64-разрядных процессоров, если configure обнаружил в системе такую микросхему. Makefile содержит также зависимости между исходными файлами, поэтому изменение в важном заголовочном (.h) файле может вызвать перекомпиляцию всех исходных файлов на C .

Следующий шаг—запуск make для сборки программы (листинг 5).

Листинг 5. Запуск make
$ make 
sed -e s/--VERS--/3.3.17/ ./src/sqlite.h.in | \
  sed -e s/--VERSION-NUMBER--/3003017/ >sqlite3.h

gcc -g -O2 -o lemon ./tool/lemon.c

cp ./tool/lempar.c .

cp ./src/parse.y .

./lemon  parse.y

mv parse.h parse.h.temp

awk -f ./addopcodes.awk parse.h.temp >parse.h

cat parse.h ./src/vdbe.c | awk -f ./mkopcodeh.awk >opcodes.h

./libtool --mode=compile --tag=CC gcc -g -O2 -I. -I./src \
  -DNDEBUG  -I/System/Lib rary/Frameworks/Tcl.framework/Versions/8.4/Headers \
  -DTHREADSAFE=0 -DSQLITE_THREA D_OVERRIDE_LOCK=-1 \
  -DSQLITE_OMIT_LOAD_EXTENSION=1 -c ./src/alter.c

mkdir .libs

gcc -g -O2 -I. -I./src -DNDEBUG \
  -I/System/Library/Frameworks/Tcl.framework/Vers ions/8.4/Headers \
  -DTHREADSAFE=0 -DSQLITE_THREAD_OVERRIDE_LOCK=-1 \
  -DSQLITE_OMIT_L OAD_EXTENSION=1 -c ./src/alter.c  -fno-common \
  -DPIC -o .libs/alter.o
...
ranlib .libs/libtclsqlite3.a
creating libtclsqlite3.la

Примечание. В приведенном выше выводе пустые строки были добавлены для выделения каждого шага, начинаемого make.

Утилита make проверяет даты изменения файлов—заголовочных файлов, исходного кода программ, файлов с данными и объектных файлов—и компилирует соответствующие исходные файлы на C. В самом начале make компилирует все, потому что нет ни объектных, ни целевых файлов. Как можно видеть, правила для создания целевых файлов также включают и промежуточные шаги, в которых используются такие инструменты как sed и awkдля создания заголовочных файлов, использующихся в последующих шагах.

Результатом работы команды make являются законченная библиотека и утилита sqlite3.

Хотя это не обязательно, но полезно будет протестировать только что собранную программу. Даже если ПО успешно собирается, это не обязательно означает, что ПО правильно работает.

Для проверки программного обеспечения нужно опять запустить make с параметром test (листинг 6).

Листинг 6. Тестирование программного обеспечения
$ make test
...
alter-1.1... Ok
alter-1.2... Ok
alter-1.3... Ok
alter-1.3.1... Ok
alter-1.4... Ok
...
Thread-specific data deallocated properly
0 errors out of 28093 tests
Failures on these tests:

Ура! Программа прекрасно собрана и работает правильно. Если один или больше тестов завершатся ошибкой, в итоговом отчете внизу (в данном случае он пустой) будет сказано, какой из тестов требует рассмотрения.

Окончательный продукт

Если программное обеспечение работает правильно, то в качестве последнего шага его нужно установить в системе. Снова нужно воспользоваться make, но с параметром install. Для установки программного обеспечения в /usr/local обычно требуются права суперпользователя (рута), что обеспечивается программой sudo (листинг 7).

Листинг 7. Установка программного обеспечения в локальной системе
$ sudo make install 
tclsh ./tclinstaller.tcl 3.3
/usr/bin/install -c -d /usr/local/lib
./libtool --mode=install /usr/bin/install 
    -c libsqlite3.la /usr/local/lib /usr/bin/install 
    -c .libs/libsqlite3.0.8.6.dylib /usr/local/lib/libsqlite3.0.8.6 .dylib
...
/usr/bin/install -c .libs/libsqlite3.lai /usr/local/lib/libsqlite3.la
/usr/bin/install -c .libs/libsqlite3.a /usr/local/lib/libsqlite3.a
chmod 644 /usr/local/lib/libsqlite3.a
ranlib /usr/local/lib/libsqlite3.a
...
/usr/bin/install -c -d /usr/local/bin
./libtool --mode=install /usr/bin/install -c sqlite3 /usr/local/bin
/usr/bin/install -c .libs/sqlite3 /usr/local/bin/sqlite3
/usr/bin/install -c -d /usr/local/include
/usr/bin/install -c -m 0644 sqlite3.h /usr/local/include
/usr/bin/install -c -m 0644 ./src/sqlite3ext.h /usr/local/include
/usr/bin/install -c -d /usr/local/lib/pkgconfig; 
/usr/bin/install -c -m 0644 sqlite3.pc /usr/local/lib/pkgconfig;

Процесс make install создает необходимые каталоги (если их нет), копирует файлы в каталоги назначения, и запускает ranlib для подготовки библиотеки к использованию приложениями. Он также копирует утилиту sqlite3 в /usr/local/bin, копирует заголовочные файлы, которые требуются разработчикам для сборки программного обеспечения, использующего библиотеку SQLite, и копирует документацию в нужный каталог.

Предполагая, что /usr/local/bin имеется в переменной PATH, можно запустить sqlite3 (листинг 8).

Листинг 8. SQLite, готовая к использованию
$ which sqlite3
/usr/local/bin/sqlite3
$ sqlite3
SQLite version 3.3.17
Enter ".help" for instructions
sqlite>

Совет для новичка

Большинство пакетов программного обеспечения собирается так же легко, как и SQLite. В самом деле, часто одной командой можно настроить, скомпилировать и установить программное обеспечение:

$ ./configure && make && sudo make install

Оператор && запускает следующую команду только в том случае, если предыдущая сработает без ошибок. Таким образом, приведенная выше команда говорит: "Запустить ./configure, если он сработает, запустить make, если он сработает, запустить sudo make install." Эта команда собирает пакет автоматически. Можно просто запустить ее и идти пить кофе, съесть сэндвич или комплексный обед в зависимости от размера и сложности собираемого пакета.

Вот еще несколько полезных советов по сборке программного обеспечения из исходных текстов:

  • Если для сборки программного пакета требуется больше, чем просто типичное ./configure && make && sudo make install, нужно хранить журнал шагов, в соответствии с которым собиралась программа. Если нужно перекомпилировать эту же программу или собрать новую версию, можно просмотреть этот журнал, чтобы освежить память. Журнал следует хранить в том же каталоге, что и файл README. Можно даже принять какое-то соглашение по имени журнального файла, чтобы было легче понять, что раньше компилировалось.
  • Еще лучше охватить процесс сборки в скрипте, если шаги, требующиеся для сборки, можно повторять без ручного вмешательства. Впоследствии, если потребуется перекомпилировать ту же программу, нужно просто запустить скрипт. Если появится новая версия программы, то можно изменить этот скрипт, если требуется добавить, изменить или удалить шаги.
  • Можно освободить дисковое пространство после установки программного обеспечения с помощью команды make clean. . Это правило обычно удаляет целевые файлы и все промежуточные файлы и оставляет нетронутыми файлы, требуемые для перезапуска всего процесса сборки с чистого листа. Еще одно правило —make distclean, удаляет Makefile и другие созданные файлы.
  • Рекомендуется хранить исходные тексты разных версий одной и той же программы отдельно. Такой подход позволяет не только сравнивать одну версию с другой, но и дает возможность восстановить конкретную версию программного обеспечения. Хорошо хранить исходные тексты в локальном репозитории, например, в $HOME/src или /usr/local/src в зависимости от сферы использования (личная или общесистемная) и локальных соглашений.
  • Далее, можно предотвратить случайное удаление или перезапись, сделав общий доступ к исходным текстам только для чтения. Для этого нужно перейти в каталог с исходными текстами, которые нужно защитить, и выполнить команду chmod -R a-w * (рекурсивный запуск chmod, который отключает все разрешения на запись).

Наконец, будут случаи, когда исходный код просто не будет компилироваться на данной системе. Как уже упоминалось выше, чаще всего причиной является отсутствие необходимых условий. Нужно тщательно прочитать сообщения об ошибках—из них должно быть понятно, что пошло не так.

Если не удается установить причину неудачи, можно скопировать точное сообщение об ошибке и название пакета в строку поиска в Google. Есть большая вероятность того, что кто-нибудь еще наткнулся на эту же проблему и решил ее. (Действительно, поиск в интернете сообщений об ошибках может быть весьма продуктивным, хотя может потребоваться немного «понырять» в поисках жемчужины.)

Если дело зашло в тупик, можно поискать на домашней странице программы ссылки на такие ресурсы как канал IRC, новостная группа, список рассылки или FAQ. Ваш системный администратор тоже может быть бесценным источником опыта.

В этом сила исходных текстов

Если в системе не хватает нужного инструмента, можно смоделировать его в командной строке, можно написать shell-скрипт, написать собственную программу или обратиться к огромному фонду программ в интернете. Можно добиться, подобно мне, хороших результатов в применении психологических трюков джедаев.

"Это самая лучшая статья, которую я когда-либо читал".

Ресурсы

Научиться

Получить продукты и технологии

  • About SQLite: You can download SQLite from here.(EN)
  • Ознакомительное ПО IBM: ознакомительное программное обеспечение для разработчиков можно загрузить прямо с developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=389996
ArticleTitle=Использование UNIX : Часть 12. Проекты «Сделай сам»
publish-date=05182009