Presto 2.4

На Web Standards Days увидел, наконец, новый движок «Оперы» — Presto 2.4 в действии! Новую «Оперу» показывал Вадим Макеев (он работает в этой компании), версия 10.50 (название кодовое) поддерживает border-radius и целую кучу других интересных вещей. Первые публичные сборки появятся, вероятно, уже в начале следующего года.

Кстати говоря, Presto 2.4 уже работает в Opera Mobile 10 beta, которую можно скачать, но, к сожалению, эти самые интересные вещи (и border-radius тоже) в ней отключены.

8 комментариев

Борода

Борода (34.93КиБ)

Что-то давно у меня картинок в блоге не было. Хочется визуального ряда. Это я, примеряю бороду, фотографировал Паша Катуров, один из наших менеджеров.

2 комментария

Наушники «свой дед»

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

Идея — школота, обманувшись такой «музыкой», примет любого дедка как своего.

6 комментариев

Thunderbird: «не спам»

Очень хочется, чтобы в Thunderbird появилась галочка, которой можно было бы отметить папку, где не может быть спама. У нас в «Яндексе» целая куча внутренних рассылок и мне часто в них приходится убрать пометку «спам», которой упорный дух Байеса, встроенный в «птицу», помечает спамовые, по его мнению, письма.

11 комментариев

Новый год в Казани

Если дверью хлопают, и прохода нету, значит боковушечка возле туалета. Это место проклято, передайте всем, не берите в кассах место 37

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

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

7 комментариев

Пока, Etherpad, здравствуй, Google Wave

Отличный инстурумент для коллективного редактирования заметок — Etherpad, куплен корпорацией зла и прекратит своё существование первого апреля 2010 года, разработчики вольются в команду Google Wave.

FFFFFFFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUUUUU-!

Аналоги (но не такие удобные): Twiddla и Dabbleboard.

1 комментарий

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, но код всё равно тут оставлю — пригодится.

3 комментария

໘.໘.໘.໘

На блоге «SearchEngines» появились замеры — действительно ли так выигрышно пользовать Google Public DNS, как это утверждает Google. Основной вывод:

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

Расскажу о чём речь, если кто не знает. Google открыл публичный DNS на легко запоминаемом IP 8.8.8.8 (за что ему спасибо, иногда DNS провайдера отваливается и я использую 4.2.2.2—4.2.2.4), утверждается, что его использование увеличит скорость загрузки сайтов.

Как видно из тестирования, в некоторых случаях это действительно имеет место, но мы же все понимаем что на деле делает «Гугл» — уточняет историю наших посещений (плюс получает новый источник информирования о новых сайтах) и дело вовсе не в заботе о пользователе и желании поделиться какой-то супертехнологией, облегчающей нам жизнь.

9 комментариев

Темно всегда

Чёртова зима! Я не понимаю, сейчас 11:24, это уже темно или ещё темно.

5 комментариев

«Авианова» отменяет почти сто рейсов

Бюджетная авиакомпания «Авианова» отменила в общей сложности почти сотню рейсов во второй половине декабря и в середине-конце января. (…) В частности, во второй половине января по ряду направлений (из Москвы в Самару, Казань, Краснодар, Набережные Челны) между очередными рейсами “Авиановы” будут паузы длиной в 6-8 дней

Сообщает «Federalnews» и многие другие центральные компании. Как хорошо, что мы купили билет не у этой авиакомпании! Кстати, на сайте самой «Авиановы» я никаких сообщений на этот счёт не вижу. Как клиенты узнают о том что рейсы отменены — загадка.

9 комментариев

User.js и FF

Сегодня написал небольшой user.js для «Оперы» и решил его переписать под плагин «Greasemonkey», под «Firefox». Оказалось, что есть немаловажные различия.

Во-первых, объект window браузера напрямую недоступен — нужно пользоваться «unsafeWindow», но руководство не рекомендует его использовать. Мне в user.js window браузера нужен был для доступа к jQuery, который был подгружен на странице, где работает скрипт, мне было удобно использовать этот framework. Объект «window» тоже есть, это внутренний объект Greasemonkey и выглядит как настоящий, только не радует на него, например, рекомендуется вешать все события.

Во-вторых, обращаться к функциям, определённым на странице, рекомендуется через

location.href="javascript:void(pageFunc(123))"

, утвержается, что это более безопасно, видимо, чтобы не передавать контекст выполнения наружу. Говорят, что в Chrome 4 это единственный способ добраться до «window».

В-третьих, из скриптов, выполняющихся из Greasemonkey, можно использовать функции «GM_xmlhttpRequest» (XHR с возможностью делать запросы на любые адреса), «GM_log» (логгирование, как можно догадаться) и так далее.

Ну и можно использовать localStorage (FF 3.5+) и globalStorage (FF 2.0+) для сохранения данных user.js.

8 комментариев

Штанга: game over

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

Сделал перерыв на две недели и теперь поднимаю исключительно небольшие веса — 38 кг по 30—35 раз. Боль потихоньку уходит, в последние два дня 38 кг поднимают вообще без каких-либо болей. Буду увеличивать вес по паре кило, ориентируясь на самочувствие.

2 комментария

Firefox отменил данный запрос!

Вот такое сообщение об ошибке мне показал сегодня FF 3.5:

Сюда не ходи, туда ходи (5.52КиБ)

Очень не люблю когда программа за меня решает что мне делать. Особенно издевательски смотрится кнопка «Попробовать снова». Зачем мне на неё жать? Firefox может передумать?

25 комментариев

Список городов на «Ы» и список городов на «Й»

Отрываю от сердца списки городов на буквы «ы» и «й», сделанные на картам «Яндекса»:

Ыгдыр, Ылгаз, Ылгын, Ылыджа, Ындыбыр, Ыныкчанский, Ыргыз, Ырмак, Ыспарта, Ыштык, Ында-Сылласе Йезд, Йеллоунайф, Йиглава, Йоханнесбург, Йосу, Йёнгёпинг, Йювяскюля, Йорк, Йер, Йошкар-Ола, Йонджалы, Йо, Йоко, Йокосука, Йолаезы.

Надеюсь не сделал нигде опечаток.

Опера ест память

Опера есть память (5.75КиБ)

Это очень странно, но стоит включить Flash в «Опере», как она начинает нещадно есть память. На скриншоте (открыто всего 12 закладок) далеко не худшая ситуация, я видел как она съедала вдвое большее количество. Помогает только снятие задачи (закрыть не получается, «Опера» продолжает висеть в памяти) и запуск заново.

Ситуация повторяется на обоих моих ноутах, под разными ОС (на одном — Windows XPSP3, на втром — Windows 7) и с разными версиями браузера (10.10 и 10.20).

Добавлено 11 декабря 2009 13:55: в комментах говорят, что с Flash так себя ведёт любой браузер. Видимо, новые версии Flash имеют какие-то дикие утечки памяти. Надо поискать user.js для «Оперы», который включает Flash по клику.

23 комментария

Safari, Chrome и «решётка»

У браузеров на движке WebKit какое-то своё, фашисткое отношение к «решётке» (#), после которой указывается локальный якорь в URL.

Во-первых, когда устанавливаешь location.hash, где более одной «решётки», Safari и Chrome иногда перезагружают страницу (зачем?).

Во-вторых, вторая и последующие «решётки» кодируются как «%23» (ни один браузер больше так не делает).

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

Иногда я верю, что один браузер это хорошо.

Иногда.

Добавлено 13 декабря 0:40: в комментариях мне подсказываю, что, кодируя «решётку» как «%23», WebKit поступает по RFC. То есть, формально, претензий никаких. По смыслу же, мне кажется, что «решётку» тут кодировать не надо.

14 комментариев

Росатом

В четверг, 10 декабря, некоторые блогеры, в том числе и я, получили приглашение посетить встречу с представителями «Росатома». В программе было запланированы две части: просмотр фотовыставки и встреча с пресс-секретарём ГК Сергеем Новиковым.

Блогеры на встрече (78.82КиБ)

Читать дальше

На выставке были представлены фото, сделанные блогерами на экскурсиях по атомным объектам: Смоленская АЭС, Обнинская АЭС, Ленинградская АЭС, Калининская АЭС и МЗС «ТВЭЛ».

Кот матроскин рядом со своим фото (92.46КиБ)

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

Сергей Новиков (64.87КиБ)

К сожалению, ничего не изменится. Законсервированное строительство возобновить нельзя, за это время, многое изменилось и станции такого типа больше не строят, проще построить заново, чем использовать то, что есть. Впрочем, заказа всё равно нет, а «Росатом» коммерческая структура.

Помятуя о поручении президента РФ Медведева главе «Росатома» создать музей из первой гражданской АЭС (Обнинской), я так же попытался узнать когда эту можно будет посетить простым смертным. Оказывается, проблем масса. Во-первых, Обнинская АЭС находится на территории закрытого объекта, во-вторых, даже законсервированную станцию оборудовать под музей невероятно сложно.

Торт (78.70КиБ)

В ходе встречи нас угощали лёгкими закусками, а в конце — великолепным тортом, на который на снимке с вожделением смотрит Дмитрий Мамонтов (блог «Популярная механика»), а ещё подарили по книжке Бруно Комби «Защитники природы за атомную энергию».

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

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

Автограф Сергея Новикова (29.86КиБ)

Заметно, что представители «Росатома» не очень-то понимают кто такие блогеры и, самое главное, откуда к ним такой повышенный интерес. Вероятно, нас представили просто как прессу, так как гардеробщицы всё пытались узнать в каком издании о них напишут и как будет называться статья. В разговоре с Котом Матроскиным я и сам недоумевал в чем ценность, к примеру моего блога: около 3—4 тысяч читателей в день (в совокупности с подписчиками на RSS), всего-то. Но пока говорил это понял, что резонанс куда шире и читателями не ограничивается.

Читатели цитируют, ссылаются, расказывают знакомым в офлайне и так по цепочке, таким образом информационная волна расширяется стремительно и широко, а если источников несколько эффект может быть ошеломляющим. Очень важен вопрос доверия. Ведь я не официальное СМИ, которое пишет что сказали, а «next door guy».

В интересное время живём.

8 комментариев

В переходах курить запрещено!

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

Сегодня, возвращаясь домой из ресторана «Экспедиции», я, от нечего делать, начал читать правила пользования московским метрополитеном. Я их раньше читал, но не так вдумчиво. Цитирую:

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

Частью метро считаются подуличные (подземные) переходы! Смотрим дальше:

2.11. На территории метрополитена запрещается:

2.11.2. Курить.

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

Добавлено 13 декабря 2009 0:54: как меня правильно поправляют в комментариях на «Ярушке» не все переходы относятся к метро, а только те, в которые метро выходит.

13 комментариев

Дизайнерская находка: чёрное на чёрном

Assist, экран оплаты (7.51КиБ)

Система оплаты Assist уже по меньшей мере неделю предлагает клиентам варианты оплаты, написанные чёрным по чёрному. Со стороны системы оплаты это удивительно халатное отношение к тестированию своего интерфейса.

16 комментариев

Thunderbird 3: fail

Такое количество очевидных багов, как в Thunderbird 3 я не видел ещё ни в одном релизе какого-либо серьёзного продукта за последние годы. Двоящиеся сообщения в поиске, проблемы с отображением кодировок в списке писем (в просмотре письма всё нормально), кнопка «Reply» закрывает имя отправителя и так далее. Всё это видно уже через первые пять минут пользования продуктом. Через два дня работы их, наверное, можно найти все.

Баги в THB3 (4.19КиБ)

36 комментариев

Фильм «Аватар»

Посмотрели с женой «Аватар» в 3D. Конечно наивный, не без ляпов, но ничего более красивого мы ещё не видели. В конце зал даже похлопал, чего я вообще не припомню. Идите и смотрите! Обязательно в 3D!

11 комментариев

Opera 10.50: скоро

22-го декабря компания «Опера» пообещала показать версию 10.50 pre-alpha. Ключевым изменением называется скорость (что не может не радовать), а не поддержка всякого из CSS3 (border-radius, CSS-анимация), о котором я писал ранее.

Это подарок компании к Рождеству.

8 комментариев

Анализатор БД

Целый день бьюсь с базой данных Testlink, пытаюсь найти путь как связать test case и его версии. Так как внешних ключей, описания базы и моделей нет, чувствую себя, как в лабиринте — где-то есть выход и мне его надо найти. Но не получается. Есть таблица «A», есть «B», есть «A_B», в «A_B» есть «A_id» и «B_id». Вроде все ясно — две таблицы и таблица связей. Ан нет, не работает, не связываются данные.

Очень хочется анализатор БД, который взял бы лог запросов SQL и построил бы по нему связи между таблицами. Самому написать времени нет, да и, может, готовый уже есть. Может кто знает? А то я за целый день проблему так и не победил, по коду смотреть — тоже тот ещё квест.

Добавлено 18 декабря 22:10: перед уходом домой я разобрался, что всё связано через другую таблицу.

Для конкретики: есть таблицы tcversions, testplan_tcversions и testplans.

В testplan_tcversions есть поля testversion_id и testplan_id. Поле testversion_id указывает в таблицу tcversions, но поле testplan_id не указывает на testplans. Оно указывает в таблицу nodes_hierarchy, ту да же указывает id у tcversions, а связь между ними осуществляется через дерево внутри nodes_hierarchy.

Кажется, так всё работает. Это мне ещё предстоит выяснить в понедельник, а сейчас я домой пойду.

8 комментариев

«Альфа-банк». Вы кто? Правда? Точно?

Чтобы оплатить телефон через интернет-банк «Альфа-банка» нужно: ввести цифры своего аккаунта, ввести пароль, получить на сотовый телефон разовый пароль для входа в банк, ввести его, перейти в платежи, получить на сотовый телефон разовый пароль для платежа, ввести его и только после этого можно будет оплатить телефон.

Тройная авторизация! Что за паранойя?

19 комментариев

Нельзя опознать незнакомое

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

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

Это из рецензии Экслера на фильм «Аватар». Проблема, мне кажется, не в этом. Я верю, что вполне можно создать что-то совершенно новое, но беда в том, что перестаёт работать «утиная типизация».

Вот мы создали хрен знает что, которое ходит, как зрен знает что, выглядит, как хрен знает что и пахнет, как хрен знает что. Так что это за хреновина? Создай что-то совершенно непривычное и что с ним делать? Как узнать оно плохое или хорошее? Что у него за проблемы и как их решить? Вот что оно сейчас сделало — поменяло поляризацию бозонов Хиггса или изменило хиральность фермионов? И в чём разница для меня, как зрителя?

Как переживать непонятное? Как ему сочувствовать, сопереживать? И оно мне надо? Интереса не больше, чем смотреть калейдоскоп.

Вот почему мир «Аватара» другой, но очень похожий. Там всё непривычно и знакомо, а народ на’ви плачет, когда видит смерть близких, кивает, когда согласен и целуется в губы, хотя даже на нашей планете есть народы, которые ведут себя иначе.

14 комментариев

Оперкут

В книге Андрея Некрасова «Приключения капитана Врунгеля» апперкот называют «оперкутом»:

Мистер Денди дрался блестяще. Я получил жестокий удар в  переносицу, но тут вспомнил молодость, пришпорил Фукса, перешел в  инфайтинг и  нанес противнику сокрушительный оперкут.

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

15 комментариев

Opera 10.50 pre-alpha

Opera 10.50 pre-alpha вышла! Кратенько: CSS transformation и многое из CSS3 (border-radius!), HTML5 local storage и open database, Carakan (новый движок JS с прекомпиляцией в машинный код), VEGA — библиотека для векторной графики (в будущем будет использовать аппаратное ускорение, но и сейчас ускорение заметно).

Это далеко не всё, лучше прочитать остальное на сайте «Оперы».

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

24 комментария

Фотосессия в мехах

Одним из подарков жене на день рождения (был чуть меньше месяца назад) была фотосессия в мехах — «приключения в подарок» от магазина «Экспедиция». Получились 428 фотографий в красивых, дорогих мехах, из которых мы с женой должны были выбрать шесть, чтобы фотограф выровнял на них освещение, цвета и так далее (вот только веснушки он зря замазал, осуждаю).

Сегодня мне прислали результат. Какая же у меня всё-таки красивая жена!

жена (85.60КиБ)

6 комментариев

«Райффайзен» жжот

0.00 (22.32КиБ)

«Райффайзен» каждый месяц исправно шлёт мне письма с требованиями погасить задолжность в «0.00», причём указывает срок погашения. Их кредитной картой я не пользуюсь (не устраивает, что если снять наличку, то они сразу берут довольно немаленький процент) и даже ни разу не вводит PIN-код.

11 комментариев

--5

Это прекрасный образец рака мозга, ящитаю:

<?php
function turn($x)
{
     $y = abs($x);
     if ($y == $x)    
         return "-$y";    
     else        
         return "$y";    
}
?>

You can use this code:

<?php
echo turn(-5) + turn(10);
?>

The output is:

-5

;
Because 5 + -10 = -10

Цитата — из пользовательского комментария к функции abs языка PHP. Для тех, кто далёк от программирования, побуду Капитаном Очевидностью.

Функция меняет знак числа (т. е. было «-5», надо сделать «5», было «2», надо сделать «-2»), для этого она сранивает число с его абсолютным значением и, если оно совпадает (значит число положительное), выводит это число с приделанным символом «-», если нет — то возвращает абсолютное значение.

Правильный ответ:

function turn($x) { return -$x }

не стоит того, чтобы оформлять его в функцию.

Что имел ввиду автор, когда писал «Because 5 + -10 = -10» я не знаю, надо Смирнова спросить, он понимает язык идиотов.

14 комментариев

Скороговорка

Пайтонячья скороговорка:

import pprint as pprint
pprint.pprint(pprint)

Добавлено 24 декабря 2009 14:08: вариант от Бобука, чуть-чуть поправленный мной:

from pprint import pprint as pprint
locals()[pprint.__name__](pprint)

4 комментария

XML в MySQL

Почему-то мало кто слышал, что в MySQL с версии 5.1.5 появился «чудесный» способ нарушать 1NF, при этом работая с частями поля таблицы, как со сложной структурой.

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

Речь идёт о двух функциях — ExctractValue и UpdateXML. Если в поле таблицы хранится XML, то первая функция позволит выбрать данные при помощи XPath, а вторая — (при помощи XPath же) изменить какую-то их часть. Ничего неожиданного — функции могут работать как с полями таблицы, так и со строкой, переменной, результатом функции или любой комбинацией вышеперечисленного.

Примерно так:

SELECT ExtractValue('<a>c</a><b/>', '//a');

SELECT UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>');

SELECT * FROM users WHERE ExtractValue(info, '//firstname') == 'Иван' AND ExtractValue(info, '//surname') == 'Сагалаев';

В случае, если XPath не дал результата или в поле оказался не XML, функции вернут NULL (версии MySQL до 5.1.12 содержат баг и частично могут работать даже с not-well-formed XML).

6 комментариев

CSS hack для Opera 10.50, 10.xx, не 10.50

«Опера» 10.50 стала поддерживать border-radius и много других интересных вещей, в этой связи встал вопрос — как отличить 10.50 от более ранних версий в CSS?

Например, у меня на сайте скруглённые уголки для «Оперы», начиная с версии 9.50 делаются при помощи SVG, 10.50 вполне могла бы нарисовать их без этого «изыска». Помучался-помучался и придумал несколько CSS-хаков, собственного изобретения.

<style type="text/css">
@media (0) {
    body { background: red; } /* Opera 10.xx, но < 10.50 */
}

@media all and (resolution = 0dpi) {
    body { background: red; } /* Opera < 10.50, минимальной версии не знаю, 9.27 работает */
}

@media all, () {
    body { background: red; } /* Opera 10.xx (включая 10.50) */
}

@media all, {
    body { background: red; } /* Opera 10.50 prealpha */
}
</style>

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

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

Все хаки я испытывал на «Операх» 10.50 prealpha, 10.10, 10.01, 9.50 и 9.27. Надеюсь, баг 10.50 не исправят и хак будет работать и дальше (pepelsbey, пожалуйста, молчи!:).

Добавлено 25 декабря 2009 10:38: проснувшись утром, я обнаружил, что умудрился ночью запостить этот текст два раза. Решил удалить один из них и удалил тот, что с комментариями. Простите, это утро :(

16 комментариев

Ура, подживает!

Сегодня попробовал (с разминкой) толкнуть 88, оценить будет ли болеть трицепс. Ура! Не болел абсолютно. Толкнул 6 или 7 раз, значит форма почти не потеряна. Пока больше брать не буду, пусть подживает дальше.

2 комментария

CSS hack для Firefox 3.5

В комментариях на «Хабре» попросили придумать CSS-хак для FireFox 3.5. Пожалуйста:

<style type="text/css">
x:-moz-any-link:nth-child(0), body { background: red; } /* FF 3.5+ */
</style>

Проверил в Firefox 2.0.0.19, Firefox 3.0.3 и в Firefox 3.5.5.

10 комментариев

Ой-йо

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

3 комментария

Yahoo! и nofollow

Оказывается, поисковая машина «Yahoo!» тоже поддерживает rel=«nofollow». Кстати, у них в руководстве ошибка:

For instance, websites with public comment areas can apply a «nofollow» attribute to publicly entered links to help fight comment spam.

Applying the rel=«nofollow» Attribute:

Example: <a href=«http://spammer.example.com/»>buy now

changes to: <a href=»http://spammer.example.com/ rel=nofollow«>buy now

Ай-яй-яй. Хотя в таком виде ссылка тоже «help fight comment spam», это уж точно.

А ещё «Yahoo!» выставляет странный заголовок: «X-LLF-Mime-Type: true», знать бы зачем.

2 комментария

Курите, снижайте конкуренцию!

В ДНК рака легких генетики насчитали 23 тысячи ошибок — в значительной степени спровоцированных воздействием табачного дыма.

Из этого ученые сделали вывод, что у среднего курильщика на каждые 15 выкуренных сигарет приходится по одному нарушению генетического кода.

Статья в BBC Russian «Ученые расшифровали генетический код раковых клеток».

18 комментариев

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

Проект «Переговорки» — внутренний веб-сервис «Яндекса» для бронирования переговорок, синхронизированный с 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 запрограммируют на его примере чтение повторяющихся встреч, попробую им его кинуть), но пусть он всё равно полежит у меня, как памятник полугоду моей жизни.

31 комментарий

Chrome/0.X.Y.Z

Автоматические ходилки такие автоматические. Их авторы забивают user-agent из разнообразных источников, иногда — из официальных FAQ разнообразных браузеров, сказано FAQ Google Chrome:

  1. Как выглядит строка user agent в Google Chrome?

Строка user agent в Google Chrome выглядит следующим образом:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.X.Y.Z Safari/525.13.

Нет проблем. И вот в логах за вчера я уже вижу строчку «Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.X.Y.Z Safari/525.13» в поле, где записывается user-agent.

Оставить комментарий

У нас матерятся

Вы уже нашли вариацию на любимое слово Лебедева на ежегодной фотографии студии? Оно именно там, где я и предполагал. Я, кстати, так и не нашёл его в прошлом году.

12 комментариев

С наступающим новым годом!

perl -MEncode -e '
$_ =
"1101000100100000111011011110111011100010111110111110110000100000111000111110111011100100111011101110110000100001";
@x = /(d{8})/g; print Dumper @x; print encode_utf8(decode("cp1251", chr(eval "0b$_"))) for @x; print "n"'

python -c "print ''.join((lambda s: [chr(int(s[x:x+8], 2)).decode('cp1251') for x in xrange(0, len(s), 8)])(
'1101000100100000111011011110111011100010111110111110110000100000111000111110111011100100111011101110110000100001'))"

php -r 'echo iconv("cp1251", "utf-8", join(array_map("chr", array_map("bindec", str_split
("1101000100100000111011011110111011100010111110111110110000100000111000111110111011100100111011101110110000100001",
8)))));'

powershell -Command "[system.string]::join('', @([regex]::split(
'1101000100100000111011011110111011100010111110111110110000100000111000111110111011100100111011101110110000100001',
'(.{8})') | Where {$_} | %{ [Convert]::ToInt16($_, 2)} |
%{[System.Text.Encoding]::GetEncoding('utf-8').GetString([System.Text.Encoding]::
Convert([System.Text.Encoding]::GetEncoding('windows-1251'), 
[System.Text.Encoding]::GetEncoding('utf-8'), [byte]$_))}))"

Вариант на Перле — Вячеслава Матюхина, остальные — мои. Текст на Powershell выглядит монструозно, но на деле там самый страшный кусок — перевод байтовой строки cp1251 в utf-8, всё остальное очень простое.

12 комментариев

Ещё о PowerShell

Всё-таки PowerShell прекрасен. Вот это вот:

cat user-agents.log | sort -u

одинаково работает и под bash и под PowerShell! Конечно, более «чистый» PowerShell выглядит как на листинге ниже:

Get-Content user-agents.log | Sort-Object -unique

Команда «Get-Content» имеет алиас «cat», «Sort-Object» — «sort», а ключ «unique» сокращается до «u».

Или вот, на bash не совсем похоже, но что проиходит догадаться просто:

ls | where {!$_.length} | %{rm $_}

15 комментариев

В Казань и обратно

Через час, надеюсь, мы с женой уже будем сидеть во взлетающем самолёте, на этот раз летим компанией «Трансаэро», удивительно — деньги те же, а сервис кажется более человечным, чем у «S7». Обратно в Москву — девятого числа компанией «UTair», их смешными винтовыми французскими самолётами.

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

4 комментария

← сюда туда →