Вызов C из R
Заинтересовался темой вызова функций Си из языка «Эр». Обнаружилось целых два интерфейса: простоватый вызов «.C» и более сложный «.Call», к сожалению ни один из них не предназначен для вызова произвольного кода — со стороны Си в каждом из случаев следует соблюдать некоторые соглашения.
Я решил попробовать подёргать функции библиотеки libmagic, поскольку
Так как .C не умеет работать с возвращаемыми из функции значениями (возможен возврат только через параметр), да и передаётся всё как указатели, пришлось даже для этой простой задачи написать обёртку. Скомпилировать её можно командой make, либо запустить руками строчку компиляции из файла сборщика.
Программа на «Эре» небольшая, бо́льшую часть занимает определение констант. Внутри захардкожен пример использования, так как библиотеку я делать не намерен, он там так и останется.
Примечание: я знаю, что функция strdup не является переносимой, но мне, если честно, всё равно, не хочется ради исследования принципа тащить в код её реализацию.
Пульс покоя в часах
В моих
Вообще динамика меня радует — среднее значение за пару лет упало на десять пунктов, а минимум у меня теперь — 60, грех жаловаться. Я, правда, хотел бы ниже, но чёртово лето не радует велосипедной погодой, а в спортзале крутить педали уныло, остаётся надеяться, что занятия с тренером в числе других мышц положительно сказываются и на сердечной.
Но сегодня утром я засомневался — когда завибрировал будильник в часах, я сел в кровати, потянулся к кнопке выключения и обратил внимание, что пульс на экранчике в тот момент был 56.
Немного непонятно. Пульс покоя на сегодня у меня 66. Вроде как часы должны мерять пульс сразу перед пробуждением
Ещё находки на газонах
Проливные дожди, которые не прекращаются с самой весны, портят мне настроение — за летом приходится буквально гоняться, выясняя по карте осадков где сегодня на территории Татарстана не будет дождя. Но польза от них тоже имеется — на газонах, как оказалось, дождь выбивает любопытные артефакты.
Находки с прошлого раза: советская армейская пуговица 1979 года (на обороте надпись — «МОСШТАПМ 79»), бутылёк
Отдельной строкой хочу выделить эту бутылочку — была закопана донышком вверх, я её сначала пнул, ожидая, что из земли вывернется отколотое днище, но она и не шевельнулась, поэтому я ею и заинтересовался. Не знаю какого она времени — ни одного клейма или надписи на ней нету, но забрал — очень уж красивая.
Читабельный и паркинг
Признаться, я считал, что слова «читабельный» и «паркинг» очень недавнее изобретение. Я всегда поправляю своих собеседников, если они их употребляют. Мне представлялось, что это приобретение времён Перестройки — когда в страну устремился поток товаров без перевода на русский язык, а с ними и новые слова.
Каково же было моё удивление, когда я обнаружил, что слово «читабельный» употребляется в книге «Дар слова» Н. Абрамова, 1909 года выпуска, а слово «паркинг» — в сравнительной энциклопедии
Мне
99 бутылок: R
60. R. Как многие наверное помнят, в качестве хобби я время от времени пишу на разных языках программирования американскую «Песню о пиве»
Это довольно известное развлечение — реализовывать на куче языков
Я выбрал именно «Песню о пиве», так как не всем языкам из моего списка, под силу
# 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")ПХП и строгая типизация
В ПХП много странностей, ещё одна дала о себе знать в неожиданном месте. Сначала немного теории.
Во многих языках дозволяется определять функции, методы или их аналоги с необязательными параметрами, их при вызове можно не указывать способом, предусмотренным языком. По моим ощущениям наиболее распространён способ с присвоением таким параметрам значений
ПХП использует эту схему везде, кроме расширений и встроенных функций. Понятие «необязательный параметр» там есть, но обрабатывается иначе — у параметра указывается тип (например «строка»), необязательность и «нулабельность» (можно ли в этом параметре принимать null в качестве значения).
Последнее очень полезно для числовых и булевых типов — если «нулабельность» не указана, то null будет преобразован по правилам языка в значение указанного типа.
У многих функций ПХП в документации указаны значения, которые будут подставлены, если параметр не указан. В тех случаях, когда такое значение не указано, можно было попытаться подставить null, многие расширения это проглатывают.
Например, у нас преспокойно работал примерно такой код:
public function put(Serialized $object, $eventName, $extraEventData, $uniqueId = null)
{
return DI::gearman_client()->doBackground(
$this->queueName,
igbinary_serialize(
[
'object' => $object,
'event_data' => $extraEventData,
'event_name' => $eventName,
]
),
$uniqueId
);
}Всё работало корректно, пока не пришёл ПХП7 и мы не стали потихоньку переползать на строгую типизацию. Вечером я закоммитил изменения в этом файле, которые позволили включить строгую типизацию, а за завтраком поймал в логах странную ошибку, которая сообщала мне, что в метод doBackground время от времени получает в качестве последнего параметра null, а так нельзя.
Сначала я недоумевал, а потом догадался, что случилось — у doBackground последний, необязательный парамер имеет тип «строка» и он не «нулабельный». То есть в строгой типизации я его должен либо не передавать вовсе, либо передавать туда исключительно строку. А null, который передавался туда до перехода на строгую типизацию более не подходит, ибо он не строка.
Пришлось переписать более уродливо:
public function put(Serialized $object, string $eventName, $extraEventData, string $uniqueId = null)
{
$args = [
$this->queueName,
igbinary_serialize(
[
'object' => $object,
'event_data' => $extraEventData,
'event_name' => $eventName,
]
),
];
if ($uniqueId !== null) {
$args[] = $uniqueId;
}
return DI::gearman_client()->doBackground(...$args);
}Странно то, что у необязательного параметра нет никакого значения
Не смог найти, но я помню, что было
Диета
Примерно в начале года я впервые в жизни сел на диету. Совершенно не видел в этом необходимости, но тогда я начал заниматься в зале с тренером, а она на этом настаивала. Глупо нанимать тренера, а потом не делать то, что она говорит. Диета несложная — ничего сладкого, мучного, молочного, сбалансировать поступление углеводов, жиров и белков, есть пять раз в день в пределах заданного количества калорий.
Сначала было тяжело, я дисциплинировал себя при помощи программы на смартфоне, потом привык к питанию и сейчас получается всё само собой
Труднее всего сначала было без сахара (я сладкоежка), но оказалось, что фрукты отлично заменяют конфеты и шоколад, кроме того существует такая вещь как шоколад из кэроба. Всё это позволяет пережить первые трудные месяцы, потом уже легче.
Сейчас тренер разрешила мне раз в неделю есть что хочется, но оказалось, что не так много мне и хочется, покупаю себе мороженное в жару или иногда позволяю кофе с молоком.
Не знаю на всю это жизнь