На дворе без малого 2015 год, а люди все еще используют VC6 (прислали сделанное тестовое).
2014-12-25
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-05-15
Что может быть проще емейла...
сотрудник: тебе не приходилось на плюсах делать проверку на типа валидный email bitfield: в инете есть страшные регекспы сотрудник: я их боюсь думал может что готовое есть bitfield: я б не парился, проверял на x@y.z where x,y,z in [a-zA-Z0-9.+-] сотрудник: так и сделаю bitfield: вообще-то, там все грустно и запущено. сотрудник: да уж, я читал про 1000 символьный регексп на перле bitfield: тесты к одному чекеру [("\"Abc\\@def\"@example.com",True), ("\"Fred Bloggs\"@example.com",True), ("\"Joe\\Blow\"@example.com",True), ("\"Abc@def\"@example.com",True), ("customer/department=shipping@example.com",True), ("$A12345@example.com",True), ("!def!xyz%abc@example.com",True), ("_somename@example.com",True), ("NotAnEmail",False), ("@NotAnEmail",False), ("\"test\\\\blah\"@example.com",True), ("\"test\\blah\"@example.com",True), -- # Phil gets false for this, which I think is wrong -- # (Dominic Sayers notes the same at the end of the comment thread) ("\"test\\\rblah\"@example.com",True), ("\"test\rblah\"@example.com",False), ("\"test\\\"blah\"@example.com",True), ("\"test\"blah\"@example.com",False), ("customer/department@example.com",True), ("$A12345@example.com",True), ("!def!xyz%abc@example.com",True), ("_Yosemite.Sam@example.com",True), ("~@example.com",True), (".wooly@example.com",False), ("wo..oly@example.com",False), ("pootietang.@example.com",False), (".@example.com",False), ("\"Austin@Powers\"@example.com",True), ("Ima.Fool@example.com",True), ("\"Ima.Fool\"@example.com",False), ("\"Ima Fool\"@example.com",False), ("Ima Fool@example.com",False)] сотрудник: ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа!!!!!!!!!!!!!!!!!!!!!!!!!! bitfield: самая жесть, в имейле могут быть круглые скобки, и они должны совпадать isValid "((lol)porges(()comme(nests)nt())@example.com" == False isValid "((lol))porges(()comme(nests)nt())@example.com" == True
isValid "\"s\\\0\"@example.com" == True -- # "s\NUL"@example.com, where NUL is actually the -- # null character! Yep, can't strlen() on email addresses... сотрудник: чудесно bitfield: да я сам в ах^Wвосхищении
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. да, я слоупок :)
Подписаться на:
Сообщения (Atom)