Жена-дао

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

Мне-то казалось, что её больше обрадуют красивые марки (посылка была из Штатов).

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

Попробовал переползти с ноутбука на стационарное рабочее место

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

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

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

Как я работал за этой высокой клавиатурой? Тянуть за мышью — это же неудобно! А мониторы! Они у меня вертикальные, приходится задирать голову, у меня уже шея болит!

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

Inbox Zero

Zero-inbox (53.29КиБ)

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

Про «inbox zero» я услышал довольно давно, больше года — точно. Основная идея — в папке «inbox» («входящие») лежат только письма, которые требуют моей реакции, чаще всего их немного, они мозолят глаза и от них не спрятаться. Остальных письма «архивируются» (в почтовых клиентах есть кнопка «архивировать»), в клиенте «Thunderbird» такие письма лежат в папке «Архивы».

Недавно меня допекло — решил перейти на zero inbox, сразу скажу — не пожалел. Главное хранить во «входящих» только те письма, к которым планируется вернуться в скором времени, а не «возможно, когда-нибудь».

Это работает. Попробуйте.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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, ' ';
    }

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

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

Дома холодно

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

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

(цитата из RIAN)

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

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

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

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

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

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

Шуруп иногда

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

Шуруп (19.63КиБ)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 комментариев

10.10.10 10:10:10

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

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

Мощь SVG и media queries

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

И о гаджетах

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

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

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

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

404fest (51.01КиБ)

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

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

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

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

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

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

Тигры под Москвой, или Найден рассказ Кира Булычёва

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

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

Я в этом в самом деле не уверен. Но нельзя вносить смущение в мозг моего сына. Он — моя надежда и опора в старости.

— Выпей холодного тростникового сока, — говорю я сыну. — И не думай о тиграх.

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

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

Почему в гороскопы верят

Данный эффект также называют эффектом Форера, по имени психолога Бертрама Форера (Bertram R. Forer), который в 1948 году провёл психологический эксперимент, в котором показал действие этого эффекта.

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

Затем он попросил каждого студента по пятибалльной шкале оценить соответствие описания их личности действительности, — средней оценкой было 4,26.

На оценку точности описания студентов повлиял в том числе и авторитет преподавателя. Впоследствии эксперимент был повторён сотни раз.

Из «Википедии», статья «Эффект Форера».

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

Карго-культ личности

Это настолько смешно (для тех, кто понимает), что хочется процитировать полностью. Но только избранное:

Также пока меня не было (последние 2 недели я особо не писал в блог) удалось слить движок Nudnik.ru.

Движок очень хороший. Не побоюсь этого слова Мастер Смирнов постарался на славу (демо естественно у него на его сайте). Но также очень много файлов которые вообще не нужны.

Также есть аспекты в php когда функцию можно обработать в одну строчку, а он зачем-то бабахает в 5-ть. В результате все это добро весит 25 мб. Но это добро не грузит хостинг — это радует. А также он требует PHP 5 версии, а значит Смирнов «ухаживает» за своим детищем.

А также товарищ Болк постарался с движком. И естественно «намудрил» с ним, где разберется только он сам.

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

Кстати, Дим, а кто этот Кирилл Котиков, какой-то твой фанат?

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

Как пишется «переносица»?

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

ПУСТЬ НЕ УПОТРЕБЛЯЮТ МОЙ НИК ВСУЕ!

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

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

Иллюстрация не сохраниласьЧасы на электронных чернилах (38.91КиБ)

Phosphor e-ink — первые хорошие часы на электронных чернилах. Минеральное стекло, нержавеющая сталь, натуральная кожа. Хотеть!

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

Привет из будущего

Привет из будущего (13.81КиБ)

Для тех, кто будет читать этот пост в следующем году и позже: ребята, тут сейчас 2010-й.

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

Почему Ильич?

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

Сталина кто-нибудь называл «Виссарионович»? Хрущёва «Сергеевич»? Я как-то не слышал или это было не так распространено. А тут, куда ни глянь — «Заветы Ильича», «Лампочка Ильича», станция метро в Москве «Площадь Ильича», куча посёлков «Ильич» и так далее.

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

«Авианова» временно прекратила рейсы в Казань

Авиакомпания «Авианова» с 31 октября 2010 года прекращает выполнять рейсы Москва-Казань. […] Конечно же, мы надеемся вернуться на направление Москва — Казань так скоро, как это только будет возможно

Чёрт, наш посленовогодний рейс из Казани тоже отменили.

Добавлено позже: купили билеты у авиакомпании «Татарстан» (вот у кого отвратительный сайт-то), завтра надо будет заняться возвратом денег у «Авиановы».

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

Цирк «Дю Солей»

Сходили с женой на цирк «Дю Солей». Полный восторг. Обязательно сходите, если будет в вашем городе. Если нет денег, продайте что-нибудь ненужное, нет ненужного, продайте нужное, но сходите!

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

Новый спорт во сне

Должен заметить, что цирк «Дю Солей» интересен театризированным действом, а не трюками, если театр и вы понятия несовместимые, есть вероятность, что вам не нужно ходить в этот цирк.

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

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

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

Очень трудный спорт, кстати. Я пробовал обе роли.

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

Вышла альфа «Оперы» 11 с расширениями

Это очень хорошая новость — вышла 11-я «Опера» с поддержкой расширений. Например, уже появилось расширение «Opera to Phone», к которому я привык на «Хроме».

Оно позволяет одним нажатием кнопки открыть в телефоне (на «Андроиде») ту же страницу, что сейчас открыта в браузере на компьютере, чтобы, например, продолжить её чтение уже с мобильника.

Из других хороших новостей — появилась поддержка WebSockets.

Добавлено: а ещё можно добавить сервисы «Яндекса» — пробки, погоду и отзывы о текущей странице.

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

Не покупайте билеты на околоновогодние рейсы у «Авианова»

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

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

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

Два билета обошлись сегодня в 6376 рублей, это самое дешёвое предложение.

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

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).

Первая операция, которую вам нужно сделать ещё до запуска парсера — это запустить следующий скрипт. У меня парсер работает с UTF-8, а исходники у меня пока ещё в CP1251. Так что парсер сначала перекодирует код в UTF-8, потом обратно в CP1251. Но я беспокоился — не испортит ли двойная перекодировка что-то в исходниках.

Так что я перекодировал код туда и обратно и сравнил что получилось:

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);
    }

Добавлено позже: нашёл ещё два бага: неверно отрабатываются «$prop[$idx]->value» и «$str[$idx] ==». Второе надо править в регулярном выражении. Я их править не буду, они запросто ищутся утилитой «grep» и правятся руками. Кроме того, не заменяются переменные в heredoc (мне это не нужно).

Конструкции 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

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

Штраф за сжигание листвы

Давайте откроем Закон московской области от 30 ноября 2004 года «О государственном административно-техническом надзоре и административной ответственности за правонарушения в сфере благоустройства, содержания объектов и производства работ на территории Московской области» и прочитаем часть пятую статьи 11 из него:

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

на граждан — в размере от пятисот до одной тысячи рублей; на должностных лиц — в размере от одной тысячи до пяти тысяч рублей

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

Товарищи курильщики, ну вы поняли, да?

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

«Аэрофлот» отменил рейс в Казань 31-го

И «Аэрофлот» туда же, вслед за «Авиановой» — тоже отменил околоновогодний рейс. 31-го мы должны были вылетать «Аэрофлотом», чем лететь теперь непонятно. Ни одного разумного рейса не осталось. Есть только «Ютэйр» ЮТ343, но он прилетает в Казань в 23:10, так что есть вероятность встретить Новый год в воздухе. Кроме того, билет обойдётся тысяч на 7 (!) дороже.

В чём смысл тогда покупать билеты заранее? Это какая-то лотерея.

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

Квартира, прогресс

Квартира (70.17КиБ)

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

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

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

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

Stoyan Stefanov

Стоян Стефанов (21.39КиБ)

Стоян Стефанов (архитектор YSlow, автор нескольких книг по JavaScript и ряда любопытных исследований) сейчас в «Яндексе» рассказывает лекцию. К сожалению, я пойти не смог, а жаль:

— Болк, а ты чего не на Стояне? Он тут тебя упомянул =)
— Э… как это?
— Он щас в Яндексе читает лекцию, ну и типа сказал вот крутой чувак (и твоего блога скриншот)

Hello, Stoyan! Sorry I could not attend your lecture.

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

IE9 и CSS3 2D Transforms

Появился Internet Explorer 9 PP6, из интересного — появилась поддержка 2D-трансформаций из CSS3 (свойства -ms-transform и -ms-transform-origin).

Кроме того, появилась поддержка семантических тегов HTML5 (section, nav, article и так далее). Раньше при разборе дерева элементы, содержащие эти теги наследовались от HTMLUnknownElement, теперь — от HTMLElement.

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

Flashblock в «Опере»

Оказывается, в «Опере» 10.50 и выше есть встроенный аналог плагина «Flashblock» для Firefox — опция «opera:config#UserPrefs|EnableOnDemandPlugin» (вставьте в адресную строку и нажмите Enter, увидите соответствующую настройку).

Опция включает функционал, который мне хотелось включить по-умолчанию с тех пор как я увидел Opera Turbo — в этом режиме Flash не загружается до тех пор, пока на него не кликнешь.

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

ICQ опять пытается стряхнуть альтернативные клиенты

На данный момент не подключаются QIP, Jimm и Miranda (возможно ещё какие-то клиенты), выдаётся сообщение «The server did not accept this client version». R&Q и Infium работают.

Добавлено позднее: удалось соединиться через Миранду 0.9.9b1, выключив «Secure connection (SSL)».

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

Латинский шрифт цифр

Латинский шрифт (2.52КиБ)

Сайт «Трансаэро» просит ввести цифры телефона «латинским шрифтом».

Сегодня ходил в «Аэрофлот», оформлял возврат денег за отменённый новогодний рейс в Казань, в итоге, вылетаем утром 31-го рейсом «Трансаэро».

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

Телефон для пожилых

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

Мы бабушке жены подарили на прошлый день рождения телефон Just5 CP9, я пытался научиться им пользоваться и научить бабушку (77 лет). Нашим мамам и папам такие не нужны, у нас у всех родителей нормальные современные модели.

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

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

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

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

Это всё. Телефон всё равно будут настраивать родственники, число важных абонентов ограничено, по остальным номерам (в коммунальные службы, например), бабушка всё равно будет звонить со стационарного (дешевле) или пойдёт ногами.

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

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

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

← сюда туда →