Ох…

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

У меня сердце встало…

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

Лечить vs. предупреждать

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

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

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

Так что противопоставление «лечить versus предупреждать» звучит примерно как «лучше выспаться, чем поесть». Болеешь — лечись, не болеешь — предупреждайся.

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

Дверь в небо

Дверь в небо (47.03КиБ)

Снято в Москве, недалеко от улицы Льва Толстого, точнее не помню.

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

Комьют — время для чтения

Илья переживает за «комьют» (commute).

«Комьют», согласно словарю, это время на езду из пригорода на работу в город.

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

Всего на дорогу трачу меньше двух часов. В лучшем случае, в одну сторону, от двери до двери дорога занимает 40 минут.

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

Сегодня, например, я с утра эксперементировал с SSE (Server Side Events), чтобы решить, пригодны ли они в одном внутреннем проекта «Яндекса», где критична быстрая реакция сервиса или нет.

А сейчас я собираюсь на работу.

Кстати, для меня «комьют» бесполезной тратой времени не является. У Илья есть новая машина, а у меня есть старое метро. Метро — единственное место, где я читаю книги. Редко бывает, что я читаю книгу ещё и дома. Бо́льшую часть того, что я прочитал, я прочитал в общественном транспорте. Если вдруг законы физики изменятся и заработает нуль-траснпортировка или, наконец, интерфейс для работы с компьютером внедрят прямо в мозг, мне придётся выделять специальное время для чтения.

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

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

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

А пока поеду я в офис, выберу какую из трёх книг я всё-таки хочу дочитать и поеду.

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

Рабочая задача: карта + объекты

Ничего экстраординарного, просто задача по работе попалась.

Дана карта местности (картинка), на неё нанесено большое количество объектов, несколько тысяч. В каждый объект можно тыцнуть мышкой, карта большая, её надо позволять «таскать» мышкой.

Текущее решение тормозит, а надо сделать так, чтобы не тормозило.

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

В общем-то, похоже, подтвердилось. Я взял CANVAS 2000×2000 точек, накидал на него 4000 квадратов случайного цвета и в случайных координатах, CANVAS положил в DIV, растянутый 100% на 100% и скрыл у него скроллеры.

Муляж карты (38.97КиБ)

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

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

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

Re: Господи, неужели это произошло с моим мальчиком?

Помните статью «Господи, неужели это произошло с моим мальчиком?» в которой одна жижистка обвиняет сотрудников и медицинскую службу «Шереметьева» в бездействии, когда руку её ребёнка сломала дверь лифта?

История, конечно ужасная, но не всё так просто. В «Шереметьеве» начали расследование этого случая и уже есть результаты, есть видеозапись с камеры наблюдения и полная хронология событий. Почитайте, посмотрите видео.

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

Часы без JavaScript: фильм о фильме

Как уже догадались все, кому это было хоть каплю интересно, часы без JavaScript сделаны анимированным GIF. Сделал я всё очень просто: скачал найденный где-то на FTP шрифт «clock.ttf», внутри которого вместо букв нарисованы стрелки в разных положениях и сгенерировал с его помощью 720 картинок.

Шрифт clock (27.08КиБ)

Оказалось, что проще всего сгенерировать картинки при помощи Go. В Пайтоне на «Маке» у меня нет PIL и я его плохо знаю, во встроенном PHP нет поддержки TTF, так что Go:

package main

import "gd"
import "os"
import "fmt"

func main() {
    im := gd.CreateTrueColor(21, 21)
    white := im.ColorAllocate(255, 255, 255)
    black := im.ColorAllocate(0, 0, 0)
    
    // стрелки: 64 → 123 (m) и 192 → 251 (h)

    defer im.Destroy()
        
    for i := 0; i < 720; i++ {
        im.FilledRectangle(0, 0, 20, 20, white)
        
        min  := i % 60
        hour := (i / 60) * 5 + min / 12
        
        im.StringFT(black, "./clock.ttf", 10, 0, 0, 16, "1")
        im.StringFT(black, "./clock.ttf", 10, 0, 0, 16, string(hour + 192))
        im.StringFT(black, "./clock.ttf", 10, 0, 0, 16, string(min + 64))

        name := fmt.Sprintf("gifs/%02d%02d.gif", i/60, i%60)
        im.Gif(name)
        
    }
    
}

После запуска получилось 720 картинок с ноль часов ноль минут до 11:59 (я не зря выбрал часы со стрелками, это позволило сократить размер анимированных часов вдвое).

Когда на сервер приходит запрос, я проверяю сколько сейчас времени и, если файл с часами для текущей минуты уже существует, то делаю редирект на существующую картинку. Если нет, то генерирую из 720 картинок новый «мультик», кладу его на диск и делаю редирект на него (остальные картинки удаляю):

<?
    include "clock.inc.php";
    
    list($h, $m) = explode(':', date('H:i'));
    if ($h > 12) $h -= 12;
    $name = sprintf("%02d%02d.gif", $h, $m);
    
    if (!file_exists($name)) {	
        @array_map('unlink', glob('*.gif'));
    
        $frames_tail = $frames = $framed = array();
        $frames_name = 'frames_tail';
    
        for ($H = 0; $H<12; $H++) {
            for ($M = 0; $M<60; $M++) {
                if ($h == $H && $m == $M) {
                    $frames_name = 'frames';
                }
            
                ${$frames_name}[] = sprintf("gifs/%02d%02d.gif", $H, $M);
                $framed[] = 100;
            }
        }
    
        $frames = array_merge($frames, $frames_tail);
    
        $gif = new GIFAnimator($frames, $framed, 0, 2, -1, -1, -1, 'url');
    
        fwrite(fopen($name, 'wb'), $gif->GetAnimation());
    }
    
    header("Location: $name");

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

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

Часы без JavaScript

Часы без JavaScript

Сделал крошечные аналоговые часы, которые работают без JavaScript. Кто первый догадается как они работают, тот молодец.

Правда я их ускорил в 60 раз (а то очень уж скучно смотреть), поэтому это скорее секундомер, но стартуют они с текущего времени.

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

ГОСТ 11261-75

Внезапно узнал, что существует «ГОСТ 11261-75. Шкурки кошки домашней невыделанные. Технические условия».

Подготовлен к уверждению Всесоюзным научно-исследовательским институтом стандартизаци (ВНИИС) и утверждён и введён в действие Постановлением Государственного комитета стандартов Совета Министров СССР от 13 мая 1975 года.

Шкурки меховой домашней кошки характеризуются густым волосяным покровом с частой упругой блестящей остью и густым пухом…

Площадь шкурки определяют умножением результатов измерений её длины от середины междуглазья до корня хвоста на ширину посередине шкурки…

Шкурки поставляют партиями. Партией считают количество шкурок, сдаваемых одновременно и оформленных одним документом о приёмке.

Кажется, я нашёл дипломную работу Капитана Очевидность. И ещё, у него нет сердца!

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

«Самая первая помощь: 10 опасных заблуждений»

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

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

Текстовые ссылки в графике

Графическая ссылка (115.73КиБ)

Читая последнюю, на настоящий момент, статью в Ководстве Лебедева «Правила оформления ссылок» обратил внимание, что Студия в этом месте, вроде как, не всегда следует своим же советам.

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

Написал письмо Артемию, посмотрим что ответит.

Технических трудностей, между тем, в подчёркивании таких ссылок никаких — прочертил линию в графике и всё, ссылка подчёркнута. Другое дело в подствечивании при наведении, кажется что это невозможно. Но это только на первый взгляд. Я уже демонстировал (неоднократно), что это делается очень просто.

Такие опыты я производил четыре года назад, так даже постоянные читатели вряд ли помнят. В GIF или PNG под ссылкой «прорезается» (прочерчивается прозрачным) полоска, которая будет имитировать наше подчёркивание. Картинке в CSS ставится фон ссылки (например, синий), при наведении фон меняется, схематически:

img {
    background: blue;
}

img:hover, img:visited {
    background: red;
}

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

Torschlusspanik

«Лента.ру» пишет:

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

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

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

Это что-то новенькое. Кто-нибудь припоминает такие «мирные» методы борьбы с неудобными людьми в нашей стране? Не зря Навальный переключился на борьбу с курением. Как чувствовал!

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

«Почему папа даёт 700 рублей в день»

Почему (59.61КиБ)

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

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

Joby Gorillapod SLR-ZOOM

Joby Gorillapod SLR-ZOOM (34.02КиБ)

У меня же список желаний есть, там всё непрактичное, ты-с-ума-сошёл-чайник-за-15-тысяч, то что я, наверное, сам не куплю, но хочется иметь. Жена вчера сделала сюрприз —  подарила штатив Joby Gorillapod SLR-ZOOM.

Спасибо!

Теперь ситуаций «ну не могу я снять, тут нужна выдержка полминуты, а я не робот держать столько фотоаппарат ровно» будет меньше. Самое крутое, что есть в этом штативе, что он не просто даёт поставить фотоаппарат куда-нибудь, он даёт его поставить куда угодно, да ещё и надёжно закрепить.

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

Лада на улицах Владивостока

Лада (73.37КиБ)

xxx: Я себе новую «непроходимую» игрушку нашел.
yyy: Какую?
xxx: Пытаюсь найти на яндекс.панорамах Владивостока хоть одну «Ладу»…

Цитата с «Башорга». Минут 15 играл, нашёл. Я не очень-то разбираюсь, но похоже, что это «Лада 1600».

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

Арсентьич

Арсентьич (40.15КиБ)

Хорошим ты был мужиком, Арсентьич, да вот, затянуло в мясорубку.

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

Google Go vs. Си

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

Я подключился и написал пример на Google Go:

package main

import "fmt"

func main() {
    x := []int{2}

    for i := 3; i < 200000; i += 2 {
        simple := true

        for _, j := range x {
            if i % j == 0 {
                simple = false
                break
            }
        }

        if simple {
            x = append(x, i)
        }
    }

    fmt.Println(x)
}

Запускалось всё на каком-то ноутбуке MacBook Pro. Результаты несколько неожиданные:

Python — 25,95 секунды Perl — 22,96 секунды PHP — 21 секунда Objective C — 9,40 секунды JavaScript (V8) — 4,73 секунды Java — 1,94 секунды Си — 0.95 секунды Google Go — 0,71 секунды.

Особенно меня поразили «Гоу» и JavaScript.

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

Работа — резиновый шарик

Представьте себе, что жизнь — это игра, построенная на жонглировании пятью шариками.

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

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

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

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

Ценность ценна только если её ЦЕНЯТ.

Брайан Дайсон (ex-CEО «Кока-колы»)

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

Walking frog fish

Мне этот ролик напоминает какое-нибудь аниме, вроде «Навсикаи из Долины ветров» или «Рыбки Поньо на утёсе», тем не менее, это настоящая, реально существующая рыба, правда я не знаю как она называется по-русски, по-английски её название Frogfish.

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

JS CSS в одном файле у меня на сайте

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

Особых трудностей не встретил, только убрал все комментарии из файлов с JavaScript руками и добавил удаление BOM из файлов, браузеры как-то нервно реагируют на них, встретив их не в начале файла, а мой редактор кода зачем-то их вставляет.

Схема, в общем-то, не изменилась — если файл .cssjs есть на диске, отдаём его средствами веб-сервера, если нет, собираем необходимое, кладём на диск и отдаём браузеру.

Вот ещё тонкость, обязательно нужно добавить новый mime-тип:

AddType */* .cssjs

Я-то думал, что он нужен только для FF 2.xx, ничего подобного, последние «Опера» и FF так же отказались работать без этого заголовка.

Оказалось, что последний «Хром» ни в какую не хочет рендерить CSS с таким типом, пришлось заменить на «text/css,*/*» на «text/css», предыдущий вариант не работал в IE9.

Надо посмотреть как отнесётся к этому второй FF, а пока, если у вас «Хром» или IE9 и показывает неправильно, обновите, пожалуйста, страницу, чтобы она не из кеша взялась, всё должно нормально отрендериться.

Посмотрим «в поле» насколько это стабильно работает.

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