Google Translate Rap

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

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

Нужен Flash.

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

MySQL и строки

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

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

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

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

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

PCRE 8.10

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

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

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

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

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

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

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

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

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

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

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

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

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

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

-25°С

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

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

PHP, UTF-8: восьмой этап, заключительный

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

Что же дальше?
Последний этап — много ручной мороки, всякие мелочи и прочие вещи подобного уровня.

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

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

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

Для другой операции, нам понадобится четыре метода в классе работы с UTF (напоминаю, что константа ON этого класса определяет включена ли поддержка UTF): метод charset возвращает «windows-1251» или «UTF-8» в зависимости от флага ON, метод charsetCP возвращает «CP1251» или «UTF8», метод from1251 перекодирует из cp1251 в UTF-8, если ON установлен в false, иначе возвращает строку как есть, метод to1251 перекодирует обратно, если ON установлен в false, иначе возвращает строку как есть.

Замены очевидны: везде, где в коде встречается «windows-1251» я поставил вызов метода charset, там где cp1251 — charsetCP, там где используется перекодирование (функции iconv, mb_convert_encoding, recode, recode_string) вызываем соответственно from1251 или to1251.

Потом нужно проверить все места, где встречаются вызовы chr и ord («egrep ’\\b(ord|chr)’ -R .») и проверить не нужно ли переписать какие-то места (я не помню писал ли я об этом уже).

После этого осталось только перекодировать исходный код:

# вот эти файлы перекодировать не надо, они у меня уже в UTF-8
SKIPIT='./php/Utf.php|./php/UtfReverseString.php|./php/UtfString.php'
tmp=`tempfile`

for line in $(find -name '*.php' -or -name '*.tpl' -or -name '*.inc' | egrep -v "$SKIPIT"); do
    iconv -fcp1251 -tutf8 "$line" -o "$tmp"
    [ -e "$tmp" ] && mv -f "$tmp" "$line"
done

И базу:

mysqldump -pпароль -uпользователь --add-drop-table --create-options --default-character-set=utf8 --order-by-primary -q база |
sed -e 's/cp1251;$/utf8;/mg' |
mysql -pпароль -uпользователь база

В процессе пуска проекта выяснилась ещё одна немаловажная подробность (спасибо Саше Покатилову): оказывается, несмотря на то, что установки локали (setlocale) никак не влияет на функции сортировки в PHP, она влияет на некоторые функции работы с файлами (dirname, basename и некоторые другие), вот цитата из описания функции dirname:

dirname() is locale aware, so for it to see the correct directory name with multibyte character paths, the matching locale must be set using the setlocale() function.

Поэтому не забывайте выставлять локаль, если пользуетесь этими функциями.

В общем-то, это всё, после выполнения всех описанных мною операций, проект заработал.

Дополнено: внезапно нашлись неприятные грабли, будьте осторожны: функция preg_match_all (и preg_match) с ключём PREG_OFFSET_CAPTURE возвращает бинарное смещение в строке (т. е. указывающее не на байт, а на символ), даже в UTF-режиме со включенным «глаголом» UCP.

Я поступил просто — написал простую функцию, которая корректирует выходные значения. Идея простая: отрезаем при помощи substr строку до смещения, потом измеряем её UTF-8-длину. Тут важно не забыть, что preg_match может вернуть смещение -1, если совпадение было пустым.

Еще позднее: оказывается и параметр offset (последний параметр в preg_match и preg_match_all) работает с бинарным смещением, а не с UTF-8.

И ещё позже: а вот вам ещё сюрприз: модуль Multibyte String считает, что кодировка UTF-16 это UCS-2BE, тогда как iconv кодирует правильно.

И ещё сильно позже: strftime тоже использует локаль.

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

Риторический вопрос

Иногда сталкиваюсь с тем, что люди не понимают что такое «риторический вопрос». Фразу «риторический вопрос не требует ответа» воспринимают как определение, тогда как это свойство.

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

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

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

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

Стоп-лист доменной зоны .рф

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

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

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

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

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

Видеокамеры и фотоаппараты видят ИК-излучение

Смотрим на пульт (21.48КиБ)

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

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

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

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

Макретинговое ISO

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

Вчера в какой-то статье как раз про CHDK прочитал про «маркетинговое ISO», например у фотоаппарата Canon Mark II 5D «маркетинговое» ISO — 100, реальное — 73.

Я тогда не понял что это и даже удивился — зачем кому-то специально завышать чувствительность, если во всех цифровых аппаратах она регулируется? Ответ нашёлся в прекрасной статье «Разумно о фото-2009» (рекомендую, правда мне пока далеко не всё понятно):

Зачем нужна «низкая» чувствительность, если «высокая» удобнее — и выдержки короче, и диафрагму можно зажать, и никаких проблем со смазом, и в сумерках и помещении без вспышки… Разгадка проста — на самом деле у матрицы всего ОДНА чувствительность — та самая «низкая», а все остальные получаются путём усиления сигнала.

То есть на самом деле чувствительность матрицы Canon Mark II 5D — 73, максимальная ISO в 25600, которую выжимает этот дорогущий аппарат, достигается путём простого усиления сигнала с матрицы, что увеличивает так же шумы.

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

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

если у камеры А матрица по площади в N раз меньше матрицы камеры Б, то для достижения одинакового уровня шумов на камере Б нужно выставлять ISO в N раз больше, чем на камере А

Кстати, физические размеры матрицы влияют и на размер фотоаппарата, это одна из причин почему наша миниатюрная «мыльница» Sony Cybershot DSC-N1 много хуже, чем здоровый Canon EOS 550D, который у нас с женой сейчас — у первой матрица площадью 38 мм², у второго — примерно 340 мм².

Отсюда и компактность объективов — чем меньшее пятнышко нужно освещать, тем меньше размер объектива. Впрочем, не буду пересказывать статью. Вывод один: миниатюрность = смерть качеству.

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

Туляки подковали-таки блоху!

Микроскопическое изображение тонких прозрачных нитей или волокон на светлом круглом фоне, окружённом тёмной рамкой с красным пятном слева.
Вид через окуляр микроскопа на прозрачное насекомое с длинными ногами на светлом фоне.
Мелкий светлый клещ, видимый через объектив микроскопа на тёмном фоне с красным свечением.

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

На снимках — натуральная блоха с четырьмя подковами, каждая крепится тремя гвоздями, каждая подкова размером 0,045×0,05 мм.

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

Добавлено: выложил остальные фотки из тульского государственного музея оружия.

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

Даже создатели Dojo не читают документацию

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

Class Sample
  Public Property Let someprop(val)
    …
  End Property
  Public Property Set someprop(val)
    …
  End Property
  Public Property Get someprop
    …
  End Property
End Class

Два вида сеттеров связаны с тем, что в VBScript довольно чётко различаются передача по ссылке и по значению (например, можно в параметрах функции указать «ByRef» или «ByVal»), кроме того, у сеттеров и геттеров есть ещё один параметр, благодаря чему можно перехватывать вызов методов и делать совсем уж странные, с точки зрения JavaScript, штуки.

Впрочем, к чёрту подробности.

Один из разработчиков JS-фреймворка Dojo реализовал в нём эмуляцию сеттеров и геттеров для IE, но в его примере есть некрасивая штука — глобальная функция dj_exec_vb_global, которая описана внутри тега SCRIPT с указанным языком VBScript и предназначена для вызова VBScript из JavaScript.

Но в IE уже есть специальный метод объекта window, который занимается тем же — execScript, вторым параметром надо задать «vbscript» и voilà!, мы вызываем VBScript из JavaScript.

Я этот метод когда-то использовал внутри JUnix (это был эмулятор CLI Linux на JavaScript).

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

«Китайский спортсмен Ля Х… (кто?) стал победителем в тяжелой атлетике»

Кроме того, возможны звукосочетания, вызывающие в принимающем языке нежелательные ассоциации с лексикой сниженного регистра, включая вульгаризмы и бранные слова (…) Можно привести также в пример и имя персонажа шекспировской пьесы «Зимняя сказка» Perdita (…)

У Шекспира оно несёт ещё и смысловую нагрузку, будучи образовано от латинского причастия со значением «потерянная»; (…) весьма удачным представляется решение выдающегося переводчика В. В. Левика, назвавшего этот персонаж именем Утрата.

(…)

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

Из книги «Имена собственные на стыке языков и культур» Д. И. Ермоловича.

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

Оказывается, имена, фамилии, названия изменяли, чтобы звучали благозвучно.

Это, кстати, общая проблема. Для уха англоговорящих вряд ли благозвучны фамилии Аршавин (arse shaving), Жирков (jerk off), Шитиков (shit), в Татарстане веселье вызывает марки Petek (похоже на «бетэк») и Q-tek (звучит почти как «кутак»).

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

Начали ходить на скалодром

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

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

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

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

Как заменить одну строку на другую в файле (Linux)

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

Вот несколько способов, которые я знаю.

Во-первых, в состав MySQL входит замечательная утилита replace, которая замечательна тем, что умеет производить замену прямо в файле:

replace 'hello' 'bye, bye!' -- myfile

Самое замечательное, что она умеет менять пары подстрок, что позволяет производить такие замены:

bolk-dev ~ $ echo ABBA | replace A B B A  --
BAAB

Второй способ — создать временный файл, заменить в нём символы или подстроки какой-нибудь утилитой (sed, tr), переместить временный файл на прежнее место (не забудьте, что sed работает с регулярными выражениями):

T=`/bin/tempfile`
sed 's/hello/bye, bye!/g' myfile > $T
mv $T myfile

Сразу в тот же файл записывать результат нельзя, операция „>“ сразу же откроет файл на запись и обнулит его. Поможет утилита sponge (входит в пакет moreutils):

sed 's/hello/bye, bye!/g' myfile | sponge myfile

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

Добавлено: Азат в комментариях подсказывает, что можно воспользоваться ключом «-i» у sed:

sed -i 's/hello/bye, bye!/g' myfile

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

Перевод часов — экономия 0,3%?

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

Ко всему прочему для меня, простого горожанина, остается загадкой, что все-таки такое — экономия энергии и чья она, экономия? Кто экономит-то? Я не понимаю. Город лег спать на час раньше, поэтому горожане на час меньше жгли свет в своих домах. Фонари все равно горят до утра — им дела нет. Троллейбус объедет маршрут те же 20 раз по суточному расписанию, ему перевод стрелок без разницы, если не считать три несчастные лампочки в салоне. Помидоры в теплице тоже часов не переводят. Речь только об освещении людей — чтобы световой день больше совпадал с нашим циклом бодрствования, чтобы меньше гореть лампам в зданиях. Экономическая выгода? Ну так замени свои лампочки на энергосберегающие — вот тебе 60% экономии, а не 0,3%. А замени на светодиодные — экономия и вовсе 90%…

Что-что ты там говоришь, читатель? Слишком дорогие пока светодиодные лампы, ты не готов на них тратиться? Верно. Получается, ты для себя решил, что оставить в квартире старые лампы тебе будет дешевле. Тебе. А экономия для энергетической отрасли тебя не волнует? Почему? Наверно потому, что она здесь ни при чем — ведь ты платишь за свет свои деньги, а не получаешь его бесплатно, верно? Поэтому тебе и решать, менять лампочки в целях экономии или не менять.

У меня ощущение, что Леонид несколько передёргивает, так как мне лично понятно кто экономит — «традиционные» офисы, заводы, кто ещё. «Традиционные», потому что в необычном «Яндексе» экономия вряд ли какая-то есть, мы тут к световому дню так не привязываемся и свет всё равно горит круглые сутки.

Но по словам энергетиков экономия составляет смешные 0,3%! Было бы из-за чего.

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

Кроссбраузерный data URI в CSS-файлах (подробно)

Кстати, всё забываю порекомендовать статью Banderlog’а, который написал её по мотивам моей статьи «Кроссбраузерный data URI в CSS-файлах», прекрасно разложив всё по полочкам и детально проработав тот же подход в форматах PNG и GIF.

Статья на Хабре называется «К вопросу о кроссбраузерных Data URI».

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

«Как пилят в Транснефти»

Материалы следствия (61.71КиБ)

Новое расследование Навального «Как пилят в Транснефти»:

Еще раз обращаю внимание: это не мой доклад, это не мнение аналитиков или экспертов. Это официальные материалы компании Транснефть, подготовленные и подписанные десятками ее сотрудников. (…) Всего, по нашей оценке, по ходу этой истории было украдено не менее 4 млрд долларов.

На скриншоте — одна из страниц (как утверждает Навальный) официального расследования, по ссылке можно скачать его полностью (17,5МБ текста, несколько сотен страниц).

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

Ещё про алкоголь

Кстати сказать, самая низкая смертность в России — в тюрьмах. Примерно в три раза ниже, чем на свободе среди мужчин того же возраста. Там все ужасно — и туберкулез, и психологическая обстановка, и питание — зато доступа к алкоголю в тюрьмах нет

Из статьи в Эсквайере «Море внутри».

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

Авторы книг, опишите персонажа сразу или никогда

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

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

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

Авторы! Не делайте так!

У Воттса на эту тему сказано кратко и по делу. Рекомендую.

Добавлено: я, конечно же, не имею ввиду литературный приём, когда детали не раскрываются до какого-то момента для эффекта неожиданности.

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