Моя Казань (видео)

Видео к торжественной передаче флага Международной федерации студенческого спорта от Китая России, которая состоялась в рамках церемонии закрытия Всемирных летних студенческих игр 2011 года. Мэр Казани Ильсур Метшин получил флаг из рук мэра Шеньженя (в 2013 году Казань принимает у себя «Универсиаду»).

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

Ночевал в Авиагородке

Если вы, как я вчера, опоздаете на самолёт и вам придётся искать ночлег в Домодедове, рекомендую — Галина Васильевна (+7 916 626 64 69). За две тысячи рублей (если вас двое — по 1500 с каждого) разместит вас у себя в квартире в Авиагородке на улице Туполева. Квартира чистая, правда с советским ремонтом, комната отдельная. Гостиница в аэропорту, для сравнения, стоит 6700 за обычный номер.

Такси до места (и обратно — в аэропорт) стоит 200 рублей, ехать — минут 10-15.

Авиагородок (бывший посёлок Востряково-1) — небольшой посёлок городского типа, возник как поселение для строителей, позже — работников аэропорта, сейчас является районом города Домодедово. Население — порядка 20 тысяч человек, я ехал ночью, уехал рано утром, поэтому мало что разглядел, но первое впечатление хорошее — много деревьев, мало домов.

Кстати, забавно — водитель такси, который вёз меня оттуда спросил «в аэропорт куда?». Авиагородок-то для лётчиков и прочего персонала (хотя сейчас сменилось поколение и кого там только нет), для них аэропорт — большая территория. Но это для них. Водитель, верно истолковав мой утренний скрип мозгов, спросил — «вокзал?», я кивнул.

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

ЭЦП

На конференции «Осенний документооброт-2011», где я сейчас, затронули интересный вопрос.

ЭЦП (электронная цифровая подпись) сейчас, фактически, используется не для того, для чего была придумана. Её назначение — кратковременное подтверждение подлинности переданного документа. К примеру, я получил письмо и мне нужно убедиться, что оно действительно пришло именно от того адресата, которые указан в поле отправителя. Стандартный протокол обмена письмами мне этой уверенности не даёт. А ЭЦП — пожалуйста.

Я открываю письмо, по подлинности ЭЦП убеждаюсь, что всё в порядке, дальше ЭЦП мне не нужна.

В электронных документооборотах не так. Там ЭЦП используется для подтверждения подлинности документа в долгосрочном периоде — годы, десятки лет, в перспективе, возможно, сотни (если речь идёт о долгосрочных договорах между государствами, например).

Чтобы не было возможности подделать документ, изменить его содержимое, применяется ЭЦП. Как правило, доступ к хранилищу, где он размещается, имеют сотни людей, причём многие из них — на запись. С течением времени, количество людей, имевших теоритическую возможность подмены документа, увеличивается — кого-то принимают на работу, кто-то получает временный доступ для каких-то задач. Поэтому применение ЭЦП необходимо.

Но. Надёжность ЭЦП, фактически, основана на сложности математических задач, заложенных в алгоритм электронной цифровой подписи. Эти задачи выбраны таким образом, чтобы подделка подписи требовала огромных вычислительных ресурсов. Последнее с успехом может быть заменено использованием более скромных ресурсов какого-то значительного количества времени.

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

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

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

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

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

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

Sublime Text 2 (совет)

Поставил по совету коллег с прежней работы себе текстовый редактор «Sublime Text 2», всё хорошо, одна проблема — файлы с кодировкой CP1251 он открывает неправильно, приходится переоткрывать через «File → Reopen with Encoding → Cyrillic (Windows 1251)».

Покопался по настройкам, нашёл выход. Нужно зайти в настройки (на «Маке», как обычно — ⌘+,) и добавить между фигурными скобками вот такую настройку: «»fallback_encoding«: „Cyrillic (Windows 1251)“». Мой файл настроек сейчас почти пустой и выглядит вот так:

// Settings in here override those in "Default/Base File.sublime-settings", and
// are overridden in turn by file type specific settings. Place your settings
// here, to ensure they're preserved when upgrading.
{
    "fallback_encoding": "Cyrillic (Windows 1251)"
}

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

Тач-интерфейс

Я тут задумался над русским аналогом к «тач-интерфейсу». «Сенсорный» не подходит, так как под «тач-интерфейсом» подразумевается интерфейс управления пальцем. Может, «пальцевый интерфейс»? Как вам?

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

Записались с женой в спортзал

Спортзал (39.34КиБ)

Ура! Записались с женой в спортзал на 15 месяцев (абонемент на год + три месяца в подарок). Спасибо жене — нашла и выбрала программу для нас, будем ходить. Записались в «Икс-фит», он в Казани находится в  Дворце единоборств «Ак барс», совсем недалеко от дома. Когда нас водили по залу, проводили экскурсию, мы попали в кадр одной из веб-камер спортивных объектов «Универсиады» (Дворец единоборств — один из таких объектов).

Если промотать до 15 октября, примерно до 18:50, можно нас там увидеть на нескольких кадрах — слева инстуктор, потом я, в центре жена, а дальше ещё одна пара, которой тоже показывали залы.

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

Расширение для «Альфреда» для перевода текста

Решил перейти на «Альфред» — замену «Спотлайта» на «Маке». Мне его Вадим Макеев мельком показал на конференции в Самаре.

Главная причина — под «Альфред» легко писать расширения. Писать их можно на обычном Баше, Экшнскрипте или в Автоматоре.

Для этого я купил «Паверпак» (£12), который позволяет ставить и использовать расширения (сам «Альфред» бесплатный) и «Граул» ($1,99), позволяющий создавать собственные всплывающие нотификации в системе.

Скачать расширение можно по следующей ссылке: /files/en-ru.alfredextension, пользоваться довольно просто: набираем «tr» и слово или слова для перевода. Перевод возможен с русского на английский и обратно, направление выбирается автоматически.

en-ru (22.76КиБ)

Перевод делается через сервис «Яндекса». Результат показывается через «Граул».

Поставить расширение проще простого — в закладке «Extensions» есть поле, где написано «Drop to install», туда надо перетащить скачанное расширение и всё, дело сделано.

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

Ещё раз про 28:00

Как-то я написал короткую заметку «28:00», про то, что время в диапазонах не надо сбрасывать на ноль после 23:59. Более логично писать «08:30 — 24:10», чем «08:30 — 00:10». Оказывается, в России есть люди, которые так уже делают.

Например, на сайте «Мосгортранса» висит расписание автобусов (Дофин, спасибо за ссылку!), где, в частности, написано, что автобус №115 отправляется «от  к/ст. “Марьино” к 1-му микрорайону Братеева в 24 час. 08 мин».

А вот этот снимок я сделал, когда прилетел в Казань пару месяцев назад, это расписание справочной авиакомпании «Татарстан» в казанском аэропорту:

24:00 (41.43КиБ)

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

CSS hack for FireFox 6

Меня тут попросили сделать CSS-хак для шестого Файрфокса. Пожалуйста:

x::-moz-progress-bar, body {
    background: orange; /* FF 6.0+ */
}

@-moz-document regexp(".*") {
    body {
        background: orange; /* FF 6.0+ */
    }
}

Проверено на Firefox 6.0 и 7.0.1.

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

TOEFL

Сегодня прошёл письменный тест TOEFL («Paper-based TOEFL Test»), набрал 463 балла, что соотвествует примерно 50 баллам TOEFL IBT. Это немного, но я почти не сталкиваюсь с бытовым английским в жизни (только с техническим), для меня это неплохо. Тест был упрощённый — без «speaking», а то, мне думается, результаты были сильно хуже.

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

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

Оптимизиция шрифтов с «Гугл фонт АПИ»

Благодаря Мицголу невозбранно узнал о существовании у «Гугл фонт АПИ» параметра «text», где можно перечислить буквы, которые вы будете использовать в шрифте. Это сильно сокращает размер скачиваемого шрифта. Напоминаю, «Гугл фонт АПИ» — это специальное АПИ для браузеров, позволяющее использовать свободные шрифты из коллекции Гугла. Шрифты подготавливаются автоматически, в зависимости от того, что поддерживает браузер:

bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O - --user-agent='Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' http://fonts.googleapis.com/css?family=Rock+Salt 2>&-
@font-face {
  font-family: 'Rock Salt';
  font-style: normal;
  font-weight: normal;
  src: url('http://themes.googleusercontent.com/static/fonts/rocksalt/v1/Q94aHXFHGip10K5uxi1jOPY6323mHUZFJMgTvxaG2iE.eot');
  src: local('Rock Salt'), local('RockSalt'), url('http://themes.googleusercontent.com/static/fonts/rocksalt/v1/Q94aHXFHGip10K5uxi1jOD8E0i7KZn-EPnyo3HZu7kw.woff') format('woff');
}

bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O - --user-agent='Opera/9.00 (Windows NT 5.1; U; en)' http://fonts.googleapis.com/css?family=Rock+Salt 2>&-
@font-face {
  font-family: 'Rock Salt';
  font-style: normal;
  font-weight: normal;
  src: local('Rock Salt'), local('RockSalt'), url('http://themes.googleusercontent.com/static/fonts/rocksalt/v1/Q94aHXFHGip10K5uxi1jOKCWcynf_cDxXwCLxiixG1c.ttf') format('truetype');
}

bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O - --user-agent='Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0' http://fonts.googleapis.com/css?family=Rock+Salt 2>&-
@font-face {
  font-family: 'Rock Salt';
  font-style: normal;
  font-weight: normal;
  src: local('Rock Salt'), local('RockSalt'), url('http://themes.googleusercontent.com/static/fonts/rocksalt/v1/Q94aHXFHGip10K5uxi1jOD8E0i7KZn-EPnyo3HZu7kw.woff') format('woff');
}

Для примера. Пусть у меня выбранный шрифт используется в двух фразах: «NEWS» и «ABOUT US», тогда строка запроса для этих двух заголовков будет выглядеть следующим образом (повторяющиеся буквы опущены, «%20» — это пробел):

http://fonts.googleapis.com/css?family=Rock+Salt&text=%20NEWSABOUT

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

bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O- `wget -O- 'http://fonts.googleapis.com/css?family=Rock+Salt' 2>&- | awk -F' '/http/{print $6}'` 2>&- | wc -c
  125136
bolk@Bolk ~/Projects/Ttt/exp (master) $ wget -O- `wget -O- 'http://fonts.googleapis.com/css?family=Rock+Salt&text=%20NEWSABOUT' 2>&- | awk -F' '/http/{print $6}'` 2>&- | wc -c
    6801

Как видно, размер файла сократился более чем в 18 раз!

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

Санскрит

Спасибо Илье Бирману за ссылку на потрясающую лекцию академика Андрея Анатольевича Зализняка про санскрит «О языке древней Индии». Я, кстати, пребывал в заблуждении, что санскрит — прадедушка большинства европейских языков, тех что называют индоевропейскими. Оказывается, нет:

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

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

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

Вот почему в литовском (который очень близок к санскриту) часто слышно окончание «-ас», этот очень консервативный язык мало изменился:

Так вот, литовский занял бы первое место среди живых языков по сохранности древнего числа слогов. Он сохранил окончание именительного падежа -ас. Ростов будет по-литовски Ростовас. Почему? Потому что это -ас так же необходимо в современном литовском, как и три тысячи лет назад в санскрите.

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

Теория относительности

Сейчас много разговоров о том, что в одном из экспериментов скорость нейтирино оказалась выше скорости света. Якобы, это ставит под сомнение теорию относительности Эйнштейна.

Чтобы вспомнить что такое теория относительности, рекомендую научно-популярный фильм 1964 года, снятый режисёром Семёном Райтбуртом. В одной из ролей, кстати, снимается ныне покойный Георгий Вицин. А в роли физика снялась Алла Демидова, я её и не узнал.

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

Поддержка MJPEG в «Опере»

Как я уже писал, «Опера» иначе показывает MJPEG, не как остальные браузеры. Если открыть какую-нибудь веб-камеру, использующую этот формат, в десятой версии, то «Опера» сначала задумается, потом покажет какой-то кадр, 11 и 12 версии показывают ещё хуже — подобие потоковой передачи уже есть, но кадры лепятся один на другой и ничего разглядеть невозможно.

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

Вдохновившись библиотекой добавляющей нативную поддержку APNG в браузер, я подумал, что я ничем не хуже и смогу добавить поддержку MJPEG в «Оперу». Получился небольшой userjs, который я, естественно, выложил на «Гитхаб».

Идея такая — находим картинку во всех тегах IMG, у которой расширение «mjpg». Через XHR получаем с сервера видеопоток, копим кадр, подменяем найденную картинку и так далее.

Работает начиная с 12 версии браузера, которая ещё не вышла (кстати, в позавчерашней сборке сломали userjs напрочь) — в предыдущих версиях XHR слабоват по возможностям для этого.

Больше всего я бился с декодированием бинарных данных. Последняя версия «Оперы» поддерживает тип ответа arraybuffer (а вот blob не поддерживается), но если его выбрать, то данные в цикле почему-то перестают накапливаться, вероятно какой-то баг браузера. Я долго мучался, прежде чем придумал следующий хак — если сделать overrideMimeType(’image/jpeg’), то данные приходят в двухбайтовой кодировке UCS-2, которую несложно декодировать.

Кстати, быстрее всего у меня получилось декодировать не циклом, а регулярными выражениями, дальше тормозит уже не мой код, а способ получения отдельного кадра — каждый раз я соединяюсь с сервером заново. Можно бы накапливать кадры пачкой и потом их сбрасывать, но у меня нет задачи смотреть трансляции футбола, у меня дом, который не бегает и полученной скорости мне вполне хватает (где-то 2-3 кадра в секунду).

В общем, получился довольно небольшой код — 94 строки.

Посмотреть код.

// ==UserScript==
// @name        MJPEG+Opera - Add to Opera MJPEG support
// @author      Evgeny Stepanischev aka Bolk
// @version     1.00
// @namespace   /files/opera-mjpeg.js
// @modified    2011-10-09
// @include     *
// ==/UserScript==

opera.addEventListener('BeforeEvent.DOMContentLoaded', function() {
    if (opera.version() < 12) return;

    var BolkMJpeg = function (url, img) {
        var req = new XMLHttpRequest(); 
        img.src = 'about:blank'; // Сброс картинки, чтобы прекратить передачу

        // Асинхронно забираем кадр при помощи XHR, нам придёт видеопоток
        var start = function (url) {
            req.open("GET", url, true);
             // Свежепридуманный хитрый хак, позволяет получить данные в UCS-2
            req.overrideMimeType('image/jpeg');
            req.send(null);
        }

        // Хитрыми путями восстанавливаем порядок байт в reponse, там сейчас UCS-2,
        // получаем просто последовательность байт
        var reqbytes = function (n, l) {
            return escape(req.response.substr(n, l)).
                replace(/([^%]|%[^u].|%u....)/g, '<$1>').
                replace(/<%u(..)(..)>/g, '%$2%$1').
                replace(/<%(..)>/g, '%$1%00').
                replace(/<(.)>/g, '$1%00');
        }

        // заменяем картинку на бинарные данные
        var draw = function (bin) {
            img.src = 'data:image/jpeg,' + bin;
        }

        // На изменение состояние входных данных собираем по частям JPEG
        req.onreadystatechange = function () {
            // состояние «3» — данные пошли, но ещё не кончились
            if (req.readyState === 3) {
                var hnd = setInterval(function () {
                    // по заголовку получаем размер данных
                    var header = unescape(reqbytes(0, 300)).toLowerCase();

                    var idx = header.indexOf('content-length:');

                    if (idx > -1) {
                        // 15 — длина заголовка
                        var len = parseInt(header.substr(idx + 15), 10);
                        var headend = header.indexOf("\r\n\r\n");

                        // дожидаемся конца заголовка
                        if (headend > -1) {
                            var resp = reqbytes(0, len);
                            // умножаем всё на три, так как reqbytes даёт esc-последовательность
                            // вида %XX%XX…
                            len *= 3;
                            headend = (headend + 4) * 3;

                            // если собрали весь JPEG, обрываем соединение
                            // и начинаем новый цикл. Мы могли бы собирать кадры и дальше, но
                            // это съест всю память со временем
                            if (resp.length >= len + headend) {
                                req.abort();
                                resp = resp.substr(headend, len);

                                draw(resp);
                                clearInterval(hnd);

                                start(url);
                            }
                        }
                    }
                }, 100);
            }
        }

        start(url);
    };

    // ищем картинку, у которой расширение mjpg
    var imgs = document.getElementsByTagName('IMG');
    for (var i = 0, len = imgs.length; i<len; i++) {
        if (/\.mjpg$/.test(imgs[i].src)) {
            BolkMJpeg(imgs[i].src, imgs[i]);
            break;
        }
    }
}, true);

Если вы не в курсе как устанавливаются скрипты userjs, то это очень просто. В интернете есть много инструкций на эту тему. Только напоминаю, что «Опера» нужна двенадцатая, причём в сборке за седьмое октября userjs сломаны.

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

Невероятно плохо

Невероятно! (59.37КиБ)

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

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

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

MJPEG, MPNG, MGIF, MSVG

Я вчера показывал вам «телевизор» про фестиваль в Самаре. Сделано очень просто — уменьшил все сделанные там снимки до 66×44 и сконвертировал их в анимированный ГИФ. Мелковато, конечно, но что делать — ГИФ не очень-то предназначен для фотографических изображений и размер анимации сильно растёт с увеличением размера кадра. Для фотографий в интернете принято использовать формат JPEG.

У JPEG есть свой формат анимации, если так можно выразиться, а точнее — скорее простенький формат видео, так как формат анимации, в моём представлении, помимо кадров должен содержать себе какую-то метаинформацию о кадре, например, задержку перед появлением следующего кадра. Этот формат — разновидность MJPEG (motion JPEG).

Мне давно хотелось посмотреть что у этого формата внутри, сегодня наконец посмотрел. Всё оказалось крайне просто.

В данном случае, MJPEG — формат стримминга (потоковой подачи) видео. Собственно, это даже не формат, а простое соединение JPEG и специального заголовка «multipart/x-mixed-replace», которым может применяться для стриминга чего угодно. Можно, например, подавать не JPEG, а PNG и «изобрести» формат видео MPNG, а то и M(JPEG+PNG+GIF), картинки разных форматов можно перемешивать в любых пропорциях.

Смысл этого заголовка — содержимое которое пришло раньше заменяется тем, что пришло позже. То есть MJPEG — это просто последовательность картинок, у которых этим заголовком указано — когда приходит следующая картинка, ею надо заменить предыдущую. Внутри выглядит это вот таким образом.

Content-type:  multipart/x-mixed-replace;boundary=СТРОКАРАЗДЕЛИТЕЛЬ

--СТРОКАРАЗДЕЛИТЕЛЬ
Content-type: image/jpeg
Content-length: 232311

…бинарное содержимое первой картинки…

--СТРОКАРАЗДЕЛИТЕЛЬ
Content-type: image/jpeg
Content-length: 47474

…бинарное содержимое второй картинки…

СТРОКУРАЗДЕЛИТЕЛЬ надо выбирать так, чтобы она не встретилась в бинарных данных изображения.

Браузерам этот заголовок достался от фирмы Нетскейп, которая когда-то (ещё в версии 1.1) добавила её поддержку в свой браузер. «Микрософт», будучи конкурентом «Нетскейпа», поддержку заголовка в браузер не внедрила. Остальные браузеры заголовок понимают, но каждый немного по-разному.

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

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

Самое приятное в этом формате — что все современные браузеры считают его картинкой, то есть тег IMG его преспокойно показывает.

Любопытно, что браузеры позволяют сжимать содержимое всего файла и даже каждого кадра отдельно, то есть можно в заголовке кадра поставить «Content-encoding: gzip» и сжать кадр гзипом. Это полезно, если захочется сделать MSVG, например. Ведь SVG-изображения хорошо сжимаются.

Так что, если вы задумались сделать аналог какого-нибудь хостинга анимированных ГИФ и вам наплевать на «Эксплорер» (я посмотрел, девятая версия не поддерживает), сделайте ещё и поддержку MJPEG/MPNG.

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

Фестиваль «404» в Самаре

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

Меня тут все спрашивают, как прошёл фестиваль «404» в Самаре. Отлично прошёл, друзья мои! Но у меня совершенно не было времени хотя бы удалить дубли фотографий и выложить оставшееся. Поэтому предлагаю взглянуть на фестиваль в маленькое (66×44) окошко моего импровизированного телевизора. Скорее всего читателям трансляций (в ЖЖ, «Ярушке» и так далее) не будет видно самого телевизора, только картинку, так что заходите на сайт.

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

Гоу версия 1

Язык программирования «Гугл Гоу» наконец-то стабилизируется:

We propose to issue a Go release early next year that will be called “Go version 1”, Go 1 for short, that will be the first Go release to be stable in this way. Code that compiles in Go version 1 should, with few exceptions, continue to compile throughout the lifetime of that version, as we issue updates and bug fixes such as Go version 1.1, 1.2, and so on… Go version 1 will be a stable language with stable libraries. Other than critical fixes, changes made to the library and packages for versions 1.1, 1.2 and so on may add functionality but will not break existing Go version 1 programs.

Наконец-то. Это означает, что устранят один из существенных недостатков «Гоу» — постоянные изменения в языке и стандартных библиотеках.

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