Где еда?

Где еда? (38.24КиБ)

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

Послания вытыкиваются зубочисткой, стюардессы обычно им очень радуются.

К сожалению, на рейсах «Эс севена» послания оставить не удаётся, там только сок дают.

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

Что такое икота

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

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

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

Нил Шубин. «Внутренняя рыба. История человеческого тела с древнейших времён до наших дней».

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

Наркоман штоле?

Ампула и шприц в аэропорту (54.71КиБ)

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

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

Как обойти баг со сложными селекторами CSS3 в «Вебките»

В «Вебките» (а значит в «Хроме» и «Сафари») есть баг с поддержкой сложных селекторов CSS3. Насколько мне рассказывали, это даже не баг, а сознательное решение. Относится он к сложным селекторам, связанным с «:target», «:checked» и ещё некоторым. Смысл в том, что у браузера как будто нет внутренних проверок на то, что условия поменялись (изменился элемент, на который должен указывать «:target», например) и надо переприменить селекторы к элементам.

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

section {
    -webkit-animation: 0.1s hack infinite;
}
            
@-webkit-keyframes hack {
    from {margin: 0; padding: 0;}
    to {margin: 0; padding: 0;}
}

Теперь в теге «section» эти сложные селекторы будут срабатывать.

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

Низкотемпературные ртутные термометры

Оказывается существуют низкотемпературные ртутные термометры. Там не совсем ртуть, правда, а сплав:

Амальгама таллия (содержащая около 8.5% Tl) остается в жидком состоянии при температуре до минус 60°C (ртуть замерзает при минус 38.8°C). Сплав используют (либо использовали в прошлом) в жидкостных затворах, переключателях, термометрах, работающих в условиях сильного холода, а также при экспериментах с низкими температурами.

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

GMT+?

Премьер Владимир Путин, баллотирующийся в президенты, снова заговорил о том, чтобы отказаться от летнего времени зимой, которое установил президент Дмитрий Медведев… «Это не фетиш какой-то. К этому можно вернуться. Давайте без суеты все это сделаем, давайте вернемся еще раз. Со специалистами посоветуемся, с экспертами посоветуемся и общественностью в широком смысле этого слова», — сказал Путин на встрече со своими доверенными лицами.

Пишет «Газета.Ру». Готовы ещё раз обновлять прошивку на всех ваших гаджетах, серверах и прочем?

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

Как добавить ПХП в список шеллов в Автоматоре

Илья написал статью про то как писать службу в «Маке» на ПХП. Есть способ проще, достаточно добавить ПХП в список шелов в Автоматоре и писать скрипты прямо на нём, без вызова bash.

Можно сделать всё по инструкции по ссылке или просто запустить вот такой скрипт в «Терминале»:

sudo sed -iE "/^<\\/idict>/,$ c\ 
$(echo H4sIAPOBM08CA4WQvQ6CMBSFZ3iKO2CAwfQBqEwyuDiAcRFjai3QiNDcVhNjfHcrEpSBuH3n3P+bO/\
Qs7jG5aiRH2RBVKUreTu7mDj1Jbjr6ZDEs9TfqUIbIenaoNiibMp4jJT2OA7OxT8lQPfTXHKUy/yZ4tWwELMCqS1\
CUwugg2yxX6zCMJkYXLQrGKwi8Q5ak2yTd+faUm78HpsGzGMIDBK/aTkTwnFzVcv+TH1C11CZ2X1wmkt1LAQAA| base64 -D | gzip -d)" \
/System/Library/Automator/Run\ Shell\ Script.action/Contents/Resources/Shells.plist

После запуска надо перезапустить «Автоматор» и в нём появится новый шелл:

ПХП-шелл в Автоматоре (24.97КиБ)

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

Об отношении к детям в прежние века

Статья в ЖЖ в двух частях ([1], [2]), запомнилась, особенно:

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

В копилку аргументов против романтизации прошлого.

[1] http://budurada.livejournal.com/118682.html [2] http://budurada.livejournal.com/119224.html

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

Fantastic Contraption

Подсел на флеш-игрушку, чего и вам желаю. Цель — донести некую финтифлюшку, которая даётся в начале уровня до цели (блок оранжево-розового цвета с надписью «goal»). Причём финтифлюшка должна полностью поместиться в целевой блок, на одном из уровней это замечание особенно важно, увидите. Из того, что в распоряжении надо построить что-нибудь, что выполнит поставленную выше задачу.

Fantastic Contraption (54.18КиБ)

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

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

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

В комментариях ещё больше спойлеров!

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

ПХП и Винда

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

А тут, на днях, нужно было продумать веб-сервис на ПХП, который именно под «Виндоуз» и работает, нужно обращаться к КОМ-объекту программы, которая только на этой платформе бывает. Сразу проблема всплыла.

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

Функция не заработала правильно ни с «Апачем», ни с «Энжиникс», в комментариях пользователей к документации есть одинокий комментарий 2002-го года, который сообщает о проблеме:

Note that register_shutdown_function() does not work under Apache on Windows platforms. Your shutdown function will be called, but the connection will not close until the processing is complete. Zend tells me that this is due to a difference between Apache for *nix and Apache for Windows.

Похоже с тех пор ничего не изменилось. Ну хорошо, я вспомнил, что в последние ПХП входит патч php-fpm, который похожий функционал содержит — функцию fastcgi_finish_request. Оказалось, что php-fpm не работает под «Виндой».

Решили не перебирать больше решения, а сразу перейти на запуск отдельного фонового процесса. Оказалось и это не тривиально сделать. Под «Виндой» нужно это делать следующим образом:

$commandline = 'start /b тут-программа-которую-надо-запустить';
pclose(popen($commandline, 'r'));

Сплошные приключения.

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

%u → UTF-8

Столкнулся сегодня с задачей — надо сконвертировать пришедшую из JavaScript строку (в ней символы Юникода в виде «%uXXXX») в UTF-8 на PHP. Придумал, на мой взгляд, самый короткий способ это сделать:

echo json_decode(str_replace('%u', '\\u', json_encode($str_from_javascript)));

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

Эй, Эпл, эй, Эпл?

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

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

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

В общем, в видео именно это и показано — «Виндоуз» несколько раз окликает «Мак», прежде чем тот отвечает.

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

Годы испытательного срока

Новые подробности о компании Apple опубликовал в одном из интервью Адам Лащински (Adam Lashinsky), автор книги Inside Apple… По его словам, инженеры разного уровня подготовки, и обладающие разным опытом, подвергаются многократным собеседованиям в несколько этапов. Период интервью порой длится до 9 месяцев…

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

Пишет «Макрадар». Годы испытательго срока, только вдумайтесь! Каково это в один прекрасный момент узнать, что то, куда ты вкладывал душу несколько лет, никому не нужно и это был «испытательный срок»?

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

«Сосчитал количество ног и поделил на четыре»

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

Бородатый анекдот в тему:

Едут два англичанина в поезде. Поезд проезжает мимо пасущегося стада коров. Один из англичанин говорит: — Пятьдесят восемь голов в стаде… — Как вы узнали? — Очень просто — сосчитал количество ног и разделил на четыре…

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

ChinesePython

А вы знали, что существует ChinesePython? Выглядит как настоящий, но не радует.

Язык полностью переведён на китайский, включая ключевые слова, встроенные типы и так далее, код основан на Пайтоне 2.1.3. Вот пример того как смотрится программа на этом языке:

載入 系統
文件名 = 系統.參數[1:]

定義 修正行尾(文件):
    內文 = 打開(文件名).讀入()
    內文 = 內文.替換('\n\r','\n')
    傳回 內文

取 文件 自 文件名:
    寫 修正行尾(文件)

«載入 系統» — это «import sys». Эта же программа на традиционном Пайтоне выглядит вот так:

import sys
filenames = sys.argv[1:]

def fixline(filename):
    text = open(filename).read()
    text = text.replace('\n\r','\n')
    return text

for file in filenames:
    print fixline(file)

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

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

Ерунда на itertools и генераторах

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

Прочитал тут на «Хабре», что дробь 1/998001 даёт последовательность из чисел от нуля до 997. Вот я и написал код с использованием генераторов и itertools, который берёт эту дробь и выводит из неё все числа последовательно, пока не попадутся числа с разницей не равной единице.

from decimal import Decimal, getcontext
from itertools import groupby, islice, izip, takewhile, chain, imap

getcontext().prec = 3000

n = (
    groupby(
        enumerate(
            islice(str(1 / Decimal(998001)), 2, None)
        ),
        lambda n: n[0] // 3)
    )

n = (int(''.join(n[1] for n in n[1])) for n in n)

n = chain(*takewhile(lambda n: n[1] - n[0] == 1, izip(n, n)))

print ', '.join(imap(str, n))

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

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

from decimal import Decimal, getcontext

getcontext().prec = 3000

number, prev, out = str(1 / Decimal(998001)), -1, []

for i in xrange(2, len(number), 3):
    curr = int(number[i:i+3])

    if curr - prev != 1: break

    prev = curr
    out.append(str(curr))

print ', '.join(out)

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

Некоторые проблемы SQLite

Товарищ Адепт пишет в ЖЖ про проблемы SQLite. Если вкратце, то выявлены минимум две проблемы.

SQLite при снятии дампа «CREATE VIEW» выписываются в порядке создания. Если у нас две вьшки, «A» и «Б», созданные в порядке перечисления и мы пересоздаём вьюху «А» с использованием «Б», то при заливке дампа будет ошибка — в дампе-то первым будет создание вьюшки «А», которая попытается использовать несуществующую вью «Б».

Если создана вью, в конце которой комментарий стоит, то и в дампе будет комментарий в конце строки создания, экранирующий конечную точку с запятой.

create view commented_view
  as select something
       from some_table -- pretty useless view;
create view another_view as…

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

Стеганография и пробел нулевой длины

Болею, не спится мне. Вспомнил старую свою идею.

В Юникоде есть такой символ замечательный — пробел нулевой длины (код 0x200B), на печать не выводится, понимается всеми современными браузерами и большинством редакторов. Интервала между буквами, как следует из названия, не даёт.

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

Например. Дан текст: «Болк», в нём надо скрыть короткий текст: «yes». Я взял английские символы, чтобы не заморачиватсья с кодировкой.

Коды символов «yes» — 121, 101, 115. Значит текст приобретает следующий вид:

[121 символ пробела нулевой длины]Б[101 символ пробела нулевой длины]о[115 символов пробела нулевой длины]лк

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

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​#​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​E​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​x​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​a​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​m​p​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​l​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​e​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​b​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​y​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​E​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​v​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​g​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​e​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​n​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​y Stepanischev
from itertools import groupby, izip_longest
import sys
import codecs

sys.stdin = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

toenc = 'Evgeny Stepanischev'
input = sys.stdin.read()

def decode(input):
    return ''.join(chr(31+len(list(x[1])))
            for x in groupby(input, lambda x: x == u"\u200b") if x[0])

def encode(input):
    if len(input) < len(toenc):
        raise ValueError()

    return ''.join(x[0] + x[1]
            for x in izip_longest((u"\u200b" * (ord(x)-31)
            for x in toenc), input, fillvalue=''))


print(encode(input) if input.find(u"\u200b") == -1 else decode(input))

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

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

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

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

Ёлки…

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

Сегодня наткнулся на замечательный сайт «ТУГЕЗА», а там — на следующее описание:

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

Всё это время Сергей с хозяйской любовью поддерживал аэродром: вырубал деревья вдоль полосы, сохранял то, что ещё можно спасти. Как оказалось, не зря.

В сентябре 2010 у Ту-154, летевшего из Якутии в Москву, отказали двигатели, и пилотам пришлось сажать самолёт с 72 пассажирами посреди тайги. Им повезло: на глаза попалась та самая списанная взлётно-посадочная полоса, за которой присматривал Сергей. Самолёт сел, все пассажиры остались целы.

История-то оказалось невыдуманной.

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