Показаны сообщения с ярлыком osx. Показать все сообщения
Показаны сообщения с ярлыком osx. Показать все сообщения

2014-12-04

Callbacks vs promises

Добавил в текущий проект промисы. Для сравнения

До:
-(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. да, я слоупок :)

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
- ненужность антивирусов

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"
  1. Add a new target of type "other/Cocoa Unit Testing Bundle" to the project e.g "MyAppTesting". Here all Unit test files are located.
  2. Go to MyAppTesting Build Phases and add MyApp as Target Dependency. This assures that MyApp is build before building the MyAppTesting target.
  3. Open the Build Settings of MyAppTesting and change
    • Bundle Loader: $(BUILT_PRODUCTS_DIR)/MyApp.app/MyApp
    • Test host: $(BUNDLE_LOADER)
    That causes the tests to run within MyApp.
  4. Open the Build Settings of MyApp and change
    • Symbols Hidden by default: NO (for both)
    • Strip debug Symbols during Copy: Debug:NO
    By doing so you do not have to include every .m-file into the test target.

2012-08-28

osx gui trick

System Preferences -> Keyboard -> Keyboard Shortcuts -> Application Shortcuts
добавить шорткат: 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 до сих пор не умеет готовить пути с пробелами.
Ненависть!

2012-04-20

[trick] чтение из /dev/[u]random

Баг: генератор ключей выдает один и тот же ключ, если интервал между запусками достаточно мал.

Лезу в код, вижу примерно такое.

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.

2012-04-18


Гуглил доку, случайно нажал "Перекласти цю сторінку"
Заголовок таба "какао - миша вниз" вынес мозг.