Снова Дыбонины
У меня несколько лет назад в дереве завелись Дыбонины — один из моих многочисленных прапрапрапрапрадедов носил, как оказалось, такую фамилию. Я очень хотел, чтобы у меня в дереве появилась
Никак не могу найти откуда же они появились, напряг курских исследователей —
Поэтому каждая бумага с этой фамилией у меня на вес золота. И вот недавно в самарском архиве нашлась запись о смерти отставного рядового Петра Фёдоровича Дыбонина — брата моего
Это хорошо, что фамилия ещё
Интерпретатор Brainfuck на языке R
В качестве упражнения написал тривиальный интерпретатор «Брейнфака» на языке «Эр», никаких оптимизаций, кроме преподсчёта переходов. Даже на версию без поддержки вложенных циклов ушло прилично времени — некоторые вещи у меня пока со скрипом идут. Зато воспользовался разными структурами данных и сделал класс на RC (в языке «Эр» три встроенных способа работы с классами).
Аналог defer в языке R
В Гоу есть интересная конструкция (defer) — её содержимое выполняется, когда заканчивает работу функция, в которой эта конструкция объявлена, очень удобно память освобождать или другие ресурсы. Я накидал небольшой пример, чтобы было понятно:
package main
import (
"bufio"
"fmt"
"os"
)
func readFile(filename string) (out []string) {
file, _ := os.Open(filename)
defer file.Close()
b := bufio.NewReader(file)
for {
if str, err := b.ReadString('\n'); err != nil {
break
} else {
out = append(out, str)
}
}
return out
}
func main() {
var lines []string
for _, line := range readFile("/etc/passwd") {
if line[0] != '#' {
lines = append(lines, line)
}
}
fmt.Println(lines)
}В примере одна функция построчно читает файл и возвращает массив строк. Её использует основная функция (main), чтобы прочитать файл с информацией о пользователях в системе, удалив оттуда комментарии — строки, начинающиеся с «#». Обработку ошибок я не стал делать — и без этого длинновато вышло.
В фунции чтения файла блок defer вызовется как только мы покинем функцию и закроет используемый файл. Такой способ лучше, чем отсутствующий «Гоу» блок try…finally, так как позволяет указать способ освобождения ресурса очень близко к началу его использования.
Есть языки, которые, на мой взгляд, решают эту задачу ещё лучше (например, Пайтон со своим with), но у Гоу своя атмосфера и выбранное решение отвечает духу языка.
«Эр» на «Гоу» совсем не похож, у языков совершенно разные идеологии, поэтому я очень удивился, обнаружив в «Эр» тот же подход, что выбран в «Гоу».Тот же пример на «Эре»:
readFile <- function(filename) {
f <- file(filename, 'r')
on.exit({
close(f)
})
return(readLines(f))
}
lines <- readFile('/etc/passwd')
print(lines[!grepl('^#', lines)])Конструкция on.exit делает тут ровно то же, что defer в «Гоу». Нельзя не заметить, что программа стала гораздо компактнее, но в многословности Гоу обвинить нельзя —
Панмировые боги
Мы тут решили расширить дочке музыкальный репертуар, а то в последнее время у неё наметились явные фавориты и мы
Пока слушали, мне подумалось, что это была отличная заставка для для альтернативной версии сериала «Американские боги» (снят по книге Нила Геймана). Песня, безусловно, противоположна по смыслу, но затрагивает ту же тему.
То и другое произведение упоминает массу богов, но с разных сторон — песня
В сериале конфликт между старыми богами — то, чему люди
Вполне возможно, что Гейман проглядел эту идею или принёс её в жертву сюжету —
Честно сказать мне с такой мыслью трудно согласиться.
Может это и слишком наивно, когда на Часах Судного дня 2,5 минуты до полуночи, но мне кажется, что любовь, семья, человечность, взаимопомощь, доброта — всё это в большой цене и сейчас, эти старые боги (давайте придерживаться этого термина) могут спать спокойно — людским вниманием они будут обеспечены всегда.
Да и новые боги всё же лучше многих старых — куда более мягкие, податливые, демократичные. Вряд ли интернет стал бы так популярен в наше время, если бы требовал кровавых жертв перед каждым к нему подключением. Интернет вообще один из самых приятных богов — даже
Да, новые боги требуют ценнейшего ресурса — времени (как будто старые не требовали), но и давать способны немало, это уже вопрос собственных целеустремлений того, кто к ним обращается.
Электросамокаты в Айя-Напе
Хочу передать привет туристической Казани из туристической
Рассекали с ветерком, дочь в восторге — всё время оборачивалась на меня, не могла поверить счастью, в конце крепко обняла, что нужно ещё отцу для счастья? Очень бы хотелось, чтобы
Технических характеристик не знаю, но разгоняется до вполне приличной скорости даже в гору — быстрее уже и не надо, за час прогулки аккумулятор не потерял ни одного деления. Час прогулки обошёлся в €10.
Тридцать шестой выезд за монетами
Довольно неплохо в этот раз. Царские монеты: денга 1747, копейка 1858, копейка 1859, 2 копейки Александра I, 2 копейки 1915. Ранние советы: 5 копеек 1928, 10 копеек 1929 (серебро), 2 копейки 1930, 3 копейки 1932, 2 копейки 1936, 3 копейки до 1961.
Остальное: тупоконечная пуля, медное кольцо, пуговица красноармейца,
ООП в R
Я думал, нет, даже надеялся, что присваивания в «Эр» единственная запутанная вещь.
Я надеялся, что это отражение некой эволюции, но нет, некоторые апологеты языка рекомендуют использовать разные реализации в разных случаях, говорят, что каждая из систем несёт в себе определённые удобства.
Удобства я пока не ощутил, каждая из система плоха, на мой вкус, зато изучая здешние объектные модели, наткнулся на интересное.
Каждая функция создаёт, как обычно, свою зону видимости, насколько я понял, тут она зовётся «окружением», причём из вложенной функции можно обращаться в окружения выше, если я правильно понимаю, сколь угодно далеко, пока не упрёшься в глобальное окружение — верхний уровень программы.
Самое интересное, что окружениями можно манипулировать — это обычные объекты, которые содержат в себе текущие переменные. В итоге сэмулировать собственный класс без затей и претензий можно вот так:
NewCat <- function() {
phrase <- 'Meow'
say <- function() {
print(phrase)
}
environment()
}
cat = NewCat()
cat$phrase # Meow
cat$say() # MeowВ «Эр» функции возвращают последнее значение, тут последним создаётся объект окружения, который возвращает в себе свою зону видимости и с которым можно работать как со списком (доллар — такой синтаксический сахар обращения к элементу списка).
При желании достаточно многое можно сделать с таким подходом (наследование, например), но я всё же буду изучать более естественные способы создания объектов.
Опера Бриттена
Последняя страничка, которую я прочёл этим браузером содержала новость о переходе на чужой движок. Это воспринималось как предательство, я закрыл браузер и деинсталлировал его, едва дочитав статью.
Дальше в качестве основного браузера я использовал «Сафари» — «Хром» мне казался слишком пресным, «Файэрфокс» — слишком приторным, «Вивальди» —
Никогда не подумал бы, что вернусь на «Оперу». Однако ж вышел новый релиз, который меня убедили поставить коллеги — и работаю вторую неделю, уютно. Всё на своих местах, есть встроенные «Телеграм» и «Вотсапп», основные мои пейджеры — это очень удобно, есть блокировщик рекламы, ВПН и куча мелочей, облегчающих жизнь. Если вы ещё не видели этот браузер, рекомендую хотя бы попробовать, имеет смысл.
Присваивания в R
В языке много необычного, но почти сразу бросается в глаза наличие целой кучи операций присваивания, большинство из которых, правда, являются альтернативными способами записать одно и то же. Значительная часть операций несут в себе очень чёткую логику, а в двух из них такая восхитительная путаница, что даже опытные программисты на «Эре» иногда не знают как это всё работает. О них и хочу рассказать.
Сначала небольшой исторический очерк.
В далёком 1964 году на свет появился язык программирования APL — функциональный язык программирования, предтеча разных там «Матлабов» и иже с ними. Язык вводил для своих нужд целую кучу специальных значков в качестве операторов, так что программисты даже использовали специальные накладки на клавиатуры, либо рисовали спецсимволы фломастерами.
Вот так, например, выглядит на «АПЛе» гиковская игра «Жизнь»:
life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}Стрелка слева от слова «life» — операция присваивания, примерно в таком виде она по наследству перешла во многие математические языки, в том числе и в «Эр». Обычное «равно» же в «Эре» использовалось для другой цели — присвоения значений именованным параметрам:
op <- function (..., func) print(get(func)(...))
op(1, 2, 3, 4, 5, func = "sum") # =15
op(4, 2, func = "/") # =2Пример выше иллюстрирует использование обоих операторов — стрелкой мы присваиваем переменной тело анонимной функции, которая принимает неограниченное количество параметров и один именованный параметр, а ниже указываем значение именованного параметра через «равно».
Как видите, символ деления вполне подходит в качестве имени функции, но об этом
Присваивание стрелкой и наличие в языке «равно», которым нельзя присваивать значения переменным, приводило новичков в замешательство, так что под влиянием более современных языков («Си», «Джавы» и так далее) случилось непоправимое — «равно» стало использоваться и для присваивания тоже, что только усугубило путаницу:
# Присваивание переменной «x» значения «1»
x = 1
f <- function(x) print(x)
# Вызов функции «f» со значением «5» аргумента «x»
f(x = 5)
# Вызов функции «f» с присваиванием переменной «x» значения «5»
# и передачей этого же значения в качестве первого аргумента
f((x = 5))Казалось бы все операции выше выглядят вполне логично и «равно» тут исправно выполняет новую роль. Но увы. Дело в том, что «Эр» — язык «ленивых» вычислений, выражения в аргументах передаются в функцию не значениями, а промисами, которые будут вычислены в момент использования.
Это означает, в частности, что если аргумент не использовался в функции (выполнение пошло
x = 1
f <- function(x) TRUE
f((x = 5))
print(x) # выведется единицаТак как первый аргумент в функции использован не был, то переданное выражение вычислено не было, а значит и переменная «x» своего значения не изменила. Возможно новичкам и стало проще, но наравне с этим на поле языка рассыпалось несколько новых интересных грабель.
Есть и ещё проблемы. Операции «стрелка» и «равно» имеют разный приоритет и их лучше не использовать в цепочках присваиваний вместе:
# работает, вычисляется справа налево, трактуется как a = (b = 5)
a = b = 5
# работает, вычисляется справа налево, трактуется как a <- (b <- 5)
a <- b <- 5
# выдаст ошибку, так как «стрелка» имеет приоритет выше: (a <- b) = 5
a <- b = 5
# работает, так как «стрелка» имеет приоритет выше: a = (b <- 5)
a = b <- 5Вообще, конечно, не всё так страшно — можно это всё либо понять (что почти никто не делает), либо запомнить несколько нехитрых правил (прочитав пару хороших книг по языку), либо набить шишки на практике (что чаще всего и происходит).
Счастливые билеты
Мы тут недавно с одним товарищем разговорились про точное количество «счастливых» билетов. В ответ я вспомнил, что
На что товарищ прислал мне ссылку на выписку из статьей о счастливых билетах журнала «Квант». Там, помимо перебора, предлагается несколько методов вычисления, в частности есть даже интеграл:
Вообще статьи интересные, умели же раньше писать! Кстати, стало интересно насколько сейчас плох
Вариант на R, который я наскорую написал по мотивам второй статьи из подборки выглядит вот так:
N <- function (n, k) {
if (n == 1)
ifelse(k >= 0 & k <= 9, 1, 0)
else
sum(sapply(0:9, function (l) N(n-1, k-l)))
}
lucky <- function (n) {
0 -> s
for (k in 0:999) {
N(3, k) -> v
if (v == 0) {
break
}
s + v * v -> s
}
s
}
print (lucky(3))Выполняется вместе с запуском интерпретатора за треть секунды, если
Сумматор Вебба
На днях в фонде музея появился экспонат, которому без малого 150 лет — это сумматор Чарльза Вебба. Выпущен он между 1868 и 1889 годами, первая дата — год получения патента на это устройство, вторая — дата выпуска более изящной второй версии устройства, без деревянного основания.
Американский поэт, автор, журналист и изобретатель Чарльз Генри Уэбб родился 24 января 1834 года
Свою карьеру журналиста Вебб начинал в газете
Как изобретатель он имел несколько патентов, несколько из них — на вычислительные машины, в том числе и на упомянутый сумматор, который назывался просто «The Adder».
Устройство не впечатлит сегодняшних детишек вычислительной мощностью — в довольно массивном корпусе красного дерева скрывается несложный механизм, закрытый двумя поворотными колёсами из бронзы. На правом — сто значений, тут набираются цифры для сложения, на левом, которое поворачивается на одно деление при переполнении правого — лишь 50. Так образом можно складывать числа суммой до пяти тысяч.
В комплекте было стило, но оно, к сожалению, не сохранилось, как и прочие элементы комплектации.
Порядок использования устройства следующий: в начале работы на сумматоре вручную выставляется ноль на обоих дисках, после чего стило вставляется в отверстие напротив суммируемого числа и диск проворачивается до отметки «ноль». Так числа и складываются — повороты дисков накапливают значение, в окошечке виден текущий результат.
Про две тыловые камеры в смартфоне
Выбирал сегодня, пока ехал в такси, подвижный фон в смартфоне и заметил, что у него есть перспектива — фон рисованный и разные планы рисунка при наклоне двигаются с разными скоростями.
Подумал, что странно, что никто не сделал (или уже сделали?) такое же с фотографией — ставишь на фон и в зависимости от глубины части фотографии смещаются. Я видел софт, который такое умеет по стереопаре.
Мысль пошла ещё дальше — уже достаточно много смартфонов с двумя тыловыми камерами, межцентровое расстояние там небольшое, что ограничивает глубину, но его можно разнести сильнее, вплоть до двух камер на разных концах смартфона.
Получится отличная мулька — делаешь снимок двумя камерами сразу, он сохраняется в специальном формате и в просмотре при наклоне получается эффект объёма
Арифмометр «Golden Gem»
Потихоньку двигаюсь к цели — хоть
Большинство экземпляров у нас родом из позднего СССР, это время моего детства. Подозреваю, что на шкале времени студентов, для которых и работает музей, Советский Союз и динозавры сосуществуют
А уж гаджеты того времени — просто два в одном. Мой интерес к истории очевиден, а кроме этого я ещё и гаджетоман, хотя старательно из себя это вытравливаю.
На этот раз у меня в руках новый экземпляр для музея — арифмометр «Голден Гем», произведённый
Эта машинка довольно увесистая — 450 грамм, внутри стальная рама с семью металлическими цепочками, с помощью которых и производятся вычисления. Цепь протягивается до нужного значения в верхнем окошке при помощи стила, ставляемого в звено. Поворотая ручка справа внизу служит для сброса разрядов.
Существуют несколько модификаций этого арифмометра — машинка была довольно популярной и выпускалась до первой половины
На самом устройстве времени выпуска нет (разве что
Ой, Дуся, ой, Маруся
На днях смотрел новый клип группы «Отава Ё» на песню «Ой, Дуся, ой, Маруся», один кадр вызвал ощущение сильнейшего дежавю. Почти мгновенно понял почему.
16 лет назад я
Архив самоценен, но примечательно ещё и то, что Сергей Михайлович использовал хитрое устойство, представляющее из себя, по сути, три фотокамеры, снимающие через разные светофильтры — красный, зелёный и синий. Демонстрировали получившееся через специальный проектор — свет проходил через все три изображения, окрашивался и совмещался на одном экране, получалось цветное изображение.
Сейчас таких ухищрений, естетственно, не требуется.
Фотографии уже много лет делают сенсацию у свежеподключившихся, а 16 лет назад это было свежо настолько, настолько запало в память, что я не раздумывая понял что вижу в кадре — имитацию фотографии «Крестьянские девушки» 1909 года.
Тридцать пятый выезд за монетами (открытие сезона)
Первый выезд «в поля» в этом году.
¹⁄₄ копейки 1909 года, серебряные 15 копеек 1923, 2 копейки 1929, 3 копейки 1968, 3 копейки 1980, пуговица «Копейкинъ, 1 сортъ, Peterburg», две «конины» плюс обломок, медаль «За доблестный труд в Великой Отечественной Войне 1941—1945 гг.» (поздний вариант медали), пуговица с рисунком, который уже не разобрать, обломок бляшки ремня,
Безо
С употреблением «без» там где нужно «безо» то же — сейчас слышу и вижу везде и очень страдаю.
Матфей и Стефан
А вот, например, странная вещь, которая не даёт мне покоя. Есть у меня такая ветка — Стрелковы/Шапкины, я о них писал буквально недавно.
Стефан на рисунке выше — мой прямой предок, прапрапрадед, родился по Бугульмой, в деревне Старое Чирково. Странность в том, что его зовут именно Стефан, а отца — Матфей, оба через «ф», хотя рядом навалом Матвеев и Степанов — записи об их крещении на соседних страницах.
С одной стороны, спасибо — так гораздо проще устанавливать родство. С другой стороны — откуда такое различие? Как версия — возможно мои предки с этой стороны не русские, а например обрусевшие поляки.
Продолжая версию — там Солдатская Письмянка недалеко, одна её сторона называлась в те времена «Панской», может они оттуда? Фамилия «Стрелковы» может указывать на военное происхождение.
Дореволюционный «Однер»
О Вильгодте Теофиле Однере я уже рассказывал — это
В 1905 году Вильгодт умер и управление компанией перешло к его сыну и партнёру отца — Френку Хиллу. После революции компанию национализировали, бывшие владельцы переехали в Швецию, в СССР же знаменитые арифмометры выпускались ещё очень долго. Знаменитые «Феликсы» — это, по сути, клон «Однера» с модификациями.
Благодаря моей бабушке, которая забрала с предприятия списанный «Феликс», я с детства умею обращаться с такими машинками, но этот экземпляр уже не рабочий — сильно заржавел, зато обошёлся дешевле рабочих моделей.
Огород над печью для обжига
Тех, кто читают мой блог недавно, с подключением, а остальные знают, что я не так давно увлёкся кирпичными клеймами. Теперь кирпичи находят меня везде.
На днях посещал музей дома культуры железнодорожников в посёлке Юдино близ Казани, хранительница музея случайно узнала об этом моём хобби и показала кирпич, который на фото выше.
Она живёт в частном доме, в посёлке Красная Горка. Её муж и сын, копая яму
Кстати, печь очень большая — проходит не только под их огородом, но и под несколькими огородами соседей. Насколько я понял, дальше раскапывать её не стали, заливать
Снова о Стрелковых и Шапкиных
Я
На скриншоте выше выписка за 1907 год, где косвенно упомянута смена парадигмы — мой двоюродный прадедушка Василий Павлович записан сразу под двумя фамилиями.