?

Log in

При всём богатстве возможностей в Haskell регулярно возникают проблемы с вещами, которые кажутся совершенно элементарными. Например получить стек вызовов в случае ошибки. Причём не то что бы его нельзя получить совсем, наоборот есть как минимум два ортогональных способа, но всё это сопряжено с таким количеством сложностей и условий, что проще воткнуть в нужные места printf’ы или густо обмазываться препроцессором. Особенно грустно дело с этим обстояло в ghci.

И вот для пользователей ghci наступает революция. Казалось бы страдания остались в прошлом, а error и undefined обрели практическое применение. Однако первая же попытка использовать это в массиве написанного кода обернулась неудачей: error и undefined выдавали стек вызовов, а броски исключения — нет. Сначала я подозревал себя в том, что куда-то не включил профилировочную информацию или как-то не так использую ImplicitParams, но потом я просто полез в код.

Попросили у меня тут записать алгоритм поиска устройств на шине 1-wire. Поскольку стенда для тестирования у меня не было, я просто подчистую содрал Application Note 187: 1-Wire Search Algorithm (за вычетом части с CRC и family code). Велика вероятность что я где-то облажался с битовыми операциями, но тем не менее псевдокод выглядит примерно вот так:



Если будет время перепишу на C.

4 фев, 2016

Пока я всё воскресенье безуспешно пытался превратить коричневое в жёлтое и плохое синтаксическое дерево в хорошее, fee_brune ходила в гости и принесла анекдот:

«…Нельзя шыряться как Вишез, пить как Моррисон и жить столько же сколько Боуи. Если вы конечно не Игги Поп…»

О котопроблемах…

А вот заберите себе котейку в Москве. Кошка, неделю назад открылись глаза и всё ещё прибывает в полнейшем ахуе от увиденного, 4го января усыпят. Не для еды.

котографииСвернуть )

UPD: Хорошая новость: никого усыплять не будут. Плохая новость: никого никому не отдадут. Все свободны.

Метки:

Вы печальный интроверт? На работе сплошь экстраверты, которые болтают целыми днями и не устают? Перегружаетесь и не успеваете отвечать всем во ВКонтакте? Выход есть — XMPP! Общайтесь со всеми через Jabber и вы поймёте что вам не с кем общаться и вы в космосе! Только у нас вы можете зарегистрироваться без указания номера телефона, смс и договора о продажи собственного первенца в вечное рабство. Вас ждёт увлекательный мир бессмысленного трафика презенсов, неподдерживаемых расширений протокола, кривых клиентов и серверов, а также медленного мобильного интернета. Jabber. Мы делаем вашу мнимую социальную активность ещё более мнимой.

Спрашивайте в интернетах вашей страны.

Метки:

О пользе выбора…

Пересобираю блог на hakyll'е перед переписыванием, чтобы убедиться что со времени последних изменений api не изменилось фатально. Заодно пересобираю и весь сандбокс проекта. Ох и до фига же там всего, ну да и ладно. Вдруг взгляд мой заметил что-то необычное. Что-то пошло не так? Матрица меняет программу? Нет, это enumerator-0.4.20. Его не обновляли с 2013го года и не будут собственно уже никогда. При этом лог сборки разумеется забит всякими conduit'ами, которые строго говоря решают те же задачи что и enumerator. Стал смотреть кто же такой некрофил-виртуоз. Оказалось snap. При этом сам hakyll, который использует snap только как тестовый вебсервер (непонятно зачем нужный статическому сайту) разумеется на попсовых conduit'ах. Hackage, ты редкостная помойка. Пользуясь случаем выражаю респект JohnMillikin, который в 2013ом году написал код, который пережил все изменения в стандартной библиотеке.

Метки:

О самоочевидном…

L29Ah> декар после свадьбы перестал писать в блог
L29Ah> не женитесь, поцоны

Из одного чата

Метки:

О скоупах…

А вот ещё одна хитрая задачка. Положим у нас есть несколько устройств, которые мы можем как-то дёргать через DevHnd a (где a — тип-параметр характеризующий устройство). Проблема в том, что если два треда будут рулить устройством одновременно, то результат будет трудно предсказать. Хорошо, вводим концепцию владения устройством: управлять устройством1 можно только завладев им, если кто-то другой завладел устройством до тебя, то ты ждёшь пока устройство освободиться. Просто, но есть пара нюансов:

  • мы говорим «блокировка» и подразумеваем «дедлок», поскольку в реальной жизни тред должен контролировать состояние более одного устройства одновременно;
  • из типа DevHnd a никак не следует захвачен ли он текущим тредом, а значит проверка этого факта будет осуществляться в рантайме каждый раз когда мы будем модифицировать устройство и более того время от времени мы будем сталкиваться с ошибками времени исполнения.

Метки:

«…Спит поломанная лапка,
Спят таблетки сладко - сладко,
Спит томограф, спит рентген,
Спит клубочком жгут для вен,
Штифт в руке устал и спит,
И во сне чуть-ли болит,
Спят анализы на калл,
Даже градусник устал.
А всех тех кто спать не хочет -
Медсестра уколит ночью
Между ляжкой и спиной
ВОООТ ТАКОЙ БОЛЬШОЙ ИГЛОЙ!!!…»

самая прекрасная и самая юная леди на свете















«…Там хирург самогон пил из горлышка
И все резал пилой и ножом
При свете коптилки семнадцать часов,
А потом лишь упал поражен…»

Борис Борисович







Метки:

Написал я для одного проекта парсер, который разбирает at-подобное описания времени в UTCTime. Если кто-то не знает at — это такой планировщик задач в UNIX'ах позволяющий выполнить команду или скрипт определённого числа, на следующей неделе, через два месяца и так далее. Собственно отличия моей грамматики, от грамматики at'а были косметические: at, как планировщик, интересовался моментами в будущем, а меня наоборот — в прошлом.

И всё было хорошо, но при тестировании заметил что last month не равен now - 1 month, хотя исходя из семантики at — должен бы. Более того last week равен now - 1 week, last day равен now - 1 day и так далее. Долго искал ошибку в коде, но он был абсолютно одинаковый и для дней, и для месяцев и для недель. Более того преобразование для last и для now - 1 было абсолютно одинаковое и разным значениям просто неоткуда было взяться. И тут меня осенило:

О язычестве…

В C++ нет defer? Не расстраивайтесь, можно густо обмазаться шаблонами, лямбдами и макросами. Вообще-то получилось довольно здорово. У меня самого был шаблон для этих целей, но без обёртки в макрос он не выглядел так изящно. Правда полезность решения в значительной мере нивелируется тем, что в отличае от Go в С++ большая часть ресурсов уже освобождается деструктором и в defer не особо есть чего писать. Но всё равно класнно.
«…У нас было две коробки больших воронок, коробка маленьких воронок, коробка литровых круглодонных колб со шлифом, пол коробки литровых колб для культуры и целое множество роторных колб всех сортов и размеров, а также мерные цилиндры, переходники, эксикаторы, водоструйные насосы и просто антуражная химическая посуда. Не то, что бы это был необходимый запас для лаборатории. Но если начал грабить склад стекла в институте, становится трудно остановиться. Единственное что вызывало у меня опасение — это водоструйные насосы. Ничто в мире не бывает более беспомощным, безответственным и порочным, чем попытка посушить пол кило вещества под водоструйным насосом. Я знал, что рано или поздно мы перейдем и на эту дрянь…»
Мне тут недавно доходчиво объяснили что лучше весго любить женщину под джаз. И правда лучше.
…если второе «Железное небо» запретят к показу в России как пропаганду загнивающего запада. Потому что я бы с удовольствием сходил. Потому что я больше не могу и не хочу воспринимать информационный поток данного типа в каком-то ином ключе. А здесь я это оставляю в качестве узелка, который завязывают на память.





А вообще это вирусная реклама второго президента Российской Федерации сделанная на деньги собранные краудфайндингом. Если кого-то заинтересовал саундтрек, то это примерно он. Если кто-то найдёт совсем его и поделится со мной, то это будет очень мило.

P.S: Я не несу ответственности если кому-то захотелось выпить водки, сходить в Большой театр или просто поиграть в Red Alert.

О том как у меня дела…

Недавно толкиенист forwe спрашивал как у кого дела. Воспользуюсь поводом рассказать о наболевшем и внести некоторую ясность в происходящее со мной в последнее время. Мои дела плохо. Я имел неосторожность полюбить женщину. Вот эту.



Её зовут Диана, у неё скверный характер и она печёт чудесные торты. Знающим людям не стоит объяснять как всё это плохо. За последний год отношения с этой женщиной разрушили или вытеснили все социальные связи которые я считал для себя важными и я оказался в своеобразной пустоте и изоляции. Но даже осознавая происходящее я всё равно хочу любить только её и уж точно не готов любить кого-то другого.

Мне бы хотелось попросить прощения у всех кто пострадал от моего невнимания и пренебрежения в последние пол года. Так получилось. Как обычно в таких ситуациях вы не можете сделать ничего.

P.S: Поскольку мне это признание не доставляет никакой радости, я выбрал именно ту фотографию женщины, которая ей особенно не нравится.

Об отдыхе…

Чтобы немного снизить свои шансы умереть от рака, я решил отправиться на отдых в Карелию: в ближайшие две — три недели вероятность быть съеденным медведем будет разбавлять мои раковые перспективы. В связи с этим традиционно горите в аду. Специально для тех кому что-то срочно от меня может потребоваться я оставлю свой телефон… в Москве.

О макаронах…

«…Пришёл с утра и попробовал: макароны не сварились.
В этом случае химик должен решиться на какое-то действие: поварить макароны ещё, добавить каких-нибудь реагентов, может, заменить электроплиту на газовую или «и так сожрут». Обычно выбор всё равно оказывается неправильным, вследствие чего макароны так и остаются недоваренными или почему-то вдруг зажариваются, и приходится ставить кастрюлю заново…»

О числе e…

Четыре года назад, я радовался работе с бесконечными списками и вычислял e суммирую ряд Тейлора так. Случайно найдя предыдущий сниппет и смахнув слезу умиления, я переписал суммирование уже со знанием стандартной библиотеки.


e = sum $ takeWhile (/=0) $ map (\v -> 1 / product [1..v]) [0..]

О лунном языке…

Лунный примечателен тем что это очень простой язык. Несмотря на такие языковые возможности как анонимные функции и замыкания это очень традиционный процедурный язык. Языковые конструкции в нём означают примерно то чего от них и ждёшь. Его простота столь велика что определённым образом провоцирует беспечность программиста. В следствие этой беспечности столкновения со специфичными для языка вещами обычно бывают особенно болезненны и полны детской обиды. Здесь перечислено несколько элементарных моментов, столкновение с которыми у программиста не на лунном может вызвать недоумение и предварительное ознакомление с которыми должно упростить вхождение в язык тем кто так и не прочёл документацию1: