Диета

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

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

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

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

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

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

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

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

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

«Песня о пиве»: 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 комментарий
21 июля 2017 21:37

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

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

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

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

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

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

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

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

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

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

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