Ещё об одном российском мифе

Как бы пристально мы ни следили за статистикой, уровень краж оставался существенно ниже среднего по ИКЕА. Когда мы открыли еще магазины в России, мы уже могли с уверенностью заявить: в этой стране у нас крадут меньше, чем в других странах. Удивительно, почему среди русских так распространено мнение о том, что их собственный народ имеет какую-то особую склонность к воровству?

Говорит Леннарт Дальген, первый генеральный директор российского подразделения компании ИКЕА.

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

«Нокия»: история провала

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

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

Тег шаблона (NOEMBED?)

Где-то видел спецификацию на тег TEMPLATE, для шаблонов в HTML. Его смысл в том, что содержимое не добавляется в DOM (дерево) документа, не засоряет дерево, что может быть очень полезно, если шаблонов много и веб-приложение активно работает с деревом. Работа с DOM одна из ресурсоёмких операций, ни к чему нагружать браузер ещё и шаблонами.

Традиционно в HTML4 для этого используют тег SCRIPT у указанием какого-нибудь несуществующего языка:

<script type="text/x-template" id="template-ok">
<div><div class="button">OK</div></div>
</script>

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

Был раньше такой нестандартный тег COMMENT, но его сейчас никто не понимает, даже Эксплорер прекратил его поддержку, в данном случае он бы пригодился.

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

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

<noframes id="template-ok">
<div><div class="button">OK</div></div>
</noframes>

<script>
alert(document.getElementById('template-ok').innerText); // содержимое шаблона
</script>

Не сказать, что это как-то по-особенному семантично или чем-то лучше тега SCRIPT (разве что короче), просто ещё один вариант.

Когда я уже дописал эту заметку, мне пришла в голову мысль, что а) тег NOEMBED был бы, наверное, более семантичем, чем NOFRAMES, он имеет отношение к встраиванию контента, а я совсем про него забыл, б) тег EMBED был бы, наверное, ещё более семантичен, но, к сожалению, он слишком тяжёл для браузера, надо испытывать, но я предполагаю, что даже если контент явно незнакомый, браузер всё равно попытается угадать что это. Но надо провести испытания, конечно же.

Так что, я бы остановился бы на NOEMBED. Во-первых, это тег ещё короче, во-вторых, обладает хоть какой-то семантикой, которую можно трактовать как не вставлять (no-embed) содержимое в дерево документа.

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

Дата-центры следует подогревать, а не охлаждать?

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

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

Из статьи про исследование Гугла, наблюдались тысячи машин, в течении 2,5 лет. Так получается, дата-центры впору нагревать, а не охлаждать?

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

Чай in-stick

Чай in-stick (89.44КиБ)

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

На упаковке есть название «In-stick», у них и сайт есть.

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

О стоимости доступа к объектам в PHP

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

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

Никогда такого не видел. Как вы думаете, что тормозило? Запросы к базе? Какая-то суперматематика? Сортировка, может быть? Цикл в цикле в цикле, а там внутри что-то сложное?

Вовсе нет.

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

В цикле не было вызвано ни одной функции (кроме htmlspecialchars), а вывод всего этого хозяйства занимал порядка десятков секунд.

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

Превращение маковской флешки в полноценную

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

Флешка для Мака (78.10КиБ)

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

После запуска, если утилита не нашла вставленную флешку, нужно нажать «F5», в этом случае, произойдёт скан всех ЮСБи-устройств и в одной из строчек появится надпись «Ready», у меня это оказался порт №1, как видно на скриншоте:

Утилита нашла флешку (37.50КиБ)

Если эта операция выполнилась успешно, надо нажать клавишу пробела и дождаться выполнения всех оставшихся операций. Если всё прошло хорошо, в строке статус сменится на «Pass», а справа появится большая надпись «OK»:

Всё прошло хорошо (45.09КиБ)

После этого можно флешку извлекать (не забудьте извлечь её безопасно). У меня получилась флешка в 8ГБ:

Новоиспечённая флешка (76.29КиБ)

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

Смирнов вернулся в Новосибирск

Дима Смирнов (помните ещё такого?) переехал обратно из Москвы в Новосибирск. И написал небольшую и разумную заметку о своём переезде:

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

Я и не ринулся, потому что прекрасно осознавал, что Москва мне не нравится. Но если Яндекс — лучшая айти компания в России, а я такой талантливый и хороший — то мне там место, а Москву можно потерпеть. Оказалось, нет.

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

Привет из прошлого, Ассемблер Z80

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

penguinny: Опыт работы в ассемблере даёт это знание самым непосредственным образом. Кстати, тесно связанный трюк в ассемблере Z80 служил как один из самых быстрых (и точно самый компактный) способ очистки экрана:

ld hl,screen_addr ld de,screen_addr+1 ld bc,6143 ld (hl),0 ldir

Команда ldir копирует bc байт информации, начинающейся с адреса hl, в блок памяти, начинающийся с адреса de. С учётом выбранных адресов, 0 вручную пишется в первый байт, а затем копируется из первого во второй, из второго в третий, и т. д. Экран очищается по индукции.

kray_zemli: говорят, как-то через стек можно ещё было. вы его имели в виду?

penguinny: Да, именно так. Регистр стека устанавливался в конце экрана, один из 16-битных регистров очищался и затем в частично развёрнутом цикле многократно сохранялся в стек. 16-битные операции на 8-битном процессоре! Шок.

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

Где откроются двери в метро

Где же откроются двери? (104.90КиБ)

В московском метро (пока не на всех станциях) сделали специальную разметку, чтобы люди понимали где именно откроются двери в электричку. До появления этой разметки я пользовался простым приёмом, который мне когда-то показал Нияз Сайфутдинов (Ниязик, спасибо!).

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

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

Казань ✈ Москва ✈ Тбилиси → Сингаги → Мцхета → Кутаиси → Батуми ✈ Москва ✈ Казань

В первые майские праздники едем в Грузию, давно хотел посетить эту замечательную страну. Побываем в пяти городах: Тбилиси, Сингаги, Мцхета, Кутаиси, Батуми, увидим Метехский Храм, крепость Нарикала, Майдан, серные бани, гору Мтацминда, монастыри Бодбе и Джвари, Алазанскую Долину, Кавказский Хребет, Цинандали, соборы Светицховели и Баграта, Гелатскую Академию и наверное что-то ещё.

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

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

Самое короткое письмо Льва Толстого

Господа, это прекрасно! На «Лепрозории» всплыло (а на «Ленте.ру» было переопубликовано) самое короткое письмо Льва Толстого в те времена ученику третьего класса, прадеду товарища одного из пользователей «Лепрозория», Сергѣю Владимировичу Ѳедорову.

История целиком:

У меня есть товарищ, прадед которого, учась в третьем классе, читал «Войну и мир» и задался вопросом: «Как же правильно ставить ударение в фамилии Ростовы?». И он, недолго думая, написал телеграмму Льву Толстому. Писатель ответил ему. Вот карточка с его ответом. Позже семья моего товарища обнаружила биографию Льва Толстого, где упомянут этот случай.

Росто́вы (64.50КиБ)

Как видите, читать надо «Росто́вы», это подтверждает сам Лев Николаевич. На обратной стороне почтовой карточки написано: «Его Высокоблагородiю Сергѣю Владимировичу Ѳедорову» с указанием адреса.

Аверс карточки (165.85КиБ)

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

Юникодные часы

В Юникоде есть несколько символов часов (не знаю, отобразятся ли они у вас, вот они): «🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦🕛🕧.»

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

Юникодные часы (3.72КиБ)

Рассказать я хотел не об этом. Я и раньше встречался с тем, что часть Юникода не воспринимается многими программами нормально, особенно что касается раздела «Эмодзи, например „Яндекс.Фотки“ не так давно порадовали меня следующим (стоило переименовать картинку, всё стало в порядке):

«Яндекс.Фотки» (52.51КиБ)

Редактор „Сублиме Текст 2“ часто падает, если в тексте программы встречаются эти символы, а вот „Сафари“ удивил больше всех. Он их, вроде бы, понимает, но как-то не до конца:

"🕐".length; // 2
'🕐'[0]; // строка со «сломанным» символом
escape('🕐'); // "%uD83D%uDD50"

То есть, он считает символы Эмодзи не одним символом, а двумя. Такой вот баг. Мне пришлось в коде на ДжаваСкрипте это учитывать.

Дополнение: в комментариях подсказывают, что вроде так и задумано. Так как этим символы представлены четырьмя байтами (суррогатной парой), ДжаваСкрипт, который не умеет работать с такой парой как с одним символом, разделяет его на два.

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

Юникод в помощь!

Меня в твиттере раздражает, что при использовании русских хеш-тегов нельзя пользоваться склонениями. Сегодня способ придумал, который может иногда выручить. Вот, посмотрите:

#Казань-ю (34.18КиБ)

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

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

Вы поняли? Обновление установлено! Вы поняли? Обновление установлено! Вы поняли? Обновление установлено!

Обновление установлено! (91.04КиБ)

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

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

Bluetooth в Mac OS из Python

Я тут учусь работать с Блютузом из Пайтона на «Маке», пока сделал сканирование всех видимых в эфире устройств:

import objc
import time
from Foundation import NSDate, NSDefaultRunLoopMode
from AppKit import NSApplication, NSAnyEventMask

objc.loadBundle('IOBluetooth', globals(), bundle_path=u'/System/Library/Frameworks/IOBluetooth.framework')

class DeviceInquiry(NSObject): 
    def init(self):
        self = super(DeviceInquiry, self).init()
        self._inquiry = IOBluetoothDeviceInquiry.inquiryWithDelegate_(self)    
        self._stop = False
        
        return self
        
    def getfounddevices(self):
        self._inquiry.start()

        app = NSApplication.sharedApplication()
        app.setActivationPolicy_(2)        
        while not self._stop:
            time.sleep(.01)
            app.nextEventMatchingMask_untilDate_inMode_dequeue_(NSAnyEventMask,\
            NSDate.dateWithTimeIntervalSinceNow_(1), NSDefaultRunLoopMode, True)

        return tuple((dev.getName(), dev.getAddressString()) for dev in self._inquiry.foundDevices())

    @objc.typedSelector("v@:@@")
    def deviceInquiryDeviceFound_device_(self, inquiry, device):
        self._stop = True 

    @objc.typedSelector("v@:@iB")
    def deviceInquiryComplete_error_aborted_(self, inquiry, err, aborted):
        self._stop = True

print DeviceInquiry.new().getfounddevices()

Модуль pyobjc (в маковском Пайтоне он уже есть) — это мост между Пайтоном и Обжектив-Си, т. е. в реальности вызывается «кокосовое» АПИ «Мака».

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

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

Bluetooth в Mac OS из Python: комментарии к коду

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

Первая строка после импортов — загрузка, собственно, самого АПИ, загружается разделяемая библиотека, находящаяся по указанному пути. Далее определяется класс-объект, наследуемый от NSObject, это специальный класс, который позволяет прикидываться объектам Пайтона объектами Обжектив-Си.

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

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

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

Декораторы objc.typedSelector указывают сигнатуру вызываемого объекта и позволяют указать как именно будут переданы параметры. До конца эта магия мне пока непонятна.

Например, «v@:@iB» расшифровывается как «void», «объект», «селектор метода», «объект», «int», «булевое». Т. е. метод ничего не возвращает, потом идут параметры: никаких идей что такое «объект-селектор метода» (но по наблюдениям, этот параметр всегда соответствует self), дальше передаётся объект, потом целое, потом значение булевского типа.

Всё что перечисленно через подчёркивание — это имена сообщений, в терминах Обжектив-Си. Например, сообщение из кода «[myRect setWidth:10.0 height:20.0]» имеет имя «setWidth:height:» и кодируется вот так: setWith_height_, то есть, двоеточие в имени сообщение заменяется на подчёркивание. Полный вызов будет выглядеть следующим образом: «myRect.setWith_height_(10.0, 20.0)».

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

Уходим с телефоном, «МакБук» выключается

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

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

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

Шаг №1.

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

Настройки Bluetooth (80.68КиБ)

Шаг №2.

С этого шага потребуется уметь пользоваться терминалом. Создаём запускаемый файл /usr/local/bin/bt-lock следующего содержания:

#!/usr/bin/python

import objc
import sys
from subprocess import call

objc.loadBundle('IOBluetooth', globals(), bundle_path=u'/System/Library/Frameworks/IOBluetooth.framework')

def CheckDevice(address):
    dev = IOBluetoothDevice.withAddressString_(address)

    if dev.isConnected():
        return True

    conn = dev.openConnection()

    if conn == -536870185: # Bluetooth is off
        return True

    if conn == 0:
        dev.closeConnection()
        return True

    return False


cmdtorun=(r'/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession', r'-suspend')

try:
    if not CheckDevice(sys.argv[1]):
        call(cmdtorun)
except IndexError:
    print("Usage: bt-lock <device address>")

В скобках замечу, чтобы сделать файл запускаемым нужно в терминале выполнить следующую команду: chmod a+x /usr/local/bin/bt-lock.

Шаг 3.

Создаём файл ~/Library/LaunchAgents/ru.bolknote.Bluetooth-lock.crontab.plist с таким вот содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>ru.bolknote.Bluetooth-lock.crontab</string>

  <key>Program</key>
  <string>/usr/local/bin/bt-lock</string>

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/bt-lock</string>
    <string>а̲д̲р̲е̲с̲ ̲в̲а̲ш̲е̲г̲о̲ ̲у̲с̲т̲р̲о̲й̲с̲т̲в̲а̲</string>
  </array>

  <key>Nice</key>
  <integer>20</integer>

  <key>StartInterval</key>
  <integer>30</integer>

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

И выполняем в терминале команду «launchctl load ru.bolknote.Bluetooth-lock.crontab.plist». Это всё.

Чтобы отключить всю эту марахайку, достаточно выполнить в терминале команду «launchctl unload ru.bolknote.Bluetooth-lock.crontab.plist» или выключить Bluetooth на ноуте.

Решение только для «Мака», как работать из Пайтона с Блютузом под другие операционные системы, я не знаю.

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

Русская народная медицина

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

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

Когда это у меня случился такой скачок в сознании, я не заметил, раньше, кажется, мне народная медицина нравилась, а тут прямо полярность сменилась. Наверное, какая-то критическая масса накопилась.

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

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

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

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

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

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

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

Можно, конечно, попытаться на большевиков всё свалить, но что тогда делать с огромной смертностью до революции?

В общем, это мой сознательный анализ. А бессознательный выбор таков: из двух тюбиков я выберу тот, который к народной медицине отношения не имеет.

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

PCRE и UTF-16

Прочитал в документации по библиотеке PCRE, что с версии 8.30 она поддерживает кодировку UTF-16. Решил сравнить производительность по сравнению с UTF-8. Всё-таки кодировка UTF-16 (почти) фиксированного размера, обрабатывать её сильно проще, чем UTF-8, которая переменной длины.

Написал два примера на Си: один для UTF-8, второй для UTF-16 и запустил, разницу посмотрите сами:

# это я на своём «Маке» скомпилировал
~$ gcc-4.7 -I/usr/local/Cellar/pcre/8.32/include/ -L/usr/local/Cellar/pcre/8.32/lib/ -lpcre -std=c99 -o utf8 utf8.c
~$ gcc-4.7 -I/usr/local/Cellar/pcre/8.32/include/ -L/usr/local/Cellar/pcre/8.32/lib/ -lpcre16 -std=c99 -o utf16 utf16.c

# два файла в разных кодировках, почти 1,5 млн. строк, правда используется далеко не это количество
~$ wc -l utf8.txt
 1424462 utf8.txt
~$ wc -l utf16.txt
 1424462 utf16.txt

~$ time ./utf8
PCRE version: 8.32 2012-11-30
Yes!
…
Yes!

real	0m1.372s
user	0m1.286s
sys	0m0.039s

~$ time ./utf16
PCRE version: 8.32 2012-11-30
Yes!
…
Yes!

real	0m0.048s
user	0m0.004s
sys	0m0.035s

Либо я где-то неверно что-то напрограммировал, либо разница почти в 29 раз!

Лично мне кажется, что API толком не работает и ошибка в том, что в pcre16_compile не указывается длина шаблона.

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

Королевич Вахрамей

Наткнулся сегодня, наполняя своё родовое дерево, на очередное редкое имя — Вахраме́й. Это мой прапрапрадед со стороны мамы (примерно 1840-50 годов рождения).

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

Вахрамей — простонородный вариант имени Варфоломей (переводится как «сын Толмая» с арамейского).

Возможно, кстати, прапрапрадеда звали Вахра́м, такой вариант имени тоже существует, а само имя мне стало известно из сокращения отчества моей прапрабабушки, которая записана в похозяйственной книге №1 одной из письмянских артелей за 1937 год:

Вахрамей (143.33КиБ)

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

Кто сильнее — кит, слон или «Фауст» Гёте?

Кстати, в прошлом году я прочитал «Фауса» Гёте. Просто для того, чтобы иметь право говорить «эта штука посильнее „Фауста“ Гёте».

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

Earworm

У меня сейчас в голове противный мотивчик крутится, никак избавиться не могу. Слова что-то вроде «я всегда помню о главном», попса, подхваченная в такси. По-английски это называется «earworm» («ушной червь»). На форумах встретил высказывание, что, смотрите-ка, в английском есть слово для этого понятия, а в русском — нет.

Да какое это слово? Английский делает то, что русский уже давно боится — берёт два слова («ear» и «worm») и соединяет. А у нас с изобретения «самобранок», «самокатов», «самолётов», «вертолётов» появился только «пенопласт». Носители стали бояться изобретать новые слова, проще заимствовать из языка, где это не боятся делать.

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

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

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

Кесарю — кесарево сечение

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

А вот нет. Оказывается, кесарево делали в Древнем Риме, только если женщина при родах умирала (делать кесарева так, чтобы мать выжила стали только в 19 веке), а мать Цезаря прожила ещё долгие годы после его рождения.

Доподлинно же, почему оно называется «кесаревым» неизвестно, есть несколько версий:

  1. Вышеупомянутая версия про Цезаря 2. По одному из императорских законов (Lex Caesarea), ребёнка умирающей матери полагалось спасти кесаревым сечением 3. От латинского «caedere» — резать

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

Imagine Cup 2013 в Казани

Imagine Cup 2013 (78.50КиБ)

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

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

Первое место заняли ребята из Волгограда, который придумали, реализовали и уже внедрили (!) за рубежом (!!) систему, которая по прогнозу погоды регулирует отопление здания, так как здание обладает инерцией, регулировать отопление надо заранее. На объекте, где было произведено внедрение, экономия составила 20% в год или 44% за холодное время года.

Sun Flowers (35.58КиБ)

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

На третьем месте парень из КФУ (это универсистет Казани), разрабатывающий программу 3Д-моделирования, в которой вы можете, используя голосовые команды и положение рук (используется «Киннект»), буквально «лепить» в воздухе фигуры. Пока они появляются только на экране, в будущем планируется использовать очки виртуальной реальности. Проект интересный, но пока очень сырой. Я, пожалуй, заменил бы голос на жесты (например, сжатый кулак — поставить точку, ладонь — убрать).

3Д-редактор (37.76КиБ)

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

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

Паук под наркотиками

Паук под чем? (44.35КиБ)

Фотография выше — часть очень известного эксперимента учёных НАСА. Они давали паукам разные наркотики и смотрели какую паутину они сплетут. Под этим наркотиком паутина получилась самой неправильной и бесполезной (она как раз на фото).

Сможете угадать что за наркотик?

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

♭♯♪♫♪♬♩

Удивительно (потому что меня это самого удивляет), но в последнее время я не слушаю музыку. Это как-то постепенно сошло на нет. Я помню времена, когда музыка была со мной всегда. В детстве я ставил и гонял целые кассеты кругами, пока домашние не начинали выть от повторения (спасибо музыкальному центру, который сам умел менять сторону кассеты). Мне тяжело было без музыки делать что угодно. Сейчас я её не слушаю.

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

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

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

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

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

Отчаянные четырнадцатые

Сегодняшний путь (81.54КиБ)

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

Конечно, это отечественный автопром, комфорта на порядки меньше, чем на «Лексусе» (однажды, в такси «Везёт» ко мне на обычный вызов прислали «Лексус»), но свои плюсы, видите, есть. С другой стороны, четырнадцатые, обычно, не такие разбитые внутри и замотанные изолентой, как пятёрки-шестёрки. Разумный баланс.

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

Чудны́ дела твои, PHP!

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

Я делал это функцией copy, первом аргументом передавал УРЛ, вторым — путь на файловой системе. В логах, после изменения конфигурации, ПХП ругался, что «http:» — это неправильное начало для разрешённого пути. Удивительно, но стоило заменить copy// на её, фактически, эквивалент, как всё заработало:

if ($fin = fopen($url, 'rb') and $fout = fopen($file, 'wb')) {
    stream_copy_to_stream($fin, $fout);

    fclose($fout);
    fclose($fin);

    return true;
} else {
    return false;
}

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

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

Александра Никаноровна Стрелкова

Дубовка (91.58КиБ)

Тут случилось небольшое чудо.

Сначала предыстория. В 1999 году у меня умерла прабабушка, Евдокия Никаноровна Стрелкова, несколько месяцев до 97 лет не дожила. В детстве мне одномоментно стало интересно поисследовать своё дерево и я расспросил всех бабушек и её в том числе, о тех предках, кого они помнили. А когда два года назад я заинтересовался деревом более серьёзно, то перенёс это всё в электронный вид. Некоторое время назад я показывал это дерево своей двоюродной бабушке, её дочери и маме, которая приходится ей внучкой и оказалось, что прабабушка мне назвала не маму, а мачеху. Как звали маму она то ли не помнила, то ли не посчитала нужным сказать. Т. е. как звали мою родную прапрабабушку с этой стороны я не знал.

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

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

А сегодня работники Национального Архива Республики Татарстан нашли запись о рождении прабабушки в архивах села Рыково, оно же Рычково (на картах зелёная стрелка), сейчас носит название Ключёвка. В записи о рождении записана её мама — Александра Никоноровна. Чудо в том, что работники Архива вообще посмотрели в бумаги по этому селу, вот что значит люди хорошо делают свою работу! Что приятно, по этому селу есть масса записей, мой сканер их нашёл. Почему прапрадед повёз дочку крестить не в ближайшее село непонятно, но пара версий у меня есть.

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

Вторая версия — Евдокия Никаноровна крестилась 15 марта (по новому стилю), сегодня 27 марта, а за окном снег и слякоть. Может быть в Потапову Тумбалу просто было не проехать, а в Рыково дорога была более-менее.

Крестили, наверное, в храме Петра и Павла (вероятный год постройки — 1809), который сейчас в полуразрушенном состоянии. Само село Рыково основано купцом Рыковом в 1808 году, который переехал в те места из Вятки, в селе было около трёхсот дворов, занимались там выделкой овчин, земледелием, разведением скота, леплей горшков, красили, сапожничали. До 1860 года жители относились к категории удельных крестьян. После революции село было переименовано в Пушкино, но название не прижилось: к Пушкину оно отношения не имело, в 20-30-х годах переименовали в Ключёвку, так как вокруг много ключей.

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

И небольшая историческая справка по Дубовке, родине моей прабабушки. Деревня основана в первой половине 19-го века, первоначально называлась Мирная Дубовка. До 1860-х годов крестьяне относились к категории государственных крестьян, занимались земледелием, разведением скота. В источниках 1940-50 годов деревня фигурирует как М. Дубовка, вероятно своё прилагательное потеряло позже. Число жителей в 1859 году — 145, в 1926 — 369, на 2010-й год — 11 жителей (русские и чуваши). С 2005 года входит в Потапово-Тумбралинское сельское поселение. Родина Героя Советского Союза Ивана Дмитриевича Зиновьева.

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

Какие графические форматы поддерживает ваш браузер?

Скриншоты браузеров Opera, Chrome, IE, Safari, Firefox и IE на Nokia Lumia 920: список поддерживаемых форматов изображений (JPEG, PNG, GIF и др.) с пометкой «Done».
Форматы, поддерживаемые браузерами

Я тут скрипт накидал, который проверяет какие графические форматы поддерживает ваш браузер. Проверяется JPEG, GIF, PNG, XMB, WebP, BMP, SVG, JPEG XR, TIFF, PDF, EMF, WMF, WBMP (Wireless BMP), JPEG-2000, ICO, APNG и MNG.

Тестируется поддержка в теге IMG.

Любопытно, что «Сафари» до сих пор поддерживает JPEG-2000, а «Опера» — WBMP (как единственный десктопный браузер, поддерживающий WAP, где WBMP и применяется).

Дополнение: оказывается, SVG в моем тесте был не до конца верный (я его просто сконвертировал из гифа 1×1 какой-то программой), так что скриншоты теста в браузерах верны не до конца, «Хром» и «Сафари» (т. е. браузеры на вебките) не поняли мой SVG.

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

Октябрьский октябрь

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

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

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

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

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

Число π в Библии

Оказывается, в Библии есть упоминание числа Пи. Не напрямую, конечно, но вычислить его можно. В третьей книге Царств, 7:23 написано:

И сотвори море лiяно десять лакотъ от края до края его, кругло окрестъ его: пять лакотъ высота его, и объятiе его тридесять лактей окружаше е окрестъ.

Я специально привёл церковнославянский перевод, потому что синодальный для меня менее понятный.

Давайте вспомним что такое число Пи. В этом нам поможет замечательная картинка из «Википедии»:

Число Пи (116.43КиБ)

Если взять окружность диаметром в единицу, то длина этой окружности и будет числом Пи. Соответственно, если взять окружность диаметром в десять локтей, то длина окружности должна быть 10×π.

Таким образом, чтобы найти библейское число Пи надо поделить длину окружности (тридцать локтей) на диаметр (десять локтей).

Отсюда πбиблеское = 3.

Погрешность довольно существенная, надо сказать. Пи ≈ 3,1415926535897932384626433832795…, получается, что в длине окружности «море лiяно» потеряло почти полтора локтя, то есть примерно 70 сантиметров.

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

Лошадиная сила

Расчёты Уатта относились к мощности лошади, усреднённой за большое время. Кратковременно лошадь может развивать мощность около 1000 кгс·м/с, что соответствует 9,8 кВт или 33 475 BTU/ч (котловая лошадиная сила). По другим данным — до 15 л. с. в пике.

Я, конечно, понимал, что «лошадиная сила» — это какое-то среднее значение, но что лошадь в некоторые моменты может выдать 15 лошадиных сил — не ожидал.

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

← сюда туда →