Блог Обо мне Храню Читаю Ем 99  

страница № 150



໘.໘.໘.໘

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

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

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


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

темы: webdev, javascript, yandex
06.12 00:47
06.12 00:47


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

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

FFFFFFFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUUUUU-!

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


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

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

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


Thunderbird: «не спам»

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


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

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

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


Борода

Борода (34.81KB)
Что-то давно у меня картинок в блоге не было. Хочется визуального ряда. Это я, примеряю бороду, фотографировал Паша Катуров, один из наших менеджеров.
02.12 01:17
02.12 01:17


Presto 2.4

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

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

темы: webdev, opera
02.12 00:26
02.12 00:26


Input multiple-2

По мотивам предыдущего поста. Чтобы Opera 9+ (а так же 3.5—6.05), Firefox 3.6+, Chrome 3.0.191.0+ и Safari 4.0.1+ позволили выбрать несколько файлов в диалоге загрузки файлов, нужно написать вот такой код:
<form enctype="multipart/form-data" method="post">
   <input type="file" min="1" max="9999" name="file[]" multiple="true" />
   <input type="submit" name="submit" />
</form>
Я указал «file[]» для того, чтобы PHP сразу разложил полученные файлы по массиву $_FILES. К сожалению, запрос от «Оперы» PHP понимает неверно, так как «Опера» шлёт такой запрос в формате multipart/mixed. К счастью, PHP в этом случае положит содержимое файлов одним MIME-куском прямо в $_POST['file'][0], а там его уже можно разобрать (надеюсь, директива magic_quotes_gpc у вас отключена).

Я попробовал, это несложно. Для того, чтобы разобрать MIME-секцию, я использовал PECL-модуль mailparse (есть версия для Windows):
if (isset($_POST['file'], $_POST['file'][0])) {

    if ($idx = strpos($_POST['file'][0], "n")) {
        $bound = substr($_POST['file'][0], 2, $idx-2);

        $body  = "MIME-Version: 1.0nContent-type: multipart/form-data; boundary={$bound}nn".
                 $_POST['file'][0];

        unset($_POST['file'][0]);
        $f = &$_FILES['file'];

        $f['name'] = $f['type'] = $f['tmp_name'] = $f['error'] = $f['size'];

        $msg = mailparse_msg_create();

        if (mailparse_msg_parse($msg, $body)) {
            $i = 0;

            foreach(mailparse_msg_get_structure($msg) as $st) {

                $section = mailparse_msg_get_part($msg, $st);

                $data = mailparse_msg_get_part_data($section);

                if ($data['content-type'] == 'multipart/form-data') {
                    continue; 
                }
            
                ob_start();
                if (mailparse_msg_extract_part($section, $body)) {
                    $tmp = tempnam(sys_get_temp_dir(), 'php');
                    file_put_contents($tmp, ob_get_clean());

                    $f['name'][$i] = $data['disposition-filename'];
                    $f['type'][$i] = $data['content-type'];
                    $f['tmp_name'][$i] = $tmp;
                    $f['error'][$i] = 0;
                    $f['size'][$i] = filesize($tmp);

                    $i++;
                } else {
                    ob_end_clean();
                }
            }
        }
        unset($f);

        mailparse_msg_free($msg);
    }
}

var_dump($_FILES); // результат помещатся в $_FILES, не забудьте удалить временные файлы после обработки!
У меня ожидается, что содержимое файлов будет передано как параметр «file[]» (в $_POST это будет $_POST['file'][0]), но пример несложно переделать на любое другое имя или сделать это имя параметром.

темы: webdev, firefox, opera, chrome, safari, html, php
30.11 03:21
30.11 03:21


Input multiple

Я как-то пропустил, хотя сам участвовал в голосовании за эту фичу, что бете FF 3.6 появилась возможность выбрать несколько файлов при загрузке (это часть стандарта WebForms 2). Простой пример использования:
<input type="file" name="input" multiple="true" />
Ещё более интересно, что в свежей бете (№4) этого браузера есть возможность (как я понял) получить доступ к выбранным файлам из веб-приложения.

Попробовал посмотреть как выгдядит прикрепление нескольких файлов со стороны PHP, оказалось всё просто — достаточно сказать PHP, что из входящих данных нужно сделать массив и всё работает (например, указать name="input[]"): в каждом поле каждого элемента массива $_FILES содержится массив значений. Вот как это выглядит для двух файлов:
array(1) {
  ["input"]=>
  array(5) {
    ["name"]=>
    array(2) {
      [0]=>
      string(14) "2009.09.23.jpg"
      [1]=>
      string(14) "2009.08.25.jpg"
    }
    ["type"]=>
    array(2) {
      [0]=>
      string(10) "image/jpeg"
      [1]=>
      string(10) "image/jpeg"
    }
    ["tmp_name"]=>
    array(2) {
      [0]=>
      string(18) "Z:\tmp\php3740.tmp"
      [1]=>
      string(18) "Z:\tmp\php3741.tmp"
    }
    ["error"]=>
    array(2) {
      [0]=>
      int(0)
      [1]=>
      int(0)
    }
    ["size"]=>
    array(2) {
      [0]=>
      int(35005)
      [1]=>
      int(63030)
    }
  }
}
Конструкция работает в Chrome с версии 3.0.191.0 и в Safari с версии 4.0.1. К сожалению, в Opera 10.20 alpha 1 поддержки нет, в IE8 — тоже.

Добавлено 29 ноября 2009 23:08: оказывается, «Опера» поддерживала с версии 3.5 загрузку сразу нескольких файлов в обычном, «однофайловом» диалоге, но в 7-й версии эту возможность открутили. Так что «Опера» первый браузер, где это реализовали.

Добавлено 29 ноября 2009 23:14: «Опера» 9.0 и выше поддерживает загрузку множества файлов в одном контроле, достаточно указать параметры min и max:
<form enctype="multipart/form-data" method="post">
   <input type="file" min="1" max="9999" name="file" />
   <input type="submit" name="submit" />
</form>
Плохие новости заключаются в том, что PHP такой запрос от «Оперы» разбирать не умеет.

темы: webdev, html, firefox
29.11 11:20
29.11 11:20


Минск

Немного не повезло на въезде в город — прилетал Медведев и прямую трассу в Минск закрыли для простых смертных, зато таксист (ехали из аэропорта) сполна отработал двойной тариф, который он с нас слупил. Заехали в гостиницу «Беларусь» — чистенькую, но совковую. Совковость чувствуется во всём, в номере холодно (+6 на улице, в номере, похоже, не топят), персонал хамит, порою действует соверешенно неадекватно.

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

Беларуский рубль — это примерно в 95 раз меньше, чем российский, что незаурядно травмирует мозг поначалу (400 тысяч за номер в отеле?! 127 тысяч за такси??!), но постепенно начинаешь незаметно убирать два нуля и испокаиваешься (сколько надо доплатить за завтрак — 32000? а! это же где-то 320 рублей).
28.11 12:48
28.11 12:48


Web Standards Days через 2 дня

Завтра-послезавтра мы с женой Минске, в первый день погуляем по городу и отметим день рождения жены, во второй день я на «Web Standards Days» (впрочем, все участвующие уже в курсе, из письма организаторов).
26.11 18:19
26.11 18:19


Яндекс.рф

Компания «Яндекс» зарегистрировала домен Яндекс.рф:
domain:     XN--D1ACPJX3F.XN--P1AI
state:      REGISTERED, NOT DELEGATED, VERIFIED
org:        YANDEX, LLC.
phone:      +7 495 7397000
fax-no:     +7 495 7397070
e-mail:     noc@yandex.net
registrar:  RUCENTER-REG-RF
created:    2009.11.25
paid-till:  2010.11.25
source:     TCI
Есть так же Рамблер.рф, Кремль.рф, Москва.рф, Россия.рф, Мир.рф, Труд.рф, Газета.рф и, видимо, многие другие.

Вполне себе развлечение — угадать какие имена могут быть заняты.
25.11 23:50
25.11 23:50


未翻譯

Поднимался по мраморной лестнице во внутреннем дворике «Яндекса»,
капли дождя, накапливаясь на верхней площадке, срываются на ступеньку ниже, и ниже, и ниже.
Я — исполин, идущий по долине муравьиных водопадов.
25.11 12:17
25.11 12:17


Импорт ЖЖ

Очень хочется импортировать сюда, в блог, свой старый ЖЖ. Конвертор давно готов (написал за пару дней ещё в феврале), но всё не решусь запустить — из-за «Яндекс.Ленты». Имеется неприятный баг, который проявляется, если использовать в RSS теги, позволяющие RSS-читалке «Яндекса» индексировать через RSS весь сайт целиком.

У меня они и используются. Если я симпортирую сюда весь ЖЖ, то пользователи «Яндекс.Ленты» увидят все эти записи (сколько их там не помню, ну пусть 800) как новые, что плохо, я такого себе позволить по отношению к читателям не могу, а что делать не знаю. Можно сделать импорт, но не показать эти записи роботу «Яндекса», тогда они не будут находиться через «Яндекс.Поиск по блогам», который я использую как поиск по своему сайту.

Куда не кинь, всюду клин.

А ещё и бы и старый сайт импортировать, с 11 ноября 2000 года по 4 июля 2003-го. Кстати, недавно было 9 лет как я веду этот сайт.
25.11 00:26
25.11 00:26

страница № 150

Евгений Степанищев (imbolk@gmail.com)
t=0.990