Показаны сообщения с ярлыком osx. Показать все сообщения
Показаны сообщения с ярлыком osx. Показать все сообщения
2015-03-06
2014-12-04
Callbacks vs promises
Добавил в текущий проект промисы. Для сравнения
До:
После
Промисы свои, написал часа за 3-4. Смотрел RXPromise и PromiseKit, но они не умеют то, что мне нужно.
До:
-(void) p_pluckHamsSinceLastPluckWithCompletion:(BarPluckHamsCompletion) completion
{
NSDate * date = [NSUserDefaults standardUserDefaults].lastPluckDate;
XXXHamPlucker plucker = ^(XXXPluckSession * session, XXXFoo *foo, XXXPluckConsumer consumer) {
[session searchBoosSinceDate:date withFoo:foo completion:^(NSError *error, NSIndexSet * boos) {
if (error)
return consumer(error, nil);
[Bar filterBoos:boos withFoo:foo completion:^(NSIndexSet *boos) {
[session pluckHamsWithBoos:boos withFoo:foo completion:^(NSError * error, NSArray * hams) {
if (error)
return consumer(error, nil);
[Bar filterHams:hams inFoo:foo completion:^(NSArray *hams) {
consumer(nil, hams);
}];
}];
}];
}];
};
[self p_pluckHamsUsingPlucker:plucker completionHandler:completion];
}
После
-(XXXPromise *) p_pluckHamsSinceLastPluck {
NSDate * date = [NSUserDefaults standardUserDefaults].lastPluckDate;
XXXHamPlucker plucker = ^(XXXPluckSession * session, XXXFoo * foo) {
XXXPromise * promise = [session searchBoosSinceDate:date withFoo:foo];
return promise.thenPromise(^(NSIndexSet * boos){
return [Bar filterBoos:boos withFoo:foo];
}).thenPromise(^(NSIndexSet * boos){
return [session pluckHamsWithBoos:boos withFoo:foo];
}).thenPromise(^(NSArray * hams) {
return [Bar filterHams:hams withFoo:foo];
});
};
return [self p_pluckHamsUsing:plucker];
}
Промисы свои, написал часа за 3-4. Смотрел RXPromise и PromiseKit, но они не умеют то, что мне нужно.
2014-07-22
some fancy swift errors
5> [1,2,3].map { $1 * 10 }
<repl>:5:9: error: type '(($T7, ($T7, $T8) -> ($T7, $T8) -> $T6) -> ($T7, ($T7, $T8) -> $T6) -> $T6, (($T7, $T8) -> ($T7, $T8) -> $T6, $T8) -> (($T7, $T8) -> $T6, $T8) -> $T6)' does not conform to protocol 'IntegerLiteralConvertible'
6> let x = [1,2,3]
x: [Int] = 3 values {
[0] = 1
[1] = 2
[2] = 3
}
7> x.map { $1 * 10 }
<REPL>:8:7: error: 'Int' is not a subtype of '(($T5, ($T5, $T6) -> ($T5, $T6) -> $T4) -> ($T5, ($T5, $T6) -> $T4) -> $T4, (($T5, $T6) -> ($T5, $T6) -> $T4, $T6) -> (($T5, $T6) -> $T4, $T6) -> $T4)'
x.map { $1 }
и эти люди ругают С++ за сообщения об ошибках...PS. Если что, правильный код -- x.map { $0 * 10 }
2014-01-03
Яббл тоже страдает NIH-синдромом.
Собирал одну С-библиотеку. Как водится, 100500 предупреждений, которыми никто не парится.
Обратил внимание на ряд "XXX is deprecated, first deprecated in OS X 10.7".
Начал гуглить -- в 2011 они объявили "старое" криптоапи устаревшим (наверное, нашли в нем Фатальный Недостаток TM). Взамен рекомендуют CF-api с блекджеком и шл^W^W^W блоками и пайплайнингом операций. Причем оно доступно только в OS X, для iOS есть "CommonCrypto", почти совместимый с OpenSSL.
P.S. да, я слоупок :)
Обратил внимание на ряд "XXX is deprecated, first deprecated in OS X 10.7".
Начал гуглить -- в 2011 они объявили "старое" криптоапи устаревшим (наверное, нашли в нем Фатальный Недостаток TM). Взамен рекомендуют CF-api с блекджеком и шл^W^W^W блоками и пайплайнингом операций. Причем оно доступно только в OS X, для iOS есть "CommonCrypto", почти совместимый с OpenSSL.
P.S. да, я слоупок :)
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
- ненужность антивирусов
2012-12-03
шиндовс вперде
Админ кинул в общий чат ссылку на локальную репу обновлений для MacOS. Разговорились по этому поводу на кухне. Внезапно - в нашем офисе из 40+ человек винда стоит у шестерых(!). Остальное - Mac или Linux.
2012-08-31
Юнит-тесты и iOS.
Хотел в новом проекте под ios сделать все кошерно -- отделить логику от гуя, обложить логику юнит-тестами. Ага, щаз.
Вынес логику как статическую либу -- потерялись некоторые методы. Проект компилируется без ошибок, а в рантайме падает - Unrecognized Selector. Как оказалось, без флага -ObjC линкер не подтягивает категории (аналог extension methods из C#) из статических библиотек. Благо сотрудник уже с таким сталкивался, подсказал.
Начал пилить тесты. Инициализация MagicRecord (библиотека для active record) падает с исключением "URL is nil". Не находит схему данных. Смотрю внутрь бандла теста - лежит. Оказалось, она пытается загрузить схему из ресурсов главного модуля. А для юнит-тестов главным модулем является программа otest из SDK.
Upd. Юнит-тесты поборол. Решение со StackOverflow:
Assuming you have an application target called "MyApp"
Вынес логику как статическую либу -- потерялись некоторые методы. Проект компилируется без ошибок, а в рантайме падает - Unrecognized Selector. Как оказалось, без флага -ObjC линкер не подтягивает категории (аналог extension methods из C#) из статических библиотек. Благо сотрудник уже с таким сталкивался, подсказал.
Начал пилить тесты. Инициализация MagicRecord (библиотека для active record) падает с исключением "URL is nil". Не находит схему данных. Смотрю внутрь бандла теста - лежит. Оказалось, она пытается загрузить схему из ресурсов главного модуля. А для юнит-тестов главным модулем является программа otest из SDK.
Upd. Юнит-тесты поборол. Решение со StackOverflow:
Assuming you have an application target called "MyApp"
- Add a new target of type "other/Cocoa Unit Testing Bundle" to the project e.g "MyAppTesting". Here all Unit test files are located.
- Go to MyAppTesting Build Phases and add MyApp as Target Dependency. This assures that MyApp is build before building the MyAppTesting target.
- Open the Build Settings of MyAppTesting and change
- Bundle Loader: $(BUILT_PRODUCTS_DIR)/MyApp.app/MyApp
- Test host: $(BUNDLE_LOADER)
- Open the Build Settings of MyApp and change
- Symbols Hidden by default: NO (for both)
- Strip debug Symbols during Copy: Debug:NO
2012-08-28
osx gui trick
System Preferences -> Keyboard -> Keyboard Shortcuts -> Application Shortcuts
добавить шорткат: All Applications, Zoom, Cmd+Shift+Up
После этого хоть как-то можно жить. Хотя до Win7 или Unity все еще далеко.
добавить шорткат: All Applications, Zoom, Cmd+Shift+Up
После этого хоть как-то можно жить. Хотя до Win7 или Unity все еще далеко.
2012-08-23
Кавычки нам не нравятся
gcc-llvm в макос игнорирует параметры -isysroot и -idirafter, если их параметр указать в кавычках.
И кто они после этого.
g++ -idirafter /opt/local/includeработает, а
g++ -idirafter "/opt/local/include"нет.
И кто они после этого.
2012-08-09
libtool, мать его.
2012 год на дворе.
Космические корабли бороздят ...
А факин libtool до сих пор не умеет готовить пути с пробелами.
Ненависть!
Космические корабли бороздят ...
А факин libtool до сих пор не умеет готовить пути с пробелами.
Ненависть!
2012-04-20
[trick] чтение из /dev/[u]random
Баг: генератор ключей выдает один и тот же ключ, если интервал между запусками достаточно мал.
Лезу в код, вижу примерно такое.
Далее этот класс инстанциируется для T = uint32_t.
Первое, что бросается в глаза, что /dev/urandom мы открываем как текстовый файл. А потом пытаемся читать из него 4хбайтное целое.
Добавил ios::binary -- лучше не стало.
Вынес в отдельный файл, стал экспериментировать.
Не читается uint32 из '/dev/random'.
Поменял тип на char - читает.
На short - опять не читает.
И такое поведение одинаково на osx, linux и freebsd.
А потом я вспомнил, что /dev/[u]random - это character device.
Лезу в код, вижу примерно такое.
template <typename T>
RandomGenerator::RandomGenerator() {
T seed = 0;
{
std::ifstream in("/dev/urandom");
in >> seed;
}
if (!seed)
seed = clock(NULL);
... // далее seed используется, чтобы инициализировать один из бустовских ГПСЧ.
}
Далее этот класс инстанциируется для T = uint32_t.
Первое, что бросается в глаза, что /dev/urandom мы открываем как текстовый файл. А потом пытаемся читать из него 4хбайтное целое.
Добавил ios::binary -- лучше не стало.
Вынес в отдельный файл, стал экспериментировать.
Не читается uint32 из '/dev/random'.
Поменял тип на char - читает.
На short - опять не читает.
И такое поведение одинаково на osx, linux и freebsd.
А потом я вспомнил, что /dev/[u]random - это character device.
Подписаться на:
Сообщения (Atom)
