2011-12-21

euler-69

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

2011-11-15

пехапешники такие пехапешники:


var $cnonce = "f0ecf39d64caeed767075abcc6bec8bz";// This string should be auto-generated

2011-11-09

Euler

1
sum x = x * n * (n + 1) `div` 2 where n = 999 `div` x
solve = sum 3 + sum 5 - sum (3*5)

2

add x acc = if even x then acc + x else acc
fib a b acc = if b > 4000000 then acc else fib b b' acc'
  where b' = a + b
           acc' = add b acc
solve = fib 1 1 0

3 Пытался делать через решето Эратосфена. Тупит. Тупой брутфорс сразу дал ответ

source = 600851475143 
divide s x  
  | s == x = x
  | s `mod` x == 0 = divide (s `div` x) x
  | otherwise = divide s (x + 2) 

solve = divide source 3

2011-11-01

Happy debugging, bitfield

Все тот же линуховый демон.
Софт работал, работал, а в один "прекрасный" момент после перекомпиляции -- перестал.
Полтора дня пытался понять, кто портит память (прога падала в недрах libc на malloc/free).
....
Два класса с одинаковым названием, лежащие в разных файлах. Отличаются одним полем с нетривиальным ктором/дтором. Оба используются в проекте. Нарушение ОДР в чистом виде.
Happy debugging, bitfield.

2011-10-12

битфилдшоке

Месяц назад мне передали два проекта.
с тех пор битфилдшоке.

1. Небольшое виндовое клиент-серверное приложение.
  • Цикл обработки сообщений от клиента занимает 6000 строк. Одной функцией.
    Внутри процветает Копи-паста.
    Разбил на функции, вынес обшие участки -- уже уменьшил до 3клок. В планах - уменьшить еще раза в полтора. И это только одна функция, пусть и самая большая.
  • Несколько потоков, но ресурс, разделяемый между ними, лочится на каждый чих, даже на чтение.
  • Несколько классов, используемых как пространства имен. В классе нет и полей данных, ни виртуальных функций. Он ни от кого и никем не наследуется. Просто 5-6 нестатических функций, иногда связанных по смыслу, а иногда и нет. Класс CUtils, куда добавляются все функции, используемые больше одного раза.
1. Линуксовый демон, который управляется через dbus.
  • Написан на Qt!
  • C графическим инсталлятором!
  • В целом код неплохого качества, хотя иногда и попадаются функции на 300-500 строк.
  • в коде - Qt головного мозга. Хотя, может, это с непривычки, но с трудом пробираюсть через сплошные connect, emit, SLOT и SIGNAL.
  • для синхронизации потоков используется... pipe. Рабочий поток висит на select-е, гуй получает данные через Qt-шный сокет, ложит их в буффер, и пишет в пайп 1, если все ок, или 0, если ошибка.

2011-09-08

ненавижу C style cast

Нарвался на эпичную багу с C style cast.
Был старый код:

CTreeCtrl * pTree = (CTreeCtrl *)&m_Tree;
...
... pTree->GetChildItem(TVI_ROOT) ...

Зачем там вообще приведение типа -- я хз, эта функция была писан не мной.

В один прекрасный момент тип m_Tree меняется из наследника CTreeCtrl в std::auto_ptr<CTreeCtrl>.

И вместо static_cast мы имеем уже reinterpret_cast.
И ни единого ворнинга от компилятора по этому поводу.

2011-09-01

subversion 1.7

Пару недель назад поставил клиент 1.7.
При установке ругнулся -- "бла-бла-бла, я проапгрейджу вам рабочую копию.."
Ну проапгрейдишь так проапгрейдишь...

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


2011-07-18

Виртуальные машины заполонили ...

Поставил FlashDevelop - IDE, написанное на С# (1я виртуальная машина), которое при помощи flex sdk, написанного на Java (2я виртуальная машина), компилит ActionScript в байт-код, исполняемый Flash Player (3я виртуальная машина).

2011-05-31

Из последних извращений
struct Node {
  typedef bool ExpandFn(/*some args here*/); 
  virtual ExpandFn expand_group;
  virtual ExpandFn expand_file;
};

bool Node::expand_group(/*some args here*/) {
  ...
}

bool Node::expand_file(/*some args here*/) {
  ...
}

2011-05-04

Обнови лося

Обновления

Обновление завершено
Эти обновления успешно обновлены и готовы к работе

(c) см. предыдущий пост

2011-03-31

adobe

"У Adobe нет программистов. У них на территории есть колодец в преисподнюю, откуда есть выход Абсолютному Злу. Это Зло, проходя через специально расставленные компьютеры, генерирует Код, который, будучи скомпилированным, рождает программные продукты Adobe.."
(с) veter_r_r via belnetmon

Яростно плюсую!

2011-02-19

зоопарк.xml

Недавно добавил в текущий проект pugixml. Внешне либа выглядит симпатично, хотя внутри там местами адЪ и израилЬ (видно, что писал сишник, ибо setjmp/longjmp в плюсовом коде). Но работает шустро и без глюков.

Фишка в том, что в проекта уже используется TinyXml, а под виндой гуй использует и MSXML.
Так что теперь у меня в проекте 3 библиотеки, делающих одно и то же.

Еще одно "веселье" в том, что обе либы (и pugi, и tiny) пришлось патчить.

в первом случае(TinyXml) -- потому-что генерируемый файл должен быть human-readible и может содержать яваскрипт -- так что крайне нежелательно экранировать переводы строк и одиночные кавычки, как в pcdata, так и в значениях атрибутов.
Во втором(pugi) -- наоборот, софт, обрабатывающий выходной файл, игнорирует неэкранированные переводы строк в pcdata.
И ведь и в пуги, и в тайни есть класс "принтер", позволяющий настроить сохранение. Но всё, что они могут -- только задать перенос строк и индент. Эскейпинг сделан статической функцией.

И после этого вы говорите, что Xml спасет мир?

2011-02-10

нашел неожиданное применение для continue

Есть в С/С++ такой частый паттерн, как цикл без тела.
while (*dest++ = *src++);
while (i != end && *i++ < 5);
Он заслуженно считается антипаттерном -- если забыть точку с запятой, можно огрести. Кроме того, сама фраза звучит как-то неокончено. Альтернативные варианты этих циклов выглядят как то громоздко:
while (*dest = *src) {
  ++dest; ++src;
}
while (i != end)
  if (!(*i++ < 5))
     break;
Нашел альтернативу:
while (*dest++ = *src++)
  continue;
while (i != end && *i++ < 5)
  continue;

И выглядит закончено (пока что-то делается, продолжать), и забытая точка с запятой приведет к синтаксической ошибке.

2011-02-03

Дай списать

bitfield
а %CONCURENTNAME% нас давно забанили? после той ссоры?
beta-tester
ога. ну прокси никто не отменял. хо почитать их форум?
beta-tester
можно считать что они нам язык показали обидевшись, забанив айпишник
bitfield
да я хотел им баг зарепортить...
beta-tester
зачем? они ж пофиксят
bitfield
тогда я б узнал, как его фиксить .. а так прийдется его фиксить мне, а они потом у меня "спишут" 

2011-01-14

параллельная сборка в MSVC

При сборке проекта из-под 2005/2008 msvc, добавьте в Configuration Properties -> C/C++ -> Command Line-> Additional options строчку /MP.
Это аналог -j у make/boost.build.

ЗЫ. В 2010 вроде для этого есть параметр в гуе, но не проверял.
ЗЗЫ. Tools->Options->Projects and Solutions -> Build and Run -> maximum number of parallel project build задает кол-во параллельно собираемых проектов, но не количество параллельно компилируемых файлов.