Каррирование и частичное применение
Я, оказывается, путал раньше каррирование и частичное применение. Даже не то чтобы путал, просто не пытался разобраться в чём разница между терминами, применяя то и другое по мере надобности. Недавно на «Хабре» в комментариях мне на моё незнание указали и я уяснил, наконец, что конкретно стоит за каждым термином.
Каррирование — преобразование функции от двух аргументов в функцию от первого аргумента, возвращающую функцию, результат вызова которой со вторым агрументом эквивалентен вызову первоначальной функции с упомянутыми аргументами. Немного запутанно, с примерами станет всё яснее. Я буду объяснять на примере Джаваскрипта, его больше народу знает, а на ПХП очень уж многословно получается. Кстати, в соответствующую статью в «Википедии» я добавил пример на «Гугл Гоу».
// функция, суммирующая два числа
function sum(x, y) {
return x+y;
}
alert(sum(2, 8)); // вернёт 10
function sum(x) {
return function (y) {
return x+y;
}
}
alert(sum(2)(8)); // тоже вернёт 10При вызове второй функции sum создаётся функция, в которую
Частичное применение функции (Partial function) — создание некой функции на базе указанной, где некоторые агрументы заменены конкретными значениями. Например:
function partial_one_arg(f, a) {
return function(b) {
return f(a, b);
}
}
min0 = partial_one_arg(Math.min, 0);
min1 = partial_one_arg(Math.min, 1);
alert([min0(-5), min0(5)]); // вернёт [-5, 0]
alert([min1(-5), min1(5)]); // вернёт [-5, 1]В примере я заменил один из агрументов фунции нахождения минимального значения на конкретное значение, теперь при вызове функции «min0» сравнение будет идти с нулём, при вызове «min1» — с единицей.
Очень простые штуки, часто встречающиеся в функциональном программировании.
Что нового в ПХП 5.4
Илья Альшанетский (это один из разработчиков ПХП) подготовил презентацию в формате ПДФ о том о самых важных нововведениях ПХП 5.4.
Ошибки и ОБД «Мемориал»

В ходе Великой Отечественной Войны, подозреваю как и в ходе любой другой, не было времени аккуратно заполнять бумаги, потому в них хватает путаницы, особенно это касается бумаг начала войны.
Поэтому в военных архивах не следует искать точные совпадения, нужно расчитывать на то, что будут ошибки. Например, в архиве ОБД «Мемориал» (это архив военных потерь) три раза встречается мой дед, только в одном месте неправильно указан год рождения и срезано отчество, в другом случае — имя написано с ошибкой («Федр»).
Ребята, оцифровывающие военный архив не исправляют эти данные и правильно делают. Откуда им знать, что за «Ник.» скрывается «Николаевич», а не «Никифорович», а человека действительно по паспорту звали не «Федр» (мало ли странных имён, да и в паспорте могли с ошибкой написать).
Поэтому будете искать, пользуйтесь возможностью указать только часть имени и отчества, я искал по «Старостин Ф* Н*», «Мемориал» поддерживает такой синтаксис, тут символ „*“ означает «любое количество символов».
Новое Исаково
Потихоньку буду продолжать писать заметки о том как продвигается исследование истории моей семьи.
Судя по имеющимся у меня сведениями, один из моих прадедов родился в селе Новое Исаково Бугульминского района. К сожалению, в запросе в Национальный Архив Республики Татарстан я был невнимателен и написал «Исхаково», что стоило мне двух месяцев ожидания, пока работники архива не проверили это неправильное название и не написали мне, что такого села не существовало.
Из этой истории я делаю вывод, что очень важно знать как точно назывался населённый пункт в этот период, так как его всё равно будут искать в справочнике, что занимает весьма значительное время. В справочнике несколько сотен страниц (я скачал парочку таких), старая орфография и неизвестно какого качества его скан в Архиве (если они не шлют запрос
Себе на заметку, какая дальше должна быть последовательность действий на будущее.
Для начала неплохо бы найти
Из «Википедии» несложно узнать, что Бугульма (рассматриваемое мною село находится в Бугульминском районе) с 1850 года находилась в Самарской губернии, которую на протяжении 1918—1920 гг. постепенно разделили между другими регионами. Это мне подходит — у меня прадед родился после 1850, но до революции.
Дальше идём на сайт «Корни и Крылья» и в списке населённых пунктов Самарской губернии находим Аверьяновку в Бузулукском уезде и Исаково Новое в Бугульминском уезде.
Так как название «Новое Исаково» более новое, я предполагаю, что именно оно мне и нужно. Но неплохо бы и убедиться, что
Для этого качаем книгу «Списокъ населенныхъ мѣст Самарской губерніи» 1900 года выпуска, на странице 203 которой видим деревню Новое Исаково, находящуюся около
Тот же населённый пункт указан на странице 112 книги «Списокъ населенных мѣст Самарской губерніи по свѣдѣніям 1889 года», только там написано «сельцо», указано 244 версты (260 км) от Самары, 29 дворов, 50 мужчин и 112 женщин.
По обоим источникам вышло, что Новое Исаково находилось в Спасской волости Бугульминского уезда Самарской губернии, о чём я написал в повторном письме в Национальный Архив. Надеюсь на этот раз ответ будет быстрее.
Заплет Вэйв
FireDrop разработала технологию «заплетов», сочетающую атрибуты электронной почты и веба. Пользователь отправляет один заплет нескольким адресатам, которые могут просматривать его при помощи наиболее современных программ электронной почты. Но, в отличие от обычных «одноразовых» электронных сообщений, заплеты не требуют повторных писем, а автоматически обновляются, когда на них отвечают.
Например, сотрудники офиса, выбирая наиболее удобное время для совещания, могут разослать календарный заплет, в котором каждый указывает предпочтительное для него время. Брокерская фирма может каждое утро рассылать клиентам портфели акций, графики на которых будут отражать результаты последующих торгов. А газета может ежедневно распространять новости, заменяя их в течение дня, хотя в почтовый ящик подписчика доставляется только одно сообщение.
Статья «Новый вид электронной почты» от 14 марта 2000 года. Ничего не напоминает? Мне — «Гугл Вэйв».
Bolt — автоматическое обновление конфигурации «Апача» на «Маке»
Добавил новую программу в свои «Игры с шелом», назвал «Болт», она следит за изменением папки, куда у вас на «Маке»
Запускать нужно так (из командной строки):
sudo тутполныйпуть/bolt.sh &Потом ввести пароль администратора. Если затем в папке с сайтами создать, например «site1», то в браузере сразу можно набирать «http://site1», он уже будет открываться. Программа умеет убирать за собой (после перезагрузки компьютера, например).
Скачать можно с «Гитхаба».
МюЭсКюЭль
Забавная заметка на «Словомании» про то как должен бы читаться «MySQL»:
Как известно, популярная СУБД MySQL была названа в честь старшей дочери разработчика Майкла Видениуса (а MariaDB и MaxDB — в честь его младшей дочери и сына, соответственно). Если набрать в поиске how to pronounce mysql, то мы получим, в основном, обсуждения двух вариантов — «майэскьюэл» и «майсиквел», из которых первый считается более официальным.
Однако дочь Монти зовут не Май, а Мю. Это то же самое имя, что и у малышки Мю (Lilla My)
из муми-троллей. Выходит, что пуристы должны произносить«Мю-Эс-Кью-Эл».
Смартфоны vs. телефоны
Время от времени в разговоре об очередном смартфоне
Проблема в терминологии. Надо вообще перестать называть смартфоны «телефонами», это другой класс устройств, в принципе. С функциями, которые не всем нужны. Если вам нужен пылесос, не стоит покупать музыкальный центр, только на том основании, что он тоже умеет громко шуметь.
Мне телефон не нужен. Ни чтобы звонить,
Перестаньте в разговоре со мной путать одно с другим, пожалуйста.
Буква «ё» в гидронимах и топонимах
Мне непонятно почему так любят опускать букву «ё» в различных названиях, даже неважно чего, хотя в заголовке у меня «гидронимы и топонимы». Понятно, что когда пишут «елка» имеют ввиду зелёное, хвойное тотемное новогоднее дерево, а не нечто, образованное от глагола «есть».

На выезде из Казани есть река Мёша, на знаке (фотографировал в темноте, поэтому фото так себе), как видите, написано «р. Меша». Как не абориген должен догадаться, что это должно читаться «Мёша», я не понимаю. Таких примеров я только в родном Татарстане несколько штук знаю.
Или на картах «Яндекса» обозначена улица Константина Царева, я про эту вселенскую несправедливость знаю, потому что на ней жил.
Почему люди настолько не любят эту букву — загадка.
Загадочный баг в ПХП
Во всех современных интерпретаторов вёдра багов, я обычно и внимания на них не обращаю, но свежезаведённый баг в ПХП
bolk@Bolk ~ $ php -r 'var_dump(0x0 + 2); var_dump(0x0+2); var_dump(0x0 +10);'
int(2)
int(4)
int(26)Как видно, ПХП (у меня на 5.3.8 работает) считает сложение с шестадцатеричным нулём (обязательно слева и обязательно без пробела перед вторым слагаемым)
С чем связано пока непонятно, я посмотрел какие токены выдаёт интерпретатор на парсинге, ничего подозрительного не увидел.
Добавлено позднее: с минусом тоже работает. Например «0x0 -10» даёт -26.
Добавлено ещё позднее: разобрался что это за интересная операция.
MakeCorner, новый процесс инсталяции
У меня есть проект MakeCorner — бесчеловечная (потому что запускается из командной строки) программа для скругления уголков. Я несколько раз писал про неё, поэтому буду предполагать, что все заинтересованные лица в курсе что это такое и зачем.
Я переделал установку, теперь она стала намного проще (по крайней мере под «МакОс»).
Какие программы я купил с 2008
Я тут приводил статистику по купленным программам за последние четыре года, в комментарях попросили «огласить список». Не знаю как это сделать, но давайте попробуем посмотреть на что я тратил более 500 рублей.
В 2008 году я купил набор из трёх программ для Windows Mobile (тогда у меня HTC X7500 был): Resco Keyboard, Resco File Commander, Resco Photo Album за 1124,74 р. Главном образом тогда меня интересовали первые две, первая — хорошая наэкранная клавиатура, второй — менеджер файлов.
В том же году я купил набор программ SPB: Spb Plus, Spb Weather, Spb Shell за 831,6, со скидкой 20%. Это набор украшательств для той же Windows Mobile. Тормозило жутко, это всё, что я помню.
Далее я покупал i2Reader для «Айфона», это уже для жены, у неё тогда «Айфон» был.
Далее идут программы только под «Мак».
В том же году оплатил новую версию «Макос» («Лев»), купил за 908,8, так же приобрёл за 607,13 Powerpack для программы Alfred (аналог Spotlight). Powerpack позволяет писать плагины и даёт дополнительные возможности. Пользуюсь.
В конце года купил «Pixelmator», графический редактор, месяц его использовал в триальном режиме, как раз скидка была, вот, купил. Хорошая штука, пользуюсь постоянно. Примерно тогда же попробовал и купил «Tower», графический клиент для git. Время от времени пользуюсь, доволен. Pixelmator cтоил 926,89 р, Tower — 2005,08.
В этом году всего две покупки — купил Pages и Numbers за 1276,74 (это аналоги Word и Excel, только «Эпл» делала), вторая покупка меньше 500 рублей, но тоже упомяну — купил две лицензии на Boom (себе и жене), за 280,82. Это небольшая программулина позволяет увеличить звук на «Маке», плюс добавляет эквалайзер. Использую всё это постоянно.
Чуть не забыл. Спрашивали покупал ли я
Ни-ни-ни
Да, сегодня в Японии шуточный день кошки (не официальный пока еще праздник, к сожалению).
2-22 читается как«ни-ни-ни», то есть«мяу-мяу»
Из твита @japanreports. Вообще интересный твитер, например, там есть ссылка на сногсшибательный ролик про то как японцы лес валят. Там у них
Банкоматы «Ак Барс Банка»
У меня зарплатная карточка «Ак Барс Банка», он вряд ли известен за пределами нашей республики, но в Татарстане широко распространён. Этот банк входит в организацию «Объединённая расчётная система», в которую входят ещё несколько банков, в банкоматах которых карты «Ак Барса» обслуживаются на льготных условиях.
Список
# coding: utf-8
import urllib
import re
import sys
import codecs
from itertools import ifilter
# Чтобы при перенаправлении в файл была кодировка UTF-8
sys.stdin = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
# Конфигурация
ORS_URL = 'http://ors.ru/cashpoints/print.asp'
ORS_CITY = u'Казань'
ORS_REGION = u'Республика Татарстан'
# Данные для оправления через POST
postdata = urllib.urlencode({
'CITY': ORS_CITY.encode('cp1251'),
'REGION': ORS_REGION.encode('cp1251'),
'CURRENCY': 'RUR',
'OPERATION': 'cash-out',
})
content = urllib.urlopen(ORS_URL, postdata).read().decode('cp1251')
# Ищем все ячейки таблицы и выбираем каждую вторую из шести
tds = re.finditer('<td[^>]*>(.+?)</td>', content, re.S | re.I)
tds = ifilter(lambda x: x[0] % 6 == 1, enumerate(tds))
# Берём только уникальные значения и рубим лишние символы
for x in set(x[1].group(1) for x in tds):
print(x.replace(' ', ' '))Выводится список банков (регион и город задаётся в коде в очевидном месте), например, на настоящий момент список выглядит вот так:
ОАО Банк ЗЕНИТ
ОАО "РГС Банк"
АКБ "Абсолют Банк" (ЗАО)
Быстробанк ОАО
ОАО "АК БАРС" БАНК
АКБ "РОСБАНК" (ОАО)
НОМОС-БАНК (ОАО)
АКБ МБРР (ОАО)
ЗАО АИБ "Ипотека-Инвест"
ОАО "АИКБ "Татфондбанк"
АКБ "БТА-Казань" (ОАО)
КБ "Юниаструм Банк" (ООО)
ОАО АКБ «Авангард»
ОАО КБ "Восточный"Что такое с Mail.app?
Я, в качестве основного почтового клиента в «Маке» использую Mail.app. Всё достаточно неплохо, но иногда это приложение сходит с ума (я пока не понял в каких случаях) и портит мне кодировку писем (см. скриншот). Неужели за столько лет существования этой программы только у меня возникает эта проблема, раз её ещё не поправили? Или, может, есть

Немного статистики
С 2008 года я потратил 19961 рубль 72 копейки на покупку программ.
Сахар? Песок!
Каждому, наверное, такое знакомо — есть
У меня одна из таких вещей — «песок». Я спрашиваю в магазинах «сахар», так как считаю, что правильно так и меня раздражает, когда мне предлагают рафинад и потом возмущаются, что я не попросил «песок».
100% процентов продавцов, у которых я
Рафинад — это как раз изменённое, отличное от обычного «агрегатное состояние» сахара. Это как я бы спросил в кафе нет ли у них льда
Я понимаю, что у человечества есть причины класть в чай песок, но делать ничего с этим не хочу, в моём мире общечеловеческий песок называется сахаром, а песок на пляже валяется.
Бинарные данные в XML
На «Хабре» статья вышла, в ней есть интересный и обоснованный вывод:
Этот пример имеет практическое значение, т. к. в случае, если используются
XML-файлы, которые содержат бинарные вставки и затем упаковываются (GZIP, DEFLATE и т. п.) для экономии трафика, то на самом деле выгоднее эти вставки делатьне в Base64-кодировке, а в HEX, что может противоречить интуиции.
Кроме того, в ней проливается свет на сжатие
HTTPS может использоваться не только для защиты, но и для сжатия данных. Протоколы SSLv3 и TLS дают возможность договорится сторонам об использовании сжатия при установке соединения. Такой способ выглядит привлекательней метода
с «Content-Encoding:gzip/deflate». Во первых, сжимаются все данные (включая заголовки), идущие в обе стороны. Во вторых, при сжатии может учитываться история запросов/ответов, что повышает эффективность сжатия.
Рекомендую статью к прочтению полность, тем более она небольшая.
Казань 🚘 Лениногорск 🚘 Казань
На выходных (18 и 19 февраля) буду в Лениногорске.
Где еда?

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