среда, 16 декабря 2009 г.

Архивы СБУ

Служба безопасности Украины открыла архивы советской эпохи для своей и мировой общественности, исследователей и просто любопытствующих, которые, без каких либо бюрократических проволочек, могут обратиться в один из 26 центров электронной документации, расположенных в 26 городах страны, пишет Пилар Бонет в испанской El Pais.

"Украина становится Меккой для исследователей из республик бывшего СССР, приезжающих к нам (выделено мной - Валик) вследствие того, что российские архивы либо закрыты, либо становятся все менее доступными"

http://korrespondent.net/worldabus/1028032

Молодцы, конечно, что отсканировали документы. А выложить в Интернет слабо? Ведь это же гораздо проще, чем сканирование и классификация.

А ещё лучше было бы не просто выложить, а сделать API для поиска... Хотя, пожалуй, лучше не надо: боюсь, если этим будут заниматься в Украине, то на создание API из двух функций потратят миллионов 10 :)

MVC vs MVP, или Не болтай

Коллеги обсуждали очередное резюме. "У него тут упомянуто MVC... Чтобы его спросить на эту тему?" Я быстро пробежал страницу глазами: "Смотрите, а ниже ещё есть MVP... Спросите, в чем разница". Моя идея им очень понравилась, и кандидата быстро завалили.

Программисты, которые проводили собеседование, слабо разбираются в вопросах построения фронтенда. Они - специалисты по WCF и прочим серверным технологиям, и разницу между MVC и MVP сами понимают смутно. Если бы кандидат ответил ну хоть что-нибудь, типа: "MVP больше подходит для Windows-приложений, а MVC - для Web" (или даже наоборот), то это бы прокатило. Но он сказал: "Понятия не имею", хотя это было в списке его основных навыков.

Интересно, он тоже хотел минимум 65 тысяч?

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

Сотрудник года

...нет, нет, это не я. Ещё не успел себя зарекомендовать :)

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

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

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

Как мы искали квартиру на Уимблдоне

Давно собирался написать, да никак руки не доходили.

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

Но когда стало ясно, что Марина настроена серьезно, то внезапно стало легко: есть цель, и надо думать над тем, как её достигнуть, а не о том, надо ли это вообще.

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

Марина работает в центре; неважно, на какой окраине жить - добираться одинаково далеко. Мы немного поискали в центре, но быстро поняли, что ещё не дошли до того уровня. Например, такая квартирка возле BT Tower за 1500 (в два раза больше, чем мы платили в Баркинге): внизу бар, шум, вонь от fish & chips, узкая винтовая лестница с проволокой вместо перил, без света. Квартира на чердаке, с потолка течет вода. Спальня - буквально заходишь в комнату и попадаешь на кровать, больше ничего нет. Не могу понять, как они затащили эту кровать по такой узкой лестнице? Может, краном через окно?

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

Нам нравится Docklands. Большинство квартир - новые, с человеческими смесителями, посудомойками, с двойным стеклопакетом. Часто есть парковка. Но район тоже, так сказать, мультинациональный, и цены по мере приближения к Canary Wharf резко растут. А Марине как раз была нужна Jubilee Line. Переплачивать втридорога имело бы смысл, если бы она была банкиром и ходила пешком на работу, а так как-то жалко.

Поиски в основном проходили в оффлайне. Т.е. приезжали, гуляли по улицам, заходили в агентства. Сейчас полно сайтов для поисков жилья, но часто бывает, что на сайте всё написано красиво, а ты только пройдешься по улице, и понимаешь, что жить там не хочешь. Немного помогает Google Street View, но всё равно чувствовать район начинаешь только после личного посещения.

На GumTree много мошенников. Типичный текст, который мы видели раз десять: "сдаю однушку в Челси, с ремонтом и посудомойкой, за 500 в месяц. Сдаю дешево, потому что сам живу в Испании (Австралии, Канаде), но вот как раз на следующих выходных приеду в Лондон и могу взять задаток. Пожалуйста, хорошо следите за моей квартирой и пр."

Конечно, оффлайновые поиски занимают много времени. Во-первых, два часа дорога из Баркинга. Но я в то время не работал. Часто бывало, заранее договоришься, чтобы показали пять квартир, а тебе показывают одну: то ключей нет, то хозяева не разрешили сегодня приводить посетителей, то агент занят, то пробки на улицах... Часто заходишь в агентство, спрашиваешь: "У вас есть?...", а они говорят: "Давайте мы сначала Вас зарегистрируем, а потом перезвоним..." Половина не перезванивала никогда.

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

Я осуществлял предварительный отсев, а потом на повторный осмотр приезжала Марина. Многие агентства закрываются в 18:00, самое позднее - в 20:30, поэтому ей надо было бегом бежать с работы. По субботам работают не всё, или закрываются раньше. Однажды получился прикол: я посмотрел квартиру, рассказал Марине; решили, что, наверное, она не будет тратить время. Но потом в ту же самую квартиру нас повел уже другой агент. Причем оба раза хозяйка была дома. Я не знал, как себя вести в таких случаях. Должен ли я честно сказать: "Извините, меня уже сюда водил другой?" Хозяйка тоже растерялась и сделала вид, что мы незнакомы.

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

Агенты (особенно старики) часто хвастаются, что живут в этом районе с детства и прекрасно его знают, что совершенно необходимо для их работы. Но я уже через неделю поисков тоже стал неплохо ориентироваться. Думаю, что пары месяцев достаточно, чтобы стать специалистом по местности.

Перевожу некоторые выражения с "агентского языка" на русский:
"10 минут до метро" = "10 минут езды на машине до метро".
"Уютная" = "крошечная".
"Квартира со своим характером и духом" = "плесневелая викторианская халупа".
"Динамичный, космополитичный район" = "бабайский район, где не ступала нога белого человека".

Однажды в объявлении было сказано: "прямо рядом с линией метро". И действительно, рельсы проходили близко... только вот сама станция была очень далеко. Это мне напомнило, как я когда-то в Киеве спросил, как пройти к ближайшему метро. Женщина странно на меня посмотрела, показала. И действительно, там была станция метро... но ещё не достроенная!

Гуляя по Kingston Road, Марина заметила:

- Фи, всего в 15 минутах от метро, а уже так много негров.
- Ну, в твоей любимой Атланте их ещё больше!
- Там не такие негры, там хорошие.
- Хорошо, но обрати внимание, что они делают: вся община приехала в церковь. А что в это время происходит на Бродвее? Там белые целые выходные глушат пиво в пабах и смотрят футбол. Ну, и с кем же безопаснее жить рядом - с белыми или с черными?

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

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

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

Кроме этого, в квартире было много других скрытых проблем с водой, отоплением и т.д. Часть из них и сейчас, через два с половиной месяца до сих пор не решена, несмотря на наши угрозы обратиться в суд. Но это тема отдельного рассказа.

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

Twitter

Вообще я сам им не пользуюсь. Но сейчас в Feedburner добавили новую фичу Socialize, так что за 10 минут я завел аккаунт на Твиттере и подключил его к блогу. Кто интересуется, прошу сюда: twitter.com/valikicom

Программист-секретарь

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

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

Зато раз в неделю, когда доставляют бесплатный ящик с фруктами, мне не приходится стоять в очереди.

Холод и старение

Дедушка-architect стал жаловаться на холод. Он сидит в углу, возле двух внешних стен. Не задумываясь ни на секунду, я ляпнул:

- Ничего, зато холод замедляет процесс старения.
- Да? Правда?
- Конечно. Неcпроста в холодильнике не портятся продукты.

Пожалуй, неудачно пошутил...

понедельник, 14 декабря 2009 г.

Кошмар о хвостах

Уже почти 10 лет назад как закончил институт, но по-прежнему иногда снится один и тот же кошмар: что когда-то давно я забыл сдать один зачёт, и теперь из-за этого неприятности.

Нет, всё-таки работать лучше, чем учиться...

Я часто просыпаюсь в тишине
От свиста пуль и визга бомб фугасных.
Мне кажется, я снова на войне,
Мне кажется, я снова на войне,
И кто - кого - пока еще не ясно.
Александр Розенбаум

BNF о приеме гормонов

Одна из основных причин переезда в Уимблдон была надежда заполучить более хорошего участкового доктора. Частично надежда сбылась. Марине выписали гормоны на три месяца вперед, и в аптеке их исправно выдают раз в месяц, а не со скандалами, как раньше. В регистратуре работают чинные английский бабушки учительской наружности. Наша врачиха очень приятная, с американской улыбкой до ушей. Все белые - после жизни в Баркинге это поначалу было даже как-то дико: белый участковый врач? Это почти как белый баскетболист. Прием до 19:45 - это тоже очень удобно, не нужно отпрашиваться с работы. Правда, анализы сдавать можно только утром, причем не рано утром, а часов в 10, т.е. опрашиваться всё равно приходится.

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

Однажды Марина пожаловалась на боль в животе:

- А Вы какие-то лекарства пьете на голодный желудок?
- Да, я пью с утра гормоны, за 40 минут до еды.
- О, бинго! Пейте их после еды.
- Но мне же говорили, что надо до.
- Кто говорил?
- Мой американский врач.
- Хм... не знаю... никогда не слышала такого - принимать гормоны до еды... Ну, давай я на всякий случай проверю по BNF...

BNF - это British National Formulary, местный аналог Машковского, протокол назначения препаратов. На наших глазах она полистала и торжественно ткнула куда-то пальцем: "Вот, как я и говорила! Пейте после еды, и живот не будет болеть! Не знаю, почему в Америке Вам так сказали... Может, у них в Америке другие гормоны..." А я думал, скажет, как доктор Рашид, что американцы идиоты, мало ли что они там назначили.

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

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

валикИ

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

пятница, 11 декабря 2009 г.

XML-RPC

Сегодня пишу на айтишные темы.

Наши партнеры предоставляют XML-RPC API. Это нечто среднее по сложности между SOAP и "простым" (plain) XML. В отличие от plain XML, не нужно вручную парсить ответ сервера - по идее, этим должна заниматься некоторая библиотека. Она же должна формировать XML с твоим запросом.

Я почему-то был уверен, что поддержка XML-RPC есть в стандартной поставке WCF. Хм, нет. Быстрое гугление привело меня на блог Клеменса Вастерса, который такую библитеку написал. Выглядит вроде прилично. Прекрасно - скачал, стал пробовать вызывать сервис нашего партнера. Вывалился exception. Я не сразу врубился, думал, что это я что-то не так делаю.

Оказывается, партнер благополучно получил мой запрос и вернул fault. Обычная рабочая ситуация - я запросил информацию о стране, которой не было в их базе, они вернули нормальное сообщение об ошибке. Очевидно, каким-то образом библиотека может выдать мне эту информацию? Но после долгих поисков в исходном коде я с ужасом понял: великий Клеменс Вастерс просто не сделал поддержку faults. Т.е. он предполагает, что мы живем в идеальном мире, где веб-сервисы никогда не возвращают ошибки.

Конечно, я мог бы и сам дописать этот кусочек (а возможно, потом прославить свое имя, выложив его в Интернет). Но, во-первых, это как-то дико. Я понимаю, если бы мне, скажем, пришлось своими руками написать поддержку WCF для ССП НБУ (Системы Срочных Переводов Нацбанка Украины), которая никому в мире не известна. Но XML-RPC уже лет 10, он и широко использовался. Почему я должен тратить свое время на такое? Во-вторых, я как-то очень расстроился: кто знает, может там внутри ещё запрятана куча менее очевидных глюков?

Поэтому я скачал другую библиотеку с сайта Cook Computing. Она не такая гламурная (не WCF), но работает нормально.

Итак, обмен данными налажен, но всё равно какие-то проблемы остались. Теперь они явно связаны не самим протоколом, а уже с партнером. В их документации не очень чётко написано, как передавать параметры (массив, структура на всех, структура на каждого и пр.) Я написал: "Не могли бы Вы прислать мне примеры правильных XML-запросов к таким-то и таким-то методам? А то они возвращают не совсем то, что я ожидал". Ответ был совершенно неожиданный для меня:

- К сожалению, по юридическим причинам мы не можем давать примеры исходного кода (а то вдруг там ошибка, а Вы его будете использовать, потеряете миллионы и будете с нами судиться).
- Погодите... Я же не прошу у вас примеры кода на C# или PHP. Я просто просил пример вызова API. С моей точки зрения, это неотъемлимая часть документации...
- А мы считаем, что это пример кода. И именно поэтому по юридическим причинам я не могу прислать тебе вот такое (пример XML) и вот такое (пример его генерации на PHP). О, чуть не забыл - и вот такое (пример на Perl) я тоже абсолютно не имею права посылать. Но если бы я тебе это послал, то ты бы использовал это на свой страх и риск, наша фирма не несет никакой ответственности...
- Спасибо, теперь всё стало ясно!

Row Test в MbUnit

Когда я впервые увидел MbUnit в одном из проектов, то расстроился: "Ну вот, и в этой фирме тоже зоопарк фреймворков. Мало людям MSTest и NUnit, зачем-то нашли ещё один." Но потом MbUnit стал мне нравится. Документация, правда, неполная. Синтаксис стандартный, но с некоторыми дополнениями. Например, атрибут Rollback2 или сравнение коллекций. Вообще много чего там есть, но моя любимая фича - это Row Test.

Мне нужно протестировать всего-навсего три функции. Но, чтобы быть уверенным в результате, на вход нужно подавать сотни различных комбинаций параметров. Row Test - как раз то, что нужно. Я не пишу сотни Test-функций, а просто использую атрибуты, вот так:

[Test]
[Row("Barking", "Waterloo", RateType.Peak, 3.00, 4.00, 2.70 )]
[Row("Barking", "Waterloo", RateType.OffPeak, 3.00, 4.00, 2.50 )]
[Row("Bank", "Waterloo", RateType.OffPeak, 2.50, 2.00, 1.00 )]
[Row("Bank", "Waterloo", RateType.Peak, 2.50, 2.00, 1.50 )]
public void JourneyPrice(string origin, string destination, RateType rateType, decimal weeklyTravelCardPrice, decimal cashFare, decimal oysterPaygFare)
{
var journey = new Journey(origin, destination, rateType);


Assert.AreEqual(journey.WeeklyTravelCardPrice, weeklyTravelCardPrice);
Assert.AreEqual(journey.CashFare, cashFare);
Assert.AreEqual(journey.OysterPaygFare, oysterPaygFare);
}

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

С помощью атрибутов Row я передаю и входные параметры (станции отправления и прибытия, тип тарифа), и ожидаемые результаты (цена недельного проездного, который бы покрыл поездку, цена одноразового билета и цена с Oyster Pay As You Go). Не придирайтесь к цифрам, я их не проверял :) И ещё здесь daily cap не учитывается.

Отлично - мне не пришлось писать десяток почти одинаковых методов со странными названиями вроде JourneyPrice_from_Barking_to_Waterloo_OffPeak(). Но возникает другая проблема: допустим, у меня есть несколько сотен тестов, а класс Journey работает достаточно медленно. У меня нет никакой возможности выбрать, какую группу тестов запускать. Да и не только в этом дело. Даже если все тесты прогоняются быстро, в test runner не сразу понятно, что именно провалилось, они же все относятся к одному методу и классу.

Чтобы решить эту проблему, я создал абстрактный класс JourneyTestBase. В нем находятся атрибуты [TextFixture], [SetUp], [TearDown] и [Test]. В [SetUp] я один раз создаю экземпляр Journey (потому что он долго инициализируется). Кроме того, у меня есть свойство

public string Origin { get; set; }

и реализация теста JourneyPrice()

[Test]
public virtual JourneyPrice(string destination, RateType rateType, decimal weeklyTravelCardPrice, decimal cashFare, decimal oysterPaygFare)
{
var journey = new Journey(this.Origin, destination, rateType);

// здесь может быть ещё какой-то длинный код

Assert.AreEqual(journey.WeeklyTravelCardPrice, weeklyTravelCardPrice);
Assert.AreEqual(journey.CashFare, cashFare);
Assert.AreEqual(journey.OysterPaygFare, oysterPaygFare);
}

Обратите внимание, что origin теперь не передается как аргумент, вместо этого я использую this.Origin.

Наследую десяток классов, вроде такого:

public class Barking : JourneyTestBase
{
public Barking()
{
this.Origin = "Barking";
}


[Row("Waterloo", RateType.Peak, 3.00, 4.00, 2.70 )]
[Row("Waterloo", RateType.OffPeak, 3.00, 4.00, 2.50 )]
public void JourneyPrice(string destination, RateType rateType, decimal weeklyTravelCardPrice, decimal cashFare, decimal oysterPaygFare)
{
base.JourneyPrice(destination, rateType, weeklyTravelCardPrice, cashFare, oysterPaygFare);
}
}

Я разбил все тесты по станциям отправления. Конечно, в зависимости от задачи, можно это сделать по какому-то другому признаку. Например, по типу оплаты (проездной, одноразовый билет, Ойстер), по тарифу (час пик, выходные, студент, пенсионер) или по комбинации станции отправления и прибытия (тогда бы класс назывался Barking_Waterloo ).

В дочерних классах нет никакой логики, только входные данные и ожидаемые результаты. Мне пришлось написать конструктор, но в принципе можно было бы извратиться и извлекать название станции прямо из имени класса. Ещё пришлось перекрыть функцию JourneyPrice и вызвать JourneyPrice базового класса, но реально я это не набирал руками. Просто написал override, и Visual Studio всё сгенерировала за меня.

Теперь, когда я запускаю всё это, то сразу вижу: Barking красный, Waterloo зеленый... Кстати, именно для удобства запуска в test runner (в моем случае Gallio) я не стал давать классам длинные имена, вроде BarkingOriginTestFixture - их тяжело читать.

Маленькое неудобство: базовый класс тоже показывается в Gallio, хотя он и абстрактный. Но это не вызывает ошибку, он всегда показывается зеленым.

Вы скажите, а зачем я вообще связался с наследованием? Ведь можно было сделать один класс с вспомогательным методом JourneyPrice(), и кучу тестовых методов вроде Barking() и Waterloo(). Да, это так, но представьте, что кроме цены, наш класс Journey умеет выдавать ещё что-нибудь. Например, минимальную и среднюю продолжительность поездки, количество пересадок, расстояние, список достопримечательностей по пути... Наследование помогает сгруппировать тесты. И в test runner ты их видишь так:

Barking: Price, Duration, Distance
Waterloo: Price, Duration, Distance

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

P.S. В версии 3 поменялся синтаксис, он стал более аккуратным и простым. Например, вместо атрибута [RowTest] теперь используется обычный [Test]. Так же, как и раньше, данные для такого теста передаются через атрибут [Row]. Сравнение коллекций и прочие навороты теперь делаются через обыкновенный класс Assert, например: Assert.AreElementsEqualIgnoringOrder(....) Если у Вас уже есть много тестов, написанных с использованием старого синтаксиса, то надо подключить MbUnit.Compatibility.dll

четверг, 10 декабря 2009 г.

Минус шесть

Но однажды к нам в дверь постучалась совсем другая Америка: у меня заболел зуб.

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

- А почему это, если болит один зуб, - вскинулся я, - нужно удалять восемь?!
- Потому что они мертвы, - скорбно сказал дантист.
- Но у меня никогда не болели зубы...
- Это беда всех эмигрантов. Перемена образа жизни, пищи, воды - стресс...

Научная дискуссия кончилась.

Владимир Лобас, "Жёлтые короли"


Марине вырвали зуб. Его лечили в Украине, Америке, Англии, потом снова в Украине. В Англии сделали перфорацию, т.е. пробили ложный канал. Это очень плохо, но украинский врач всё же попытался спасти зуб. На полгода хватило. Но когда у Марины десна распухла от гноя, то стало ясно - битва проиграна.

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

Всего не хватает шести зубов. Приходится питаться в основном пюре, кашами и супами.

Увольнение через две недели

Уволили Маринину коллегу. Она приехала из Австралии специально на эту работу. Открыла счет, подписала договор на аренду квартиру, купила контрактный телефон и т.д. Проработала две недели, и вдруг говорят: "В понедельник не приходи". Всё, никакого объяснения (поскольку работа по контракту, то они имели право так сделать). Поехала домой.

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


У другой коллеги-медсестры тоже был неприятный случай. Пришла на смену рано утром и обнаружила, что пациенту по ошибке ночью дали какое-то лекарство. А надо было его давать после операции. Причем если дать до, то это довольно опасно. Она позвонила врачу, разбудила. Вместо благодарности врач стал на неё орать: "Вы, медсестры, просто идиотки! Для него же сегодня зарезервировано время в операционной! Теперь иди в операционную и сама извиняйся".

Рассказала всё старшей медсестре, а та ответила: "Так тебе и надо, вот в следущий раз не будешь умничать". После этого случая она сама уволилась: "Я, возможно, спасла жизнь этого пациента, а меня ещё с грязью смешали".

I'll be back!

Друзья продают старые книги на Amazon, штук по 60 в день. Меньше нет смысла, потому что книги дешевые, иначе не заработаешь. Вначале они всё делали сами - выставляли на сайт, паковали, относили на почту. Это довольно утомительно. Во-первых ничего не перепутать; потом дотащить на почту.

Но самое неприятное - отправить. Однажды оформление затянулось на час, а кассир всего один. Образовалась огромная очередь, которая начиналась ещё на улице. Кассир ругался ("у, опять притащили книги на мою голову..."), люди тоже роптали. Но интересно, что никто из них не ругал книготорговца. Они возмущались, почему не посадять второго кассира.

Наконец, друг отошел от окошка. Раздались аплодисменты, и он сказал голосом Шварцнеггера: "I'll be back!"

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

среда, 9 декабря 2009 г.

Музыка против Дотнета

Как и многих фирм, у нас есть стандартное задание для кандидатов-программистов. Что-то типа "отсортировать массив, не пользуясь стандартными функциями". Я, кстати, в свое время сделал его не очень хорошо. Код у меня был аккуратный и красивый, правильно работающий, с юнит тестами, но не совсем оптимальный. Но я чувствовал, что оптимизировать не успеваю.

Сегодня один кандидат официально был признан худшим за всю историю компании. Длинная, страшная функция... а в её глубине он замаскировал то самое использование стандартной функции, которое строго запрещено правилами. Надеялся, что не увидим? Т.е. реальную работу делает та сама одна запрещенная строчка, а остальной код просто для красоты. Но всё равно не работает, и это видно даже без компиляции. Кроме того, некоторые куски явно бездумно содраны из Гугля. Например, мы просим сделать Windows-приложение, а у него какой-то код, связанный с ASP.NET. К сожалению, по юридическим причинам не могу выложить его код на блог, а то бы вместе посмеялись.

Очевидно, кандидат и сам чувствует, что "не совсем" справился. И вот как он это объясняет: "В свободное время я пишу музыку, и оказалось, что .NET Framework конфликтует с моим музыкальным редактором. Поэтому я снес .NET Framework, и Ваше задание пришлось делать в Блокноте". Резюме тоже слабенькое. Т.е. много написано, но нигде не уточняется, что лично делал кандидат. Желаемая зарплата: от 65 тысяч в год и выше. Хм, желаю творческих успехов...

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

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

вторник, 8 декабря 2009 г.

Iron Mountain

В студенческие годы я подрабатывал в фирме, которая занималась дистанционным обучением. Нет-нет, не онлайн, а по переписке, вроде Ешко. Я обратил внимание, что директор регулярно, примерно раз в неделю записывал базу на дискеты и относил копию домой. 10-15 дискет - это было долго и нудно, а CD recorders тогда ещё были редкостью. Однажды я спросил, зачем он это делает? Неужели прямо каждые выходные разворачивает базу дома и строит какие-то отчеты? "Нет, Валентин, дело не в этом. Когда-то в моем столярном цеху был пожар. Копии я делаю прежде всего не для работы дома, а чтобы в случае пожара у нашей фирмы хоть что-то осталось."

Для меня тогда резервное копирование означало страховку от вирусов и сломаных винчестеров, но о физической безопасности данных я не задумывался. К сожалению, в Украине мало кто об этом думает и сейчас. Достаточно хлопотное и дорогое дело - создать электронный архив где-то за городом, и регулярно его пополнять. В развитых странах это аутсорсится. Пожалуй, самая известная фирма такого рода в Британии - Iron Mountain. Раз в день или раз в неделю приходит их сотрудник с таким портативных сейфом. Ему вручают бэкап на магнитооптике или DVD. Он отмечает на своем наладоннике, кто сдал данные. Диски вывозят куда-то за город - там и складские помещения дешевые, и меньше риски терактов или техногенных катастроф. Если вдруг понадобилось затребовать какой-то диск, то за это надо немного заплатить. Такая же система и с бумажными документами.

Конечно, нужно время чтобы такое прижилось в Украине. "Как это я буду давать свою секретную финансовую информацию какой-то посторонней фирме? Её же сразу начнут продавать на Балке!"

понедельник, 7 декабря 2009 г.

Вокруг света

Мы завершим удачный рейс,
И я женюсь на Блинде Мейз!
Нас ждет победа, Паспарту!!!


Один из наших сотрудников путешествовал почти два года по Африке и Азии. Изначально он собирался объехать вокруг света за полгода. Купил специальный кругосветный билет с открытой датой. Но как-то увлекся: в полгода не уложился, мир не объехал и чуть было не женился. В основном он ездил на велосипеде, хотя раньше никто серьезно не занимался велоспортом. Он делал презентацию - фотографии, конечно, обалденные. Всякие там Гималаи и прочие. За эти два года он практически не работал - говорит, что тратил очень мало. Жил в палатке, продукты покупал в деревнях.

Невысокий, загорелый, спокойный, бородатый... Я часто видел таких людей по телевизору, но, пожалуй, впервые встретил вживую. Именно такими я в детстве и представлял героев Жюля Верна.

А другой мой коллега таки объехал весь мир за год (более цивилизованным способом). Говорит, потому было очень тяжело искать работу. Психологически. На собеседовании надо изображать радостное лицо: "Я в восторге от идеи потрудиться на благо Вашей замечательной фирмы!", а в памяти ещё свежи всё прекрасные, беззаботные воспоминания, и хочется кричать: "Блин, да видал я этот пыльный офис знаете где... На волю! В пампасы!"

The Tube

Смотрели передачу The Tube про лондонское метро.

Хвалили решительные действия сотрудников метрополитена во время терактов 7/7. Но у меня сложилось впечатление, что на самом деле никто толком не знал, что делать. Да и вообще не сразу поняли, что это теракт. Впрочем, трудно их осуждать, ведь такое случилось в метро в первый раз (и хочется надеяться, что в последний).

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

Время от времени начальник станции берет радар, меряет скорость и ловит лихачей-машинистов. Прям как гаишник, разве что в кустах не прячется. Excuse me? Выходит, в 21-м веке диспетчер по-прежнему не может на большом красивом мониторе посмотреть скорость поезда, а потом нажать кнопку "Напечатать список машинистов, которые превысили скорость больше чем на 5 миль"...

Круговорот гаджетов

Бывший харьковский коллега просит привезти ему book reader Sony из Лондона. Говорит, тут существенно дешевле.

А наши лондонские друзья просят купить им в Украине какой-то другой book reader украинско-китайского производста.

Там хорошо, где нас нет...

Lord of War

Три раза посмотрел Lord of War (Оружейный барон). Что ж мне так понравилось в этом фильме? Пожалуй, прежде всего то, что роль идеально подходит Николасу Кейджу. Он обычно играет суперменов, спасителей мира. Но лицо слишком грустное. А тут он в роли циничного одесского иммигранта. Уверенный в себе, но в его глазах - грусть Штирлица. И точно так же он выворачивается из самых безвыходных ситуаций... В отличие от Штирлица, резко отрицательный персонаж, но всё же вызывает симпатию.

IE8

Надо сказать, что тема браузеров меня мало интересовала. Давным-давно я пользовался Netscape Navigator. Потом он превратился в тормознутый Netscape Communicator, и я перешел на Internet Explorer. С тех пор друзья много раз соблазняли на FireFox и что-то ещё, но как-то я не проникся. Последнее время стал использовать Google Chrome, но он частенько глючит... ну, или может не он глючит, а неправильные сайты с ним плохо дружат. Самое смешное, когда какой-нибудь сайт, принадлежащий Google, хуже работает с Chrome, чем с IE.

А вообщем, мне было это всё малоинтересно. Работает, и ладно. Браузер - это просто рабочая лошадка.

Но как ни странно, с большим удовольствием послушал презентацию в Microsoft на презентацию по IE8. Докладчик рассказывал о проблемах, которые мне в голову не приходили.

Например, все производители браузеров не смешивают JavaScript и DOM engines друг с другом. Это дает гибкость. Но зато вызовы между этими engines дорого стоят. Он показывал разные методы оптимизации JavaScript, запускал код до и после, и в некоторых случаях производительность вырастала в 2-3 раза. Причем большинство этих методов очень простые. Например, по возможности дописать var перед именем переменной. В IE8 некоторые из этих трюков уже не нужны, оптимизация происходит автоматически.

Другая фишка - встроенный в браузер объект Json. Он поддерживает те же самые методы, что и объект из JavaScript-библиотеки, поэтому старый код переписывать не нужно; но, конечно, работает в разы быстрее. Тут Microsoft немножко врёт, как мне кажется: всё равно в начале страницы нужно определить тип бразуера и отключить эту JavaScript-библиотеку в случае IE8, а иначе выигрыша в скорости не будет. Но всё равно неплохо.

Для проверки соответствия стандарту CSS Microsoft разработала 50 тысяч (!) test cases. На это ушел 1 человеко-год. И всё это добро конкуренты могут брать бесплатно с их сайта. К сожалению, практически все эти тесты нужно делать вручную, потому что надо смотреть глазами на результат.

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

Докладчик напустил Долото на сайт Google Maps, и сразу вывалилась куча проблем. Правда, это ещё не говорит о том, что в Google сидят дураки. Ведь Долото дает хорошие результаты только если дать ему хорошую статистику. Мы просили напустить Долото на Бинг, но господин евангелист скромно воздержался. Сказал только, что там результаты гораздо лучше.

четверг, 3 декабря 2009 г.

Импорт - к нам

Вот такой плакат я когда-то увидел в редакции "Жовтой газети" (г.Полтава): "Импорт - к нам, экспорт - от нас". Он висел у верстальщиков в комнате. Я тогда решил, что это хорошая шутка, как бы намек на собственную дебильность. А вот когда стал работать в банке, то понял, что действительно серьезная проблема - с какой стороны смотреть?

Больше всего мучений у новичков вызвает актив и пассив. Как ни странно, текущие счета клиентов (2600 и прочие) - это пассив. Потому что эти деньги мы должны когда-то клиентам вернуть. А вот с точки зрения клиента - это актив. Чтобы не путаться, мы старались всегда смотреть с точки зрения банка, а не клиента. Но не всегда это получалось - клиенты пугались, когда видели в выписках, что счет в пассиве.

Ещё была большая проблема с ЕДРПОУ (бывший код ОКПО). Когда клиент брал кредит, мы открывали ссудный счет и счет процентов на имя клиента, и с кодом клиента, а не банка. С нашей точки зрения это было очень удобно: вот клиент, вот у него есть текущий счет, два депозита, три кредита... Это гораздо легче, чем открывать 10 тысяч ссудных счетов, принадлежащих банку.

Но возникала проблема: когда клиент гасит кредит, то с его точки зрения он платит банку, а не себе. В графе "Получатель" он указывает название и код банка. Это не проблема, когда клиент приносит платежку на бумаге, потому что операционистку просто интересует номер счета получателя. Но когда мы принимаем платеж по клиент-банку, то, согласно инструкции НБУ об электронных платежах, мы проверяем код получателя. Он не соответствует нашей базе, платеж бракуется. Клиенты звонят, ругаются. Конец месяца - если они не погасят проценты или тело кредита в срок, то банк начнет их штрафовать. Мы объясняем:

- Вы указали неправильный код. Вы должны платить самим себе, просто на другой счет.
- Вы что, с ума сошли? А что скажет налоговая?
- Ну, налоговая же знает, что 2600 - текущий счет, а вы платите на ссудный.
- Молодой человек, Вы не представляете какие там идиоты!
- Ну, извините, я ничего не могу сделать. Так работает наша система, такая у нас учётная политика. Она установлена главным бухгалтером, не программистами.
- Ты че, не понимаешь, с кем разговариваешь? Я из фирмы Икс, я сейчас позвоню президенту вашего гребанного банка и скажу, чтобы для нас сделали исключение!

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

Вот интересно - никогда такая проблема не возникала с депозитами! Ни разу! Т.е. всё клиенты согласны, что депозитный счет принадлежит именно им, а не банку. Но не ссудный. Как говорится, "берешь чужое, отдаешь своё".

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

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

среда, 2 декабря 2009 г.

Денни

Познакомились с румыном Денни (подозреваю, что его настоящее имя немного другое). Он три года в Англии. Работает руками. С двух работ ушел - говорит, хозява были очень жадные. Не только в плане зарплаты, а вообще - экономили на оборудовании, безопасности, материалах, заставляли лепить халтуру.

Как я понял, всё это время он жил в одном и том же хостеле и помогал там по хозяйству: лампочку поменять, трубы почистить и т.д. А потом хозяин хостела предложил заниматься этим на постоянной основе. Теперь Денни не только ничего не платит за жилье, но ещё и получает зарплату. Я говорю:

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

Хозяин увидел, что Денни хорошо справляется с работой. Повысил его в должности. Теперь Денни не просто чинит, а пытается пресечь всё проблемы на корню. Например, он следит, чтобы в комнатах не курили и не пили. Нарушителей заносят в базу и потом не продлевают им аренду. Короче, property manager.

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

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

Тогда я спросил, как он оказался в детдоме. Его бросила мама, когда умер отец. Отец пил спирт, а водка для него была вместо воды. "Наверное, во время вскрытия кровь в спирте не обнаружили?" - пошутил я. Кровь обнаружили, но органов почти не осталось, всё растворилось.

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

После детдома он решил разыскать своих родственников. Сначала нашел бабушку (по отцовской линии), которая его не любила и называла "Волком" (за то, что он много ел). Бабушка внука не узнала:

- Вы кто, молодой человек?
- Я - Волк.

Он попросил показать могилу отца. Бабушка не хотела, но всё-таки повела. Там просто был воткнут крест из двух веток и одного гвоздя. "Поверишь, я сейчас в костер кинул лучше ветки, чем были на могиле". Он плюнул бабушке в лицо и сказал: "Хоть мой отец и не был хорошим человеком, но он же не собака!" (сейчас Денни жалеет, что плюнул). Он поставил приличный крест и поехал искать маму.

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

Новый муж бил маму. Когда Денни спросил, почему она это терпит, то мать его ударила и заплакала. Он встал и ушел. Уже больше 10 лет в контакт с ней не вступал.

Англия ему не очень нравится, он приехал исключительно за деньгами. А деньги нужны на содержание дочки. Дочку он хотел бы забрать к себе, но она пока слишком маленькая. Возникает вопрос, не скучает ли Денни по жене? Нет, не скучает, она в разводе. Жена гулящая, но не это было главной проблемой. Однажды он увидел, что жена бьет дочку. Сильно побил жену, та вызвала полицию. Полиция выписала предупреждение. "Вы мне выписываете? Вы жене должны выписать! Вот, смотрите, у дочки синяки!" И полиция выписала предупреждение обоим.

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



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

Фикус

Программистам поставили Windows 7. Дело добровольное, но все согласились. Пару дней ушло на борьбу с разными проблемами. Справедливости ради надо сказать, что во многом проблемы связаны не с самой операционкой, а с неправильной (как мне кажется) конфигурацией нашей сети. Ну, и кое-какие проблемы из-за 64 битов (например, пока нет Flash).

А так вообще Винда как Винда. Ни особого восторга, ни разочарования у меня нет. Удобно, что можно приколоть ярлыки внизу, но зато не сразу понятно, что у тебя запущено, а что нет. Предварительный просмотр окон (ещё до переключения туда) - это прикольно, но я пока к нему не привык. По скорости вроде примерно как XP.

Что интересно - в день перехода на Windows 7 у нас завял огромный фикус. Плохой знак :)

Avaya и Office Communicator

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

Ещё насчет телефонных программ вспомнил: прикольная фича есть у Office Communicator - когда ты поднимаешь трубку, он автоматически меняет твой статус на "Разговаривает по телефону". Но этот статус видет не весь мир, а только члены твоей команды, или что-то в этом роде. То же самое - когда у тебя в календаре (в Outlook) назначено совещание, то статус становится "Я на совещании". Доверенные люди могут даже видеть, на каком именно.

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

Магнитики для SketchFlow

Ходил на Silverlight User Group в EMC (владельцы Conchango). Полезного особо ничего не узнал, но зато давали пиво и магнитки, рекламирующие SketchFlow
Точнее, дали один магнитный лист A4, на котором нарисованы (кнопки, карты, выпадающие списки и так далее. Лист можно разломать на элементы и цеплять их на доску, а маркером дорисовывать связи. Интересно придумано - конструктор для взрослых дядь.

Формат презентации тоже был необычный. Это была скорее не презентация, а инсценировка. На наших глазах дизайнер и программист вместе создавали приложение (на самом деле не создавали, а доделывали домашнюю заготовку). При этом они ругались друг с другом - прям как в жизни. Вечный спор - с дизайна начинать или с логики? Они пытались нам показать, как можно работать маленькими итерациями.

Кстати, дизайнер сказал, что Adobe по-прежнему на голову выше конкурирующих продуктов Microsoft. Поэтому он сначала рисует в Adobe Illustrator, а потом импортирует дизайн в Blend. Но из Blend обратно в Adobe уже дороги нет, к сожалению.

Мыши

Только вселившись в квартиру, мы обнаружили мышиные экскрименты за шкафами. Когда приходил директор агентства, Марина показала ему, как "качественно" была убрана квартира. Он опытным глазом оценил размер какашек и сказал: "Ну, что ты волнуешься, это же просто мышата". Так же, как про хулиганов говорят: "Это же не банда, а просто толпа детей".

Но самих мышей мы долго не видели. Не знаю, то ли просто случайно. То ли они уходили из квартиры, пока никто не жил. И вот свершилось. Раздался истошный крик Марины - я уж думал, что залезли воры! Хотя она мне рассказывала, что совершенно мышей не боиться. Я говорю: "Что ты наделала, теперь она перепугается и пойдет на кухню пить твои капли Зеленина!" Мышь мирно спала на диване. Может, пришла погреться, на полу везде тянет? Но на следующий день Марина застукала её за поеданием нашего печенья.

У кого есть опыт борьбы? Заводить кота наш контракт запрещает.

Consent form

Маме делали операцию на глазу в клинике имени Гиршмана. Перед операцией что-то накапали (наверное, атропин), зрачки расширились, поэтому сидеть нужно было в тёмной комнате. Очкарики знают - когда эту гадость капают, то и читать невозможно (всё расплывчато), и даже слабый свет вызывает боль.

И вот в этот момент ей приносят подписать бумажку, которая тут называется consent form, в таком духе: "Мне сообщили о том, что могут быть самые нехорошие осложнения, и мы не за что не отвечаем". А она просто не состоянии прочитать. "Да Вы не волнуйтесь, у нас все подписывают".

Рене

Я был уверен, что мой коллега Рене - это француз. Оказалось, немец.

- А разве "Рене" - это немецкое имя?
- А разве "Валентин" - украинское?

Ratings by outbrain