• ↓
  • ↑
  • ⇑
 
Записи с темой: Работа (список заголовков)
08:38 

Немного работы над собой

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

Все выходные думал, не удалить ли мне предыдущее псто гнева. Все-таки писал в состоянии аффекту, но решил оставить. Заодно укрепился во мнении, что к моменту рефакторинга нужно будет попытаться изменить наш локальный стандарт кодирования. Не могу сказать, что он так уж плох, ведь он поддерживает определенный порядок, но в голове давно уже роится представление о «правильном» проекте. На всякий случай выкладываю:


  • Должна быть описана цель проекта.
  • В зависимости от цели необходимо сформулировать задачу, которую будет решать проект, и требования к ее решению.
  • Общая задача должна быть декомпозирована (разбита) на набор более простых и независимых друг от друга подзадач, разделенных семантически и функционально. Эти моменты должны быть четко описаны.
  • На основе такого разделения следует описать интерфейс сформированных ранее блоков (наборы входных и выходных данных, данные для управления обработкой и общее описание механизмов). Интерфейс следует делать как можно более умеренным.
  • Вся специфика реализаций (привязка к операционной системе, внутренние механизмы, алгоритмы и даже язык реализации) должна быть предельно укрыта за этим интерфейсом и невидима для для других блоков.
  • Каждый момент должен быть задокументирован и описан с обоснованием выбора конкретного решения и способа его реализации.

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


    PS: Перечитав список во время правки, внезапно вспомнил, что именно этого требовал от нас М. А. Верхотуров во всех наших лабораторках. Забавно... и спасибо.




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

    13:45 

    Цирк уехал, а клоуны остались

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

    Преамбула: у меня начала глючить рабочая машина, выдавая синий экран смерти при включении приложения на Direct X при включенной музыке и аське. К тому ж не мог поставить ХП из-за криво работающего контроллера SATA. Выдали другую материнку, на которой не было разъёмов PS/2, поэтому пришлось взять USB-клавиатуру и мышку с другой машины, ну и сходить попросить заказать новые.


    Сегодня сходил узнать, что там с заказом. Оказалось, что мне выдадут новый комп. Угу, круто. Пошел отчитываться начу отдела насчет позаимствованной комплектухи, показал новую комплектуху новой машины (я взял, мне и отчитываться как бы). Все закончилось холиваром с человеком, который заказывал машину на тему АМД против Интела. :D




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

    20:29 

    Коты летают кругами.

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

    Итак, сегодня свершилось ЧУДО! Заработал звук и видео с этой проклятой DV-камеры! Ура!

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

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




    @темы: работа, странноэ

    09:49 

    Брррр...

    Йа волосат и бородат!
    Ушел вчера с работы в 9 вечера. Вот обьясните мне, дураку, какого черта DirectX в режиме Unicode (вызов функции с концовочкой W) возвращает строки хоть и 2-байтовые, но в кодировке ANSI? Звучит дико, но однако работает вот такое:
    // вызов DirectX, передает в DSoundEnumCallback описание каждого звукового устройства
    DirectSoundCaptureEnumerateW((LPDSENUMCALLBACKW)DSoundEnumCallback,(void*)&devices);

    /* внутри DSoundEnumCallback:
        char* strDesc - описание устройства, при указанном вызове будет указывать на мультибайтную строку.*/
    size_t wlen = wcslen((wchar_t*)strDesc);
    size_t len = (wlen+1) * sizeof(char);
    char * buf = new char[len];

    /*WideCharToMultiByte переводит строчку из 2-байтовой в однобайтовую с использованием указанной кодировки.
        CP_ACP - ANSI-кодировка, для UTF8 надо использовать CP_UTF8*/
    int n = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)strDesc, wlen, buf, wlen, NULL, NULL);

    А в используемой нами библиотеке вызов при конвертации правильный, с правильной кодовой страницей...

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

    11:56 

    Работа, ага

    Йа волосат и бородат!
    Этот кодек скоро сведет меня с ума...

    ЗЫ: Генту я допилил, угу.

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

    17:03 

    Хы! И вот снова!

    Йа волосат и бородат!
    Понадобилось мне сегодня вынести мозг сделать так, чтобы наследный класс в некоторой иерархии скрывал часть методов интерфейса родителя. Т.е. для кода, который с родителем работает - чтоб все было как прежде, а вот тот код, который с дитем связан, видеть этого кошмара не должен. Ну или должен видеть только часть интерфейса из родительской иерархии. Да, можно было бы отправить часть в private. Однако тогда у нас будет скрыт не интерфейс, а реализация метода и через тот же интерфейс можно будет до реализации достучаться.

    Пример ситуации

    Можно попробовать в некотором классе иерархии (не корневом, т.к. надо только на 1 подкласс) обьявить скрываемый метод невиртуальным, но толку от этого все равно не будет, если в корневом классе метод объявлен виртуальным.

    В результате народилась следующая идея:

    Идея, надо отметить, совершенно не новая. Адаптер в его чистом виде. Скрываемые вызовы перехватываются в классе Adaptive, остальные - банально делегируются классу Adapter, где они при необходимости уходят в реализацию классов-наследников вроде Concrete_adapter.
    Adaptive сделан внутренним классом, чтоб никто до него не достучался извне, ибо его задача - исключительно делегировать вызовы по виртуальным методам.

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

    09:15 

    Итак, "продолжаем продолжать" (с)

    Йа волосат и бородат!
    Я обещал описать как работает конструкция вот тут. Итак, были объявлены структуры ассоциируемых наборов параметров и обьявлены 2 макроса.
    В нужном месте cpp-файла соответствующим макросом обьявляется структура описания, которая сразу же обьявляет свой экземпляр. Так как экземпляр обьявляется статическим, вызывается соответствующий конструктор, добавляющий себя в карту ассоциаций. Т.к. структура обьявлена макросом, то препроцессор генерирует ключ и все нужные параметры.

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

    Еще пример для самых упоротых

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

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

    00:11 

    И снова рабочее.

    Йа волосат и бородат!
    Сегодня столкнулся с интересной задачкой.
    Есть сторонняя библиотека, регламентирующая вид своих плагинов. Есть набор плагинов как "вшитых" в код намертво, так и отдельных (часть из них - сторонние).
    Требуется прицепить к некоторым классам из плагинов некоторые одинаковые по составу наборы данных, в соответствии один класс к многим. Причем интерфейс классов этого проводить не позволяет и даже больше - некоторые конечные классы в плагинах обьявлены только в cpp-шниках, а значит в основном приложении недоступны. Чтобы стало совсем хорошо - укажем ограничение, что в некоторых из них набор определяется параметром из режима исполнения. Клиентский код работает с объектами исключительно через интерфейсы.
    Единственное, что есть у классов - аналог оператора typeid, который позволяет получить строку с именем класса.

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

    Каждый набор представляем структурой с некоторым интерфейсом, которую будем определять по строковому ключу. Ключ будет представлять собой строчку с именем класса.
    Единственное, что представляет проблему - ассоциирование класса и нескольких наборов в зависимости от некоторого условия. Ввиду того, что такая ситуация была обнаружена только во "втроенных" в код плагинах, так что в таких случаях добавляем некий метод, по которому будем различать значения. Ограничение - должна быть возможна конвертация в строку. Я в своем подходе возвращал прямо строки.

    Пример для самых упоротых. :)

    Как оно работает - опишу позже. :)

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

    18:30 

    Оммм...

    Йа волосат и бородат!
    Будем петь и плясать индийские мантры...

    for (int v = 0; v < 256; ++v) {
    int s = (v << 24) >> 24;
    // ...
    }


    (с) один из плагинов к H323plus.

    UPD: А я ступил. Это оптимизация, однако.
    Это эквивалентно коду:
    for (int v = 0; v < 256; ++v) {
    int s = (v > 127) ? -(v & 0x7f) : v;
    // ...
    }

    Т.н. "продвижение знакового бита". По кр. мере для линуксов.
    И да, этот код мягко говоря небезопасен, т.к. в 64-хбитной системе улетит к чертовой матери. Ибо sizeof (int) = 64. Ну и некоторые компиляторы могут начудить.
    Так-то. (с)

    @настроение: ыыы...

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

    11:08 

    Ложка меда

    Йа волосат и бородат!
    Вот я все ругаюсь на авторов библиотеки, а нашел в коде момент, которого даже не знал.
    // прототип функции
    // PDynaLink::Function - typedef указателя на функцию
    void foo( PDynaLink::Function & );

    // FunctionPtr - typedef указателя на функцию (сигнатура отлична от PDynaLink::Function)
    FunctionPtr getSmth;

    // пример кастования
    foo( (PDynaLink::Function &) getSmth );

    Вот честно скажу - никогда доселе не видел, чтобы объект одного типа кастовали к ссылке другого типа.
    Но подход оригинален.

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

    14:43 

    Нашел вот в хедере вот такой коммент

    Йа волосат и бородат!
    // NOTE!!!!! Due to an error in judgement, you cannot add ANY more fields
    // to this structure without an API version change!!!!

    ЩИТО? "error in judgement"?.. Какой еще, нахрен, judgement?!

    А еще мне нравится тип const void *. Выглядит даедрически.

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

    20:28 

    Пыщ.

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

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

    11:47 

    Перл, достойный code_wtf

    Йа волосат и бородат!
    Про порождение нового класса, хотя можно было обойтись 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.

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

    15:15 

    Гм... удивлен я.

    Йа волосат и бородат!
    Вот есть класс:
    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 &) {}
    };

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

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

    13:02 

    Таки работа, ага

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

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

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

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

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

    14:04 

    Лучи поноса на них!

    Йа волосат и бородат!
    Вот что ни говорите, а Микрософт - пидарасы. Какого х..я у них в хедерах нет ни
    #pragma once
    , ни #ifndef SMTHNG
    #define SMTHNG
    ...
    #endif
    ???

    Я уже зае заниматься тупым шаманством где не надо!

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

    17:47 

    Рабочее

    Йа волосат и бородат!
    Написал класс, который в видеопамяти меняет размер картинки независимо от формата видеоизображения. Мозги пыщ!
    Скоро, как только придут книжки, буду учиться писать шейдеры под OpenGL - будем грузить железо конвертацией форматов.

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

    20:54 

    Обещанно-рабочее

    Йа волосат и бородат!
    Итак, сегодня я первый раз вышел на работу. Ну что сказать... коллектив мне оч понравился - дружный, сплоченный, начальство подчиненных не чурается. Сегодня маялся дурью пока ставилась ОСь (к слову - мне вручили Vista Business) и Студии (2005, 2008) с патчами и сервис-паками. Видя мою борьбу со сном, мне сказали, где находится кофейня.

    Вот... вообще задачу уже дали - нужно вторым каналом видео пустить изображение с окна. Любого окна.

    ЗЫ: А контора называется ФГУП ГРЧЦ НИИР-КОМ.

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

    18:34 

    Наконец-то...

    Йа волосат и бородат!
    Ответственно заявляю - послезавтра, в пятницу 15-го мая я выхожу на работу. Гип-гип, ура!

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

    14:16 

    Рабочее

    Йа волосат и бородат!
    Позавчера таки сделал этот чертов vpn на работе. А история была такая

    ЗЫ: я таки осилил эти @темы. Кажется...

    @темы: админство, работа

    void main()

    главная