«Песня о пиве»: R

Как многие наверное помнят, в качестве хобби я время от времени пишу на разных языках программирования американскую «Песню о пиве»

Это довольно известное развлечение — реализовывать на куче языков что-то простое, обычно выбирают числа Фибоначчи, «Песню» или ещё что-то незатейливое.

Я выбрал именно «Песню о пиве», так как не всем языкам из моего списка, под силу что-то большее. До сегодняшнего дня в списке было 57 языков, сегодня, 58-м пунктом, к ним вполне ожидаемо присоединится язык «Эр», о нём я уже немного писал, собираюсь писать и дальше как время образуется.
# Written by Evgeny Stepanischev, 2017

bottles <- function(beer) {
	ifelse(beer == 0, "no bottles",
		ifelse(beer > 1, paste(beer, "bottles"),  "1 bottle")
	)
}

for (i in 99:1) {
	paste(bottles(i), "of beer") -> b

	cat(b, " on the wall, ", b, ".\n", sep = "")
	cat("Take one down and pass it around,", bottles(i - 1), "of beer on the wall.\n\n")
}

cat("No more bottles of beer on the wall, no more bottles of beer.\n")
cat("Go to the store and buy some more, 99 bottles of beer on the wall.\n")
Комментировать
21 июля 2017 20:37

Читабельный и паркинг

Читабельный (88.37КиБ)
Употребление слова «читабельный» в книге «Дар слова» 1909 года

Признаться, я считал, что слова «читабельный» и «паркинг» очень недавнее изобретение. Я всегда поправляю своих собеседников, если они их употребляют. Мне представлялось, что это приобретение времён Перестройки — когда в страну устремился поток товаров без перевода на русский язык, а с ними и новые слова. Паркинг (63.01КиБ)
Слово «паркинг» в энциклопедии «Великий вызов» 1969 года

Каково же было моё удивление, когда я обнаружил, что слово «читабельный» употребляется в книге «Дар слова» Н. Абрамова, 1909 года выпуска, а слово «паркинг» — в сравнительной энциклопедии США-СССР, «Великий вызов» 1969 года выпуска.

Мне по-прежнему не очевидна необходимость нахождения слова «паркинг» (когда уже есть «парковка» и «стоянка») в языке, а с «читабельностью» я уже кажется готов смириться.
11 комментариев
19 июля 2017 17:24

Ещё находки на газонах

Находки на газонах (95.60КиБ)
Совокупные находки на газонах за последнее время

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

Находки с прошлого раза: советская армейская пуговица 1979 года (на обороте надпись — «МОСШТАПМ 79»), бутылёк из-под туши фабрики «Красный художник» (1934—1946 гг.), снизу надпись «СОЮЗ», атрибутировать удалось по части уцелевшей этикетке: «МОСХИМТ[РЕСТ] [Н.] К. [М. П.]», бутылёк советского периода (внизу только цифра — «30»), ¹⁄₂ копейки серебром Николая I (1839—1848 гг., на снимке её нет, забыл положить), 10 копеек 1943, 1 копейка 1949 и россыпь шахтёрских пуговиц.

Бутылочка (68.28КиБ)
Очень красивая бутылочка, лежавшая донышком вверх

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

Пульс покоя в часах

Пуль покоя (33.23КиБ)
График пульса покоя за последний месяц

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

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

Но сегодня утром я засомневался — когда завибрировал будильник в часах, я сел в кровати, потянулся к кнопке выключения и обратил внимание, что пульс на экранчике в тот момент был 56.

Немного непонятно. Пульс покоя на сегодня у меня 66. Вроде как часы должны мерять пульс сразу перед пробуждением или что-то такое. Но если в момент пробуждения он был 56, то перед пробуждением он должен быть ниже. Я знаю, что наручные часы точностью в измерении пульса похвастаться не могут, но тут речь об обрабоке своих собственных данных. Мне бы хотелось, что бы они хотя бы тенденцию улавливали верно, будет обидно, если они и этого не умеют.
2 комментария
7 июля 2017 09:41

Вызов C из R

Заинтересовался темой вызова функций Си из языка «Эр». Обнаружилось целых два интерфейса: простоватый вызов «.C» и более сложный «.Call», к сожалению ни один из них не предназначен для вызова произвольного кода — со стороны Си в каждом из случаев следует соблюдать некоторые соглашения.

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

Так как .C не умеет работать с возвращаемыми из функции значениями (возможен возврат только через параметр), да и передаётся всё как указатели, пришлось даже для этой простой задачи написать обёртку. Скомпилировать её можно командой make, либо запустить руками строчку компиляции из файла сборщика.

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

Примечание: я знаю, что функция strdup не является переносимой, но мне, если честно, всё равно, не хочется ради исследования принципа тащить в код её реализацию.
Комментировать
1 июля 2017 21:21

Находки на газонах

Найденное (47.47КиБ)
Находки на газонах и на огородике моих хороших знакомых

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

Но это было отступление. Тема внимательного осмотра газонов принесла ещё плоды — 2 копейки 1936, 20 копеек 1956, апекарский пузырёк с надписью «Вильна 30» (так назывался Вильнюс до 1918 года) и гильзу от винтовки Мосина, я её сильно протравил, чтобы посмотреть год, но разглядел только цифру «17», неясно что это — то ли 1917 год, то ли маркировка Подольского завода.

А ещё мои хорошие знакомые позвали меня покапаться на их огородике, прямо после работы, благо от работы к ним ехать недалеко. У них я нашёл 2 копейки серебром 1839—48 гг. и совершенно стёртый медяк, по диаметру аккуратно совпадающий с копейкой Александра III или Николая II. На медяшке уже ничего не разглядеть, а 2 копейки я попробую потравить, может проступят ещё детали.
1 комментарий
29 июня 2017 18:26

Новый экспонат в музей: НПЛ-М

НПЛ-М (106.77КиБ)
НПЛ-М — наколенный планшет лётчика (модернизированный)

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

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

Что интересно, судя по форумам, пилоты малой авиации до сих пор охотно используют советские планшеты, подобные этому — говорят они очень удобные. Вроде как на складах ДОСААФ ещё осталось достаточное количество и есть интернет-магазины, которые специализируются на распродаже этих остатков.
6 комментариев
27 июня 2017 23:04

Применил «R» на практике

Квантили (11.16КиБ)
Вычисление на языке «Эр» разных квантилей делается одной командой

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

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

Тем не менее, не чураюсь применения языков на практике, в работе. Так в «Яндексе» я внезапно несколько лет попрограммировал на «Пайтоне», который выучил по забытой соседом на общей кухне книжке, а на текущем месте работы написал специализированную СУБД на «Гоу».

А вчера случилось написать по работе строчку на языке «Эр» (который я сейчас изучаю), всего одну, но полезную — нужно было посчитать различные квантили по количеству страниц на документ, программа с результатом на скриншоте — там загружается файл, где разделитель полей — точка с запятой, из загруженных данных выбирается второй столбец и считаются указанные квантили.
Комментировать
24 июня 2017 20:06

Погодный плагин для «Sublime Text»

Окно редактора (86.25КиБ)
Окно редактора «Саблайм Текст» с погодой и пробками в строке состояния

Написал свой первый плагин для «Саблайма» — для отображения в строке состояния погоды и пробок «Яндекса». Заодно немного повспоминал «Пайтон», давно на нём ничего не писал.

Удивительно, но факт — другого работоспособного плагина на эту тему не обнаружилось. Единственный конкурент использует старое АПИ «Яху», которое уже не работает, потому не работает и плагин.

Отдельное спасибо «Яндексу» за то, что их АПИ умеет определять текущее местоположение — ничего задавать в конфиге не надо, удобно.

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

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

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

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

Можно ли найти монету на газоне?

10 копеек СССР (169.13КиБ)
Монета, найденная на обычном газоне — 10 копеек СССР

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

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

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

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

Считаю эксперимент удавшимся, но поглядывать на газоны не перестану — вдруг ещё что-то интересное найдётся!

«Гугл» частично заблокирован в России

Нидерландский гугл (53.92КиБ)
Новость о блокировке «Гугла», найденная через нидерландский «гугл»

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

Честно сказать, представить себе интернет без «Гугла» я не могу, какой счастье, что есть (пока?) обходные пути позволяющие им пользоваться несмотря на внесение в реестр. Надеюсь блокировка — недоразумение и всё вернётся на круги своя.
Комментировать
22 июня 2017 15:20

Снова Дыбонины

Дыбонины (69.32КиБ)
Ещё одно упоминание Дыбониных — в четвёртом фонде самарского архива

У меня несколько лет назад в дереве завелись Дыбонины — один из моих многочисленных прапрапрапрапрадедов носил, как оказалось, такую фамилию. Я очень хотел, чтобы у меня в дереве появилась какая-нибудь уникальная фамилия, и вот — появилась, но что-то слишком уникальная.

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

Поэтому каждая бумага с этой фамилией у меня на вес золота. И вот недавно в самарском архиве нашлась запись о смерти отставного рядового Петра Фёдоровича Дыбонина — брата моего прапра-, умер он 19 (31) марта 1894 года «от старости» — такая причина смерти записана.

Это хорошо, что фамилия ещё где-то всплывает, значит не ошибка, но интересно то, что в 1894 году Пётр помер как Дыбонин, а уже следующее поколение помирает с фамилией «Шапкин». То ли концепция фамилии была настолько чужда тем моим предкам, что они её утратили за одно поколение (никогда не слышали от старшего поколения, например), то ли она их чем-то не устроила, непонятно.
8 комментариев
19 июня 2017 22:50

Интерпретатор Brainfuck на языке R

В качестве упражнения написал тривиальный интерпретатор «Брейнфака» на языке «Эр», никаких оптимизаций, кроме преподсчёта переходов. Даже на версию без поддержки вложенных циклов ушло прилично времени — некоторые вещи у меня пока со скрипом идут. Зато воспользовался разными структурами данных и сделал класс на RC (в языке «Эр» три встроенных способа работы с классами).
Комментировать
15 июня 2017 21:27

Аналог 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 комментария
12 июня 2017 20:04

Панмировые боги

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

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

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

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

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

Честно сказать мне с такой мыслью трудно согласиться.

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

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

Да, новые боги требуют ценнейшего ресурса — времени (как будто старые не требовали), но и давать способны немало, это уже вопрос собственных целеустремлений того, кто к ним обращается.
Комментировать
12 июня 2017 13:56