Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

01 июня, 2009

Компиляция Boost C++ Libraries со статической компоновкой




Введение

Программируя на C++, нам приходиться многое писать с нуля, например, нам нужно создать класс сокетов, класс потоков, класс журналирования, функцию регулярных выражений и т.д. Разработка таких библиотек порой занимает слишком много времени, и заставляет программистов страдать.

Boost предоставляет набор библиотек, которые помогут сократить стоимость разработки. Но использовать эти библиотеки надо с осторожностью. Надо помнить о некоторых вещах при внедрении boost в свой код.

1. Некоторые библиотеки требуют динамической компоновки по умолчанию
2. Различные версии динамических библиотек не совместимы
3. Различные версии glibc могут иметь разные наборы библиотек для одной версии Boost

Что касается первого, такие библиотеки как Boost.Thread и Boost.Regex используют динамическую компоновку по умолчанию. К счастью Boost умеет статическую компоновку для этих библиотек.

Второе, приложение, которое требуют динамически скомпилированную библиотеку Boost версии A, не может быть запущено с динамически откомпилированой Boost версии B, поэтому я предпочитаю статическую компиляцию библиотек.

И третье, в окружении Linux код, который компилируется GCC-4.1, может не запуститься с GCC-3.4, потому что они испольуют разное окружение glibc. Но при компиляции Boost можно указать версию gcc, так что библиотеки могут быть основаны на требуемой версии glibc.

Компиляция Boost Library со статической компоновкой и требуемой версии GCC

1. скачайте Boost

2. ./configure
(по умолчанию билиотеки и заголовочные файлы будут установлены в /usr/local, запуская ./configure, Вы можете указать целевое расположение: –prefix,) например, ./configure –prefix=/usr

3. Правьте конфигурационные файлы если Вы хотите исользовать свою версию GCC при компиляции Boost.
Например изменить
using gcc ;
на
using gcc : 3.4 : g++34 ;

4. Если мы хотим статическую компоновку библиотек для boost, потребуется полная компиляция. Изменим Makefile после запуска ./configure
BJAM_CONFIG=–build-type=complete

5. make; sudo make install

Библиотеки Boost установятся в /usr/local/lib/libboost_*
Заголовочные файлы, etc.. (Boost includes) установятся в /usr/local/include/boost-1_35

Откомпилируем код используя статическую библиотеку Boost.Thread

g++34 -o myApp{,.cc} -I/usr/local/include/boost-1_35/ -L/usr/local/lib -lboost_thread-gcc34-mt-s -lpthread


(Помните, что при использовании статической компоновки, Вам потребуется указать флаг -lpthread, если же Вы используете динамическую компоновку, Вы можете пропустить флаг -lpthread.)


Enjoy hacking with boost!

27 марта, 2008

Особенности файловой системы UNIX (BSD, Linux, Solaris, Mach, Hurd, Plan9)

Все, что ни есть в системе UNIX, - это файл. Файл - это последовательность байтов (1 байт = 8 бит = 1 символ). Магнитные ленты, почтовые сообщения, символы, вводимые с клавиатуры, вывод принтера, поток данных в программном канале - каждый из этих файлов представляет собой последовательность байтов по отношению к системе и ее программам.

  • Что в файле?
  • Каталоги и имена файлов
  • Права доступа
  • Команды
  • Иерархия файловой системы


Что в файле?
Расширение имени файлов не имеет значения для типа файла.
Команда file делает предположение о типе файла.
~$ file /bin /bin/ed /usr/src/cmd/ed.c
/bin: directory
/bin/ed pure executable
/usr/src/cmd/ed.c c program text

file читает несколько сотен байт и ищет в них ключевые последовательности символов
например исполняемая программа начинается с "магического числа" в двоичном представлении. Команда od без параметров выводит дамп файла 16-битными порциями, позволяя увидеть это "магическое число"
~$ od /bin/ed
000000 000410 025000 000462 011444 000000 000000 000000 000001
000020 170011 016600 000002 005060 017776 010600 162706 000004
..

Восьмиричное значение 410 означает обычную исполняемыю программу. Заметим, что 410 не соответствует никакой ASCII-символ.

Каталоги и имена файлов
Все принадлежащие пользователю файлы имеют имена, начинающиеся с /usr/login, где login - имя вашей учетной записи, регистрационный каталог, чтобы просмотреть находящиеся здесь файлы введите cd(перенесет Вас в домашнюю директорию, если Вы еще не там); ls(1)
~$ сd; ls

команда pwd выведет имя текущего каталога
~$ pwd
/usr/login

В именнах файлов важен регистр букв, File и file - разные файлы

Права доступа
Команда ls запущенная с параметром -l, выводит, кроме основного содержания каталога, информацию о правах доступа.
~$ ls -l /etc/passwd
-rw-r--r-- 1 root 5115 Aug 30 10:40 /etc/passwd
~$ ls -lg /etc/passwd
-rw-r--r-- 1 adm 5115 Aug 30 10:40 /etc/passwd

В строке -rw-r--r-- представлены сведения о правах доступа к файлу, если бы это был каталог, то в первой позиции бы находился символ d.
~$ ls -l /
drwxr-xr-x 2 root root 4096 2008-03-25 11:42 bin

Следующие три символа показывают права владельца на чтение, запись и выполнение. rw-r--r-- означает, что пользователь root(владелец файла) из группы adm может читать и писать, но не может выполнять этот файл. У исполняемого файла должен стоять символ x вместо прочерка -. Следующие три симола rw-r--r-- показывают разрешения для группы adm, можно читать файл, но не более того. Последняя группа символов, также rw-r--r-- определяет права доступа для остальных - прочих пользователей системы. Таким образом только root может изменять регистрационную информацию, а всем остальным она доступна только для чтения.
Команда chmod изменяет права доступа к файлу
Восьмиричные значения образуются путем складывания 4 для чтения, 2 для записи, 1 для исполнения.
~$ chmod 666 file
дает право на чтение и запись файла file всем
~$ chmod 700 command
позволит читать, изменять, выполнять command только его владельцу

Отметим, что знак + (плюс) включает право доступа, а знак - (минус) - выключает.
~$ chmod +x command
позволит всем выполнять command
~$ chmod -w file
отменяет право на запись в файл file всех, включая владельца
~$ chmod -w .
запрещает право на запись в каталог, в котором мы находимся


Команды - это программы, которые вызывает пользователь. Основные команды расположены в директории /bin, но также могут быть расположены в
/usr/bin, чтобы не собирать мусор в /bin. Эти директории автоматически просматриваются командным интерпретатором (shell). UNIX имеет файловую систему компонованную в виде иерархии директорий.
При входе в систему вы попадаете в домашнюю директорию. Для того, чтобы обратиться к файлу в другой директорий, например /usr/share/bin/filex, указываем полный путь (начинается с '/', корневая директория всей файловой системы) с поддиректориями (usr, share, bin), то есть посылаем команду /usr/share/bin/filex
Важные команды, которые могут "играть" с файлами: cp(1), mv(1), rm(1), которые копируют, перемещают и удаляют файлы соответственно. Чтобы просмотреть содержание директорий используйте ls(1), создание директории - mkdir(1),
удаление директории - rmdir(1) или rm(1).

hier(7) - иерархия файловой системы

/     корневая директория
/dev/     devices(4)
     console     главная консоль, tty(4)
     tty*     терминалы, tty(4)
     cat     "наборщик снимков" cat(4)
     rp*     диски, rp, hp(4)
     rrp*     "сырые" диски, rp, hp(4)

/bin/     служебные программы, cf /usr/bin (1)
     as     ассемблер, cf /usr/lib/as2
     cc     исполнительный компилятор C, cf /usr/lib/c[012]

/lib/     объектные библиотеки и подобные вещи, cf /usr/lib/
     libc.a     системные вызовы, стандартные ввод/вывод I/O, и т.п.
     libm.a     математические программы
     libplot.a     программы рисования, plot(3)
     libF77.a     поддержка среды исполнения Фортрана
     libI77.a     ввод/вывод Фортрана
     as2     второй "проход" ассемблера as(1)
     c[012]     проходы cc(1)

/etc/     важные данные и полезные средства сопровождения
     passwd     файл с паролями пользователей, passwd(5)
     group     файл с группами пользователей, group(5)
     motd     сообщение дня, login(1)
     mtab     таблица монтируемых устройств, mtab(5)
     ddate     сброс истории, dump(1)
     ttys     параметры терминала, ttys(5)
     getty     часть login, getty(8)
     init     отец всех процессов, init(8)
     rc     shell-программа для загрузки системы
     cron     часовой демон, cron(8)
     mount     mount(1)
     wall     wall(1)

/tmp/     временные файлы, обычно находятся на быстром устройстве, cf /usr/tmp/
     e*     испольуемые ed(1)
     ctm*     .. cc(1)

/usr/     универсальная директория, обычно монтируемая ФС
     adm/     информация администратора
          wtmp     история входов в систему, utmp(5)
          messages     сообщения об ошибках устройств
          tracct     "наборщик снимков" счет , troff(1)
          vpacct     подсчет строк, lpr(1)
     bin/     служебные программы, чтобы не засорять /bin/
     tmp/     временные, чтобы не засорять /tmp/
          stm*     используется для sort(1)
          raster     .. plot(1)
     dict/     список слов, словообразований и т.п.
          words набор основных слов, используются look(1)
          spellhist     история для spell(1)

     games/     игры
          bj     блэкджек
          hangman     виселица
          quiz.k     что знает quiz(6)
               index     оглавление категории
               africa     страны и столицы
               ..
          ..
     include/стандартые #include файлы
          a.out.h     макет объектного файла, a.out(5)
          stdio.h     стандартные ввод/вывод, stdio(3)
          math.h
          ..
          sys/     системные макеты, cf /usr/sys/h
               acct.h     счет процессов, acct(5)
               buf.h     буфферы внутренней системы
               ..
     lib/     объектные библиотеки и т.п., чтобы не засорять /lib/
          lint[12]     подпроцессы lint(1)
          llib-lc          холостое объявление для /lib/libc.a, используемое lint(1)
          llib-lm          .. /lib/libc.m
          atrun     планировщик at(1)
          struct/     пути sruct(1)
          ..
          tmac/     макросы для troff(1)
               tmac.an      макрос для man(7)
               tmac.s          .. ms(7)
               ..
          font/     шрифты для troff(1)
               R     Times Roman
               B     Times Bold
               ..
          uucp/     программы и данные uucp(1)
               L.sys     имена и числа, поступающие удаленно
               uucico     реальная копия программы
               ..
          suftab     таблица суффиксов для автоматического переноса слов, используемый troff(1)
          units      таблицы обмена для units(1)
          eign     лист английских слов, игнорируемых ptx(1)

     man/     первый том руководства, man(1)
          man0/     основное
               intro     вступление к тому1, ms(7) форматирование
               xx     шаблон для страниц руководства(manual pages)
          man1/     раздел 1
               as.1
               mount,1m
               ..
          cat1/     предварительные страницы man1/
               as.1
               mount.1m
          ..
     spool/     замедленно исполняемые файлы
          at/     at(1)
          lpd/     lpr(1)
               lock     присутствует когда построчно-печатающее устройство активно
               cf*     копия распечатываемого файла, если нужно
               df*     файл управления демонами, lpd(8)
               tf*     файл контроля резидетной памяти, пока lpr работает
          uucp/     рабочие фалйы и область обработки для uucp(1)
               LOGFILE     суммарный журнал
               LOG.*     журнал одной транзакции
          mail/     почтовые ящики mail(1)
               $uid     почта пользователя $uid
               $uid.lock     блокировочный файл, пока $uid принимает почту
          $wd     рабочая директория пользователя, обычно по имени логина $wd
               .profile     окружение для sh(1), environ(5)
               calendar     календарь пользователя, calendar(1)
          doc/     статьи, обычно второй раздел руководства, в формате ms(7)
               as/     руководство ассемблера
               c     руководство C
               ..
          sys/     системный код
               dev/     драйверы устройств
                    bio.c      общий код
                    cat.c     cat(4)
               dh.c     DH11, tty(4)
               tty     tty(4)
               ..
          conf/     железо-зависимый код
               mch.s     часть ассемблерного кода
               conf     генератор конфигураций
               ..
          h/     заголовочные(include) файлы
               acct.h     acct(5)
               stat.h     stat(2)
               ..
          sys/
               main.c
               pipe.c
               sysent.c     точки входа системы
               ..

/usr/     src/     исходные коды утилит и прочего
          cmd/     коды команд
          as/     ассемблер
               makefile     способ сборки ассемблера
               as1?.s          код pass1
          ar.c     код ar(1)
          ..
          troff/     код nroff и troff(1)
               nmake     makefile для nroff
               tmake     makefile для troff
               font/     код таблиц шрифтов, /usr/lib/font/
                    ftR.c     Roman
                    ..
               term/     таблицы характеристик терминала, /usr/lib/term/
                    tab300.c     DASI 300
                    ..
               ..
          libc/     код функций в /lib/libc.a
               crt/     C runtime support
                    ldiv.s     division into a long
                    lmul.s     multiplication to produce long
                    ..
               csu/     запуск и "покрытие" программ нужных в каждой С программе
                    crt0.s     обычный запуск
                    mcrt0.s     модифицированный запуск для cc -p
               sys/     системные вызовы
                    access.s
                    alarm.s
                    ..
               stdio/     функции стандартного ввода/вывода I/O
                    fgets.c
                    fopen.c
                    ..
               gen/
                    abs.c
                    atof.c
                    ..
               compall     shell процедура для компиляции libc
               mklib     shell процедура для сборки /lib/libc.a
          libI77/     коды /lib/libI77
          libF77/
          ..
          games/     исходные коды /usr/games/

Также смотрите
ls(1), ncheck(1), find(1), grep(1)


В Linux также можно изучить иерархию каталогов в руководстве hier
~$ man hier


Если Вы начинаете осваивать сисему UNIX возможно Вам понадобится руководство intro(2)
~$ man 2 intro


Литература:
1. UNIX TIME-SHARING SYSTEM, UNIX Programmer's Manual, V7Vol1, January, 1979, Bell Labs Inc., B.W. Kernigan, M.D.
McIlroy
2. UNIX Programming Environment, The First Edition, 1984, B.W. Kernigan

Также смотрите: Unix Toolbox (pdf буклет)

21 декабря, 2007

Google Code Day 2007 Russia

Google Code Day 2007 Russia
Открыла День Google Code Дженнифер Трелевич, Директор Центра Разработок Google Россия.


Дженнифер Трелевич
Директор Центра Разработок Google Россия


Трелевич начинала работать в компании Motorola, занималась созданием продуктов для обработки речевых сигналов. Работала в штаб-квартире IBM, также менеджером отдела научно-исследовательской деятельности IBM в России, странах СНГ и Восточной Европы.
Плохо говорит по-русски, хотя интересуется русской литературой, кино, театром, балетом.
В презентации были рассмотрены Продукты для разработчиков от Google, Google APIs
Ключевые моменты и фразы:
  • all apps in browser (все приложения в браузере)
  • keep advertising SOAP
  • Улучшение браузера через GoogleGears
  • "Cтратегические улучшения интернета в пользу всех." (с)
  • "Что хорошо для веба - хорошо для Google." (с)




В следующей секции выступил гость из Маунтин Вью, США, Брэд Фицпатрик, Технолог Google, известный как создатель социальной сети LiveJournal

Брэд Фицпатрик (Brad Fitzpatrick)


Ключевые моменты презентации Брэда "Открытие Социального Графа":

  • OpenID wiki

  • Социальный граф; как мы свзязаны друг с другом, как мы делаем полезные вещи с помощью социального графа

    Giant Global Graph (GGG)

    Термин GGG используется в семантических Web. Этот термин был придуман Тим Бернерс Ли в ноябре 2007 года. На блоге Тим рассказывает о том, что GGG (Глобальный Гигантский Граф) может быть более подходящим, чем таксономия "Semantic Web".

  • OpenSocial API, HTML+JavaScript

  • IM interopability for XMPP, AIM, MySpace, Facebook, LinkedIn, Ning, Oracle, orkut, etc..

  • собрать ГГГ через XFN && FOAF, используя разметку на сайтах
    <link rel="meta" type="application/rdf+xml" title="foaf">

  • XFN, hCard, OpenID, OAuth
    Plaxo.com, FriendFeed.com, Mugshot.org - аггрегация
    SixApart's updates.elsewhere.im - XML-поток в реальном времени, участие через OAuth

  • FOAF (foaf-project.org)
    Friend of a friend
    файлы XML RDF, SHA1_hex



Вторая часть мероприятия была посвящена практическим семинарам, workshop: GData, OpenSocial (forum), Geo (GeoRSS, KML, Mushup).



Related Links:

19 сентября, 2007

XSLT преобразование в Mono

Иногда Вам нужно взять кусок информации из некоторого произвольного XML файла и преобразовать его во что-то другое. Нацеленый на HTML, XML, или простой текст, XML Stylesheet Language Transformation (XSLT) Вам в помощь.

В этом примере вы научитесь трансформировать любой произвольный XML документ в другой формат, используя XSLT.
Как я это сделаю?

Листинг 01 Transform.cs показывает программу, которая берет исходный код XML, файл таблицы стиля, и целевой(куда назначен) файл с параметрами, и исполняет XSLT трансформацию.

Листинг 01 Transform.cs

using System;
using System.Xml.Xsl;
public class Transform {

public static void Main(string [ ] args) {
string source = args[0];
string stylesheet = args[1];
string target = args[2];

try
{
XslTransform transform = new XslTransform( );
transform.Load(stylesheet);
transform.Transform(source, target, null);
}
catch (Exception e)
{
Console.Error.WriteLine(e);
}
}
}


Класс XslTransform создан и загружен. Метод Load( ) имеет несколько перегрузок, которые могут быть загруженными из различных источников, включая URL, XPathNavigator, IXPathNavigable и XmlReader. Последний параметр Load( ) небязательный XmlResolver, который необходим для решения вызывов во внешние таблицы стилей через XSLT компонент include или import. Если параметр нулейвой, эти внешние ресурсы не разрешены.

По умолчанию, Mono будет использовать управляющую реализацию XSLT. Если Вы хотите использовать неуправляемую реализацию из libxslt, определите переменную среды MONO_UNMANAGED_XSLT (любое значение подойдет). Вы можете использовать управляемую реализацию если Вам необходимо использовать компонент <msxsl:script> для расширения тегов в таблице стилей. В основном, некоторые операции наиболее эффективны при использовании управляемой версией, и некоторые эффективны при использовании неуправляемой реализацией.

Листинг 02 StockQuote.xml показывает XML документ

<stockquote symbol="NOVL" name="Novell, Inc">
<lasttrade>9.78</lasttrade>
<tradetime>2004-05-04T10:56-0400</tradetime>
<change>
<amount>0.00</amount>
<percent>0.00</percent>
</change>
<prevclose>9.78</prevclose>
<open>9.77</open>
<onedayrange>
<low>9.72</low>
<high>10.02</high>
</onedayrange>
<oneyearrange>
<low>2.70</low>
<high>14.24</high>
</oneyearrange>
<volume>1,203,227</volume>
</stockquote>


Непохожая на своего родственника, каскадной таблицы стилей (CSS), которая имеет свой синтаксис, таблица стилей XSLT сама по себе XML документ. Листинг 03 показывает таблицу стилей XSLT, которая может быть использована для трансформации XML из листинга 02 в текст.

Листинг 03 StockQuote.xsl


<xsl:stylesheet version="1.0" xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text">
<xsl:template match="/">
<xsl:apply-templates select="StockQuote">
</xsl:apply-templates>
<xsl:template match="StockQuote">
Ticker Symbol: <xsl:value-of select="@Symbol">
Name: <xsl:value-of select="@Name">
<xsl:apply-templates select="LastTrade">
</xsl:apply-templates>
<xsl:template match="LastTrade">
Last Trade: US$<xsl:value-of select=".">
</xsl:value-of>
</xsl:template>

Скомпилируйте и запустите программу как показано ниже:

~$ mcs Transform.cs
~$ mono Transform.exe StockQuote.xml StockQuote.xsl StockQuote.txt


У Вас должен получиться файл StockQuote.txt со следующим содержанием:

Ticker Symbol: NOVL
Name: Novell, Inc
Last Trade: US$9.78



Что дальше?

Источник всех знаний о XSLT, прежде всего, W3C. Смотрите страницу http://www.w3.org/Style/XSL/. Здесь есть всё о XSLT.

Также можно посмотеть XSLT руководства здесь и здесь.

Чтобы узнать о компоненте <msxsl:script>, обратите внимание на статью "XSLT Stylesheet Scripting using <msxsl:script>" в руководстве для .NET разработчиков здесь.

05 сентября, 2007

Революционный интерфейс, или Monoполярная сила GTK#

Руководство GTK# для начинающих


"Билл! Революция началась без нас!"
Пол Аллен, Microsoft, Pirates of Silicon Valley

английская версия статьи лежит на mono-project.com (http://www.mono-project.com/GtkSharpBeginnersGuide)
перевод на русский: vig

Оглавление


1. Предисловие
1.1 Что такое GTK#?

2. Установка
2.1 Скачивание/Установка GTK#
2.2 Внутри библиотек GTK#
2.3 GTK# или Glade#

3. Первое GTK# приложение
3.1 Шаг 1. Присядьте удобнее
3.2 Шаг 2. Создание папок и файлов
3.3 Шаг 3. Формирование
3.4 Шаг 4. Добавление графического интерфейса GUI
3.5 Шаг 5. Формирование окна
3.6 Шаг 6. Добавление событий

4. Первое Glade# приложение
4.1 Шаг 1. Что такое Glade#
4.1.1 Что такое файлы glade?
4.1.2 На что похожи файлы .glade?
4.2 Шаг 2. Интеграция Glade файлов с нашей программмой
4.2.1 Как скомпилировать?
4.3 Шаг 3. Как использовать Glade# в моем коде

4.4 Как обращаться к виджетам определенным в gui.glade
4.5 Как добавить событие
4.5.1 Ссылки и другие руководства для изучения


1. Предисловие


Эта статья является руководством для начинающих GTK# программистов. Она поможет тем, кто никогда до этого не программировал графические пользовательские интрфейсы (далее GUI) при помощи GTK#. Программисты ранее знакомые с GTK+ API из опыта написания на других языках (C, C++, Perl, Python) так же найдут этот пассаж полезным, т.к. он объясняет основы процесса создания приложений на C# в среде Mono. Эта статья так же рассказывает об основах использования Glade и libglade как быстрого инструмента создания графического пользовательского интерфейса.


1.1 Что такое GTK#?


Проще говоря, gtk# - это обертка над gtk+, кроссплатформенным GUI фреймворком.

gtk+ - это мультиплатформенный тулкит для создания GUI. Предоставляя полный набор виждетов, gtk+ пригоден в различных проектах: от одноразовых игрушек до набора приложений уровня предприятия.

(from the gtk+ website (http://www.gtk.org/))


Сегодня gtk+ работает с любым X сервером, Direct Framebuffer'ом и производными в Microsoft Windows NT. Библиотека gtk+ известна от Linux, где она является базисом для построения виджетов рабочей среды GNOME. gtk+ включен практически во все дистрибутивы Linux, и стабильно работает под управлением Windows NT. (в 2000 работала нестабильно, если мне память не изменяет)

Портирование gtk+ на Mac OS X запланированно, но необходима заинтересованность других людей. Это зов к участию.

Одно из наиболее распространенных недоумений состоит в том, что GTK# требует Mono для работы. Это неверно. GTK# будет запускаться на любой .NET-совместимой среде. GTK# регулярно тестируется в MS .NET и Mono фреймворках, но также может быть запущена в любой полностью совместной среде. Это означает, что если Вы пишите приложение на GTK# и хотите запустить его в Windows, Вы можете развернуть проект только с GTK# с использованием среды MS, или развернуть его в среде Mono для Windows.

2. Установка



2.1 Скачивание/Установка


Первую вещь, которую необходимо сделать - это скачать GTK# и установить его.

Linux, MacOSX, FreeBSD и другие: Проверьте наличие требуемых пакетов gtk-sharp, mono в вашем дистрибутиве.
aptitude install mono gtk-sharp2

для Debian-based дистрибутивов.
В SuSE Linux выберите нужные пакеты в YaST. Если их нет в дистрибутиве, тогда ищите здесь(http://www.mono-project.com/Downloads) и загружайте. Если на mono-project.com нет пакетов для Вашей платформы, тогда Вам придется скомпилировать из исходников ;)

Windows: программируйте Windows.Forms, не хрен лезть в GTK =) [примечание автора]


2.2 Внутри библиотек GTK#



Компоненты GTK#
GTK# состоит из следующих сборок, каждая соответствует подобной библиотеке:

gtk-sharp (http://www.mono-project.com/monodoc/N:Gtk)
Связи тулкита gtk+ 2.x для создания GUI

glib-sharp (http://www.mono-project.com/monodoc/N:Glib)
Связи тулкита glib 2.x, которые обеспечивают низкоуровневое библиотеки ядра для gtk+ (не-GUI)

pango-sharp (http://www.mono-project.com/monodoc/N:Pango)
Связи Pango, высокоуровневая библиотека компоновки и рендеринга международных текстов

atk-sharp (http://www.mono-project.com/monodoc/N:Atk)
связи к atk фреймворку

gdk-sharp (http://www.mono-project.com/monodoc/N:Gdk)
низкоуровневый инструментарий для "рисования", используемый gtk+

glade-sharp (http://www.mono-project.com/monodoc/N:Glade)
Glade# позволяет Вам загружать интерфейсы Glade в программу. Это наиболее простой путь создания GTK# GUI.

art-sharp (http://www.mono-project.com/monodoc/N:Art)
библиотека для работы с векторной графикой и отрисовки

rsvg-sharp (http://www.mono-project.com/monodoc/N:Rsvg)библиотека отрисовки SVG

gtk-dotnet (http://www.mono-project.com/monodoc/N:Gtk.DotNet)
интеграция пространства имен Gtk# с System.Drawing

gnome-sharp (http://www.mono-project.com/monodoc/N:Gnome)
Связи GNOME

gnomevfs-sharp (http://www.mono-project.com/monodoc/N:GnomeVfs)
связи файлов, их MIME типов, изображений к методу обращения приложений GNOME'а к файловой системе

vte-sharp (http://www.mono-project.com/monodoc/N:Vte)
связи к терминальному эмулятору VTE

gconf-sharp (http://www.mono-project.com/monodoc/N:GConf)
Связи к системе хранения конфигураций в GNOME

gtkhtml-sharp (http://www.mono-project.com/monodoc/T:Gtk.HTML)
Связи к легковесному HTML виджету


Другие компоненты не включены в основной дистрибутив GTK#, но заслуживают упоминания, потому что имеют отношение к GTK#: Gecko#, Gtksourceview#, Gsf#, Guile#, Gst# и dbus#.

2.3 GTK# или Glade#


Когда люди начинают изучение Mono, они могут стоять на перепутье - какую библиотеку использовать: gtk# или glade#. Для этого Вам нужно понять что такое glade# и что такое gtk#. gtk# - это ядро для построения оконных и виджет систем. Glade# наследует GTK#, таким образом является подмножеством GTK# и является совместимой, но glade# автоматически компонует виджеты с сохраняет их как XML файл. XML компоновка GUI может быть сгенерирована при помощи Glade утилиты, студии дизайна WYSIWYG.

Для большинства окон Glade# - лучший выбор. Он экономит время за счет отсутствия необходимости написания программного кода для GUI и делает простым изменение интерфейса в будущем. Но возникает проблема в том, что Вам нужно от интерфейса, Glade# не может выполнять некоторые специфичные вещи (скрывать элементы, динамически загружать новые части, наследовать виджеты). Только опыт может Вам понять, что в конкретном случае лучше использовать.

Для быстрого ознакомления с Glade# Вы возможно захотете взглянуть на этот скринкаст(http://nat.org/demos/gtksharp.html) Ната Фридмана (Nat Friedman)(http://nat.org), в котором он создает простое графическое приложение всего за несколько минут.

3. Первое GTK# приложение



Шаг 1. Присядьте удобнее


Мы должны чувствовать себя комфортно. Откройте Dr. Pepper и включите любимую музыку. Хорошо, теперь мы готовы.

Шаг 2. Создание папок и файлов


Для начала нам нужно создать новую директорию для маленького проекта. (Пользователи Windows: давайте не будем использовать пробелы в названии директории, чтобы избежать в дальнейшем головной боли).

Откройте shell (Если вы в Windows, откройте меню сПуск :) далее Программы -> Mono 1.x.x -> Mono Command Prompt. Она автоматически установит нужные пути к mono библиотекам.) Перейдите в только что созданную директорию. Мы часто будем использовать консоль, поэтому оставьте ее запущенной.

Вернемся к делу. Откройте свой любимый редактор (MonoDevelop, vi, emacs, notepad и т.д.) и создайте новый пустой проект (если это возможно) или создайте новый пустой файл. Сохраните файл под именем "helloworld.cs".

Шаг 3. Формирование кода


Я надеюсь, что Вы уже знакомы с C#, и код написанный ниже не вызовет никаких проблем в понимании. Мы должны создать новый класс, использовать Gtk# и указать точку входа в нашу программу. Это будет выглядеть так:
using System;
using Gtk;

public class GtkHelloWorld {
public static void Main() {
Console.WriteLine("HelloWorld");
}
}


Это должно выглядеть весьма знакомо для Вас. Только теперь мы можем воспользоваться компилятором. Сохраним исходный код, перейдем в консоль и построим проект:

mcs -pkg:gtk-sharp-2.0 helloword.cs


Для тех кто пользовался csc компилятором в Windows параметр "-pkg:" может показаться незнакомым. Этого параметра не было в csc, потому что Mono пришел из мира Linux. Этот параметр позволяет указать на необходимость подключения пакета gtk-sharp-2.0. Т.е. система ищет файл "gtk-sharp-2.0.pc", который содержит данные о местоположении библиотеки для этого пакета (среди другой информации). Т.е. мы не должны вводить "-r:gtk-sharp-2.0.dll -r:atk-sharp-2.0.dll -r:pango-sharp-2.0.dll ...." руками.

Шаг 4. Добавление графического интерфейса GUI


Теперь давайте вернемся обратно к нашему коду. Уберем оператор "Console.WriteLine". Первое, что мы сделаем - создадим новое окно. Проделаем это добавлением нового оператора new Window и блока приложения (для начала нити цикла main). Вот так:
using System;
using Gtk;

public class GtkHelloWorld {
public static void Main() {
Application.Init();

//Create the Window

Window myWin = new Window("My first GTK# Application! ");
myWin.Resize(200,200);

//Create a label and put some text in it.

Label myLabel = new Label();
myLabel.Text = "Hello World!!!!";

//Add the label to the form
myWin.Add(myLabel);

//Show Everything

myWin.ShowAll();

Application.Run();
}
}


Теперь скомпилируем исходный код так же как мы делали это раньше, и запустим программу

mono HelloWorld.exe


В итоге вы получите что-то вроде этого:

Не так уж и сложно, да?

Первая вещь, которую Вы могли заметить, это то, что в отличии от использования System.Windows.Forms мы не писали код для точной компоновки текста в окне. Например, мы не писали 'myLabel.Left = 100' или 'myLabel.Width = 200' или что-то подобное для размещения текстовой метки на форме, мы просто пишем 'myWin.Add(...)'. И все это потому, что 'Gtk.Window' - это виджет, который наследуется от Bin, или одиночного виджета который размещен в контейнере Container.

Другая часть кода, которая могла Вас заинтересовать, это использование выражений "Application.Init()" и "Application.Run()". Если вы когда-либо ранее использовали System.Windows.Forms это аналогично использованию "Application.Run()" во многих случаях. Обычно, когда приложения заканчивает обработку любого кода в основном потоке, приложение останавливается. Команда "ShowAll()" не блокирует код и продолжает дальнейшее выполнение кода (вплоть до остановки). Команда "Application.Init()" говорит оболочке выполнения "слушать" сигналы поступающие от Gtk.Windows и в момент когда выполняется "Application.Run()" выполнение кода передается основному циклу сообщений. Это позволяет оставаться приложению запущенным до тех пор пока не будут закрыты все окна. Для большей информации смотрите информацию об объекте Application.

Шаг 5. Формирование окна


Возможно Вы захотите спросить себя "Как я смогу добавить новый виджет на окно, если оно может содержать только один виджет?" До этого мы говорили, что Window действительно может содержать в себе только один виджет, но виджет сам по себе может содержать в себе множество других виджетов. Некоторые из этих виджетов наследуются от контейнера Gtk.Box, а в некоторых случаях напрямую от контейнера. Контейнерный виджет Bin наследуется напрямую от виждета-контейнера, как и многие другие виджеты, но Bin может содержать в себе только один элемент управления.

Для того чтобы размещать большое количество виджетов в нашем окне, мы должны добавить на окно один из виджетов, который может содержать в себе другие виджеты. Существует множество виджетов, которые могут делать это, но мы затронем только некоторые простые: HBox(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.HBox), VBox(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.VBox) и возможно Table(http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.Table).

Шаг 6. Добавление событий


Все классы производные от 'Widget (http://www.go-mono.com/docs/index.aspx?link=T%3aGtk.Box)' предоставляют следующие события:
  • ButtonPressEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ButtonPressEvent)
  • ButtonReleaseEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ButtonReleaseEvent)
  • ScrollEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ScrollEvent)
  • MotionNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.MotionNotifyEvent)
  • DeleteEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.DeleteEvent)
  • DestroyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.DestroyEvent)
  • ExposeEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ExposeEvent)
  • KeyPressEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.KeyPressEvent)
  • KeyReleaseEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.KeyReleaseEvent)
  • EnterNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.EnterNotifyEvent)
  • LeaveNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.LeaveNotifyEvent)
  • ConfigureEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ConfigureEvent)
  • FocusInEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.FocusInEvent)
  • FocusOutEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.FocusOutEvent)
  • MapEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.MapEvent)
  • UnmapEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.UnmapEvent)
  • PropertyNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.PropertyNotifyEvent)
  • SelectionClearEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.SelectionClearEvent)
  • SelectionRequestEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.SelectionRequestEvent)
  • SelectionNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.SelectionNotifyEvent)
  • ProximityInEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ProximityInEvent)
  • ProximityOutEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ProximityOutEvent)
  • VisibilityNotifyEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.VisibilityNotifyEvent)
  • ClientEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.ClientEvent)
  • NoExposeEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.NoExposeEvent)
  • WindowStateEvent (http://www.go-mono.com/docs/monodoc.ashx?link=F%3aGtk.Widget.WindowStateEvent)


Многие их этих событий могут быть обработаны стандартным обработчиком событий. Например:

public static void HandlerMethod(object obj, EventArgs args)


Пример обработки событий нажатия на кнопку:

public static void ButtonPressHandler(object obj, ButtonPressEventArgs args)


ButtonPressEventArgs - это класс производный от EventArgs. Класс ButtonPressEventArgs, как и многие другие в gtk#, добавляет свойство Gtk.Event (или другое от Gtk.Event) к EventArgs.

Типы Gdk.Event:

  • EventType.Nothing
  • EventType.Delete
  • EventType.Destroy
  • EventType.Expose
  • EventType.MotionNotify
  • EventType.ButtonPress
  • EventType.TwoButtonPress
  • EventType.ThreeButtonPress
  • EventType.ButtonRelease
  • EventType.KeyPress
  • EventType.KeyRelease
  • EventType.EnterNotify
  • EventType.LeaveNotify
  • EventType.FocusChange
  • EventType.Configure
  • EventType.Map
  • EventType.Unmap
  • EventType.PropertyNotify
  • EventType.SelectionClear
  • EventType.SelectionRequest
  • EventType.SelectionNotify
  • EventType.ProximityIn
  • EventType.ProximityOut
  • EventType.DragEnter
  • EventType.DragLeave
  • EventType.DragMotion
  • EventType.DragStatus
  • EventType.DropStart
  • EventType.DropFinished
  • EventType.ClientEvent
  • EventType.VisibilityNotify
  • EventType.NoExpose
  • EventType.Scroll
  • EventType.WindowState
  • EventType.Setting


Например, для использования события Gdk.Event мы можем использовать такой код:

using Gdk;
...
widget.ButtonPressEvent += new ButtonPressEventHandler(ButtonPressHandler);
...
private void ButtonPressHandler(object obj, ButtonPressEventArgs args) {

// single click
if (args.Event.Type == EventType.ButtonPress) {

...
}
// double click
if (args.Event.Type == EventType.TwoButtonPress) {

...
}

// the left button was used
if (args.Event.Button == 1) {

...
}
}


В примере выше вы можете увидеть как обнаружить было ли одиночное нажатие мышкой или это был двойной клик.

4. Первое Glade# приложение



Шаг 1. Что такое Glade#


Glade# - это набор связей с libglade на языке C#. Позволяет легко создавать GUI приложения используя визуальные средства и сохранять их в формате, который приложение сможет использовать во время выполнения, чтобы создать интерфейс. На данный момент существует две среды для генерирования glade файлов: Glade(http://glade.gnome.org/) и конечно Stetic(http://mysterion.org/~danw/blog/2005/03/stetic).


4.1.1 Что такое glade файлы?


Файлы, записанные в XML формате, которые представляют собой GUI в GTK+, сохраняя сюда все аттрибуты и свойства.

4.1.2 На что похожи файлы .glade?


файл: gui.glade

<!--*- mode: xml -*-->

<glade-interface>

<widget class="GtkWindow" id="window1">

<property name="visible">True</property>
<property name="title" translatable="yes">Glade Window</property>

<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>

<property name="modal">False</property>
<property name="default_width">256</property>

<property name="default_height">256</property>
<property name="resizable">True</property>

<property name="destroy_with_parent">False</property>
<property name="decorated">True</property>

<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>

<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>

<property name="focus_on_map">True</property>

<child>
<widget class="GtkScrolledWindow" id="scrolledwindow1">

<property name="visible">True</property>
<property name="can_focus">True</property>

<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>

<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>


<child>
<widget class="GtkLayout" id="layout1">
<property name="visible">True</property>

<property name="width">400</property>
<property name="height">400</property>

<property name="hadjustment">0 0 400 10 212.4 236</property>
<property name="vadjustment">0 0 400 10 212.4 236</property>


<child>
<widget class="GtkLabel" id="label1">
<property name="width_request">38</property>

<property name="height_request">17</property>
<property name="visible">True</property>

<property name="label" translatable="yes">label1</property>
<property name="use_underline">False</property>

<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>

<property name="wrap">False</property>
<property name="selectable">False</property>

<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>

<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>

<property name="single_line_mode">False</property>
<property name="angle">0</property>

</widget>
<packing>
<property name="x">96</property>
<property name="y">88</property>

</packing>
</child>

<child>
<widget class="GtkButton" id="button1">

<property name="width_request">60</property>
<property name="height_request">27</property>

<property name="visible">True</property>
<property name="can_focus">True</property>

<property name="label" translatable="yes">button1</property>
<property name="use_underline">True</property>

<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>

</widget>
<packing>
<property name="x">88</property>
<property name="y">168</property>

</packing>
</child>
</widget>
</child>
</widget>
</child>

</widget>

</glade-interface>


Файл .glade содержит в себе всю необходимую информацию для того, чтобы библиотека libglade могла воссоздать GUI.

Шаг 2. Интеграция glade файлов с нашей программой


Подразумевается что .glade файл уже создан, или при помощи Glade, или при помощи Stetic. Видео о Stetic можно посмотреть здесь (http://mysterion.org/~danw/blog/2005/03/steticzilla.html).

В намерениях нашего примера мы предпологаем, что GUI был сохранен в файл gui.glade, который содержит описание окна window1, кнопки button1 и метки label1.

Нам нужно будет создать новый указатель на Gtk# и Glade#, а затем создать новый класс и точку входа, с которой начинается наша программа.
// file: glade.cs
using System;
using Gtk;
using Glade;
public class GladeApp

{
public static void Main (string[] args)

{
new GladeApp (args);
}

public GladeApp (string[] args)
{

Application.Init();

Glade.XML gxml = new Glade.XML (null, "gui.glade", "window1", null);
gxml.Autoconnect (this);
Application.Run();
}

}


4.2.1 Как скомпилировать?


Теперь мы должны скомпилировать исходный файл glade.cs указывая пространство имен для glade, которое находится в библиотеке glade-sharp. Команда компиляции следующая:

$ mcs -pkg:glade-sharp -resource:gui.glade glade.cs


Коммандой mcs -pkg:glade-sharp мы создаем программу glade.exe, а опция -resource внедряет файл gui.glade в исполняемую программу.

Передавая null как первый параметр в конструктор Glade.XML, мы сообщаем библиотеке libglade загружать glade файл из ресурсов, как вариант использования конструктора, файл может быть загружен из файловой системы, что особенно полезно тогда, когда Вы не хотите перекомпилировать GUI приложение после каждого изменения .glade файла.

Если мы запускаем программу наш GUI может открыться, однако, нажимая на кнопки Вы не добьетесь эффекта, потому как мы не назначали событий виджету, определенному в gui.glade файле. Изучив следующую секцию Вы научитесь это делать.


Шаг 3. Как использовать Glade# в моем коде


4.4 Как обращаться к виджетам определенным в gui.glade


Для доступа к объектам, определенным в gui.glade файле, Вы должны знать имя объекта и его тип, и только тогда добавлять его в C# код. Делается это следующим образом (обратите внимание на оттрибут [Widget]):

[Widget]
Тип имя;


Применяем это определение к нашему примеру как следует ниже в коде:

using System;

using Gtk;
using Glade;
public class GladeApp
{
public static void Main (string[] args)

{
new GladeApp (args);
}

public GladeApp (string[] args)
{

Application.Init();

Glade.XML gxml = new Glade.XML (null, "gui.glade", "window1", null);
gxml.Autoconnect (this);
Application.Run();
}


[Widget]
Button button1;

[Widget]
Label label1;
}



4.5 Как добавить событие


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


using System;
using Gtk;
using Glade;
public class GladeApp

{
public static void Main (string[] args)

{
new GladeApp (args);
}

public GladeApp (string[] args)
{

Application.Init();

Glade.XML gxml = new Glade.XML (null, "gui.glade", "window1", null);
gxml.Autoconnect (this);

button1.Clicked += OnPressButtonEvent;

Application.Run();
}


[Glade.Widget]
Button button1;

[Glade.Widget]
Label label1;

public void OnPressButtonEvent( object o, EventArgs e)

{
Console.WriteLine("Button press");
label1.Text = "Mono";
}

}


Впоследствии мы увидим готовый код использования событий для объектов, указанных в gui.glade файле.

4.5.1 Ссылки и другие руководства для изучения


  • Gtk# Screencast (http://nat.org/demos/gtksharp.html) - Скринкаст Ната Фридмана, который ясно демонстрирует использование Glade с C#/Mono

  • Gtk# website (http://gtk-sharp.sourceforge.net/) - Оффициальный вебсайт Gtk#

  • Glade website (http://glade.gnome.org/) - Оффициальный вебсайт Glade

  • Glade# and Gecko# (http://developer.novell.com/wiki/index.php/Glade-Sharp_and_Gecko-Sharp) - Простое приложение, показывающее как сделать простой веб-браузер используя Gtk#, Glade# и Gecko#

  • Steticzilla (http://mysterion.org/~danw/blog/2005/03/steticzilla.html) - Скринкаст danw (http://mysterion.org/~danw/blog/) показывающий простую конструкцию Mozilla-основанного браузера используя Stetic

  • Glade - быстрая разработка приложений с Gnome2 (http://www.gotmono.com/docs/gnome/bindings/glade/glade.html) - Другое руководство по Glade#, включает детали как внедрять .glade файлы в .exe


P.S. Мигель де Иказа рассказывает о Mono: стеке, доступных языках - эффективности IronPython, Moma - Mono Migration Analysis Tool, Games, Second Life
TurboCharging Linux with Mono

01 сентября, 2007

Учитесь плавать, или На острове Mono

Небольшой экскурс для начинающих разработчиков. Из чего же состоит Mono? Давайте посмотрим, что в коробке.
Вы дожны знать как использовать программы коммандной строки для Mono программирования, в частности msc (Mono C# компилятор) и mono (виртуальная машина Mono, или интерпретатор байткода)

mcs

mcs это СиШарп'овский Mono компилятор. mcs может не только компилировать, но и внедрять ресурсы, а также связывать отдельные файлы проекта.

Для практического примера скомпилируйте следующий исходный код:

public class HelloWorld {
public static void Main (string [] args) {
System.Console.WriteLine ("Hello, Tuxedo Live");
}
}


Делается это просто:

~$ mcs Hello.cs

В итоге получиться байткод файл Hello.exe. Да, как уже говорилось раньше, программы компилятся не в конечный исполняемый файл, а именно в промежуточный байткод Common Intermediate Language (CIL).

mono

Комманда mono исполняет скомпиленую программу виртуальной машиной. mono использует JIT компилятор для перевода CIL байткода в машинный язык перед его исполнением.
Hello.exe может быть исполнен так:
~$ mono Hello.exe

monop

Эта команда очень полезна, если Вам необходимо быстро проверить какой вид имеют классы и методы
Можно сделать это так:
~$ monop System.Byte

monodoc

Как можно было уже догадаться, это документация по всем программным интерфейсам (API) Mono.

gacutil

Для установки библиотек в Linux мы используем место /usr/lib, в виндозе - C:\Windows.
gacutil призвана управлять содержимым GAC (Global Assembly Cache). Системные сборки сохраняются именно в глобальный кэш.
Листинг всех сборок можно получить коммандой
~$ gacutil -l

P.S. Для тех, кто переходит с Java на C# рекомендую заглянуть сюда:
Сравнение C Sharp и Java - Википедия

P.S.S. Интересно как будут складываться дела Sun Microsystems после открытия исходного кода jvm. Опять же holy wars: .NET vs Java. Вопрос времени или силы хватки монстров IT?

22 июля, 2007

KLone: каркас для web-программирования на языке C.

KLone - это фреймворк для программирования веб-приложений, который расширяет простой HTML языком С, и помещает весь код на сервере в один бинарный файл.

.deb пакет
KLone доступен в Debian GNU/Linux 4.0 "Etch" и Ubuntu Linux "Edgy", "Feisty Fawn", "Gutsy Gibbon".
~$ apt-get install klone-package


PHP очень популярен своим стилем программирования, смешиванием HTML с исходным кодом, заключенным в теги <?php ... ?>. Существует множество инструментов и каркасов для веб-программирования на других языках, таких как Perl и Python, совершенно удивительный выбор языка программирования, который вы можете использовать взамен вышеперечисленных, называется C.

Посмотрим на пример как создать простое веб-приложение.

Создадим директорию, в которой будем работать.
~$ make-klone-project create -p myhello
~$ cd myhello-0.1

В директории проекта будет храниться несколько файлов и директорий . Одна из важнейших папок будет Debian/, в которой будут храниться файлы для генерации .deb пакета, содержащего веб-аппликацию. К этому вернемся чуть позже. Сейчас же давайте сосредоточимся на другой интересной директории userdata/.
~$ cd userdata
~$ mkdir etc
~$ cd etc

Создаем файл kloned.conf и редактируем его.
~$ nano kloned.conf



server_list my_http
allow_root yes

my_http
{
type http
addr.type IPv4
addr.port 8880
dir_root /www
}


Теперь мы готовы приступить к созданию непосредственно нашего приложения.

$ cd ..
$ mkdir www
$ cd www


Создаем и редактируем файл index.kl1. Любой файл с расширением .kl1 будет относиться к HTML/C приложениям.

~$ nano index.kl1


<%!
#include
time_t now;
%>
<html>
<head><title>Hello World</title></head>
<body>
<h1>Hello World</h1>
<br>
<%
now = time(0);
io_printf(out, "Time is now %sn", ctime(&now));
%>
</body>
</html>

Теперь вернемся к корневой директории проекта и создадим kloned сервер:

~$ kloned-build -o myapp userdata
~$ ./myapp -F

Сервер не запускается как демон, поэтому пользуем параметр -F. Теперь Вы можете посмотреть веб-аппликацию с помощью браузера @ http://localhost:8880/. Вы увидите текущую дату :) Это еще не все. Остановите аппликацию, которую Вы только то запустили, запустите ~$ apt-get install dpkg-dev, далее:


~$ dpkg-buildpackage -rfakeroot
~$ sudo dpkg -i ../myhello_0.1*deb

Вы только что установили .deb пакет, который содержит веб-аппликацию =)

Еще примеры

Если Вы хотитет увидеть больше примеров использования KLone'а, посетите сайт KoanLogic'а.