В GDI+ внутри Graphics.DrawImage лочится критическая секция. Поэтому заводить более одного рабочего потока для рисования -- бессмысленно. А если еще и гуй отрисовывается картинками, то вообще фигня получается.
2013-12-03
2013-11-25
Dot syntax in Objective C
По рсс приползло прекрасное (или ужасное, как посмотреть).
Люди делают в Objective-C вызов метода через точку. К примеру, a.plus(b) вместо [a plus:b] :
Заводят рид-онли свойство plus, которое возвращает блок (ака лямбда), который зовет у self метод plus: с переданным параметром.
Получается (a.plus)(b).
PS. Смотреть тут
Люди делают в 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
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 библиотеки. И что-то с каждым таким проектом мне все грустнее...
Пытаюсь понять, что движет:
С начала 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, наткнулся пост "что вам нравится в МакОС" на ДОУ. Первым пунктом было:
Ах да, наверное, если бы у меня был не обычный монитор, а 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
- ненужность антивирусов
Типографика. Алгоритм сглаживания шрифтов в Mac OS настолько хорош, что я искал и ставил специальную программу для Windows, «чтобы было похоже».На что моей первой реакцией было "лолчто?!" Сглаживание шрифтов в МакОС (а особенно в XCode) меня дико раздражает. Кстати, интересно, как AppCode удается быть менее ШГ, используя тот же шрифт, что и XCode?.
Ах да, наверное, если бы у меня был не обычный монитор, а Apple Cinema или MacBook c
"Гуй застрял в 90х! -- Вы хотите странного и это не нужно".
Развернуть окно на пол-экрана (фича, которая из маргинальных тайловых менеджеров давно перекочевала в гламурный гуй вроде Unity или Win7) -- "А это нужно? Можете описать юзкейс?" Хотя и привели в комментах парочку программ (одну платную, и одну бесплатную), которыми это можно сделать. При этом на сайте бесплатной про клавиатурные хоткеи написано 2 предложения, все остальное -- touchpad gestures).
Развернуть окно, свернутое в док -- "Используй
Наверное, будь у меня не трекбол, а 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 лет. На Borland C++ for DOS. conio.h, clrscr, window, рамочки ascii-графикой...
2013-01-24
сишники узнали о for_each
Из одной библиотеки (на которую я уже жаловался)
Если кто забыл -- void free(void*). То есть, имеем UB по стандарту С. Да, оно работает, пока cdecl и компилятор не намудрит с оптимизацией.
Интересный факт: так как это UB, компилятор имеет право делать все, что угодно. Prerelease GCC 4.3, если типы функций были несовместимы, возвращал NULL. К релизу пришлось поменять назад, ибо дофига софта "поломалось".
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 пробел или таб.
Подписаться на:
Сообщения (Atom)