-25°С

Минус 25 градусов на улице, и это после недавней плюсовой температуры. С первым днём зимы! Пойду на работу.

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

Аппаратное ускорение PHP

Обсуждается возможность аппаратного ускорения PHP, точнее использования в коде возможностей GPU, в данный момент речь идёт о библиотеке CUDA фирмы NVIDIA.

Первое что приходит в голову — это ускорение сортировок чисел и вычисление md5/sha1. Я слишком слабо разбираюсь в вопросе, чтобы понять с первого взгляда куда ещё можно приспособить графические ускорители.

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

PCRE 8.10

Заодно, после перевода проекта на UTF-8, стали появляться первые проблемы с новой библиотекой PCRE. Как я писал, для того, чтобы в PCRE некоторые комбинации работали как положено, мне перешлось перейти на версию 8.10.

Для этого я собрал специальный модуль YGX, это тот же extension PCRE, только с новой версией библиотеки (кстати, модуля пришлось делать два — для PHP 5.2.xx и 5.3.xx отдельно).

Теперь, когда у меня в PHP два вида функций — preg_* (старая PCRE) и ygx_* (новая PCRE 8.10), можно сравнивать поведение обоих. Вот первый небольшой тест:

bolk-dev ~/wiki $ php -r 'var_dump(ygx_replace("/a?/u", "", "abc"));'
string(2) "bc"
bolk-dev ~/wiki $ php -r 'var_dump(preg_replace("/т?/u", "", "тест"));'
string(4) "ес"
bolk-dev ~/wiki $ php -r 'var_dump(ygx_replace("/т?/u", "", "тест"));'
NULL

Как видно, PCRE 8.10 в последнем случае выдаёт NULL. Такое поведение похоже на баг. Выражение, конечно, довольно бессмысленное, но на практике оно встретилось в составе более сложного.

Чтобы в этом случае не получался NULL (хотя правильного результата всё равно не будет), можно поставить «глагол» «(*FAIL)» (это специальное значение, который ни с чем не совпадает):

bolk-dev ~/wiki $ php -r 'var_dump(ygx_replace("/(*FAIL)т?/u", "", "тест"));'
string(8) "тест"

Стоит ввести в выражение хоть что-то, что не содержит квантификатора «ноль или…» и NULL исчезает.

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

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

MySQL и строки

Век живи, век учись.

Не знал, что в MySQL есть своеобразный typecast для строк — можно объявить любой collate для строки вот таким простым синтаксисом (я всега пользовался «’строка’ COLLATE latin1_danish_ci» и ему подобным):

SELECT n'текст' -- эквивалентно следующей строке
SELECT _utf8'текст'

SELECT _binary'aaa' = _binary'AAA' -- эти строки не равны (бинарное сравнение)

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

Google Translate Rap

Увидел у «Кулера».

Набираем в в «Гугл.Переводчике» «pv zk bschk pv zk pv bschk zk pv zk bschk pv zk pv bschk zk bschk pv bschk bschk pv kkkkkkkkkk bschk», выбираем перевод с английского на немецкий и слушаем.

Нужен Flash.

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

Пропавшая неделя

У меня неделя пропала, по ощущениям. Я помню выходные, потом — часть вторника, потом, бах!, вечер пятницы и завтра снова выходные. Нипоняяяятна.

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

«Здоровое» питание

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

Из ЖЖ «На смерть любителя здорового питания». Удивительно, ведь никто не обещает, что здоровое питание что-то гарантирует. Это ведь просто повышает шансы, иногда существенно.

Но самый странное что именно этот дядя почитал за здоровое питание:

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

Целиком заметку постить не буду, сходите почитайте, она небольшая.

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

Почему яд ядовит?

Все знают, что яды ядовиты, а что конкретно происходит, когда в организм попадает яд? Понятно, что механизмы тут могут быть очень разные, но хоть один пример?

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

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

Если подменить в клетке фосфаты на арсенаты, то процессы брожения — поэтапное фосфорилирование глюкозы — всё равно продолжаются с нормальной скоростью.

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

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

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

Впечатления от Саймака

Вчера за обедом в «Яндексе» мы разговаривали о литературе, в основном, о фантастике и Филатове. За разговором о фантастике вспомнили Саймака, а я как-то давненько не брал в руки Саймака, решил что-нибудь прочитать. Из самого последнего нашёл «Магистраль вечности».

Мне не нравится.

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

Ну не разговаривают так люди (не цитата): «здравствуй, Джон, ты ведь водитель звездолёта на планете „Тауин“, на которой произошла памятная революция, где был убит оружейник Просперо, сделавший куклу вуду, для нашего правителя Горби, которая была использована для покушения на гиноида, который правил планетой до этого? Это ведь с тобой произошла та история…».

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

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

По этому

По этому (15.63КиБ)

Это консоль ошибок в Thunderbird (плагин календарь).

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

Придумал название для какой-нибудь новой Wiki

Если я когда-нибудь задумаю писать свою систему Wiki, то у меня есть уже для неё красивое название — WikiNG (Wiki New Generation).

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

WebSocket отключают в браузерах

В WebSocket (протоколе) нашли дыру, в этой связи «Опера» 11 и FF 4 отключат у себя реализацию этого протокола до решения проблем безопасности.

Добавлено: подробный обзор проблемы есть на «Хабре»

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

Посмотрел на часы с дисплеем на электронных чернилах

Часы с e-ink (14.53КиБ)

Посмотрел на часы, о которых писал два месяца назад. Отличная вещь, качественно сделана, очень и очень стильные, хорошо сидят, но очень тяжёлые.

Снимок так себе, в жизни смотрятся замечательно.

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

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

Сериал «Герои»

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

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

Сменил дизайн сайта

Одиннадцатого ноября 2000 года я запустил свой сайт на бесплатном хостинге chat.ru, дизайн его не сохранился, но это к лучшему. В то время я занимался довольно прогрессивным движком чата (обновление без перезагрузки, оптимизация под узкий канал тогдашних dial-up), который стал использовать у себя на сайте Алекс Экслер.

Он предложил мне хостить сайт у себя. Под сайт потребовался более приличный дизайн и мне его сделала дизайнер Наталия Морозова. Сейчас тот дизайн не выглядит дизайном, но тогда большинство сайтов выглядело похоже.

Второй дизайн моего сайта (20.26КиБ)

Читать эту историю полностью
В этом виде сайт просуществовал до октября 2003 года. В феврале того же года у меня появился блог на движке «Регистр», который мы писали втроём — Дима Смирнов, я и Кукуц. Его дизайн неоднократно менялся, один из первых вариантов перед вами.

Один из первых дизайнов моего блога (26.74КиБ)

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

Дизайн до недавнего времени (56.83КиБ)

Месяц назад моему сайту исполнилось 10 лет. Я планировал к этому времени выложить новый дизайн сайта (и кое-что поменять в юзабилити), а так же сконвертировать материалы старой версии. К сроку я ничего не успел — был целиком и полностью занят проектом перевода Вики в «Яндексе» на UTF-8. Какое-то время назад я этот проект закончил и каждый день посвящал по 15—30 минут в день на переделку сайта.

Теперь всё готово.

Старые материалы я пока не сконвертировал, но буду работать над этим в будущем.

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

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

Что смотреть из сериалов?

Мы с женой посмотрели (то, что серии выходят до сих пор, не считается, темпы не те):

— Интерны — Школа — Шерлок — Обмани меня — Теория большого взрыва — часть Декстера (не пошло́ как-то) — Доктор Хаус — Сообщество — Как я встретил вашу маму

Начали смотреть «Героев», но говорят, что их нам надолго не хватит — вроде как качество потом резко падает.

Что смотреть-то?

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

Барышня, соедините

У МГТС, оказывается, есть замечательная услуга — «Барышня, соедините». Звонишь в 009, говоришь, что хочешь воспользоваться услугой, называешь ФИО и адрес абонента, тебя соединяют.

Профит в том, что номер телефона знать не нужно, тем более, что МГТС часто его даже не может предоставить:

В соответствии с Федеральным законом № 126 от 1 января 2004 года справочные службы могут предоставлять информацию о номере телефона абонента-гражданина только с его письменного согласия. А многие ли жители Москвы и ближайшего Подмосковья воспользовались своим правом написать такое заявление? Конечно, нет.

Правда, стационарных телефонов становится всё меньше, что правильно: мы звоним человеку, а не квартире.

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

Странные посещения сайта

После смены дизайна происходит что-то странное — за прошедшие (уже) сутки было 354 тысячи запросов к страницам сайта (не статитика) с двух IP. Это четыре запроса в секунду. Сейчас скорость резко выросла — за прошедшие 23 минуты я вижу уже 11 тысяч, это уже почти восемь запросов.

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

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

Таймшер территории у хищников

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

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

 — Конрад Лоренц, «Агрессия».

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

Но вот что бывают хищники, которые оставляют временны́е метки, я не знал.

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

Невидимая страница

Как-то, много лет назад, партнёр по бизнесу показал исходник первой страницы сайта студии Лебедева. Он был очень озадачен остроумной шуткой — исходник представлял из себя одну строку HTML-комментария и, на первый взгляд, больше ничего. Я быстро догадался, что надо было всего лишь прокрутить текст вниз — за переводами строки прятался остальной код.

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

Кода у этой страницы просто нет. Ларчик открывается (в «Опере» и FF) просто: есть такой RFC 5988, озаглавленный «Web Linking», где описан способ подключать в документ различные ресурсы прямо через HTTP-заголовок.

Идея проста: подключаем через заголовок CSS для пустой страницы и внутри CSS уже формируем то, что нужно (текст можно писать через свойство «content»). HTTP-заголовок может выглядеть, например, так:

Link: </pathto/magic.css>;rel=stylesheet

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

HTTP-заголовок Default-Style

Если бы я сейчас на ночь глядя не решил почитать по диагонали спецификацию тега LINK, то так, наверное, никогда в жизни бы и не узнал о существовании мета-тега «Default-Style», между тем, этот трюк описан ещё в HTML 4.01.

Если у вас подключены несколько таблиц стилей к одному документу, вы можете дать им имя, прописав его в атрибуте «title», и выбрать его через мета-тег или HTTP-заголовок. Например:

<head>
<style type="text/css" title="right">
body {
  background: blue;
}
</style>

<style type="text/css" title="wrong">
body {
  background: red;
}
</style>

<meta http-equiv="Default-Style" content="right" />
</head>

Работать должен только стиль с именем «right» (можно дать и русские имена). Слово должен я выделил, потому что это стандарт. Жизнь, как всегда, богаче.

Я проверил на браузерах, которые у меня есть, в «Опере» 11 RC3 и Internet Explorer 9 beta это не работает, работает в Firefox 3.6.12, Safari 5 и Chrome 9.0.597.19, можете проверить свой браузер, фон должен быть синим.

Можно из этого сделать своеобразный CSS-хак.

Добавлено: во встроенном браузере на моём «Нексусе» работает («Андроид» 2.2.1), в Firefox 2.0 и Chrome 5.0.375.125 — тоже.

Добавлено ещё позже: в комментарях меня поправляет Денис Попов: по стандарту если заданы несколько тегов LINK, задающих стили с title, то выбирается первый («Опера» и «IE» нарушают стандарт уже в этом месте, я проверил), если не задан специальный META-тег, о котором я рассказывал.

Прочитайте комментарий, там есть немаловажные подробности.

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

На заметку: не покупать воду «Триумфальные воды»

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

Учёный гороховый, Виктор Петрик уже высказал своё мнение, изобилующее приставками «нано».

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

Суши и роллы

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

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

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

Как была расшифрована письменность индейцев майя

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

На «Грамоте.ру» статья «Сказка о русском лингвисте Кнорозове, расшифровавшем письменность индейцев майя» из журнала «Наука и Жизнь» № 12, 2010.

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

Сегодня в Москве беспорядки

Ребята из Москвы, осторожнее на улицах. Якобы массовые драки на Парке Культуры, Киевской, Белорусской, Кутузовской, Митине, Аэропорту, Смоленской, Арбатской, Лубянке, Студенческой, Новокузнецкой.

Добавлено: что-то меня уже начинают одолевать сомнения, кажется, это просто массовая истерия. Сходил до Парка Культуры, был там в 19:00, ничего, спокойные люди, стоит одна (!) милицейская легковая, это всё. Она там, кстати, часто стоит.

Тихо (17.16КиБ)

Добавлено ещё позже: драка на Парке Культуры не подтверждается, пишут РиаНовости.

И ещё позже: люди реально истерят. В Твиттере написали, что на Парке Культуры прогремел взрыв. Мы с ребятами не поленились, сходили ещё раз и спросили у милиции. Единственные два милиционера, которых мы нашли внутри метро, спокойно и расслаблено ответили нам, что это всё бред и всё тихо.

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

Как я читаю книги

Меня время от времени спрашивают, как я успеваю так много читать, есть ли у меня методика, всё ли я запоминаю и так далее. Решил ответить одним постом.

Для начала, я совсем не считаю, что читаю много. Помилуйте, разве 70 книг в год — много? Это 5—6 книг в месяц. В детстве, когда у меня было больше свободного времени, в некоторые дни я читал по две книги среднего объёма. Вот это было много. Сейчас я читаю примерно по два часа в день, преимущественно, в метро, иногда — перед сном.

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

Вся литература для меня чётко делится на два класса: развлекательный и познавательный.

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

Через какое-то время я не помню о чём книга, ещё дальше — не помню автора, название и понравилась ли мне она.

Познавательную литературу я читаю внимательно. Сейчас я читаю книгу «Агрессия» Конрада Лоренца, это научная книга о внутривидовой агрессии. Я прочитал 1/5 книги и сделал уже пять закладок. Я читаю электронные книги, там это просто. После прочтения книги, я просматриваю закладки, разбираюсь что меня зацепило, иногда, редко, пишу небольшие посты по ним в блог.

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

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

UTF-8: как быстрее измерить длину строки в PHP

Я потихоньку буду писать как получается оптимизировать самые важные функции работы с UTF-8 в PHP. Оформлять буду как продолжение своей эпопеи перевода наше внутренней «Вики» на UTF-8 (в ближайшее время добавлю оглавление).

Сейчас, после перевода «Вики» мы столкнулись с тем, что некоторые операции занимают непозволительно много времени. Кое-какие проблемы решаются моими итераторами для строки (прямым и обратным), но и другие оптимизации приходится делать.

Простые оптимизации я уже применил: выкинул из класса UTF-8 проверки на self::ON (по этой константе я определял включена ли в проекте поддержка UTF-8, сейчас в ней необходимости уже нет) и сделал другие микрооптимизации, теперь пора посмотреть на методы моего класса UTF.

Одна из самых частоиспользуемых функций — strlen, которая определяет длину строки. Я всегда считал, что самый быстрый способ подсчитать длину UTF-строки в PHP, это вызывать strlen(utf8_decode(…)).

Мои тесты показывают что это не так. Самый быстрый способ (по крайней мере в PHP 5.3.2) — это mb_strlen, strlen/utf8_decode — на втором месте, потом идёт sizeof+preg_split, а самый медленный — iconv_strlen.

Для интереса я вкомпилил в PHP функцию для быстрого подсчёта длины строки в UTF-8, найденную в интернете, выигрыш по сравнению с mb_strlen незначителен:

bolk-dev ~/uni/ $ php ../test/test_strlen.php | sort -k2 -t:
Fast UTF-8: 0.68232107162476
mb_strlen: 0.88710689544678
strlen/utf8_decode: 1.5211808681488

Это тысяча итераций на файле в 400КБ.

Я оставил функцию mb_strlen.

Добавлено позднее: другая быстрая функция дала ещё худший результат: 0,79, против прежнего варианта в 0,68.

Добавлено ещё позже: а вот третья функция показала действительно впечатляющие результаты:

bolk-dev ~/uni/ $ php ../test/test_strlen.php | sort -k2 -t:
More Fast UTF-8:  0.12948799133301
mb_strlen: 0.88710689544678
strlen/utf8_decode: 1.5211808681488

Это уже дело — она почти в 7 раз быстрее лучшего результата PHP.

Вкратце, алгоритм такой: строка циклом выравнивается по границе четырёх (на 64-битных системах — 8) байт, далее читается сразу по четыре (или восемь) байт и внутри каждого кусочка одним выражением считается сколько там байт, с которых начинается символ. Поэтому на моей 64-битной системе семикратный выигрыш (на 32 битах будет примерно в три раза).

Добавлено через несколько дней: есть и ещё более быстрая функция.

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

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

Новый год мы проводим в Казани. Вылетаем из Москвы 31-го, прилетаем назад 10-го.

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

Судьба PHP6

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

На примере своего опыта разработки и перевода проектов на PHP на UTF-8, скажу это не так. В Пайтоне, где таких проблем нет, работать гораздо проще и приятнее.

То, что в PHP приходится для поддержки Юникода работать с UTF-8, а не с UTF-32 сильно снижает производительность всех строковых операций. И добро бы, если бы для всех функций были юникодные аналоги, так это ведь не так.

Работать в PHP с UTF-32 нельзя, если вы собираетесь использовать регулярные выражения: библиотека PCRE, предназначенная для работы с регулярными выражениями, понимает только две кодировки: latin-1 (по всей видимости) и UTF-8. Кроме того, функции, использующие локаль или ICU так же работают только с UTF-8.

Если бы этот язык нативно поддерживал UTF-32… Мечты-мечты.

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

Ближе к народу

Ближе к народу (45.87КиБ)

Сфотографировал в казанском супермаркете «Перекрёсток».

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

Карта тела от «Гугла»

Bodymap (25.09КиБ)

Сегодня уже все написали о сервисе «Google body browser». Работает только в браузерах, поддерживающих WebGL (на данный момент — FireFox 4.0b7 и свежие версии «Хрома»).

Я наверное час утром изучал внутреннее устройство человека (там можно включить названия органов и регулировать «прозрачность»). Вот вы знаете где у вас в точности находится желудок, поджелудочная, селезёнка?

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

«Это не власть, если не от Бога»

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

Обсуждаемая фраза там приведена неточно (без диакритических знаков), так что я передам только общий смысл, а не цитату. Смысл в том, что фраза греческой Библии «οὐ γὰρ ἔστιν ἐξουσία εἰ μὴ ὑπὸ θεοῦ», которая в синоидальном переводе Библии стала «нет власти не от Бога» на деле переводится как «не власть, если не от Бога», с тем смыслом, что не одобренная Богом власть не легитимна.

Я походил по словарям, на мой взгляд, подтверждается:

οὐ (not, no) — http://en.wiktionary.org/wiki/οὐ
γάρ (and, as, because, for) — http://concordance.biblos.com/gar.htm
ἔστιν (there is) — http://biblos.com/romans/3-11.htm
ἐξουσία (power) — http://en.wiktionary.org/wiki/ἐξουσία
εἰ (if) — http://en.wiktionary.org/wiki/εἰ
μὴ (no) — http://biblos.com/luke/10-4.htm
ὑπὸ (under) — http://biblos.com/romans/6-14.htm
θεοῦ (of God) — http://biblos.com/1_corinthians/3-9.htm

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

Посмотрел на новые телефоны Just5

Взял потестировать два телефона фирмы Just5 — модели CP11 и CP10 с цветными кнопками. Напомню, что Just5 выпускает телефоны в нише «для пожилых», ниша новая, поэтому мне интересно.

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

Но самое интересное, что мне показали две инженерные модели — угловатый телефон, похожий на CP11, где у каждой кнопки свой цвет и совсем новый телефон с металлическим задником, цветным экраном, Bluetooth и камерой. Последняя модель мне показалась очень странной, ведь по идее, ниша таких телефонов — очень простые устройства, а тут явный уход не в ту совершенно сторону.

К сожалению, сфотографировать их было нельзя.

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

Музей Булгакова в доме 302 бис

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

Интерьер с красными шторами, старинной металлической скамьей, большим зеркалом в золотой раме, деревянными шкафами и плакатом здания с надписью «БОЛЬШОЙ» на стене.
Чёрная печатная машинка «Ундервуд» с надписью «Образцовая Ундервуд» стоит на круглом деревянном столике перед белыми складчатыми шторами и радиатором.
Винтажная швейная машина Singer на деревянном столе рядом с лампой в стиле ар-нуво, на фоне белых драпировок и деревянной мебели.
Бронзовая скульптура ног Михаила Булгакова на постаменте, усыпанном монетами; табличка: «Культурный центр "Булгаковский Дом", Михаил Булгаков, скульптор Н. Базюк».
Открытая книга «Мастер и Маргарита» Булгакова: видна страница с предисловием Константина Симонова и началом первой главы «Никогда не разговаривайте с неизвестными».
Музейная витрина с медицинскими инструментами, флаконами и коробочками; на этикетке одного флакона читаемо «РЫБІЙ ЖИР».
Вид сзади на круглый чёрный динамик с металлическим кронштейном для крепления и двумя проводами, выходящими из центра.

В альбомах на «Яндекс.Фотках» есть остальные фотографии.

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

Посмотрел на Perl6

Очень давно хотел посмотреть во что превратился Perl6 за те годы, что я его не видел. Посвятил четыре часа своей жизни на изучение. Что я хочу сказать, богатейший язык при беднейшей документации. Синтаксис, как и положено языку Perl, позволяет сделать одно и то же миллионом различных способом, 99% из которых нечитаемы.

Я в восторге.

К сожалению, не всё описанное в документации работает (например, lvalue-метод substr класса Str у меня работать отказался), а кое-что работает ужасно медленно (я попытался в своём коде использовать замены через regexp, не дождался окончания работы программы).

Сегодня на «Хабре» появилась интересная статья, где описывался нормальный алгоритм Маркова для деления двух целых чисел с точностью 4 знака после запятой в унарной системе счисления. То есть: |/|||| = 0.25, ||/||| = 0.6666 и так далее.

Замены в статье уже описаны, осталось реализовать алгоритм (в заменах я поменял пустую строку на два апострофа: ’’). Привожу с сокращением списка замен:

use v6;

my $входная = '||/|||';
my @замены  = <%* *% %| %* *| ** |* t t* *t …тут просто замены через пробел… p^ '' p .FIN _ .FIN>;

loop {
    my $нашёл = Bool::False;
    my $начтонадо;

    for @замены -> $что, $начто {
        my $где = $входная.index($что);

        if defined $где {
            $нашёл = Bool::True;

            given $начто {
                when <''>  {
                    $начтонадо = ''
                }                                
                when /FIN/ {
                    ($начтонадо = $начто) ~~ s[FIN] = '';
                    $нашёл = Bool::False;
                }
                default    {
                    $начтонадо = $начто
                }
            }

            #`{
                К сожалению, lvalue метод не сработал:
                $входная.substr($где, $что.chars) = $начтонадо;

                выдаёт «cannot modify readonly value
            }

            $входная = $входная.substr(0, $где) ~ $начтонадо ~ $входная.substr($где + $что.chars);
            say $входная;
            last;
        }
    }
        
    last unless $нашёл;
}
END {
    $входная.say;
}

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

Меня очень радует нативная поддержка Unicode, которая реализована куда глубже, чем в Python, к примеру, конструкция языка >> может быть заменена на », в качестве ограничителей (например, многострочного комментария) можно использовать символы 「 и 」, а say "Ⅰ".succ правильно выдаёт Ⅱ).

Наворотили в языке много. Отдельной строкой — регулярные выражения. Синтаксис совсем другой, мне кажется более продуманным, чем тот, что сейчас в Perl5 (и тем более в PCRE), возможностей стало больше, а выражения выглядят аккуратнее.

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

99 бутылок: КуМир

47. КуМир — очередной неинтересный язык программирования «Комплект учебных Миров или Миры Кушниренко».

В 1995 году «КуМир» (о ужас!) был рекомендован Министерством образования РФ в качестве основного учебного материала по курсу «Основы информатики и вычислительной техники» на основе учебника А. Г. Кушниренко, Г. В. Лебедева и Р. А. Свореня.

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

Добавлено позднее: Язык оказался диалектом или реализацией уже известного мне языка «РАЯ».

| написал Евгений Степанищев bolknote.ru

алг песня про пиво
нач
    цел пиво
    нц для пиво от 99 до 1 шаг -1
        вывод сколько пива(пиво), ' on the wall, ', нс
        вывод 'Take one and pass around,', нс
        вывод сколько пива(пиво-1), ' on the wall.', нс, нс
    кц
    вывод "No more bottles of beer...", нс
    вывод "Go to the store and buy some more...", нс
    вывод "99 bottles of beer."
кон

алг лит сколько пива(цел пиво)
нач
    если пиво = 0 то
        знач:="No"
    иначе
        знач:=цел_в_лит(пиво)
    все

    знач:=знач + ' bottle'

    если пиво <> 1 то
        знач:=знач+'s'
    все
кон

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

UTF-8: как быстро получить подстроку (+новый вариант strlen)

Из кода быстрой функции strlen для UTF-8 можно получить функцию substr. Николай Захаров, который работает со мной в группе внутренних сервисов, переделал strlen в substr.

Я вкомпилил эту функцию в PHP, помог найти ошибки и отладить и сделал замеры:

bolk-dev ~/uni/futf-0.1 $ php ../test/test_substr.php  | sort -k2 -t:
Fast UTF-8: 0.18010711669922
mb_substr:  0.87068700790405

Разница примерно в 4 раза. Я ещё попробовал отрезать строку через функцию preg_match, сравнимо по скорости с mb_substr, но медленнее и есть ограничение — квантификатор preg_match не захватывает больше 65535 символов.

Добавлено позднее: после того как мы отладили эту функцию, я вспомнил про команды ассемблера SSE — это наборы команд (сейчас их пять — SSE1, 2, 3, 4.1 и 4.2), которые оперируют восемью регистрами размером 128 бит.

Как я рассказывал, самый быстрый алгоритм для strlen, который я нашёл, работает следующим образом: сначала указатель на строку первым циклом выравнивается по границе 4 или 8 байт (в зависимости от архитектуры процессора), чтобы процессор смог быстрее читать дальше, потом, работая сразу с числом длиной 4 или 8 байт, одной операцией подсчитывается сколько в выделенной строке содержится начальных байт символов.

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

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

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

Нашёл в интернете тест для таких функций, включил туда найденную и сделал замеры:

C:\MinGW\bin\test.exe
cp_strlen_utf8:          0.105706
cp_strlen_utf8_sse2: 0.030002

В 3,5 раза обгоняет предыдущий вариант, то есть, смею надеяться, обгонит встроенную в PHP функцию примерно в 24 раза. Завтра попробую.

Немаловажно, что даже на машинах с архитектурой 32 бита рассматриваемый вариант покажет ту же скорость, что и на машинах 64 бита.

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

UTF-8: как быстрее получить длину строки

Как я уже писал, сегодня ночью я наткнулся на вариант измерения длины UTF-8 строки, написанный с применением ассемблерных иструкций SSE2. У этого кода есть недостаток — на каких-нибудь ARM он не заработает, с другой стороны, у меня нет такой потребности, запускать PHP на этих процессорах.

Сегодня я почистил код (в PHP известна бинарная длина строки, поэтому я убрал проверки на символ с кодом ноль и соптимизировал код), сгенерировал таблицу HammingWeight, которая отсутствует в коде автора и перевёл проверку в двух крайних циклах на подобную таблицу.

Потом это всё скомпилировал и погонял тесты.

Сначала я получил очень странные результаты и только потом понял что случилось. В общем, разрыв в скорости функций (mb_strlen и той, что на SSE2) тем больше, чем ближе тестируемая строка к однобайтовой. Чаще всего, с SSE2 быстрее встроенной в PHP в 5—8 раз:

thasonic-dev ~/uni/futf-0.1 $ php ../test/test_strlen.php | sort -k2 -t:
SSE2 UTF-8:                 0.025604963302612
mb_strlen:                   0.15917205810547
strlen/utf8_decode:   0.62052989006042

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

В общем, о приросте в 24 раза остаётся только мечтать.

Похоже, это почти предел на сегодняшний момент. Единственная возможность ускорения, которая приходит в голову — использовать GPU на видеокарте. Например, видеокарта GTX275 управляется с 16000 потоков (!), что позволяет подсчитать длину строки порциями по 15,5КБ!

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

Так что оставлю как есть, займусь переписываем substr в SSE2, а потом выложу всё в открытый доступ.

Добавлено позднее: в следующем году Intel и AMD выпустят процессоры, поддерживающие набор комманд AVX, интересно там то, что размер регистров SIMD (которые используются и в SSE) расширяется до 256 бит. То есть через годик-другой можно будет читать строку сразу по 32 байта за раз.

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

Прозрачный фон SVG в Хроме и Сафари

Владислав Шкодин написал статью на «Хабре», где рассказал как ему удалось победить старый баг в движке WebKit — если вставить SVG с прозрачным фоном в тег OBJECT, что «Сафари» и «Хром» (до 8-й версии) зальют фон белым цветом.

Решение очень простое. Прямо внутри файла SVG, после тега svg нужно написать следующее:

<style>
    svg { -webkit-background-clip: text; }
</style>

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

Пешая доступность от метро МК «Царицыно»?

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

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

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

(…) После реализации проекта, для пешеходов время в пути от мкр. «Царицыно» до станции метро «Царицыно» составит 15 минут. То есть, отныне метро будет находиться в пешеходной доступности для владельцев квартир в мкр. «Царицыно».

Есть такие «Методические рекомендации по регулированию пешеходного движения», указания 1977 года, но не думаю, что с тех пор скорость пешехода выросла. Из него следует, что средняя скорость движения пешехода по тротуару — 1,25 м/c, впрочем, там ещё есть скорость движения по наземному пешеходному переходу — 1,4 м/c. Возьмём эту цифру.

«Яндекс.Карты» сообщают нам, что от корпуса №8 в районе застройки, до ближайшей точки входа метро «Царицыно» — 1,831 километр. По прямой!.

1,831 км до метро (84.08КиБ)

Нехитрые вычисления: 1831 / 1,4 = 1307,86 секунд или 22 минуты. Двадцать две минуты только по прямой, да ещё и довольно бодрым шагом. Я очень сомневаюсь, что застройщик сможет обеспечить пешеходов прямой, как стрела, дорогой до метро. Скорее всего, дорога до метро займёт от получаса, а это уже совсем другая цифра.

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

Производительность различных библиотек регулярных выражений

Какая библиотека regexp быстрее? (13.44КиБ)

Много читал с утра о библиотеках регулярных выражений. Хочется найти такую, чтобы работала с UTF-8, была быстрой и мощной. Без особой надежды поискал в интернете обзоры библиотек и нашёл статью «Benchmark of Regex Libraries».

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

Жалко автор не составил такую же таблицу для режима UTF-8, там производительность может сильно отличаться.

Например, мне из таблицы понравилась библиотека RE2, она показывает хорошие результаты, при этом в последнем тесте вырывается далеко вперёд. Правда в ней не реализована часть синтаксиса (например, нет backreferences), но это я бы пережил. А вот насколько она эффективная в режиме UTF-8 — вопрос (вопрос тем более актуален, что библиотека показывает примерно равную с PCRE эффективность, а PCRE с UTF-8 работает медленно).

Кстати, скрипты для тестирования доступны для скачивания. Можно попробовать переключить пару библиотек в UTF-8 и посмотреть что с ними будет.

Добавлено позднее: раз доступны скрипты тестирования, я решил посмотреть не находится ли уже RE2 в режиме UTF-8 (у неё это режим по-умолчанию), оказалось, что находится:

RE2 p(argv[1]);
buf = (char*)calloc(BUF_SIZE, 1);
while (fgets(buf, BUF_SIZE - 1, stdin)) {
        ++l;
        for (q = buf; *q; ++q); if (q > buf) *(q-1) = 0;
        if (RE2::PartialMatch(buf, p))
                printf("%d:%sn", l, buf);
}
free(buf);

Чтобы выключить режим UTF-8, нужно использовать константу RE2::Latin1, а её в коде нет. Значит, RE2 работает в режиме UTF-8. Интерееесно.

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

UTF-8: быстрые регулярные выражения в PHP

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

Как я уже писал, мне понравилась библиотека RE2, я даже скомпилировал её и посмотрел, к сожалению, оказалось, что она использует треды, а в PHP с этим не очень (не все модули PHP thread safe, поэтому чаще всего PHP собирается без поддержки тредов).

Я уже начал смотреть другие библиотеки, когда Алексей Захлестин напомнил мне про модуль PHP Multibyte String (функции mb_*), который содержит в себе движок регулярных выражений Oniguruma.

Я всегда плохо относился к этому движку, так как считал, что у него очень бедные возможности для работы с UTF-8, так как там не работают \p, \P и есть ещё пара недостатков (возможно они имеют место из-за того, что в PHP используется версия 4.7.1, тогда как последняя 5.9.2).

Сегодня я присмотрелся к движку получше. Конечно, PCRE он не заменит, но некоторых случаях вполне сможет его подменить как быстрый аналог, только надо применять несколько правил (речь идёт о версии 4.7.1, которая в PHP):

Во-первых, модификатор „i“ не действует ни на какие буквы, кроме латинских, я перебрал весь Unicode, чтобы в этом убедиться.

Во-вторых, \b и \B внутри […] относятся к backspace, а не к word boundary, а \h и \H к hex digit, а не к horizontal whitespace.

В-третьих, не работают \p и \P, зато (хоть какая-то замена) с UTF-8 работают :…: (всякие там :space: и прочие).

В-четвёртых, есть синтаксис [a-w&&[^c-g]z], то есть «&» надо экранировать внутри диапазонов.

В-пятых, части синтаксиса PCRE просто нет, например, нет рекурсии, условных регулярок, но тут уже надо обращаться к документации.

Я погонял тесты, сравнивал PCRE в режиме полном UTF-8 (с «глаголом» UCP) и Oniguruma, по результатам последний в 4…4,5 раза быстрее:

bolk-dev ~/regexp-benchmark $ php test.php
PCRE Full UTF-8: 1.0458080768585
Oniguruma:         0.24942803382874

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

Just5 CP10 BestInSpacephone и CP11

Компания Just5 известна в России, в основном, как производитель «телефонов для пожилых» — большие кнопки, крупные цифры, упрощённый интерфейс, монохромный экран. Ниша, может, и небольшая, но в ней свои покупатели. Телефон CP11, на мой взгляд, продолжает эту линейку, хотя он стал куда более стильным и явно позиционируется как телефон для всех возрастов.

Из сразу заметных изменений в нём — выдвижной экран и термометр, показывающий температуру окружающей среды.

Модели Just5 CP10 Spacephone и BestInSpacephone это нечто куда более интересное. Не секрет (я наблюдаю по своим друзьям и знакомым), что далеко не всем нужен смартфон, есть ребята, которым нужен простенький телефон из разряда «чтобы звонил».

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

Три мобильных телефона на белом фоне: слева — смартфон с сенсорным экраном, в центре — кнопочный телефон с яркой цветной клавиатурой, справа — iPhone с сенсорным экраном.
Три мобильных телефона на белом фоне: чёрный смартфон с сенсорным экраном, белый кнопочный телефон с крупными кнопками и цветной кнопочный телефон с яркой клавиатурой.

Тут Spacephone разных цветов и, выпущенный ограниченным тиражом, разноцветный BestInSpacephone, похоже, попадут в точку. По крайней мере у нас в офисе двое людей сразу захотели себе такой телефон, стоило мне только открыть коробку.

Кнопка «SOS» (вызывающая заранее задаваемый номер и включающая сирену), видимо, идеологически меняет свою функцию. Из кнопки «скорую мне, помогите», превращается «милиция, помогите».

Комплект поставки телефона Just5: белый телефон с русской раскладкой, оранжевое зарядное устройство, наушники, аккумулятор, док-станция, инструкция и стикеры с логотипом.
Разобранный комплект телефона: цветной корпус с клавиатурой, оранжевый блок питания, кабель, наушники, батарея и коробка с серой подложкой на белом фоне.
Коробка телефона Just5 с большими кнопками и выдвижным экраном; на ней указаны функции: простое меню, кнопка экстренного вызова, термометр, радиоприёмник, фонарик.
Коробка телефона Just5 с большими кнопками: выдвижной экран, простое меню, кнопка экстренного вызова, термометр, радио, фонарик.

Обе модели, которые попали мне в руки, обладают схожей комплектацией — аккуратная коробка, инструкция, наклейка с эмблемой Just5, аккумулятор, зарядник, гарнитура, сам телефон и (у CP11) — кредл. Телефоны хорошей сборки, а инструкция заслуживает всяческих похвал, хорошо структурированна, написана понятным языком.

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

Отдельно стоит отметить время работы — небольшой (по нынешним временам) экран, отсутствие цвета, камеры, Bluetooth, WiFi, NFC, сетей третьего поколения и так далее, позволяют работать телефонам Just5 несколько дней. Впрочем, аккумулятор можно было сделать и помощнее, чтобы заряжать нужно было раз в неделю или реже.

Теперь о плохом: интерфейсно телефон слабо продуман, я не имею возможности сейчас сравнить CP10 и CP11 с девятой моделью, возможно что-то стало лучше, но до сих пор ощущение, что приходится делать много лишних действий. Возможно я избалован юзабилити новейших смартфонов, управляемых пальцем, но мне показалось, что даже я, не имея опыта в промышленном дизайне интефейсов, мог бы упростить его многократно.

Белый стационарный телефон Just5 с оранжевым кабелем, установленный на зарядной базе; на клавиатуре видны цифры и русские буквы, логотип «just5» на базе.
Белый мобильный телефон с выдвижной клавиатурой, оранжевой кнопкой и боковыми регуляторами громкости на светлом фоне.
Белый слайдер с выдвижной клавиатурой, оранжевой кнопкой и переключателем блокировки на боковой грани, лежащий на светлой поверхности.
Белый мобильный телефон с цифровой клавиатурой и разъёмами на нижней грани, снятый крупным планом на светлом фоне.

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

Недостатки: высокая цена (4500 рублей за каждую из моделей), непродуманный интерфейс.

Ещё раз спасибо информационно-аналитическому агенству Марины Рожковой за возможность сделать обзор.

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

ГИМП — говно

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

Скачал бесплатный графический редактор ГИМП, чтобы подредактировать пару фотографий. В диалоге открытия файла, чтобы ГИМП показал мне миниатюру файла, мне предлагается кликнуть сначала на файл, потом на место, где должна появиться миниатюра! Два клика и куча движений мышью на каждый из 120 файлов, в котором я хочу найти нужный.

И вот так там всё.

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

Порисовал немного на теге CANVAS, ничего интересного

Фрактал (3.10КиБ)

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

<canvas width="500" height="240"></canvas>
<script type="text/javascript">
(function (c) {
    var img = c.createImageData(500, 240);

    var putPixel = function (x, y, c) {
        var index = (x + y * 500) << 2;

        for (var i = 0; i<4; i++) {
            img.data[index+i] = c[i];
        }
    };

    var x = 0, y = 0, color, leaf, idx,
    k = [
          [ 0.00, 0.00, 0.00, 0.16, 0.00, 0.00 ],
          [ 0.85, 0.04,-0.04, 0.85, 0.00, 1.60 ],    
          [ 0.05,-0.26, 0.23, 0.22, 0.00, 1.60 ],
          [-0.15, 0.30, 0.26, 0.24, 0.00, 0.44 ],
    ];

    for (var i = 0; i<200000; i++) {
        leaf = Math.random();

        if (leaf <= 0.010) leaf = 0; else
        if (leaf <= 0.860) leaf = 1; else
        if (leaf <= 0.930) leaf = 2; else    
        leaf = 3;

        x = x * k[leaf][0] + y * k[leaf][1] + k[leaf][4];    
        y = y * k[leaf][2] + y * k[leaf][3] + k[leaf][5];    

        putPixel(parseInt(y * 55), 120 - parseInt(x * 40), [10, 100, 20, 255]);
    }
    
    c.putImageData(img, 0, 0);
})(document.getElementsByTagName('canvas')[0].getContext('2d'));
</script>

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

CANVAS 1K Tank Game

Canvas Tank Game (0.58КиБ)

Решил попробовать уместить какую-нибудь игру с использованием тега CANVAS в 1КБ. После всех оптимизаций, который заняли у меня вдвое больше времени, чем написание игры, получилась несложная игрушка в 1020 1023 байта (то есть на четыре один байт меньше, чем килобайт).

Цель — подбить своим «танком» как можно больше вражеских ракет. Управление — курсорными клавишами, стрелять пробелом. Даётся три жизни, за каждые 20 сбитых ракет жизнь добавляется, если ракета долетит до вашей стороны или коснётся танка, жизнь теряется. Для рестарта игры просто перезагрузите страницу.

Должно работать везде, где поддерживается тег CANVAS, я тестировал в «Опере» 11, «Хроме» 10 и FF 3.6.13.

Have a fun!

Неинтересные технические подробности
Добавлено позднее: оказывается, я вполне уложился бы в правила конкурса JS1K (конкурс программ на JS, занимающих не более 1КБ), на который мне вчера ссылок накидали. У меня чистый JS (без сжатия в PNG) на восемь байт короче килобайта. А все эти пляски с кодом в PNG нужны для того, чтобы у меня весь код (включая HTML) поместился в килобайт.

Ещё позже: на заметку. Я вчера обращался к тегу CANVAS по идентификатору. Это очень длинный способ (не говоря уже о том, что тег должен иметь идентификатор, что ещё тратит место), вчера, когда мне показали JS1K, я там увидел способ короче: «document.body.children[0]», а сегодня я придумал способ ещё короче: «document.all[3]», это нестандартное свойство, но его поддерживают все браузеры.

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

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

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

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

Сконвертировал сайт за 2000—2003 гг

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

Вероятно в RSS прилетит куча новых постов (больше ста), извините, кого заспамлю.

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

Добавлено: сконвертировал ещё и заголовки (оказалось, что можно получить ещё и время заметок, обновил и время), плюс включил обратно комментарии.

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

Банан велик, а кожура ещё больше

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

В каком-то бородатом году, когда я ещё хостился на сайте Экслера, произошёл технический сбой диска и часть моих картинок за 2003 год восстановить не удалось. Расхожий мусор я восстановил быстро, а одну картинку не смог, сайт GIF.GIF, с которой я его взял уже не существовал к тому времени, в кешах поисковых машин тоже пусто.

Та самая картинка (80.07КиБ)

А сегодня, перечитывая комментарии к записи к той картинке, я сообразил, что в них содержится масса данных — фамилия, имена, ник, два адреса.

По реквизитам сына, который читает меня до сих пор (Сергей, привет!), я узнал его ЖЖ и e-mail, связался с ним, и он выслал мне ту самую картинку — это поверхность шкатулки ручной работы, которую делала его мама, он мне переслал фотографию. К сожалению, анимированная версия не сохранилась.

Татьяна, очень красивая работа, спасибо вам!

Добавлено позднее: в комментариях появилась Татьяна, оказывается у неё сохранилась анимированная версия. Ура!

Дом, снег… (11.30КиБ)

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

Фотокамера из конструктора «Лего»

Снимок камеры из конструктора (27.40КиБ)

Один умелец с «Хабра» сделал фотокамеру из конструктора «Лего», из набора «Lego Mindstorms» (это такой набор из которого можно делать роботов), камера умеет двигать плёнку покадрово, регулировать выдержку.

Что мне понравилось больше всего (кроме того, что я получил удовольствие от того, что люди делают такие безумные штуки), что фотографии выглядят сильно «под старину», как на самых плохих дагерротипах конца XIX века.

Камера (28.88КиБ)

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

Кнопка открывания дверей в лифтах

Лифт (97.00КиБ)

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

Отдельный тупизм в нашем офисном лифте, что расположение этой кнопки справа и слева различаются. На снимке левая сторона лифта — кнопка открытия дальняя, справа кнопка открытия ближняя.

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

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

Makecorner 0.25

Выложил (на то же место) новую версию программы для скругления уголков (я про неё писал в сентябре).

Изменения следующие:

  • появился новый параметр ключа —width, можно указать «auto» или просто «a» и программа не будет масштабировать картинку.
  • я постарался улучшить оптимизацию JPEG изображений встроенной программой jpegtran: теперь я указываю специальные профили из программы jpegcrush и задаю ключ «grayscale», если JPEG чёрно-белый (сканирую каждый пиксель и смотрю серый ли он).
  • появилось «пасхальное яйцо».
    Добавлено позже: нашёл какую-то ошибку с определением серых изображений. Пожалуйста, пока не качайте эту версию.

Ещё позже: поправил. Опечатка в одном месте.

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

localStorage для Internet Explorer 6 и 7

Написал небольшой класс в JavaScript для поддержки API localStorage в IE 6 и 7. localStorage — это браузерное хранилище key-value. Эмулируются setItem, getItem, removeItem, key, clear и length (для хранения использует behavior userData).

Доступ к значениям как к свойствам класса не реализован. Прежде всего потому, что в JS в этих версиях IE нет сеттеров и геттеров, а для того, чтобы воспользоваться onpropertychange мой объект надо поместить в DOM, что порождает массу гемороя, типа присутствия свойств из DOM, а не из хранилища.

Так же я не сделал события onstorage и onstoragecommit, потому что не придумал для чего это нужно (а второе корректно реализовать вообще нельзя).

Ещё не реализовал нестандартное, но полезное расширение remainingSpace, потому что в общем случае нельзя сказать сколько места ещё осталось в userData, так как квота зависит от зоны сайта (доверенная, интранет и так далее).

С большой вероятностью эта зона, конечно же, «интернет» (то есть квота 1МБ), но квоты localStorage сильно отличаются по механизму от userData, у последнего две квоты — на документ (в зоне «интернет» это 128КБ) и на домен (упомянутый мегабайт). Вполне может случится, что квота «на документ» ещё не исчерпана, а доменная уже да.

Зато я реализовал exception, который бросается в том случае, если IE говорит, что квота исчерпана.

В общем, основные вещи есть. Пример использования:

// .-~*´¨¯¨`*·~-.¸ тут подключаем библиотеку ,.-~*´¨¯¨`*·~-.¸
// записываем два значения
try {
    localStorage.setItem('key1', 'myvalue1');
    localStorage.setItem('key2', 'myvalue2');
} catch (e) {
    if (e.description == 'QUOTA_EXCEEDED_ERR') {
        alert('Нет места');
    } else {
        alert('Что-то не так, не знаю что.');
    }
}

// смотрим значение по ключу «key1»
alert(localStorage.getItem('key1'));
// смотрим первое значение (по номеру), нумерация с нуля
alert(localStorage.key(0));

// удаляем значение по ключу «key1»
alert(localStorage.removeItem('key1'));

// смотрим сколько ключей осталось
alert(localStorage.length);

// очищаем хранилище полностью
alert(localStorage.clear());

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

Расширение для «Оперы»: сайт только у меня не видно?

Артемий Трегубенко написал расширение для «Оперы» «У всех работает».

У всех работает? (44.87КиБ)

Смысл в том, что если ваша «Опера» показывает экран с ошибкой «Невозможно найти удалённый сервер», это расширение при помощи сервиса «Down for everyone or just me» проверяет доступность того же сайта для других пользователей.

Полезно, можно узнать проблема с сайтом или у вашего провайдера.

А картинка, которая в этом посте, только в моей «Опере» не показывается или в вашей тоже?

Добавлено: картинка не открывается под любой платформой в последней «Опере», сейчас потестирую в других.

Чуть позже: «Опера» 8.54 показывает, 9.63 — уже нет. Я заменил картинку на такую, которую «Опера» понимает.

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

«Опера» 9.50 и выше показывает не все JPEG

«Опера», не покажи этот JPEG! (11.92КиБ)

Случайно выяснилось, что «Опера» с какой-то версии не умеет показывать некоторые JPEG (и считает, что в них 0 бит на пиксель). Попытаюсь выяснить с какой версии это началось.

Добавлено: «Опера» 9.00, 9.27, 9.63, 10.00, 11.00, 11.01а и Opera Mini 5.1 не показывает. «Опера» 8.54 — показывает. Значит сломали в девятой версии.

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

С наступающим!

С наступающим Новым годом, ребята!

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

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

В Домодедове всё спокойно

Утро для меня непривычное время. Обычно, когда я просыпаюсь, люди обдумывают что будут есть на обед. Может быть из-за этого мне кажется, что сегодняшнее утро излишне наполненно агрессией. Возможно по утрам все всегда такие.

Вот в метро бабушка тащит мимо меня ребёнка за руку, ребёнку всё интересно.

— Баба, а почему там свечи горят? — указывает на потолок, где светит люстра с вытянутыми энергосберегающими лампочками, действительно похожими на свечи. — Какие свечи, чо тупишь-то? Это лампачки — бабуля раздражена, дёргает ребёнка за руку, это такой способ отвлечь, сместить фокус внимания. — А… а лампочки почему горят? — ребёнок не поддаётся. — Ну чё ты, а? Заладила!! Надо, значит!!! — чуть ли не на крик.

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

Через минуту по тому же маршруту, но более грубо кого-то пытается отослать усталая барышня с кругами вокруг сонно слипающихся век, на футболке надпись «Moscow never sleeps». Последнее видно; хотя даётся тяжело.

Мне тоже несладко — за соседним столиком сидит какой-то бейтаныс ағай из Казахстана, очень хочется попросить его кричать в трубку потише. Меня раздражает его крик, хотя, может быть, его дедушка («Ата! Ата!» — кричит он на весь зал в трубку) просто плохо слышит.

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

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

← сюда туда →