«Умный» выключатель
Теперь у меня дома два «умных» выключателя. Сам решил с установкой не мучаться, разместил объявление на «Яндекс.Услугах», выбрал из откликнувшихся исполнителей того, кто был согласен приехать прямо сегодня и он мне всё сделал — раздолбил отверстие, всё подключил и смонтировал.
Закрепили на два длинных шурупа (в выключателе есть отверстия), всё хорошо держится, поэтому решили обойтись без монтажных коробок. На стене смотрится очень хорошо. Проблем с подключением к «умному дому» не возникло — зигбишный хаб моментально опознал устройства и всё сразу заработало.
«Алиса» выключатели тоже увидела без усилий, теперь ей можно сказать «выключи всё в детской» и она выключает и люстру, и потолочные светильники, и настольную лампу, и гирлянду над кроваткой. Красота!
В сценариях автоматизации «умного дома» запрограммировал реакцию на нажатие сразу двух клавиш на выключателе — теперь этим действием тоже можно погасить сразу весь свет в комнате. Удобно на выходе выключать сразу всё.
Теперь сделаю небольшую паузу, ничего нового заказывать на буду — в первые дни месяца я уже исчерпал мартовский бюджет на «умный дом», купив увлажнитель. Ну ничего, из февральских заказов
Щелчки при глотании
На сорок третьем году жизни узнал, что не все слышат щелчки при глотании и зевании. Кстати, ориентируясь на эти щелчки, я ещё в детстве развил у себя
Интересно, что слева щёлкает сильнее, чем справа, но в принципе я особого внимания на это не обращаю, тогда как некоторым людям, оказывается, это сильно мешает — собственно вся эта тема всплыла в поле моего внимания во время чтения одного из медицинских форумов, где обсуждали можно ли это
А у вас как? Слышите щелчки?
«Алиса»: месяц использования
Хотел поделиться как проходит освоение голосовых помощников у нас в семье, пока про «Алису», про «Алексу»
Сидим
Алиса отломила от гриба два кусочка и откусила от одного из них. Её шея вдруг вытянулась настолько, что теперь голова девочки покачивалась над верхушками деревьев. «Змея!» — с ужасом запищала пролетающая мимо Голубка. «Я не змея!» — возмутилась Алиса…
И тут «Алиса» на столе выдаёт — «Какой ужас!».
После месяца использования «Алисы» можно определённо сказать — гаджет прижился, правда количество сценарий использования небольшое.
Из самых полезных хочу выделить колыбельные — с ними дочка стала засыпать стала быстрее и проигрывание детских аудиоэнциклопедий «Чевостик» — слушаем запоем, в основном на тему животного мира. Кажется в этом отношении у нас сейчас самый образованный ребёнок в садике. Нельзя не вспомнить и мой интерес к животному миру в детстве — мы выписывали журнал «Юный натуралист», который мне очень нравилось читать. Возможно ли, что такое совпадение интересов — наследственное?
Остальной набор сценариев — «умный дом» (управление гирляндой на кровати в детской, настольным светильником, пылесосом), погода, текущее время, музыка.
Сценарии умного дома у нас не особо многочисленны, но дочке, к слову, очень нравится, что «Алиса» умеет управлять светом,
Делать нечего — купил сяомишный «умный» выключатель, но загвоздка в том, что он не лезет в стандартную коробку под выключатели, надо высверливать.
Теперь к недостаткам. Тут ничего не изменилось, я уже о них писал — «Алиса» время от времени замолкает без причины (вчера перед сном это было настолько часто, что я просто попросил её остановиться), теряет сеть и петросянит.
Последнее, кстати, всех раздражает, не только меня, так как иногда совершенно неочевидно какой командой добиться желаемого, начинаешь перебирать версии до успеха и в процессе перебора обязательно слушаешь эти унылые шутки. Возникает ощущение, что над тобой издеваются, хотя вроде понимаешь, что это не так.
Бывшие коллеги из «Яндекса» уже со мной связались и пообещали
Прибытие поезда на вокзал Ла-Сьота
Помню когда я получал высшее
Чисто теоретически мы наверное все понимали перспективность направления, но перспектива рисовалась очень уж отдалённой. Но вот прошло двадцать лет и всё изменилось — одна из самых востребованных областей, передний край, масса интересных практических результатов, понятных любому обывателю.
Меня увлекает многое из того, что делается на этом поприще,
Вот и мимо восстановленного алгоритмами машинного обучения самого знаменитого фильма — «Прибытие поезда на вокзал
Нас ждёт удивительное будущее!
26 марта 1908 года
Продолжаю оцифровывать бумажные находки с чердаков. В этот раз — очередной лист календаря, на 26 марта 1908 года. Кстати, интересно — отрывные календари ещё продаются?
Недавние жизненные уроки
С тех пор как рассёк до крови бровь, ударившись дома о торец двери, больше не хожу в темноте, вытянув руки вперёд, только загораживая лицо согнутой рукой, локтем от себя.
С последнего ДТП, когда я сильно приложилсся головой о подголовник, проверяю есть ли подголовник вообще, если нет, пересаживаюсь — не хочется в следующем происшествии сломать себе шею.
Насмотревшись роликов про коронавирус из влога Комаровского, стал мыть руки как рекомендуется, — намыливая не менее двадцати секунд, а так же меньше трогать нос правой рукой — через рукопожатие и прочее на руки попадает масса микробов, которые потом так транспортируются на лицо. В сезон простудных заболеваний особенно актуально, надеюсь буду болеть реже.
Греческая шляпа
Слушали мы недавно в исполнении «Алисы»
Действительно, в сказке есть такое место:
Поглядел Добрыня на берег — нечего ему в руки взять: ни дубинки нет, ни камешка, только жёлтый песок на крутом берегу, да валяется его шляпа греческая.
Ухватил Добрыня шляпу греческую, насыпал в неё песку жёлтого — ни много ни мало — пять пудов — да как ударит шляпой Змея Горыныча — и отшиб ему голову.
Повалил он Змея с размаху на землю, придавил ему грудь коленками, хотел отбить ещё две головы…
Вот что же тут такое Добрыня Никитич насыпал без малого центнер песка?
Гипотез много, самая близкая мне гласит, что «греческая шляпа» — это такой шлем цилиндроконической формы с довольно широкими полями, изображение которого известно каждому школьнику по картине Васнецова «Три богатыря». На ней Добрыня Никитич нарисован слева, как раз в «греческой шляпе».
По интуиции, изумляющей своей точностью совпадения с былинной, маститый художник В.М. Васнецов в картине «Три богатыря» изобразил Добрыню Никитича именно в шлеме данного — византийского — вида. Весьма вероятно, что живописец воспользовался былинной подсказкой, выступив таким образом ранее всех филологов и фольклористов с наглядным и справедливым комментарием к эпическому сюжету «Добрыня и Змей».
— Горелов А.А. — «„Шляпа Земли греческой“ в былинах»
Нельзя не упомянуть, что по основной гипотезе это был обрядовый головной убор дохристианских времён, а сам эпизод сражения — искажённое описание некого обряда низложения реально существовавшего княжича Добрыни, который и явился прототипом былинного героя.
Специалистам виднее, но мне, простому обывателю, более близок простой сюжет драки с реликтовым чудовищем при помощи носимого на голове ведра, которое наполнили песком.
🐉🐉🐉
Китайские удлинители
Я опасался, что
Их удобство в том, что розетки в них — универсальные, сразу на европейскую и китайскую вилку. В детской комнате из связки
AppleScript Tetris ★
Я очень люблю «ненормальное программирование» — где вместо получения результата (такого мне и на работе хватает), приходится преодолевать нетривиальные трудности, придумывать
Недостатка в таких задачах у меня в голове не бывает, но руки приложить к ним получается нечасто. «Тетрис» на ЭплСкрипте — один из примеров такого «приложения рук», прошло три года, но он до сих пор мне так нравится, что я решил рассказать о нём ещё раз.
Для начала немного об ЭплСкрипте. Это скриптовый язык для автоматизации, который встроен в МакОС в незапамятные времена — в «Википедии» написано, что он появился аж в 1993 году, то есть широкоизвестный ПХП его младше аж на два года!
Несмотря на то, что язык уже несколько лет не обновляется, заброшенным его не назовёшь, скорее всего в нём просто нечего обновлять — все задачи, которые он призван решать, он решает, в МакОСи есть даже встроенный визуальный редактор и я знаю ребят, которые делают на нём потрясающие вещи в плане создания
Естественно можно программировать и в обычном текстовом редакторе, программы в этом случае выглядят как текст на немного необычном английском языке:
tell application "Microsoft Word" to quit
display dialog "Hello, world!"
print pages 1 thru 5 of document 2Сильно популярным его не назовёшь, но в своей нише он хорош и продвинутые «маководы» о нём знают. До «Тетриса» я писал на нём «песню о пиве» и интерпретатор Брейфака.
За всё историю существования на ЭплСкрипте никто никогда не писал графических интерактивных игр. Причина проста: в языке нет поддержки графики и опроса клавиатуры. ?, расходимся!
Тем не менее идея создать на нём
Первым придумался способ вывода графики — я подумал, что фигуры можно рисовать свёрнутыми окошками
Для этого, в припципе, всё есть — ЭплСкрипт умеет запускать программы и управлять размерами и расположением окон:
tell application "TextEdit"
set the bounds of 1st window whose id is wid to {x, y, (x + |size|), (y + |size|)}
endКогда я попробовал это запрограммировать, меня ждал сюрприз: оказывается программно размер окна можно стягивать в точки разных размеров (мышкой это сделать не получается), составленные из них стакан и фигуры выглядели вполне приемлемо.
Так как вся графика создаётся окошками приложений, то традиционного окна, в котором всё работает, у программы нет — его роль выполняет рабочий стол. Стакан тетриса прилеплен к верхнему краю и отцентрирован по горизонтали.
В первом же прототипе появилась ещё одна проблема — наверху у «МакОСи» есть строка меню, приложения не могут на неё залезать, при попытке вывести в эти координаты окно, оно «сползает» вниз. В итоге первые несколько точек выводились в других координатах и всё рушилось. Было два решения — центрировать ещё и по вертикали
В итоге, способ придумался. Сразу после запуска я вывожу окно в нулевые координаты и смотрю на сколько пикселей оно съехало, это и будет высотой меню:
-- Get height of menu bar
tell application "TextEdit"
activate
make new document at the front
set the bounds of 1st window to {0, 0, 0, 0}
set coords to bounds of 1st window
close 1st window
end
set minimalY to coords's item 2С графикой разобрались, а что с клавишами? В ЭплСкрипте, как я уже говорил, нет способов опросить клавиатуру, существуют плагины и сторонние решения, но их использование рушит всю идею. Хотелось чистого решения.
Голову пришлось ломать очень долго, пока в один момент я не додумался заиспользовать под это опрос значения громкости — уменьшение и увеличение громкости как кнопки влево/вправо, а отключение динамика — для поворота фигуры.
Для этого на пуске я устанавливаю громкость на середину и в цикле опрашиваю текущее значение. После каждого изменения значение опять сбрасывается на среднее:
on levelReset()
set volume output volume volumeMiddle without muted
end
on checkDirection()
set level to output volume of (get volume settings)
levelReset()
_sign(level - volumeMiddle)
end
on checkRotate()
return output muted of (get volume settings)
endТут _sign — моя собственная функция взятия знака, у ЭплСкрипта нет встроенной.
В получившийся вариант вполне можно играть — я пробовал. Немного странное управление через несколько минут уже перестаёшь замечать, единственное, чего не хватает — кнопки сброса фигуры, но тут уж ничего не попишешь.
Если вдруг
Полный исходный код есть на гитхабе.
Гарантийный талон
Про арифмометр «Голден Гем», который я приобретал для Музея вычислительной техники, я уже писал, но недавно снова на него наткнулся (в связи с нехваткой выставочных площадей, некоторые экспонаты лежат у меня дома). Повертел в руках и подумал, что в прошлый раз мало внимания уделил гарантийному листу, а ведь он сам по себе небезынтересный артефакт.
Вряд ли хоть
Как видно из текста, гарантия выдана на год с 30 августа 1913 года на замену любого дефектного механизма в арифмометре «Голден Гем».
Эти довольно популярные арифмометры производила
Коронавирус
Сейчас, когда весь мир в тревоге смотрит на Азию
Если бы не ролик о санитарной обработке в аэропорту вылета, можно было бы вообще не заметить, что под боком там Китай, которого сейчас все боятся, как чумного. Я с интересом ожидал, что же придумают с нами делать в России — видел сообщения об измерении температуры тела прилетающих из Азии, проскакивали
Хорошо, что нас не ждали никакие дополнительные процедуры — в самолёте у меня неожиданно сильно заболела голова, после довольно длинного перелёта с непрекращающейся головной болью и сменой четырёх часовых поясов, дополнительные препятствия к возврату на Родину пережить было бы трудно.
🦠🦠🦠
Кстати в тему — доктор Комаровский, влог которого я завёл привычку слушать, чтобы владеть информацией по коронавирусу, в одном из последних роликов говорил, что у авиакомпаний инструкция — сажать всех болеющих на три последних ряда, с небольшой буферной зоной. Внутри самолётов воздух очищается с бешенной скоростью, ожидается, что такая мера поможет снизить риск заражения в замкнутом салоне. Но видимо инструкция не более чем рекомендательная — на нашем рейсе никакой сегрегации не было, чихающие попадались по всему самолёту.
99 бутылок: V
71. V — один из языков, за развитием которых я пристально наблюдаю. Искренне желаю ему развития и процветания — под влиянием «Раста», «Гоу»
Сил авторам не занимать — работает (за редким исключением) почти весь заявленный синтаксис, есть компиляция, трансляция в Си и ДжаваСкрипт, а так же обратная трансляция из Си в Ви (на гитхабе есть оттранслированный в Ви «Дум»).
Сильнее всего язык, кажется, похож на Гоу — есть даже синтаксически такой же оператор go, позволяющий запускать
Есть обобщённое программирование (которого так не хватает в Гоу), интерполяция переменных в строках (привычная ребятам, программирующим на ПХП, Перле и шеллах) и ограниченная перегрузка операторов (как в Си++).
Насколько я понял из сайта и блога, язык нацелен на безопасное программирование, скорость, как выполнения (проигрывает Си всего на три процента), так и выполнения и простоту кода. Повторюсь, выглядит очень интересно.
// 99.v by Evgeny Stepanischev Feb 2020
fn bottles(beer byte) string {
return match beer {
0 {
'no bottles'
}
1 {
'1 bottle'
}
else {
'$beer bottles'
}
}
}
fn main() {
mut b := bottles(99)
for i := 98; i >= 0; {
println('$b of beer on the wall, $b of beer.')
b = bottles(i--)
println('Take one down and pass it around, $b of beer on the wall.\n')
}
println('No more bottles of beer on the wall, no more bottles of beer.')
println('Go to the store and buy some more, 99 bottles of beer on the wall.')
}Друг наш Лазарь уснул. Я иду разбудить его ★
В фантастике встреча с уже умершими родственниками — нередкая тема, там, кажется, перебрали уже всё — и оцифровку сознания, и заморозку с периодической разморозкой, и восстановление личности по цифровым следами, и много другое.
Я потребляю довольно много фантастики и кажется она меня должна была к этому подготовить, но нет… Когда я смотрю корейский ролик, уже не фантастический, из нашей реальности, где мать встречает в виртуальной реальности свою умершую семилетнюю дочь, мне, пожалуй, жутко. К такому я не готов.
Мне уже 42 и в этом возрасте более чем естественно столкнуться со смертью родственников. Многих из них я иногда вспоминаю, по тем, кто мне был особо близок, — скучаю. Иногда накатывает самая настоящая тоска, например, хочется увидеть бабушек, поговорить,
Видимо для участницы этого эксперимента это своего рода терапия — её дочь умерла несколько лет назад и она до сих пор её не отпустила, искала возможности увидеть её ещё раз, пусть и в таком качестве.
В моём же случае, как кажется, такие встречи только разбередили бы горе. Да и обмануться трудно — ведь ясно же, что в этой симуляции очень мало от прежней личности умершего. Я так понял создатели использовали
Но в будущем технологии обязательно продвинутся настолько, что мы будем способны воспроизвести личность. Большой вопрос — готовы ли родственники к существованию
Наверное ответ тут в том что будет позволено такой личности — плавать в собственной беспомощности, как рыбка в тесном аквариуме, или активно участвовать в жизни общества будущего.
В общем, киберпанк стал на шаг ближе.
Кручёныховский ад
Эту неделю в Нячанге (туристический город во Вьетнаме), я всё время пытался представить как же тут живут люди (а они тут очевидным образом живут — вокруг нашего отеля очень много жилых пеналов). Пытался представить ровно в том же смысле — поставить себя на место курящего на балконе второго этажа вьетнамского мужика.
За редким исключением, вокруг всегда одни стены, грязные, в чёрной плесени, взгляду не вырваться; очень шумно — даже на моём девятнадцатом этаже слышен шум дороги, ведь движение очень плотное, все сигналят; квартиры, насколько мне видно сверху, — тесные, очень маленькие. Если выйти на улицу, то становится ещё хуже — чёрные от грязи дороги и бордюры, тут же сидящие люди, продающие еду, рядом с ними — кучи объедков и бытового мусора, вокруг пикосекундно сигналящие автомобили и мотоциклы, толпы народа.
Картина не просто безрадостная, это просто ад на Земле! Даже наша холодная девятимесячная зима, уже кажется не такое наказание, как пожизненная ссылка в Нячанг.
Не скрою, приятно съездить сюда погреться на неделю, искупаться
Как бы плохо ни были спроектированы российские города, Нячанг в этом отношении — другая весовая категория. Можно только удивляться как на такой благодатной почве можно было так плохо всё устроить.
Забавный баг в FFI (PHP 7.4.2)
В последнее время очень заинтересовался FFI в ПХП — интерфейсом к языку Си, появившимся в версии 7.4. Очень полезное, как по мне, нововведение, позволяющее расширять язык, обходясь минимальными знаниями о других языках программирования.
Очевидно, потребность
К несчастью, модуль FFI в ПХП
Небольшой код для иллюстрации проблемы:
const IRRELEVANT = "Hello ";
echo IRRELEVANT; // Выведет «Hello»
FFI::cdef('char *memcpy(char *dst, const char *src, size_t len);')
->memcpy("Hello ", "world!", 6);
echo IRRELEVANT; // Выведет «world!»В чём суть? Мы объявляем константу IRRELEVANT, убеждаемся, что она содержит присвоенное ей значение, потом вызываем через FFI копирование одной строки в другую, и константа внезапно меняет своё значение. Как это произошло? Чтобы понять, немного модифицируем программу.
function memcpy(string $dst, string $src):void
{
FFI::cdef('char *memcpy(char *dst, const char *src, size_t len);')
->memcpy($dst, $src, strlen($src));
}
$rock1 = str_repeat('ROCK', 1);
$rock2 = str_repeat('ROCK', 1);
var_dump($rock1, $rock2); // Выведет «ROCK» два раза
memcpy($rock1, "SOCK");
memcpy($rock2, "LOCK");
var_dump($rock1); // выведет «SOCK»
var_dump($rock2); // выведет «LOCK»Что у нас тут? Вызов memcpy обёрнут в функцию, которая ничего не возвращает и ничего не должна модифицировать — параметры передаются по значению, а не ссылке. Тем не менее, если вызвать объявленную функцию и передать в неё переменные, их значение будет изменено.
В ПХП для обеспечения производительности используется механизм копирования при записи — если
В силу этой особенности, переменные остаются ссылочными, попадая в таком виде в сишный код, где модифицируются — вызов memcpy меняет первую переданную в него переменную, копируя в неё значение второго параметра.
Кстати, если изменить строку инициализации переменных на вот такую:
$rock1 = $rock2 = str_repeat('ROCK', 1);то после вызовов memcpy обе переменные получат значение «LOCK» — работает тот же самый механизм.
Почему же в первом листинге изменилось значение константы? Сейчас разберёмся, осталось совсем немного.
Ещё одной распространённой техникой увеличения производительности (и снижения потребления памяти заодно) является интернирование, её используют многие интерпретаторы и компиляторы. В общем случае она заключается в том, что
Таким образом константа IRRELEVANT и строка «Hello » в первом параметре — суть одна и та же область памяти. Когда функция memcpy модифицирует эту область, меняются сразу все значения всего, что, для оптимальности, ссылается на это же место. Естественно, константа изменяется тоже.
Поскольку интернирование не работает во время выполнения, результат str_repeat('ROCK', 1); не интернируется и во втором листинге такого эффекта не создаётся.
Как же разорвать эту мистическую связь и заставить работать код так как задумывалось? Для этого нужно, чтобы интерпретатор создал новую область памяти, которую будет портить FFI, не затрагивая нашу переменную. Это можно сделать, например, при помощи уже упомянутой функции str_repeat:
function memcpy(string $dst, string $src):void
{
// Создаём новое место, которое испортит memcpy
$dst = str_repeat($dst, 1);
FFI::cdef('char *memcpy(char *dst, const char *src, size_t len);')
->memcpy($dst, $src, strlen($src));
}
$rock = 'ROCK';
var_dump($rock); // Выведет «ROCK»
memcpy($rock, "SOCK");
var_dump($rock); // Так же выведет «ROCK»Внимание! Это некорректный способ, корректный описан в более поздней заметке.
Естественно, подойдут и substr, и sprintf, и вообще любые функции, в общем случае возвращающие модифицированную строку. Интересно, что implode([$dst]) от бага не защищает, видимо для этого случая внутри работает
Всё описанное верно для версии актуальной на текущий момент — 7.4.2. Надеюсь, в скором времени этот довольно забавный баг устранят и необходимость в таких ухищрениях исчезнет.
Вьетнамская аптека
За границей иногда сталкиваешься с тем, что привычные понятия означают совсем не то, к чему привык. Мы сейчас во Вьетнаме и у жены очень болит горло — заболело ещё в России. К сожалению, лекарство, которое мы прихватили из дома на такой случай, оказалось перекисью водорода — перепутали похожие пузырьки, поэтому вооружившись
списком латинских веществ, я собрался в аптеку.
Аптеку во Вьетнаме узнать просто, да? На ней так и написано — «АПТЕКА», большими привычными зелёными буквами. В нашем туристическом районе таких аптек —
Вернулся в отель огорчённый, но к счастью, на первом этаже увидел нашего отельного гида. Она и рассказала, что идти с моей проблемой надо не в «аптеку» — это просто разновидность магазина с бухлом и «народной медициной», а в pharmacy — государственные аптеки, где продаются лекарства.
В первой же попавшейся фармаси, которая оказалась прямо через дорогу, мне продали и chlorhexidine под маркой «Medoral», и вполне узнаваемый «Стрепсилс» во вьетнамской пачке. Инструкцию по применению провизор изобразила пантомимой, моего вьетнамского не хватило, чтобы объяснить, что я уже сталкивался с этим лекарствами.
В общем, если болеете, не проблема, надо только знать куда зайти за лекарством.
Не могу сказать, что я не знал, что такое pharmacy, но выхватить это слово на скромной вывеске среди мешанины других, куда более кричащих, оказывается довольно сложно. Настоящие аптеки, судя по всему, особо к себе внимание не привлекают, в отличие от «аптек», чьи вывески всегда хорошо видны.
PHP: FFI vs. exec
Нередко отсутствующую в ПХП функциональность наскоро заменяют вызовом утилит командной строки. И мне стало интересно взглянуть на досуге — может ли вызов через ffi (интерфейс к Си, который появился в ПХП 7.4) быть хорошей альтернативой.
Говорят, вызов через ffi работает очень медленно, такова природа этого способа (и мы это видим в других языках), это, конечно, очевидно, но медленно насколько?
Для сравнения была взята функция, создающая временный директорий по маске, которую я использовал в одной из заметок, и её аналог, использующий внешнюю утилиту:
$mkdtemp = function (string $template): string {
$cmd = '/usr/bin/mktemp -d '.escapeshellarg($template);
$dir = exec($cmd, $out, $ret);
if ($ret === 0) {
return $dir;
} else {
['message' => $message, 'type' => $type] = error_get_last();
throw new RuntimeException($message, $type);
}
};Весь код был обёрнут в цикл на 10000 итераций и запущен. Я провёл по десять запусков, а результат усреднил.
Создание директория через ffi заняло примерно 0,77 секунд на 10 тысяч итераций, а через утилиту командной строки — примерно 72,62 секунды на те же 10 тысяч итераций.
Конечно
Вьетнам
Вчера прилетели во Вьетнам. Летели ночью, это было немного сложнее, чем я ожидал — жёсткий недосып, сдвиг часового пояса. Вчерашний день — как в тумане, да и сейчас едва соображаю.
Говорят
При этом медицинская грамотность на нуле — здоровые люди ходят в масках (это не уменьшает, а увеличивает шансы заболеть), а те, кто носят маски, нередко освобождают нос — иначе дышать тяжеловато.
Кстати, если вычесть маски от загара (в прошлую нашу поездку во Вьетнам нам рассказывали, что в Азии отсутствие загара считается красивым), то людей в масках не так уж и много, а коронавирус в разговорах не всплывает вообще, в отличие от России, где я слышал о нём каждый день несколько раз.
Погода пока не очень радует — немного пасмурно, море буйное, но хоть тепло — примерно +30°, в Казани сейчас примерно на пятьдесят градусов ниже. Отдохнём от этой странной зимы, в этом году у нас она больше похожа на московскую — слякоть, снегодождь, с редкими заморозками.
InlineC
Продолжая тему интерфейсов к языку Си, кстати будет упомянуть появившийся недавно модуль inlinec для Пайтона. Он позволяет вставлять в программу на Пайтоне
# coding: inlinec
from inlinec import inlinec
@inlinec
def Q_rsqrt(number):
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) );
return y;
}
print(Q_rsqrt(1.234))Я проверил, это действительно работает. Тут вычисляется так называемый быстрый обратный квадратный корень от числа 1,234.
Пока этот модуль скорее прототип — скорость оставляет желать лучшего, в рабочем каталоге создаётся куча мусорных временных файлов, любое отступление от эталонного примера грозит выводом ошибки, которая совсем не помогает понять что не так.
Куда интереснее разобраться как это всё работает. Декоратор @inlinec тут ничего не делает. Судя по коду модуля, он возвращает функцию как есть и служит маркером, что ниже пойдёт сишная функция. Всё работу выполняет кодек, который подключается первой строкой.
Приём не новый, несколько лет назад я про него уже рассказывал — в Пайтоне в специальном магическом комментарии можно указать кодек, который пропускает через себя текст программы. Обычно он используется для программирования в кодировках, отличных
Итак, код перед выполнением скармливается специальному кодеку inlinec, который разбирает программу, находит в ней
Кто исправит горбатого
Со времён, когда я занимался спортивной гимнастикой, на память осталась травма позвоночника. Сначала в этой связи мало что приходилось делать, разве что иногда посещать довольно неприятные интенсивные массажи, но потом ситуация
Я не знаю когда это произошло,
Основная причина, в моём случае — перенапряжение определённых групп мышц, которые пытались компенсировать повреждение, и в итоге, заспазмировавшись, перекособочили всю спину.
После всех мер, изменения видны невооружённому глазу. Кроме упражнений помогает и специальный массаж, правда пришлось перебрать довольно большое количество массажистов, прежде чем я нашёл такую, которая смогла понять что нужно делать с моими спазмами в мышцах.
А чтобы проблемы не вернулись, приходится работать ещё и над своими привычками — тщательно следить за осанкой, сознательно компенсировать гиперлордоз в пояснице, расслабляя одну группу мышц и напрягая другую, правильно сидеть, не допускать перегиба шеи при работе с ноутбуком и смартфоном.
Последнее, как ни смешно, даётся мне хуже всего. Стоит отвлечься, рука со смартфоном опускается, шея перегибается вниз, плечи сразу сутулятся, поясница и брюшина включают мышцы, чтобы удержать всё в равновесии.
Поскольку на этом сосредоточено много моего внимания, я постоянно замечаю ту же проблему у окружающих — все держат смартфон и ноутбуки очень низко, перегружая шею. Это довольно серьёзная проблема, об этом уже много написано.
Непонятно что делать с этим — ничего или вести
Думаю, делать это в собственном блоге более позволительно, поэтому с невысокой трибуны своего блога хочу всем посоветовать почитать пару статей на этот счёт, испугаться и следить за положением своей головы.