Каррирование и частичное применение

Я, оказывается, путал раньше каррирование и частичное применение. Даже не то чтобы путал, просто не пытался разобраться в чём разница между терминами, применяя то и другое по мере надобности. Недавно на «Хабре» в комментариях мне на моё незнание указали и я уяснил, наконец, что конкретно стоит за каждым термином.

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

// функция, суммирующая два числа
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 создаётся функция, в которую из-за замыкания, «железно» попадает аргумент «x» со значением «2». Поэтому возвращаемая функция будет всегда суммировать с двойкой. С этим фактом тесно связано частичное применение, потому что оно только что, фактически, состоялось.

Частичное применение функции (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» — с единицей.

Очень простые штуки, часто встречающиеся в функциональном программировании.

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

Ошибки и ОБД «Мемориал»

Один и тот же человек (24.40КиБ)

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

Поэтому в военных архивах не следует искать точные совпадения, нужно расчитывать на то, что будут ошибки. Например, в архиве ОБД «Мемориал» (это архив военных потерь) три раза встречается мой дед, только в одном месте неправильно указан год рождения и срезано отчество, в другом случае — имя написано с ошибкой («Федр»).

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

Поэтому будете искать, пользуйтесь возможностью указать только часть имени и отчества, я искал по «Старостин Ф* Н*», «Мемориал» поддерживает такой синтаксис, тут символ „*“ означает «любое количество символов».

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

Новое Исаково

Потихоньку буду продолжать писать заметки о том как продвигается исследование истории моей семьи.

Судя по имеющимся у меня сведениями, один из моих прадедов родился в селе Новое Исаково Бугульминского района. К сожалению, в запросе в Национальный Архив Республики Татарстан я был невнимателен и написал «Исхаково», что стоило мне двух месяцев ожидания, пока работники архива не проверили это неправильное название и не написали мне, что такого села не существовало.

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

Себе на заметку, какая дальше должна быть последовательность действий на будущее.

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

Из «Википедии» несложно узнать, что Бугульма (рассматриваемое мною село находится в Бугульминском районе) с 1850 года находилась в Самарской губернии, которую на протяжении 1918—1920 гг. постепенно разделили между другими регионами. Это мне подходит — у меня прадед родился после 1850, но до революции.

Дальше идём на сайт «Корни и Крылья» и в списке населённых пунктов Самарской губернии находим Аверьяновку в Бузулукском уезде и Исаково Новое в Бугульминском уезде.

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

Для этого качаем книгу «Списокъ населенныхъ мѣст Самарской губерніи» 1900 года выпуска, на странице 203 которой видим деревню Новое Исаково, находящуюся около какого-то ключа, 257 вёрст от Самары (примерно 274 км, по карте примерно подходит), в которой было 28 дворов, 89 мужчин и 94 женщины (на 1897 год).

Тот же населённый пункт указан на странице 112 книги «Списокъ населенных мѣст Самарской губерніи по свѣдѣніям 1889 года», только там написано «сельцо», указано 244 версты (260 км) от Самары, 29 дворов, 50 мужчин и 112 женщин.

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

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

Заплет Вэйв

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

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

Статья «Новый вид электронной почты» от 14 марта 2000 года. Ничего не напоминает? Мне — «Гугл Вэйв».

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

Bolt — автоматическое обновление конфигурации «Апача» на «Маке»

Добавил новую программу в свои «Игры с шелом», назвал «Болт», она следит за изменением папки, куда у вас на «Маке» по-умолчанию смотрит веб-сервер «Апач» (это ~/Sites/), если в ней что-то произошло, то добавляет все папки оттуда как доменные имена в конфигурацию «Апача» и в файл hosts.

Запускать нужно так (из командной строки):

sudo тутполныйпуть/bolt.sh &

Потом ввести пароль администратора. Если затем в папке с сайтами создать, например «site1», то в браузере сразу можно набирать «http://site1», он уже будет открываться. Программа умеет убирать за собой (после перезагрузки компьютера, например).

Скачать можно с «Гитхаба».

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

МюЭсКюЭль

Забавная заметка на «Словомании» про то как должен бы читаться «MySQL»:

Как известно, популярная СУБД MySQL была названа в честь старшей дочери разработчика Майкла Видениуса (а MariaDB и MaxDB — в честь его младшей дочери и сына, соответственно). Если набрать в поиске how to pronounce mysql, то мы получим, в основном, обсуждения двух вариантов — «майэскьюэл» и «майсиквел», из которых первый считается более официальным.

Однако дочь Монти зовут не Май, а Мю. Это то же самое имя, что и у малышки Мю (Lilla My) из муми-троллей. Выходит, что пуристы должны произносить «Мю-Эс-Кью-Эл».

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

Смартфоны vs. телефоны

Время от времени в разговоре об очередном смартфоне кто-нибудь восклицает «мне телефон нужен, чтобы звонить». Ок, ребята, мне, чтобы звонить, вообще только колокольчик нужен.

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

Мне телефон не нужен. Ни чтобы звонить, ни для чего-то ещё. Мне нужно устройство, которое несёт функции телефона, но там должен быть навигатор, почта, твиттер, интернет-пейджер, IP-телефония, фотоаппарат для заметок, браузер и ещё чёрт знает что. Это называется «смартфон». У него есть недостатки — он всегда будет жрать батарею больше, чем телефон и дороже стоить.

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

Перестаньте в разговоре со мной путать одно с другим, пожалуйста.

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

Буква «ё» в гидронимах и топонимах

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

Это — Мёша (10.63КиБ)

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

Или на картах «Яндекса» обозначена улица Константина Царева, я про эту вселенскую несправедливость знаю, потому что на ней жил. Я-то знаю, что фамилия у Константина Царёв, а не Ца́рев, но по карте этого не понять.

Почему люди настолько не любят эту букву — загадка.

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

Загадочный баг в ПХП

Во всех современных интерпретаторов вёдра багов, я обычно и внимания на них не обращаю, но свежезаведённый баг в ПХП какой-то забавный:

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.

Добавлено ещё позднее: разобрался что это за интересная операция.

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

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 для «Айфона», это уже для жены, у неё тогда «Айфон» был.

В 2009-м я купил Driver Detective за 1105,59. Совершенно бесполезная программа оказалась. Я ожидал, что она решил проблемы с драйверами на ноутбуке, но она так мне ничем и не помогла. Смысл её в том, что она самостоятельно обновляет все драйвера в системе (программа под «Виндоуз»). Но то ли она не работает, то ли у меня ноут специфический очень — обновлялись драйвера только под очень известные железки.

В 2010-м был куплен «Навител Навигатор» за 1890 рублей, версия для «Андроида». Пользуюсь до сих пор, хоть и плююсь (медленная очень программа).

В 2011-м я купил программу «Семейное дерево», точнее, это не совсем программа, я оплатил аренду в приложении, которое работает по модели SaaS («программа как услуга»). Заплатил 2132,78 за год, пользуюсь активно.

Далее идут программы только под «Мак».

В том же году оплатил новую версию «Макос» («Лев»), купил за 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. Это небольшая программулина позволяет увеличить звук на «Маке», плюс добавляет эквалайзер. Использую всё это постоянно.

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

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

Ни-ни-ни

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

Из твита @japanreports. Вообще интересный твитер, например, там есть ссылка на сногсшибательный ролик про то как японцы лес валят. Там у них 25-й век наступил, не иначе.

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

Банкоматы «Ак Барс Банка»

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

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

# 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('&nbsp;', ' '))

Выводится список банков (регион и город задаётся в коде в очевидном месте), например, на настоящий момент список выглядит вот так:

ОАО Банк ЗЕНИТ 
ОАО "РГС Банк" 
АКБ "Абсолют Банк" (ЗАО) 
Быстробанк ОАО 
ОАО "АК БАРС" БАНК 
АКБ "РОСБАНК" (ОАО) 
НОМОС-БАНК (ОАО) 
АКБ МБРР (ОАО) 
ЗАО АИБ "Ипотека-Инвест" 
ОАО "АИКБ "Татфондбанк" 
АКБ "БТА-Казань" (ОАО) 
КБ "Юниаструм Банк" (ООО) 
ОАО АКБ «Авангард» 
ОАО КБ "Восточный"

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

Что такое с Mail.app?

Я, в качестве основного почтового клиента в «Маке» использую Mail.app. Всё достаточно неплохо, но иногда это приложение сходит с ума (я пока не понял в каких случаях) и портит мне кодировку писем (см. скриншот). Неужели за столько лет существования этой программы только у меня возникает эта проблема, раз её ещё не поправили? Или, может, есть какой-то общеизвестный костыль, который все подставляют в этом случае и живут неплохо (менять почтовую программу не хочу).

Снимаю, порчу (29.03КиБ)

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

Немного статистики

С 2008 года я потратил 19961 рубль 72 копейки на покупку программ.

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

Сахар? Песок!

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

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

100% процентов продавцов, у которых я когда-либо покупал сахар называли его «песок». Для меня «песок» — обычная форма сахара, зачем это вообще упоминать? Это как я бы спрашивал в ларьке воду, а меня спрашивали — вам в каком агрегатном состоянии?

Рафинад — это как раз изменённое, отличное от обычного «агрегатное состояние» сахара. Это как я бы спросил в кафе нет ли у них льда в «Кока-колу».

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

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

Бинарные данные в XML

На «Хабре» статья вышла, в ней есть интересный и обоснованный вывод:

Этот пример имеет практическое значение, т. к. в случае, если используются XML-файлы, которые содержат бинарные вставки и затем упаковываются (GZIP, DEFLATE и т. п.) для экономии трафика, то на самом деле выгоднее эти вставки делать не в Base64-кодировке, а в HEX, что может противоречить интуиции.

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

HTTPS может использоваться не только для защиты, но и для сжатия данных. Протоколы SSLv3 и TLS дают возможность договорится сторонам об использовании сжатия при установке соединения. Такой способ выглядит привлекательней метода с «Content-Encoding:gzip/deflate». Во первых, сжимаются все данные (включая заголовки), идущие в обе стороны. Во вторых, при сжатии может учитываться история запросов/ответов, что повышает эффективность сжатия.

Рекомендую статью к прочтению полность, тем более она небольшая.

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

Где еда?

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

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

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

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

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