2010-12-28

Hate speach about BCG!

Ненавижу BGCPControlBar.
Одна из самых "индусокодных" библиотек, не смотря на то, что написана русскими.
Мега-функции на пару тысяч строк. Невиртуальность тех функций, которые следовало бы сделать виртуальными.
Типичный стиль работы с ней -- отнаследоваться, переопределить одну-две функции, ПОЛНОСТЬЮ скопировав их тела из исходников, а потом подправить одно-два условия.
У нас в конторе есть даже особый мем --"багабецеже".
А теперь эту гадость включили в состав нового MFC в 2008й и 2010й студиях.

Вот и сегодня поправил багу у них, из-за которой мой софт грузился на 6 секунд! дольше. Буст с 16 до 10 секунд -- вполне заметный прирост.

Суть баги -- CBCGPShellTree долго строит дерево папок. Если надо показать c:\users\bitfield\desktop, то делает оно это 8 секунд! Логи показали, что 6 секунд оно строит список файлов для папки Computer, а вернее, 5-6 секунд висит на GetAttributesOf у первого элемента, пытаясь узнать, есть ли в нем подпапки.
Догадались?
Первый элемент -- конечно же A:, но дисковода у меня нет физически. Добавил проверку на removable и вуаля, эта ветка дерева строится уже за 0.5 секунды.

Посмотрел исходики в MFC 2008|2010. (файл AfxShellTreeCtrl.cpp). Там эта бага не исправлена.

2010-12-20

Автоматическое обновление svn:externals

В текущем проекте через svn:externals подключается 25 либ, причем не в единый корень, а в нескольких местах (в 5 или 6 местах).
Написал тут скрипт, который автоматически выставляет экстерналы на нужные ревизии.

2010-12-14

[boost.build][trick] Ускорение сборки в boost.build

boost.build всем хорош, кроме скорости.

К примеру, анализ того, какие файлы надо пересобрать, на моем проекте (30+ либ + boost) занимает 42 секунды.
Оказывается, решение было найдено полтора года назад.

http://lists.boost.org/boost-build/2009/04/21734.php

Человек переписал стандартный анализатор инклюдов так, чтоб тот игнорировал файлы по регекспу.
добавив "в игнор" стандартные хедеры (у них нет расширения) и хедеры буста (^boost/) - получил время анализа в 22 секунды.

Уже можно жить...

2010-11-26

рабочее

Бета-тестер: кста что интересно оказалось
ты собираешь инсталлятор foo_bar.exe
я его переименовываю для вебщиков в foo_bar_baz.exe
а они его для сайта переименовывают в foo_bar.exe

2010-10-11

Одобе такое одобе

Есть проект, сохраненный как Flash CS5 Uncompressed Document.

Так вот, если файл DOMDocument.xml (хранящий содержимое основного таймлайна) чем-то занят (да хотя-бы просматривается по f3 из FAR-а), то при сохранении Adobe Flash CS5 конечно-же упадет.

И заберет DOMDocument.xml с собой в Валхаллу.
Понятное дело, что после перезапуска этот проект уже не откроется.

Хорошо хоть проект был заHGшен.

2010-09-28

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

(c)

2010-09-08

Whiteboard

типичное применение вайтборда в типичной девелоперской конторе :)

Whiteboard

2010-08-26

Странное (о выравнивании)


MSVC:

bool 2 3 4
char 2 3 4
short 4 6 8
int 8 12 16

GCC

bool 2 3 4
char 2 3 4
short 2 4 4
int 4 8 8

2010-06-25

Обрезалка ресурсов.

В VC2008sp1 и VC2010 в состав MFC входят новые классы для Ribbon-like UI.
Можно выбрать одну из пяти тем для приложения (aqua, blue, black, silver, windows7).
При статической компиляции внутрь экзешника попадают ресурсы всех тем.
Если в приложении есть переключение тем, это гуд.
А если Ваше приложение всегда должно быть одного цвета -- как то жалко тратить больше 700 KB на ресурсы, которые никогда не используются.
А если учесть то, что это PNG и они плохо жмутся пакерами...

Вот, набросал за часик на коленке питонячий скрипт, который это лечит.

import sys
from ctypes import *

w32 = windll.kernel32

def get_res_list(fname):
handle = w32.LoadLibraryW(fname)
if not handle:
return None

types = []

def types_callback(handle, t):
try:
types.append(cast(t, c_wchar_p).value)
except:
pass
return True

types_callback_t = CFUNCTYPE(c_void_p, c_wchar_p, c_long)
fun = types_callback_t(types_callback)
w32.EnumResourceTypesW(handle, fun, 0)

result = []

def names_callback(h, t, n):
try:
t = cast(t, c_wchar_p).value
n = cast(n, c_wchar_p).value
result.append((t,n))
except e:
print e
return True

names_callback_t = CFUNCTYPE(c_void_p, c_wchar_p, c_wchar_p, c_long)
fun = names_callback_t(names_callback)
for t in types:
w32.EnumResourceNamesW(handle, c_wchar_p(t), fun, 0)
w32.FreeLibrary(handle)
return result

NOT_USED = ('AQUA', 'SILVER', 'WINDOWS7', 'BLACK')
is_not_used = lambda x: x[1].split('_')[0] in NOT_USED

def remove_resources(fname, not_used):
handle = w32.BeginUpdateResourceW(fname, False)
if not handle:
return False
ok = True
try:
for t,n in not_used:
w32.UpdateResourceW(handle, t, n, 0x409, None, 0)
except e:
print e
ok = False
w32.EndUpdateResourceW(handle, not ok)
return ok


fname = u'd:\\app.exe'
not_used = filter(is_not_used, get_res_list(fname))
print remove_resources(fname, not_used)

2010-05-04

Абсолютные пути -- это злейшее зло.

2010-03-24

утка в зайце strikes back

Флеш-баннер с появляющимся и гаснущим текстом и картинкой.
50 килобайт...
Вроде и немного, но откуда?
....
Представляю внутренний монолог его разработчика:
А давай используем для красивостей tweening-компонент (на АС3), который читает, что ему делать, из xml. В котором опишем используемые шрифты, цвет фона, и переходы между "сценами" (текстом и картинкой). А текст на баннере мы будем хранить как html, конечно же в этом же xml, в percent-encoding.


БЛЁЁЁЁЁЁЁ.....

2010-03-10

Переделал несколько либ под использование precompiled headers.
Скорость компиляции выросла в 2-3 раза.
Давно надо было это сделать.

2010-02-16

Левая рука не знает, что делает правая

Как же я люблю Adobe....
class TheBase extends Object
{
private function test():void
{} 
}

class Derived extends TheBase
{
private override function test():void  
{}    
}

Флекс такое компилит, а Флеш -- нет.

2010-02-09

о ёжиках.

Бьярн Страуструп - "Дизайн и эволюция языка С++" => "Как я родил ёжика"
Андрей Александреску - "Современное проектирвоание на языке С++" => "Как я трахнул ёжика"

(с) zabivator.livejournal.com

UPD:
den: ага, в таком случае "каждый программер должен знать и владеть с++" => "Який ти в чорта лицар, якщо голою сракою їжака не вб`єш?"

2010-01-29

... утка в зайце, заяц в шоке!..

Отдекомпилил флешевый загрузчик фоток Вконтакта.

Оказалось, что они используют адобовкую Alchemy.
Это такая хрень, что позволяет компилить C/C++ код в байт-код AVM2 (ActionScript 3).
Так вот, в загрузчик фоток вконтакта вкомпилена либа по работе с jpeg (от IJG).
Пережимают фотки...


Гугление показало, что это сделано для ускорения конвертации в JPEG.

Сишный код,скомпиленный в помесь АС3 байткода и х86 (который выполняется на написанном на AC3 интерпретаторе), выполоняется в несколько раз быстрее, чем реализация джипег-энкодера на чистом AC3. Как-то странно это все.
То-ли у алхимии такой хороший эмитер кода, то-ли у флеша/флекса -- плохой.