[18:15] kb> Ок, переключил в красноглазый, заебали.
[18:15] bnw> ERROR. Command not found: ок,
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=152c8f53a62edfb6cc43a608de41f488c60ad4a0
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=12a2174f8f05e63aeec15d9dd16fdfd3613f192e
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=bea5a79bf7103251282b1aca3600b9867d6d4779
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=3cae3ab42b831f9746f9a5cdddf83d41e3f53907
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=749f27c782586d51e50e36ba4d06cd6684fe62e9
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=8edfc754506775df74a94886d2ace342cdb84e4b
Пожалуй, одной из прелестей FirefoxOS будет то, что теперь в этом
изобилии говняных интерфейсов можно будет сесть и за один-два вечера
наотправлять "пулл-реквестов" к любимым приложениям, которые будут
банально расставлять отступы, выравнивать шрифты ну и так
далее. Почему-то на андроиде это делать, видимо, очень сложно.
Драйвер редиса возвращает Redis (Either Reply a)
. При операции HGET
возвращает, соответственно, Redis (Either Reply (Maybe ByteString))
, типа значения по ключу может и не быть. Программист для упрощения пишет сначала специальную функцию redis'
, которая заворачивает ответ редиса в EitherT-based монаду, чтоб соединять подобные вычисления и возвращать первую неудачу:
newtype Redis' a = Redis' (EitherT Redis.Reply Redis.Redis a) deriving (MonadIO)
instance Monad Redis' where
return = Redis' . EitherT . return . Right
(Redis' m) >>= f = Redis' $ m >>= \rv -> unwrapRedis' $ f rv
redis' = Redis' . EitherT
Таким образом, теперь, если вы получаете ответ Redis (Either Reply a)
, вы его преобразуете в
Redis' (EitherT Reply Redis a)
и можете соединять подобные вычисления в do-блоке типа:
do
res <- redis' $ Redis.hget foo bar
res2 <- redis' $ Redis.hget baz zab
и вычисление остановится на первом возврате ошибки.
Далее. Программисту необходимо по кучке значений сделать HGET
и вернуть это как-то внутри кортежа, поскольку мы внутри новой монады Redis'
-- завернуть результат в неё. В случае, если значения хоть по одному ключу не существует, хочется вернуть Nothing
для всех. Потому создаётся новая монада:
newtype HashFields a = HashFields (MaybeT Redis' a)
deriving (Functor, Monad)
instance Applicative HashFields where
pure = return
(<*>) = ap
описывающая вычисления типа Redis'
, которые могут вернуть неудачу. Пишется новая функция
hashField = HashFields . MaybeT . redis'
способная завернуть результат неудачи в новую монаду, которая умеет останавливаться на первой неудаче. Также пишется специальная функция для HGET
:
getField :: ByteString -- ^ Key
-> ByteString -- ^ Hash field name
-> HashFields String
getField key field = fmap toString $ hashField $ Redis.hget key field
Также напишем функцию, которая "запустит" наше вычисление:
getRedisFields :: forall a. HashFields a -> Redis' (Maybe a)
getRedisFields (HashFields f) = runMaybeT f
И теперь лёгким движением руки мы можем сделать что-то вроде:
getRedisFields ((,,,,,) <$>
getField k "foo" <*>
getField k "bar" <*>
getField k "baz" <*>
getField k "zab" <*>
getField k "rab" <*>
getField k "oof")
Вопрос: вам не кажется это "слишком"? Я пока еще не настолько просто манипулирую типами в голове, чтоб ощутить всю ситуацию, хорошо хоть в целом могу медленно прости по шагам по коду, но есть ощущение, что что-то здесь не так.
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=2e06f4e44b4701cd800156ebe1b0e2a40f48e3bf
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=cf201c7489f5cc7d7fca69023a12dddac124d59b
Программист использует условие "buf + len >= buf_end" для проверки на переполнение указателя, подразумевая, что при очень большом значении будет осуществлено переполнение размерности типа. GCC оперирует тем, что значение после переполнения переменной с указателем в стандарте языка С считается неопределённым.
Пацаны, не знаю, как вы, а я лично тут за GCC.
Spiderpig, Spiderpig, does whatever Spiderpig does!
(c) Чувак, отвечающий на критику Леннарта о том, что Убунту без
Системд обречены. // да, новые разборки, новые расколы и выяснения
отношений
http://gentooexperimental.org/~patrick/weblog/archives/2013-10.html#e2013-10-29T13_39_32.txt
Внимание, системное сообщение!
Спамооборона классифицировала Ваше сообщение как спам. Если это ошибка, пожалуйста, перейдите по ссылке и выполните инструкции, описанные на открывшейся странице.
http://online.yandex.ru/captcha.xml?u=kost-bebix%40ya.ru&t=24d1c1ccca23e007129275cb11e4ed04493bd3c9
Мда. Докер кеширует как-то очень странно, чего-то я не понимаю. Один и тот же кусок вместо чтения из кеша заново пересобирает иногда (но не всегда). В связи с этим придётся "коммитить образ" ghc/cabal и дальше с него начинать. В общем, штука очень крутая, но до конца не ясны все плюсы и минусы в плане полезных юз-кейсов.
Решил ловить стековерфлоу таки при помощи запуска некоторых воркеров с
профилированием и стек трейсами в продакшне. Т.к. в продакшне у нас
ubuntu 10.04, надо собрать под ней проект. Пытаюсь в одной консоли
собрать внутри Vagrant, в другой -- внутри Docker. Посмотрим, где
быстрее / удобнее / вообще получится.