четверг, 27 августа 2015 г.

Снова Garbage Collector

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

И снова, снова обрушивается на меня поток вопросов про алгоритм работы сборщика мусора в .NET. Не просто "что это такое", а глубокие вопросы, достойные Джеффри Рихтера: как оно работает на разных процессорах, что менялось в зависимости от версии фреймворка и т.д. А ведь 11 лет назад, когда я начинал изучать .NET, считалось, что одно из главных преимуществ этой платформы именно в том, что программистам больше не придется думать об очистке памяти. Бери, что надо, а оно потом само очистится. И, тем не менее, редкое собеседование обходится без этих вопросов. И ещё классика: "Чем value types отличаются от reference types?"

Конечно, есть ситуации, когда надо выжимать из компьютера всё. Но в этом случае, возможно, стоит переписать критический код на C++?

четверг, 20 августа 2015 г.

Мыслить плагинами

Судя по моему опыту общения с Wordpress-разработчиками, они представляют собой реинкарнацию Delphi-разработчиков. В том смысле, что, даже не дослушав задачу, бросаются в Интернет искать плагин, который "сделает всё, что нужно" :)

Кофе в жилу

Пару недель назад у нас была бессоница. Может, потому, что целый день купались: жара, перевозбуждение? Но как-то, блин, уж очень сильно: Марина проспала за ночь пару часов, а я вообще минут 20. Да, мы выпили кофе, Да, по большой чашке. Но это было в 7 вечера, не в 12. И латте, т.е. некрепкое.

Потом дошло: так получилось, что в 7 вечера мы не только пили кофе, но и завтракали. Торопились воспользоваться нечастым солнечным днем и поплавать в открытом бассейне, пока дождь не пошел. Дома не поели и ничего не взяли. А кафе у них временно не работало, и рядом ничего не продают. Да назад уже не впустят, если выйдешь.

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

Лисички

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

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


четверг, 13 августа 2015 г.

Забытые плавки

Забыл плавки и шампунь в David Lloyds. Хватился только через два дня. В Virgin Active, куда мы обычно ходим, написано, что забытые мокрые вещи хранят не больше суток, чтоб не гнили. Но в David Lloyds, как оказалось, все гораздо серьезнее: у них есть журнал, где написано, когда, где и что именно найдено ("большие чёрные плавки с красными полосками"). Я думал, таких, как я, два-три человека, а там них целый ящик! Полотенца, купальники, детские игрушки, шампуни... Если несколько вещей найдены вместе, то их кладут в один пакет.

НДС в duty free

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

А сейчас вот журналисты добрались до этой темы. Оказывается, многие магазины сканируют талоны, чтобы на законных основаниях класть НДС себе в карман! Цена для пассажира при этом не уменьшается. Вот как оправдывается WH Smith (крупнейшая сеть по продаже книг и журналов на транспорте): "Практически невозможно использовать двойное ценообразование". Невозможно? Если не ошибаюсь, за окном уже 2015 год нашей эры, когда компьютеров больше, чем людей.

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

среда, 12 августа 2015 г.

Тут не хватает

Взял в столовой суп и кофе. Сел за стол. И тут мое внимание привлек индус с бинди (точкой на лбу). Конечно, в Лондоне индусов много, но у этого точка была очень уж яркая и больше обычных размеров.

Вспомнился анекдот про Брежнева:

- Леонид Ильич - ну, зачем Вы себе бинди нарисовали? Вы же не индус...
- Потому, что мне Индира Ганди сказала: "Эх, хороший ты мужик, Лёня... только тут [постукивает себя по лбу] не хватает!"

Мысленно посмеялся на глупым Брежневым. И тут заметил, что, отвлекшись, сахар я насыпал в суп, а не в кофе :)

Reverse rewrite host in response headers

Немного хитрая задача. HTTP запрос приходит на abc.com/xyz/ . С помощью IIS ARR (Application Request Routing) делаю rewrite на bcd.com/xyz/ (т.е. использую reverse proxy). И уже оттуда делаю 301 redirect на cde.com/something/

Т.е. нужно не просто перенаправить на другой домен, а ещё и поменять путь в процессе. Необходимая логика храниться на сервере bcd.com, и её нельзя переместить сразу на abc.com

Проблема: перенапраление происходит на второй, а не на третий домен (на bcd.com вместо cde.com). В HTTP-заголовке Location bcd.com вместо cde.com. Однако в HTML body вижу правильный текст object moved to cde.com/something/ . Т.е. мое приложение явно пытается сделать правильный 301 redirect, просто ARR портит заголовок в HTTP response.

Решение: в IIS Manager нажимаем на имя сервера, заходим в Application Request Routing Cache -> Server Proxy Settings, и отключаем 'Reverse rewrite host in response headers'.

пятница, 7 августа 2015 г.

Время собирать ссылки

Последнее время мой pet project (хобби на работе) - это борьба с ошибками 404, т.е. с битые ссылками. Допустим, внутренние ссылки ещё можно держать в порядке. Но как-то только на одну из твоих страниц появилась внешняя ссылка, то это уже навечно. По-хорошему, надо её куда-то перенаправлять. Причем не просто на главную страницу, а в релевантное место. Зачем? Чтобы сохранить SEO equity. Каждая ссылка на тебя - это плюс в твою карму, и жалко его выкидывать. Причем очень желательно избегать double redirects, т.е. вместо A->B->C лучше делать сразу A->C. Зачем, ведь Гугль же железный, он всё сам склеит? Да, склеит, но это будет медленнее. И есть шанс, что рейтинг будет чуть хуже, чем у того, кто делает direct redirect (каламбурчик!). Да, наверное, это почти ни на что не влияет. Но every little helps. Есть шанс, что, повысив свой рейтинг всего на доли проценты, ты сместишься с третьей позиции в Гугле на вторую, а это огромная разница.

Учитывая, что общее число страниц на всех наших сайтах - десятки миллионов, а самому старому сайту 19 (!) лет, и его структура многократно менялась... ну, вы поняли. Задачка "перенаправить все 404" не из легких. И многие скажут, что очень скучная. А мне нравится по нескольким причинам.

Во-первых, это как археология: когда изучаю логи IIS и старые исходники, то на моих глазах проносятся все эти годы развития сайта: static HTML, classic ASP, ASP.NET Web Forms, MVC; десятки людей со своими идеями и их проекты, от которых в какой-то момент отказались; наконец, многичисленные ошибки программистов, из-за которых в какой-то момент опубликовали неправильные ссылки.

Во-вторых, я люблю задачки, которые с виду простые, а на самом деле нет. Мой основной инструмент - IIS URL Rewrite. Вроде бы хорошо известный софт, но сделать что-то для 10 случаев или для 10 миллионов - это две большие разницы.

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

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

Не тот блог из-за WMPL

У нас есть несколько корпоративных блогов, для каждой страны свой. Вернее, физически это один блог на Wordpress, но используется плагин WPML для поддержки разных языков. У каждого языка - свой домен.

Часто бывает, что одна и та же статья публикуются в нескольких странах, иногда с небольшими изменениями (например, меняют спеллинг с британского на американский). Все вроде работало, и вдруг неожиданно начинаются 301 redirects на неправильный домен. Допустим, есть три варианта статьи:

www.example.com/blog/my-article/
www.example.ca/blog/my-article/
www.example.co.uk/blog/my-article/

Первые два начали перенаправляться на, допустим, www.example.co.uk/blog/my-article/. А другие статьи - на другой домен.

Оказалось, все дело в WMPL. Штатный способ работы - это пользоваться функцией "перевода". Т.е. что бы у тебя был как бы один логический "пост", но с "переводами" на другие языкы. А у нас, как оказалось, этой функцией иногда пользовались, а иногда просто создавали копии постов для другого языка. Если один и тот же slug используется для не связанных друг с другом постов, то WPML случайным образом выбирает один (самый старый?) и всё перенаправляет туда.

Но почему раньше не было этой проблемы? Видимо, обновили WPML, а предыдущая версия не была такой жёсткой.

Что делать? Если таких проблемных статьей две-три, то, конечно, легко всё исправить: надо выбрать один, "базовый" пост, вручную добавить туда "переводы", а посты с остальными вариантами стереть. Но у нас, как оказалось, таких постов почти тысяча. Замучаешься вручную делать, и ошибиться легко (ведь для каждого "перевода" надо скопировать не только текст, но и другие параметры),

Есть более простой вариант - поменять slugs, чтобы они были уникальными. Но, во-первых, это означает смену URLs, что очень плохо для SEO. Во-вторых, это решает проблему только частично: по-хорошему, все переводы должны быть связаны друг с другом с помощью мета-тэга hreflang. Если это не сделать, Гугль может сказать: "Так, а что это у вас почти один и тот же текст в пяти вариантах? Спамите, господа?" WMPL берет на себя hreflang, но, опять-таки, для этого нужно связать посты в один логический пост с переводами.

А может, просто откатить назад версию плагина WMPL? Можно, но, во-первых, есть шанс, что в будущем всё равно когда-то придется установить более новую версию, и проблема вернется. Во-вторых, мы не решаем проблему, а только её маскируем (ведь проблема с hreflang остается). В-третьих, просто и самим пользователям было бы удобнее работать, когда переводы сгруппированы.

Так что сжалился я над юзерами и написал небольшой SQL, который всё починил. Сэкономил им неделю работы. Идея такая: когда мы группируем посты, то физически их остается несколько (записи в таблице wp_posts не трогаем), но просто  в wp_icl_translations нужно им всем присвоить одинаковое значение trid. Неважно, какое - главное, чтобы уникальное. Trid - это как бы id группы переведенных постов.

Энергия космоса

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

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

Приставалы

Иду по парковке. Догоняет женщина: "Помогите, пожалуйста! По-моему, меня преследует этот мужик..." Оглядываюсь - вроде нет никого. Однако через несколько секунд из-за поворота действительно вышел негр. Лет 35, в очках, прилично одетый. Я скептически на него посмотрел - совсем не похож на насильника. Да и вообще как-то светло, и место не такое уж и безлюдное... Однако же, увидев меня, он явно смутился, промямлил "да мне только спросить", развернулся и быстро зашагал в противоположном направлении.

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

понедельник, 3 августа 2015 г.

Роликами вверх

Хотел подъехать к коллеге, который сидит за моей спиной. Как-то сильно оттолкнулся и полетел с креслом вверх ногами. Причем в полете ещё и задел и перевернул ногами тумбочку. Грохот, вся комната вскочила. Мда, лучше бы я ему задал этот вопрос по Скайпу :)

Впрочем, я совсем не пострадал.

Раньше выражение "сделать валентина" у нас в отделе означало "разлить чай на клавиатуру", а теперь, наверное, появится новый смысл :)

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

А все раньше хихикали, когда, подавая заявку на отпуск, в системе надо было ответить на вопрос "связано ли отсутствие с несчастным случаем на работе?" ("Мы же вроде не шахтеры или пожарники".) 

Соседские машины

А из нашего окна
"Ауди ТТ" видна!
А из вашего окошка -
Только "Приусов" немножко.

Ratings by outbrain