vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2025-10-16 06:39 pm

GNU Algol 68

Лекция о прогрессе алголостроения в компиляторе GCC. Вкратце: скоро появится официальный компилятор ga68.

Алгол 68 был разработан Рабочей группой 2.1 Международной федерации по обработке информации (IFIP) в конце 1960-х – начале 1970-х годов под руководством Адриана ван Вейнгаардена. Целью рабочей группы было создание языка программирования, пригодного для передачи алгоритмов, их эффективного выполнения на различных компьютерах и облегчения обучения студентов. Ожидалось, что получившийся язык будет представлять собой усовершенствованную версию Алгола 60, в которой будут устранены известные недостатки и в целом улучшены. Однако то, что изначально задумывалось как улучшенная версия Алгола 60, оказалось чем-то совершенно иным: чрезвычайно мощным языком программирования, более современным и выразительным, чем большинство современных языков программирования, в дизайне которого практически до предела использовалось недавно изобретенное понятие ортогональности в языках программирования. Алгол 68 не похож на Алгол 60 – важный, но устаревший язык программирования, вытесненный практически во всех отношениях своими преемниками, и представляющий сегодня интерес лишь как исторический курьёз. Несмотря на утверждения многих, у Algol 68 нет преемников. Рабочая группа GNU Algol 68 — это группа хакеров, чья цель — вернуть Algol 68 на первое место в программирования, где ему и место, создать современные реализации языка, хорошо интегрированные в современные операционные системы и компьютеры (например, интерфейс GCC Algol 68), создать документацию, помогающую людям изучать этот увлекательный язык, а также исследовать возможности расширения и развивать язык с той строгостью, уважением и серьёзностью, которых он заслуживает и требует.

В январе 2025 года в gcc-patches была отправлена ​​первая серия патчей, реализующих интерфейс Algol 68 для GCC. С тех пор разработка идёт стабильно, и к настоящему времени большая часть языка реализована. В этом докладе мы расскажем о фронтенде и связанном с ним плане мирового господства, выделим и обсудим некоторые интересные аспекты реализации (Algol 68, как известно, очень сложен в реализации) и обоснуем включение фронтенда в основное дерево GCC.

Мы также кратко рассмотрим некоторые смежные проекты, такие как поддержка Algol 68 в autotools и режим Emacs a68.

Подробности на сайте: algol68-lang.org

vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2025-10-14 11:44 am

PC/286

Новая игрушка в моей коллекции.



+2 )
vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-13 02:22 pm

Компьютеры 50-х в СССР

Механические арифмометры активно использовались в Советском Союзе при расчётах ядерной бомбы в 40-50-x годах. На картинке реконструкция типичной вычислительной комнаты того времени в Арзамасе-16 или Курчатовском институте.

Хотя арифмометр Феликс (клон Однера советского производства) был распространен в таких институтах, как ФИАН, ВНИИЭФ (Арзамас-16) и НИИ-1011 (Челябинск-70), советская научная элита также использовала иностранные машины, захваченные или импортированные после войны, например:
Тип                     Происхождение   Особенности
------------------------------------------------------------------------------
Brunsviga 13Z Германия Вертушка, надежная для длинных делений
Mercedes-Euklid Германия Использовался физиками до Второй мировой войны
Facit TK Швеция Высокая точность, плавный ход кривошипа
Marchant Silent Speed США Автоматическое умножение/деление, используется там, где это возможно
Феликс-С / Феликс-М СССР Простая вертушка, повсеместная и ремонтопригодная
Захваченная немецкая оргтехника по секретным каналам поставок распределялась по ключевым исследовательским объектам, в том числе ядерным.

chatgpt.com/share/68ed6dc8-4084-8001-89a0-848648b6a048

vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2025-10-12 11:29 am

Как работать с Курсором

Я вчера за один день перепёр компилятор языка Би с Си на Go, и заменил кодогенератор на выдачу IR для LLVM. Теперь можно играться с Би на любой 64-битной машине, будь то Intel/AMD, ARM или RISC-V.

Курсор хороший помощник. Как с ним работать? Весь процесс разработки пошагово задокументирован: Journal.md. Можно учиться на этом примере.
vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-11 12:32 pm

ЭВМ под колпаком

Q: Почему вычислительная техника в СССР была под суровым надзором КГБ в 50-е и 60-е?

Это очень хороший и важный вопрос — и ответ здесь связан не столько с техникой, сколько с политическим контекстом эпохи. Вот основные причины, почему вычислительная техника и её разработчики в СССР в 1950-60-е годы находились под строгим надзором КГБ:

1. Стратегическое значение вычислительной техники

Компьютеры в 1950–1960-е годы рассматривались как военно-стратегическая технология, наравне с ядерным оружием и ракетной техникой. Они применялись в:
  • расчётах для атомных и термоядерных бомб (в частности, в Институте Курчатова и Математическом институте АН СССР),
  • баллистике и проектировании ракет (в ОКБ Королёва, Янгеля, Челомея),
  • криптографии, радиолокации, навигации.
Поэтому всё, что касалось ЭВМ, было засекречено, а сотрудники проходили проверку и допуск по линии КГБ.

2. Контроль за утечкой технологий

Советское руководство боялось утечки научно-технических данных на Запад. ЭВМ считались высокотехнологичным и потенциально "шпионским" инструментом. Копирование западных идей (например, архитектуры IBM или Ferranti) велось тайно, и сам факт сравнений с западными образцами был политически чувствителен.

3. Идеологическая подозрительность к "кибернетике"

До середины 1950-х термин кибернетика считался в СССР "буржуазной лженаукой", "орудием империализма" и "методом подчинения человека машине". Только после 1955 года, с приходом более прагматичных руководителей (например, А. А. Ляпунова, С. А. Лебедева, В. М. Глушкова), началось постепенное признание кибернетики как научной дисциплины. Но КГБ ещё долго воспринимал людей, занимавшихся вычислительной техникой, как потенциальных диссидентов или "идеологически неблагонадёжных".

4. Закрытый характер научных учреждений

Большинство вычислительных центров и лабораторий (например, ИТМиВТ, ВЦ АН СССР, Институт кибернетики в Киеве) имели режимные статусы, аналогичные оборонным предприятиям. Доступ туда был ограничен, переписка и поездки за рубеж контролировались. Даже публикация статей могла быть согласована только после разрешения органов госбезопасности.

5. Недоверие к автоматизации управления

В 1960-е, когда Глушков предлагал проект ОГАС (Общегосударственная автоматизированная система управления экономикой), КГБ и часть партийных структур восприняли идею с подозрением:
  • централизованная вычислительная сеть могла дать слишком много информации в одни руки,
  • существовал страх, что "компьютеры заменят политконтроль" и ослабят власть партийных структур.
Фактически, именно вмешательство политических и силовых ведомств похоронило проект ОГАС, который мог бы стать советским аналогом Интернета и ERP-систем.
vak: Generated by Bard: what if Unix was a person (Киборг)
Serge Vakulenko ([personal profile] vak) wrote2025-10-10 09:50 pm

Спросил у Курсора, чему он обучен

Here are the programming languages I'm proficient in, rated on a scale of 1-10:

10/10 - Expert Level

  • Python - Deep understanding of syntax, libraries, frameworks, best practices
  • JavaScript/TypeScript - Full-stack development, modern frameworks, async programming
  • C++ - Advanced features, templates, STL, memory management, performance optimization

9/10 - Advanced

  • Java - Enterprise development, Spring framework, JVM internals
  • C - System programming, memory management, low-level operations
  • Go - Concurrency, goroutines, modern language features
  • Rust - Memory safety, ownership, systems programming

8/10 - Proficient

  • C# - .NET ecosystem, LINQ, async/await
  • PHP - Web development, frameworks like Laravel
  • Ruby - Rails framework, metaprogramming
  • Swift - iOS/macOS development
  • Kotlin - Android development, JVM interop

7/10 - Competent

  • R - Data analysis, statistics, visualization
  • MATLAB - Numerical computing, signal processing
  • Scala - Functional programming, JVM ecosystem
  • Haskell - Functional programming concepts
  • Clojure - Lisp dialect, functional programming

6/10 - Intermediate

  • Assembly - x86, ARM, understanding of low-level operations
  • Shell/Bash - System administration, automation
  • SQL - Database design, query optimization
  • Lua - Scripting, game development
  • Perl - Text processing, system administration

5/10 - Basic

  • Fortran - Legacy scientific computing
  • COBOL - Legacy business systems
  • Pascal - Educational programming
  • Ada - Safety-critical systems

Specialized Knowledge

  • Domain-specific languages (DSL) - Various embedded and specialized languages
  • Configuration languages - YAML, JSON, TOML, etc.
  • Markup languages - HTML, XML, Markdown, LaTeX
My strongest areas are modern web development, systems programming, and data science. I'm particularly good at helping with complex debugging, architecture decisions, and code optimization across these languages.
vak: (бэсм-6)
Serge Vakulenko ([personal profile] vak) wrote2025-10-10 01:01 pm

Cursor

Есть такой новомодный искусственно-интеллектуальный IDE, называется Cursor. Решил я его попробовать: загрузил в него проект симулятора dubna и для начала попросил две вещи.

1. Улучшить общую информацию о проекте: смотрите новый README.md.

2. Проанализировать на предмет проблем и улучшений: смотрите TODO.md.

Вроде полезная прилада выходит. Пул-реквесты умеет сам создавать и пропихивать. Только спрашивает разрешение на выполнение команд git и gh.
vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-09 02:16 pm

Второму языку Си не бывать, а третьего не миновать

Видели мы уже Си++, D, Zig, а вот встречайте новый проект. Язык и компилятор С3: https://c3-lang.org/. Пока не такой развитый как Zig, но тоже представляет интерес. Работает на маке и Линуксе, на Windows я не пробовал.

Компилятор построен на основе LLVM: github.com/c3lang/c3c

Простейший пример:
module hello_world;
import std::io;

fn void main()
{
io::printn("Hello, world!");
}
Основные улучшения C3 по сравнению с обычным C:

Особенность / улучшение Что добавлено в C3 Зачем это нужно / какую проблему решает
Совместимость с ABI C Программы на C3 могут напрямую вызывать функции C и наоборот, без обёрток. Можно использовать существующие C‑библиотеки и постепенно переходить на C3.
Модульная система (namespaces) Код организуется в модули с контролем экспорта и изоляцией имён. В C всё глобально, имена часто конфликтуют, сложное управление зависимостями.
Дженерики (обобщённые модули) Код можно писать для разных типов данных без макросов. В C приходится копировать код или использовать сложные макросы.
Срезы и безопасные массивы Встроенные типы «срезов» (указатель + длина), безопасное индексирование, foreach. В C легко выйти за пределы массива и получить утечку или сбой.
Ошибки и опциональные типы Встроенные типы для ошибок (например, Result, Optional) без накладных расходов. В C обработка ошибок громоздкая и легко забыть проверить код возврата.
defer — автоматическая очистка ресурсов Можно указать действия, выполняемые при выходе из функции. В C приходится вручную дублировать код освобождения или писать goto cleanup.
Контракты (пред- и постусловия) Можно описывать логические условия, проверяемые в отладочном режиме. В C нет встроенных средств проверки инвариантов.
Семантические макросы и код во время компиляции Макросы понимают типы; можно выполнять код на этапе компиляции. В C макросы чисто текстовые, часто приводят к ошибкам.
SIMD и inline‑assembler первого класса Поддержка векторных типов и встроенного ассемблера на уровне языка. В C это делается через нестандартные расширения и платформозависимо.
«Zero‑is‑Initialization» (ZII) Нулевая инициализация создаёт корректное состояние объекта, где это имеет смысл. В C часто встречаются ошибки из‑за неинициализированной памяти.
Расширенная стандартная библиотека Есть готовые динамические массивы, хэш‑карты, строки и другие утилиты. В C стандартная библиотека минимальна, приходится писать всё вручную.
kireev: (Default)
kireev ([personal profile] kireev) wrote2025-10-09 11:21 am
Entry tags:

Приморские vs спальные районы на электоральных картах Одессы

На картах результатов выборов 2012 и 2019 г. по участкам крупнейших городов Украины в Одессе неплохо выделяется приморская часть.

На выборах 2012 года оранжевые уже опередили бело-голубых на самых богатых приморских участках. Но по городу тогда бело-голубые набрали 54.3%, оранжевые 39.3%. У бело-голубых главный бастион - спальные юго-западные районы.



В первом туре выборов 2019 г. в городе везде доминировал Зеленский, екс-оранжевых было суммарно 25.3%, у екс-белоголубых 28.1%.Приморские участки все равно выделяются, хотя больше на карте оттенков.

 

vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-08 09:51 pm

Лучше через 30 лет, чем никогда

(отсюда)

В главе 19 руководства к ZX Spectrum 1982 года (PDF) объясняется «BEEP» — команда BASIC, которая заставляла Spectrum издавать звуки. Приводится пример исполнения траурного марша из Первой симфонии австрийского композитора Малера.



Глава заканчивается парой упражнений для улучшения навыков BEEP, второе из которых — «Запрограммируйте компьютер так, чтобы он играл не только траурный марш, но и остальную часть Первой симфонии Малера».



Четыре части симфонии длятся около 50 минут, что делает такую ​​программу нетривиальной. Однако нынешним хакерам семь вёрст не крюк. Для исполнения симфонии потребовалась распределённая система из кучи Спектрумов (Spectra?). Интерфейс Spectranet объединил машины в сеть, управляемую Raspberry Pi. В нужный момент каждый Спектрум делает соответствующий BEEP, исполняя свою музыкальную партию.

vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-08 01:00 am

The Easy Language

Помните книжку Этюды для программистов? Там в предпоследней главе было крышесносное задание: построить компилятор для паскалеподобного языка.
Easy Does It
                   or...
A COMPILER FOR AN
ALGEBRAIC LANGUAGE

A compiler is always a large program. To write one from scratch, even in a pedagogical environment, is a major undertaking. Although Easy is designed to reduce the pain while providing as much enlightenment as possible, this still is the hardest problem in the book. Do not tackle it unless you (and some helpful friends) have plenty of time and energy.

THE EASY LANGUAGE

Easy is a general-purpose, procedural, algebraic programming language. Its roots lie in ALGOL, ALGOL 68, and PASCAL. Like them, it is designed to be compiled, loaded, and executed on a reasonably conventional computer (the EC-1 described in Chapter 25 is a good example). The syntax is described by a context-free grammar suitable for parsing by LR(1) techniques. The semantics are similar to the languages described above, and we will let an informal description suffice, trusting to the reader’s skill to fill any gaps. In the text below, logically connected portions of the grammar are described with the associated semantics.
Так вот, один гениальный человек ([personal profile] begoon) такой компилятор зафигачил. Исходники проекта: github.com/begoon/easy

Пример кода на языке Easy, игра Жизнь: life.easy

Компилируем, запускаем:
git clone https://github.com/begoon/easy.git
cd easy
node easyc.ts life.easy
cc life.c -o life -I.
./life
Получаем:
** [ EASY LIFE ] ***************************************************************** 
* xx *
* xx xx *
* x x xxx *
* xx x xxx *
* x x x xx *
* xx x x x xx *
* xxx x x *
* x xxx xxx *
* xxxxx xx xx *
* xx x x x *
* x x xx *
* x xx *
* xxx *
* x *
* x xx x *
* xxx xxx x x *
* x x x *
* x x xx *
* x x *
* *
* *
* *
* xx *
* xx xx *
* xx *
**********************************************************************************
GENERATION: 104
vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-07 10:34 pm

coteditor

Хороший текстовый редактор должен иметь отношение к котам. 😀 Вызывается командой "cot". Но только на маке. Устанавливается командой "brew install coteditor". Из удобств: легко настраивать расцветку синтаксиса для ранообразных файлов и языков программирования.
Попросил Грока, он мне быстренько наваял описание синтаксиса Алгола 60 для которедактора: Algol 60.yml.

vak: (Путиномедвед)
Serge Vakulenko ([personal profile] vak) wrote2025-10-07 09:43 am
Entry tags:

Реальная биография Путина

Герман Обухов, "Большая ложь маленького человечка: что скрывает Путин"

Официальные источники гласят: Владимир Владимирович Путин родился 7 октября 1952 года в Ленинграде в семье рабочих. Отец — Владимир Спиридонович Путин, родился в 1911 году в деревне Поминово Тверской губернии. Мать — Мария Ивановна Путина (урождённая Шеломова), родилась также в 1911 году в деревне Заречье Тверской губернии, где и познакомилась со своим будущим мужем.

Это чистокровный фейк. На самом деле Володя Путин родился в больнице небольшого городка Очёр, Пермского края. Его настоящая мать жила до недавнего времени в грузинском селе Метехи, её зовут Вера Николаевна Путина - Осепашвили. Она родилась в 1926 году в селе Терехино, рядом с маленьким городом Очёр. В техникуме Очёра она познакомилась с человеком, которого звали Платон Привалов. Позже, будучи беременной, она случайно узнала, что он женат и ей пришлось вернуться к своим родителям в Терехино. Вскоре родился наш Вова, шел 1950 год, а не 1952.

дальше )
vak: (Линукс)
Serge Vakulenko ([personal profile] vak) wrote2025-10-06 11:02 pm

Google Pixel Tablet

Лайфхак:Получаем симпатичный и удобный в работе компьютер для программиста. Настраиваем вход через SSH и можем пользоваться удалённо. Механическая клавиатура в ретро стиле IBM PC AT добавляет колорита. Через Alt-Tab переключаемся на обычные андроидные приложения.



Подробности конфигурации:Меряем скорость:
$ dhrystone

Dhrystone Benchmark, Version 2.1 (Language: C)
...
Nanoseconds for one run through Dhrystone: 21.1    
            Million Dhrystones per Second: 47.394  
                                    DMIPS: 26974.1
Это на 40% быстрее Raspberry Pi 5. Или в 3.5 раза быстрее Raspberry Pi 4.

Сравнительная таблица: vak.dreamwidth.org/1159708.html
kireev: (Default)
kireev ([personal profile] kireev) wrote2025-10-04 08:49 pm
Entry tags:

Карты парламентских выборов в Чехии

Спасибо Грезев [profile] grezevза ссылку на сайт с классными интерактивными картами прошедших парламентских выборов в Чехии.  Карта по округам привычна: правая коалиция "Вместе" победила в Праге + пригороды и в Брно. Бабиш - во всех остальных округах.

2025-czech-legis-ogrugs.jpg

По общинам чуть более пестро, но агломерация Праги красиво выделяется.
2025-czech-legis.jpg

Но больше всего мне понравилась карта результатов по зарубежным участкам. Пираты- северная партия! Прямо-таки партия викингов: они победили в Скандинавии, плюс Финляндия, Эстония, Нидерланды, Бельгия. И еще интересно, это партия демократий в Восточной Азии: Япония, Южная Корея и Тайвань.

АНО победило в России и Беларуси, но это явно посольские работники: в России 26 голосов, в Беларуси - 7. Кстати, тут тоже небольшая иллюстрация оттока граждан Европы из России после полномасштабного вторжения России в Украину: на выборах 2021 г. в России было 97 голосов.

2025-czech-legis-foreign.jpg

Заграница в Чехии очень право-либеральная: эта тройка набрала 89%, а четыре лево-популистские партии в сумме 9%.

2025-czech-legis-foreign-total.jpg
vak: (Українець)
Serge Vakulenko ([personal profile] vak) wrote2025-10-04 04:07 pm

Создаём векторные рисунки из растровых

Как был сделан козак в формате SVG? Расскажу по пунктам. Этим методом можно векторизовать любое (почти) растровое изображение. Из инструментов понадобятся magick, potrace и Python с пакетом svgutils.

1. Берем растровую картинку, которую будем векторизовать. В моём случае это kozak.png. Желательно чтобы картинка была в мультяшном стиле, то есть нарисована небольшим количеством цветов. Такой стиль ещё называют комиксным, или манга.

2. Определяем количество различных цветов в картинке. У козака четыре цвета: чёрный, белый, красный (шаровары) и бежевый (лицо, руки).

3. Упрощаем картинку, уменьшая количество цветов до 4 и убирая шум отдельных пикселей. Смотрим, какие цвета получились.
$ magick kozak.png -despeckle -colors 4 simple.png
$ magick simple.png -format %c histogram:info: | sort -n -r
1178809: (254,254,254) #FEFEFE srgb(254,254,254)
179431: (6,5,5) #060505 srgb(6,5,5)
117463: (214,91,69) #D65B45 srgb(214,91,69)
97161: (224,192,156) #E0C09C srgb(224,192,156)
4. Зная точные значения цветов, разделяем цветную картинку на три чёрно-белые: каждый цвет отдельно. Фоновым делаем белый цвет.
white="#FEFEFE"
black="#060505"
red="#D65B45"
beige="#E0C09C"
magick simple.png -fill black -opaque $black \
-fill white -opaque $white \
-fill white -opaque $beige \
-fill white -opaque $red black-layer.pbm
magick simple.png -fill black -opaque $red \
-fill white -opaque $white \
-fill white -opaque $black \
-fill white -opaque $beige red-layer.pbm
magick simple.png -fill black -opaque $beige \
-fill white -opaque $white \
-fill white -opaque $black \
-fill white -opaque $red beige-layer.pbm
5. Векторизуем каждый из слоёв в отдельный SVG file, восстанавливая цвета близко к исходным.
potrace black-layer.pbm -s --turdsize 15                   -o black-layer.svg
potrace beige-layer.pbm -s --turdsize 15 --color "#EFAC78" -o beige-layer.svg
potrace red-layer.pbm -s --turdsize 15 --color "#C21919" -o red-layer.svg
6. Объединяем слои в одну картинку. Задействуем Питон и пакет svgutils.
from svgutils.compose import *
from svgutils.transform import fromfile

width, height = fromfile('black-layer.svg').get_size()
Figure(width, height, # Canvas size
SVG('beige-layer.svg'), # Bottom layer
SVG('red-layer.svg'), # Middle layer
SVG('black-layer.svg'), # Top layer
).save("kozak.svg")
Результат можно видеть здесь: kozak.svg. Все скрипты собраны в кучу на Гитхабе: sergev/vak-opensource/tree/master/utilities/vectorize.
vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-04 01:11 pm

Документация это просто

Какой нынче имеется простой способ писать документацию? Чтобы не заморачиваться, и чтобы сразу и HTML вариант и PDF вариант образовывались.

Есть такой метод! Показываю. Ключевые моменты: Pandoc и Tectonic.

Документы пишем в формате Markdown. Выглядит как простой текст, без мудрёных команд. Можно вставлять рисунки, делать таблицы, использовать математические формулы. Вот пример документа:
# Задача

В школьной столовой Петя заметил, что количество котлет на тарелке уменьшается по формуле
$$
K(t) = K_0 - t,
$$
где $K_0$ — начальное число котлет, а $t$ — время в минутах, прошедшее с момента, как Петя сел за стол.

Если у Пети было 5 котлет, то через сколько минут Петя обратится к маме со словами:
*«Мам, а добавки можно?»*

# Таблица умножения

| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 2 | 2 | 4 | 6 | 8 | 10| 12| 14| 16| 18|
| 3 | 3 | 6 | 9 | 12| 15| 18| 21| 24| 27|
| 4 | 4 | 8 | 12| 16| 20| 24| 28| 32| 36|
| 5 | 5 | 10| 15| 20| 25| 30| 35| 40| 45|
| 6 | 6 | 12| 18| 24| 30| 36| 42| 48| 54|
| 7 | 7 | 14| 21| 28| 35| 42| 49| 56| 63|
| 8 | 8 | 16| 24| 32| 40| 48| 56| 64| 72|
| 9 | 9 | 18| 27| 36| 45| 54| 63| 72| 81|

![](kozak.svg){width=100}
Преобразуем это дело в HTML:
pandoc example.md -o example.html --standalone --mathjax
Получаем:


Аналогичным образом соорудим PDF:
pandoc example.md -o example.pdf --pdf-engine=tectonic --template=template.tex
Сравниваем:


Стиль PDF-документа можно задавать, меняя template.tex. Для HTML тоже есть аналогичный флаг --css=style.css.
vak: (Українець)
Serge Vakulenko ([personal profile] vak) wrote2025-10-03 10:46 pm
Entry tags:

Векторный козак

Сварганил козака в формате SVG: пользуйтесь кому надо.

vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-03 12:17 pm

Tectonic и SVG

Как нарисовать дерево Штерна—Броко? Задействуем TeX для прикола. Вот такой малопонятный код мне Грок насоветовал.
\documentclass{standalone}
\usepackage{forest}

\begin{document}
\begin{forest}
  Stern Brocot/.style n args={5}{%
    content=$\frac{\number\numexpr#1+#3\relax}{\number\numexpr#2+#4\relax}$,
    if={#5>0}{% true
      append={[,Stern Brocot={#1}{#2}{#1+#3}{#2+#4}{#5-1}]},
      append={[,Stern Brocot={#1+#3}{#2+#4}{#3}{#4}{#5-1}]}
    }{}}% false (empty)
[,Stern Brocot={0}{1}{1}{0}{5}]
\end{forest}
\end{document}
Давно не брал я в руки шашки ТеХ. Когда-то по молодости много ним занимался, и всегда с ТеХом было сложно. Но давеча появился новый инструмент: Tectonic. Народ упёрся и наваял (на Rust!) поверх старого доброго кнутовского ТеХа удобную обёртку. Ставится командой brew install tectonic на маке, или sudo snap install tectonic в Линуксе. Превращаем .tex в .pdf:
tectonic tree.tex
Полученный файл PDF можно для удобства превратить в векторный рисунок SVG. Его можно смотреть любым браузером или вставлять в документы:
pdftocairo -svg tree.pdf tree1.svg
svgcleaner tree1.svg tree2.svg
Здесь pdftocairo создаёт SVG, а svgcleaner его оптимизирует, уменьшая размер. Вот такое пятиуровневое дерево получается:



Если в теховском исходнике в третьей строчке с конца заменить {5} на {8}, получим восемь уровней. Кликайте на картинку, зумьте и проворачивайте вправо-влево:

vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-10-02 11:39 pm

Дроби вам

Оказывается, есть такой алгоритм: Штерна—Броко называется. Простым, но неочевидным способом вычисляет все неприводимые дроби (включая целые числа). Очень остроумно. Мне раньше не попадался почему-то.

1. Создаем список из двух дробей:


Не шарахайтесь от деления на единицу и нуль, так нужно.

2. Берём соседнюю пару дробей и между ними вставляем новую дробь. Пусть исходная пара была:


Новая дробь будет:


3. Повторяем итеративно до бесконечности.

Нетрудно доказать, что всякая неприводимая дробь будет рано или поздно вычислена. При этом никакое значение не повторится дважды.