*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

четверг, 17 марта 2011 г.

Задача: выборы мэра

В городе N жителей. Надо выбрать мэра. Чтобы минимизировать коррупцию во власти, мэр должен быть таким человеком, которого лично знают все, но он лично не знает никого.

Как выбрать мэра?

вторник, 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. Видеокаст записывал первый раз в жизни, поэтому прошу прощения за некоторый сумбур.