vak: (Знайка)
[personal profile] vak
Zed интересный редактор, из всех появившихся за последнее время. Всё бы хорошо, но... Открываю в нём текстовый файл. Встаю куда-нибудь в середину окна, скажем на строку 20, и нажимаю PageDown. Файл перелистывается на страницу вперёд, а курсор улетает... вниз окна, на 4-ю строку снизу. Что за ерунда. Жму PageUp, файл листается обратно, но не на всю страницу, а на несколько строк. Курсор оказывается вверху экрана, на 4-й строке сверху. Ëшкин кот! Я не готов прыгать глазами в поисках курсора, увольте.

Легкими пинками мне удалось привести Zed в приемлемое состояние. Переделать клавиши PageUp и PageDown как предписано богом. Чтобы при перелистывании текущая строка (курсор) сохраняла своё относительное положение на экране. Когда вы уже находитесь на последней странице, клавиша PageDown ничего не делает. Верхняя строка остаётся на месте, а курсор не перемещается. В emacs такой режим включается установкой:
(setq scroll-preserve-screen-position t)
Настройки такой в редакторе нет. Надеялся найти плагин - благо, к Zed уже понаделано много extensions. Однако увы, не могут extensions обрабатывать клавиши и влиять на позицию текста в окне. Пришлось править исходник самого Zed.

Сам бы я в исходниках долго ковырялся. Но теперь в помощниках имеем Cursor. Он за пару минут разобрался и передеалал функции move_page_up() и move_page_down(). С первого раза это дело крашанулось, но я показал Курсору дамп стека и он шустро исправил проблему. Правку можно видеть вот тут:

https://github.com/sergev/ved/commit/e1896e99aeaa76b18944e8c0277647366aabe5a2

Чтобы получить такую версию Zed, вам придётся собрать его из исходников. Это нетрудно, по сути одна простая команда "cargo build --release".

(no subject)

Nov. 18th, 2025 09:19 am
vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner

Вычитал интересную мысль:

Большими языковыми моделями нужно заменять не программистов, а менеджмент среднего звена. Всех этих «менеджеров проектов», «владельцев продукта» и тому подобных шарлатанов.

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

Топ-менеджмент, который вводит это садо-мазо, можно понять. За потраченные на зарплаты программистов немалые деньги хочется понять, что происходит. Но немногие способные к программированию аутисты способны себя объяснить. Потому-то так сладка мечта о переводе с естественного языка на машинный код без посредников.

На самом-то деле, посредник в процессе разработки ПО — не программист, а менеджер среднего звена. Автоматизировать нужно не генерацию портянок кода (это невозможно без «сильного ИИ», способного к созданию новых абстракций), а процессуальное садо-мазо. Автоматический перевод нужен не с естественного языка в машинный код, а с бизнес-жаргона на техно-жаргон и обратно.

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

В этом году стало модно генерировать портянки при помощи «агентов». Даешь им «контекст» и «промпт», они начинают изображать бурную деятельность, «запускать инструменты», «обращаться к сервисам». В итоге ничего не работает, приходится все делать самому.

Гораздо полезнее были бы «агенты» не для программирования, а для отчетности. Вся работа программиста машиночитаема (переписка в чатах, репозитории кода, журналы сервисов). Вместо того, чтобы собирать десять косноязычных человек, стоящих 200 баксов в час за голову, на бестолковое часовое совещание и опрашивать по кругу «статус», «агент» мог бы обобщать произошедшее за сутки за минуту и описывать, что осталось сделать по текущим задачам, понятным бизнесу языком.

Вообще-то [livejournal.com profile] swamp_lynx я не читаю, а на этот пост набрел по наводке [livejournal.com profile] keleg, которого там заинтересовала другая мысль (этот пост - длинный список цитат из разных людей).

Что в этой идее мне не нравится — то, что вообще-то далеко не все в работе программиста (и вообще инженера) оставляет машинно-читаемые следы, которые может проанализировать и превратить в утешительные для менеджера отчеты ИИ. Значительная часть времени уходит на попытки понять, выстроить у себя в голове концептуальную модель. Это чтение книг, в том числе и бумажных, эксперименты (которые ИИ-агент даже если он их мониторит вряд ли сумеет понять, их и ставящий-то их человек не очень понимает, и ставит именно для того чтобы узнать ту половину ответа, которая позволит задать правильный вопрос). И тем более нетривиально дать оценку «что осталось сделать».

vak: (Default)
[personal profile] vak
Давно ли вам приходилось форматировать 5-дюймовую дискету? И грузиться с неё. А я сегодня получил удовольствие. 😀 Вот так выглядит загрузка MS-DOS 3.31, исторически последней 8-битной версии. Последующие уже на XT-шках не использовались.



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



Флопик приятно в руках подержать.



Вот из чего состоял тогда MS-DOS.

Чиним VS Code

Nov. 15th, 2025 03:28 am
vak: (Default)
[personal profile] vak
Текстовым редактором в Visual Studio Code невозможно пользоваться, по одной простой причине. При листании клавишами PageUp/PageDown текущая строка (которая с курсором) прыгает по экрану то вверх, то вниз - невозможно предсказать. Нажав PageDown, а потом PageUp, возвращаешься не в исходную точку, а не знамо куда. Поэтому до сих пор я избегал VS Code.

Но сегодня решил разобраться. Как выяснилось, проблема имеет решение. Я сваял расширение, которое обрабатывает кнопки PageUp/PageDown классическим образом, как принято в старых добрых Vim, Emacs и прочих редакторах. Пользуйтесь на здоровье:

github.com/sergev/vscode-classic-paging
vak: (Аристипп)
[personal profile] vak
Народ умудрился загрузить Windows 95 на микроконтроллере ESP32-S3. Затащили туда симулятор i386. Тормознуто, но прикольно.

hackaday.io/project/204408-tiny386

CompactFlash как диск IDE

Nov. 13th, 2025 09:12 pm
vak: (Знайка)
[personal profile] vak
Как превратить карточку CompactFlash в диск IDE для писишки? Есть решение.



А дальше эта штука воткнётся в дисковый контроллер для 8-битной шины ISA.

Роботы это весело

Nov. 13th, 2025 11:49 am
vak: (Робот 2)
[personal profile] vak
Все ржут над российским роботом, а может он вовсе и не кретин. Просто его искусственный интеллект натренирован на советской классике.

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



Моя дипломная специальность называлась «Системы автоматического управления роботами и космическими летательными аппаратами». База - институт прикладной математики Келдыша. Математика прикладывалась качественная, спутники неплохо летали, а вот с роботами был полный швах. Изготовить точную механику советские заводы были неспособны. Шарниры и шестерёнки выходили говённые. В результате суставы у роботов расшатывались как у прокажённых.

Микропроцессоров для управления роботами не было. Мой шеф мечтательно рассказывал, что ему обещали привезти в кармане из-за бугра микроконтроллер Motorola 68000. Теоретически существовали советские 8080, но и их было не достать в конце 80-х. Клятые буржуи ставят по 32-битному процессору на каждую степень свободы, а нам хоть бы один 8-битный на всего робота.

Звали в аспирантуру, но я поглядел на это убожество, и сказал: спасибо, лучше буду юниксом в курчатнике заниматься. Удачно проинтуичил.

ИИ отжигает

Nov. 13th, 2025 12:15 am
vak: Generated by Bard: what if Unix was a person (Киборг)
[personal profile] vak


Been beat down, but I don′t stay low
Got mud on my jeans, still ready to go
Every scar's a story that I survived
I′ve been through hell, but I'm still alive
They say, "Slow down, boy, don't go too fast"
But I ain′t never been one to live in the past
I keep moving forward, never looking back
With a worn-out hat and a six-string strap

You can kick rocks if you don′t like how I talk
I'ma keep on talking and walk my walk
Ain′t changing my tone, ain't changing my song
I was born this way, been loud too long
You can hate my style, you can roll your eyes
But I ain′t slowing down, I was born to rise
So kick them rocks if you don't like how I talk
I′ma keep on talking and walk my walk

I've lost some friends, made a few new foes
But that's just life, that′s how it goes
I ain′t bending over just to please a crowd
If I fall down, I'll fall down proud
I talk my truth, I live my way
Ain′t nobody gonna take my say
This road's been rough, but I learned the trade
It′s sweat, soul, and dues I paid

You can kick rocks if you don't like how I talk
I′ma keep on talking and walk my walk
Ain't changing my tone, ain't changing my song
I was born this way, been loud too long
You can hate my style, you can roll your eyes
But I ain′t slowing down, I was born to rise
So kick them rocks if you don′t like how I talk
I'm gon′ keep on talking and walk my walk (mm, mm)

Let the haters talk, let the rumors fly
I ain't got time to wonder why
The good Lord knows the man I am
And I′ll die standing tall with a mic in my hand

You can kick rocks if you don't like how I talk
I′m gon' keep on talking and walk my walk
Ain't selling my soul for a seat at your table
I′m rough, I′m raw, I'm wild, I′m able
You can hate my fire, but you can't kill my spark
I′m a midnight flame burning through the dark
So kick them rocks if you don't like how I talk
I′ma keep on talking and walk my walk

You can kick rocks (mm-mm)
You can kick rocks (mm-mm)
You can kick rocks (mm-mm)
I'ma keep on talking and walk my walk
vak: (Аристипп)
[personal profile] vak
Кроме сапиенсов на этой планете были и другие люди. Денисовцы и неандертальцы уменьшили свой углеродный след. Мы пока продолжаем.

"Отсеквенирован геном раннего денисовца"

На рисунке: филогенетические деревья, основанные на ядерном геноме (A), митохондриальной ДНК (B) и Y-хромосоме (С). Розовым цветом обозначена линия денисовцев, голубым — неандертальцев, серым — сапиенсов. Стрелками показаны эпизоды гибридизации; те из них, что были выявлены или уточнены в обсуждаемой статье, нарисованы более яркими цветами. Хотя неандертальцы в действительности ближе к денисовцам, чем к сапиенсам (А), по мтДНК и Y-хромосоме они, наоборот, ближе к сапиенсам, чем к денисовцам (B, C). Это может быть связано с распространением у неандертальцев сапиентных вариантов мтДНК и Y-хромосомы в результате древней гибридизации (тонкая серая стрелка на рис. А).

Goulder Dash

Nov. 12th, 2025 10:13 am
vak: (Default)
[personal profile] vak
Помните игрушку Boulder Dash на писишке? Конец 80-х примерно. Бегаешь по плоскости, собираешь ценности, а на тебя камни падают. Вокруг этой игры сорганизовалась тусовка любителей. Восстанавливают уровни, рисуют новые. Переписывают игрушку на разные платформы.

Я подумал: а как бы игра смотрелась в текстовом режиме, но со всякими современными эмоджи. Нашёл исходники на Scala и на скорую руку переделал на Go. Заодно посмотреть, как выглядит в Go библиотека tcell, заменяющая традиционный ncurses.

Проект на Гитхабе: sergev/godash

Вот видео первого уровня игры. Вполне узнаваемо.



Там ещё физику поведения камней можно улучшать. Добавлять прочие приколы типа бабочек и раздвигающихся стен. Организовать переходы с уровня на уровень. В целом Go и библиотека tcell смотрятся неплохо.

Текстовая игра Empire

Nov. 11th, 2025 05:44 pm
vak: (Житель планеты Узм)
[personal profile] vak
Где-то в конце 80-х приехала откуда-то в курчатник юниксная игра на ленточке. Это был Си-шный исходник, переделанный вручную построчно из Фортрана. Страшно на код взглянуть. 😀 Но его удалось оживить, и это оказалась одна из самых играбельных игрушек моей молодости. Называлась Empire.



Рисовалась двумерная карта в текстовом виде, на ней материки и моря, на материках города и армии, в морях корабли. Классическая стратегия, где вы воюете против компьютера за овладение всем миром.

Оказывается, не так давно Эрик Рэймонд эту игру откопал и оживил под названием vms-empire. Легко скачивается, собирается и запускается. Можно вспомнить молодость. Есть двухчасовое видео, где некий упорный чувак проходит Империю.

vak: (Путиномедвед)
[personal profile] vak
https://ulpravda.ru/rubrics/soc/vynuzhdennaia-mera-chto-proiskhodit-s-otkliucheniem-mobilnogo-interneta

“Мобильный интернет отключают по решению именно федеральных властей. Причем не только в Ульяновске - по всей России вблизи объектов специального назначения.”

“Это постоянно действующие ограничения, а не временные меры на период атаки.”

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

То-то я гляжу, в последние месяцы доля читателей моего блога из России упала ниже 8%. Им низзя. Что-то одно: или война, или интернет.

Про vimscript

Nov. 11th, 2025 08:58 am
vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner

Решил написать в vim макрос для вставки текущей даты в текст.

Первый вариант в стиле vim 3.0 в unix окружении получился такой

map ,d :r !date +'%d.%m.%Y' < CR>

Вполне работает, единственный недостаток - вставляет дату новой строкой. Но вообще ради такой ерунды как дата порождать целый новый процесс. Решил подумать, а как это сделать средствами vimscript. То что в vimscript есть функции strftime и localtime разобрался быстро. Но вот как вставить результат функции в текст... Получилось

 map ,d  :put =strftime('%d.%m.%Y',localtime())< CR>

То есть в vim есть псевдо-регистр =, который "содержит" результат вычисления указанного выражения.

Откуда взялся язык Go

Nov. 10th, 2025 02:39 pm
vak: (Аристипп)
[personal profile] vak
Язык программирования Go (также известный как Golang) был создан в Google в 2007 году:
  • Робертом Гриземером
  • Робом Пайком
  • Кеном Томпсоном
Язык был публично анонсирован в ноябре 2009 года, а версия 1.0 вышла в марте 2012 года.

Все три создателя были опытными системными программистами. Кен Томпсон — автор Unix и языка B, который оказал значительное влияние на Си. Роб Пайк работал над операционными системами Plan 9 и Inferno в Bell Labs. Роберт Гриземер трудился над компилятором Oberon вместе с Никлаусом Виртом, создателем языков Pascal и Modula-2, а позже внёс вклад в V8 JavaScript Engine — высокопроизводительный JS-движок, используемый в Google Chrome.

Так что генетика у языка Go правильная.

Рефал тоже

Nov. 10th, 2025 01:39 am
vak: (Default)
[personal profile] vak
Раз со Сноболом дело хорошо пошло, давайте и Рефальный алгоритм сопоставления тоже сбацаем на Gisp.

Вот здесь сам алгоритм и пять демонстрашек: refal_patterns.gisp

Запускаем:
$ gisp refal_patterns.gisp
== Word split with s/w variables ==
Subject: (greetings from gisp world)
Pattern description: [s.first w.middle 'world]
Pattern data: ((var s first) (var w middle) world)
Matches: 1
#1
s.first = greetings
w.middle = (from gisp)

== Bracket structure with s/e variables ==
Subject: (sum (x plus y) done)
Pattern description: ['sum (s.lhs 'plus s.rhs) e.rest]
Pattern data: (sum (br ((var s lhs) plus (var s rhs))) (var e rest))
Matches: 1
#1
s.lhs = x
s.rhs = y
e.rest = (done)

== Repeated s-variable enforces equality ==
Subject: (dup x x)
Pattern description: ['dup s.sym s.sym]
Pattern data: (dup (var s sym) (var s sym))
Matches: 1
#1
s.sym = x

== Repeated variable mismatch ==
Subject: (dup x y)
Result: no match (as expected)

== Backtracking across e-variables ==
Subject: (a middle middle b)
Pattern description: [e.head 'middle e.tail]
Pattern data: ((var e head) middle (var e tail))
Matches: 2
#1
e.head = (a middle)
e.tail = (b)
#2
e.head = (a)
e.tail = (middle b)

== Clause evaluation (factorial skeleton) ==
fact(0) => (1)
fact(3) => (* 3 (fact 2))

Сопоставление строк

Nov. 10th, 2025 12:58 am
vak: (Default)
[personal profile] vak
Перепишем на Gist алгоритм сопоставления строк с шаблоном из Снобола-4.

Реализация и три демонстрашки: snobol_patterns.gisp

Запускаем:
$ gisp snobol_patterns.gisp
== Snobol-style syllable split ==
syllable:
  matched: strand
  captures:
    onset => str
    nucleus => a
    coda => nd

== Configuration pairs with ARBNO/BREAK ==
pairs:
  matched: name = Alice; age=34; city=Rlyeh;
  captures:
    key => name
    value => Alice
    key => age
    value => 34
    key => city
    value => Rlyeh
  pairs:
    name => Alice
    age => 34
    city => Rlyeh

== Log line with LEN/POS/RPOS ==
log:
  matched: ERROR 2025-11-10 parser: unexpected token ';'
  captures:
    level => ERROR
    year => 2025
    month => 11
    day => 10
    date => 2025-11-10
    module => parser
    message => unexpected token ';'
  decoded date: 2025-11-10
  module: parser
  message: unexpected token ';'

Генерим лабиринты

Nov. 10th, 2025 12:44 am
vak: (Default)
[personal profile] vak
Исходный код на Gisp: maze.gisp

Запускаем:
$ ./maze.gisp
┌───────────────────────────────────────┐
│ │
│ ┌───────┬───────┐ ┌───────╴ ╷ │
│ │ │ │ │ │ │
├───┘ ┌───┘ ╷ └───┘ ┌───┬───┘ │
│ │ │ │ │ │
│ ╶───┤ ┌───┴───────────┘ │ ┌───┤
│ │ │ │ │ │
├───┐ │ └───┐ ╷ ╶───┐ │ ╵ │
│ │ │ │ │ │ │ │
│ ╵ ├───╴ │ └───┐ │ ├───╴ │
│ │ │ │ │ │ │
│ ┌───┘ ┌───┴───┐ │ └───┤ ┌───┤
│ │ │ │ │ │ │ │
│ │ ╶───┤ ┌───┘ ├───╴ │ ╵ │
│ │ │ │ │ │ │
│ ├───╴ │ │ ╶───┤ ┌───┴───┐ │
│ │ │ │ │ │ │ │
│ ╵ ┌───┘ └───╴ │ ╵ ╷ ╵ │
│ │ │ │ │
└───────┴───────────────┴───────┴───────┘
vak: (Default)
[personal profile] vak
Взял исходники игры 15 puzzle game на языке Scheme с rosettacode и перепёр на Gisp. Вроде ясный и понятный код получается. Всё в 200 строчек уложилось.
func playGame() {
var board = createStartPosition()
var movesTaken = 0
while true {
if finished(board) {
newline()
display("COMPLETED PUZZLE in ")
display(movesTaken)
display(" moves\n")
return
}
displayBoard(board)
var moves = findMoves(board)
display("Enter a move: ")
display(moves)
newline()
var move = read()
if moveAllowed(moves, move) {
makeMove(board, move)
movesTaken = movesTaken + 1
} else {
display("Invalid move - try again\n")
}
}
}
Весь текст: puzzle15.gisp

Поиграем. В качестве хода надо вводить слова up/down/left/right.
$ gisp puzzle15.gisp 

7 3 4
2 11 8 12
1 13 6 15
5 9 14 10
Enter a move: (down right)
down

2 7 3 4
11 8 12
1 13 6 15
5 9 14 10
Enter a move: (up down right)
down

2 7 3 4
1 11 8 12
13 6 15
5 9 14 10
Enter a move: (up down right)
right

...

1 2 3 4
5 6 7 8
9 10 11
13 14 15 12
Enter a move: (up down left)
down

COMPLETED PUZZLE in 50 moves
Полный протокол здесь: gist.github.com/sergev/2f8a65b7a11ea23a1693346a68a065d0

Мне с молодости импонировал Лисп (и Scheme) своим изяществом. Когда-то я даже стряпал эспериментальные реализации. Но глядеть на код со скобочками мало удовольствия. С удобным синтаксисом получается совсем другая песня.

Go + LISP -> Gisp

Nov. 8th, 2025 09:46 pm
vak: (Знайка)
[personal profile] vak
В качестве проекта выходного дня залудил интерпретатор в стиле Scheme, но с синтаксисом типа Go. Получился весёлый язычок программирования:
func fact(n, acc) {
if n == 0 {
return acc;
}
return fact(n - 1, acc * n);
}
Полный тьюториал здесь: Gisp-Tutorial.md

Исходники: github.com/sergev/gisp

Profile

alexkuklin: (Default)
alexkuklin

January 2020

S M T W T F S
    1234
567891011
12131415161718
19202122232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Nov. 19th, 2025 04:12 am
Powered by Dreamwidth Studios