Monday, December 28, 2009

Итоги 2009 года

Хочу подвести итоги своего 2009 года.

1. Я женился.
2. На работе успел поучаствовать в 3х разных проектах. Первый проект был связан с travel-индустрией. Занимались реализацией новой версии системы автоматизации тур-оператора. Неплохо изучил .NET и T-SQL, хотя из-за того, что приходилось писать на VB .NET, не дотерпел до конца. Второй проект был посвящен написанию софта для промышленного портативного компьютера. Познакомился с Linux, Eclipse, g++ и Qt. Жалко, что моя работа закончилась через 3 недели, т.к. задача была конечная. Третий проект - это продукт "связанный с безопасностью" под Windows. Здоровенный монстр, состоящий из огромного количества унаследованного кода и заклинаний. Прокачал навыки удалённой отладки, познакомился с Active Directory и фиксом багов с формулировкой "не работает". Попадись мне этот проект лет 5 назад, наверное был бы счастлив.
3. Попробовал себя в фрилансе. Сделал девочке курсовую - чат на .NET Remoting. Заработал 200 баксов :-)
4. Windows и виртуалка с Linux превратились в Linux и виртуалку с Windows.
5. Немного ознакомился с GTK, GTK++ и ALSA.
6. Прочитал несколько книг о Python. Можно сказать - начал изучать. Сделал несколько hello world'ов. Познакомился с PyQt и PyOpenGl.
7. Начал изучать C++. Прочитал несколько книг. Познакомился с Boost и граблями C++. Понял не менее 50% книги А.Александреску "Современное проектирование на C++".
8. Немного поковырял микроконтроллер ATMEGA32. Сделал несколько лабораторных работ в симуляторе, научился мигать диодиками и делать прошивки.
9. Познакомился с Java. Прочитал несколько книг. Написал несколько hello world'ов для своего мобильного телефона Series 40. Понял, что немного опоздал с этим начинанием и это занятие уже малоактуально.
10. Сильно продвинулся с мечтой всей своей юности - собственной реализацией транслятора языка программирования. Во-первых разобрался с разбором текста (неплохо изучил Spirit Classic и написал собственную реализацию с аналогичной функциональностью), во-вторых сделал простенький язык программирования без системы типов, но с циклами, условиями и операторами.
12. Прочитал несколько книг по проектированию ПО. Пока мало что понятно, буду перечитывать.
13. Понял, что мне нужен велосипед и купил его.

На этом год кончился.

Thursday, December 24, 2009

Велосипед

Во вторник ко мне наконец-то приехал специализированный велосипед для фитнеса.

Вчера настроил, сегодня проверил. Я никогда не катался на сликах. Я бы, наверное, без особого энтузиазма стал кататься на них летом, а сейчас - зима. Ехать на работу было весело и непривычно. Узкий руль, мягкая вилка... и слики! Удивительно, но доехал. А вот домой ехать было сложнее. К вечеру стало теплее и пошёл дождь. Несколько раз я очень забавно скользил. Но всё-таки тоже доехал.

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

Так случилось, что я совсем перестал кататься. И вот только сейчас, спустя полтора года, я осознал и прочувствовал свою ошибку со всей силой. Велосипед должен быть. Не потому что это прикольно, а потому что это просто неотъемлемая часть меня.

J2ME Linux

Чтобы как-то отвлечься от всякого поднадоевшего, решил сегодня разобраться, как писать программки для моего мобильного телефона из-под линукса. Дело в том, что около полугода назад, когда ещё я сидел под Windows, написал несколько хеллоу-ворлдов для J2ME, чтобы хоть как-то оправдать наличие Java у меня в телефоне. С тех пор, как перешёл на линукс, меня мучает желание попробовать проделать то же самое под линуксом. Сегодня проверил. Да, действительно, это возможно.

Синтез современной музыки

Я периодически читаю блог А.Левенчука. 90% непонятно, остальные 10% - интересно. Сегодня наткнулся на пост Современная музыка: как она собирается. Выложено 10-минутное видео в котором некий DJ с нуля делает "Smack My Bitch Up". Самое интересное - показаны первоисточники используемых звуков.
Я удивлён.

Wednesday, December 23, 2009

Brainbench

Есть такой сайт - Brainbench. Этот сайт посвящен тестированию. Тестов на сайте очень много, но, в основном, самые интересные из них - платные. Периодически случается, что Brainbench решает временно сделать несколько тестов бесплатными. Сегодня пришло письмо, что среди прочих есть бесплатный тест "C++ Fundamentals". Конечно же решил пройти, результат такой:
Test:    C++ Fundamentals
Date: 23-Dec-2009
Score: 4.44
Weights: 100% C++ Fundamentals
Elapsed time: 35 min 34 sec
C++ Fundamentals
Score: 4.44
Percentile: Scored higher than 93% of previous examinees

Demonstrates a clear understanding of many advanced concepts within this
topic. Appears capable of mentoring others on most projects in this area.

Strong Areas
* Data Handling
* Flow Control
* Functions
* Exception Handling
* Building C++ Programs
* Templates

Weak Areas
* None noted

В прошлый раз этот тест я проходил в марте, набрал тогда 4.23 и осознал, что совершенно не знаю шаблоны. В этот раз в Weak Areas пусто.

Wednesday, December 16, 2009

Современный велосипед


Я, было, подумал, что книга - об антипаттернах.

Wednesday, November 25, 2009

Анонс

Последние полгода я занимался изучением того, что принято называть "Modern C++" изучая код Boost.Spirit (Classic). Фактически, то чем я занимался можно разделить на 2 части:
1. Изучение функциональности и основных идей Spirit.
2. Реализация своего варианта.

Особенно интересен второй пункт. Он состоит из двух подпунктов:
а. Язык C++ во всём своём великолепии. Можно охарактеризовать так: шаблонное метапрограммирование.
б. Проектирование и принятие решений.

Работа, в основном, состояла в (преднамеренных) бессчётных попытках изобрести велосипед. Я заставлял себя принимать аргументированные Решения. Я пытался слушать свою интуицию в надежде сделать лучше, чем оригинал Джоела Де Гузмана. Уходили недели на то, чтобы убедиться, что мои решения заводят весь проект в тупик и ничего с этим не сделаешь.
Кроме того, что за время работы мне удалось неплохо улучшить свои знания в C++, также удалось скорректировать своё понимание того, как нужно писать код и как его писать не нужно.

Надеюсь закончить полное описание этой работы через пару месяцев.

Monday, November 23, 2009

Тизер.


Фибоначчи:
a = b = 1;
i = 0;
while(i < 10) {
c = a + b;
?(c);
a = b;
b = c;
i = i + 1;
}

Результат:
PRINT: 2
PRINT: 3
PRINT: 5
PRINT: 8
PRINT: 13
PRINT: 21
PRINT: 34
PRINT: 55
PRINT: 89
PRINT: 144
CONTEXT:
'a' is 89
'b' is 144
'c' is 144
'i' is 10

P.S. Вот и кончился отпуск.

Thursday, November 19, 2009

3*(2+1)

Один из нескольких способов вычислить 3*(2+1) на C++.

#include <iostream>

//
struct empty_t {};

template<class Value, class Children = empty_t>
struct Node
{
typedef Value value;
typedef Children children;
};

template<class TA, class TB = empty_t>
struct Tree
{
typedef TA ta;
typedef TB tb;
};
//

//
struct Add
{
template<int A, int B>
struct Do { enum { value = A + B }; };
};

struct Mul
{
template<int A, int B>
struct Do { enum { value = A * B }; };
};

template<int X>
struct Val
{
enum { val = X };
};
//

//
template<class NodeT>
struct compute;

// если узел - это число
template<class ValueT>
struct compute<Node<ValueT, empty_t> >
{
enum { value = ValueT::val };
};

// если узел - это операция
template<class ValueT, class ChildrenT>
struct compute<Node<ValueT, ChildrenT> >
{
enum
{
A = compute<typename ChildrenT::ta>::value,
B = compute<typename ChildrenT::tb>::value,
value = ValueT::template Do<A, B>::value
};
};

int main()
{
// 3*(2+1)
typedef Node<
Mul,
Tree<
Node<Val<3> >,
Node<
Add,
Tree<
Node<Val<2> >,
Node<Val<1> >
>
>
>
> expr;

std::cout << compute<expr>::value << std::endl; // 9
}

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

Saturday, November 7, 2009

Тизер.


...
int main()
{
char const* str = "myvalue=2*(yourvalue=1);myvalue=myvalue+1;";

typedef AstParseInfo<char const*> parse_info_t;
parse_info_t tpi =
ast_parse(str, str+strlen(str), MyGrammar(), *ch_p(' '));

typedef std::map<std::string, int> context_t;
context_t context;
int v = evaluate(tpi.nodes[0], context);

std::cout << "CONTEXT: " << std::endl;
typedef context_t::const_iterator context_iter_t;
for(context_iter_t it = context.begin(); it != context.end(); ++it)
{
std::cout
<< " '"
<< (*it).first
<< "' is "
<< (*it).second
<< std::endl;
}
}
...


debug: set 'yourvalue' to 1
debug: set 'myvalue' to 2
debug: set 'myvalue' to 3
CONTEXT:
'myvalue' is 3
'yourvalue' is 1
Press [Enter] to close the terminal ...

P.S. Наконец-то отпуск.