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

Вообще, сейчас
Сайту скоро 10 лет, его посещают в день от 2 до 5 тысяч человек (в зависимости от дня недели), читают чуть меньше 90 тысяч человек в месяц (если верить статистике моего хостера).
И вот, я не придумал ничего лучше, чем испортить всем этим людям ко сроку жизнь — сменить дизайн сайта. Что получается, мне нравится, очень похоже на блог Ильи и сайт Тани Мисютиной.
Похоже по двум причинам:
P.S. Нашёл фото где я спрашиваю Вадима когда «Опера» будет поддерживать дробные проценты.
И о гаджетах
Искал электробритву, нашёл. Жена положила в ящик «Гаджеты». Всё правильно.
В Ярославле откопали письмо из коммунистического прошлого
…Когда в день тысячелетнего юбилея нашего славного города Ярославля вы, дети, внуки и правнуки наши, соберетесь,чтобы отметить этот знаменательный день, вспомните и о нас, живших в эпоху строительства коммунистического общества и боровшихся за его торжество…
…На этом замечательном празднике присутствуют старые большевики, современники нашего великого Ленина, люди, принимавшие участие в рождении нового, светлого мира в 1917 году. Присутствуют
герои-бойцы, отстоявшие свободу и могущество нашей страны в борьбе с капитализмом, присутствуют замечательные труженики, создающие материальные богатства…
И так далее. Там ещё много такого. К счастью, в моём родном городе капсулу то ли не достали, когда пришёл срок, то ли вскрыли
Ну и хорошо, иначе текст и этого послания висел бы сейчас на всех «фишках», очень гротескно сейчас выглядит пафос тех лет.
PHP, UTF-8, всё ещё строки: упрощаем задачу, часть I
Итак, я достаточно долго думал над задачей как мне заменить все операции получения символа из строки по индексу, чтобы понять насколько она сложна. Решить её можно, но скучно и не нужно. Я подумал, что очень вряд ли у меня в коде встречаются все возможные случаи, которые я рассмотрел в прошлый раз, поэтому я решил посмотреть что же у меня встречается на самом делом.
Около 3,5 тысяч. Я временами дьявольски усидчив, но рассматривать каждую строку из нескольких тысяч, это для меня перебор. Что же делать? Для начала мне хочется упростить своё регулярное выражение. Конечно, по синтаксису PHP имена переменных можно писать, например, Безусловно, моё регулярное выражение захватило очень много лишнего, надо эти ситуации обработать. Например, можно исключить добавление элемента в массив, это легко узнаваемая конструкция ($arr[] = $elm): Ситуация мало изменилась, давайте попробуем улучшить её значительно. Например, удалить все строки, где происходит только явное обращение к массиву: $arr[’index’] (но не $arr[’index’][0]): Ощутимая разница. Открываем получившийся файл и смотрим что бы мы ещё могли выкинуть… Продолжение следует, я сегодня рано встал, пойду домой.Что же дальше?
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
3670bolk@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
3357bolk@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…», переводчик, сквозь зевоту: «ага, щас попробую врубиться»
Переводчик, в сердцах: «о чём речь, вообще?!»
Бьёрн Страуструп
Иду на семинар Бьёрна Страуструпа (это автор Си++ и первый «компьютерный учёный»). Жестокий мир — начало в 7:30! В интернете никого нет, вы что, спите все что ли?
Мощь SVG и media queries
Вадим Макеев демонстрирует сейчас на фестивале «404» мощь SVG — картинка сама (через CSS media queries) изменяется для разных разрешений экрана, при масштабировании полноценное лого с текстом ужимается, текст сначала переносится, потом исчезает и остаётся один логотип.
Ребята, о таком применении SVG я даже и не думал, это очень круто.
Другой пример — внутри SVG выбирает один из внедрённых растров, опять же в зависимости от разрешения экрана (а можно, кстати, показывать специальную
Дополнено позднее: Вадим выложил слайды своего доклада (смотреть надо в «Опере»).
10.10.10 10:10:10
Проспал круглую дату — 10.10.10 10:10:10, после вчерашнего общения со знакомыми, незнакомыми и читателями, очень хотелось выспаться.
PHP, UTF-8, рассуждения по поводу строк

Работаю с низким приоритетом над автоматической заменой операций получения символа в строке по индексу на такую же операцию, но которая умела бы работать
В общем, задача сложная, я над ней думаю. Пока в сторону парсеров синтаксиса (colorer, Text_Highlighter и PHP tokinizer). Из исследования выяснилось, что все они могут мне помочь примерно в равной степени, так что я думаю, что возьму PHP tokinizer. К сожалению, ни один из парсеров не парсит PHP настолько удобно, чтобы избавить меня от всех проблем, так что я думаю над их решением. Когда у меня будет понимание как бороться со всеми проблемами, буду программировать.Что дальше?
Огрызки от собеседований
От собеседований, которые я недавно проводил, у меня осталась масса листочков с заковыристыми вопросами. Например, если человек говорил, что знает PHP на 10 из 10, то я ему давал, например, такой тест:
var_dump((bool) print_r(${strrev('SLABOLG')} = 1, $GLOBALS[1]{1} == (unset) b"1") == "00");Сказать есть ли тут ошибки, если нет, то что получим и что вообще тут происходит.
P.S. Я в Самаре, «Holiday Inn» отличный отель.
Воздушный бой на чистом HTML

Все в последнее время настолько в восторге от новых возможностей браузеров, что пишут игру за игрой на HTML5/CSS/JavaScript. Это всё скучно. Вчера перед сном я размышлял об игре на чистом HTML (даже без CSS), а сегодня, пока собирался в Самару, на 404fest, потихоньку её написал.
Встречайте — Pure HTML Air Fight. Написано на чистом HTML, без использования JavaScript, CSS и серверной логики. На сервере отрабатывает только скрипт, контролирующий введённый URL и запускающий игру, если URL ошибочен.
Задача классическая — попасть в пролетающий самолёт, внизу есть кнопка, запускающая ракету. Скорость самолёта и задержка меняется (на самом деле они жёстко зависят от момента пуска ракеты, у меня же чистый HTML, никакого рандома).
Кстати, в игре есть фоновый звук при попадании в самолёт.
Добавлено позднее: сайт под «хабрэффектом», так что может открываться крайне медленно, игра может вообще не работать.
Добавлено ещё позднее: некоторые ребята (в том числе в комментариях на «Хабре»)
Шуруп иногда
В лебедевском «мозге» сегодня «шуруп навсегда», вкрутить который можно, а выкрутить, якобы, нет.

Я всё детство провозился, помимо других занятий, с шурупами, болтами и гвоздями, а так же поверхностями, которыми их можно «украшать».
Ещё в детстве папа мне рассказал как достать шуруп или болт, если у него сорвана шляпка и отвёрткой не подступиться: либо выкручиваем его плоскогубцами, если остаток шляпки позволяет зацепиться, либо пытаемся (ножовкой, надфилем, зубилом) прорезать, пробить, проточить канавку для шлицевой (aka «обычной») отвёртки.
Этот «шуруп навсегда» я бы выкрутил плоскогубцами.
Кстати, я иногда не понимаю почему у лебедева некоторые здравые идеи в «поносе», а некоторые безумные в «мозге».
Как преобразовать пробелы в табуляции в вашей программе
По code guidelines PHPbb в коде нужно использовать табуляции, вместо пробелов. К сожалению, я об этом поздновато узнал, теперь надо всё, что я написал привести к правильному виду.
Оказывается, в Linux есть специальная утилита для этого — unexpand (находится в пакете coreutils). Кстати, есть и противоположная по действию утилита — expand.
Дома холодно
«Тепло подано ко всем потребителям. Жилой фонд, социальная сфера — школы, поликлиники, больницы — всё находится с теплом», — отметил Бирюков.
Он добавил, что, возможно, отопления еще нет в некоторых объектах потребительского рынка города, поскольку некоторые хозяйственники решили сэкономить.
(цитата из RIAN)
Чёртовы хозяйственники, решившие сэкономить! В нашём объекте потребительского рынка города холод собачий, даже обогреватель начинает сдавать позиции.
Попал на bash.org.ru
Процитировали на bash.org.ru (это из комментариев с «Хабра»).
PHP и 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, ' ';
}
Про бритьё морды лица
Так сложилось, что всю жизнь, с момента, когда это стало необходимостью, лицо я брею электробритвой. Когда в очередной раз пришло время менять на ней лезвия и сетку, я подумал, что это шанс испытать альтернативу — попробовать перейти на т. н. «станки».
Купил «Жилетт» с пятью лезвиями, решил месяц бриться только им. Вкратце: не понравилось. Нет, я даже ни разу не порезался. Основное неудобство в том, что стоит щетине отрасти чуть подлиннее, как лезвия перестают справляться, они не столько бреют, сколько выдирают волосы. Брить трёхдневную щетину бритвенным станком — пытка. По крайней мере для меня.
А так мне даже понравилось — станок не жужжит и его не надо заряжать или включать в розетку. Я бы перешёл.
В общем, месяц я честно вытерпел, а потом купил новую сетку и лезвия для своего «Брауна».
Добавлено позднее: примерно такая же история случилась и у Леонида Каганова.
Не, слова-паразиты никакие не паразиты, вот
По-русски все сложнее. Больше половины слов, используемых в естественной речи, не значит вообще ничего. В мировой лингвистике существует термин «дискурсивная лексика», или пустая форма.Это
что-то вроде «э», заполняющего речевую паузу, или того же «вот» — слова, позволяющие установить контакт с собеседником. Но это вовсене слова-паразиты, с которыми традиционно борются блюстители чистоты русской речи. Именно с их помощью, то есть дополняя слово мимикой, интонацией и жестом, мы передаем смысл.Понимаете? Мы передаем смысл словами, лишенными смысла!
У лингвистов
Меня иногда так сбивает то, что доносится из моего рта, это разительное отличие от правильных фраз, которые я вижу в книгах, что я замолкаю на середине фразы в попытках сообразить что я такое говорю.
Я
«Замедление времени»
Одна из тех вещей, за которые я люблю
Впервые я такое почувствовал, когда меня ударило в детстве током, я подключал к сети шаговый искатель, кажется. Всё было «на соплях», взялся двумя руками за два разных провода и ток пошёл по мне. Вообще, ток через сердце — это очень, крайне опасная ситуация. Меня спасло то, что, помимо меня, в цепи была ещё одна нагрузка, с куда меньшим, чем у меня, сопротивлением — двигатель шагового искателя.
Вот
Для таких моментов, по крайне мере в моём опыте, характерна крайняя сосредоточенность
Жаль только я не знаю как гарантированно вызвать это чувство. Оно возникает в совершенно произвольные моменты и очень редко. За 1,5 года или около того, как я играю в настольный теннис, эта ситуация возникала 4…5 раз, а я играю каждый день, кроме выходных. Считается, что это чувство чуть ли не гарантированно возникает в моменты крайнего стресса, но я ничего подобного не испытывал в тех двух стрессовых, крайне опасных ситуациях в пещерах, скорее там я чувствовал предельную концентрацию на фоне понимания, что одна ошибка, и я умру.
Там я отключался от помех и внешних деталей, за счёт этого, за счёт отсечения ненужной информации, возникало ощущение, что время идёт иначе. Но разница есть. Я мог вернуться в обычное восприятие одним усилием (или мог, например, смириться с неизбежным, что вернуло бы меня в привычное течение). По крайней мере мне так казалось. «Настоящее» замедление больше похоже на сон и не возникает даже мысли о том, чтобы попытаться вернуться.
Хорошо быть кошкой, хорошо собакою…
Читаю книгу Грегори Бейтсона «Экология разума», рекомендую, кстати. Умнейший был мужик.
Для меня в книге много нового, но особо (пока) меня заинтересовало следующее.
В книге описано как собаки выясняют, что не собираются драться. На первый взгляд, происходит это достаточно парадоксальным образом.
Для начала, надо
Они начинают драться, чтобы понять было ли это всё всерьёз, обнаруживают, что не собираются убивать друг друга и получают ответ на вопрос.
К чему я веду. Мы, люди, в отличие от собак, умеем общаться более конкретно, но не всегда это делаем.
Надо говорить.