четверг, 17 марта 2011 г.
Задача: выборы мэра
Как выбрать мэра?
вторник, 8 марта 2011 г.
Скрипты на Lua в С++, версия 2
В прошлом году я писал мою микро библиотеку для встраивания Lua как скриптового языка в программы на С++.
С тех пор библиотека практически не изменилась. Она устраивала меня, а сторонних пользователей у нее особо не было.
Недавно Alexei Bezborodov вдохнул в проект новую жизнь, исправив несколько ошибок и, самое главное, выпустив новую версию.
Его ветка теперь является основной, а старая оставлена для истории.
Ниже анонс от Алексея.
Напишу здесь последние новости для интересующихся.
Появилась новая версия 0.1.0.
В ней добавлено:
- Новый тип LuaScript::Double_LuaArg
- Полноценный вектор LuaScript::Vector_LuaArg
- Нестатические функции. Возможность передавать в функцию локальные объекты.
- Новое описание.
Рекомендую посмотреть тесты. В них есть пример работы с двухмерным вектором и другие полезности.
Стиль кода немного изменился. Для тех кто хочет работать со старым стилем, выложил версию 0.0.2. В ней исправлены некоторые мелкие недочеты, но новые возможности отсутствуют.
Информация по теме:
понедельник, 7 марта 2011 г.
ACE против boost или какую библиотеку выбрать
Есть задача: у нас есть несколько подсистем, для которых нужны следующие вещи:
- сокеты (клиентские, серверные, с SSL и без)
- fork() для рождение дочернего процесса, который наследует сокет для обслуживания соединения
- потоки
- таймеры и задержки
- logger
Все перечисленное должно работать без исключения на Windows 2003/2008, Linux AS5+, AIX 5/6, Solaris (Intel/AMD), HP-UX v3.
Для всего остального мы прекрасно довольствуемся STL.
Компиляторы только "родные" для каждой платформы (то есть, например, Cygwin не годится для Windows, и gcc только на Linux).
Мы давного используем ACE, как основную библиотеку. В ней есть все из выше сказанного, даже имитация fork под Windows, когда идентификатор сокета передается в символьном виде дочернему процессу через командную строку.
Вообще, fork() - это настоящая засада под Windows. Для его полноценной реализации нужно использовать недокументированные функции и структуры, как это делается в Cygwin, что, конечно, для нас неприемлемо в плане последующей поддержки. Что еще усугбляет ситуацию - нет возможности отказаться от мульти-процессной модели и просто перейти на потоки (поэтому и нужен fork).
Но ACE - это монстр, который еще и труден в правильной сборке на AIX и HP-UX. В нашем случае - это как стрелять из пушки по воробьям.
У нас есть желание пересеть на другую библиотеку. Например, boost. Но это тоже монстр, к тому же монстр, требовательный к свежести компиляторов в плане С++, но мы вынуждены "сидеть" порой на старых компиляторах, так как сотни клиентов их используют. Так что вопрос простоты сборки boost'а тоже под большим вопросом.
Есть и еще вариант - написать все самим на основе системных вызовов, openssl и pthreads. Здесь начинается проблема сопровождения и тщательного тестирования на каждой платформе. С другой стороных - нет зависимости от стороннего почти ненужного монстра (ACE или boost), легкость и прозрачность исходников.
Можно также подобный доморощенный framework выложнить в open-source, и может быть привлечь тем самым сторонних людей для полировки библиотеки.
Хотел бы совета на тему, какую бы такую легковесную библиотеку выбрать, которая бы делала что описано выше, и при этом не была монструозной.
воскресенье, 6 марта 2011 г.
Бонусы
Многие компании платят бонусы по итогам года. Обычно их выплачивают в начале следующего года, когда формально подведены итоги, сделаны все performance review, получены данные о прибыли компании за год, ее ситуации на рынке и т.д.
Как вы думаете, что обычно происходит сразу после знаменательной даты выплаты бонусов? Правильно - начинается массовое катапультирование людей (другими словами, те, кто планировал уволится - пишут заявление). И забавно наблюдать, как десятки людей уходят практически в один день.
Мораль: готовые ожидаемые бонусы - это дестабилизирующее зло. Плати людям достойную зарплату регулярно и выплачивай бонусы по итогам сделанной работы сразу, чтобы для их получeния надо было работать, а не просиживать штаны в их ожидании.
В декабре я ушел из Блумберга и с начала года вернулся в свою предыдущую компанию Теменос.
Я не стал ждать златоносного бонусного марта. Мне сделали отличное предложение на менеджерскую позицию, от которого было невозможно отказаться.
А давеча вчера я был на коллективной пьянке нашего солидарного программисткого брата, в общем и целом просвященной пачке увольненцев из Блумберга. Сейчас реальная движуха на рынке - инвестиционные банки берут людей пачками, предлагая очень хорошие зарплаты.
В целом, в ротации людей нет особо ничего плохого. Те, кто уходят, довольны, что нашли что-то лучше. Те, кто остается, тоже не должны особо страдать, так как появляются места в компании, которые можно будет заполнить. Еще это значит, что в компании начинается новый виток найма.
пятница, 4 марта 2011 г.
Кто из компиляторов быстрее - cl, lcc или tcc
Люблю делать всякие сравнения компиляторов.
Сегодня на ринге Студия 2010, lcc и tcc. Все три я активно использую под Windows для языка С.
Сравнивать будем на любимом решете Эратосфена (erato-c-int.c):
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <math.h>
int main(int argc, char* argv[]) {
int n = argc > 1 ? atoi(argv[1]) : 100;
int* S;
int count;
int sz = n * sizeof(*S);
int i, j;
long sqrt_n = sqrt(n) + 1;
printf("%d\n", n);
S = malloc(sz);
memset(S, 0, sz);
for (i = 2; i < sqrt_n; ++i)
if (S[i] == 0)
for (j = i*i; j < n; j+=i)
S[j] = 1;
count = 0;
for (i = 2; i < n; ++i)
if (S[i] == 0)
count++;
printf("%d\n", count);
free(S);
return 0;
}
Скрипт для запуска (Makefile):
SRC=erato-c-int
N=100000000
all: build run
build: build-cl build-lcc build-tcc
run: run-cl run-lcc run-tcc
build-cl:
@cl /nologo /O2 -Fe$(SRC)-cl.exe $(SRC).c
run-cl:
@echo ---
-@cl 2>&1 | findstr Compiler
@ntimer.exe $(SRC)-cl.exe $(N) | findstr ETime
build-lcc:
@c:\lcc\bin\lcc -O2 -o $(SRC)-lcc.obj $(SRC).c
@c:\lcc\bin\lcclnk -o $(SRC)-lcc.exe $(SRC)-lcc.obj
run-lcc:
@echo ---
@c:\lcc\bin\lcc -v
@ntimer.exe $(SRC)-lcc.exe $(N) | findstr ETime
build-tcc:
@c:\tcc\tcc -O2 -o $(SRC)-tcc.exe $(SRC).c
run-tcc:
@echo ---
@c:\tcc\tcc -v
@ntimer.exe $(SRC)-tcc.exe $(N) | findstr ETime
Погнали:
--- Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 ETime( 0:00:04.374 ) UTime( 0:00:04.196 ) KTime( 0:00:00.124 ) --- Logiciels/Informatique lcc-win32 version 3.8. Compilation date: Jan 29 2011 11:51:05 ETime( 0:00:04.415 ) UTime( 0:00:04.102 ) KTime( 0:00:00.202 ) --- tcc version 0.9.25 ETime( 0:00:04.944 ) UTime( 0:00:04.492 ) KTime( 0:00:00.280 )
Вывод не особо захватывающий. Все выступили примерно одинаково.
Посты по теме:
среда, 2 марта 2011 г.
Моделирование электронных схем в Proteus ISIS
Этот пост будет не про программирование в привычном понимании, а в несколько ином ключе.
Когда-то я немного увлекался микроэлектроникой, и в частности, программированием микроконтроллеров типа PICmicro. Мои познания в мире электронных схем, особенно аналоговых, крайне скромны и не уходят дальше институтского курса электротехники. Хотя в цифровой электронике немного проще, ибо там многое уже идет из понятного двоичного мира.
Когда возишься с микроконтроллерами так или иначе приходится брать в руки паяльник. Я это не очень люблю, хотя даже освоил весьма забавный способ нанесения разводки на печатную плату с помощью лазерного принтера и утюга для последующего травление хлорным железом. Мне сразу хочется перейдти к возьне с прошивкой, нежели с пайкой. Благо, современные средства макетирования типа того, что на картинке ниже, сильно упрощают задачу.
Подобные макетные платы меня весьма устраивали.
Но сегодня я познал совершенно иной уровень - абсолютно цифровой.
Брат дал возможность повозиться с софтом для эмулирования электрических схем. Называется, Proteus ISIS.
Тут просто какой-то беспредел. Ты просто рисуешь схему, набирая ее из огромной базы компонент, а потом ее просто запускаешь! В реальном времени! И этот софт делает имитацию схемы на уровне законов физики в плане электричества. Я не знаю, какова "глубина" имитации (врядли на уровне электронов ;-), но выглядит, очень убедительно (см. мои примеры ниже).
Конечно, первым делом мы нарисовали классический мульти-вибратор.
На видео видно, как происходит симуляция (рекомендую полный экран). Обратите внимание на поведение светодиода, вольтметров и амперметров, и, самое прикольное, пластин конденсаторов! Они показывают, как и когда происходит их заряд-разряд.
А теперь подключаем осциллограф! Конечно тоже цифровой.
Тут тебе и фронты сигналов, задержки, развертки и все такое.
Я вообще человек не очень впечатлительный в плане софта, но тут у меня была минута молчания, пока я осознавал масштабы возможностей. Ты фактически создаешь аналоговую схему, но макетируешь ее не то, чтобы без паяльника, я просто водя мышкой по экрану.
Я не подозревал, что все ушло так далеко вперед.
Дальше, больше. Резисторы, емкости, транзисторы и т.д. - это мелочи. Данный софт позволяет вставить в схему микроконтроллер! Например, PICmicro, загрузить в него прошивку, подать виртуальные вольты/амперы питания и поглядеть, как это все будет шевелиться в реальном времени!
Среди множества стандартных примеров в дистрибутиве есть проект - музыкальный звонок.
Я открыл проект и запустил.
Например, меняя номинал резистора, можно видеть, как меняется свечение связанного с ним светодиода. Также на видео ниже видно работу эмулятора микроконтроллера.
Ну и под занавес (пристегните ремни!). Допустим, вы разрабатываете на микроконтроллере устройство, которое будет подключаться к компьютеру по USB. Вам надо собрать реальный макет, залить в него прошивку, позаботиться о драйвере и уже только после этого подключать и смотреть, работает или нет (с первого раза, скорее всего нет).
В этом софте можно сделать проект (схему, прошивку) и виртуально подключить в реальную подсистему USB Windows! И попробовать ваше устройство в деле после двух-трех кликов мышкой.
В общем, господа, лично я полном шоке.
Дистрибутив весит всего около 70 мегов.
P.S. Софт коммерческий, поэтому не спрашивайте меня, где его брать.
P.S. Видеокаст записывал первый раз в жизни, поэтому прошу прощения за некоторый сумбур.