воскресенье, 27 февраля 2011 г.

Лисп - это круто!

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

Только, если подумать, делают половину лиспа, и делают это плохо.

Вот если бы я не знал лиспа, то максимально мощный доступный мне язык был C++. Ну Java, может быть. Описание железки загнал бы в XML или JSON, инструкции по настройки - ну хз, что бы делал. Скриптовый движок какой-нибудь бы прицепил. Конфигурация из XML/JSON создавалась бы кучей классов, обеспечивающих только самый-самый общий вид структуры. API, соответственно, было бы не прямым и прозрачным, а страшной лапшой из интерфейсов и фабрик. Как эта лапша бы взаимодействовала со скриптами настройки - тоже хороший вопрос.

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

Итого, помимо основного языка будут использованы отдельный язык для описания структуры и скриптовый язык. Три разных языка, взаимодействие между ними будет кошмарным.

Что в случае с лиспом: язык разметки - лисп (DSL, но выглядит-то как лисп). По декларативному описанию обычным лиспокодом генерируются новые типы и код для работы с ними, доступные непосредственно в лисповом скрипте настройки. Т.е. используется одинаково выглядящий синтаксис для написания самой программы, описания подгружаемых структур и кодирования их поведения. И т.к. это происходит внутри одного образа, то устраняются все проблемы со взаимодействием. Какие могут быть проблемы у одного лиспокода вызвать другой лиспокод, даже если он появился позднее первого? Да никаких.

Даже при отладке я могу в slime нажать inspect на объекте, созданном нашей объектной системой, и увидеть его содержимое, которое чрезвычайно похоже на декларативное описание. При этом slime про нашу объектную систему ничего не знает, и это тоже пример того, как крут Коммон Лисп ;)

Подводя итоги, можно отметить, что CL позволяет легко реализовать идею на серьёзном уровне абстракции, а в более классических языках придётся либо отказываться от настолько абстрактного представления и спускаться к низкоуровневой захардкоженности, либо плодить такого страшного монстра, что застрелиться хочется.

И не надо забывать, что время программиста денег стоит.

Опыт - сын ошибок трудных...

Есть, значит, у нас железка, доступная по сети. Внутри железки есть вспомогательный процессор, на котором крутится маленький сервер, обеспечивающий примитивное управление железом, например чтение и запись регистров у логических ядер (которые в ПЛИС сидят).

На другом конце провода сидит большая и умная лисповая программа, которая всё знает и всё умеет. Общается она с железом по RPC-подобному протоколу. Разумеется, кишки сетевого взаимодействия спрятаны глубоко в DSL, снаружи есть просто объекты CLOS (ну, почти CLOS) и их методы. Чтение регистра ядра - это вызов метода-акцессора соответствующего объекта, с записью то же самое.

Далее, адресное пространство ядер имеет 32-битную гранулярность, т.е. чтение/запись может производиться только такими порциями. Логические единицы (регистры) могут быть 32-битными, а могут и отличаться. Например, в одном физическом регистре могут быть упакованы битовые флаги или лежать пара 16-битных счётчика. Или два MAC-адреса (6 байт каждый) упакованы в три регистра.

С 32-битными логическими регистрами всё просто - читай, да пиши, как есть. С битовыми картами чуть посложнее, нужно извлекать или устанавливать нужный бит, не трогая остальные. Вообще, если логический регистр лежит в пределах одного физического, то проблем особых нет. Я по-началу логику на сдвигах и масках накатал, всё хорошо, но потом наткнулся на MAC-адресы, которые в 32 бита не помещались.

Посидел, погрустил, что пересечение границы физического регистра в существующую картину мироздания ну совсем никак не вписывается, и что доработка генератора акцессоров легко и просто превратится в монстра, который я неделю писать и отлаживать буду (генератор много других приколов содержит). По-сути, необходимо писать логику извлечения произвольной части из адресного пространства. А это как раз то, чем занимается стандартная функия ldb. Собственно, мой генератор акцессоров был полу-ldb-велосипедом :)

Отобразил пространство ядра на одно целое число, хитрожопые акцессоры заменил на простой ldb, который легко работает и с большими числами. При записи пишу в копию отображения, на другую сторону шлю разницу между старым состоянием и новым. Если даже ldb на большом числе работает крайне неэффективно, то это всё равно по-барабану, т.к. один RPC-вызов по сети сожрёт в тыщи раз больше времени. Так вот одним ударом серпа решил абсолютно все проблемы и некрасивости в DSL.


Пример описания интерфейса ядра (стандартный альтеровский Media Access Control, по-моему):

(def-core eth-core (:id #x42
                    :access :read-write)
  (instance)
  (:pack
   (enable :type :bit :access :write)
   (reset :type :bit :access :write))
  (:pack
   (tx-count :type :uint16)
   (err-count :type :uint16))
  (page-number)
  (:pack
   (dst-mac :type :uint48)
   (src-mac :type :uint48))
  (src-ip)
  (dst-ip)
  (checksum-base)
  (:pack
   (src-port :type :uint16)
   (dst-port :type :uint16))
  (:pack
   (tx-count-page :type :uint16)
   (err-count-page :type :uint16)))

Объекты создаются стандартным make-instance. Установка MAC-адресов выглядит вот так:

(setf (reset eth-core) t
...
      (dst-mac eth-core) dst-mac-addr
      (src-mac eth-core) src-mac-addr
...
      (enable eth-core) t)

Это делается с клиента через скрытые RPC-вызовы. А было примерно вот так:

typedef enum eth_core {
    ethInstance=0x0,
    ethEnableAndRst=0x1,
    ethTxAndErrCount=0x2,
    ethPageNumber=0x3,
    ethDstMacMsb=0x4,
    ethDstMacLsbSrcMacMsb=0x5,
    ethSrcMacLsb=0x6,
    ethIpSrc=0x7,
    ethIpDst=0x8,
    ethChecksumBase=0x9,
    ethUdpSrcAndDstPorts=0xA,
    ethTxAndErrCountPage=0xB,
    ethChecksum=0xC,
} ethCore_t;

uint32_t pCore_eth = ...;

pCore_eth[ethEnableAndRst] = 0x2;    /* reset */
...
pCore_eth[ethDstMacMsb] =
    dst_mac_addr[0] << 24 |
    dst_mac_addr[1] << 16 |
    dst_mac_addr[2] << 8  |
    dst_mac_addr[3];
pCore_eth[ethDstMacLsbSrcMacMsb] =
    dst_mac_addr[4] << 24 |
    dst_mac_addr[5] << 16 |
    src_mac_addr[0] << 8  |
    src_mac_addr[1];
pCore_eth[ethSrcMacLsb] =
    src_mac_addr[2] << 24 |
    src_mac_addr[3] << 16 |
    src_mac_addr[4] << 8  |
    src_mac_addr[5];
...
pCore_eth[ethEnableAndRst] = 0x1;    /* enable */

Это делалось на старой версии сервера, в адресном пространстве которого мапятся ядра с их регистрами.

Вся крутость DSL тут не видна, в нём ещё есть плюшки типа возожности описания массивов, автомагическая генерация веб-страничек (у нас своя объектная система через MOP построена), прозрачная синхронизация состояния после сбоев и т.д.

Ну и всё это делается в рантайме: юзер пишет описание железки на DSL и инструкции, как всё это конфигурируется, подсовывает уже работающему софту, а тот генерирует развесистую лапшу.

пятница, 25 февраля 2011 г.

Превращаюсь в омереканца :((

Долго тупил с датами, читая форум. Потом дошло, что 04.10.2010 - это 4-е октября, а не 10-е апреля...

Заметил, что мой скилл местного наречия стремительно качается: я уже тоже сопли жевать начал почти всех почти всегда понимаю :)

Апартаменты завалены коробками Федекса, UPC и USPS, не успеваю выкидывать. Практически всё покупаю через интернет.

Свежие пончики - это мнямка! :)

Ещё у нас днём было +7, лил дождь, вечером пошёл снег, а ночью стукнет мороз. Новая Англия в плане погоды жжОт, конечно. Хорошо, что мне завтра утром никуда на машине ехать не надо, а то каждый раз в такое погодное попадалово жалко резину на дверях :)

четверг, 24 февраля 2011 г.

Лытдыбр

Пришёл бук жены, Леново ДумающаяДощечка T410. Продолжатель старой доброй T-линейки, по внешнему виду от юзанных мною T61 и T500 особо не отличается. Экран матовый, яркий, но страдает всё теми же болезнями: неравномерная подсветка и плохие вертикальные углы.

С ноутом шла венда 7 хоум премиум 64 бита. Решил посмотреть, чё это за зверь. Сначала долго-предолго ждал, пока она загрузится. На сравнимо свежий проц (Core i5-560) и 4 гига памяти ей было пофиг, грузится как 95-ка на 486DX2. Наконец, она явила мне свой лик. Я, как большой почитатель современных, интуитивно понятных, дружественных пользователю интерфейсов быстро захлопнул крышку и в ужасе убежал в тёплый ламповый линукс с любовно пропатченным StumpWM.

Из музыкального магазина пришла коробка с кабелями, переходниками, кожанным гитарным ремнём и твёрдыми медиаторами. Переходники с кабелями нужны, чтобы завести звук с ноута на комбик и лабать вместе с Аббатом из Иммортала и другими звёздами эстрады. Родной дешёвый ремень порвался, пришлось купить новый. Средние по твёрдости медиаторы быстро "плывут", а мягкие вообще на глазах крошатся. Твёрдым попоробовал поиграть, круто!

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

И ещё: час работы вольвотехника в Бостоне оценивается в $105. Ремонтом узлов они не занимаются, меняют весь агрегат целиком. Например, сбойнул у меня датчик селектора позиций коробки передач. Селектор можно снять, разобрать, почистить, смазать, поставить обратно и не горевать. Местный дилер мне поменял весь селектор, взял 200 с копейками баксов за железо и 350 за работу. И ещё взяли немного денег за долив омывайки в бачок, но нихера они не долили, а денег взяли, как за 15 литров этой омывайки. Я потом чисто случайно обнаружил.

В общем, мне такая обдираловка не понравилась, поэтому купил ODB-II сканер за $30 и решил мелкие фигни стараться фиксить сам. Сегодня сканер пришёл, подоткнул к своей тележке - ошибок не видать. Хорошо :)

На работе опять вожусь всё больше с железом, чем с лиспом. Появилось предчувствие, что надо учить VHDL. Комбинация FPGA и ЯВУ, благожелательно относящихся к созданию DSL - это взрывная смесь!

воскресенье, 20 февраля 2011 г.

Такой вот день

Вобщем, душа моя, посаженная в большой город, страдает и рвётся на волю. Ну, город не такой, как ближе к центру, в Ньютоне я ваще чуть с ума не сошёл, но всё равно, после чешского вида из окна на холм заповедника, где у меня любимый 19км трек был, и с которого зайцы с оленями спускались попить водички из пруда, индустриальный пейзаж Бостона гнобит.

Поэтому, дождавшись солнечной погоды на выходных, ткнул наугад в гуглокарты, записал точку в навигатор и поехал. И доехал ажно до Quabbin Reservoir - считай, полштата за полтора часа проехал (прям как Чехия :). Навигатор попросил избавить меня от хайвеев, у него не очень-то хорошо получилось, по хайвеям 2/3 пути ехал, но это даже хорошо, а то вместо полутора часов все три по мелким дорожкам в одну сторону добирался бы.

После того, как проехал местечко Fitchburg, прям конкретно пошли холмы, леса, сквозь которые дома не проглядываются, и прочие фигни, встречаемые на трассе Прага-Брно. А когда свернул на мелкие дороги, то чуть не описался от восторга: ну вот так же мы с женой летом в Чешский Крумлов ездили! По пустым серпантинам, с плохим покрытием, заманался передачами щёлкать, а жену вообще сморило в сон. Короче, я уже начал искать место, где поставить дом =) Шутю.

Озерцо прикольное, вокруг идёт асфальтированная дорожка (не, ну точно, как в Чехии!). Людишек там в такой чудный день не было, встретил только одного человека в самом начале прогулки и под конец, так что моя мизантропия улыбалась и дышала полной грудью ажно два часа. Место настолько глухое, что шума цивилизации никакого слышно не было.

Фотоаппарат с почищенной флешкой, протёртой оптикой и свежими батарейками я, конечно, забыл на столе, поэтому вот вам пара плохих фоток с телефона.




На фотках ничего особенного не видно, но у меня поросячья радость там была :)

Будем сюда часто ездить с женой и с велосипедами. К приезду жены во всю готовлюсь: купил ей ноутбук (Thinkpad T410), ведроид (Motorola Defy), смотрю велосипед.

четверг, 17 февраля 2011 г.

Случай в автосервисе

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

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

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

Поехал в тот же сервис, говорю, дайте мне теперь вот такую лампу. Чуваки на меня подозрительно покосились, спросили:

- Ты же вчера тут был и лампы брал?
- Ну да, был. Только лоханулся и не те лампы купил. Но ничё страшного, лишние лампочки в машине никогда лишними не бывают.

Нашли правильную противотуманку, дали попробовать, всё заработало. Дали ещё одну про запас, и отправили гулять. Я в замешательстве:

- А как же заплатить?
- Ты у нас вчера купил не то, что тебе надо было. Это МЫ лоханулись, что не спросили, что именно не горит, поэтому вот, правильные лампы в подарок.

Переубедить их не удалось. Теперь я чувствую себя морально обязанным приехать к ним на сервис... Может, это такой хитрый способ по заманиваю клиентов на более дорогие услуги? :)

Скобки - дело семейное

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

Вот и сейчас наш лисповодческий стартап жене предложил какчество обеспечивать. У нас с QE скорее никак, чем хоть как-то, поэтому для SDET просто поле непаханное, хоть раскладушку на работе ставь. Ну, то есть, какие-то тулзы в помощь железячником пишем потихоньку, но после релизного цикла в Редхате это слёзы, а не обеспечение качества. А жена у меня как-раз в Редхате щас дорабатывает - опытный линуксовый куешник, ответственный за подсистемы в RHEL5, козёл отпущения по ихним, куешным проектам в RHEL6, и не пугающийся стрейса, системтапа и лямбд.

Автоматизация тестирования будет вся на Лиспе, естественно, мы ж лисперы.

wtf, dude?

Проснулся раном утром, на два часа раньше положенного. Потому во сне мучал не то, чтобы кошмар, но неприятненький такой сон, будто я пишу на Скале. А Скала в сон вылезла, потому что предыдущим вечером возмутило появление доклада по Скале на лисповом симпозиуме.

Куда мир катится?...

среда, 16 февраля 2011 г.

Музыкальное

Я теперь на пьянке могу поддержать уморившегося гитариста. Слабать вот такое, например:


Пока тремоло держать ровно всю песню сложновато, но я тренируюсь! Такой дикий угар! Не знаю, куда меня жена будет отправлять, когда понаедет в омереку...

суббота, 12 февраля 2011 г.

Две ссылки

Один

Опасному рецидивисту, убийце и грабителю дали 60 лет за убийство и грабежи, а двум пацанам, спалившим несколько церквей (без жертв) - по пожизненному сроку за каждую церковь.

God bless you! Kill, rape, rob.

пятница, 11 февраля 2011 г.

Шрифт

Опять опрос :) Кто какой шрифт в Емаксередакторе использует? У меня Terminus, но надо размер покрупней ставить, а Терминус покрупнее выглядит плохо.

среда, 9 февраля 2011 г.

Лисповодчество в Париже

Наша контора ищет лиспера (Common Lisp) для работы в офисе в Париже.

Если вы - грамотный лисповод, более-менее свободно говорящий на английском, и хотящий писать суровый энтерпрайз на Лиспворксе в получасе ходьбы от Эйфелевой башни, то вот он, ваш шанс! Работа на месте, удалёнки нет. С визой с той стороны поспособствуют, но стандартная морока в локальном консульстве наверняка будет.

вторник, 8 февраля 2011 г.

Drivers license

Сдал теорию. Полтора часа, включая 40 минут на поездку туда-сюда, 15 минут ожидания, 20 минут бумажной работы и 15 минут сам тест с выдачей ученических прав.

воскресенье, 6 февраля 2011 г.

Велосезон 2011 (opened)

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

Распаковал пакет с велоодеждой, облачился, начал сразу усиленно потеть. Велоботинки одевать не стал, они у меня под SPD, а на этом байке стоят платформы. Шипы на педалях гладкие, обувь не дерущие, поэтому я в горных ботинках выдвинулся, которые у мну тут в омереке в казуальную обувь превратились (тёплые, удобные, не промокают).

Байк ваще супер! Резина нестрашная. Швальба хоть по номеру была и меньше (2.35" против 2.5"), но по реальной ширине такая же, а по весу даже более тяжёлая. Байк ускоряется мегабыстро, сопротивления качению по асфальту особого не почувствовал. Когда в повороте на мокром льду пошёл юзом, то ногу с педали снял гораздо быстрее, чем с контактов. Всё-таки, контакты хоть и хорошая штука, мне они не очень нужны. Я их всю жизнь боялся, что навернусь в тяжёлых условиях и не успею ногу снять.

Тормоза хоть и не разработанные ещё, на их притирку по мануалу надо 15 миль, но хватают гораздо лучше Ауриг. И модуляция есть. В принципе, Ауригам я, похоже, диски маслом загадить умудрился, когда ржавеющие поршни Бруноксом смазывал. Летом 9-го года они просто звери были. По модуляции похуже текущих Хайесов, но одним пальцем байк останавливали и на склоне держали.

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

Вообще, байк по кочкам идёт гораздо плавнее моей Вольво. Фокс он и есть Фокс. Жду с нетерпением настоящей весны, чтобы педалить во всю. Ну и отремонтировать задний аморт ещё надо :(

Суровая американская погода

У нас вечером был туман и гроза с громом и молниями. Люблю, как говорится, грозу в начале февраля. Машина, значит, опять слоем льда покроется, ибо "минус" зимой по ночам никто не отменял.

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

суббота, 5 февраля 2011 г.

Омереканский шоколад

Что это сверху конфеты?


Думаете, кокосовая стружка, ванильный сахар или ещё какая вкусняшка? Хрен-то там! Это кристаллы соли.

Chrome vs Firefox

Пытаюсь пересесть с Лисы на Хром, две недели мучался. Решил, что Хром пока отстой по ряду причин:
  • Просто дофига сайтов, которые он неправильно показывает. Файерфос победил, и под него все сайты затачиваются. Доходит до того, что гуглевские же продукты отображаются некорректно: то одно уедет, то другое. JS, опять же, часто не так работает, как в ФФ;
  • Возможно, это глюк не Хрома, а libjpeg, но я не могу залить ни одну картинку из браузера: он тупо валится Ужасно раздражает.
  • Мало ручек для кручения;
  • Со шрифтами беда. В Лисе шрифты хорошие и красивые, в Хроме такие же ставлю, но они выглядят как-то по-наркомански. Получается или мелкие тонкие буквы, или большие жирные. Тонкие и немелкие сделать не могу. Учитывая, что мой правый глаз таки "поехал", к шрифтам стал относиться серьёзнее;
  • Несмотря на отдельный процесс на каждую вкладку, что-то там внутри у Хрома не срастается, и из-за одной повисшей странички ссылки с соседних не открываются, вкладку нельзя убить, сам Хром жрёт абсолютно весь проц, всеми ядрами. У ФФ всё печальней, конечно, но разрекламированная супернадёжность Хрома не впечатлила.

Мини-опрос

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

Уточню, речь идёт про два крайних проявления. Я сам тоже ляпы, порой, делаю: то не поставлю там, где надо, то поставлю, где не надо, но всесильно с этим борюсь. Граммар-наци во мне во втором случае брезгливо кривится, а в первом вообще хочет задушить автора.

С почином

В ряду сопливящих вендоров велоамортизаторов прибыло. Фокс неудачно проагрейдил старый добрый RP23, что привело к массовым протечкам. Вроде как, новая жидкость сильно агрессивная и растворяет резиновое кольцо-уплотнитель. Если ничего не предпринимать, то аморт перестанет работать и сдохнет.

На картинке масло выходит из-под регулятора скорости отскока (малиновое кольцо):


Сессно, с сервисом по гарантии связался, починят, но осадочек остался...

Вот из-за таких проколов у молодых производителей типа Сантура есть все шансы побить старых непотопляемых мастодонтов типа Фокс. Как я сантуровский Эпикон эксплуатировал, в грязи купал, по деревьям после урагана лазил, бил штаны, царапал ноги, пробивал не раз, и ему всё пофиг было. Задубел немного, конечно, но надо было Judy Butter за бешенные бабки из омереки заказать, а не обычной смазкой для подшипников бушинги набивать. А поначалу передним колесом на бордюр заезжал и не чувствовал. Правда, это передний аморт, он попроще заднего, но всё равно...

Хотя, Фокс Талас 36 на арендованном байке ваще настолько клёвый после Эпикона был, что я прям на этот Фокс запал.

четверг, 3 февраля 2011 г.

Конь педальный

Наконец-то, фургон Федекса с моим купленным через интернет байком прорвался через непогоду, и я забрал из местного офиса коробку домой! Байк Diamondback Mission 2
Приехал разобранный, а у меня инструментов нет. Но при помощи икеевского набора, пальцев, закалённых гиатрными струнами и такой-то матери свинтил всё в кучу. Надо всё подтянуть, настроить и накачать колёса, но уже стоит у стеночки, как настоящий! :)

По обвесу очень хорошо, сразу с ходу апгрейдить ничего не тянет. Фокс, Хайесы Трейлы, Срам X9, Труватив, все дела. Очень рад! :)

Американский социализм

Как я написал в предыдущем посте, у меня сломалось ветровое стекло. Машина, которая разбрасывает грязь по дороге, швырнула кусок льда или камень, и он попал в левый нижний угол моего стекла. Проклятая непостоянная погода (то тает, то поливает, то замерзает) сделала своё чёрное дело: весьма резво поползли трещины.

В омереканском штате Массачусетс треснувшее ветровое стекло - это страшное преступление. Водить такую машину воспрещается до замены стекла. Стекло на моё Вольво стоит $350-650 плюс работа. После 6 сотен за ремонт коробки недели две или три назад как-то не хотелось отдавать ещё столько же за новое стекло.

Поэтому я попытался его спасти, и сразу, как заметил рост трещин, заклеил их скотчем и позвонил в стеклоремонтную контору. Они, зачем-то, поинтересовались моей страховой и номером договора. "Зачем?" - удивился я, - "У меня страховка только на покрытие чужих ущербов."

Оказалось, что в МА есть закон, по которому сломанные ветровые стёкла меняет страховая компания за своё счёт. Вот так. Привёз машину с битым стеклом, оставил на пару часов, пришёл, забрал с новеньким стеклом плюс новенькими же дворниками. Ни копейки дополнительно не заплатил.

Красота же? Если вспомнить про две тыщи баксов в год за аналог ОСАГО, то не очень. Но всё равно немножко приятно, что полтыщи-тыщу сэкономил там, где не думал.

Грёбанная погода


Во вторник повалил снег. Опять. И в среду должен был быть. С дождём. Во вторник сгонял на работу за железками, чтобы два дня работать из дома, припарковал машину. Это было ошибкой.

Машина прогрелась, снег, падающий на неё, таял и потом превращался в лёд. Вся машина была покрыта слоем льда до 1 см. Потом сверху навалило 5 см снега. Потом прошёл дождь. Потом навалило ещё 10 см снега. Такой вот бутерброд.

В четверг к 9 утра нужно было пригнать машину в автостекольный сервис, минутах в 10 от дома. Зная, что машину надо откапывать, я вышел сильно заранее, без десяти 8 где-то. Со двора выехал минут в 10 десятого. Всё это время пытался открыть нафиг замёрзшую машину, потом откопать её из смеси снега со льдом, но больше всего времени отняли попытки стронуться с места.

Пока было тепло, снег на стоянке подтаял, машина заехала в ледяную лужицу глубиной сантиметра 3, в которую успешно и вмёрзла. Колёса оторваться ото льда и прокрутиться смогли, но из ямы выехать никак не мог. Помогла азиатская тётенька, которой я вытолкал машину из такой же ловушки: она рулила, я толкал. Хотя я её и отправлял на работу, на которую она опаздывала, мол, сам справлюсь, она категорически отказывалась уезжать, пока меня не вытащим.

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

вторник, 1 февраля 2011 г.

Функциональное программирование, неизменяемые состояния, ленивость

Сегодня проклятый день: я написал императивный код макросом loop, который изменял переменную выше в лексическом окружении и, в добавок, наступил на чрезмерную энергичность у loop. Ещё бы чуть чуть, и запутался в скобках и понадобилась статическая типизация ;)

Собственно, по-порядку:

Не мог понять, почему простейший find выдаёт неправильный результат, когда дебажный printf format, воткнутый прям перед этим find, показывал, что входные данные, получаемые вызовом функции, 100% верны, и такого результата в этой галактике получиться не может. Потом догадался вотнуть в format ещё один вызов той функции и увидел, что результат разный. После этого баг быстро нашёлся, но факт: с чистым ФП с запрещёнными сайд-эффектами такого бы не произошло.

Опечалился от собственного говнокода, давай переписывать. Вот какую неприятность у loop нашёл:

(loop for x in nil
   for y from 1
   collect y)

В этом примере оба for выполняются параллельно, но т.к. первый из них не даёт итерации, то всё тело не исполняется и loop возвращает nil.

(loop for x in nil
   for y from 1 by (1+ x)
   collect y)

Похожий, казалось бы, код, но он не выполняется, ругаясь что числа с nil'ами складывать нельзя. Шаг приращения в by вычисляется ещё до того, как развернувшийся макрос начинает смотреть, а надо ли вообще что-то делать?

Обидно, досадно. Переписал на одном reduce. Красиво, функционально, без сайд-эффектов, да ещё и работает. Но больше мусора генерит и не так оптимально в машинном плане, как loop, в котором я запутался. Я тут на сях ембеддед  пложу, и, видать, мозг всякий низкий уровень и экономия битов затуманили. В данном случае экономия идёт лесом.

Правильно всё пишут про иммутабельность, ленивые вычисления, функциональный подход и прочую казуистику. Надо гантели, что ли, купить?..

Архив блога