Вызов C из R

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

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

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

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

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

Оставить комментарий

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Страница книги с номером 10: текст о том, как иностранные слова трактуются как русские и наоборот, с примерами и французской фразой «c'est d'une naglesse impostigible!
Употребление слова «читабельный» в книге «Дар слова» 1909 года

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

Текст о многоквартирных домах в пригородах: кирпичные 2–4 этажа, среди зелени, с площадками для игр и парковками.
Слово «паркинг» в энциклопедии «Великий вызов» 1969 года

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

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

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

99 бутылок: R

60. 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")

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

ПХП и строгая типизация

В ПХП много странностей, ещё одна дала о себе знать в неожиданном месте. Сначала немного теории.

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

ПХП использует эту схему везде, кроме расширений и встроенных функций. Понятие «необязательный параметр» там есть, но обрабатывается иначе — у параметра указывается тип (например «строка»), необязательность и «нулабельность» (можно ли в этом параметре принимать 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);
    }

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

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

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

Диета

Примерно в начале года я впервые в жизни сел на диету. Совершенно не видел в этом необходимости, но тогда я начал заниматься в зале с тренером, а она на этом настаивала. Глупо нанимать тренера, а потом не делать то, что она говорит. Диета несложная — ничего сладкого, мучного, молочного, сбалансировать поступление углеводов, жиров и белков, есть пять раз в день в пределах заданного количества калорий.

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

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

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

Не знаю на всю это жизнь или на какое-то время, но в принципе меня не пугает так питаться и всё отведённое мне время.

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

← сюда туда →