Приватный режим в Сафари под iOS
Честно сказать, не знаю для чего это может быть нужно, но это одна из вещей, которая если понадобится, то потом не найдёшь. Джаваскрипт, который позволяет определить запущен ли мобильный Сафари (под Айос) в приватном режиме:
function isPrivateMode() {
var s = window.sessionStorage, key = '';
try {
s.setItem(key, '');
s.removeItem(key);
} catch (e) {
if (e.code === DOMException.QUOTA_EXCEEDED_ERR && !s.length) {
return true;
} else {
throw e;
}
}
return false;
}
// приватный режим включен?
alert(isPrivateMode());Оригинальный код основан на следующем факте — в приватном режиме мобильный Сафари запрещает доступ к sessionStorage. Я только обернул скрипт в функцию и переименовал переменные.
Яблокораздирающая история
«Макрадар» цитирует Джонатана Айва:
«Мы чуть не отказались выпуска iPhone, поскольку у нас возникли серьезные проблемы, которые казались неразрешимыми. В ранних прототипах нашего смартфона стоило лишь поднести устройство к уху, как, во время его касания к активному дисплею, набирались произвольные номера. Требовалось учитывать различные формы ушных раковин, прически и даже расовый тип пользователей. И это была лишь одна из многих сложнейших ситуаций, когда нам казалось, что у проекта нет будущего», — утверждает Айв.
Это насколько ранний
Защита от внедрения PHP-кода в картинки (JPEG, GIF, PNG)
На «Хабре» всплыла тема атаки, старой как мир — заливаем на сайт картинку, у которой внутри (в поле комментариев) есть
Во всех форматах принятых в вебе, есть поле, позволяющее вставить такие данные. В JPEG есть специальные секции APPn и COM, в PNG — iTXt, tEXt и можно создавать произвольные секции, в GIF — блоки расширений, в SVG можно использовать обычный
В качестве абсолютного метода защиты на «Хабре» предлагается пропустить картинку через
Можно ещё попробовать вырезать все секции файла, куда можно запихнуть текстовую информацию, но это не спасёт от файлов, где ПХП вставлен прямо в графическую часть, так, чтобы детектор валидности картинки (в ПХП для этого обычно используют getimagesize) не спотыкался на файле.
Мне кажется, я придумал более удачный метод защиты.
В загруженный файл можно добавить первой секцией (сразу после заголовка) свой собственный кусок
# смотрим что внутри файла
bolk@Bolk ~ $ hexdump -Cn128 sample.jpg
00000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 |......JFIF......|
00000010 00 01 00 00 ff fe 00 1a 3c 3f 70 68 70 20 5f 5f |........<?php __|
00000020 68 61 6c 74 5f 63 6f 6d 70 69 6c 65 72 28 29 3b |halt_compiler();|
00000030 ff db 00 43 00 02 02 02 02 02 01 02 02 02 02 03 |...C............|
00000040 02 02 03 03 06 04 03 03 03 03 07 05 05 04 06 08 |................|
00000050 07 09 08 08 07 08 08 09 0a 0d 0b 09 0a 0c 0a 08 |................|
00000060 08 0b 0f 0b 0c 0d 0e 0e 0f 0e 09 0b 10 11 10 0e |................|
00000070 11 0d 0e 0e 0e ff db 00 43 01 02 03 03 03 03 03 |........C.......|
# запускаем
bolk@Bolk ~ $ php sample.jpg
????JFIF??Т. е. на экран выводится бинарный заголовок JPEG, первая секция, а потом интерпретатор дальше просто не идёт. Будет дальше ход хакера или нет, он не проинтерпретируется.
Код для защиты GIF, PNG и JPEG (к предыдущей статье)
В коментариях к предыдущей заметке о моём предложении по защите графических форматов от внедрённого кода один из читателей попросил привести код, который показывал бы как моё предложение работает.
Для форматов GIF, JPEG и PNG я за полчаса написал следующее (язык — PHP 5.4 и выше):
<?
// //bolknote.ru август 2012
// Защищаем изображения, возращает false в случае неудачи
function ProtectPicture($inname, $outname)
{
// типы изображения, которые мы можем защитить и функции защиты
$enabled = [
IMAGETYPE_JPEG => 'Jpeg',
IMAGETYPE_PNG => 'Png',
IMAGETYPE_GIF => 'Gif',
];
if (list(,, $type) = @getimagesize($inname)) {
if (isset($enabled[$type])) {
if ($fi = @fopen($inname, 'rb')) {
flock($fi, LOCK_SH);
if ($fo = @fopen($outname, 'wb')) {
flock($fo, LOCK_EX);
// если все файлы удалось открыть, то вызываем функцию защиты
$ret = call_user_func('ProtectPicture'.$enabled[$type], $fi, $fo, filesize($inname));
fclose($fo);
fclose($fi);
if (!$ret) {
unlink($outname);
}
return $ret;
} else {
fclose($fi);
}
}
}
}
return false;
}
/* Private functions */
function ProtectPictureJpeg($fi, $fo, $controllen)
{
// заголовок JPEG
if (!@fwrite($fo, fread($fi, 2))) return false;
$protect = '<?php __halt_compiler();';
$length = pack('n', strlen($protect) + 2);
// дописываю секцию COM (comment)
if (!@fwrite($fo, "\xFF\xFE$length$protect")) return false;
// остаток файла
if (@stream_copy_to_stream($fi, $fo) != $controllen - 2) return false;
return true;
}
function ProtectPicturePng($fi, $fo, $controllen)
{
// заголовок PNG
if (!@fwrite($fo, fread($fi, 8))) return false;
// пропускаем кусок IHDR (он должен быть первым))
$len = unpack('N', $lenbin = fread($fi, 4))[1] + 8;
$ihdr = $lenbin . fread($fi, $len);
// Смотрим, не написал ли в этот кусок хакер свой код
if (($pos = strpos($ihdr, '<?')) !== false) {
// в стандарте перечислены поля, которые есть в этом куске — там должно быть 13 байт (+4 — длина)
if ($len != 17) return false;
// эта комбинация может встретиться только в первых восьми байтах заголовка — дальше поля не
// могут принимать такие большие значения
if ($pos > 11) return false;
// если разрешены короткие теги, нужно присмотреться к этому коду
// в столь ограниченном пространстве вред можно натворить только через запуск
// чего-то внешнего
if (ini_get('short_open_tag') && strpos($ihdr, '`', $pos + 2) !== false) {
return false;
}
}
if (!@fwrite($fo, $ihdr)) return false;
// кусок iTXt (text) с нашим кодом
$protect = "<?php __halt_compiler();";
$length = pack('N', strlen($protect));
$sum = pack('N', sprintf('%u', crc32($protect)));
if (!@fwrite($fo, "{$length}iTXt{$protect}{$sum}")) return false;
// остаток файла
if (@stream_copy_to_stream($fi, $fo) != $controllen - 8 - 4 - $len) return false;
return true;
}
function ProtectPictureGif($fi, $fo, $controllen)
{
$protect = "<?php __halt_compiler();";
// заголовок GIF
if (!@fwrite($fo, fread($fi, 6))) return false;
// поле Logical Screen Descriptor
$lsd = fread($fi, 7);
$flag = ord($lsd[4]);
// указана ли Global Color Table?
if ($flag & 128) {
$pixel = 1 + ($flag & 0b111);
$colors = pow(2, $pixel);
$gctlen = $colors * 3;
// читаем Global Color Table
$gct = fread($fi, $gctlen);
// не вставил ли уже туда злоумышленник „<?“?
// меняем у такой комбинации последний бит — это малозаметно,
// безопасность важнее!
if (strpos($gct, '<?') !== false) {
$gct = str_replace('<', '=', $gct);
}
if (!@fwrite($fo, $lsd . $gct)) return false;
} else {
$gctlen = 0;
if (!@fwrite($fo, $lsd)) return false;
}
// пишем комментарий с куском защиты
fwrite($fo, "!\xfe" . chr(strlen($protect)) . $protect . "\0");
if (@stream_copy_to_stream($fi, $fo) != $controllen - 6 - 7 - $gctlen) return false;
return true;
}В коде есть два места где я ищу не встретилась ли комбинация <? раньше, чем я вставляю защиту — это в заголовочном куске (IHDR) в ПНГ и в глобальной таблице цветов у ГИФа.
В случае ПНГ я анализирую заголовок, чтобы понять как там оказалась эта комбинация, она валидна только в первых восьми байтах (на зло остаётся всего 6 байт), кроме того, в этом случае я контролирую размер заголовка, в стандарте там указано 13 байт, хотя, кажется, размер не ограничивается. В общем, в шести байтах особо не разгуляешься, всё что я придумал туда засунуть — `rm *`, т. е. очистка текущего каталога. На этот случай, я контролирую появление символа `. На мой взгляд, вероятность встретить в нормальном ПНГ в заголовке <? после которого идёт ` ничтожно мала.
С ГИФом проще — меняю младший бит у цвета, это вряд ли будет заметно, а безопасность важнее.
Льняная свадьба
Думаю, зря мы забросили традицию отмечать годовщину свадьбы фотосессией, это интереснее, чем просто сходить в ресторан, как мы сделали в прошлом году. Льняную свадьбу (четыре года) мы отметили в стиле начала двадцатого века — революция ещё не случилась, но многие замечательные вещи — электрическое освещение, телефон уже вошли в нашу жизнь.
Съёмки проходили в
За фотографии традиционное спасибище великолепной Маше Зверевой, остальные фотографии можно посмотреть у неё в ЖЖ (из тех, что она сама выбрала).
Также спасибо за трость (видели бы вы как я её красил из балончика с краской) Индире Файзрахмановой, за часы Елене Козаковой и Мире Абраровой, Лилии Ясиной за букет и Инне Каражаковой за причёску жены.
Жена, ты такая молодец, что смогла это всё организовать!
Динозавр в храме Ангкор-Ват
Храм
Причём окружающие животные нарисованы очень натурально, безо всяких фантазий, а тут — динозавр. У меня такой вопрос — не знает ли
Что ещё интересно, стегозавр нарисован ровно так, как будто художник его видел, т. е. без устрашающих излишеств, которыми снабжали чудовищ на старинных гравюрах.
Сжатый несжатый GIF
Как многие знают, браузер нативно понимает сжатие gzip (алгоритм DEFLATE).
Графический файлы обычно так не сжимают — внутри у них свой алгоритм сжатия, например в ПНГ используется тот же DEFLATE. Но с ГИФом ситуация хуже — у него внутри более старый алгоритм LZW, к тому же нет никаких оптимизационных техник (например, ПНГ использует так называемые «фильтры», которые позволяют эффективно сжимать градиенты.
Вот я и подумал — нельзя ли
Смотрите, слева у вас на экране ГИФ, сжатый при помощи gzip (так и грузится с сервера), справа — ПНГ.
![]()
![]()
В каждом из них равное количество уникальных цветов, ПНГ пропущен через все оптимизаторы, которые я только нашёл. При этом ПНГ занимает 1374 байта, а гзипованный ГИФ — 1347, на 27 байт меньше. Дело тут конечно, не в паре десятков байт, а в принципе — если бы я выбрал картинку побольше, выигрыш, возможно, был бы существеннее.
Почему же LZW внутри ГИФа, плюс DEFLATE снаружи сделали файл меньше, чем оптимизирующие просто DEFLATE, плюс фильтры в случае ПНГ? Обычно наложение одного сжимающего алгоритма на другой делает файл больше сравнению с применением одного, более удачного алгоритам из двоих.
Дело в том, что в ГИФ я использовал несжатый, он подготовлен специальным образом, так, что его собственный алгоритм сжатия не работает, а gzip работает над несжатым потоком данных.
Самый простой, по моему мнению, способ получить такой файл — пропустить его через утилиту gifinter из набора libungif — библиотеки и набора утилит для работы с несжатыми файлами ГИФ.
Утилиты эти отлично скомпилировались под мой «Мак» и обрабатывал я ГИФ следующим образом: для начала оптимизировал его при помощи giflite (эта старая утилита под DOS, которую я запускаю
gifinter optimized.gif > non-compressed.gif
gzip -9n non-compressed.gifДальше я переименовал файл
AddEncoding gzip .gif-gz
AddType image/gif .gif-gzТеперь при запросе сервер будет выдавать все необходимые заголовки:
bolk@Bolk ~ $ telnet bolknote.ru 80
Trying 91.230.61.15...
Connected to bolknote.ru.
Escape character is '^]'.
HEAD /imgs/2012.08.08.gif-gz HTTP/1.0
Host: bolknote.ru
Accept-encoding: gzip
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 08 Aug 2012 06:12:14 GMT
Content-Type: image/gif
Content-Length: 1347
Connection: close
Accept-Ranges: bytes
Cache-Control: max-age=2592000
Expires: Fri, 07 Sep 2012 06:12:14 GMT
Content-Encoding: gzipЕсли интересно как устроен несжатый ГИФ, об этом можно прочитать в Википедии, откуда я взял картинку, там интересная уличная магия, перепечатывать «Википедию»
Готовой разгадки почему сжатый несжатый ГИФ обогнал ПНГ у меня нет, но есть одно возможное соображение — ГИФ
Сжатая несжатая ГИФ-анимация
В догонку к предыдущей статье: мне удалось сделать несжатый анимированный ГИФ c сжатием через DEFLATE, вот он ниже (анимация не закциклена):

Там шесть несжатых кадров (цифры «1», «2», «3», «3», «2» и «1») с небольшой задержкой, таблица из 16 цветов, в этом формате (несжатый ГИФ+DEFLATE) файл занял 619 байт:
bolk@Bolk ~ $ telnet bolknote.ru 80
Trying 91.230.61.15...
Connected to bolknote.ru.
Escape character is '^]'.
HEAD /imgs/2012.08.08.1.gif-gz HTTP/1.0
Host: bolknote.ru
Accept-encoding: gzip
HTTP/1.1 200 OK
Content-Type: image/gif
Content-Length: 619
Content-Encoding: gzipСобранная при помощи gifsicle анимация в формате «обычного» ГИФа занимает 1028 байт, разница в полтора раза. Права, я выключил в gifsicle оптимизацию — иначе gifsicle исключит из изображений повторящиеся части и эксперимент будет нечистым.
Поддержи антитабачный закон!
Попросили опубликовать. Поскольку я поддерживаю эту инициативу, с удовольствием у себя публикую (ниже текст не мой).

Согласно предвыборной программе Владимира Путина, законопроект, собравший 100 000 подписей в Интернете, будет рассмотрен властями. Подписи, собранные на сайте МК, будут переданы в Государственную Думу и Правительство РФ.
При нынешнем уровне потребления табака Россия теряет около 400 000 человек
По данным Всероссийского опроса взрослого населения об отношении к мерам борьбы с табакокурением, 95% россиян считают курение вредным (72%, включая курильщиков, говорят, что это очень вредно). 80% населения страны поддерживают национальную политику борьбы с табачной эпидемией. В том числе за запрет на рекламу табачных изделий высказались 86% опрошенных, за финансирование программ профилактики потребления табака выступают 85%. Более действенные предупреждения на пачках сигарет нужны 81% россиян. Полный запрет на курение в общественных местах и на рабочих местах, включая рестораны и бары, поддерживают 82% жителей страны.
Поддержи антитабачный законопроект Минздрава! Поставь свою подпись на сайте «МК» и расскажи об этой акции друзьям!
Прогресс по несжатому ГИФу
Написал половину требуемого, чтобы попробовать эффективно конвертировать анимированный ГИФ в несжатый формат — разбор ГИФа на Пайтоне. Сначала я раскладываю ГИФ на информационные блоки, потом дербаню на кадры при помощи gifsicle, прогоняю каждый через gifinter и вытаскиваю (той же программой на Пайтоне) бинарное содержимое картинки.
Работает медленно, но мне больше нужна наглядность, а не скорость, с тем рассчётом всё и писал — вынимаю почти максимум, большинство данных даже не использую. На анимации в 47КБ (23 кадра) работает 4 секунды на моём слабеньком ноуте. Львиную часть времени (≈75%) занимает выемка бинарного тела картинки.
Вечером буду писать штуку, которая упаковывает полученное обратно в ГИФ.
Ни один браузер, кстати, не умеет отображать всё, что написано в стандарте ГИФа.
Конвертор в несжатый GIF
Сделал я конвертор из обычного ГИФа в несжатый формат сжатый gzip, выложил на ГитХабе. Основное (разбор ГИФа) написано на Пайтоне, утилита, которая всё запускает — на Шеле. Для работы требуются ImageMagick (предпочтительнее) или gifsicle, gitinter (из libungif) и интерпретатор Пайтона.
Кажется, эксперимент провалился, я ещё буду вертеть различные ГИФы, но вряд ли
Из плюсов для себя: детально для себя разобрал формат GIF, освежил знания Пайтона (которые уже начинают тускнеть), Шела, поработал над интересной идеей.
Сжатие GIF через gzip
Эксперимент мой сжатию несжатых ГИФ, по сути, провалился — если статические изображения иногда оказываются меньше (или сравнимы) с PNG, то с анимированными изображениями, ради которых всё и затевалось, всё плохо, я не сумел подобрать условия, при которых новоявленный метод обгоняет обычные соптимизированные ГИФы.
Зато я попутно выяснил, что ГИФ, вопреки моим ожиданиям, иногда жмётся gzip, на первой попавшейся анимации я получил выигрыш порядка 9%. Так что вот он метод ещё больше утоптать файлы ГИФ:
#!/bin/sh
which -s defluff
if [ $? -eq 0 ]; then
gifsicle -O3 "$1" | gzip -9nc | defluff 2>&- > "$2".temp
else
gifsicle -O3 "$1" | gzip -9nc > "$2".temp
fi
size=( $(ls -l "$2".temp) )
# срезаем заголовок gzip и контрольную сумму
let 'size=size[4]-10-8'
dd if="$2".temp of="$2" bs=1 skip=10 count=$size 2>&-
rm -f "$2".tempВ настройки Апача надо добавить новое расширение файла:
AddEncoding deflate .gif-def
AddType image/gif .gif-defДля браузера вместо gzip я указываю метод deflate — по факту это тот же gzip, но без заголовка и контрольной суммы, что позволяет сэкономить 18 байт, не бог весть сколько, конечно, но почему бы их не убрать, спрашивается.
Утилита defluff , которая у меня упоминается — это оптимизатор кодов Хаффмана для gzip, PNG и zip, иногда даёт выигрыш в размере.
Многотарифные счётчики воды
Всякая мелочь одним постом-9
В заметке в ЖЖ «Бред сивой кобылы» собраны фотографии и описания советских клонов IBM PC.
В конце
80-х в СССР началась перестройка с ускорением. Может, если только ускорение, или только перестройка, и обошлось бы, но перестраиваться и ускоряться редкий Боливар такое вынесет… На фоне этого могучая электронная промышленность СССР и стран СЭВа, следуя руководящим документам эпохи осчастливила нас автохтонными ПК.Итак сегодня маленький обзорчик советских клонов IBM PC — ПЭВМ.
На сайте «Мурмолка» есть интересная статья, вынесенная из закрытой «Лепры», про стажировку в Отделе Технического Контроля Управления Делами Президента.
Саша занимался Виброакустикой. Помните суперкрутые фильмы про шпионов, где звук снимали лазером с окна, либо направленным микрофоном с полукилометра, либо просто специальной штукой, прикладывающейся к стене?
Так вот, Саша был спецом по тому, как это делать или от этого защищаться. Нет, нам конечно же тоже рассказывали про побочные виброакустические возмущения, пьезоэффект и т. д. Но одно дело лекции, другое — слушать обсуждение вчерашнего футбольного матча, происходящее в здании напротив.
В ЖЖ Олега Лурье рассказ об расформированном в начале
Глубина-то совсем небольшая — 104 метра минус тридцать метров сама лодка, итого получается семьдесят четыре- семьдесят два метра. Это же элементарно для моих ребят. Вся операция вывода подводников занимает около трех часов. Итого получается, что мы бы затратили на спасение оставшихся в живых моряков «Курска» не более 5—6 часов, а значит,какая-то, и, я думаю, немалая, часть подводников была бы спасена.
«Зачем исследовать космос» — перевод письма 1970 года отправленного монахине из Замбии, Марие Юкуда, заместителем директора по научной части в Центре космических полетов NASA, в ответ на вопрос о текущих исследованиях Марса.
В своем письме Вы спросили как я могу предлагать расходовать миллиарды долларов на путешествие на Марс, в то время, когда многие дети на Земле умирают от голода. Я знаю, что вы не ожидаете такого ответа, как «О, я и не знал, что есть дети, умирающие от голода, но теперь я буду воздерживаться от любых космических исследований пока человечество не решит эту проблему!»
На самом деле, я знал о голодающих детях задолго до того, как я узнал, что путешествие на планету Марс технически возможно. Тем не менее, я считаю, как и многие мои друзья, что путешествие на Луну и, в конечном итоге, на Марсе и другие планеты, это рискованное начинание, которое мы должны предпринять, и я даже считаю, что этот проект, в конечном счете, будет способствовать решению более серьезных проблем, с которыми мы сталкиваемся здесь, на Земле, чем многие другие потенциальные проекты помощи, которые обсуждались и обсуждаются год за годом, и которые очень медленно приносят осязаемые результаты.
Казань тридцатых годов






























В ЖЖ Аксанова Нияза фотографии Казани 1930 года, сделанные Франком Уитсоном Феттером, университетским профессором, экономистом, который путешествовал по России весной того года.
WEBP в PHP

Когда я делал биндинг GD для языка «Гугл Гоу», заметил, что в ПХП появилась поддержка формата WEBP. О самом формате
Чтобы поддержка формата (пока довольно куцая) появилась, нужно установить библиотеку libvpx и пересобрать ПХП с ключом
./configure --with-vpx-dir=/usr/local/Cellar/libvpx/1.1.0 \
… остальные опции
make
sudo make installПравда в phpinfo информация как у меня на картинке не появится (это я сам немного пропатчил исходники), не пугайтесь — так должно быть, проверить наличие поддержки WEBP можно следующим образом:
var_dump(function_exists('imagewebp'));Собственно, в языке появятся две новые функции: imagecreatefromwebp и imagewebp. У первой только одни аргумент — имя файла из которого надо создать ресурс GD (по действию ничем не отличается от любой другой подобной функции, например imagecreatefromjpeg), вторая принимает два параметра — ресурс и необязательные имя файла и качество, описание функции полностью совпадает с imagejpeg, с той только разницей, что сохраняет она формат WEBP.
Параметр качества изменяется от 0 до 100 и соотвествует параметру VP8 QP кодека в диапазоне от 1 до 63.
Немного статистики по дереву родственников
Ввёл новый тег, myheritage для своего хобби — составления дерева родственников и предков.
На настоящий момент максимальная глубина дерева — 7, это начиная на одно поколение ниже моего (у меня детей нет, но у многих родственников моего поколения — есть), заканчивая прапрапрадедушками (и реже — -бабушками). Т. е. если считать с меня, то это на 5 поколений назад.
Я считаю, что глубина не бог весть какая,
Всего людей в дереве сейчас — 956 человек.
Google Go GD binding
Исправил свой биндинг графической библиотеки GD к языку «Гоу» так, чтобы он работал под первой версией языка. Теперь изменился способ его установки и использования.
Ставить его теперь намного проще, достаточно выполнить следующую команду (в системе должна быть установлена библиотека GD):
go get github.com/bolknote/go-gdСпособ подключения бибилиотеки так же изменился (см. sample.go):
import gd "github.com/bolknote/go-gd"Надеюсь, больше «Гугл» библиотеки языка и способ сборки менять не будет.
Добавлено позднее: заодно портировал на Go 1 и свою программу MakeCorner, ставиться, опять же, стала попроще, а вот размер сильно вырос. Версия r60 компилировала файл размером 1,6МБ, версия 1 компилирует уже в 2,2МБ. Безобразие!
Знак «Опасный переезд»

Лучший знак, предупреждающий об опасности, который я видел — около железнодорожной станции села Акбаш (Бугульминский район, Татарстан), он на фото.
Кстати, с опасными переездами через железнодорожные пути у меня связана одна загадочная история.
Там проезжая
На что среагировала моя интуция тогда — до сих пор не понимаю. Вероятно
УК РФ разжигает ненависть к социальным группам насильников и убийц
На антифашиста завели дело о возбуждении ненависти к «скинхедам»
Владимирские следователи сочли экстремизмом демонстрацию фильма, содержащего «негативные оценки сторонников националистических взглядов»
Это из «Ведомостей». Божемой, ЧТО?!
Морей
Наткнулся в своих исследованиях дерева предков на Прасковью Мореевну — вероятную родственницу по браку двоюродной бабушки. Всё хорошо — но что за отчество такое «Мореевна»? Какому имени соответствует, излазил весь интернет — ничего не нашёл.
Вроде должен «Морей» получаться, но интернет молчит, а хочется узнать как было образовано это отчество. Догадался вбить это отчество в базу военных потерь ОБД «Мемориал» и, вуаля!, у двух солдат с таким отчеством нашлось указание на отца. Действительно — Морей.

Поиск по различным энциклопедиям имён даёт невнятное «(английское имя) законопослушный» с вариантами «Морс» и «Морри» и только. Неизвестно откуда родом Прасковья Мореевна и как её девичья фамилия, но откуда у неё
Способ повалить Safari 6.0
Случайно нашёл способ как повалить браузер «Сафари» шестой версии (под «Мак»), другие версии не пробовал — не у меня их. Падает от такого HTML-кода:
<style>
* {
background: -webkit-image-set(url(BOLK!) 1x), url(BOOM!)
}
</style>До чего техника дошла

До чего техника дошла! У меня друг экзамен сдавал, когда упомянул про наушник, куда одногрупники будут начитывать билет, я, как мне показалось резонно, сказал ему, что не прокатит —
Найдите на картинке сам излучатель. Я попозже в комментариях расскажу что где.
Удаляем расладку «U.S. English» из «Мака»
Артём Поликарпов написал рецепт как можно удалить из «Мака» раскладку «U.S. English». Она очень мешается и совершенно не нужна, если поставить великолепную раскладку Ильи Бирмана (кстати, если вы
Но рецепт Артёма мне не нравится тем, что для его выполнения приходится иметь у себя редактор Xcode, который ещё и несколько гигабайт весит. Поэтому я, как водится, написал скрипт, который нужно выполнить из «Терминала» (после его выполнения придётся опять залогиниться в систему) и ненужной раскладки уже не будет.
Какое счастье!
Проще всего скрипт запускать из «Терминала» вот так:
bash <(curl -fsSkL raw.github.com/bolknote/shellgames/master/us_layout_remover.sh)Чтобы вернуть всё обратно достаточно запустить программу ещё раз.
Добавлено позднее: удалению раскладки может мешать Punto Switcher.
Екатериновка, Пестречинский район
В мае мы были в Камбодже, ужасались тому как живёт местное население — грязно, бедно.
В России я относительно часто бываю в различных городах, иногда в маленьких (недавно был в Бавлах, это около 23 тысяч человек населения), я привык к цивилизации и если
Екатериновка живёт вне времени, тут был коммунизм, потом, судя по состоянию, ядерная война, а выжившие живут на обломках былого величия. Электричество здесь есть, есть газ, так что по крайней мере, дом освещают и топят не горящими книгами из школьной библиотеки.


Есть свой Дом Культуры, с 19:00 до 23:00 — дискотека, я был там рядом как раз в это время, дискотеки не наблюдалось.
Да и плясать особо некому. Бо́льшая часть жителей — бабушки и их пьяненькие мужья. Кстати, распространены браки на пенсионерках, тогда как мужчина намного младше — пенсию бабулька получает, кормит, с глупостями не пристаёт, а у бабульки мужик при хозяйстве. Симбиоз. После комунизма и ядерной войны в деревне глухой христианское язычество. Вот эта плачущая бабушка расстроилась, так как глядя на меня, вспомнила, что её внучку «сгубил»
Этот странный мальчик бежал за мной полулицы, чтобы робко подойти и почти насильно потрогать фотоаппарат, потом он ещё, пока я отвлёкся, покрутил на нём ручку и убежал, совершенно безумный от счастья.
Следы былой роскоши видны и на памятнике героям войны — вон сколько людей пало, правда это с Екатериновки и ещё шести окресных деревень.
Вообще непонятно, деревня погибает или оживает — тут, к слову, два магазина, вот один из них:
Как водится, вокруг кругом полно всякой живности:



И машины, не роскошь, а рабочие лошадки:



Если приглядеться, картина, в сущности, постапокалиптическая — ровно как в фильмах
Слова-паразиты
Другое отношение
Opera 12.50 CSS hack
Ребята из «Оперы» уже трудятся над весьма интересной версией 12.50 и у меня уже готов
@media (-o-min-device-pixel-ratio: 1/100) {
@media all {
body {
background: red; /* Opera 12.50+ */
}
}
}И ещё вариант:
_:-o-prefocus:fullscreen, body {
background: red; /* Opera 12.50+ */
}Вместо body надо подставить нужный вам селектор.
ICC-профили в GIF
Формат ГИФ
Например, считается, что анимация появилась только в версии 89a (неправда, она была уже в версии 87a, в 89а её возможности были расширены), что ГИФ может использовать не более 256 цветов (не совсем так — не более 256 цветов на кадр, кадры могут накладываться друг на друга, давая любое отображаемое компьютером количество цветов).
Другое распространённое заблуждение — что ГИФ не поддерживает цветовые профили (ICC).
В самом деле, если посмотреть спецификацию формата, то слово «ICC» там не найдётся, но не найдётся там и слова «loop» (здесь: количество повторов), тем не менее, вы видели анимации, где указано определённое количество повторений и браузеры
Дело в том, что формат ГИФ поддерживает расширения. Расширения в спецификацию формата не входят.
Упомянутое количество повторов анимации задаётся в расширении, которое было
Вот начало файла ГИФ с внедрённым профилем:
00000000 47 49 46 38 39 61 01 00 01 00 f0 00 00 fe 00 02 |GIF89a……….| |
Пока не все браузеры умеют поддерживать цветовые профили ГИФ (как и профили любого другого формата), так ФФ не научился делать это до сих пор, а «Опера» научится это делать в новой версии 12.50.
Проверить поддерживает ли браузер цветовые профили можно и через Джаваскрипт. Принцип такой: я загружаю