thedeemon: (Default)
Подборка фоток с улиц вечернего Лондона за последний месяц с лишним. Новогодняя иллюминация. Картинка-ссылка ведет на страничку, где удобнее всего нажимать стрелки влево/вправо на клавиатуре для навигации.

Ο

Dec. 23rd, 2021 01:34 pm
thedeemon: (Default)
С самого начала пандемии, вот уже почти два года, нам удавалось избежать заражения. Работали из дома, по людным местам лишний раз не шастали, в магазине и транспорте в масках. Летом две прививки пфайзера.
Но вот в прошлый понедельник жена пошла в паб встретиться с парой мамашек из класса нашего сына. Одна из них была только что после бустера и пожаловалась на головную боль, которую списали на эффект от бустера. Но на следующий день она написала, что у нее положительный тест. Уже в среду моя жена почувствовала себя как-то не так, в четверг весь день болела голова и была слабость, но lateral flow тест был отрицательный, а в пятницу ей стало получше, но зато тест стал положительным.
Третья участница встречи получила бустер чуть раньше и продержалась на несколько дней дольше, но тоже заболела.
Тесты тут, кстати, раздавали бесплатно, надо лишь сделать запрос онлайн, и можно или получить пачку в ближайшей аптеке, или пришлют домой. Чем мы успели воспользоваться на той неделе. На этой неделе уже все, тесты в аптеках закончились, на дом тоже больше не присылают LFT. Но PCR пока еще присылают, шарудишь там у себя в горле и носу, кладешь в присланную баночку с жидкостью, собираешь картонную коробку, опускаешь в ближайший красный почтовый ящик, через 36 часов где-то получаешь результат.
Мы все ждали, когда нас позовут на бустер, но получили приглашение лишь после того, как жена заразилась. Теперь уже не нужно, может, когда-нибудь позже сделаем.
Я ожидал, что меня вирус настигнет в воскресенье, но продержался до вторника. К счастью, омикрон, похоже, выродился в обычную простуду, поэтому лишь небольшая температура, полтора дня больного горла, легкий насморк (у нее) или легкий кашель (у меня). Кислород 98-99. Сегодня у жены lateral flow тест уже отрицательный, самочувствие тоже хорошее.
В общем, зараза эта очень заразная, но не очень страшная, судя по всему. Скоро в каждом доме, готовьтесь.
Вот тут хороший пересказ свежего исследования омикрона ex vivo, хорошо объясняет почему он именно таков:
https://www.youtube.com/watch?v=84XMFVcLScw
thedeemon: (Default)
За пару недель до самого первого локдауна в прошлом году я себе купил игровой ноут для работы из дома, потому что в нем было 32 гига памяти, а мне как раз было столько нужно, чтобы собирать рабочий проект. Все потому что Уолтер Брайт в свое время ловко ускорил компилятор D за счет того, что аллокация памяти делается самым простым и быстрым способом, а деаллокация не делается вовсе, и GC не включен тоже. Т.е. компилятор просто жрет память, надеясь, что быстро завершится и слишком много не выжрет. Потом мы задействовали чуть другую систему сборки, которая умеет собирать разные части параллельно, но 32 гигов для этого уже было маловато, поэтому мне приходилось компилить в один поток. К тому же на ноуте у меня была предустановленная винда, и там мы используем LDC (LLVM-based D compiler), который работает медленнее референсного DMD (который компилит быстро, но хуже). В общем, все вроде бы было хорошо, пока я не осознал, что можно лучше. Большой подстольный ящик брать домой не хотелось, вспомнил, что есть же сейчас такие маленькие коробочки, например Intel NUC. Раздобыл себе такой, размером меньше ладони:

Там внутри 64 ГБ памяти, быстрый большой SSD и i7 10-го поколения (сейчас есть и новее, но их надо долго ждать) с 12 логическими ядрами. До чего дошел прогресс!
Снес оттудова винду, поставил свежий Manjaro Linux, который с одной стороны Arch-based и потому не протухает, а с другой стороны не требует PhD по установке и настройке. Раньше у меня линуксы были с KDE и Cinnamon'ом, надоели, тут поставил вариант с GNOME 40. Такая красота!




Работает все идеально, видимо, год линукса на десктопе уже давно был. Комбинация нескольких изменений (Win -> Lin, 32 -> 64 GB, LDC -> DMD, single-threaded -> parallel) дала ускорение сборки на порядок. Теперь если после переключения ветки надо с нуля собрать, это делается за пару минут вместо былых 15-20. Щастье!
Параллельная сборка, конечно, все равно всю память выедает, выглядит это весело:

В целом, не так часто какая-то новая игрушка приносит много счастья и делает жизнь лучше, но тут этот минидесктоп с линуксом это для меня сделали. Вот, делюсь радостью.
thedeemon: (Default)
Давненько я тут ничего не писал. Помнится, некоторые ЖЖ-френды после переезда в Америку или Европу с работой в больших компаниях начинали писать в ЖЖ все реже, а потом и вовсе переставали. Мне еще было любопытно, почему так получается и что с ними. Этого я так и не узнал, но и сам чуть не стал таким же. Может, потому что на работе довольно интересный проект, о котором много не расскажешь, а на другие занятия либо остается мало времени, либо хобби-проекты сейчас получаются довольно длинные, преждевременно о них рассказывать не хочется, а созревают не быстро. Может, еще потому что больше общения стало в телеграм-чатах, с телефона, сюда стал реже заглядывать.

Продолжаю работать в той же компании, для которой приехал в Лондон, но в офисе не был с марта 2020-го, мы с той поры все на удаленке. Жена нашла работу и в своем офисе не была вообще ни разу, ей прислали технику домой, так и работает.

Проект мой на работе далеко не опен-сорсный, но совсем уж секретным тоже не является, на конференциях про него немного рассказывали и упоминали не раз. Делаем мы свой небольшой in-house функциональный язык программирования, чтобы отойти от традиционных для финансового мира Экселя с SQL-ем и выражать все в коде, с гитом, тестами, код ревью и прочими полезными практиками.
Изначально язык был динамически типизирован, просто потому что так было проще сделать. Но потом решили двигаться к статическим типам, и мне довелось заняться навешиванием системы типов, тайпчекинга и вывода типов на существующий недотипизированный язык. К счастью, там все иммутабельное и без ООП (кроме нативных объектов и их полей/методов), монстр а-ля TypeScript не нужен. Поскольку уже сколько-то реального кода на нем было написано без типов, хотелось сделать хороший вывод типов, чтобы не добавлять аннотации в каждую функцию, чтобы можно было мигрировать с минимальными правками. И хотелось сохранить duck typing, но проверять его статически, т.е. нужна структурная типизация. Чтоб без лишних аннотаций можно было структуру с десятком полей передать в функцию, которой нужны лишь парочка из них. Ну и гетерогенные коллекции мне хотелось тоже разрешить, т.е. нужны union types. Перефразируя местного поэта, if you can't infer sum types and structs then I don't wanna hear no chat about typing.
Думал быстро управиться, делов-то. Начал с доволько наивного Хиндли-Милнера, но быстро наткнулся на проблемы. Вспомнил про окамловские polymorphic variants и объекты, которые казалось бы так близки к тому, что мне нужно, особенно если их использовать не только для алгебраиков, но более простые типы туда засунуть, получив union types. Сделал, но опять уткнулся в проблемы.
Напомню, что polymorphic variants в окамле это такие алгебраики, которые не нужно предварительно описывать, он сам выводит где какой набор строится или ожидается. Так, например, для
let f = function `A -> `B | `B -> `A

let g x = [x; f x; `B]

let lst = [`A; f `A; `C]

компилятор окамла выведет сам, что f принимает `A | `B и возвращает `A | `B,
функция g принимает `A | `B и возвращает список из `A | `B,
а lst это список из `A | `B | `C.

Но стоит нам попытаться добавить `C в результат g:
let g x = [x; f x; `B; `C]

то тут окамл уже ругается и не пущает. Потому что недалеко ушел от ХМ, для каждой типо-переменной он отслеживает множества верхних и нижних границ (upper & lower bounds), но когда из значений мы строим список, все элементы списка должны иметь один тип, их верхние и нижние границы нужным образом пересекаются/объединяются, в итоге из-за того, что x передается в f, у него верхняя граница `A | `B (ничего другого f не принимает), и эта верхняя граница влияет на все другие элементы списка, потому `B туда поместить можно, а `C уже нельзя.
Пошел учиться дальше, видел HM(X) Одерского, где про сабтайпинг умеют, но не разобрался.
Зато нашел работы Долана про Algebraic Subtyping и вдохновился. Главная идея там - отказаться в тайпчекере от уравнений про равенства типов, и везде использовать неравенства: "А подтип Б".
Тогда в списке могут быть значения с разными и даже несовместимыми верхними границами, и это ок, т.к. результирующий тип элементов списка отличен от каждого из них и связан с ними неравенствами, он для них супертип. (`A | `B это подтип `A | `B | `C, и `C это подтип `A | `B | `C).
Нагенерить неравенств-то сравнительно несложно (хотя местами было о чем подумать, все же язык у нас отличается от тех, что в статьях), а вот решить их - уже сложнее. Подход к решению со всякими бисубституциями и автоматами у Долана мне тогда показался каким-то сложным, стал делать свое решение, думал, получится проще. В итоге, правда, если прищуриться, те же бисубституции и получились, но без захода в конечные автоматы. Потом уже в 20-м году вышли статьи про CubiML и Simple-sub, там тоже довольно похожие на мое решения, они может и выглядят разными, а суть похожа.
Некоторое время назад я делал презентацию о том, что получилось, там видно в целом, как язык выглядит и как туда типы добавляются, и есть пример, как тайпчекер думает, выводя типы для
foo(o) => {
  a = o.fred |> toStr
  b = o.toto
  a = a.length
  in if b then a else o.fred + 2
}


Еще скриншоты REPL'a с примерами про вывод типов и сочетание структурной и номинальной типизации. Типы можно описывать прямо в репле, и в отличие от всяких тайпскриптов типы параметров функций тоже выводятся, насколько возможно, вывод не локальный.
Read more... )

update

May. 20th, 2021 06:08 pm
thedeemon: (Default)
Installed some Pfizer mRNA today. Feeling fine, no side effects so far. The NHS booking site was giving 10 minute slots, and I booked one with specific time. Yet there was a queue outside the centre where I spent first 10 Minuten, then inside des vaccination zentrum even longer queue für mehr als 20+ Minuten. Other people haben früher berichtet, wie good everything in these Zentren organisiert ist, and how fast und ordentlich alles dort abläuft. Dies ist nicht ganz das, was ich beobachtet habe. Wo ist diese beworbene militärische Organisation?
thedeemon: (professor)
Вот список имеет вид
data List a = Nil | Cons a (List a)
т.е.
F(x) = 1 + x * F(x)
а значит
F(x) - x * F(x) = 1
(1-x) * F(x) = 1
F(x) = 1 / (1-x)
и действительно, если мы такую функцию разложим в ряд, то получим
F(x) = 1 + x + x*x + x*x*x + x*x*x*x + ...
т.е. как раз тип описывает списки из х разной длины.

Но вот что любопытно,
F(F(F(x))) = 1 / (1 - (1 / (1 - 1 / (1 - x)))) = ... = x
можете на бумажке проверить или вот тут увидеть.
Это что же значит, [[[a]]] = a? ;)
thedeemon: (Default)
Холода закончились, ставлю время от времени камеру во дворе. Интересно, будут ли в этом году новые лисята. Пока не видно.

thedeemon: (Default)
У меня новая игрушка. Недавно в рамках праздных раздумий о языкостроении пошел я с пустым ведром зачерпнуть мудрости у лиспоакадемиков. Стал смотреть на Racket (который вырос из PLT Scheme), почитал книжку Beautiful Racket и немного поигрался с описанными там инструментами. А тут еще как раз Racket 8 вышел с новым бэкендом. В предыдущих версиях там компилятор делал байткод, а тот уже в рантайме JITился. А в 8.0 они перешли на компилятор и бэкенд от Chez Scheme, где сразу нативный код генерится.
Сам Racket преподносится как платформа для создания языков. И стандартный рецепт, которому придерживается Beautiful Racket, это если захотел ты сделать свой бэйсик, то регистрируешь свой пакет basic из двух определенных частей (парсер и экспандер), потом пишешь исходник на бейсике, ставишь в нем первой строчкой #lang basic и используешь компилятор Racket. Тот видит первую строчку, достает твой пакет, скармливает остаток файла твоему парсеру (тут у тебя полная свобода по синтаксису), твой парсер производит parse tree, которое передается второй части твоего пакета, которая то дерево преобразует в дерево кода на самом Рэкете. Полученный код на Рэкете уже компилируется, и вот твой бэйсик и скомпилирован.
Но есть один момент, который та книжка почти не упоминает, но который позволяет не опираться на компилятор Рэкета. Дело в том, что в Рэкете есть eval, и вся машинерия компилятора уже содержится в твоем бинарнике. Можно сделать свой один бинарник, который будет парсить новый язык, также разворачивать его в конструкции Рэкета, и тут же выполнять через eval. Под капотом там генерация нативного кода, и скорость получается ничуть не хуже.
В качестве proof of concept сделаем интерпретатор, который сможет выполнять код такого вида:
fac(n) => if n < 2 then 1 else n * fac(n-1);

fib(n) => 
  if n < 2 then 1 
  else {
    a = fib(n-1);
    b = fib(n-2)
    in a + b 
  };

loop(x) => 
  if x < 20 then {
    print(fib(x), fac(x))
    in loop(x+1)
  } else 0;

loop(1)
Read more... )
thedeemon: (Default)
Я раньше любил изучать какие-нибудь экзотические языки программирования и потом тут про них рассказывать, будь то Clean, ATS, CPL, Idris, Dafny и пр. Но некоторое время назад обнаружил, что как-то больше не вижу особо интересных ЯП, одни языки все повторяют один и тот же набор фич, другие углубляются в направления для меня не шибко интересные.
Но зуд-то остался. Пришла мысль, что хорошо бы поучить интересный язык не программирования. Настоящий. Только европейские языки какие-то скучные. Японский слишком большой. Китайский в чем-то проще, но тоже зубрить тысячи иероглифов, плюс сложная фонетика, плюс тона, а тонов мне в тайском хватило, больше не хочется. Зато вон есть японокитайский-лайт: корейский. Там нет тонов, там письменность, которая хоть внешне и похожа на иероглифы, на самом деле очень простая и учится за час. Там вполне доступная/привычная для русского человека фонетика (мы умеем говорить "ы"!) А больше я про него ничего и не знал на тот момент. Но решил попробовать.

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

(тут субтитры тайскими буквами, не обращайте внимания)

Поставил на телефон обучающие приложения, начал и... увлекся! В отличие от европейских языков, где нам многие слова знакомы и понятны, тут все поначалу максимально незнакомо, язык выглядит как шифр, как пазл. Тем интересней этот пазл решить, научиться этот шифр понимать. О чем поют корейские красавицы? Какие слова и обороты используют? Если просто взять перевод песни, видишь уже конечный результат трансляции, результат черного ящика, а интересно же понять внутреннюю логику языка, что конкретные слова означают и как соединяются в фразы. О занятных находках сегодня и поговорю.

В процессе оказалось, что многие слова все-таки знакомы. Вот слово звучит как монада. Вот слово звучит как JSON, теперь мы знаем как он переводится, похоже на правду. :) А вот "пукан" - так южнокорейцы называют Северную Корею. Read more... )

M1

Feb. 21st, 2021 06:33 pm
thedeemon: (Default)
Позапускал тут одну свою программку (тупое решение Project Euler #300, много простых операций с интами, умещающимися в кэше) на двух ноутах. На одном Intel Core i7, на другом Apple M1. Так вот, даже в режиме эмуляции x86_64 M1 немного быстрее. А в родном для него arm64 - много быстрее.



                        L=13 1-thread  parallel ; L=14 parallel
 Intel Core i7 2.6 GHz           20.0      4.06 ;         22.02
 M1 running x86_64              15.65      3.15 ;         18.06
 M1 running arm64               11.84      2.44 ;         13.7
                                       time in seconds

https://gist.github.com/thedeemon/ec45c44e14c3205075f66d4bc3f92abf
Компилятор на обоих - LDC (LLVM-based).

Кстати, про Project Euler. Вы решили задачку #100? Я чего-то туплю, не решил пока.
thedeemon: (Default)
Месяца полтора назад меня навели на мысль поискать что-то по этой теме. В браузере на тот момент было открыто около 150 вкладок, многие висели там месяцами или дольше, будучи когда-то открытыми, недочитанными и так оставленными когда-нибудь потом к ним вернуться. Это, конечно, самообман. Новые открытые вкладки добавляются в этот reading list быстрее, чем я к ним возвращаюсь, процесс не сходится. Поискав совсем чуть-чуть, быстро нашел расширение для браузера под названием Tab Wrangler. Он есть и для хрома, и для файрфокса. Принцип работы простой: если вкладка открыта где-то фоном, но на нее не переключались уже больше некоторого времени Т, то скорее всего там что-то не очень-то и нужное. Тогда она тихонько закрывается, а ссылка помещается в специальный список. В любой момент можно этот список посмотреть и если там все же что-то нужное, открыть оттуда вкладку обратно. Есть там так же настраиваемый белый список сайтов, которые он закрывать не будет, например, то что чисто по работе.
Я себе сделал период Т = 1 сутки. К чему сутки не возвращался, то тихонько исчезает из поля зрения и больше глаза не мозолит. Доставать что-то из списка закрытых, по моему опыту, приходится довольно редко. После шести недель в таком режиме, пожалуй, я доволен. Голова разгружается, фокус улучшается, хлам не хламится. Рекомендую!
thedeemon: (Default)
Мой старый ноут с HDD последнее время работал все медленнее и медленнее во всем, что касалось работы с диском, особенно после перезагрузки долгие минуты был неюзабелен, да и сама перезагрузка занимала много времени. Несколько лет назад все было нормально, а потом медленно и плавно стало хуже. Я уж было думал, это винда виновата, совсем там разработчики расслабились на SSD и не проверяют, как ужасно все на HDD работает. Совсем там многочисленные фоновые сервисы жить не дают. Но потом меня все же осенило посмотреть S.M.A.R.T. диагностику. Оказалось, это просто жесткий диск захворал и потихоньку собирался загнуться. Узнал, что на амазоне можно за сотню денег взять терабайтный SSD и USB-SATA проводок и в домашних условиях спокойно переписать данные и заменить диск. Для замены оперативки там в ноуте есть маленькая дверца с винтиком, но оказалось, что для замены диска нужно снимать все днище. Раскрутил все винтики по периметру, но крышка не снималась, что-то продолжало держать. Хорошо на ютюбе есть ролик на любую тему, в том числе про нужную мне операцию. Там подсказали, что есть еще пара секретных винтиков, например один скрыт под резиновой ножкой, которую надо снять сперва. В итоге, все получилось, заменил HDD на SSD, теперь все летает.

Kerr

Oct. 13th, 2020 02:11 pm
thedeemon: (professor)
Интернет удивил с утра. Помните решение Керра, описывающее вращающуюся черную дыру? Найденное им в 60-х и использованное в том числе для рендера в Интерстелларе (только там редшифт выключили). Оказывается, если квора не врет, Рой Керр еще жив и активно что-то пишет и лайкает!



https://www.quora.com/profile/Roy-Patrick-Kerr
thedeemon: (dab)
Ура, долгие часы прокрастинации на youtube оказались вознаграждены: персональное упоминание с занесением в почетный список бездельников на канале Fermilab. https://youtu.be/ZoJeWwtfdmQ?t=397

Предыдущее достижение моей карьеры в ютюб-физике - упоминание на The Science Asylum https://youtu.be/t0nGy2rsXYY?t=351 :)

Кстати, если кто интересуется популярными роликами вокруг физики и еще не знает эти каналы, рекомендую. А еще больше рекомендую PBS Space Time.
thedeemon: (faculty of numbers)
On Understanding Data Abstraction, Revisited
http://www.cs.utexas.edu/~wcook/Drafts/2009/essay.pdf

Занятный легко читаемый обзор о том, как сильно отличаются абстрактные типы данных (ML-style) от объектов (OOP-style). При выбранных определениях довольно четкая картина вырисовывается.
Показывает, в каком смысле "the typical object-oriented program makes far more use of higher-order values than many functional programs."
Рассказывает, что Reynolds еще в 70-х описывал Expression Problem задолго до того, как Вадлер ей дал название.
Показывает, как некоторые принципы, которые могли казаться фольклором / best practices, тут выходят естественными математическими следствиями. "In a pure object-oriented style, classes are only used to construct objects, and interfaces are used for types."
Становится видно естественное тяготение динамически типизированных языков к ООП.
Что значат в этом ключе autognosis и complex operations.
Тайпклассы хаскеля тоже затрагиваются.

Ничего особого нового, но приводит мысли в порядок. Особенно, если свой язык дизайнить собираешься.
thedeemon: (guilin)
Британцы так любят кататься на велике, что даже страну свою назвали Великобритания.


Нашел недавно на амазоне недорогую экшн камеру, купился на обещания того, что там гироскоп и всяческая стабилизация. Попробовал с ней на велосипеде поехать, но увы, трясется все совершенно ужасно. Что меня убедило таки взять новую GoPro. И вот на фоне обычного порошка обычной камеры становится видно, насколько это вообще черная магия. Как они добиваются такой гладкости, поразительно просто.

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

Путь от дома до более-менее центра:


Один очень симпатичный район там, и от него к Гайд-парку:


От Гайд-парка к Риджент стрит, Пикадилли, Трафальгарской площади, парламенту и далее:
Read more... )
А, еще с неожиданной проблемой столкнулся. На новых ноутах при подключении GoPro по USB компьютер ее не видит. Но если вместо поставляемого с камерой провода взять USB-C to USB 3.1 Gen 2 Cable, тогда все работает. Вот вам и USB.
thedeemon: (Default)
Этой ночью направил камеру на дальний угол сада. А там мама-лиса с тремя детьми!



Update: снял, как лисы через дырку под забором шастают, а еще тем же путем ходит ёжик!

thedeemon: (Default)
Обнаружил тут, что есть целая индустрия trail cameras для наблюдений за живностью: с датчиком движения, ночным видением и инфракрасной подсветкой. После очередного набега зверей на сад, возделываемый нашей пожилой соседкой снизу, решились наконец обзавестись такой камерой и посмотреть, кто там что делает по ночам. Улов за первую же ночь: два лисенка, птицы, белки и толстый кот.



Что у нас тут лисы живут мы давно знаем, несколько раз их встречали на улице, пару раз за последние недели видели маму-лису в окно вечером. А теперь можно будет регулярно следить за их активностью и узнать, где именно у них нора (пока лишь примерно представляем).
thedeemon: (guilin)
Прогулялся на закате по району. Тепло, все цветет, птички поют, кошки гуляют, белочки скачут. Хорошо! Умиротворяющее видео для просмотра в полный экран на 1080:

Profile

thedeemon: (Default)
Dmitry Popov

May 2025

S M T W T F S
    123
45678910
11 121314151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 22nd, 2025 08:51 pm
Powered by Dreamwidth Studios