понедельник, 29 октября 2007 г.

Опыты со SWIG'ом: C++ код и Ruby

Недавно у меня возник вопрос, как скрестить C++ и Ruby, а именно - есть С++ либа, хотелось бы использовать ее из Ruby. Покопавшись немного в инете, нашел статью "Использование C и Ruby", откуда стало ясно, что основные способы создания расширений для Руби - использование Ruby API (ruby.h, rubyio.h, intern.h) и утилита SWIG. Для начала решил попробовать SWIG.

SWIG на основе С и С++ интерфейса генерит код для расширений к другим высокоуровневым языкам (причем не только к скриптовым). На входе получает файл интерфейса .i, на выходе - С или С++ код.

В качестве примера берем такой код:

Создаем интерфейсный файл test.i:

Тепер на основанни этого файла можно сгенерить код расширения для Руби:

swig -c++ -ruby test.i

Очевидно, что -ruby указывает целевой язык.

Ключ -с++ указывает на то, что исходный код написан на с++. Если этого не указать, то может вылезти ворнинг типа: "test.i:7 Warning(301): class keyword used, but not in C++ mode.", файл получится с расширением .c и в дальнейшем возникнут проблемы с его сборкой.

Для указания имя модуля можно использовать либо ключ -module либо в интерфейсном файле добавить строку %module name.

Результат выполнения команды файл test_wrap.cxx. Получить необходимую библиотеку из него можно двумя способами - создать скрипт, генерящий make-файл или собрать в ручную. В ручную это будет выглядеть подобным образом:

Скрипт, создающий Makefile, будет выглядеть так:

В итоге получилась библиотека test.so. Осталось посмотреть, как это будет работать в Руби:

В принципе ничего сложного.

Интересно что получится, если type_t определить как std::string... Все описанные выше манипуляции прошли нормально, но вот тест не пошол, в месте require 'test' выводит ошибку 'LoadError'. Просто так не получается, но SWIG предоставляет механизм typemaps - трансляция С/С++ типа в тип целевого языка, т.е. теоретически можно использовать контейнеры STL в коде, который будет использоваться Руби, но это оставлю до следующего раза.

Read More...

вторник, 23 октября 2007 г.

Неизвестный Киев: Киево-Печерская крепость, Госпитальное укрепление

На прошлой неделе просматривал экскурсии на сайте "Интересный Киев" и узнал о существовании Киево-Печерская крепости. Крепость включает в себя:

  • Старая Печерская крепость, цитадель (А);
  • Васильковское укрепление (Б);
  • Госпитальное укрепление (В);
  • Зверинецкое укрепление (Г);
  • Лысогорский форт (Д);
  • северный фас крепости(оборонительные казармы, мастерские, подпорные стенки) (Е).


"Интересный Киев" организовывал экскурсию в Госпитальное укрепление, которое находиться между метро Печерская и Кловская, на територии военного госпиталя. Госпитатьное укрепление уцелело практически на 100%!!! В центре города - огромная территории с оборонительными сооружениями, валами, рвами, стенами с бойницами, пушками на валах!



Самое поразительное, что вокруг - жилые дома!



Все-таки Киев - действительно удивительный город.



Госпитальные укрепления состоят из 5 или 6 капониров. Экскурсия предполагала посещение только 2-х. Самый интересный - Косой капонир, который был превращен в политическую тюрьму в 60-х годах 19 века. Здесь сидели и были расстреляны поляки - участники востания 1863 года.



Сейчас здесь музей - можно посмотреть камеры, в которых содержались заключенные, солдатскую форму, оружие, фотографии и т.д.



Помимо этого здесь находится музей Трипольской культуры (частная колекция).



Во втором капонире, который мы посетили - выставка, посвященная истории Киева и выставка фотографий крепостей.



Цены на вход в музеи просто смешные. Но людей практиччески нет. По началу мне показалось, что здесь только одна наша группа.



Вообщем 2 часа пролетели очень быстро. Здесь есть на что поспомотреть и сюда стоит сходить.



Некоторые ссылки по этой же теме:
Фото альбом Киев - Киевская крепость. Косой капонир
Крепости КИЕВА
Косий капонір
Косой капонир
Памятник-музей "Киевская крепость" (Косой капонир)



PS: один из капониров до сих пор еще не реставрирован и состояние его - плачевное:


Read More...

четверг, 18 октября 2007 г.

Рубиновые сокеты

Сокеты - это интерфейс для связи двух процессов. Процессы могут быть как локальные (на одной машине), так и распределенные. Сам сокет - это некий абстракный объект, являющийся конечной точкой соединения. С сокетом ассоциируются несколько понятий:

  • протокол (TCP, UDP, raw IP);
  • локальный IP адрес (к нему чему сокет привязывается при создании);
  • локальный порт (к нему чему сокет привязывается при создании);
  • удаленный IP адрес;
  • удаленный порт (используя эти параметры сокет конектится к удаленному сокету).

Сокеты реализуются с посредством библиотек, таких как Berkeley sockets (BSD sockets) или Winsock.

Ruby предоставляет свой инструментарий для работы с сокетами (на базе BSD sockets):

Работа с сокетами в Руби реализуется иерархией классов:

Из названий классов примерно понятно их назначение. BasicSocket - это абстрактный класс для всех сокетов. Методы этого класса ничем не оличаются от того, что можно увидеть в С++: accept, bind, listen и т.д. У BasicSocket есть методы класса (аналогия - статические методы С++) и методы объекта.

UNIXSocket - предоставляет IPC и использованием UNIX domain protocol (AF_UNIX).

UNIXServer - помогает создавать UNIX domain protocol серверы.

IPSocket - базовый класс для сокетов с протоколами, использующими IP (AF_INET).

UDPSocket и TCPSocket - классы для сокетов с UDP и TCP протоколами.

SOCKSSocket - помогает строить приложения, основанные на SOCKS-протоколе.

Socket - предоставляет доступ к лежажашей в основе всех сокетов реализации BSD Sockets API.

IO - базовый класс для операций ввода/вывода в Руби. При создании приложения с сокетами, полезным является метода IO#select( readArray [, writeArray [ errorArray [ timeout ] ] ] ) - ожидает, когда станут доступными данные с утройств ввода/вывода. Первый параметр метода - массив IO-объектов. Второй параметр - таймаут в секундах; если он равен nil, то ожидание происходит бесконечно.

Более подробно о классах и их методах можно почитать здесь: Sockets Programming in Ruby, The Pragmatic Programmer's Guide.

Создавать сокеты можно несколькими способами. Первый способ напроминает подход C:

В этом случает для создания используются методы класса Socket, с параметрами, характеризующими тип создаваемого сокета. Того же самого эффекта можно добиться вызывая методы конктерного класса:

Для удаления сокета используется метод close.

IP адреса в Руби могу быть представленны как в виде имени хоста, так и в виде '0.0.0.0':

Для сокетов можно устанавливать и получать параметры используя методы: getsockopt и setsockopt.

Простой пример использования сокетов:

Таким образом, работа с сокетами в Ruby не представляет большой сложности, особенно для тех, кто знаком с сокетами на С.

Read More...

среда, 17 октября 2007 г.

The GoF patterns in Ruby

I've just found implementation of the GoF patterns in Ruby with examples.

Read More...

вторник, 16 октября 2007 г.

Шпаргалка по созданию Makefile

Что такое Makefile? Makefile - это сценарий для утилиты make. Эта утилита помогает автоматизировать процесс компиляции проекта (проектов):

  • позволяет компилировать большие проекты, состоящие из большого количества библиотек;
  • определяет, что нужно компилировать (если файлы не изменялись, то не компилируются при очередной сборке проекта);
  • указывает необходимые опции компилятора (например, пути к файлам заголовков, оптимизация и т.д.);
  • выполняет дополнительный команды (например, удаление файлов);
  • поддерживает различными платформами и средами разработки.

По умолчанию утилита make считает, что файл сценариев называется Makefile, поэтому компиляцию можно запустить простым вызовом make в одной директории в Makefile. Если же имя файла сценария отличается, то нужно использовать явное указание его имени и ключ -f:

make -f prjmake.nmk

Makefile состоит из нескольких основных частей:
  • правила;
  • директивы;
  • переменные;
  • комментарии.

Начнем рассмотрение в обратном порядке списка - от простого к сложному.

Комментарии.
Комментарий обозначается символом '#'. Если нужно использовать символ '#' в другом контексте, то необходимо добавить обратный слэш: '\#'.

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

LIB = lib1.o lib2.o lib3.o

Название переменной задается в верхнем регистре (по негласному соглашению). Для получения параметров переменной используется смпользуются скобки и символ '
$(PATH)

Значение переменной может вычисляться рекурсивно:

PATH=$(PATH)/trunc

Либо можно использовать другую форму записи:

PATH+=/trunc

Некоторые переменные являются стандартыми константами, для них нельзя вычислять значение рекусивно. Такими перменными являются: CC (имя компилятора С), СХХ (имя компилятора С++), CFLAGS (параметры С компилятора), CXXFLAGS (параметры С++ компилятора).

Помимо переменных, определенных "писателем" файла, Make-файл предполагает использование автоматических переменных, значения которых вычисляются в контексте использования таких переменных (вычисление основывается на цели и зависимости правила - о целях и зависимостях ниже):
  • $@ - имя цели;
  • $$@ - имя цели, если его необходимо ввести в строке описания зависимости справа от двоеточия;
  • $< - имя первой зависомости;
  • $? - имена всех зависимостей (с пробелами) которые новее, чем цель;
  • $^ - имена всез зависимостей с пробелами;
  • $* - имя текущего предусловия за вычетом суффикса;
  • $% - имя соответствующего .о файла, если текущей целью является файл библиотеки;
  • $** - только для nmake - внутри правила обозначаются все зависимости, оказавшиеся справа от двоеточия;
  • D - часть имени внутренних макроопределений, описывающая директорию файла (допустимые варианты применения: $(@D), $$(@D), $(
  • F - часть имени внутренних макоопределений, описывающая собственно имя файла (допустимые варианты прменения: $(@F), $$(@F), $(
  • B - часть имени внутренних макроопределений, описывающая базовое имя файла (без диска, директориии и расширения);
  • R - часть имени внутренних макроопределений, описывающая полный путь к файлу за вычетом расширения.

Директивы.
Директива - это команда для make с указанием, что делать в процессе чтения make-файла. Может выполнять такие действия:
  • подключать другие make-файлы;
  • принимать решение какие части файла использовать, а какие игнорировать (в зависимости от значения переменных);
  • определение значений переменных.

Поключать другие make-файлы можно директивой include. Она указвает утилите make, что нужно приостановить чтение текущего файла и прочитать указанные файлы:

include filenames...

Если фала не существует - выводиться ошибка. Для отключения сообщени об ошибке, к директиве добавлятеся префикс '-':

-include file1

Решение о том, какие части make-файла использовать, а какие игнорировать, примается на основе условий, синтаксис которого имеет вид:

Например:

Определить значение перенной можно при помощи дериктив define... endef:

В этом случает значение переменной two-lines = echo foo; echo $(bar)

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

Здесь targets - имена файлов-результатов, разделенные пробелами; так же может быть действие не связанное с процессом компиляции, например, clean. prerequisites - зависимости, то, от чего зависит создание targets. command - комманда, которая выполняется для получения targets; может быть не одна; перед командой обязательно ставиться табуляция.

Существуют несколько фиктивных целей:
  • all - выполнение работы по достижению всех частных целей, перечисленных ниже;
  • build - компиляция и сборка всех устаренших (невыполненных) целей/файлов;
  • clean - удаление всех файлов, кроме исходных;
  • docs - подготовка документации и размещение таких файлов в соответствующих системных директориях;
  • examples - компиляция и сборка примеров;
  • install - работа, по размещению всех готовых частей проекта в соответствующих директориях.

В именах файлов могут использоваться wildcards:

objects = *.o

Пример использования правил:

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

Если бы в предыдущем примере mytest зависел от нескольких o-файлов, то шаблонное правило можно было бы записать так:

Некоторый ключи компилятора:
-I"path/to/include" - директория со списком хидеров.
-Wall-Werror - вывод варнингов.
-O1, -O2, -O3 - оптимизация.

Некоторые ключи сборки:
-llibrary - указывает линковшику использовать библиотеку library при сборке программы.
-s - не включает симольные таблицы и информацию о размещении функций в испольняемый файл. Использование этого ключа позволяет существенно ужать исполняемые файлы.
-L"path/to/libs" - директория с библиотеками.
-static - статическая компоновка библиотек.

Больше почитать о Makefile можно здесь: Writing Makefiles

Об опциях компилятора можно почитать здесь.

Read More...

понедельник, 15 октября 2007 г.

Muse in Kiev

Muse Live in Kiev - one more video, bad quality but good sound:

Read More...

C + Ruby

It is no secret that Ruby sends messages to invoke methods. So it much slower than in C. If you need speed in accessing instance variables and invoking methods you can use CplusRuby:


With CplusRuby you can define custom C structures from within Ruby and wrap them easily in a Ruby class. You can as well define C functions that can access this structure easily. CplusRuby generates setter/getter methods for every property and wrapper methods for the C functions.

The purpose is speed! The C functions can access the C-structure, which is much faster than accessing instance variables. Also, the C functions can call each other directly. This is *much* faster than invoking a method in Ruby. As wrappers are generated, the Ruby-side can access all C-structures and functions as well.

Read More...

воскресенье, 14 октября 2007 г.

Reading C type declarations

Article Reading C type declarations intends to describe how read difficult C statements such as

Read More...

Muse в Киеве

Не смотря на угрозу отмены, концерт Muse вчера все же состоялся.



Билеты были не дешевые (в 1-ю фан зону я покупал за 200 грн, а в секторах сидячие места стоили до 500 или 550), но людей собралась огромное количество. Вместимость Дворца спорта - 10000, как мне показалось, людей пришло не меньше. Стоять порой было возможно только прыгая на одной ноге.



Концерт начался после часовой задержки и продолжался около полтора часа. Список песен (взят отсюда):

1. Take a Bow
2. Hysteria
3. Map of the Problematique
4. Butterflies & Hurricanes
5. Supermassive Black Hole
6. Feeling Good
7. Sunburn
8. Apocalypse Please
9. Soldier's Poem
10. Invincible
11. Starlight
12. Time Is Running Out
13. New Born
14. Stockholm Syndrome

На бис:
15. Plug In Baby
16. Knights of Cydonia


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

После Sunburn'a, плавно переходящего в Apocalypse Please (хотя может я перепутал), Matthew Bellamy сбил ногой какую-то фиговину ( это оказался усилитель) с лампочками с колонки, а потом отдал ее на растерзание толпы.

Было много световых эффектов, звук был отличный, во время Plug In Baby по традиции пустили огромные шары с конфетти. Получил от концерта только положительные впечатления, сорванный голос и обтоптанную обувь :)

ЗЫ: фотки мона глянуть тут: ФОТО MUSE в Киеве, blah-blah-MUSE, Muse в Киеве, почитать Київ 13 жовтня 2007 року

ЗЫ2: видео к концерта, где происходит инцидент Мэтью с усилителем:


Read More...

вторник, 9 октября 2007 г.

Software Engineering Radio

Software Engineering Radio - The Podcast for Professional Software Developers.

Здесь собраны и постоянно обновляются записи разговоров с девелоперами о девелопменте. Файлы в среднем по 40-50 метров. К некоторым прилагаются слайды и ссылки на источники по теме.

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

В дополнение можно посмотреть лекции университета Беркли (Berkeley).

Read More...

С++ под капюшоном

C++ under the hood - в этой доке один из сотрудников микрософта рассказывает как устроен С++ изнутри (Microsoft Visual C++), т.е. размещаются в памяти классы, наследование, виртуальное наследование, виртуальные функции и т.д. Полного представления об реализации С++ (Microsoft Visual C++) она не дает, но отвечает на некоторые вопросы которые любят спрашивать на собеседованиях и в brainbench.

Read More...

четверг, 4 октября 2007 г.

Тираж закончился. Оставьте заявку...


Тираж закончился. Оставьте заявку. Мы постараемся отыскать эту книгу для Вас, немедленно известив Вас об этом...

Недавно решил купить книгу Шаблоны C++: справочник разработчика. Захотелось полистать бумажный вариант. Оказалось, что поздно опомнился. Когда услышал на Петровке, что такой книги больше нет, вся продана - не поверил. Стал искать по интернет магазинам - таже ситуация. Есть только на российских сайтах и вроде как есть во Львове. Посмотрел, что тираж у нее всего 5000 экз (хотя встречалась и цифра 3000). Значит все уже раскупили. Но у Страуструпового Язык программирования C++. Специальное издание тираж такой же и встречается в купленном виде намного чаше. И вообще, 3000-5000 экземпляров - это нормальный тираж для книг по программированию. Может их изымают и сжигают? Фигня какая-то. Надо купить, пока до Львова не добрарилсь :)

Read More...

среда, 3 октября 2007 г.

Ruby-гуру со всего мира о Ruby

Здесь можно почитать что думаю о Руби программисты из разных стран мира: Advice For Ruby Beginners

Read More...

вторник, 2 октября 2007 г.

Временно бесплатная книга по Ruby on Rails

60 дней будет доступна в pdf формате книга Build Your Own Ruby on Rails Applications на сайте SitePoint

Read More...

В российский школах будет своя ось

Шутка о то, что в России планируется разработать специальную ось для школ, были известна уже давно. Теперь это уже не шутка, а реальная угроза для учителей и школьников: Россия выбирает третий путь

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

Поэтому будет писаться своя ось, свой софт... Мы не ищем легких путей :)))

Read More...

Программистские видео лекции

В дополнении к книгам, можно посмотреть лекции по программированию на C++, Java, Perl, Python и т.д. Programming Language Video Lectures

Read More...

Программистские онлайновые книжки

Your Book Case. Preview The Book You Want To Buy. Тут есть такие интересные книжки как:

C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond

CPP Coding Standards 101 Rules Guidelines and Best Practices

и т.д.

Read More...

Циклы в Руби

На первый взгяд, Руби предоставляет не большой набор встроенных конструкций для создания циклов. Здесь нет привычного for(i=0;i < N;i++), только while и until.

while выполняет до тех пор, пока выражение равно true. until выполняется пока выражение не станет равно true.

Цикл можно описывать в одной строке, переместив проверку условия в конец строки:

Для управлением цикла из нутри самого цикла существуют такие конструкции как break (прервать выполнение цикла), redo (выполнить итерацию сначала, без вычисления условия или перехода к следующему итератору), next (прервать текущую итерацию и перейти к следующей) и retry (цикл выполняет заново с самой первой итерации).

Но это далеко не все, что предоставляет Руби для сознания циклов. Циклы можно создавать используя итераторы и методы классов. Например:

Кроме того, в Руби есть встроенный итератор loop:

Есть еще конструкция for .. in ..:

Read More...

понедельник, 1 октября 2007 г.

Один Vim, много файлов

Являсь мощным текстовым редактором, vim позволяет с помошью одной командной строки сделать столько, сколько другие редакторы не могут позволить сделать с помошью мыши и шаманского бубна. Например работа с несколькими файлами. Для открытия в vim нескольких файлов достаточно в командной строке написать:

vim file1 fill2

Перемещаться по открытым файлам можно будет с помощью команд :n (вперед), :prev (назад). Это самый простой способ.

vim позволяет разбивать окна:



Для этого есть команды :split (горизонтальное разбиение) и :vsplit (вертикальное разбиение). Если просто выполнить команду без параметров, то текущее окно равномерно разобъется на 2 окна с одинаковым содержимым. Для просмотра двух файлов одновременно, можно либо указать имя файла после команды (:split filename) либо перейти в нужное окно и открыть файл командой :e filename. В обоих случаях файл будет открыт и доступен для редактирования.

Если необходимо открыть файл только для просмотра, можно использовать команду :sview filename.

Для перемещения между окнами используется комбинация: ctrl+w (double w).

По умолчанию окно разбивается пополам, но можно указать размер в строках первого из разбиваемых окон :Nsplit, где N - размер в строках.

Разбивать файлы на отдельный окна можно еще при открытии:

vim -o file1 file2 file3

Параметр -o - горизонтальное разбиение, -O - вертикальное. Так же можно указать сколько разбиений будет, добавив количество к одному из этих параметров:

vim -o3 file1 file2

После запуска, окно будет разбино на 3 части, третья из которых будет пуста.

И еще одна полезная возможность - сохранение текущего сеанса, со всеми сплитами, путями к открытым файлам и т.д. Команды :mksession name и :mkview name - сохраняют текущую сессию. Каманды :source name и :loadview name - востанавливают соответственно (созданные предыдущими командами скрипты открывают нужные файли и, если надо, сплитят окно).


Больше узнать об этом всем можно спросив в самого вима :help split.

Read More...

gdb links

Пара ссылок на доки по gdb:
- Debugging with GDB (объемная дока по всему, что умеет отладчик; дока поддерживается разработчиками gdb)
- Отладка с помощью GDB (то же самое, но на русском и не обновлялось с марта 2000)

Read More...

Посещение "Водно-информационный центра"

Недалеко от арки Дружбы народов в Киеве, в Хрещатом парке, находиться Водно-информационный центр - две башни, похожие на пожарные вышки. Этим вышкам уже больше 130 лет. Внизу между ними на глубине 5 метров находиться помещение, в котором раньше был резервуар для воды. В этом резервуаре и организована выставка всего, что связанно с водой.



В самом начале можно увидеть макет центра Киева 130 лет назад, с указанием всех путей перемещения воды (от Днепра к двум водонапорным башням, от башен - к потребителям) и речной аквариум с рыбами из Днепра.



Основная часть экскурсии начинается со спуска в лифте на неизвестную глубину, наблюдая в окошко различные слои земли (в конце экскурсии оказалось, что лифт стоял на месте). Сама выставка состоит из схем процессов выполняемых с участием воды,



предметов быта, связанных с водой,



канализационного коллектора с мусором и чучелами крыс,



всяких приборов,



небольшого кинотеатра,



аквариума с карпами, которых можно гладить.



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

Read More...