2013-12-03

одного потока хватит всем...

В GDI+ внутри Graphics.DrawImage лочится критическая секция. Поэтому  заводить более одного рабочего потока для рисования -- бессмысленно. А если еще и гуй отрисовывается картинками, то вообще фигня получается.

2013-11-25

Dot syntax in Objective C

По рсс приползло прекрасное (или ужасное, как посмотреть).
Люди делают в Objective-C вызов метода через точку. К примеру, a.plus(b) вместо [a plus:b] :
Заводят рид-онли свойство plus, которое возвращает блок (ака лямбда), который зовет у self метод plus: с переданным параметром.
Получается (a.plus)(b).

PS. Смотреть тут

2013-11-20

о посредниках.

Чтобы Visual Studio 2013 увидела 2008-ю как toolset (IDE от 2013, компилятор от 2008), нужно установить 2010-ю.

2013-10-18

Разработчики openSUSE -- <нехорошее слово>.


Есть программа, назовем ее abc, плагины к которой на других системах находятся в /usr/lib/abc (c погрешностью до /usr/lib64/abc или /usr/lib/x86_64-linux-gnu/abc).
В сусе эти плагины ВНЕЗАПНО лежат в /usr/lib64/libabc-1_0.

PS. Project Owner заменил мой код (беру из `ldd abc` путь к libabc.so, к нему добавляю "/abc") на другой костыль: вызов abc с несуществующим плагином и парсинг пути из сообщения об ошибке.

2013-07-22

Заменил Caps Lock на Ctrl.

Собственно, сабж.

Если кому интересно:
[HKEY_CURRENT_USER\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00 


2013-06-21

Способ реализации "приватного" АПИ

Интересный трюк:
template < typename T > 
class access_key {
private:
    friend T;
    access_key() {}
};

class repairmen;

class elevator {
public:
    void fix( access_key<repairman> );
};

class repairman {
public:
    void fix_elevator( elevator & e ) { 
        e.fix( access_key<repairman>() ); 
    }
}
увидел тут

2013-05-08

Много видал я извращений с макросами, но такого ...

Cello is a GNU99 C library which brings higher level programming to C.

Interfaces allow for structured design;
Duck Typing allows for generic functions;
Exceptions control error handling;
Constructors/Destructors aid memory management;

Ссылки на примеры:
Пример программы:

#include "Cello.h"

int main(int argc, char** argv) {

  /* Tables require "Eq" and "Hash" on key type */
  var prices = new(Table, String, Int);
  put(prices, $(String, "Apple"),  $(Int, 12)); 
  put(prices, $(String, "Banana"), $(Int,  6)); 
  put(prices, $(String, "Pear"),   $(Int, 55));

  /* Tables also supports iteration */
  foreach (key in prices) {
    var price = get(prices, key);
    print("Price of %$ is %$\n", key, price);
  }

  /* "with" automatically closes file at end of scope. */
  with (file in open($(File, NULL), "prices.bin", "wb"))) {

    /* First class function object */
    lambda(write_pair, args) {

      /* Run time type-checking with "cast" */
      var key = cast(at(args, 0), String);
      var val = cast(get(prices, key), Int);

      try {
        print_to(file, 0, "%$ :: %$\n", key, val);
      } catch (e in IOError) {
        println("Could not write to file - got %$", e)
      }

      return None;
    };

    /* Higher order functions */
    map(prices, write_pair);
  }

  delete(prices);
}

На что только люди не пойдут, чтоб на С++ не писать.

2013-04-18

продолжаем извращаться

Еще один вариант "типизированных" коллекций в Objective C
#define NSArray_(T) NSArray
#define NSDictionary_(K,V) NSDictionary
NSArray_(NSString) * strings = …
NSDictionary_(NSString,NSString) * dict = 

2013-04-15

Немножко извращений с Objective C

1. Ехал лямбда через лямбда... 
Реальный код, убрал несущественное...
- (void) processItems:(NSDictionary *) items
                using:(void (^)(Item * item)) processor
{
    [self runBlock:^() {
        NSError * error = [self catchNSError:^() {
            [items enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
                [obj enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                    processor(obj);                                        
                }];
            }];
        }];
    }];
}

2. Типизированные коллекции в Obj-C
NSArray/*<NSString*>*/ * strings = ...
NSDictionary/*<NSString*,NSString*>*/ * dict = ...

2013-03-13

СЯУ, почему grep -- grep.

 В честь команды ed-а
 g/regular-expression/p.

2013-03-06

ubuntu mir


Глянул на ланчпаде исходники Mir-а. Хороший С++11, с auto, лямбдами, умными указателями.
Используют boost и google-protobuf.

6 дней работы над новым старым проектом.


>python svn-diffstat.py -rXXX
22 files changed: 2741 insertions(+), 4069 deletions(-) = -1328

svn-diffstat.py, если че.

2013-02-25

программистской мизантропии псто

Почти 5 лет (c 2006 по 2011) я, в основном, занимался одним проектом. Можно сказать, "варился в собственном коде". Да, там есть "странные" вещи, вроде самопального rtti с регистрацией в фабрике, но в целом, смею надеяться, код пристойного качества.
С начала 2011 года поучаствовал в полудюжине проектов, как доставшихся "в наследство", так и новых, как целиком проприетарных, так и использующих opensource библиотеки. И что-то с каждым таким проектом мне все грустнее...

Пытаюсь понять, что движет:
  • людьми, разрабатывающими пакетный менеджер под embedded-систему, который не проверяет, достаточно ли свободного места для установки пакета.  И который, когда место заканчивается, оставляет систему в невалидном состоянии:
    • Raspbian: попытка освободить место через `apt-get remove что-нибудь` требует `dpkg --configure -i`, который пытается уставить те самые пакеты, которым не хватило места.  Хорошо, что пишка грузится с карточки, которую проще залить заново с образа, чем разбираться с глюками.
    • Angstrom: opkg ведет себя еще веселее, игнорируя ошибки установки пакетов, а потом, поскольку один из пакетов был "системным", перезагружая устройство. Которое у меня больше не завелось.
  • человеком, пишущим библиотеку, в которой все контейнеры хранят void*,  вместо enum везде используется int, но поля to, from, cc, bcc в заголовке e-mail имеют разный тип:
    struct env_to { list * to_list; };
    struct env_from { list * from_list; };
    struct env_cc { list * cc_list; };
    typesafety, чо.
    Ну, и предлагающим использовать функции вроде
    imap_search_key_new(IMAP_SEARCH_KEY_UNSEEN, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
  • людьми, радикально меняющими апи в минорном апдейте.
  • мейнтейнерами/авторами библиотеки, последняя версия которой в дистрибутивах Linux (и в Mac OS X) содержит ошибку, не позволяющую работать с буфером больше 64 кБ. Ошибке уже больше года, и не смотря на то, что она давно исправлена в master, в недавно вышедший апдейт ее фикс не вошел.
  • давно уже  не джуниором, который пишет на языке, где все функции виртуальны, код:
    void Shape::draw() {
      switch (this.kind) {
      case KindRect: ((RectShape)this).draw(); break;
      case KindCircle: ((CircleShape)this).draw(); break;
    ...
  • людьми, которые поучаствовали в десятке проектов, были lead developer-ами на двух-трех из них, но при этом стабильно плодящими копи-пасту в своем коде. 
  • людьми, которые думают, что пишут на С++, потому что используют слово class вместо struct и new/delete вместо malloc/free.
  • человеком, который после, ЕМНИП, 2-х лет работы подошел ко мне, и спросил: "как пользоваться svn"
  • людьми, заводящими массив констант на 3,5 KLOC. Который нужно обновлять вручную пару раз в месяц.
  • людьми, чьи классы так плотно завязаны друг на друга и платформенно-зависимый код, что попытка собрать часть проекта на другой, пусть и родственной платформе обречена на провал.
Нет, я, конечно, тоже не д'Артаньян. Бывает, допускаю memleak или double free в С или Objective-C. Бывает, коммичу в транк нерабочий код. У всех бывают факапы.
Но, блеать, некоторые их замечают и фиксят.

2013-02-14

Маконенависти очередной псто

Читая RSS, наткнулся пост "что вам нравится в МакОС" на ДОУ. Первым пунктом было:
 Типографика. Алгоритм сглаживания шрифтов в Mac OS настолько хорош, что я искал и ставил специальную программу для Windows, «чтобы было похоже».
На что моей первой реакцией было "лолчто?!" Сглаживание шрифтов в МакОС (а особенно в XCode) меня дико раздражает.  Кстати, интересно, как AppCode удается быть менее ШГ,  используя тот же шрифт, что и XCode?.
Ах да, наверное, если бы у меня был не обычный монитор, а Apple Cinema или MacBook c уриной ретиной, я бы считал по-другому.

 "Гуй застрял в 90х! -- Вы хотите странного и это не нужно".
Развернуть окно на пол-экрана (фича, которая из маргинальных тайловых менеджеров давно перекочевала в гламурный гуй вроде Unity или Win7) -- "А это нужно? Можете описать юзкейс?" Хотя и привели в комментах парочку программ (одну платную, и одну бесплатную), которыми это можно сделать. При этом на сайте бесплатной про клавиатурные хоткеи написано 2 предложения, все остальное -- touchpad gestures).
Развернуть окно, свернутое в док -- "Используй силу мышку, Люк". Ctrl+F2, W, вниз до конца, выбрать из списка, Enter -- весьма эргономично, да. Да и в целом -- мышкой возить приходится на порядок больше, чем в Windows/Linux, что раздражает.
Наверное, будь у меня не трекбол, а Magic Mouse или Magic Trackpad, я бы считал по-другому.

Маковские хоткеи.. О... Особенно в альтернативно одаренных программах вроде XCode. Вообще, разработчиков XCode после смерти в аду будут ждать какие-нибудь дешевые раздолбанные Chicony (нормальных old-school Mitsumi они не заслужили), на которых они должны будут перенабрать код XCode в XCode. И никаких мышей, не говоря уже про тачпады. Попробуйте переключиться на другой файл с клавиатуры. "Используй мышку, Люк".
Поведение Home/End/PgUp/PgDown -- не такое, как в Win/Linux. Think different.
Command, которая основная мета-клавиша, обычно забиндена на Windows key. После месяца-двух работы под OSX начинает болеть левая рука.
Ах да, будь у меня не эргономичная микрософтовская клава, а Apple Keyboard, я бы считал по-другому.

Неспешность. Как оказалось, я не один такой, у которого более-менее современный мак (i5, 4 GB DDR3 1600) тормозит при одновременно запущенных XCode и AppCode. Которые съедают ~500 Mb  и 1 Gb памяти соответственно. При этом free memory ~ 100-200 Mb, inactive memory ~ 500 Mb, но своп в 2-3 Gb присутсвует. Ах да, будь у меня больше памяти и SSD винт, я бы считал по-другому.

iTunes. Помню время, когда он был пусть и перегруженным комбайном, но еще вполне юзабельным. Я даже им пользовался под Windows. А сейчас... Можно поставить другой плейер, но чтобы iTunes не запускался по нажатии кнопки play на клавиатуре, нужно патчить или переименовывать бинарник одного из системных сервисов.

Objective-C. Попытка скрестить скорость C и ООП-идеологию SmallTalk. Язык, который был неплох на момент своего изобретения, но сейчас... Да, язык развивается, ручное управление памятью ушло в прошлое, уступив ARC, появились блоки ака замыкания. Только вот GC и блоки были в исходном Smalltalk-80.
Отдельно доставляет многословность языка. Когда пишешь (утрирую):
NSMutableArray * mutableArray = [NSMutableArray mutableArrayWithCapacity:...];
так и хочется откомментить: "DRY? Не, не слышал."
Ну, и имхо,
fs::path prefix = "/usr";
fs::path bin_prefix = prefix / "bin";
читабельнее, чем
NSString * prefix = @"usr";
NSString * bin_prefix = [prefix stringByAppendingPathComponent: @"bin"];

Когда в rss-ленте читаешь про хаскель, алгебру типов, зависимые типы, Agda/Coq/Идрис, монады там всякие и прочий матан, а потом пишешь код на слабо-типизированном языке, который местами даже "stringly-typed" --  где аналог LINQ выглядит примерно как ...
NSArray * expired = [tasks filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"expirationDate < %@", [NSDate date]]];
Когда пишешь на динамическом языке без REPLа...
Когда в динамическом языке при некоторой доле невнимательности все же можно добиться SIGSEGV, таки разыменовав нулевой указатель...
Когда читаешь про transactional memory и минимизацию сайд-эффектов для распрараллеливания, а потом работаешь с обьектами, для которых не то что модифицировать, но даже читать(Привет, CoreData!) свойства в других потоках нельзя...
Это грустно.



Ах да, если бы меня покусал Стив Джобс, я бы считал по другому. :)

Справедливости ради, к плюсам OSX можно отнести
- наличие Unix окружения,
- предустановленные perl/python/ruby
- ненужность антивирусов

2013-01-28

"Откопали стюардессу"

Конь-ди-дат на падавана С++ прислал выполенное тестовое.
На Borland C++ for DOS. conio.h, clrscr, window, рамочки ascii-графикой...
Парню 26 лет.  

2013-01-24

сишники узнали о for_each

Из одной библиотеки (на которую я уже жаловался)

typedef void (* clist_func)(void *, void *);
void clist_foreach(clist * lst, clist_func func, void * data) {
  clistiter * cur;
  for(cur = clist_begin(lst) ; cur != NULL ; cur = cur->next)
    func(cur->data, data);
}

//....

clist_foreach(list, (clist_func)free, NULL);

Если кто забыл -- void free(void*). То есть, имеем UB по стандарту С. Да, оно работает, пока cdecl и компилятор не намудрит с оптимизацией.

Интересный факт: так как это UB, компилятор имеет право делать все, что угодно. Prerelease GCC 4.3, если типы функций были несовместимы, возвращал NULL. К релизу пришлось поменять назад, ибо дофига софта "поломалось".

2013-01-21

PHP-шники такие PHP-шники.


Используют $_b и $_e вместо $_behaviors и $_events в качестве имен переменных класса, потому что ... так на объект класса выделяется на пару байт меньше. Экономия памяти -- целых 8 кб на 1000 объектов.
Ну че, и скрипт должен быстрее выполняться, ибо исходник получается банально меньше по размеру. Надо им еще посоветовать оптимизации ради для отступов использовать 1 пробел или таб.