суббота, 26 марта 2011 г.

Большая страна

В омереке всё большое.

Первое, что бросается в глаза - нет, не толстые люди, - машины. Пикапы. Люди в Бостоне в среднем даже худее, чем в Брно, например. Бегают толпами, велосипедят всяко, едят здоровую пищу. А вот машины у них огромные. Стоишь так на светофоре на своём почти пятиметровом крокодиле, и тут сбоку подкатываются КОЛЁСА. И когда подкапотная полдюжина литров резко начинает шевелить поршнями, и становится видно водителя сзади, то за рулём может вполне оказаться худенькая тётенька.

Молоко покупается в самой ходовой таре - галлон (4.7 л). Маленькая порция еды в забегаловке - это для сирого европейца поесть до колик в животе, оставить на ужин, потом заныкать в холодильник, неделю таскать по кускам, а потом выбросить, как совсем надоест. Антисептическая жидкость для полости рта - в бутылях по 1.5 литра. M&Ms в килограммовых пачках. В виноводочных магазинах водки можно пятилитровую бутылку купить. Жильё считается по бедрумам: в 4-спальном доме ещё 20 всяких комнат. На телефон бабки кладутся по сто баксов, так гораздо выгодней, чем 50 или 30. Телефоны, кстати, такие, чтобы в диком лесу по EDGE можно было свежее видео на ютубе посмотреть (звонить, правда, не очень удобно).

На 10-километровую прогулку мы, как осваивающиеся омереканцы, поехали за 120 километров. Ну а чё? Машина у нас экономичная, расход 12 литров по трассе...

Хотел вот навороченный ноут купить (старый ещё не сломался, денег девать, наверное, некуда), но жена презрительно скосилась на какой-то неведомый Элиенварь, сказала купить нормальную Ленову, иначе обещала перестать уважать. Thinkpad'ы все какие-то скучные, купил топовый Ideapad Y460p, со всем свежим фаршем (4-х ядерный Sandy Bridge, 8 гиг памяти, 750+32 гиг винты). Ну а чё?



30 лет и 3 года лежал Илья Муромец на печи

Интересно, что движет человеком, который проработал 20 лет в одной компании, дослужился до высокой должности, заработал уважение коллег, а потом уволился и замутил с другом стартап? Мне лично морально тяжело уходить из конторы, в которой меньше 3-х лет проработал, а тут в 7 раз дольше человек работал...

Вариант 1: "Чё-то засиделся на одном месте.". Верится с трудом. Человек возрастом за 40 лет обычно уже негибкий, ленивый, чтобы заморачиваться со сменой работы. Тем более, если на текущей всё хорошо. А когда 20 лет в одной конторе проработал, то там в плане стабильности и доходов, обычно, всё хорошо.

Вариант 2: "Уволили.". Тоже с трудом верится. За 20 лет человек превращается чуть ли не в тотем. Их ставят в пример новым сотрудникам: вот, мол, кто из вас, сосунков, проработал тут столько же лет, как Джо? Таких не уволняют уже до пенсии.

Вариант 3: "Получил очень много опыта в этой отрасли, скопил денег, можно рискнуть и своё примерно такое же дело организовать, чтобы получить лулзы и профит.". Самый вероятный вариант развития событий, имхо. 40 лет - значит, своё жильё уже давно есть, кредит отбит, машины все куплены, все шторки повешаны. Даже, возможно, дети в универах отучены. Почему бы и не рискнуть, если по этому направлению действительно в теме, имеется запас денег, и шансы на успех достаточно высокие?

пятница, 25 марта 2011 г.

Проблема К

На лямбда-планете сейчас модно решать сабж. Вот лисповое решение:

(defvar *table*)

(declaim (ftype function solve-expression)
         (ftype function parse-expression))

(defmacro get-cell (col line)
  `(cdr (assoc ,col (cadr (assoc ,line *table*)) :test #'equal)))

(defun digit? (char)
  (<= (char-code #\0) (char-code char) (char-code #\9)))

(defun op? (char)
  (member char '(#\+ #\- #\* #\/)))

(defun alpha? (char)
  (<= (char-code #\A) (char-code char) (char-code #\Z)))

(defmacro sequence-to-string (seq)
  `(map 'string #'identity ,seq))

(defmacro read-char-of-type (type f)
  `(loop for char = (peek-char nil ,f nil)
      while (and char (,type char))
      collect (read-char ,f)))

(defun read-integer (f)
  (parse-integer
   (sequence-to-string
    (read-char-of-type digit? f))))

(defun read-ref (f)
  (list
   (sequence-to-string (read-char-of-type alpha? f))
   (parse-integer (sequence-to-string (read-char-of-type digit? f)))))

(defun column-number-to-string (n)
  (labels ((foo (n)
             (when (plusp n)
               (multiple-value-bind (quo rem)
                   (truncate (1- n) 26)
                 (append (foo quo) (list rem)))))
           (map-num (n)
             (code-char (+ (char-code #\A) n))))
    (map 'string #'map-num (foo n))))

(defun read-cell (f)
  (sequence-to-string
   (loop for char = (read-char f nil)
      while (and char (not (member char '(#\Tab)))) collect char)))

(defun read-table (f)
  (let (*read-eval*)
    (with-input-from-string (f1 (read-line f))
      (let* ((lines (read f1))
             (columns (read f1)))
        (list lines columns
              (loop for line from 1 to lines
                 for data = (read-line f)
                 unless (equal data "")
                 collect (list line
                               (with-input-from-string (f data)
                                 (loop for column from 1 to columns
                                    collect (list (column-number-to-string column)
                                                  :data (read-cell f)
                                                  :cycle nil :value nil))))))))))

(defmacro aif (test-form then-form &optional else-form)
  `(let ((it ,test-form))
     (if it ,then-form ,else-form)))

(defun solve-cell (cell)
  (aif (getf cell :value)
      it
      (let ((cycle? (getf cell :cycle)))
        (setf (getf cell :cycle) t
              (getf cell :value) (if cycle?
                                     "#cycle"
                                     (let ((data (getf cell :data)))
                                       (typecase (read-from-string data)
                                         (integer (parse-integer data))
                                         (list (subseq data 1))
                                         (t (solve-expression (subseq data 1))))))))))

(defun deref! (exp)
  (cond
    ((integerp exp) exp)
    ((listp exp) (solve-cell (get-cell (car exp) (cadr exp))))))

(defun solve-expression (data)
  (handler-case
      (loop with exp = (parse-expression data)
         with lvar = (deref! (pop exp))
         for op = (pop exp)
         for rvar = (pop exp)
         while (and op rvar)
         do (let ((rvar! (deref! rvar)))
              (setf lvar (case op
                           (#\+ (+ lvar rvar!))
                           (#\- (- lvar rvar!))
                           (#\* (* lvar rvar!))
                           (#\/ (mod lvar rvar!)))))
         finally (return lvar))
    (error (c)
      (format nil "#arith ~a" c))))

(defun parse-expression (data)
  (with-input-from-string (f data)
    (loop for char = (peek-char nil f nil)
       while char
       collect
         (cond
           ((digit? char) (read-integer f))
           ((op? char) (read-char f))
           ((alpha? char) (read-ref f))
           (t (loop-finish))) into ret
       finally (return ret))))

(destructuring-bind (lines columns *table*)
    (read-table *standard-input*)
  (loop
     for y from 1 to lines do
       (loop
          for x1 from 1 to columns
          for x = (column-number-to-string x1)
          for cell = (get-cell x y)
          do (format t "~a~,8T" (solve-cell cell)))
       (write-char #\Newline)))

;
SBCL его жуёт:
$ sbcl --load k.lisp < input
This is SBCL 1.0.46, an implementation of ANSI Common Lisp.
More information about SBCL is available at .

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
12       -4      3       Sample  
4        -16     -4      Spread  
Test     1       5       Sheet  
Решение в лоб, неоптимизированное, ошибки не ловит практически, комменты расставлять лень. Ну и красивостей можно в коде навести, да.

четверг, 24 марта 2011 г.

Бэкдорный REPL

Пишу тулзу, которая будет работать на производственной линии. Тулза проводит инициализацию и первичное тестирование одной из наших железок. Контора, которая будет собирать железо, какая-то запаренная, с сертификатами православной надёжности от омереканской мин.обороны, поэтому с удалённой отладкой в случае багов там никак. Даже с выездом на место непонятно, чё можно сделать: вдруг автоматчики с собаками в цех будут пропускать только в одних трусах? Поэтому, после полуминутного чесания лысины и получения ack от ночальнега, в функцию обработки юзерского ввода был добавлен код:

(when (equal "REPL" answer)
  (loop (print (eval (read)))))

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

среда, 23 марта 2011 г.

Опять про мой байк

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

Ну вот, теперь покупать чемодан с инструментами и смазку.

А между тем, брендовый Трек жены просто работает...

воскресенье, 20 марта 2011 г.

Байк жены


Trek 6500 модели 9-го года. Заднее крыло немного задрал, завтра опущу. Если сильно холодно не будет, вместе на работу на байках двинем :)

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

пятница, 18 марта 2011 г.

Донастраиваем свежий байк дальше

Думаете, что мои велозлоключения закончились? Фиг там! Сегодня первый раз поехал на работу на новом байке, и опытное чутьё веломеханика подсказало, что петух погнутый. Петух - это такая штука, через который задний переключатель к раме прикручивается. В случае удара по переключателю страдает (гнётся, ломается) дешёвый петух, а не дорогой переклюк или ещё более дорогая рама.

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


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

Усугубляю вывод, что велосипед через интернет - это глубокая попная боль.

UPD: опытный веломеханик сорвал резьбу на прямом петухе, поэтому молотком выправил, как мог, погнутый, вернул его на место и поставил в голове галочку купить не один запасной петух, а два. Или три, чё уж там.

Тяжела и неказиста жизнь омереканского кастомера

Ситуация: понаехавший в омереку обнаруживает, что его телефон стандарта GSM не поддерживает местные частоты. Нужен новый телефон. Понаехавший идёт в магазин и видит стопицот мильёнов бесплатных телефонов, от тупых ручек с кнопками а-ля Сименс А35 до смартфоном с чисто сенсорным управлением и более мощным железом, чем его компьютер пятилетней давности. С ними, правда, идёт двухгодичный контракт, по которому кажный месяц надо отстёгивать оператору 50-80 баксов. Понаехавшему это не нравится, поэтому он просит дать ему ведроид (ну а чё?) за всю цену, без контракта и чтобы в Европе ещё работал. В первый раз ему всучили CDMA-телефон, но со второй попытки получил нормальный четырёхполосный GSM.

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

Звонок в службу поддержки принёс благую весть, что телефон можно разлочить только через 90 дней после использования. Хотя на сайте было написано про 60, но мудило на той стороне настаивал на 90 днях. Вообще, это всё противозаконно, что купленный за всю стоимость телефон лоченный, но мне сраться со всеми подряд надоело. Я в то время много срался по телефону, кстати.

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


~Janet T: I am sorry, since you have entered the information wrong and the phone is locked, you have damaged the phone and will need a new phone.
Vitaly Mayatskikh: if it is so badly damaged, why it is asking for the code?
~Janet T: Yes, the phone can not be used.


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


Я так-то мог сразу после покупки за бабки разлочить, но мне было обидно, что с честно купленным девайсом такая фигня творится. Поэтому решил биться до конца, написал два письма в саппорт производителю, не получил ни ответа, ни привета, и в конце-концов позвонил. Под мудрым руководстом саппортера мы срезетили телефон, стерев все мои рекорды в игрушках. Больше саппорт производителя телефона помочь ничем не мог, и послал нафиг. Хотя у производителя есть база данных, в которых для всех их телефонов по IMEI есть нужные коды разлочки. Только эти шланги про неё или не знают, или врут, что не понимают, о чём это я. Их сфера деятельности ограничивается советами как протереть камеру, зарядить батарею, по меню добраться до пунка смены картинки и прочей очень важной мутотени.


Вобщем, нашёл в интернете работника производителя, который про эту базу с кодами знает, доступ к ней имеет, и за скромную мзду высылает все лежащие там коды для запрошенного IMEI. От момента контакта с ним до разлочки телефона прошло 20 часов, включая ночь, его и мою (чувак в Китае, я на восточном побережье омерики).


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

среда, 16 марта 2011 г.

Fox - говно, джаентнерд - уроды

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

Сабж. Надо было Куб на Эпиконе брать.

воскресенье, 13 марта 2011 г.

Радости псот

Выписал себе в омереку из Европы умную, красивую, стройную жену, вчера вечером доставили. Сабж! :)

вторник, 8 марта 2011 г.

Лытдыбр

Я опять в Европе. Опять после перелёта сбились внутренние часы, сплю перебежками по 3 часа.

В Чехии после Бостона грязновато: кругом окурками всё завалено, на автовокзалах пахнет мочой. Полуразрушенное здание напротив ж/д возкала в Брно всё такое же полуразрушенное, только реклама на весь фасад поменялась. Автобусы стали ходить с опозданием, пиво в бутылках попалось невкусное. Всего-то на 3 месяца отлучился, чехи сразу расслабились...

В Бостоне люди почти не курят, поэтому окурков вдоль дорог нет. Филиалы сетей бесплатных туалетов (Макдональдс, Данкин Донатс, Бургер кинг) торчат на каждом углу, так что проблем с тем, где помочиться, нет. В туалете бостонского аэропорта вообще нереальная чистота, у мну в квартире менее чисто было ;)

Ещё в омереке посыпной материал, которым заваливают дороги в сракопад, убирают после того, как этот самый лёд исчезает. В Брно мелкий гравий будет лежать чуть ли не до лета. Дороги вот в Брно гораздо лучше, чем в Бостоне. Бешенный климат в Новой Англии делает своё чёрное дело. Но зато на дырки в асфальте реагируют гораздо быстрее: одно знакомое отверстие во дворе за зиму заделывали два раза :)

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

Ну и про пиво: в Бостоне выбор пива в любом алкоголическом магазине огромный. Кому не нравится магазинное пиво (хотя после того, как я скупил в одном магазине весь несвежий "Плзень", туда стали завозить неизменно свежий -- свежее, чем жена в магазине в Чехии купила), могут купить девайсы и полуфабрикаты для домашнего пивоварения, либо вообще арендовать мощности пивоварни! Т.е. прям на профессиональном оборудовании варишь пиво по своему рецепту (или тыщам предлагаемых), потом приходишь, как оно дойдёт, заливаешь в свои бутылки, запечатываешь, вешаешь наклейки "LispBrau" или "Lispovice", и гордо выставляешь на стол во время дружеских посиделок. Кегу пива, хоть местного, хоть импортного, кстати, тоже без проблем в этой омереке купить можно. 25л "Пилзнера" всего сто баксов.

Архив блога