404fest: было здорово!

Всё забываю написать, на «404» в Самаре было очень здорово. И уровень докладов, и развлекательная программа, и люди! Увидел старых друзей и знакомых — Илью Бирмана, Вадима Макеева, Сергея Чикуёнка, ребят из «knock knock» и многих других. Приобрёл новых знакомых и, как я надеюсь, друзей.

404fest (51.01КиБ)

Вообще, сейчас какое-то время будет редко получаться писать — сильно занят. На работе занимаюсь очень плотно этой проблемой перевода проекта на UTF-8, дома — сменой дизайна сайта.

Сайту скоро 10 лет, его посещают в день от 2 до 5 тысяч человек (в зависимости от дня недели), читают чуть меньше 90 тысяч человек в месяц (если верить статистике моего хостера).

И вот, я не придумал ничего лучше, чем испортить всем этим людям ко сроку жизнь — сменить дизайн сайта. Что получается, мне нравится, очень похоже на блог Ильи и сайт Тани Мисютиной.

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

P.S. Нашёл фото где я спрашиваю Вадима когда «Опера» будет поддерживать дробные проценты.

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

И о гаджетах

Искал электробритву, нашёл. Жена положила в ящик «Гаджеты». Всё правильно.

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

В Ярославле откопали письмо из коммунистического прошлого

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

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

И так далее. Там ещё много такого. К счастью, в моём родном городе капсулу то ли не достали, когда пришёл срок, то ли вскрыли по-тихому.

Ну и хорошо, иначе текст и этого послания висел бы сейчас на всех «фишках», очень гротескно сейчас выглядит пафос тех лет.

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

PHP, UTF-8, всё ещё строки: упрощаем задачу, часть I

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

Что же дальше?
Выделив типичные случаи использования, частые и простые можно заменить автоматом, редкие и сложные — просто руками. Первым делом было бы неплохо узнать каково общее количество строк, с которыми мне придётся работать:

bolk@dev:~/daproject$ find \( -name '*.php' -or -name '*.inc' -or -name '*.tpl' \) -exec \
egrep '\$\{?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*[\[\{]' -- {} \; |
sort -u | tee out-vars-1.log | wc -l

3670

Около 3,5 тысяч. Я временами дьявольски усидчив, но рассматривать каждую строку из нескольких тысяч, это для меня перебор. Что же делать?

Для начала мне хочется упростить своё регулярное выражение. Конечно, по синтаксису PHP имена переменных можно писать, например, по-русски (в UTF-8), но в реальности, у меня имён, которые содержат не только цифры и латинские буквы, только шестнадцать (в этом я убедился, сделав «egrep -v ’\$\{?\w+’ out-vars.log | wc -l») и все эти строки содержат ерунду — совпадение внутри строк в апострофах, поэтому я с чистым сердцем выбрасываю все такие строки и упрощаю себе жизнь.

Безусловно, моё регулярное выражение захватило очень много лишнего, надо эти ситуации обработать. Например, можно исключить добавление элемента в массив, это легко узнаваемая конструкция ($arr[] = $elm):

bolk@wiki:~/daproject$ IFS='\n'
for line in $(cat out-vars-1.log); do
(echo $line | sed -r 's/\$\w+\[\]//g' | egrep -q '\$\{?\w+[\[\{]') && echo $line
done | sed -r 's/^\s+//' | awk '!t[$0]++' | tee out-vars-2.log | wc -l

3357

Ситуация мало изменилась, давайте попробуем улучшить её значительно. Например, удалить все строки, где происходит только явное обращение к массиву: $arr[’index’] (но не $arr[’index’][0]):

bolk@dev:~/daproject$ IFS='\n'
for line in $(cat out-vars-2.log); do
(echo $line | sed -r 's/\$\w+[\[\{](["'\''])[^\1]*\1(\]|\})([^\[\{])/\2/g' | egrep -q '\$\{?\w+[\[\{]') && echo $line
done | tee out-vars-3.log | wc -l

1353

Ощутимая разница. Открываем получившийся файл и смотрим что бы мы ещё могли выкинуть…

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

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

Бьёрн Страуструп в России

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

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

Но самое главное — синхронный перевод. О, я получил удовольствие. Избранные фразы из моего твиттера:

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

Переводчик: «когда мы своппируем поинтеры…»

Ещё: «для начала я тайпирую аллокаторы…»

Бьёрн рассказывает про сборщик мусора (garbage collector), переводчик долго молчит, потом: «тут у нас никакого мусора».

«Что касается магнитуды… величины фолт толерантности» — бубнит в наушник переводчик.

«Чё-то по поводу исключений… ля-ля, тополя». Ну, переводчик в ударе.

«У нас есть сингллинкед и анордеред массивы»,.. Даль вертится в гробу.

Бьёрн: «ок…», заметьте насколько переводчик более поэтичен: «да, давайте я соберусь с мыслями».

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

Бьёрн (компьютер со слайдами опять сломался): «I don’t belive it», переводчик: «какого х…»

Бьёрн: «I think so…», переводчик, сквозь зевоту: «ага, щас попробую врубиться»

Переводчик, в сердцах: «о чём речь, вообще?!»

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

Бьёрн Страуструп

Иду на семинар Бьёрна Страуструпа (это автор Си++ и первый «компьютерный учёный»). Жестокий мир — начало в 7:30! В интернете никого нет, вы что, спите все что ли?

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

Мощь SVG и media queries

Вадим Макеев демонстрирует сейчас на фестивале «404» мощь SVG — картинка сама (через CSS media queries) изменяется для разных разрешений экрана, при масштабировании полноценное лого с текстом ужимается, текст сначала переносится, потом исчезает и остаётся один логотип.

Ребята, о таком применении SVG я даже и не думал, это очень круто.

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

Дополнено позднее: Вадим выложил слайды своего доклада (смотреть надо в «Опере»).

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

10.10.10 10:10:10

Проспал круглую дату — 10.10.10 10:10:10, после вчерашнего общения со знакомыми, незнакомыми и читателями, очень хотелось выспаться.

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

PHP, UTF-8, рассуждения по поводу строк

Тёмная материя (18.16КиБ)

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

Что дальше?
Во-первых, нужно учесть, что в PHP для способа получить символ по индексу — это квадратные скобки (\$str[0]) и фигурные ($str{0}). Причём, если мы встречаем фигурные скобки, то это точно строка, если мы встречаем фигурные, это может быть массив. Различать массив и строку в контексте абстрактных квадратных скобок, без полной интерпретации, невозможно. К счастью, мне это и не нужно, мой статический метод (я его назвал UTF::get(…)), проверяет является ли аргумент массивом и, если да, работает с ним как с массивом.

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

В-третьих, индексы могут идти подряд, например, $arr[0][2]{3}. Надо не забывать об этом и брать выражение целиком.

В-четвёртых, внутри индекса может идти любое годное PHP выражение, в том числе, внутри так же может быть операция взятия символа по индексу. Например: $str[1 + $str[0] + sin($arr[$a])].

В-пятых, есть переменные переменные, к примеру: $$$$$var[1], их тоже надо уметь обрабатывать, кроме того, они могут быть взяты в фигурные скобки, а в скобках могут быть вызовы функций, методов, имена переменных: ${$$$$var[1]}, ${$this->my()}{1}, ${str}{0}.

В-шестых, в PHP в строках опеределённого типа (в кавычках и heredoc) переменные интерполируются, в том числе интерполируются строковые переменные с получением символа по индексу, а кроме этого эти переменные могут быть в фигурных скобках: «{$aaa[1]} и можно ещё так: ${aaa[1]}», тут же надо не забывать, что переменные могут экранироваться, вот так: «\${aaa[1]}».

В общем, задача сложная, я над ней думаю. Пока в сторону парсеров синтаксиса (colorer, Text_Highlighter и PHP tokinizer). Из исследования выяснилось, что все они могут мне помочь примерно в равной степени, так что я думаю, что возьму PHP tokinizer.

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

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

Огрызки от собеседований

От собеседований, которые я недавно проводил, у меня осталась масса листочков с заковыристыми вопросами. Например, если человек говорил, что знает PHP на 10 из 10, то я ему давал, например, такой тест:

var_dump((bool) print_r(${strrev('SLABOLG')} = 1, $GLOBALS[1]{1} == (unset) b"1") == "00");

Сказать есть ли тут ошибки, если нет, то что получим и что вообще тут происходит.

P.S. Я в Самаре, «Holiday Inn» отличный отель.

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

Воздушный бой на чистом HTML

Воздушный бой (51.63КиБ)

Все в последнее время настолько в восторге от новых возможностей браузеров, что пишут игру за игрой на HTML5/CSS/JavaScript. Это всё скучно. Вчера перед сном я размышлял об игре на чистом HTML (даже без CSS), а сегодня, пока собирался в Самару, на 404fest, потихоньку её написал.

Встречайте — Pure HTML Air Fight. Написано на чистом HTML, без использования JavaScript, CSS и серверной логики. На сервере отрабатывает только скрипт, контролирующий введённый URL и запускающий игру, если URL ошибочен.

Задача классическая — попасть в пролетающий самолёт, внизу есть кнопка, запускающая ракету. Скорость самолёта и задержка меняется (на самом деле они жёстко зависят от момента пуска ракеты, у меня же чистый HTML, никакого рандома).

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

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

Добавлено ещё позднее: некоторые ребята (в том числе в комментариях на «Хабре») почему-то подумали, что у меня на сервере есть какая-то логика. Да нет никакой, кроме явно описанной в тексте. У меня просто куча HTML лежит в папке.

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

Шуруп иногда

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

Шуруп (19.63КиБ)

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

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

Этот «шуруп навсегда» я бы выкрутил плоскогубцами.

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

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

Как преобразовать пробелы в табуляции в вашей программе

По code guidelines PHPbb в коде нужно использовать табуляции, вместо пробелов. К сожалению, я об этом поздновато узнал, теперь надо всё, что я написал привести к правильному виду.

Оказывается, в Linux есть специальная утилита для этого — unexpand (находится в пакете coreutils). Кстати, есть и противоположная по действию утилита — expand.

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

Дома холодно

«Тепло подано ко всем потребителям. Жилой фонд, социальная сфера — школы, поликлиники, больницы — всё находится с теплом», — отметил Бирюков.

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

(цитата из RIAN)

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

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

PHP и UTF-8: пятый с половиной этап

После последнего, на данный момент, пятого этапа, меня опять потянуло на нецелые числа. Что поделать — я работаю над другим проектом, поэтому на полноценный этап я ничего не наскрёб, но работу потихоньку продолжаю. В прошлый раз я занимался оптимизацией — сделал итератор по UTF-8 строке.

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

<?
    class UtfReverseString implements Iterator
    {
        protected $str;   // строка
        protected $idx;   // бинарный индекс строки
        protected $pos;   // UTF-8-индекс
        protected $curend;  // бинарный указатель на конец текущего символа

        protected $idx_start; // бинарный индекс откуда стартуем
        protected $pos_start; // UTF-8-индекс откуда стартуем

        // проверка — байт не является началом символа
        protected function isNotBegin($ch)
        {
            return (ord($ch) & 192) == 128;
        }

        public function __construct($str, $pos_start = 0)
        {
            $len = strlen($str);

            $this->str = $str;
            $this->idx = strlen($str); // этот указатель будет уточнён тут же, ниже
            $this->pos = strlen(utf8_decode($str)) - 1 - $pos_start; // лучше использовать mb_strlen, если есть возможность

            while ($pos_start-- >= 0) {
                $this->curend = --$this->idx;

                while ($this->idx > 0 && $this->isNotBegin($this->str[$this->idx])) {
                    $this->idx--;
                }
            }

            $this->idx_start = $this->idx;
            $this->pos_start = $this->pos;
        }

        public function current()
        {
            return substr($this->str, $this->idx, $this->curend - $this->idx + 1);
        }

        public function key()
        {
            return $this->pos;
        }

        public function next()
        {
            $this->pos--;
            $this->curend = $this->idx - 1;

            for ($this->idx--; $this->isNotBegin($this->str[$this->idx]); $this->idx--);
        }

        public function rewind()
        {
            $this->idx = $this->idx_start;
            $this->pos = $this->pos_start;
        }

        public function valid()
        {
            return $this->idx >= 0;
        }

        public function __toString()
        {
            return $this->str;
        }
    }

Использовать так же просто, как и предыдущий, «прямой» итератор:

$str = new UtfReverseString('Привет', 1);

    foreach ($str as $ch) {
        echo $ch, ' ';
    }

Второй параметр указывает с какого символа (с конца) нужно начинать итерироваться.

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

Про бритьё морды лица

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

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

А так мне даже понравилось — станок не жужжит и его не надо заряжать или включать в розетку. Я бы перешёл.

В общем, месяц я честно вытерпел, а потом купил новую сетку и лезвия для своего «Брауна».

Добавлено позднее: примерно такая же история случилась и у Леонида Каганова.

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

Не, слова-паразиты никакие не паразиты, вот

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

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

Понимаете? Мы передаем смысл словами, лишенными смысла!

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

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

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

Я как-то не подозревал, что российские лингвисты не занимались такими исследованиями. Впрочем, лучше поздно, чем никогда, то немногое, что пока удалось узнать, описано в статье. Почитайте, занятно.

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

«Замедление времени»

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

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

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

Для таких моментов, по крайне мере в моём опыте, характерна крайняя сосредоточенность на какой-то одной детали: шарике, проводах, ещё чём-то. Никаких отвлечённых мыслей, уводящих в сторону ассоциативных цепочек, всё конкретно, но при этом, как я продемонстрировал, я способен ощущать красоту момента.

Жаль только я не знаю как гарантированно вызвать это чувство. Оно возникает в совершенно произвольные моменты и очень редко. За 1,5 года или около того, как я играю в настольный теннис, эта ситуация возникала 4…5 раз, а я играю каждый день, кроме выходных. Считается, что это чувство чуть ли не гарантированно возникает в моменты крайнего стресса, но я ничего подобного не испытывал в тех двух стрессовых, крайне опасных ситуациях в пещерах, скорее там я чувствовал предельную концентрацию на фоне понимания, что одна ошибка, и я умру.

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

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

Хорошо быть кошкой, хорошо собакою…

Читаю книгу Грегори Бейтсона «Экология разума», рекомендую, кстати. Умнейший был мужик.

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

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

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

Они начинают драться, чтобы понять было ли это всё всерьёз, обнаруживают, что не собираются убивать друг друга и получают ответ на вопрос.

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

Надо говорить.

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