26 заметок с тегом

яндекс

Конец «Яндекс.Фоток»

Надгробная плита «Яндекс.Фоток», сервис умер всеми брошенный и забытый

Не понимаю что за отношение у «Яндекса» к сервису «Фотки». На момент своего появления это был добротный сервис, который выгодно отличался ото всех остальных отсутствием лимитов — можно было заливать фотографии в исходном качестве и не было никаких ограничений на их количество. По-настоящему никаких! Я помню как много лет назад подошёл к ребятам из «Фоток» и с хитрым прищуром спросил, что будет, если я буду лить в свой аккаунт по фотографии в секунду. Мне ответили, что они просто этого не заметят.

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

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

Я надеялся, что в «Яндексе» возьмутся за голову, переделают, обновят.

И вот «Фотки» закрывают. Фотографии переезжают на «Диск», свободное место при этом не уменьшится — большое спасибо, правда, хоть это и не безлимит, конечно. Не знаю что станет с аннотациями, с привязкой к карте, с комментариями — для меня эта информация очень важна, но без понятия как её вытягивать, писать какой-то конвертор? Очень надеюсь, что всё это сохранится.

29 апреля   яндекс

«Чистый веб» Яндекса

У «Яндекса» как-то незаметно проект «Чистый веб» вышел. Ещё я в этом проекте участвовал. Дописывал плагин для phpBB, правда тот, который там дают скачать (зачем-то вместе с phpBB внутри) другой совсем, переписан под PHP 4.1 и у меня смутные воспоминания, что я его под вторую версию писал, а этот под третью.

Остался ли там какой-то мой код не могу сказать, всё сильно изменилось внутри и полтора года прошло.

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

«Яндекс.Пробки» в Казани

Третью неделю езжу с приложением «Яндекс.Карты» в Казани, чтобы посмотреть помогут ли мне «Яндекс.Пробки» быстрее добираться до работы. Вывод неутешительный — точность информации, как у прогноза погоды осенью — ну да, возьмёшь зонтик, вряд ли ошибёшься, но ведь и солнце где-то бывает, но когда и где?

Стойкое ощущение, что в казанских «Пробках» не учитывается никаких источников данных, кроме пользовательских устройств (когда вы пользуетесь приложением для «Карт», приложение пользуется вами — передаёт «Яндексу» как быстро вы двигаетесь на этом участке).

Например, вчера я ехал по мосту «Миллениум», на котором была грандиозная пробка, прямо за моим указателем положения дорога на глазах «краснела».

Исправить ситуацию можно следующим образом.

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

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

Казань (66.00КиБ)

Город условно делится на две части — левый берег и правый берег реки Казанки. Больша́я часть казанцев ежедневно пересекает реку в обеих направлениях, а сделать это можно строго по одному из четырёх мостов Казани (слева направо) — Кировский дамбе, Ленинской дамбе, мосту Миллениум и Третьей транспортной дамбе (сейчас последняя перекрыта, но работает её дублёр).

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

Далее, к Универсиаде 2013 года Казань строит кучу двухуровневых развязок, часть важных дорог (а зачем строить развязки на неважных дорогах) перекрыта, но город, увы, не позаботился о дублёрах, поэтому автолюбители сами нашли объезды, кажется, самая болезненная ситуация перед Миллениумом — прямой выезд перекрыт и там часто пробка, но исключительно важно знать действительно ли она сейчас там есть, так как от этого зависит решение стоит ли вообще ехать через Миллениум. Напоминаю, что мосты (Миллениум — это мост) — важная штука.

В-третьих, часть важных дорог для «Яндекс.Карт» похоже не существует. На дублёре Третьей транспортной дамбы aka «Старый мост» (который работает вместо самой дамбы) я вообще ни разу не увидел хоть какой-то информации о пробках, Чистопольская в сторону Ямашева не существует тоже — на клиенте Андроида там у меня пунктир, дорожной информации нет, а эта дорога связывает два моста — Миллениум и Третью транспортную. Это только те места, где я обычно проезжаю.

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

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

2011   яндекс

Специальный вид «Яндекса» для speeddial «Оперы»

Яндекс-Опера-френдли (21.44КиБ)

Я рад, что явился катализатором в «Яндексе» появления визуальных закладок для «Оперы» (для плагина FireFox «SpeedDial» тоже будет работать).

Проект «Погоды» я даже поменеджерил.

К сожалению, пока нет технической возможности делать то же самое для «Хрома» и «Сафари», так как использовать media queries (как для «Оперы» и FF) не получится, браузеры на WebKit ведут тут себя нелогично, нужно проверять особый HTTP-заголовок, а это противоречит техническому решению сервиса.

2010   browsers   opera   программирование   яндекс

«Переговорки»: панихида

Проект «Переговорки» — внутренний веб-сервис «Яндекса» для бронирования переговорок, синхронизированный с Microsoft Exchange. Это, наверное, самый сложный проект, который мне приходилось делать за всю жизнь.

Используется он теми, кто не может установить себе Outlook — ребятами с «Маками» и разнообразными «Линуксами» (а таких очень много). Кроме того, что от Exchange мы будем постепенно уходить, а интерфейс бронирования останется без изменений.

Никогда я ещё так не выкладывался, так не радовался, не расстраивался, не оставался с таким упорством допоздна в офисе. Звучит просто — вытаскивать время от времени данные из Exchange и отсылать обратно новую бронь. К сожалению, MS Exchange, который использовался тогда в компании, не умел общаться с внешним миром никак иначе, кроме протокола MAPI — бинарному исчадию ада, причём не просто через MAPI, а через так называемый MAPI через RPC — диалект DCE-RPC, который называется MSRPC.

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

Из бесплатных библиотек уровнем повыше нашлась одна-единственная — libmapi, поскольку она требовала наличия альфы Samba4 строго определённой версии, а на машине уже стояла Samba3 (через которую мы работали), решено было попробовать её скомпилировать. Оказалось, что такие попытки в компании уже предпринимались, но закончились неудачей. Решив что попытка не пытка, за несколько дней я её всё-таки собрал и запустил.

Это и положило начало проекта «Переговорки».

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

Через несколько дней после того как я в первый раз скомпилировал libmapi, тестовые утилиты на Си благополучно подключились к Exchange и уже умели отпределять дают им правильные данные для авторизации или нет. Эти несколько дней ушли на то, чтобы разобраться как создавать профиль, как настраивать библиотеку и Samba4 для работы и так далее. Оставалось как-то состыковать всё это дело с Python.

1275 строк основного модуля, 647 строк файла описаний структур MAPI, 4046 констант, 457 строк для описания Pid-свойств. А сколько не заработало, сколько пришлось переписать. Самая рутинная работа была — искать по всем исходникам libmapi и Samba описания структур, пытаться сообразить как их переписать на Python и состыковать со всеми остальными. Ребята, придумавшие модуль ctypes для Python, большие молодцы.Правда мне пришлось придумать и реализовать парсер для расширенного синтаксиса, чтобы описывать динамические структуры MAPI, не знаю как сейчас, а тогда libmapi не умел читать повторяющиеся встречи (кажется, и теперь не умеет), так что читать и описывать их приходилось на самом низком уровне, а значит как-то хранить эти данные и уметь ими манипулировать.

Ничего, пара дней корпения над бинарной распечаткой с последующими уточнениями в противоречивой документацией от Microsoft и я написал класс, который такие встречи умеет разбирать. Впрочем, это было уже позднее, а сначала надо было догадаться что делать после логина. Из документации у libmapi — только перечень функций и исходники на Си. Пришлось внимательно просматривать первое и читать второе. Тут нельзя не упомянуть Сергея Андрюхина, несколько очень ценных его идей и исследований вошли в тот код. Кстати, местами исходники на Си написаны так плохо, что приходилось упрощать код — не всё, что можно позволить себе в Си, можно позволить себе в менее шустром «Пайтоне».

Разобраться с порядком вызова этого великолепия было непросто, плюс ещё множество более мелких проблем, вроде странного формата хранения времени (Exchange хранит число минут с 1 января 1601 года). Плюс утечки libmapi, которые пришлось изолировать, решать проблему с передачей данных в родительский процесс, мучаться с Python 2.4, который, как оказалось, никогда не освобождает память, выделением памяти на куче «про запас» через Python API (спасибо ctypes), определением по косвенным признакам, что память закончилась, пора отдать данные в родительский и умереть, и так далее.

Сначала мы научились читать freebusy информацию — просто даты и время, когда переговорка чем-то занята, потом уже — заходить в папку переговорки и читать её календарь.

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

Спасибо Саше Покатилову, который правил мой код, пока я был в отпуске и занимался Django-частью проекта, с ним же мы проектировали базу. Например, мы решили просто размножать повторяющиеся встречи на год вперёд, избежав тем самым множество проблем. Год — это так называемое «окно бронирования», дальше этого срока наш Exchange встречи не видит. Каждый день Сашин механизм достаточно оптимально размножал всречи ещё на один день дальше, мой класс при помощи полезнейшего модуля dateutil.rrule переводил по достаточно хитрым правилам повторяющиеся встречи Exchange в список дат.

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

Думаю, если попробовать вспомнить всё, хватит на небольшую книгу… Я рад, что эту невероятную задачу удалось решить. С моей стороны, как мне кажется, это 100% моей «мощности» как программиста. Будущее покажет, но пока все задачи я буду оценивать по этой.

К счастью, в новом Exchange, который появился у нас в компании, появилась поддержка SOAP и «Переговорки» переделали с использованием этого протокола. Есть предварительное согласие на выкладывание модуля, который у меня тогда получился в интернет. Пожалуй, сейчас он бесполезен (хотя, может авторы libmapi запрограммируют на его примере чтение повторяющихся встреч, попробую им его кинуть), но пусть он всё равно полежит у меня, как памятник полугоду моей жизни.

2009   libmapi   яндекс

TestLink

Время от времени занимаюсь модификацией используемого внутри компании инструмента «TestLink». Сложная задача — приделать к нему ЧПУ (TestLink целиком на фреймах, у него не то что ЧПУ, обычных-то URL нет).

С задачей справился чуть менее, чем полностью — осталась пара мелочей, а в пятницу по половины одиннадцатого вечера боролся с деревом тест-кейсов. Всё просто — получили линк на test case, нужно раскрыть дерево на определённом узле. Дерево выполнено не на православном jQuery, а на сатанинском ExtJS (кстати, привет авторам ExtJS и вопрос — для чего вы делали собственные ID, но не потрудились сделать возможность привязаться к ним из select и get?).

Осложняется всё тем, что дерево снаружи недоступно (изолируется внутри функции), а менять JS-код продукта я не могу, это крайне нежелательно. Пришлось эмулировать события, чем я раньше никогда не занимался. Оказывается на эту тему есть весьма развесистые плагины (в том числе и для jQuery), я эмулировал вполне конкретное событие — клик мышью, поэтому сделал свою небольшую функцию, как водится, две ветки — для IE и всего остального. Запишу сюда, чтобы не потерять:

function fireEvent(element, eventname){
    if (document.createEventObject){
        return element.fireEvent('on' + eventname, document.createEventObject())
    } else{
        var event = document.createEvent("HTMLEvents")
        event.initEvent(eventname, true, true)
        return !element.dispatchEvent(event)
    }
}

В итоге получилась дикая вещь — когда человек вводит этот самый понятный ему URL, браузер спрашивает у сервера путь по дереву, получает его, по таймеру долбит дерево в плюсики (дерево грузит каждый узер через AJAX), чтобы развернуть каждый узел по пути следования к test case, а когда добирается до цели, таймер тушится.

Такие развесистые клюквы там приходится программировать на каждом шагу. Зато все URL абсолютно понятны пользователю и роутинг правится очень просто.

Добавлено 8 декабря 2009 0:41: потом я переписал всё на чистом ExtJS, воспользовавшись getCmp, expandPath и внутренней реализацией fireevent, но код всё равно тут оставлю — пригодится.

2009   javascript   программирование   яндекс

Yandex.ru.

Две ссылки: http://yandex.ru и http://yandex.ru. Я не знал, что так можно. Век живи, век учись. Кстати, FireFox 3.5 загружает всё правильно, но конечную точку отрубает, поэтому после перезагрузки страница меняется.

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

Измеритель удара

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

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

2009   яндекс

Модуль XScript для PHP

Писал для PHP биндинг в XScript. Си++ я не знаю (и знать не хочу), поэтому писал на Си. Огромое спасибо Antony Dovgal за помощь, без него я бы ещё долго разбирался как писать модули для PHP на Си внутри вражеского Си++, с его же помощью причесал m4-файл и код.

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

Чистого времени я потратил половину дня (вместе с хождением по «Яндексу», перепиской, установкой пакетов XScript и прочее — ещё 1,5 дня), но это только потому, что Тони согласился помочь (и у него был опыт написания Си++ модулей на Си на примере биндинга к архиватору RAR, который мы и разбирали).

Думаю, этим и объясняется небольшое количество бинарных модулей на PHP, а так же их низкое качество. Жаль.

2009   php   яндекс

Интранет-вики

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

2009   яндекс
Ранее Ctrl + ↓