Жена-дао
Жена у меня скрапбукингом занимается, если кто не знает (это открытки ручной работы и всё такое). Так что она одна из немногих людей, которые буду рады если притащить домой пустую почтовую коробку из «такого плотного картона».
Попробовал переползти с ноутбука на стационарное рабочее место
Около полугода я насильно заставлял себя пользоваться только ноутбуком, ограничивал себя и старался не подключаться к внешним клавиатуре, мышке и мониторам.
Научился. Я очень комфортно чувствую себя за ноутом, меня перестал раздражать тачпад, «маленький экран» (который для меня сейчас вполне достаточен), то что его нужно класть на колени и так далее.
Сегодня я решил, что я достаточно научился работать за ноутбуком, чтобы пересесть обратно.
Как я работал за этой высокой клавиатурой? Тянуть за мышью — это же неудобно! А мониторы! Они у меня вертикальные, приходится задирать голову, у меня уже шея болит!
Москва → Самара → Москва
C восьмого по одиннадцатое октября в Самаре.
Inbox Zero

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

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

Все в последнее время настолько в восторге от новых возможностей браузеров, что пишут игру за игрой на HTML5/CSS/JavaScript. Это всё скучно. Вчера перед сном я размышлял об игре на чистом HTML (даже без CSS), а сегодня, пока собирался в Самару, на 404fest, потихоньку её написал.
Встречайте — Pure HTML Air Fight. Написано на чистом HTML, без использования JavaScript, CSS и серверной логики. На сервере отрабатывает только скрипт, контролирующий введённый URL и запускающий игру, если URL ошибочен.
Задача классическая — попасть в пролетающий самолёт, внизу есть кнопка, запускающая ракету. Скорость самолёта и задержка меняется (на самом деле они жёстко зависят от момента пуска ракеты, у меня же чистый HTML, никакого рандома).
Кстати, в игре есть фоновый звук при попадании в самолёт.
Добавлено позднее: сайт под «хабрэффектом», так что может открываться крайне медленно, игра может вообще не работать.
Добавлено ещё позднее: некоторые ребята (в том числе в комментариях на «Хабре»)
Огрызки от собеседований
От собеседований, которые я недавно проводил, у меня осталась масса листочков с заковыристыми вопросами. Например, если человек говорил, что знает PHP на 10 из 10, то я ему давал, например, такой тест:
var_dump((bool) print_r(${strrev('SLABOLG')} = 1, $GLOBALS[1]{1} == (unset) b"1") == "00");Сказать есть ли тут ошибки, если нет, то что получим и что вообще тут происходит.
P.S. Я в Самаре, «Holiday Inn» отличный отель.
PHP, UTF-8, рассуждения по поводу строк

Работаю с низким приоритетом над автоматической заменой операций получения символа в строке по индексу на такую же операцию, но которая умела бы работать
В общем, задача сложная, я над ней думаю. Пока в сторону парсеров синтаксиса (colorer, Text_Highlighter и PHP tokinizer). Из исследования выяснилось, что все они могут мне помочь примерно в равной степени, так что я думаю, что возьму PHP tokinizer. К сожалению, ни один из парсеров не парсит PHP настолько удобно, чтобы избавить меня от всех проблем, так что я думаю над их решением. Когда у меня будет понимание как бороться со всеми проблемами, буду программировать.Что дальше?
10.10.10 10:10:10
Проспал круглую дату — 10.10.10 10:10:10, после вчерашнего общения со знакомыми, незнакомыми и читателями, очень хотелось выспаться.
Мощь SVG и media queries
Вадим Макеев демонстрирует сейчас на фестивале «404» мощь SVG — картинка сама (через CSS media queries) изменяется для разных разрешений экрана, при масштабировании полноценное лого с текстом ужимается, текст сначала переносится, потом исчезает и остаётся один логотип.
Ребята, о таком применении SVG я даже и не думал, это очень круто.
Другой пример — внутри SVG выбирает один из внедрённых растров, опять же в зависимости от разрешения экрана (а можно, кстати, показывать специальную
Дополнено позднее: Вадим выложил слайды своего доклада (смотреть надо в «Опере»).
Бьёрн Страуструп
Иду на семинар Бьёрна Страуструпа (это автор Си++ и первый «компьютерный учёный»). Жестокий мир — начало в 7:30! В интернете никого нет, вы что, спите все что ли?
Бьёрн Страуструп в России
Вернулся с семинара, было интересно, но организация — полный кошмар. Официальное начало в 8:30, Бьёрн получил доступ к микрофону примерно в 10, поесть было негде, за исключением крошечного, сразу забившегося буфета, микрофоны желающим задать вопрос приносили с большим опозданием или вообще не приносили, ноутбук для демонстраций слайдов несколько раз «залипал».
Но самое главное — синхронный перевод. О, я получил удовольствие. Избранные фразы из моего твиттера:
Переводчик на семинаре Страуструпа несёт такой бред,что я не знаю что интереснее — смысл доклада или горячный бред в наушнике.
Переводчик: «когда мы своппируем поинтеры…»
Ещё: «для начала я тайпирую аллокаторы…»
Бьёрн рассказывает про сборщик мусора (garbage collector), переводчик долго молчит, потом: «тут у нас никакого мусора».
«Что касается магнитуды… величины фолт толерантности» — бубнит в наушник переводчик.
«Чё-то по поводу исключений…ля-ля, тополя». Ну, переводчик в ударе.«У нас есть сингллинкед и анордеред массивы»,.. Даль вертится в гробу.
Бьёрн: «ок…», заметьте насколько переводчик более поэтичен: «да, давайте я соберусь с мыслями».
Переводчик переводит вопрос из зала: «ваша революция была давно, а родите нам ещё
чё-нить, до того как умрёте».Бьёрн (компьютер со слайдами опять сломался): «I don’t belive it», переводчик: «какого х…»
Бьёрн: «I think so…», переводчик, сквозь зевоту: «ага, щас попробую врубиться»
Переводчик, в сердцах: «о чём речь, вообще?!»
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
В Ярославле откопали письмо из коммунистического прошлого
…Когда в день тысячелетнего юбилея нашего славного города Ярославля вы, дети, внуки и правнуки наши, соберетесь,чтобы отметить этот знаменательный день, вспомните и о нас, живших в эпоху строительства коммунистического общества и боровшихся за его торжество…
…На этом замечательном празднике присутствуют старые большевики, современники нашего великого Ленина, люди, принимавшие участие в рождении нового, светлого мира в 1917 году. Присутствуют
герои-бойцы, отстоявшие свободу и могущество нашей страны в борьбе с капитализмом, присутствуют замечательные труженики, создающие материальные богатства…
И так далее. Там ещё много такого. К счастью, в моём родном городе капсулу то ли не достали, когда пришёл срок, то ли вскрыли
Ну и хорошо, иначе текст и этого послания висел бы сейчас на всех «фишках», очень гротескно сейчас выглядит пафос тех лет.
И о гаджетах
Искал электробритву, нашёл. Жена положила в ящик «Гаджеты». Всё правильно.
404fest: было здорово!
Всё забываю написать, на «404» в Самаре было очень здорово. И уровень докладов, и развлекательная программа, и люди! Увидел старых друзей и знакомых — Илью Бирмана, Вадима Макеева, Сергея Чикуёнка, ребят из «knock knock» и многих других. Приобрёл новых знакомых и, как я надеюсь, друзей.

Вообще, сейчас
Сайту скоро 10 лет, его посещают в день от 2 до 5 тысяч человек (в зависимости от дня недели), читают чуть меньше 90 тысяч человек в месяц (если верить статистике моего хостера).
И вот, я не придумал ничего лучше, чем испортить всем этим людям ко сроку жизнь — сменить дизайн сайта. Что получается, мне нравится, очень похоже на блог Ильи и сайт Тани Мисютиной.
Похоже по двум причинам:
P.S. Нашёл фото где я спрашиваю Вадима когда «Опера» будет поддерживать дробные проценты.
Тигры под Москвой, или Найден рассказ Кира Булычёва
— Отец, — сказал сын, садясь у моих ног. — У нашей плантации появился тигр. Он уже украл двух рабочих.
— Что делать, сын, — отвечаю я, как всегда, мудро. — Тигры всегда водились под Москвой. Испокон веку.
Я в этом в самом деле не уверен. Но нельзя вносить смущение в мозг моего сына. Он — моя надежда и опора в старости.
— Выпей холодного тростникового сока, — говорю я сыну. — И не думай о тиграх.
«Новая газета» опубликовала найденный в архиве Кира Булычёва рассказ «Шестьдесят лет спустя». На официальном сайте фантаста есть подтверждение, значит не фейк.
Почему в гороскопы верят
Данный эффект также называют эффектом Форера, по имени психолога Бертрама Форера (Bertram R. Forer), который в 1948 году провёл психологический эксперимент, в котором показал действие этого эффекта.
Он дал своим студентам тест личности, чтобы по результатам тестирования предоставить им анализ их личности. Однако вместо настоящего анализа, он давал всем один и тот же расплывчатый текст, взятый из гороскопа.
Затем он попросил каждого студента по пятибалльной шкале оценить соответствие описания их личности действительности, — средней оценкой было 4,26.
На оценку точности описания студентов повлиял в том числе и авторитет преподавателя. Впоследствии эксперимент был повторён сотни раз.
Из «Википедии», статья «Эффект Форера».
Карго-культ личности
Это настолько смешно (для тех, кто понимает), что хочется процитировать полностью. Но только избранное:
Также пока меня не было (последние 2 недели я особо не писал в блог) удалось слить движок Nudnik.ru.
Движок очень хороший. Не побоюсь этого слова Мастер Смирнов постарался на славу (демо естественно у него на его сайте). Но также очень много файлов которые вообще не нужны.
Также есть аспекты в php когда функцию можно обработать в одну строчку, а он
зачем-то бабахаетв 5-ть. В результате все это добро весит 25 мб. Но это добро не грузит хостинг — это радует. А также он требует PHP 5 версии, а значит Смирнов «ухаживает» за своим детищем.А также товарищ Болк постарался с движком. И естественно «намудрил» с ним, где разберется только он сам.
Кстати, руку могу дать на отсечение, что движок Димы весит меньше сотни кг, написан без всякого форматирования и не использует буквально ничего, что появилось в PHP5.
Кстати, Дим, а кто этот Кирилл Котиков,
Как пишется «переносица»?
Первые часы с дисплеем из электронных чернил
Phosphor
Привет из будущего

Для тех, кто будет читать этот пост в следующем году и позже: ребята, тут сейчас
Как правильно убить себя фанеркой (видеоинструкция)
Почему Ильич?
Неожиданно задумался — как там получилось, что на фоне всеобщего обожания Ленина (идеологическая обработка была так сильна, что в детстве я сильно расстраивался, что Ленин не дожил до наших дней), Ленина называют по отчеству — Ильич?
Сталина
«Авианова» временно прекратила рейсы в Казань
Авиакомпания «Авианова» с 31 октября 2010 года прекращает выполнять рейсы
Москва-Казань. […] Конечно же, мы надеемся вернуться на направление Москва — Казань так скоро, как это только будет возможно
Чёрт, наш посленовогодний рейс из Казани тоже отменили.
Добавлено позже: купили билеты у авиакомпании «Татарстан» (вот у кого отвратительный
Цирк «Дю Солей»
Сходили с женой на цирк «Дю Солей». Полный восторг. Обязательно сходите, если будет в вашем городе. Если нет денег, продайте
Новый спорт во сне
Должен заметить, что цирк «Дю Солей» интересен театризированным действом, а не трюками, если театр и вы понятия несовместимые, есть вероятность, что вам не нужно ходить в этот цирк.
После того, что там творилось, было бы странно, если бы мне не приснилось
Вкратце, идея заключается в том, чтобы как можно дальше кинуть копьё. Но если бы этим всё ограничилось, я бы не стал об этом писать.
Бросание копья у меня во сне — результат усилий двух людей. На острие копья есть колёсико, один человек бросает копьё в щит другого, задача второго — «принять» копьё на щит, чтобы оно скользнуло и добавить ему скорости.
Очень трудный спорт, кстати. Я пробовал обе роли.
Вышла альфа «Оперы» 11 с расширениями
Это очень хорошая новость — вышла
Оно позволяет одним нажатием кнопки открыть в телефоне (на «Андроиде») ту же страницу, что сейчас открыта в браузере на компьютере, чтобы, например, продолжить её чтение уже с мобильника.
Из других хороших новостей — появилась поддержка WebSockets.
Добавлено: а ещё можно добавить сервисы «Яндекса» — пробки, погоду и отзывы о текущей странице.
Не покупайте билеты на околоновогодние рейсы у «Авианова»
Как я недавно писал «Авианова» отменила несколько десятков рейсов в Казань, мы с женой тоже попали под раздачу. В прошлом году было то же самое — почти 100 рейсов отменено примерно в это же время.
Но в прошлом году мы билет не покупали. Вывод, кажется, однозначный — не надо покупать и в следующем.
Обидно
Два билета обошлись сегодня в 6376 рублей, это самое дешёвое предложение.
PHP, UTF-8: шестой этап, она же «строки, часть II». Заменяем
В прошлой части я пытался упростить себе задачу, посчитав сколько различных видов операций получения символа из строки по индексу есть у нас в коде. Но для того, чтобы подсчитать эти ситуации, нужен парсер, который эти случаи выделит.
Я такой парсер начал писать несколько дней назад и очень быстро увидел, куда меня этот путь ведёт. К сожалению,
Код я выкинул и начал писать заново, основываясь на токенах (лексемах), которое выдаёт встроенное в язык API токинайзера. По ходу процесса я часто уточнял случаи и производил тестирование. Получился довольно неряшливый парсер, к тому же с некоторыми багами, которые я счёл несущественными. Например, не обрабатывается ситуация isset($var, $var[$idx]).
В PHP isset (а так же empty и unset) — конструкции, а не функции и принимают на вход только переменные. У меня получение символа по индексу заменяется на Utf::get(…), а внутри строки на другую конструкцию — $_ENV[0x5f3759df]->get(…), так что если произойдёт замена внутри isset, будет синтаксическая ошибка.
Т. е. у меня в коде, внутри файла с классом Utf есть ещё и такая строка — «$_ENV[0x5f3759df] = new Utf();». $_ENV я выбрал за то, что это переменная (а переменную внутри строки проще заменять на другую переменную, пусть и с вызовом метода, PHP это позволяется) и это, в терминах PHP, «суперглобальный» массив, то есть он доступен отовсюду.
Итак, я сказал, что парсер имеет баги, но на весь довольно большой код у меня было всего четыре случая, правда один довольно странный — пропала треть исходного кода, так что, если будете применять — сохраните оригинальный код (мой лежал в SVN).
Первая операция, которую вам нужно сделать ещё до запуска парсера — это запустить следующий скрипт. У меня парсер работает
Так что я перекодировал код туда и обратно и сравнил что получилось:
for file in $(find -name '*.php' -or -name '*.inc' -or -name '*.tpl'); do
sum_new=`iconv -fcp1251 -tutf8 "$file" | iconv -futf8 -tcp1251 | md5sum -b | cut -d' ' -f1`
sum_orig=`md5sum -b "$file" | cut -d' ' -f1`
if [ $sum_new != $sum_orig ]; then
echo $sum_new $sum_orig $file
fi
doneУ меня ничего не поломалось, так что я спокойно запустил пасер. После запуска я проверил синтаксис скриптов интерпретатором и вручную избавил четыре найденные ошибки:
find -name '*.php' -or -name '*.inc' -or -name '*.tpl' | xargs php -lПосле всех запусков проект выглядит рабочим, но в понедельник я обязательно буду тестировать весь проект.
Добавлено позднее: а вот как выглядит метод get в классе Utf:
static public function get($str, $index)
{
if (!is_scalar($str)) {
return isset($str[$index]) ? $str[$index] : null;
}
return self::substr($str, $index, 1);
}Добавлено позже: нашёл ещё два бага: неверно отрабатываются
Конструкции heredoc я нашёл при помощи «grep -FR ’<<<’ *» и просмотрел их все, их было очень мало и ни одна из них не содержала переменных.
Добавлено ещё позже: опаснее оказалась ситуация, которую просто так можно и не заметить: замена вызова func($var[$index]) на func(Utf::get($var, $index), где прототип func описан как func(&$var). Синтаксис PHP вполне допускает такие ситуации, а на деле в массив могут не попасть изменения, которые должны были переданы быть по ссылке.
Способов исправить такую ситуацию два. Первый — логгировать все вызовы Utf::get, которые применяются к массивам и править их на получение переменной по индексу. Второй — найти и просмотреть все такие ситуации. Я выбрал второй способ:
find \( -name '*.php' -or -name '*.tpl' -or -name '*.inc' \) |
xargs egrep -oh 'ion[\t ]+\w+[\t ]*([^{]+' | awk -F'[( ]' '/&\$/{print tolower($2)}' |
sort -u | egrep -v '^preg_' | xargs -I{} egrep -iR --exclude-dir=.svn {}'[\t ]*(.*?Utf::get' *Этот скрипт (который очень долго работает) показывает все подозрительные строки (у меня их 7 оказалось), их надо просмотреть, выявить потенциально проблемные и поправить, если проблема действительно есть.
И ещё позже: так же есть набор встроенных функций, которые используют передачу массива по ссылке, я их нашёл вот таким способом:
(cat<<FUNCS
'\b(?:array_multisort|array_pop|array_push|\
array_replace_recursive|array_replace|\
array_shift|array_splice|\
array_unshift|array_walk_recursive|\
array_walk|arsort|asort|current|each|\
end|key|krsort|ksort|natcasesort|natsort|\
next|pos|prev|reset|rsort|shuffle|\
sort|uasort|uksort|usort)[ \t]*\([\t ]*[^$)]'
FUNCS
) | xargs -I[] find \( -name '*.tpl' -or -name '*.php' -or -name '*.inc' \) -exec \
egrep [] {} \; -printШтраф за сжигание листвы
Давайте откроем Закон московской области от 30 ноября 2004 года «О государственном
Сжигание листвы, травы, тополиного пуха, частей деревьев и кустарников, других остатков растительности в местах общественного пользования и на территории хозяйствующих субъектов, за исключением специально отведенных мест, влечет наложение административного штрафа:
на граждан — в размере от пятисот до одной тысячи рублей; на должностных лиц — в размере от одной тысячи до пяти тысяч рублей
Теперь вспоминаем что такое сигарета — бумажный цилиндр, внутри которого находится измельчённый табак для курения. Табак — это травянистое растение, трава. Высушенный и измельчённый табак — явно остатки растительности.
Товарищи курильщики, ну вы поняли, да?
«Аэрофлот» отменил рейс в Казань 31-го
И «Аэрофлот» туда же, вслед за «Авиановой» — тоже отменил околоновогодний рейс.
В чём смысл тогда покупать билеты заранее? Это
Квартира, прогресс

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

Стоян Стефанов (архитектор YSlow, автор нескольких книг по JavaScript и ряда любопытных исследований) сейчас в «Яндексе» рассказывает лекцию. К сожалению, я пойти не смог, а жаль:
— Болк, а ты чего не на Стояне? Он тут тебя упомянул =)
— Э… как это?
— Он щас в Яндексе читает лекцию, ну и типа сказал вот крутой чувак (и твоего блога скриншот)
Hello, Stoyan! Sorry I could not attend your lecture.
Вкусни! Сочни!

IE9 и CSS3 2D Transforms
Появился Internet Explorer 9 PP6, из интересного — появилась поддержка
Кроме того, появилась поддержка семантических тегов HTML5 (section, nav, article и так далее). Раньше при разборе дерева элементы, содержащие эти теги наследовались от HTMLUnknownElement, теперь — от HTMLElement.
Flashblock в «Опере»
Оказывается, в «Опере» 10.50 и выше есть встроенный аналог плагина «Flashblock» для Firefox — опция «opera:config#UserPrefs|EnableOnDemandPlugin» (вставьте в адресную строку и нажмите Enter, увидите соответствующую настройку).
Опция включает функционал, который мне хотелось включить
ICQ опять пытается стряхнуть альтернативные клиенты
На данный момент не подключаются QIP, Jimm и Miranda (возможно ещё
Добавлено позднее: удалось соединиться через Миранду 0.9.9b1, выключив «Secure connection (SSL)».
Латинский шрифт цифр

Сайт «Трансаэро» просит ввести цифры телефона «латинским шрифтом».
Сегодня ходил в «Аэрофлот», оформлял возврат денег за отменённый новогодний рейс в Казань, в итоге, вылетаем утром
Телефон для пожилых
На «Хабре» появилась обзорная статья «Сравнительный обзор телефонов с большими кнопками», это телефоны для наших дедушек и бабушек.
Мы бабушке жены подарили на прошлый день рождения телефон Just5 CP9, я пытался научиться им пользоваться и научить бабушку (77 лет). Нашим мамам и папам такие не нужны, у нас у всех родителей нормальные современные модели.
Основной вывод по телефону — внутренний интерфейс сложен даже для меня, последовательные операции нелогичны и в них несколько лишних шагов. Кроме того, не нужны SMS — в таком возрасте и в таком состоянии здоровья, читать и набирать их почти невозможно, радио тоже можно удалить, по крайней мере, пока его настройка и пользование им не упростится в интерфейсе на порядки. В дизайне корпуса важно только одно — чтобы удобно было держать и всё было под рукой.
Идеальный интерфейс для такой возрастной категории, в моём представлении, это аккуратный ухватистый «кирпич», без экрана, с вертикальным рядом крупных кнопок, с обычными подписями абонентов сделанными ручкой на сменной бумаге. Для исходящего звонка надо нажать на кнопку, при входящем кнопка подсвечивается.
Для удобства подсветка должна включаться (если нет входящего), когда телефон берут в руку (сенсорная панель в виде металлической пластины сзади корпуса достаточна) и работать телефон должен от аккумулятора не меньше недели, лучше — месяц или два.
При разрядке (когда осталась пара дней) — мигающая лампочка в недрах гнезда зарядки. Было бы круто сделать снизу кучу разъёмов зарядок, под все эти бесчисленные «самсунги», «нокии» и так далее, чтобы зарядка подошла любая. Чтобы любая зарядка, подаренная внуком, от старой модели телефона подошла и было чем зарядить в гостях.
Это всё. Телефон всё равно будут настраивать родственники, число важных абонентов ограничено, по остальным номерам (в коммунальные службы, например), бабушка всё равно будет звонить со стационарного (дешевле) или пойдёт ногами.
Телефон в таком виде вполне под силами изготовить и нашей промышленности. Правда я не продумал как программировать номера,
Опционально можно оставить фонарик, который сейчас есть в телефонах Just5, но кнопка его включения должна быть здоровой и с понятной крупной пиктограммой, изображающий олдскульный фонарик.