GNU Algol 68
Oct. 16th, 2025 06:39 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Лекция о прогрессе алголостроения в компиляторе 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
Алгол 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
Компьютеры 50-х в СССР
Oct. 13th, 2025 02:22 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Механические арифмометры активно использовались в Советском Союзе при расчётах ядерной бомбы в 40-50-x годах. На картинке реконструкция типичной вычислительной комнаты того времени в Арзамасе-16 или Курчатовском институте.
Хотя арифмометр Феликс (клон Однера советского производства) был распространен в таких институтах, как ФИАН, ВНИИЭФ (Арзамас-16) и НИИ-1011 (Челябинск-70), советская научная элита также использовала иностранные машины, захваченные или импортированные после войны, например:
chatgpt.com/share/68ed6dc8-4084-8001-89a0-848648b6a048

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

Как работать с Курсором
Oct. 12th, 2025 11:29 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я вчера за один день перепёр компилятор языка Би с Си на Go, и заменил кодогенератор на выдачу IR для LLVM. Теперь можно играться с Би на любой 64-битной машине, будь то Intel/AMD, ARM или RISC-V.
Курсор хороший помощник. Как с ним работать? Весь процесс разработки пошагово задокументирован: Journal.md. Можно учиться на этом примере.
Курсор хороший помощник. Как с ним работать? Весь процесс разработки пошагово задокументирован: Journal.md. Можно учиться на этом примере.
ЭВМ под колпаком
Oct. 11th, 2025 12:32 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Q: Почему вычислительная техника в СССР была под суровым надзором КГБ в 50-е и 60-е?
Это очень хороший и важный вопрос — и ответ здесь связан не столько с техникой, сколько с политическим контекстом эпохи. Вот основные причины, почему вычислительная техника и её разработчики в СССР в 1950-60-е годы находились под строгим надзором КГБ:
1. Стратегическое значение вычислительной техники
Компьютеры в 1950–1960-е годы рассматривались как военно-стратегическая технология, наравне с ядерным оружием и ракетной техникой. Они применялись в:
2. Контроль за утечкой технологий
Советское руководство боялось утечки научно-технических данных на Запад. ЭВМ считались высокотехнологичным и потенциально "шпионским" инструментом. Копирование западных идей (например, архитектуры IBM или Ferranti) велось тайно, и сам факт сравнений с западными образцами был политически чувствителен.
3. Идеологическая подозрительность к "кибернетике"
До середины 1950-х термин кибернетика считался в СССР "буржуазной лженаукой", "орудием империализма" и "методом подчинения человека машине". Только после 1955 года, с приходом более прагматичных руководителей (например, А. А. Ляпунова, С. А. Лебедева, В. М. Глушкова), началось постепенное признание кибернетики как научной дисциплины. Но КГБ ещё долго воспринимал людей, занимавшихся вычислительной техникой, как потенциальных диссидентов или "идеологически неблагонадёжных".
4. Закрытый характер научных учреждений
Большинство вычислительных центров и лабораторий (например, ИТМиВТ, ВЦ АН СССР, Институт кибернетики в Киеве) имели режимные статусы, аналогичные оборонным предприятиям. Доступ туда был ограничен, переписка и поездки за рубеж контролировались. Даже публикация статей могла быть согласована только после разрешения органов госбезопасности.
5. Недоверие к автоматизации управления
В 1960-е, когда Глушков предлагал проект ОГАС (Общегосударственная автоматизированная система управления экономикой), КГБ и часть партийных структур восприняли идею с подозрением:
Это очень хороший и важный вопрос — и ответ здесь связан не столько с техникой, сколько с политическим контекстом эпохи. Вот основные причины, почему вычислительная техника и её разработчики в СССР в 1950-60-е годы находились под строгим надзором КГБ:
1. Стратегическое значение вычислительной техники
Компьютеры в 1950–1960-е годы рассматривались как военно-стратегическая технология, наравне с ядерным оружием и ракетной техникой. Они применялись в:
- расчётах для атомных и термоядерных бомб (в частности, в Институте Курчатова и Математическом институте АН СССР),
- баллистике и проектировании ракет (в ОКБ Королёва, Янгеля, Челомея),
- криптографии, радиолокации, навигации.
2. Контроль за утечкой технологий
Советское руководство боялось утечки научно-технических данных на Запад. ЭВМ считались высокотехнологичным и потенциально "шпионским" инструментом. Копирование западных идей (например, архитектуры IBM или Ferranti) велось тайно, и сам факт сравнений с западными образцами был политически чувствителен.
3. Идеологическая подозрительность к "кибернетике"
До середины 1950-х термин кибернетика считался в СССР "буржуазной лженаукой", "орудием империализма" и "методом подчинения человека машине". Только после 1955 года, с приходом более прагматичных руководителей (например, А. А. Ляпунова, С. А. Лебедева, В. М. Глушкова), началось постепенное признание кибернетики как научной дисциплины. Но КГБ ещё долго воспринимал людей, занимавшихся вычислительной техникой, как потенциальных диссидентов или "идеологически неблагонадёжных".
4. Закрытый характер научных учреждений
Большинство вычислительных центров и лабораторий (например, ИТМиВТ, ВЦ АН СССР, Институт кибернетики в Киеве) имели режимные статусы, аналогичные оборонным предприятиям. Доступ туда был ограничен, переписка и поездки за рубеж контролировались. Даже публикация статей могла быть согласована только после разрешения органов госбезопасности.
5. Недоверие к автоматизации управления
В 1960-е, когда Глушков предлагал проект ОГАС (Общегосударственная автоматизированная система управления экономикой), КГБ и часть партийных структур восприняли идею с подозрением:
- централизованная вычислительная сеть могла дать слишком много информации в одни руки,
- существовал страх, что "компьютеры заменят политконтроль" и ослабят власть партийных структур.
Спросил у Курсора, чему он обучен
Oct. 10th, 2025 09:50 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
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
Cursor
Oct. 10th, 2025 01:01 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Есть такой новомодный искусственно-интеллектуальный IDE, называется Cursor. Решил я его попробовать: загрузил в него проект симулятора dubna и для начала попросил две вещи.
1. Улучшить общую информацию о проекте: смотрите новый README.md.
2. Проанализировать на предмет проблем и улучшений: смотрите TODO.md.
Вроде полезная прилада выходит. Пул-реквесты умеет сам создавать и пропихивать. Только спрашивает разрешение на выполнение команд git и gh.
1. Улучшить общую информацию о проекте: смотрите новый README.md.
2. Проанализировать на предмет проблем и улучшений: смотрите TODO.md.
Вроде полезная прилада выходит. Пул-реквесты умеет сам создавать и пропихивать. Только спрашивает разрешение на выполнение команд git и gh.
Второму языку Си не бывать, а третьего не миновать
Oct. 9th, 2025 02:16 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Видели мы уже Си++, D, Zig, а вот встречайте новый проект. Язык и компилятор С3: https://c3-lang.org/. Пока не такой развитый как Zig, но тоже представляет интерес. Работает на маке и Линуксе, на Windows я не пробовал.
Компилятор построен на основе LLVM: github.com/c3lang/c3c
Простейший пример:
Компилятор построен на основе LLVM: github.com/c3lang/c3c
Простейший пример:
Основные улучшения C3 по сравнению с обычным C:module hello_world;
import std::io;
fn void main()
{
io::printn("Hello, world!");
}
Особенность / улучшение | Что добавлено в 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 стандартная библиотека минимальна, приходится писать всё вручную. |
Лучше через 30 лет, чем никогда
Oct. 8th, 2025 09:51 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
(отсюда)
В главе 19 руководства к ZX Spectrum 1982 года (PDF) объясняется «BEEP» — команда BASIC, которая заставляла Spectrum издавать звуки. Приводится пример исполнения траурного марша из Первой симфонии австрийского композитора Малера.

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

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

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

Четыре части симфонии длятся около 50 минут, что делает такую программу нетривиальной. Однако нынешним хакерам семь вёрст не крюк. Для исполнения симфонии потребовалась распределённая система из кучи Спектрумов (Spectra?). Интерфейс Spectranet объединил машины в сеть, управляемую Raspberry Pi. В нужный момент каждый Спектрум делает соответствующий BEEP, исполняя свою музыкальную партию.
The Easy Language
Oct. 8th, 2025 01:00 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Помните книжку Этюды для программистов? Там в предпоследней главе было крышесносное задание: построить компилятор для паскалеподобного языка.
begoon) такой компилятор зафигачил. Исходники проекта: github.com/begoon/easy
Пример кода на языке Easy, игра Жизнь: life.easy
Компилируем, запускаем:
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]](https://www.dreamwidth.org/img/silk/identity/user.png)
Пример кода на языке 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
coteditor
Oct. 7th, 2025 10:34 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Хороший текстовый редактор должен иметь отношение к котам. 😀 Вызывается командой "cot". Но только на маке. Устанавливается командой "brew install coteditor". Из удобств: легко настраивать расцветку синтаксиса для ранообразных файлов и языков программирования.
Попросил Грока, он мне быстренько наваял описание синтаксиса Алгола 60 для которедактора: Algol 60.yml.



Реальная биография Путина
Oct. 7th, 2025 09:43 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Герман Обухов, "Большая ложь маленького человечка: что скрывает Путин"
Официальные источники гласят: Владимир Владимирович Путин родился 7 октября 1952 года в Ленинграде в семье рабочих. Отец — Владимир Спиридонович Путин, родился в 1911 году в деревне Поминово Тверской губернии. Мать — Мария Ивановна Путина (урождённая Шеломова), родилась также в 1911 году в деревне Заречье Тверской губернии, где и познакомилась со своим будущим мужем.
Это чистокровный фейк. На самом деле Володя Путин родился в больнице небольшого городка Очёр, Пермского края. Его настоящая мать жила до недавнего времени в грузинском селе Метехи, её зовут Вера Николаевна Путина - Осепашвили. Она родилась в 1926 году в селе Терехино, рядом с маленьким городом Очёр. В техникуме Очёра она познакомилась с человеком, которого звали Платон Привалов. Позже, будучи беременной, она случайно узнала, что он женат и ей пришлось вернуться к своим родителям в Терехино. Вскоре родился наш Вова, шел 1950 год, а не 1952.
( дальше )
Официальные источники гласят: Владимир Владимирович Путин родился 7 октября 1952 года в Ленинграде в семье рабочих. Отец — Владимир Спиридонович Путин, родился в 1911 году в деревне Поминово Тверской губернии. Мать — Мария Ивановна Путина (урождённая Шеломова), родилась также в 1911 году в деревне Заречье Тверской губернии, где и познакомилась со своим будущим мужем.
Это чистокровный фейк. На самом деле Володя Путин родился в больнице небольшого городка Очёр, Пермского края. Его настоящая мать жила до недавнего времени в грузинском селе Метехи, её зовут Вера Николаевна Путина - Осепашвили. Она родилась в 1926 году в селе Терехино, рядом с маленьким городом Очёр. В техникуме Очёра она познакомилась с человеком, которого звали Платон Привалов. Позже, будучи беременной, она случайно узнала, что он женат и ей пришлось вернуться к своим родителям в Терехино. Вскоре родился наш Вова, шел 1950 год, а не 1952.
( дальше )
Google Pixel Tablet
Oct. 6th, 2025 11:02 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Лайфхак:

Подробности конфигурации:Меряем скорость:
Сравнительная таблица: vak.dreamwidth.org/1159708.html
- берем гугловский таблет Pixel
- добавляем клавиатуру OG87
- в установках "System / Developer options" включаем "Linux development environment"
- вызываем приложение Terminal - оказываемся в линуксе Debian с правами sudo

Подробности конфигурации:Меряем скорость:
$ 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
Создаём векторные рисунки из растровых
Oct. 4th, 2025 04:07 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Как был сделан козак в формате SVG? Расскажу по пунктам. Этим методом можно векторизовать любое (почти) растровое изображение. Из инструментов понадобятся magick, potrace и Python с пакетом svgutils.
1. Берем растровую картинку, которую будем векторизовать. В моём случае это kozak.png. Желательно чтобы картинка была в мультяшном стиле, то есть нарисована небольшим количеством цветов. Такой стиль ещё называют комиксным, или манга.
2. Определяем количество различных цветов в картинке. У козака четыре цвета: чёрный, белый, красный (шаровары) и бежевый (лицо, руки).
3. Упрощаем картинку, уменьшая количество цветов до 4 и убирая шум отдельных пикселей. Смотрим, какие цвета получились.
1. Берем растровую картинку, которую будем векторизовать. В моём случае это kozak.png. Желательно чтобы картинка была в мультяшном стиле, то есть нарисована небольшим количеством цветов. Такой стиль ещё называют комиксным, или манга.
2. Определяем количество различных цветов в картинке. У козака четыре цвета: чёрный, белый, красный (шаровары) и бежевый (лицо, руки).
3. Упрощаем картинку, уменьшая количество цветов до 4 и убирая шум отдельных пикселей. Смотрим, какие цвета получились.
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)
5. Векторизуем каждый из слоёв в отдельный SVG file, восстанавливая цвета близко к исходным.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
6. Объединяем слои в одну картинку. Задействуем Питон и пакет svgutils.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
Результат можно видеть здесь: kozak.svg. Все скрипты собраны в кучу на Гитхабе: sergev/vak-opensource/tree/master/utilities/vectorize.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")
Документация это просто
Oct. 4th, 2025 01:11 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Какой нынче имеется простой способ писать документацию? Чтобы не заморачиваться, и чтобы сразу и HTML вариант и PDF вариант образовывались.
Есть такой метод! Показываю. Ключевые моменты: Pandoc и Tectonic.
Документы пишем в формате Markdown. Выглядит как простой текст, без мудрёных команд. Можно вставлять рисунки, делать таблицы, использовать математические формулы. Вот пример документа:

Аналогичным образом соорудим PDF:

Стиль PDF-документа можно задавать, меняя template.tex. Для HTML тоже есть аналогичный флаг --css=style.css.
Есть такой метод! Показываю. Ключевые моменты: Pandoc и Tectonic.
Документы пишем в формате Markdown. Выглядит как простой текст, без мудрёных команд. Можно вставлять рисунки, делать таблицы, использовать математические формулы. Вот пример документа:
Преобразуем это дело в HTML:# Задача
В школьной столовой Петя заметил, что количество котлет на тарелке уменьшается по формуле
$$
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|
{width=100}
Получаем: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.