Йа волосат и бородат!
Ричард Столлман таки жжОт:


Йа волосат и бородат!
В-общем, смотрел я вчера статистику. Анонимусы отакуе! Большая часть читателей меня - анонимны. Писателей у меня - тоже. Вот я и подумал - а если закрыть для Гостей дайр... много ли новых юзеров появится?
Можете посмотреть сами - ссылка на статистику внизу меню моего дайра.

А еще утром я увидел вот такое:
Осторожно, траф!

Тяжелый груз манов... =О.о=

Йа волосат и бородат!
Давно я не писал сюда ничего кроме кода, да мелких мыслей-одиночек. А это - неправильно таки.

Начнем с того, что писать практически нечего. Да, тут несколько недель у меня тусили Трин, Мозг, Тами, Орл и Степа. Но право-дело писать об этом я не хочу ровно ничего, ибо пересказывать много, да и неупомню уже. Но лулзов было много. А писать отрывками не хочется.

Помнится, пару недель назад, я посмотрел на резюме автора centericq и был неприятно для себя удивлен. Разница в возрасте небольшая, а вот достижений больше. (Да-да, я, сцуко, завистливый!) Вот и задумался в очередной раз о необходимости дальнейшего просвещения. Не, в аспирантуру я не хочу идти - как ни крути, а защита диплома наложила свой неприятный отпечаток. И да, я знаю, что это глупо.
А думать я начал ни о чем ином, как о самообразовании путем чтения умных книг. Только вот незадача: читать их особо некогда, ибо дома у мя и так занятий полно, а на работе - тем более. Есть вариант - метро, но для этого они должны быть бумажными, а это дорого. Таскать с собой ноут совсем не хочется.
Посему подумал я о покупке кпк/ебука... но, цена кусается оч. Есть еще вариант распечатывать на работе, но боюсь огрести за это по голове от начальства. :)

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

Думал-думал... и все ж не удержусь я от кормления троллей рабочего. Ну, где же ваши розовые тапки? Из рабочего будут только личные выводы из обзора чужого кода.
Памятка на будущее

В общем, авторам библиотеки ptlib от меня - громадный disrespect. И я еще ни от одного своего сотрудника не слышал хорошего слова об этой библиотеке.

@музыка: Infected Mushroom - The Beauty and the Beat

@настроение: Мыслефлуд

@темы: программистское, домашнее, личное

20:28

Пыщ.

Йа волосат и бородат!
Сегодня уволили еще одного сотрудника. Ибо разгильдяй полный. Однако, человек был веселый.

@темы: работа

Йа волосат и бородат!
Ахахахахахахааааа!!! Я знаю кто вы оба! Гарпии-эмоционале!

17:38

ZOMG! WTF?!

Йа волосат и бородат!
Трин мне подарила вот такое:


Теперь я его боюся )

@темы: личное

Йа волосат и бородат!
Вот еще один ну совсем непонятный мне кусок. И опять же в этой долбанной ptlib 2.4.5:
void Unregister_Internal(const _Key_T & key)
{
PWaitAndSignal m(mutex);
typename KeyMap_T::iterator r = keyMap.find(key);
if (r != keyMap.end()) {
if (r->second->isDynamic)
delete r->second;
keyMap.erase(r);
}
}

void UnregisterAll_Internal()
{
PWaitAndSignal m(mutex);
while (keyMap.size() > 0)
keyMap.erase(keyMap.begin());
}

В keyMap сидят указатели на объект шаблона, который создает синглотона специализированного типа. Вот кто-нить мне может обьяснить, почему в UnregisterAll_Internal() не делается удаление delete keyMap.begin()->second?

Йа волосат и бородат!
Про порождение нового класса, хотя можно было обойтись typedef, я уже писал тут.

Теперь я столкнулся с куском кода, которым вчера заспамил знакомых программистов, ибо сам понять просто не в состоянии:
Перво-наперво есть класс и вот такие макросы (указано в порядке обьявления в хедере!):
template <class _Abstract_T, typename _Key_T = PDefaultPFactoryKey>
class PFactory {
    template <class _Concrete_T>
    class Worker { /*...*/ };
    /*...*/
};

//
// this macro is used to initialise the static member variable used to force factories to instantiate
//
#define PLOAD_FACTORY(AbstractType, KeyType) \
  namespace PWLibFactoryLoader { \
    extern int AbstractType##_##KeyType##_loader; \
    static int AbstractType##_##KeyType##_loader_instance = AbstractType##_##KeyType##_loader; \
  };

//
// this macro is used to instantiate a static variable that accesses the static member variable
// in a factory forcing it to load
//
#define PINSTANTIATE_FACTORY(AbstractType, KeyType) \
  namespace PWLibFactoryLoader { int AbstractType##_##KeyType##_loader; }

Используется вся эта радость следующим образом:
/* Файл cpp */
class PProcessStartup { /*...*/ };
class PluginLoaderStartup : public PProcessStartup { /*...*/ };

static PFactory<PProcessStartup>::Worker<PluginLoaderStartup> pluginLoaderStartupFactory("PluginLoader", true);

// PString - внутренний аналог std::string
PINSTANTIATE_FACTORY(PluginLoaderStartup, PString)


Вопросы - как работают макросы? Каким образом происходит принудительное инстанцирование шаблона?
Да, возможно это ни что иное, как рога и копыта (а, говорят, разработчики этим очень грешат), но блин... Уж такое можно было бы и подчистить.

ЗЫ: куски взяты из свободной библиотеки ptlib 2.4.5.

@темы: программистское, работа

Йа волосат и бородат!
01.09.2009 в 03:15
Пишет  макф:

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

URL записи

Йа волосат и бородат!
This is the time of Revolution
Converting Vegetarians...

(c) Infected Mushroom


Кофе делает меня воистину вдрыжни. Особенно крепкий и в больших количествах.
Вчера после 3 чашек свежесваренного кофе моск уснул, но увеличилась моторная активность. В результате добежал до дома быстрее раза в полтора. О.о

А еще глаза мои опять красны. =о.о=

00:42

Йа волосат и бородат!
Был в гостях. Очень рад, что увидел тебя.

Йа волосат и бородат!
while(i --> 10) { }

(с) Прислал Тами :)

Правильный код

@темы: программистское

Йа волосат и бородат!
Вот есть класс:
class PFactoryBase
{
protected:
PFactoryBase()
{ }
public:
virtual ~PFactoryBase()
{ }

// Вот почему тут сделано наследование, а не
// typedef std::map<std::string, PFactoryBase *> FactoryMap; ?
class FactoryMap : public std::map<std::string, PFactoryBase *>
{
public:
FactoryMap() { }
~FactoryMap();
};

static FactoryMap & GetFactories();

private:
PFactoryBase(const PFactoryBase &;) {}
void operator=(const PFactoryBase &;) {}
};

У кого-нить есть идеи? )

@темы: программистское, работа

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

Диаграмма еще в процессе, пакеты открытые, так что преступления сей публикацией я не совершаю.

Знаю, что "reverse-engineering пары открытых библиотек" звучит весьма странно, но "любой каприз за ваши деньги!" :)

ЗЫ: поздно заметил, что одна зависимость немного "уехала", да пофиг, в общем-то.

@темы: программистское, работа

Йа волосат и бородат!
30.08.2009 в 16:05
Пишет  макф:

"Они не сделали ничего плохого. Просто идиоты." (с)

URL записи

Йа волосат и бородат!
28.08.2009 в 03:12
Пишет  L_e_D:

Затянуться травой.


URL записи

Йа волосат и бородат!
Оставил я так мышу ненадолго в Студии... а оно вот показало такой хинт:

(Метод в хедере закрашен, ибо конспирация)

11:47

Йа волосат и бородат!
Глаза мои все еще красны, но уже более нормальны. Линзы стало носить намного легче. Сегодня последний раз капаю Тобрекс (антибиотик) и буду капать только цинковые капли с борной кислотой. Славбоху, что только 2 раза в сутки, иначе я бы этого не вынес.

@темы: личное

Йа волосат и бородат!
...когда я бежал к глазодерам. =О.о=

Все знают ситуацию, когда нужно пронаследовать несколько детишек от некоторого класса. И все знают, чем плохо перегружать в детишке невиртуальный метод, а именно что будет, если попробовать вызвать перегруженный метод по указателю на родителя. (перегруженный метод банально не вызовется, ибо в таблицу виртуалов не попадет)
Так вот для преодоления такой фигни в случае закрытого кода с родительским классом возникла мысль написать что-нить вроде:
template <typename Derived_class>
class Middle_base : public Base {
public:
Derived_class * const operator-> () {
return reinterpret_cast <Derived_class * const> (this);
}
};

Наследоваться надо вот так:
class Child : public Middle_base <Child>
{
// ...
};

При этом получается, что в момент наследования от Middle_base класс Child уже обьявлен в той же строке. :) Единственный минус конструкции - что обращаться надо по указателю на Middle_base.

Единственный вопрос возникает - нафига при таком подходе вообще нужны виртуальные методы? =О.о=

ЗЫ: Учитывая, что это была только мысля, которую я еще не довёл до ума...

UPD: К сожалению, на проверке метода выявились 2 проблемы:
1) не происходит вызова Middle_base::operator-> (). Вызов сразу уходит в Base;
2) совершенно непонятно, что делать с самим классом Middle_base . Ибо каждый из них порождает отдельный тип, а это как бы мешает в случае кучи детишек. :/

@темы: странные мысли в моей голове..., программистское

Йа волосат и бородат!

(таки кликабельно, да)