If a C programmer asks "do you want to see something cool?", run away.
--John Van Enk

Monday, December 17, 2007

gOS goes live


Событие уже давнее конечно, но все равно считаю нужным о нем написать. Итак, встречайте - gOS!!!
Да, да... еще один дистр линуха...
Однако не все так просто, как кажется на первый взгляд. Что вы скажете например об Everex gPC всего за 199$? Отличный выбор, если вам необходим недорогой офисный компьютер с доступом в интернет. Помимо набора офисных средств, в состав ОС включены средства, для работы с популярными веб сервисами. В общем я понимаю, что сейчас еще одним дистрибутивом никого не удивишь, да и случай продажи компьютеров с предустановленным линуксом уже не первый (первыми были Dell кажись), но все равно приятно. Подробности можно почитать здесь и здесь.

Friday, December 14, 2007

Возвращение джедая

Последние две недели прошли в бегах по универу, посему до того чтобы написать что-либо осмысленное руки ну совсем не доходили. Разве что так - общие мысли, да дополнил слегка пост о полезных ресурсах по С++.

Поковыряв boost::any, проникся подходом к реализации - действительно интереснейший способ, который подробно описан в статье "Valued Conversions" by Kevlin Henney. Везде, где только можно, этот класс использовать не получится, так как кастовать каждый раз - слишком накладно (хотя я не замерял, но думаю, что накладно по времени выполнения будет). Подобный же подход можно использовать и для реализации any_function.

Кроме того, надыбал интересную статейку про реализацию Properties in C++. В отличие от этой "Properties in C++", опубликованной в блоге Raider's Programming Blog, здесь используется подход, когда mutator & accessor являются параметрами шаблона, что на мой неискушенный взгляд удобнее, так как нет никакой необходимости менять их в рантайме. Единственное, что неудобно, так это то, что напрямую не поддерживаются такие операции как например ++ .

В общем классы any_function и property мне бы пожалуй пригодились, так, что попробую, наверное, их реализовать. Пока что все.

Tuesday, November 20, 2007

Зачем мне нужен any_fun_ptr

В предыдущем посте, я высказался о том, что хочу эдакий generalized callback, который мог бы указывать на любую функцию. Возникает вопрос, а зачем это мне? Попробую для начала сделать некоторое введение, которое, надеюсь, немного прольет свет на эту проблему.
Давайте рассмотрим простенький калькулятор, поддерживающий 26 переменных (a-z), операции +, -, *, / и скобки, имлементированный при помощи парочки Flex/Bison и с целевым языком С++. Как я уже когда-то писал, для начала необходимо сделать небольшой workaround для того, чтобы состыковать парсер, сгенерированный бизоном, и лексер, сгенерированный флексом. Для этого используется класс наследник от yyFlexLexer.
файл lexer.h
#ifndef _LEXER_DERIVED_CLASS_H_
#define _LEXER_DERIVED_CLASS_H_
#ifndef __FLEX_LEXER_H
#undef yyFlexLexer
#include <FlexLexer.h>
#endif
#include <iostream>
#include <parser.h>
namespace calc{
class Lexer:public yyFlexLexer {
int yylex();
Parser::semantic_type* yylval;
Parser::location_type* yylloc;
public:
Lexer( std::istream*src = 0,std::ostream* out=0 );
virtual ~Lexer();
Parser::token_type operator()
(Parser::semantic_type* lval, Parser::location_type* lloc=0);
void LexerError(const char* msg);

};
}
#endif

файл лексического анализатора - lexer.lpp
%option 8bit
%option noyywrap
%option noyylineno
%option caseful
%option c++
%option yyclass="calc::Lexer"
%option pointer
%{
#include <lexer.h>
%}

%%

[a-z] {
yylval->var = *yytext - 'a';
return Parser::token::VARIABLE;
}

[0-9]+ {
yylval->number = atoi(yytext);
return Parser::token::INTEGER;
}

[-+()=/*\n] { return *yytext; }

[ \t] ; /* skip whitespace */

. LexerError("Unknown character");

%%
namespace calc{

Lexer::Lexer( std::istream*src,std::ostream* out ):yyFlexLexer(src,out){}

Lexer::~Lexer(){}

Parser::token_type Lexer::operator()
(Parser::semantic_type* lval, Parser::location_type* lloc){
yylval=lval; yylloc=lloc;
return Parser::token_type(yylex());
}

void Lexer::LexerError(const char* msg){
std::cerr<<"Error: "<<msg<<std::endl;
}

}

файл синтаксического анализатора - parser.ypp
%skeleton "lalr1.cc"
%name-prefix="calc"
%parse-param {calc::Lexer& yylex}
%define "parser_class_name" "Parser"
%{
#ifdef yylex
#undef yylex
#endif
namespace calc{
class Lexer;
};
%}
%union{
int number;
char var;
}
%{
#include <lexer.h>
#include <iostream>
int sym[26];
%}
%token <number> INTEGER
%token <var> VARIABLE
%type <number> expression
%left '+' '-'
%left '*' '/'

%%

program:
program statement '\n'
| /* NULL */
;

statement:
expression { printf("%d\n", $1); }
| VARIABLE '=' expression { sym[$1] = $3; }
;

expression:
INTEGER
| VARIABLE { $$ = sym[$1]; }
| expression '+' expression { $$ = $1 + $3; }
| expression '-' expression { $$ = $1 - $3; }
| expression '*' expression { $$ = $1 * $3; }
| expression '/' expression { $$ = $1 / $3; }
| '(' expression ')' { $$ = $2; }
;

%%
void calc::Parser::error (const location_type& loc, const std::string& msg){
std::cerr<<"Error: "<<msg<<std::endl;
};

main
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>
#include <lexer.h>
#include <parser.h>
using namespace std;

int main(int argc, char *argv[])
{
calc::Lexer lexer(&cin,&cout);
calc::Parser parser(lexer);
parser.parse();
return EXIT_SUCCESS;
}


А теперь допустим, что мы захотели, чтобы калькулятор поддерживал еще и некоторые функции, скажем sin, cos, tan, atan, atan2 и иже с ними.

Можно решить это в лоб:
в лексере написать

.................
sin { return Parser::token::SIN;}
.................
atan2 { return Parser::token::ATAN2;}
.................

а в парсере

.................
expression:
INTEGER
| VARIABLE { $$ = sym[$1]; }
| expression '+' expression { $$ = $1 + $3; }
| expression '-' expression { $$ = $1 - $3; }
| expression '*' expression { $$ = $1 * $3; }
| expression '/' expression { $$ = $1 / $3; }
| '(' expression ')' { $$ = $2; }
| SIN '(' expression ')' { $$=sin($3);}
| COS '(' expression ')' { $$=cos($3);}
.................
| ATAN2 '(' expression ',' expression ')' { $$=atan2($3,$5);}
;
.................


А можно и по другому:
в лексере написать

.................
func ([a-zA-z]+)([0-9]*)
%%
{func} {
yylval->func_ptr = &func_map[yytext];
return Parser::token::FUNC;}

а в парсере

.................
%union{
int number;
char var;
any_fun_ptr* func_ptr;
}
%%
.................
expression:
INTEGER
| VARIABLE { $$ = sym[$1]; }
| expression '+' expression { $$ = $1 + $3; }
| expression '-' expression { $$ = $1 - $3; }
| expression '*' expression { $$ = $1 * $3; }
| expression '/' expression { $$ = $1 / $3; }
| '(' expression ')' { $$ = $2; }
| FUNC '(' expression ')' { $$=$1($3);}
| FUNC '(' expression ',' expression ')' { $$=$1($3,$5);}
;
................



Сам же func_map может быть, например, банальным std::map<std::string, any_fun_ptr> func_map;
А адреса функций заносятся в него при старте скажем.
Вот собственно несколько упрощенное описание того, зачем это может быть нужно.

Monday, November 19, 2007

any_fun_ptr

Хочу такую вещь
any_fun_ptr pfun = &sin;
double res = pfun(M_PI);
pfun=&printf;
pfun("Result %f",res);
Пошел курить "Шаблоны С++" и Александреску, авось че нить придумается.

Thursday, November 15, 2007

Блоговщина!!!

У меня сегодня праздник - блогу исполнился 1 год. Подвести некоторые итоги надо чтоль.
Итак
  • в номинации "Самая Популярная Статья" места распределились следующим образом
    1. std::string vs. const char* . Comparison - 229 просмотров
    2. "Must Read" C++ Books - 149 просмотров
    3. Flex & Bison C++ Interoperability Continued - 95 просмотров

  • в номинации "Самый Популярный Бразуер" победила огненная лиса.

  • в номинации "Самый Популярная ОС" победила самая популярная ОС.

  • в номинации "Страна Где-Меня-Больше-Всего-Читают" победила Россия (732 посещения), за ней Украина (588 посещений) и Беларусь (66 посещений)
  • в номинации "Город Где-Меня-Больше-Всего-Читают" победила Москва (282 посещения), за ней Киев (238 посещений) и Харьков (181 посещение)
  • мне очень любопытно было узнать, что 15,46% посетителей приходит из закладок (вот уж выразился), 46,16 % по ссылкам с других блогов или сайтов и 38,37% через поисковики. Причем 34 поисковых запроса - это "linux mobile", 25 - "std::string" и 20 - "deepencpp.blogspot.com".
Ну в общем я наверное немного приврал и это нельзя назвать статистикой за год, так как Google Analitycs я прикрутил к блогу только 8 Августа. Но примерную каритину кажись обрисовал. Ах да... я завел еще один блог, на сей раз общетематический, так как чувствую, что в рамках этого блога мне тесновато, да он и так в оффтоп залез - вон сколько мыслей на сайдбаре в метках. Посему этот блог остается посвященным IT-тематике, а в этом, я буду писать обо всем.
Вотъ такъ.

Wednesday, November 7, 2007

Gphone не будет?

В блоге Google опубликовали статью Where's my Gphone? В ней говориться, что не смотря на многочисленные спекуляции по поводу Gphone в последние несколько месяцев, анонса нового телефона от Google не будет (во киберсквоттеры то расстроились небось, - зря домены регистрировали). Однако в то же время анонсируется Open Handset Alliance и открытая платформа Android для мобильных устройств на основе Linux-ядра. 12 ноября этого года обещают сделать доступным для скачивания SDK. Платформа по заверениям обещает быть довольно удобной как для разработчиков так и для конечных пользователей устройств.

Захотел проследить, а не тянется ли эта ниточка еще куда нубудь? Воспользовался все тем же поиском Google и как оказалось 17 августа 2005 года многие новостные сайты опубликовали статьи о покупке Google компании Android Inc (сейчас сайт компании редиректит на Open Handset Alliance). Сама покупка произошла вроде бы в июле, за сумму, которая не разглашается.

Вообще развитие персональных средств связи видится мне несколько по иному - я бы хотел просто иметь небольшое устройство с достаточно большим (относительно размеров самого девайса) сенсорным экраном и доступ к высокоскоростной сети в любой точке страны. Все остальное - sms, mms, протоколы и прочее - забота софта. Как звонить? Скайпом (skypephone уже есть). И всех делов то. Не было бы различных тарифов на звонки, sms, и прочую чепуху. Просто платить за трафик или покупать безлимитный пакет. Это было бы круто. А вы как думаете?

Upd: рекомендую почитать еще Google to unveil 'Android' phone software, там очень тольковые мысли приводятся...

Tuesday, November 6, 2007

О чем молчит printf

Недавно, читая книгу Диомидиса Спинеллиса "Анализ программного кода на примере проектов Open Source", узнал что функция printf возвращает результат - количество фактически выведенных символов. Посмотрел в мане и стандарте на язык С - таки да "The printf function returns the number of characters transmitted, or a negative value if an output or encoding error occurred". А я то всегда думал что она void. И практически повсеместно встречал ее использование без проверки возвращаемого значения. К чему это может привести? Это может привести к тому, что в ходе выполнения программы может возникнуть ошибка, которая пройдет незамеченной (в лучшем случае).
Вообще все функции вывода - в частности, при перенаправлении стандартного потока вывода в файл - могут завершиться аварийно по целому ряду причин:
  • на устройстве, куда перенаправляется вывод, может не хватить свободного места
  • может исчерпаться квота пользователя на объем дискового пространства
  • процесс может попытаться записать файл, который превысит максимально допустимый для этого процесса или системы объем
  • на устройстве может произойти аппаратная ошибка
  • дескриптор файла или потока, ассоциированного со стандартным потоком вывода, может оказаться не разрешенным для записи
Без проверки успешности вывода программа может тихо и незаметно рухнуть с потерей всех выводимых данных. Однако проверять результат каждой операции вывода - неудобно, поэтому зачастую используется компромиссный подход - проверка ошибок вывода в поток перед завершением программы. В языке С для этого есть функция ferror:

if (ferror(stdout))
err(1, "stdout");


Функция err - это нестандартное BSD расширение для выдачи форматированных сообщений об ошибках.

Так, что подобные очевидные моменты не стоит недооценивать...

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

Thursday, November 1, 2007

Бунтарь

Вчера прочел книгу Джеффри С. Янга и Вильяма Л. Саймона "iКона: Стив Джобс".
В аннотации говорится: "Эта книга о самом поразительном человеке в современной истории бизнеса – Стиве Джобсе – великом предпринимателе эпохи высоких технологий, известном своим индивидуализмом, инакомыслием и бунтарским характером. Авторы подробно описали головокружительный взлет молодого человека, очень рано добившегося успеха, и последовавшее за этим стремительное падение, во время которого Стив был изгнан не только из Apple, но и из компьютерной индустрии вообще. Эта книга приобрела скандальную известность еще на этапе ее подготовки к печати. Получив экземпляр рукописи для ознакомления, компания запретила продавать во всех магазинах Apple книги издательства Wiley&Son. Такая реакция не повлияла на желание издательства опубликовать это произведение. Книга будет интересна тем, кто хочет узнать, как происходило формирование, становление и развитие современной эры цифровых технологий под влиянием самой значимой фигуры современности – человека, кардинально изменившего три отрасли – индустрию кино, музыки и компьютеров, – Стивена Джобса."

А теперь мои впечатления. Если вкратце - то я остался очень доволен прочтением книги. В ней не только рассказывается об истории становлении компаний к которым приложил руки Стив - Apple, NeXT, Pixar, но и о нем самом. Причем авторы, по видимому, старались взглянуть на эту неординарную личность под разными углами. И как мне показалось им это удалось достаточно хорошо. Стив в книге приедставлен не только как бунтарь-перфекционист, оказавший огромное влияние как на развитие не только отрасли персональных компьютеров, индустрии музыки и компьютерной анимации, но и не обделены вниманием некоторые негативные моменты, имевшие место в его жизни и деятельности. Как то присвоение себе чужих заслуг и, кроме всего прочего, он долгое время отказывался от признания себя отцом (потом правда исправился). Через всю книгу красной нитью проходит становление Стива, как личности. Отдается должное его способностям очаровывать людей.

Отдельного упоминания
заслуживает перевод книги - выше всяческих похвал. Хоть мне и не довелось читать книгу в оригинале, но в переводе она читается на одном дыхании, оторваться просто не возможно. Такие книги я отношу к категории "постоянно читаемых", т.е. как только ее прочитал, хочется открыть сначала и перечитать заново. Только некоторым авторам удавалось вызвать у меня подобные ощущения. Один из них - Жюль Верн.

Странно, но факт - Билл Гейтс, оказавший, наверное, не меньшее влияние на развитие отрасли постоянно упрекается миллионами пользователей. Стив же - стал чуть ли не идолом, рок-звездой компьютерных технологий. По моему это явление имеет место и благодаря слову, написанному в заголовке данного поста. Чем в большей степени его можно применить к человеку, тем больше люди склонны его превозносить. А все почему? Человек - существо социальное, многим нужен лидер, который сможет принимать решения и вести за собой массы - эдакий Моисей современности. И человек, который своим собственным примером показал, что большинство может ошибаться, а он, считая себя правым, добивается незаурядных результатов тем самым приобретает в глазах остальных некий волшебный ореол. За ним пойдут люди. Стив однажды сказал фразу, которую назвали фразой Терминатора: "Мы вернемся". И, насколько я могу судить, это сейчас как раз и происходит. Но Apple, не просто возвращается, она уже пришла на рынки, о которых раньше и речи быть не могло. Каждый хочет быть особенным, отличаться от остальных. Пожалуй это один из факторов, заставляющий приобретать продукцию Apple, использовать Linux, BSD системы. Это позволяет выделиться, сказать "Посмотрите! Я использую Mac (Linux, BSD -нужно подчеркнуть). А не какой-то там .... (вставить нужное)". Естественно, что предоставляемый функционал тоже имеет не последнее значение. Однако принадлежность к касте "избранных", "не-таких-как-все-остальные" имела, имеет и будет иметь о-о-очень большое значение.

Monday, October 29, 2007

Вставай страна огромная, великая страна... Блоггеров ;-)

Нет, вы только посмотрите что твориться!!!! Некто НЕИЗВЕСТНЫЙ, зарегал домен tdstir.com, залил на него Wordpress, и тырит контент с программистских блогов через RSS-ленты повидимому. Домен анонимный, хостинг - американский. Я там встретил несколько постов украденых с блога Тру Программиста и Groking Ruby. Предлагаю объединиться и что-то сделать с этим. Например загуглбомбить ;-). Предложения и обсуждения - велкам в комменты к этому посту.

Go Ahead!

Проанализировав результаты профессионального роста с апреля по октябрь решил написать для себя некоторое подобие TODO list, т.е. чего нужно почитать, изучить, освоить и подтянуть, до конца февраля месяца. Почему именно до февраля? Да просто потому, что именно в феврале у меня защита диплома и я распрощаюсь с родной АльмаМатер (наконец-то!!!). Следовательно, неплохо было бы подрасти ;-)
Посему, для достижения данной цели необходимо расставить приоритеты и решить, что же делать.

Итак, чем буду заниматься:
  1. Углублять знания по С++
  2. Познакомиться с eXtreeme Programming по книгам Кента Бека и попробовать применить эту технику в разработке, которую я сейчас веду
  3. Agile Development. Узнать что за зверь. Если полезный, то посмотреть на него попристальнее.
  4. Рефакторинг. Однозначно нужен. Особенно в моем случае с кучей легаси кода. Посему, учиться, учиться и еще раз учиться, как завещал дедушка Ленин. (вот блин, - вспомнился случай в детском саду, когда нам о Ленине рассказывали. У нас еще большой портрет его на всю стену висел. Я все не мог вспомнить, что его Владимир Иллич зовут, а все остальные называли его просто "дедушка Ленин")
  5. Паттерны. Подтянуть, так как результат тестов не устраивает.
  6. Алгоритмы. Куда же без них? Взять книжку Кормена и писать обобщенные реализации на С++.
  7. Проектирование. Буч и Мейер форева. Мейера наверное не успею осилить, а вот Буча - вполне.
Итого на все про все - 3-4 месяца. Можно расценивать это как некоторый эксперимент над самим собой. Отчеты постараюсь публиковать здесь.

Однако "меня терзают смутные сомнения", что этого недостаточно, и нужно также познакомиться с чем-то поприземленнее. Будь то какой-то фреймворк или библиотека, или что-еще-там-сейчас-модно-использовать-где-бы-то-нибыло. Что скажете?

Friday, October 19, 2007

Ypa-a-a-a-a-a-a-a-a-a!!!!!!!!!!!!!!!!!!!!!

Сегодня у меня двойная, нет даже тройная радость! Спешу ею поделиться.

Во-первых - наконец появились результаты конкурса Programmania 2007 (номер моей анкеты - 126). Не может не радовать, то, что мой профессиональный уровень возрос (205 баллов против 140 ранее). Результат по сравнению с прошлым годом (точнее не с прошлым годом, а с 17 апреля, когда компания Validio проводила у нас в университете анкетирование, которое также включало в себя тестирование ):

Раздел

ранее

сейчас

Classic C++ (C++/STL)

40/100

58,3/100

Object-Oriented Design

34/100

50/100

Unix Administration

-

10/100

English

66/100

56,7/100

Логические задачи

0/100

30/100

Итого:

140 баллов

205 баллов


Итого с 17 апреля по 6 октября - рост довольно приличный, на мой взгляд. Особенно учитывая тот факт, что единственное, что я делал в плане самообразования - это лишь читал тематические блоги ;-). Такой себе эксперимент небольшой вышел. Ну и, естественно, я еще и работал, что тоже, думаю, сказалось. Хотя если так посмотреть, то есть еще куда расти и что подтягивать. Но все равно я рад что вошел в первую 20-ку по С++ (количество участников превысило 700 человек, а на вопросы по С++ отвечало 289 человек).

К следующему конкурсу буду готовиться, чтобы сравнить результаты.

Во-вторых - инженеры фольксваген разработали реализацию спецификации Controller Area Network (CAN) уровня ядра. CAN предназначен для передачи информации между узлами, работающих в режиме реального времени или в среде, с большими помехами. Несколько ссылок по теме:
Патчи добавляют новый домен коммуникации PF_CAN, и для работы можно будет использовать обычный Socket API. Надеюсь это позволит нам выбросить часть легаси кода.

Ну и в третьих - анонсирован выход Ubuntu 7.10 (Gutsy Gibbon).

В общем день начался хорошо, даже слишком. Бум смотреть чем он закончится.

Monday, October 8, 2007

Blogroll

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

Блоги о С++

Programmania 2007

6 Октября в Харькове прошел ежегодный конкурс программистов, который в этом году получил собственное имя - Программания. Конкурсу уже 12 лет, впрочем об этом и так можно узнать на сайте.
Итак, как все проходило....

Friday, October 5, 2007

Elvis Alive

# echo 127.0.0.1 elvis >> /etc/hosts
# /usr/sbin/ping elvis
elvis is alive

Saturday, September 29, 2007

Chaos, Forex & Data Mining System

И будущего, конечно, не знаютъ ни Ангелы Божии, ни демоны;
однако они предсказываютъ
Св. Иоанн Дамаскин, Точное изложение православной веры

Я человек, и ничто человеческое ... как говориться в известном романе (кажись). Поэтому в голову периодически закрадываются коварные мысли (правильные) о том, что пора бы уже заняться тем, что не только интересно, но и прибыльно. Чертовски прибыльно. То интернет-бомжи ум будоражат, то Forex, то еще что нибудь. Так вот по поводу Forex'a...

Monday, September 24, 2007

C & C++ useful resources

Stadardization Committees

Secure Coding Guidelines

Upcoming C++ Standard Related Links

Guru


Bjarne Stroustrup

Herb Sutter

Scott Meyers

Nicolai Josuttis

Andrei Alexandrescu

Daveed Vandevoorde

Stan Lippman

Journals
Dr. Dobb's Features - C++
The С++ Source

Libraries
Boost C++ Libraries - free peer-reviewed portable C++ source libraries. SVN is here.

asio C++ Library - asio is a cross-platform C++ library for network programming that provides developers with a consistent asynchronous I/O model using a modern C++ approach.

POCO C++ Libraries - POCO, the C++ Portable Components, is a collection of open source C++ class libraries that simplify and accelerate the development of network-centric, portable applications in C++.

Loki C++ Library - Loki is a C++ library of designs, containing flexible implementations of common design patterns and idioms.

Intel Threading Building Blocks for Open Source - offers a rich and complete approach to expressing parallelism in a C++ program.

Windows Template Library - a C++ library for developing Windows applications and UI components.

ACE - An OO Network Programming Toolkit in C++

Adobe Source Libraries
- ASL provides peer-reviewed and portable C++ source libraries. The libraries are intended to be widely useful, leveraging and extending both the C++ Standard Library and the Boost Libraries.

Generic Image Library
from Adobe Open Source - Images are a fundamental construct in any project that involves graphics, image processing, and video and yet the variability in pixel data representations (color space, bit depth, channel ordering, planar/interleaved, alignment policy) makes it hard to write imaging-related code that is both generic and efficient. Generic Image Library (GIL) is a C++ generic library which allows for writing generic imaging algorithms with performance comparable to hand-writing for a particular image type.

Tutorials


C++ FAQ Lite
C++ FQA Lite
Function Pointer Tutorials
C++ Reference Guide
C/C++ Reference
Inside C++

NewsGroups

English
comp.lang.c++.moderated
comp.lang.c++
comp.std.c++
comp.lang.c.moderated
comp.lang.c
comp.std.c

BOOST Archives
comp.soft-sys.ace

Russian
fido7.su.c-cpp
fido7.ru.cpp

Books
Wikibooks - More C++ Idioms

Blogs
Алёна C++
C++ Truth
C++ Soup!
Thinking Asynchronously in C++
highly professional scums
ConceptGCC Developer Blog
Raider's Programming Blog
The lonely compiler
LightSleeper
Inside C++

Monday, September 17, 2007

IMHO Two The Most Important Free Software Projects of Tooday

Жизнь, время и информация - три, возможно, самые ценные вещи которые есть у человека. Если о вечной жизни, пока пишут лишь только теологи, фантасты и "сумасшедшие" ученые, об управлении временем написано множество книг (ну тайм-менеджмент имеется в виду) и сломано немало копий, то, что делать со все возрастающими объемами информации? или ее защитой от несанкционированного доступа? На сегодняшний день ситуация такова, что человек, без помощи технических средств просто не в состоянии переварить всю, да что там всю, хотя бы часть имеющейся информации, хотя бы из того же Интернета. Популярные поисковики, для этих целей используют кластеры, которые уже в принципе доступны по бюджетным ценам (по ссылке с OpenNet.ru):

GNU autotools made easy with KDevelop

Вспомнилось как-то мне мое первое знакомство с Linux. Было это на 2-м курсе (или 3-м?) университета. Тогда мы работали на бездисковых станциях под DOS, которые грузились по сети (на сервере кафедры работал, да и сейчас работает MARS), а потом по ssh коннектились к серверу и работали с терминала (vt100). Midnight Commander'ом нам пользоваться было запрещено, реадакторы - vi и ed. Признаться меня тогда это не слишком впечатлило. Затем дошли руки и я установил себе в качестве второй ОС - ASP Linux 10, потом была 11-ка и 11.2, Fedora 4 и 6, Slackware 11 и в конце концов недавно таки дома переехал на Debian Etch. Больше всего понравились мне слака (чистотой) и дебиан (правильностью и наличием богатого набора софта). Ну и так как я все-таки считал себя программистом - то встал вопрос о наличии интегрированной среды разработки под линукс, так как я, будучи заядлым виндузятником, не представлял себе что можно програмить без нее. Тут мой взор привлекла среда KDevelop. С ней мне удалось разобраться методом тыка довольно быстро и, сказать по правде, я очень сильно к ней привык. Уже потом я узнал, что сборка большинства GNU софта управляется при помощи GNU Autotools, и с удивлением обнаружил, что KDevelop имеет так называемый Automake Manager, который использует те же файлы, что и autotools (configure.in, makefile.am, makefile.in), которые в принципе можно и вручную поправить и Automake Manager это скушает. Конечно он умеет не все, но если надо быстро въехать - самое оно. Вот как он выглядит

Friday, September 14, 2007

2Rest|~2Rest?

Решил тут на днях поковырять динамические языки (до этого я с ними дела не имел) и начал с Ruby, так как многие хвалят его и в особенности фреймворк Ruby on Rails. О-о-очень не привычно (это после 5 лет безвылазного сидения под статически типизированными языками). Трудно перестроится на то что данные имеют тип а переменные нет. Часто встречаются слова о философии языка программирования. Так вот, философию руби у меня грокнуть пока не получилось, да и динамическая типизация поражает воображение. Ах да, а зачем все это мне? Последнее время ощущаю, что теряется гибкость мышления,- уже выработался определенный стиль, прыжки на месте удаются, а шаг в сторону иногда вызывает затруднения, что есть не хорошо. Вот и решил, что это может помочь в данной ситуации. А может просто пора отдохнуть? Съездить там куда нить? Хочу Новый год в Карпатах встретить,- покататься на лыжах (а может и на сноуборде научиться), посидеть у пылающего камина в отельчике, оформленном в этническом стиле (и обязательно отделанном бревнами или деревом), посмотреть новогоднее представление Comedy Club (ибо все остальное из года в год одно и то же - уже надоело). Может кто знает такой? Если знаете, то отпишите в комментах плиз.

Thursday, September 13, 2007

Happy Programmers Day!!!

Всех программеров с 0x100 днем года! Так випьем же за то, чтобы софт не падал, баги не размножались, машины делали бы то что им говорят, в не зависимости от того, хотят они этого или нет и чтоб каждый узнал, что секс с двумя женщинами <мужчинами> (нужное подчеркнуть) существует не только в немецком порно но и в наших спальнях ;-)
Ура, товарищи!!! Всех С Днем Программиста!!!

Thursday, September 6, 2007

Волшебство на кончиках пальцев...

Интересно так складывается жизнь иногда. Я всю жизнь (ну а если точнее лет эдак до 16) мечтал стать археологом, да и сейчас иногда подрывает все бросить и умчаться куда нить в Среднюю Азию или Южную Америку на какие нибудь раскопки, книжки интересные читал по данной тематике. Знает например кто-нибудь, что древнеиндские письмена с печатей в Мохенджо - Даро (город мертвых кажись в переводе) до сих пор никто так и не расшифровал? а население Канарских Островов на каком языке говорило, пока его конкистадоры не перебили? он ведь не был родственным (насколько я знаю) ни одному языку в мире. а что письмена иберов, к примеру, в 80-х годах расшифровывали используя древнегрузинские тексты?

А после школы я поступил в Харьковский Авиационный Институт (ныне Национальный аэрокосмический университет им. Н.Е. Жуковского) - там летать не учат, а учат строить самолеты, вертолеты, ракеты, в общем все, что летает и каким либо образом с этим связано. Специальность моя называется "Компьютерные технологии проектирования" и относится к разряду Computer Sciense. Как только я туда поступил, куратор собрал нашу группу, и радостно нам сообщил, что мы не программисты, а инженеры будущие.

Wednesday, August 22, 2007

Какой айпишник у двери?

Однажды у нас в конторе произошел следующий забавный случай:
Заходит к нам в отдел сотрудник и спрашивает: "Какой айпишник у двери?". Все в отделе сидят уткнувшись в монитор, с которого на них смотрит родной Linux (ну или Windows у кого-то), и кто-то не поднимая головы отвечает: "76-й!". Сотрудник уходит. И тут все дружно подымают головы и всех пробивает на ха-ха. IP адрес у двери? и самое главное, что на такой вопрос был получен ответ! Объясняется все просто: один из проектов, который мы сейчас разрабатываем, - это система доступа в помещение по отпечаткам пальцев, которая работает под управлением Linux и включена в сеть.

Еще как то разговорились и пришли к выводу, что булевы переменные в PL/SQL обладают женской логикой (они ведь имеют три состояния) - "да", "нет", "наверное".

Tuesday, August 21, 2007

Quine

Когда то у нас в университете одним из заданий на курсовой проект было написать программу печатающую свой собственный код. Так тогда это задание никто и не взял себе. И вот недавно, вспомнив об этом, решил поискать в сети. Оказалось, что подобные программы называются Куайн (Quine) и программисты иногда ради забавы соревнуются кто же напишет максимально короткий куайн. Ниже пример с Wikipedia:

Friday, August 17, 2007

std::string vs. const char* . Comparison

Захотелось мне как-то узнать какие строки сравниваются быстрее - С-строки или STL. Да и Страуструп помнится в своей книге писал, что STL строки скорее всего реализованы эффективнее. Решил провести небольшой бенчмарк. Один тестовый случай заключался в 1000 сравнении 2х строк. Продолжительность каждого тестового случая измерялась. Тест состоял из набора в 1000000 тестовых случаев. После проведения теста время сравнения усреднялось. Результаты оказались довольно занятными.

Thursday, August 16, 2007

Начинаю учить японский

Наткнулся на тест согласно которому мне рекомендуют:

You Should Learn Japanese

You're cutting edge, and you are ready to delve into wacky Japanese culture.
From Engrish to eating contests, you're born to be a crazy gaijin. Saiko!


gaijin - чужак (пересмотрел недавно Токийский Дрифт). Может и взаправду начать изучать его? говорят он полегче английского ;-)

Tuesday, August 14, 2007

Google Translate rulezz ;-)

Благодаря Google теперь можно читать китайские тексты довольно качественно переведенные на английский. Cool!

Monday, August 13, 2007

Внешне указатели, сокеты внутри

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

Friday, August 10, 2007

Font Rasterization

Появилась довольно интересная статья по растеризации текста. Автор хоть и не является экспертом в данной области, но определенно “have something to say”. Как-то до прочтения статьи мне не приходилось задумываться над подобными вещами. Неужели все настолько плохо? Кто что думает?

Thursday, August 9, 2007

Motolinux

RAZR2 V8Motorola начала продажи (пока только на территории США) мобильного телефона RAZR2 V8, работающего под управлением мобильной Linux платформы MotoMAGX. На страничке MotoMAGX в частности можно прочитать следующие слова:

With more than 9 million Linux®-based handsets shipped worldwide, Motorola is a leader in mobile Linux innovation — and this is just the beginning. In the next few years, up to 60 percent of Motorola's handset portfolio is expected to be based on Linux. MOTOMAGX, Motorola's recently announced mobile Linux platform, is the next significant step in demonstrating our commitment to mobile Linux. It will play a key role in supporting Motorola's strategy

Такие заявления звучат более чем обнадеживающе ;-). Если мир и не услышит о Linux на десктопах, то похоже о Linux в мобильных устройствах ему придется услышать в самом ближайшем будущем. А когда наконец-то настанет эра ubiquitous computing о Linux будут знать все. Знать будут по крайней мере, что он есть ;-). Интересно будет взглянуть лет эдак через несколько какая платформа победит. А может Linux в мобильных устройствах даст зеленый свет и Linux на десктопах?

Monday, August 6, 2007

The Right to Read

Удивительно! как это мимо меня прошла такая статья??? The Right to Read by Richard Stallman. Есть русский перевод. Эта статья перекликается в некоторых местах с этим материалом.

Friday, August 3, 2007

Computer programming career

Нашел пару интересных статей
  1. Why a career in computer programming sucks
  2. The death of the generalist software developer
Недоумение вызвала фраза:
And I stand by my belief that people born in this country have more rights to the money being created here than foreigners.

Расизмом это все попахивает ИМХО.

Thursday, August 2, 2007

Покажи мне свой Desktop и я скажу кто ты

Мой десктоп на работе выглядит вот так:


Ничего лишнего и все нужное под рукой :-). А панелька со средствами разработки справа - скывается автоматически.

Просто undefined behaviour

Вот такой простой код приводит к undefined behaviour.


#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char *argv[])
{
char*str="Hello, world";
cout <<str<<endl;
str[6]='!';
cout <<str<<endl;
return EXIT_SUCCESS;
}

А все потому ,что строковый литерал есть "массив с надлежащим количеством константных символов", и, следовательно, присваивание константе незаконно. И поймать это можно только в рантайме. В моем тестовом случае это привело к segmentation fault.

Русских победить невозможнно!

Однажды произошла следующая история. В Сибири велась разработка земли и для этой цели понадобился какой-то специальный трактор. Трактор был приобретен через представителей в Москве у немецкой фирмы, доставлен в пункт назначения и представители благополучно разъехались по домам. И тут в Москве раздается звонок: "Ваш трактор не заводится". Представители срочно выезжают в Сибирь, смотрят, да, действительно, трактор не работает. Звонят в Германию производителю. Немецкие разработчики срочно выезжают в Сибирь, смотрят, а из салона трактора пропала магнитола. Как оказалось, местный прораб залез в кабину трактора, а там магнитола, кондиционер и куча другой электроники. Он не долго думая выдирает эту магнитолу из гнезда и запихивает в свою Волгу. Ну немцы и говорят - верните магнитолу на место, без нее электроника не работать не будет, трактор не заведется. Магнитолу вернули, трактор завелся, все довольные и счастливые уехали, немцы улетели к себе на родину. Не успели немцы долететь, в Германии раздается звонок из московского представительства: "У трактора сломался плуг". Немцы в шоке, плуг расчитан на неимоверные нагрузки, КАК ЕГО МОЖНО БЫЛО СЛОМАТЬ??! Не успели немецкие представители приземлится в аэропорту, им сразу звонят - вылетайте мол. Те сразу идут в кассы, покупают билет и вылетают. Прилетают в Сибирь, там уже целая делегация из Москвы. Среди немцев также присутствуют инженеры, которые разрабатывали этот трактор. Стоит этот трактор, лемех плуга в земле метров 10 от него, оторванный у дышла. Ну они и спрашивают, мол как? что произошло?
Наши им отвечают - "Ну чё, пашем, пашем, трактор застрял, гусеницы пробуксовывают, а трактор ни с места. Ну думаем наверное застрял. А коли он застрял то надо его дернуть". Ок, все класс, однако чем же можно "дернуть" 50 тонную гусеничную громадину?

ТАНКОМ!!! Они дернули ее ТАНКОМ!!!, который вызвали из части!!!
Немцы в шоке. Говорят : "Ок. замену мы вам пришлем, но давайте выясним что же случилось". Берут лопаты, начинают копать. Докапываются до глубины сантиметров в 50 и видят, что грунта на самом то деле только 50 сантиметров, а под ним идет гранитный кристаллический щит, в котором этот плуг и застрял! Почухали репку немцы, развели руками и изрекли: "Да-а-а. Нечему удивляться, что мы проиграли 2-ю мировую русским. Русских победить невозможно!"

Вот такая история.

А к нам на три дня приезжали итальянские партнеры. Они, гады, умудрились сожрать весь сахар! Пришлось вчера пол дня пить чай с сахарозаменителем :-(

Wednesday, August 1, 2007

Живность в коде. Часть 2. Метод муравьиных колоний

Энтомологи установили, что муравьи способны быстро находить кратчайший путь от муравейника к источнику пищи. Более того, они могут адаптироваться к изменяющимся условиям , находя новый кратчайший путь. Муравьи движутся по прямой, соединяющей муравейник с местом, в котором находится пища. При движении муравей метит свой путь специальными веществами - феромонами, и эта информация используется другими муравьями для выбора пути. А именно, муравьи предпочитают тропки наиболее обогащенные феромонами. Это элементарное правило поведения муравьев и определяет их способность находить новые пути, если старый оказывается перерезанным преградой. Действительно, достигнув этой преграды, муравьи уже не смогут продолжить свой путь и с равной вероятностью будут обходить ее справа и слева. То же самое будет происходить и на обратной стороне преграды. Однако, те муравьи, которые случайно выберут кратчайший путь, будут быстрее проходить свой путь и он с большей скоростью станет обогащаться феромонами. Поэтому следующие муравьи будут предпочитать именно этот наикратчайший путь, метя его и далее. Очевидная положительная обратная связь быстро приведет к тому, что кратчайший путь станет единственным маршрутом движения насекомых.


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

Более подробно о методе муравьиных колоний можно почитать в статье "Муравьиные алгоритмы". Также существует страничка, посвященная этому методу на веб сайте Marco Dorigo. В 2004 году в издательстве MIT Press вышла его книга, посвященная этому методу.

Tuesday, July 31, 2007

Процесс разработки как он есть

Нашел картинку, которую когда то давным -давно встретил в одной из книг. Все это конечно весело если бы не было так жизненно ;-).

Живность в коде. Часть 1. Генетические алгоритмы

Когда-то мне пришлось заниматься задачами оптимизации (обучение нейронных сетей в моем случае) и очень хорошо в этом плане себя проявили генетические алгоритмы, которые относятся к категории эволюционных или биологических. К этой категории относится также ряд других алгоритмов - например метод муравьиных колоний (о нем попытаюсь подробнее рассказать в следующей статье).
Генетический алгоритм— это алгоритм, который позволяет найти удовлетворительное решение к аналитически неразрешимым проблемам через последовательный подбор и комбинирование искомых параметров с использованием механизмов, напоминающих биологическую эволюцию. Является разновидностью эволюционных вычислений. Отличительной особенностью генетического алгоритма является акцент на использование оператора «кроссовера», который производит операцию, роль которой аналогична роли скрещивания в живой природе.

Задача кодируется таким образом, чтобы ее решение могло быть представлено в виде вектора - хромосомы. Хромосома зачастую называется особью. Ее приспособленность (верность решения задачи закодированного в особи) оценивается при помощи целевой функции. Затем случайным образом создается начальная популяция - набор таких хромосом. Работа генетического алгоритма состоит в следующем:
  1. Селекция - выбираются особи для "производства потомства" (выборка может осуществляться различными способами, например случайным или выборка особей с приспособленностью не ниже заданной) - обычно две особи (хромосомы) но может быть и больше
  2. Между особями производится "скрещивание" - генетический оператор кроссовера, который состоит в следующем - вектора "разрезаются" а затем их части меняются местами. К стати сказать, это простейший вид оператора кроссовера - есть еще двухточечный кроссовер - когда "рассечение" особей происходит двумя сечениями, и другие
  3. Затем производится с определенной вероятностью мутация получившихся особей - в простейшем случае - инверсия случайного бита (гена) в хромосоме
  4. Также может применяться генетический оператор (опять таки с определенной вероятностью) "инверсия" - это когда хромосома рассекается и начальная часть с конечной меняются местами (есть и более сложные варианты) - хотя в принципе этот оператор можно считать разновидностью мутации
  5. Также можно вводить свои какие-либо генетические операторы, если оптимизируемая функция слишком сложна, но это больше поле для экспериментов
  6. Далее вычисляется приспособленность получившихся особей/особи - и если она выше наименее приспособленной особи в популяции то последняя заменяется на получившуюся (опять таки это всего лишь один из вариантов)
  7. Таким образом моделируется эволюционный процесс, который продолжается до тех пор, пока не будет найден глобальное, либо субоптимальное решение, либо пока не сменится несколько поколений (смена одного поколения - некий процент новых особей заменил старых особей), либо пока не будет выполнено определенное количество итераций алгоритма
Генетические алгоритмы служат, главным образом, для поиска решений в очень больших, сложных пространствах поиска. И, надо признаться, с этой задачей они довольно хорошо справляются.
В заключение хочу привести ссылку на библиотеку - реализацию генетических алгоритмов на С++, которой я пользовался и которая, на мой взгляд, довольно удачно и грамотно спроектирована. Это библиотека GAlib, изначально написанная Matthew Wall при финансировании MIT, сейчас распространяется под BSD like лицензией и поддерживается автором. Недавно к стати вышел очередной релиз.

IT Doesn't Matter

Статья Николаса Дж. Карра "IT Doesn't Matter", опубликованная в майском выпуске Harvard Business Review 2003 года вызвала бурную волну откликов и обсуждений (некоторые можно почитать на сайте автора, еще есть реакция Steve Ballmer и Carly Fiorina - HP CEO), что сподвигло его на написание книги "Does IT Matter? Information Tehnology and the Corrosion of Competitive Advantage" (в русском переводе Николас Дж. Карр "Блеск и нищета информационных технологий").

Если честно признаться, то эта книга для меня стала чем-то вроде снега на голову, она заставила задуматься о вещах, о которых мне ранее не приходилось задумываться - действительно ли стратегический успех компании зависит от инвестиций ИТ? если нет, то почему они (инвестиции) занимают столь ощутимое место в бюджете?

Основная идея - по мере превращения ИТ в инфраструктуру, ее стратегическая роль в успехе компании уменьшается, поскольку ИТ становятся доступнее, а следовательно могут быть легче скопированы компаниями-конкурентами.

Там еще много каких мыслей умных и интересных - почитать определенно стоит, особенно менеджерам.

Monday, July 30, 2007

Books on Algorithms

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

Jorg Arndt "Algorithms for Programmers. Ideas and source code" - еще не вышедшая книга на английском, выход запланирован на 2008 год, драфт пока что есть в свободном доступе



Однако надо признаться, что ни одну из этих книг я не прочел, а пользовался ими как справочниками, когда возникала такая необходимость ;-)

Манифест Хакера

Оригинальный текст был опубликован в 7-ом номере электронного журнала Phrack. Перевод на русский можно почитать здесь. Да. к чему это я все? Свобода информации, как говорится.
Upd: Манифест Хакера в формате mp3 можно скачать здесь.

Алгоритм управления памятью TLSF

Опубликован перевод описания алгоритма управления памятью TLSF с эффективностью O(1). Кроме того, существует сайт, посвященный explicit dynamic storage allocation, на котором помимо TLSF представлен еще ряд аллокаторов для real-time систем. Надо будет предложить попробовать различные аллокаторы, указанные на этом сайте, в следующем проекте, а заодно можно будет и оценить их эффективность на реальном железе. Если дело выгорит, то с меня отчет ;-)

Friday, July 27, 2007

The Battle with RegExpr

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

Thursday, July 26, 2007

Анатомия ядра Linux

Вышел перевод статьи Тима Джонса об истории и архитектурной организации ядра Linux, которую можно рассматривать как введение в эту самую архитектуру. В целом и общем статья производит довольно благоприятные впечатления. Рекомендую к прочтению всем, кому это хоть немного интересно.

Wednesday, July 25, 2007

Flex & Bison C++ Interoperability Continued

Итак, возвращаясь к когда-то написанному мной введению об interoperability лексических анализаторов на С++, сгенерированных при помощи Flex, и синтаксических анализаторов, сгенерированных при помощи Bison, в этой статье хочу разобрать простенький примерчик в котором лексический анализатор (далее лексер) распознает строки комментариев командного интерпретатора bash и пустые строки и пропускает их, а все остальные возвращает синтаксическому анализатору (далее парсеру) для последующего вывода в командную строку. Сначала я приведу код, а затем уж постараюсь объяснить по возможности что какая строчка значит, ну и соответственно команды которые необходимы чтобы это все собрать в кучу.

Файл intertest.cpp

#include <fstream>
#include "lexer.h"
#include "parser.h"
using namespace std;
using namespace test;
int main(int argc, char *argv[])
{
    ifstream infile(argv[1]);
    Lexer lexer(&infile);
    Parser parser(lexer);
    return parser.parse();
}

Тут я думаю обьяснения излишни ;-)

Файл lexer.h

#ifndef _LEXER_H
#define _LEXER_H

#ifndef __FLEX_LEXER_H
#undef yyFlexLexer
#include <FlexLexer.h>
#endif
#include <stdexcept>
#include "parser.h"
namespace test{
class Lexer: public yyFlexLexer {
    //tokenizer
    int yylex();
public:

    //ctor
    Lexer( std::istream* src = 0 );

    //dtor
    virtual ~Lexer();

    //functor
    Parser::token_type operator() ( Parser::semantic_type* lval, Parser::location_type* lloc = 0 );

    //error report routine
    virtual void LexerError( const char* msg );

private:

    Parser::semantic_type* yylval;
};
}
#endif

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

#ifndef __FLEX_LEXER_H
#undef yyFlexLexer
#include <FlexLexer.h>
#endif

По поводу перегрузки operator() подробно также можно почитать там же.

Файл lexer.lpp

%option 8bit
%option noyywrap
%option c++
%option yyclass="test::Lexer"
%option pointer
%option nodefault
string [^#\n]+\n
garbage .*\n
%{
#include "lexer.h"
#include "parser.h"
%}
%%
{string} {
      yylval->str=yytext;
      return Parser::token::STRING;
}
{garbage} //skip all other
%%
namespace test{

//ctor
Lexer::Lexer( std::istream* src ): yyFlexLexer( src, 0 ){}

//dtor
Lexer::~Lexer( ){};

//error report routine

void Lexer::LexerError( const char* msg ) {
    throw std::runtime_error( msg );
}

//function call operator overloading 
Parser::token_type Lexer::operator() ( Parser::semantic_type* lval, Parser::location_type* lloc ) {
    yylval = lval;
    return Parser::token_type( yylex() );
}
}

%option 8bit - использовать 8 битную кодировку символов

%option noyywrap - yywrap() - функция которая вызывается по достижению конца файла, ее можно использовать для того чтобы открыть новый файл и продолжить сканировать его (в этом случае функция возвращает 0). Поскольку нам это не нужно, то используя эту опцию указываем что yywrap всегда возвращает 1 - сканирование завершено

%option c++ - генерировать код на С++

%option yyclass="test::Lexer" - сгенерировать реалзацию функции yylex(), осуществляющей сканирование для класса Lexer, унаследованного от yyFlexLexer и находящегося в пространстве имен test, это необходимо для того, чтобы в теле правил flex файла были доступны указатели на переменные, передаваемые парсером в лексер при вызове последнего для получения следующего токена

%option pointer - опция, контролирующая каким образом определен yytext, - как указатель на распознанную строку или как статический буфер, содержащий ее копию. Нам нужен указатель, потому на всякий случай указываем ее.

%option nodefault - по умолчанию весь ввод который не может быть распознан лексером вываливается в консоль, нам этого behaviour не нужно, говорим об этом flex'у

string [^#\n]+\n - регулярное выражение для строки - строка это все что угодно кроме символов '#' и '\n' встречающееся в тексте более одного раза и заканчивающееся символом '\n'

garbage .*\n - выражение для "мусора" - т.е. всего что не подходит под определение строки

Далее включаем заголовочные файлы лексера и парсера. Файл парсера нужен для констант токенов, которые в нем определены.
%{
#include "lexer.h"
#include "parser.h"
%}

Далее начинается секция правил flex'а
%%

Следующее правило служит для распознавания строки. Поскольку оба правила могут распознать одну и ту же строку, то указываем именно правило для string первым поскольку при разрешении таких неоднозначностей flex использует первое в списке правил для обработки ввода (first rule match).
{string} {
    yylval->str=yytext; //копируем
    return Parser::token::STRING;
}

{garbage} //все что не нужно пропускаем 
//(т.е. не делаем return)


Далее идет секция кода
%%
В ней размещаем реализацию методов класса Lexer.

Файл parser.ypp

%skeleton "lalr1.cc"
%parse-param {test::Lexer& yylex}
%define "parser_class_name" "Parser"
%name-prefix="test"
/*
 *   Секция кода
 */
%{
/*
 *   Этот код (находящийся перед директивой %union)
 *   будет включен в сгенерированный bison'ом 
 *   заголовочный файл ДО ОПРЕДЕЛЕНИЯ КЛАССА 
 *   СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА Parser
 */
namespace test{
class Lexer;
}
%}
%union {
      char* str;
}
%{
/*
 *   Этот код (находящийся после директивы %union)
 *   будет включен в сгенерированный файл парсера 
 *   (синтаксического анализатора)
 *   (parser.cс например)
 */
#include "lexer.h"
#include <cstdio>
#include <stdexcept>
%}
%token <str> STRING
%start file
%%
/*
 *  Grammar rules follow
 */
file    :
      | file STRING   { printf("%s",$2);}
      ;
%%
void test::Parser::error (const location_type& loc, const std::string& msg){
    throw std::runtime_error(msg);
};

%skeleton "lalr1.cc" - используем шаблон для генерации кода парсера на С++

%parse-param {test::Lexer& yylex} - указываем что конструктор сгенерированного парсера должен принимать аргумент - ссылку на лексер

%define "parser_class_name" "Parser" - указываем что сгенерированный bison'ом класс парсера должен называться Parser

%name-prefix="test" - указываем что пространство имен в котором находится сгенерированный bison'ом класс будет называться test

namespace test{
class Lexer;
}
- объявляем класс Lexer, потому как оба класса (Lexer и Parser) зависят друг от друга - Lexer использует типы определенные в Parser а конструктор Parser принимает ссылку на Lexer в качестве аргумента.

%union {
char* str;
}
Директива %union используется для следующей цели:
иногда бывает необходимо возвратить из лексического анализатора в синтаксический кроме константы, определяющей токен (лексическую единицу) еще и значение связанное с этим токеном (например если в тексте встретилось 8536 то лексический анализатор возвращает токен INTEGER (целочисленная константа) а само значение присваивается переменной, имеющей тип Parser::semantic_type* var , следующим образом:
var->integer=atoi(yytext));

При этом в файле Bison директива %union выглядит следующим образом

%union{
int integer;
}


Указатель на переменную типа Parser::semantic_type передается парсером лексеру при вызове последнего для получения следующего токена затем в теле правила это значение может быть получено путем использования следующей конструкции: $номер_элемента_правила

%{
/*
*   Этот код (находящийся после директивы %union)
*   будет включен в сгенерированный файл парсера 
*   (синтаксического анализатора)
*   (parser.cс например)
*/
#include "lexer.h"
#include <cstdio>
#include <stdexcept>
%}
- в сгенерированном файле реализации парсера (например parser.cc) интерфейс класса Lexer уже должен быть известен, поэтому включаем его заголовочник.

%token <str> STRING - объявление токена конструкция в угловых скобках указывает на то, что с этим токеном связано значение и что оно хранится в поле str union'a

%start file - объявляем стартовое правило

file    :
      | file STRING   { printf("%s",$2);}
      ;

правило определяющее что из себя представляет файл - это набор из 0 или более токенов STRING. Правила записываются в расширенной форме нотации Бэкуса - Наура (Enhanced Backus Naur Form - EBNF).
Конструкция в теле правила $2 - это обращение к значению токена STRING (тому самому которое хранится внутри union)

Далее следует секция кода, в которую можно поместить различные функции - я разместил в ней реализацию метода error класса Parser, которую и так надо писать самому.

Теперь собираем все в кучу:

$flex -olexer.cpp lexer.lpp
$bison --defines=parser.h -oparser.cpp parser.ypp
$g++ intertest.cpp parser.cpp lexer.cpp -o test

Проверим на следующем файле

#!/bin/bash
#comment

ls -l

#another comment

ps


Результат работы программы

commander@a64:~/work/src/test$ ./test test.bash
ls -l
ps


Фуф! Вот кажись и все ;-). Have fun!

Tuesday, July 24, 2007

Linux Kernel Vitualization

Грядущий релиз ядра Linux 2.6.23 готовит новые вкусности - согласно KernelTrap, средства виртуализации Xen и lguest включены в основное ядро. Перед этим та же участь постигла KVM, предоставляющий возможность запускать несколько виртуальных машин, каждая со своей ОС

Wednesday, July 18, 2007

Moblin

Сотрудничество Intel с Canonical Ltd и Red Flag Linux вылилось в проект Mobile & Internet Linux Project, являющийся проектом по созданию программной начинки с открытым исходным кодом для Intel Mobile Internet Devices на базе Linux. На страничке проектов уже представлен предварительный ряд решений. Что же, позиции Linux в качестве mobile & embeded platform все упрочняются по мере adoption by leading manufacurers.

Инициализация структур

В стандарте С99 (6.7.8) есть интересная вещь - так называемые designators (обозначения?). Их использование позволяет инициализировать элементы структур при помощи списка инициализации не обращая внимания на порядок следования элементов. Например

struct StTest {
int i;
char c;
double d;
};

int main(int argc, char *argv[])
{
struct StTest st1={.d=0.1, .i=1, .c='a'},
st2={.c='b',.d=0.2,.i=2};
printf("st1.i= %d st1.c= %c st1.d= %f\n",st1.i,st1.c,st1.d);
printf("st2.i= %d st2.c= %c st2.d= %f\n",st2.i,st2.c,st2.d);
return EXIT_SUCCESS;
}

А вот собственно и результат работы такой програмки

commander@a64:$ ./teststructinit
st1.i= 1 st1.c= a st1.d= 0.100000
st2.i= 2 st2.c= b st2.d= 0.200000

Такая вещь бывает очень полезна, так как нет необходимости помнить порядок следования элементов структуры.

Tuesday, July 17, 2007

C vs. C++

На днях задался философским вопросом: если С++ лучше С, то почему ядра многих операционных систем (BSD, Linux, Windows?) написаны на С? На мой взгляд С++ довольно сложный и многообразный язык, и богатство его возможностей в данном случае только мешает, а не помогает, поскольку перед разработчиком встает проблема выбора. В то же время, чтобы выучить С достаточно книги Кернигана и Ричи, простой, лаконичный, и разработчик вместо того чтобы решать проблему выбора, занимается решением поставленной задачи. С позволяет сконцентрироваться на решении прикладной задачи, а не углубляться в архитектуру. Это все конечно же ИМХО и на истину в конечной инстанции не претендую, вполне возможно что ядра пишут на С по историческим причинам, и чтоб не сломать уже созданную кодовую базу.

Monday, July 16, 2007

Amaya - web browser from W3C

W3C видимо надоело бороться с наличием множества глюков в различных веб браузерах, посему было создано чудо, и имя ему нарекли Amaya. Что характерно - acid2 test он валит. Версия 9.55 от 10 июля 2007 года. Впечатления, мягко скажем, отрицательные. При этом натравив W3C QA Markup Validation Service на страницу acid 2 test можно убедится что код валидный. Посему возникает вопрос - зачем?

Friday, July 13, 2007

Ride The Tide

На мой взгляд сейчас в созревшем состоянии находят два очередных бума в сфере IT - это web services и mobile devices (в широком понимании этого слова). Скорее всего два этих явления будут дополнять друг друга. Самое время задаться вопросом "What to do to Ride the Tide?", как это в свое время сделали в SUN, когда решили что нужно что-то делать и сделали Java. И в заключение несколько ссылок:
Silicon Valley's next boom
ID theft: The next IT industry boom?
2001: A Perfect Time To Learn New Technology And Catch The Next Boom

Thursday, July 12, 2007

Linux Mobile

Речь опять пойдет про ubiquitous computing. Linux все более активно позиционируется как платформа для мобильных устройств. Вот, например, какой девайс соорудили в рамках проекта OpenMoko:

neo1973neo1973 board

Довольно подробный обзор можно почитать на LinuxDevices.com. Кроме того данное событие довольно активно освещается различными ресурсами, ссылки на которые можно найти на сайте OpenMoko. Ну скажите, чем это не альтернатива Apple iPhone? Девайс можно купить онлайн. Существует он в двух редакциях Neo Base и Neo Advanced. Advanced от Base отличается наличием дополнительных аксессуаров for mobile device hacker.

Tuesday, July 10, 2007

Google Translate

Ура! Наконец-то нашел то, чего так долго нехватало. Google сделал онлайн переводчик, который умеет переводить со многих языков. Причем можно переводить не только текст, но и веб страницы. Вот например перевод этого поста. Хотя, надо заметить, что перевод с русского на английский находится пока еще в стадии BETA.


Wednesday, June 27, 2007

Опыт Ubuntu не прошел даром...

Если посмотреть попристальнее на самую солнечную компанию (хотя SUN - это Stanford University Network), то можно наблюдать интересное явление - почти все свои флагманские продукты они рассылают бесплатно на дисках, ну разве что кроме Java. Это и NetBeans и OpenSolaris и Solaris. Что бы это значило? На мой взгляд, видимо опыт Ubuntu, который стал самым популярным дистрибутивом в мире, не прошел даром. Ubuntu тоже присылают совершенно free of charge , что и является одной из составляющих его успеха. Хотя можно опять начинать спорить кто и что у кого спер. Следовательно кто-то в Sun решил что подобная стратегия "приучивания" оправдана. Кроме того, отдельно стоит сказать про открытость (или свободу, как кому угодно). Java вон и ту открыли. Есть мнение что открытый исходный код это вовсе не так и страшно при разработке коммерческих приложений, если такая модель является частью бизнес процесса компании. Остается, правда, опасения повторения истории с Oracle и Red Hat - когда первая совершенно легально загрузила с серверов второй исходный код Red Hat Linux в rpm пакетах и собрала из него собственный дистрибутив Oracle Enterprise Linux и создала программу его поддержки Unbreakable Linux. Естественно Red Hat потеряла, наверное, ощутимую долю рынка, так как до этого события именно ее продукт рекомендовался для установки на него Linux версии Oracle.

Tuesday, June 26, 2007

Ubuntu становится mobile ;-)

С момента своего запуска в 2004 году дистрибутив Ubuntu Linux стремительно набирал обороты и на сегодняшний день является простой в обращении и свободно распространяемой современной операционной системой и самым популярным дистрибутивом Linux по сведениям Distrowatch. Ubuntu базируется на нестабильной ветке Debian и имеет шестимесячный цикл выпуска, диски с дистрибутивом присылают совершенно бесплатно, что способствовало его широкому распространению. Но об этом всем и так можно почитать на Distrowatch .

Wednesday, May 23, 2007

Linux vs M$. Republican's point of view. :-D

Читал это, это, и это и этот пост by Alexey Alishevskikh (на английском). Ржал часа три. Настоятельно советую всем для повышения настроения :-D!!!

Monday, May 21, 2007

C++09 Draft

Вот и появился Draft C++09 ;-).
Тут

Thursday, May 17, 2007

Вопросы на интервью

Вот нашел статью о вопросах задаваемых на собеседовании в сами знаете какой компании .
Интересно какая бы была реакция интервьюера если бы на вопрос "Как бы вы определили вес самолета Боинг?" бил получен ответ "Поищу в Google" :-).

Tuesday, May 8, 2007

Linux Development Platform

Читаю книжку, "Linux Development Platform" называется, авторы Rafeeq Ur Rehman и Christopher Paul. В очень доступной и доходчивой форме описаны компоненты среды разработчика Linux - аппаратная платформа, операционная система, редакторы исходного кода, компиляторы и ассемблеры, отладчики, системы контроля версий, системы сборки, утилиты (nm, sed, binutils, etc.), developer collaboration. Вкратце рассмотрен Life Cycle of a Software Development Project с достаточно доходчивым описанием всех стадий, приведены критерии выбора того или иного средства. Отдельные разделы посвящены Cross-Platform and Embeded Systems Development (host, target machines, native and cross compilers, cross compilation, remote debugging) и Platform Independent Development with Java.
В чем достоинство данной книги, на мой взгляд, так это то, что она дает целостную картину, видение мира,- то чего нет в мануалах отдельно взятых средств разработки.
Очень советую почитать всем, кто занимается разработкой решений для Linux, и у кого еще не сложилась целостная картина из кусков рассыпанной мозаики.

Monday, May 7, 2007

Русский компилятор

Оказывается в России был создан компилятор С++!!! :-)
Сайт здесь
История здесь

Wednesday, March 7, 2007

Хохма!?

Взято отсюда: Интервью Дона Сайма - создателя F# - языка функционального программирования для .NET
Если сравнить F# с полностью объектно-ориентированными языками (как Java, SmallTalk и C#), полностью процедурными языками (как Algol, Fortran и C) или чем-то средним (как C++), к чему он ближе?
Да-а-а. Слышал, что SmallTalk называют полностью объектно-ориентированным языком, но чтоб Java и C#? Почему тогда интересно C++ чем то средним между процедурным и ОО языком назвали? Потому что в нем можно использовать и тот и тот стиль программирования? Ну а обобщенное программирование как тогда? Вообще то С++ - мультипарадигменный язык программирования...

Thursday, February 15, 2007

Microsoft Interview Internals

Вот несколько постов, в которых рассказывается о внутренней кухне интервью M$
Part 1 Part 1b Part 2

Wednesday, February 7, 2007

new & malloc

По поводу распределения памяти при помощи new и malloc откопал
Codeproject: To new is C++; To malloc is C...
Да, жаль заменить управление памятью на сппшные наверное не получится :(. Там realloc сильно используется, а альтернатив ему в С++ говорят нету. Врут наверное :). Надо глянуть как эта штучка в векторах STL реализована - при помощи аллокаторов кажись ...

Monday, February 5, 2007

FSF инициирует акцию против Vista :)

FSF открыла блог BadVista.org . Название говорит само за себя :). Цель инициативы - предупредить потенциальных и существующих пользователей о "вреде"? который наносит Windows Vista и проинформировать их о соответствующих альтернативах из мира OpenSource. Одно несомненно - Microsoft, пожалуй, начинает крупнейшую из когда либо имевших место кампанию по запуску продукта на рынок. Хотя, некотрые из "наших" ( vtolkov и bobronotes ), работающих в Редмонде и на Vista высказывают довольно противоречивые отзывы, из чего можно сделать вывод, что в конце концов код доведут до "нормально" рабочего состояния и продукт найдет своего покупателя. Особенно если в этом свете вспомнить историю с Xbox и PS и высказывания какого-то умного человека о том что продукт не обязательно должен быть лучшим, чтобы занимать лидирующие позиции на рынке. Лично для себя я решил, что перейду на Vista с XP только если будет существенное повышение productivity при работе с ней. А пока что Linux - мой идеал во всех отношениях :).