LINUX.ORG.RU

История изменений

Исправление kaldeon, (текущая версия) :

Plan 9 может быть непривычным, но он практически во всех аспектах проще любого современного юникса. Ядро, юзерспейс, документация — всё написано очень ясно и коротко. Концепции необычные, но зато нет enterprise-scale абстрактной фабрики абстрактных фабрик, нет десятилетних легаси и техдолга, когда качество кода приносится в жертву функциональности, и нет башни из слоновой кости, когда порог входа не ниже PhD в computer science.

Одна из основных графических программ — Acme, текстовый редактор. Это настолько мощная программа, что один из разработчиков при переходе на Linux/macOS портировал весь юзерспейс Plan 9, чтобы получить Acme. Так и появился plan9port.

Если пакет есть в репозитории (например, в Arch Linux есть), можно ставить оттуда. Если нет, можно вручную склонировать git-репозиторий в /usr/local/plan9 и выполнить ./INSTALL (он не будет ничего трогать за пределами /usr/local/plan9).

После установки нужно добавить путь к бинарникам:

export PLAN9=/usr/local/plan9
PATH="$PATH:$PLAN9/bin"

Чтобы не возникло конфликтов (/bin/grep vs /usr/local/plan9/bin/grep), путь лучше добавить в конец PATH.

Установка более подробно описана здесь, но описанных инструкций должно быть достаточно.

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

Код Acme находится в src/cmd/acme. Заходим туда и выполняем команду mk (аналог make). Потом пробуем запустить o.acme.

Acme — это мультиоконный текстовый редактор. Сегодня мультиоконность в текстовых редакторах принято реализовывать через табы. В Acme окна располагаются по-вертикали в каждой колонке. Управление полуавтоматическое: Acme пытается сам угадать наиболее выгодное расположение, но пользователь может его изменить с помощью прямоугольника в левом-верхнем углу.

Баг связан именно с автоматической механикой. Если в любом месте написать команду (условно echo hello world) и исполнить её, нажав на колесо мыши (если есть только тачпад, то нажатие на колесо мыши эмулируется нажатием на тачпад во время удержания клавиши Alt), то Acme автоматически создаст новое окно с названием +Errors, в котором будет напечатан вывод этой команды. Кроме того, курсор мыши сам встанет на место нового окна. И если мы его закроем (нажав на Del колесом мыши), то курсор мыши вернётся обратно.

Кроме тех случаев, когда он по ошибке остаётся на месте, выдёргивая пользователей из состояния нирваны. Именно в этом состоит баг. В Acme есть куча других незаметных багов, но этот самый противный, потому что напрямую ломает ожидания пользователя. Это аффектит всех пользователей.

Демо. Демо без голоса, потому что сейчас половина третьего ночи и все остальные (нормальные) люди дома спят. Если нужно, завтра запишу версию с голосом.

В демо объясняется механизм возникновения ошибки, потому что его проще объяснить на примере. Но ключевые моменты нужно вынести в текст. Основной виновник — это поведение, при котором курсор ставится на окно, чьи размеры были изменены автоматически. +Errors некуда встать, другое окно отодвигается, на него ненадолго встаёт курсор мыши, появляется +Errors и курсор мыши встаёт на окно +Errors, запоминая предыдущее невидимое расположение. Когда +Errors удаляется, курсор встаёт на место пододвинутого окна, где курсор находился долю секунды.

При этом в +Errors нет ничего особенного. Это просто самый частый случай. Новое окно может быть создано в результате любой причины, будь это необходимость показать пользователю вывод команды (этот случай мы рассмотрели), создать новое пустое окно или что-нибудь ещё. Вот ещё одна демка проблемы. В любом случае последующий Del должен вернуть курсор мыши назад.

Нет ничего плохого в том, что курсор встаёт на окно, чьи размеры были изменены. Это помощь пользователю со стороны интерфейса. Кстати, это поведение можно вызвать не только действием пользователя, последствия которого сложно отследить в коде (handleClick и дальше удачи), но и через API. Демо. Можно по коду проследить что делает Acme, когда кто-нибудь записывает строку show в файл ctl.

(echo show |9p write acme/2/ctl — это ничто иное как эмуляция того, что можно было бы выразить через echo show >/mnt/acme/2/ctl в настоящем Plan 9. Просто /mnt/acme был бы у каждого инстанса редактора свой. Это невозможно в юниксах, поэтому эмулируется через 9p write acme/2/ctl. Но в коде Acme это будет выглядеть как отслеживание записей в файл /mnt/acme/2/ctl. Это просто файл с точки зрения программы, ничего особенного.)

Как решить эту проблему? Не ставить курсор на окно с изменёнными размерами, если изменение было вызвано созданием нового окна. Даже если новое окно подвинет десять других окон выше, Acme не должен ни на одно из них ставить курсор мыши.

Как это реализовано сейчас программно? Увы, не знаю.

Источники, которые могут помочь:

  • ознакомиться с тем, что вообще такое Acme, чтобы не чувствовать себя как в тёмном лесу, можно здесь.
  • архитектура описана здесь, в секции Concurrency in the implementation (с тем отличием, что Acme с тех пор был переписан на язык C)
  • структуры данных хранятся в src/cmd/acme/dat.h
  • для конкурентности используется libthread, реализующий стиль CSP в языке C
  • для рисования используется libdraw
  • тонкие отличия диалекта C от ANSI подробно написаны здесь. Но, в целом, это всё тот же C в подавляющей степени.

Исправление kaldeon, :

Plan 9 может быть непривычным, но он практически во всех аспектах проще любого современного юникса. Ядро, юзерспейс, документация — всё написано очень ясно и коротко. Концепции необычные, но зато нет enterprise-scale абстрактной фабрики абстрактных фабрик, нет десятилетних легаси и техдолга, когда качество кода приносится в жертву функциональности, и нет башни из слоновой кости, когда порог входа не ниже PhD в computer science.

Одна из основных графических программ — Acme, текстовый редактор. Это настолько мощная программа, что один из разработчиков при переходе на Linux/macOS портировал весь юзерспейс Plan 9, чтобы получить Acme. Так и появился plan9port.

Если пакет есть в репозитории (например, в Arch Linux есть), можно ставить оттуда. Если нет, можно вручную склонировать git-репозиторий в /usr/local/plan9 и выполнить ./INSTALL (он не будет ничего трогать за пределами /usr/local/plan9).

После установки нужно добавить путь к бинарникам:

export PLAN9=/usr/local/plan9
PATH="$PATH:$PLAN9/bin"

Чтобы не возникло конфликтов (/bin/grep vs /usr/local/plan9/bin/grep), путь лучше добавить в конец PATH.

Установка более подробно описана здесь, но описанных инструкций должно быть достаточно.

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

Код Acme находится в src/cmd/acme. Заходим туда и выполняем команду mk (аналог make). Потом пробуем запустить o.acme.

Acme — это мультиоконный текстовый редактор. Сегодня мультиоконность в текстовых редакторах принято реализовывать через табы. В Acme окна располагаются по-вертикали в каждой колонке. Управление полуавтоматическое: Acme пытается сам угадать наиболее выгодное расположение, но пользователь может его изменить с помощью прямоугольника в левом-верхнем углу.

Баг связан именно с автоматической механикой. Если в любом месте написать команду (условно echo hello world) и исполнить её, нажав на колесо мыши (если есть только тачпад, то нажатие на колесо мыши эмулируется нажатием на тачпад во время удержания клавиши Alt), то Acme автоматически создаст новое окно с названием +Errors, в котором будет напечатан вывод этой команды. Кроме того, курсор мыши сам встанет на место нового окна. И если мы его закроем (нажав на Del колесом мыши), то курсор мыши вернётся обратно.

Кроме тех случаев, когда он по ошибке остаётся на месте, выдёргивая пользователей из состояния нирваны. Именно в этом состоит баг. В Acme есть куча других незаметных багов, но этот самый противный, потому что напрямую ломает ожидания пользователя. Это аффектит всех пользователей.

Демо. Демо без голоса, потому что сейчас половина третьего ночи и все остальные (нормальные) люди дома спят. Если нужно, завтра запишу версию с голосом.

В демо объясняется механизм возникновения ошибки, потому что его проще объяснить на примере. Но ключевые моменты нужно вынести в текст. Основной виновник — это поведение, при котором курсор ставится на окно, чьи размеры были изменены автоматически. +Errors некуда встать, другое окно отодвигается, на него ненадолго встаёт курсор мыши, появляется +Errors и курсор мыши встаёт на окно +Errors, запоминая предыдущее невидимое расположение. Когда +Errors удаляется, курсор встаёт на место пододвинутого окна, где курсор находился долю секунды.

При этом в +Errors нет ничего особенного. Это просто самый частый случай. Новое окно может быть создано в результате любой причины, будь это необходимость показать пользователю вывод команды (этот случай мы рассмотрели), создать новое пустое окно или что-нибудь ещё. Вот ещё одна демка проблемы.

Нет ничего плохого в том, что курсор встаёт на окно, чьи размеры были изменены. Это помощь пользователю со стороны интерфейса. Кстати, это поведение можно вызвать не только действием пользователя, последствия которого сложно отследить в коде (handleClick и дальше удачи), но и через API. Демо. Можно по коду проследить что делает Acme, когда кто-нибудь записывает строку show в файл ctl.

(echo show |9p write acme/2/ctl — это ничто иное как эмуляция того, что можно было бы выразить через echo show >/mnt/acme/2/ctl в настоящем Plan 9. Просто /mnt/acme был бы у каждого инстанса редактора свой. Это невозможно в юниксах, поэтому эмулируется через 9p write acme/2/ctl. Но в коде Acme это будет выглядеть как отслеживание записей в файл /mnt/acme/2/ctl. Это просто файл с точки зрения программы, ничего особенного.)

Как решить эту проблему? Не ставить курсор на окно с изменёнными размерами, если изменение было вызвано созданием нового окна. Даже если новое окно подвинет десять других окон выше, Acme не должен ни на одно из них ставить курсор мыши.

Как это реализовано сейчас программно? Увы, не знаю.

Источники, которые могут помочь:

  • ознакомиться с тем, что вообще такое Acme, чтобы не чувствовать себя как в тёмном лесу, можно здесь.
  • архитектура описана здесь, в секции Concurrency in the implementation (с тем отличием, что Acme с тех пор был переписан на язык C)
  • структуры данных хранятся в src/cmd/acme/dat.h
  • для конкурентности используется libthread, реализующий стиль CSP в языке C
  • для рисования используется libdraw
  • тонкие отличия диалекта C от ANSI подробно написаны здесь. Но, в целом, это всё тот же C в подавляющей степени.

Исправление kaldeon, :

Plan 9 может быть непривычным, но он практически во всех аспектах проще любого современного юникса. Ядро, юзерспейс, документация — всё написано очень ясно и коротко. Концепции необычные, но зато нет enterprise-scale абстрактной фабрики абстрактных фабрик, нет десятилетних легаси и техдолга, когда качество кода приносится в жертву функциональности, и нет башни из слоновой кости, когда порог входа не ниже PhD в computer science.

Одна из основных графических программ — Acme, текстовый редактор. Это настолько мощная программа, что один из разработчиков при переходе на Linux/macOS портировал весь юзерспейс Plan 9, чтобы получить Acme. Так и появился plan9port.

Если пакет есть в репозитории (например, в Arch Linux есть), можно ставить оттуда. Если нет, можно вручную склонировать git-репозиторий в /usr/local/plan9 и выполнить ./INSTALL (он не будет ничего трогать за пределами /usr/local/plan9).

После установки нужно добавить путь к бинарникам:

export PLAN9=/usr/local/plan9
PATH="$PATH:$PLAN9/bin"

Чтобы не возникло конфликтов (/bin/grep vs /usr/local/plan9/bin/grep), путь лучше добавить в конец PATH.

Установка более подробно описана здесь, но описанных инструкций должно быть достаточно.

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

Код Acme находится в src/cmd/acme. Заходим туда и выполняем команду mk (аналог make). Потом пробуем запустить o.acme.

Acme — это мультиоконный текстовый редактор. Сегодня мультиоконность в текстовых редакторах принято реализовывать через табы. В Acme окна располагаются по-вертикали в каждой колонке. Управление полуавтоматическое: Acme пытается сам угадать наиболее выгодное расположение, но пользователь может его изменить с помощью прямоугольника в левом-верхнем углу.

Баг связан именно с автоматической механикой. Если в любом месте написать команду (условно echo hello world) и исполнить её, нажав на колесо мыши (если есть только тачпад, то нажатие на колесо мыши эмулируется нажатием на тачпад во время удержания клавиши Alt), то Acme автоматически создаст новое окно с названием +Errors, в котором будет напечатан вывод этой команды. Кроме того, курсор мыши сам встанет на место нового окна. И если мы его закроем (нажав на Del колесом мыши), то курсор мыши вернётся обратно.

Кроме тех случаев, когда он по ошибке остаётся на месте, выдёргивая пользователей из состояния нирваны. Именно в этом состоит баг. В Acme есть куча других незаметных багов, но этот самый противный, потому что напрямую ломает ожидания пользователя. Это аффектит всех пользователей.

Демо. Демо без голоса, потому что сейчас половина третьего ночи и все остальные (нормальные) люди дома спят. Если нужно, завтра запишу версию с голосом.

В демо объясняется механизм возникновения ошибки, потому что его проще объяснить на примере. Но ключевые моменты нужно вынести в текст. Основной виновник — это поведение, при котором курсор ставится на окно, чьи размеры были изменены автоматически. +Errors некуда встать, другое окно отодвигается, на него ненадолго встаёт курсор мыши, появляется +Errors и курсор мыши встаёт на окно +Errors, запоминая предыдущее невидимое расположение. Когда +Errors удаляется, курсор встаёт на место пододвинутого окна, где курсор находился долю секунды.

При этом в +Errors нет ничего особенного. Это просто самый частый случай. Новое окно может быть создано в результате любой причины, будь это необходимость показать пользователю вывод команды (этот случай мы рассмотрели), создать новое пустое окно или что-нибудь ещё. Вот ещё одна демка проблемы.

Нет ничего плохого в том, что курсор встаёт на окно, чьи размеры были изменены. Это помощь пользователю со стороны интерфейса. Кстати, это поведение можно вызвать не только действием пользователя, последствия которого сложно отследить в коде (handleClick и дальше удачи), но и через API. Демо. Можно по коду проследить что делает Acme, когда кто-нибудь записывает строку show в файл ctl.

(echo show |9p write acme/2/ctl — это ничто иное как эмуляция того, что можно было бы выразить через echo show >/mnt/acme/2/ctl в настоящем Plan 9. Просто /mnt/acme был бы у каждого инстанса редактора свой. Это невозможно в юниксах, поэтому эмулируется через 9p write acme/2/ctl. Но в коде Acme это будет выглядеть как отслеживание записей в файл /mnt/acme/2/ctl. Это просто файл с точки зрения программы, ничего особенного.)

Как решить эту проблему? Не ставить курсор на окно с изменёнными размерами, если изменение было вызвано созданием нового окна. Даже если новое окно подвинет десять других окон выше, Acme не должен ни на одно из них ставить курсор мыши.

Как это реализовано сейчас программно? Увы, не знаю.

Источники, которые могут помочь:

  • ознакомиться с тем, что вообще такое Acme, чтобы не чувствовать себя как в тёмном лесу, можно здесь.
  • архитектура описана здесь, в секции Concurrency in the implementation (с тем отличием, что Acme с тех пор был переписан на язык C)
  • структуры данных хранятся в src/cmd/acme/dat.h
  • для конкурентности используется libthread, реализующий стиль CSP в языке C
  • для рисования используется libdraw
  • тонкие отличия диалекта C от ANSI подробно написаны здесь. Но, в целом, в подавляющем степени это всё тот же C.

Исправление kaldeon, :

Plan 9 может быть непривычным, но он практически во всех аспектах проще любого современного юникса. Ядро, юзерспейс, документация — всё написано очень ясно и коротко. Концепции необычные, но зато нет enterprise-scale абстрактной фабрики абстрактных фабрик, нет десятилетних легаси и техдолга, когда качество кода приносится в жертву функциональности, и нет башни из слоновой кости, когда порог входа не ниже PhD в computer science.

Одна из основных графических программ — Acme, текстовый редактор. Это настолько мощная программа, что один из разработчиков при переходе на Linux/macOS портировал весь юзерспейс Plan 9, чтобы получить Acme. Так и появился plan9port.

Если пакет есть в репозитории (например, в Arch Linux есть), можно ставить оттуда. Если нет, можно вручную склонировать git-репозиторий в /usr/local/plan9 и выполнить ./INSTALL (он не будет ничего трогать за пределами /usr/local/plan9).

После установки нужно добавить путь к бинарникам:

export PLAN9=/usr/local/plan9
PATH="$PATH:$PLAN9/bin"

Чтобы не возникло конфликтов (/bin/grep vs /usr/local/plan9/bin/grep), путь лучше добавить в конец PATH.

Установка более подробно описана здесь, но описанных инструкций должно быть достаточно.

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

Код Acme находится в src/cmd/acme. Заходим туда и выполняем команду mk (аналог make). Потом пробуем запустить o.acme.

Acme — это мультиоконный текстовый редактор. Сегодня мультиоконность в текстовых редакторах принято реализовывать через табы. В Acme окна располагаются по-вертикали в каждой колонке. Управление полуавтоматическое: Acme пытается сам угадать наиболее выгодное расположение, но пользователь может его изменить с помощью прямоугольника в левом-верхнем углу.

Баг связан именно с автоматической механикой. Если в любом месте написать команду (условно echo hello world) и исполнить её, нажав на колесо мыши (если есть только тачпад, то нажатие на колесо мыши эмулируется нажатием на тачпад во время удержания клавиши Alt), то Acme автоматически создаст новое окно с названием +Errors, в котором будет напечатан вывод этой команды. Кроме того, курсор мыши сам встанет на место нового окна. И если мы его закроем (нажав на Del колесом мыши), то курсор мыши вернётся обратно.

Кроме тех случаев, когда он по ошибке остаётся на месте, выдёргивая пользователей из состояния нирваны. Именно в этом состоит баг. В Acme есть куча других незаметных багов, но этот самый противный, потому что напрямую ломает ожидания пользователя. Это аффектит всех пользователей.

Демо. Демо без голоса, потому что сейчас половина третьего ночи и все остальные (нормальные) люди дома спят. Если нужно, завтра запишу версию с голосом.

В демо объясняется механизм возникновения ошибки, потому что его проще объяснить на примере. Но ключевые моменты нужно вынести в текст. Основной виновник — это поведение, при котором курсор ставится на окно, чьи размеры были изменены автоматически. +Errors некуда встать, другое окно отодвигается, на него ненадолго встаёт курсор мыши, появляется +Errors и курсор мыши встаёт на окно +Errors, запоминая предыдущее невидимое расположение. Когда +Errors удаляется, курсор встаёт на место пододвинутого окна, где курсор находился долю секунды.

При этом в +Errors нет ничего особенного. Это просто самый частый случай. Новое окно может быть создано в результате любой причины, будь это необходимость показать пользователю вывод команды (этот случай мы рассмотрели), создать новое пустое окно или что-нибудь ещё. Вот ещё одна демка проблемы.

Нет ничего плохого в том, что курсор встаёт на окно, чьи размеры были изменены. Это помощь пользователю со стороны интерфейса. Кстати, это поведение можно вызвать не только действием пользователя, последствия которого сложно отследить в коде (handleClick и дальше удачи), но и через API. Демо. Можно по коду проследить что делает Acme, когда кто-нибудь записывает строку show в файл ctl.

(echo show |9p write acme/2/ctl — это ничто иное как эмуляция того, что можно было бы выразить через echo show >/mnt/acme/2/ctl в настоящем Plan 9. Просто /mnt/acme был бы у каждого инстанса редактора свой. Это невозможно в юниксах, поэтому эмулируется через 9p write acme/2/ctl. Но в коде Acme это будет выглядеть как отслеживание изменений в файле /mnt/acme/2/ctl. Это просто файл с точки зрения программы, ничего особенного.)

Как решить эту проблему? Не ставить курсор на окно с изменёнными размерами, если изменение было вызвано созданием нового окна. Даже если новое окно подвинет десять других окон выше, Acme не должен ни на одно из них ставить курсор мыши.

Как это реализовано сейчас программно? Увы, не знаю.

Источники, которые могут помочь:

  • ознакомиться с тем, что вообще такое Acme, чтобы не чувствовать себя как в тёмном лесу, можно здесь.
  • архитектура описана здесь, в секции Concurrency in the implementation (с тем отличием, что Acme с тех пор был переписан на язык C)
  • структуры данных хранятся в src/cmd/acme/dat.h
  • для конкурентности используется libthread, реализующий стиль CSP в языке C
  • для рисования используется libdraw
  • тонкие отличия диалекта C от ANSI подробно написаны здесь. Но, в целом, в подавляющем степени это всё тот же C.

Исправление kaldeon, :

Plan 9 может быть непривычным, но он практически во всех аспектах проще любого современного юникса. Ядро, юзерспейс, документация — всё написано очень ясно и коротко. Концепции необычные, но зато нет enterprise-scale абстрактной фабрики абстрактных фабрик, нет десятилетних легаси и техдолга, когда качество кода приносится в жертву функциональности, и нет башни из слоновой кости, когда порог входа не ниже PhD в computer science.

Одна из основных графических программ — Acme, текстовый редактор. Это настолько мощная программа, что один из разработчиков при переходе на Linux/macOS портировал весь юзерспейс Plan 9, чтобы получить Acme. Так и появился plan9port.

Если пакет есть в репозитории (например, в Arch Linux есть), можно ставить оттуда. Если нет, можно вручную склонировать git-репозиторий в /usr/local/plan9 и выполнить ./INSTALL (он не будет ничего трогать за пределами /usr/local/plan9).

После установки нужно добавить путь к бинарникам:

export PLAN9=/usr/local/plan9
PATH="$PATH:$PLAN9/bin"

Чтобы не возникло конфликтов (/bin/grep vs /usr/local/plan9/bin/grep), путь лучше добавить в конец PATH.

Установка более подробно описана здесь, но описанных инструкций должно быть достаточно.

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

Код Acme находится в src/cmd/acme. Заходим туда и выполняем команду mk (аналог make). Потом пробуем запустить o.acme.

Acme — это мультиоконный текстовый редактор. Сегодня мультиоконность в текстовых редакторах принято реализовывать через табы. В Acme окна располагаются по-вертикали в каждой колонке. Управление полуавтоматическое: Acme пытается сам угадать наиболее выгодное расположение, но пользователь может его изменить с помощью прямоугольника в левом-верхнем углу.

Баг связан именно с автоматической механикой. Если в любом месте написать команду (условно echo hello world) и исполнить её, нажав на колесо мыши (если есть только тачпад, то нажатие на колесо мыши эмулируется нажатием на тачпад во время удержания клавиши Alt), то Acme автоматически создаст новое окно с названием +Errors, в котором будет напечатан вывод этой команды. Кроме того, курсор мыши сам встанет на место нового окна. И если мы его закроем (нажав на Del колесом мыши), то курсор мыши вернётся обратно.

Кроме тех случаев, когда он по ошибке остаётся на месте, выдёргивая пользователей из состояния нирваны. Именно в этом состоит баг. В Acme есть куча других незаметных багов, но этот самый противный, потому что напрямую ломает ожидания пользователя. Это аффектит всех пользователей.

Демо. Демо без голоса, потому что сейчас половина третьего ночи и все остальные (нормальные) люди дома спят. Если нужно, завтра запишу версию с голосом.

В демо объясняется механизм возникновения ошибки, потому что его проще объяснить на примере. Но ключевые моменты нужно вынести в текст. Основной виновник — это поведение, при котором курсор ставится на окно, чьи размеры были изменены автоматически. +Errors некуда встать, другое окно отодвигается, на него ненадолго встаёт курсор мыши, появляется +Errors и курсор мыши встаёт на окно +Errors, запоминая предыдущее невидимое расположение. Когда +Errors удаляется, курсор встаёт на место пододвинутого окна, где курсор находился долю секунды.

При этом в +Errors нет ничего особенного. Это просто самый частый случай. Новое окно может быть создано в результате любой причины, будь это необходимость показать пользователю вывод команды (этот случай мы рассмотрели), создать новое пустое окно или что-нибудь ещё. Вот ещё одна демка проблемы.

Нет ничего плохого в том, что курсор встаёт на окно, чьи размеры были изменены. Это помощь пользователю со стороны интерфейса. Кстати, это поведение можно вызвать не только действием пользователя, последствия которого сложно отследить в коде (handleClick и дальше удачи), но и через API. Демо. Можно по коду проследить что делает Acme, когда кто-нибудь записывает строку show в файл ctl.

(echo show |9p write acme/2/ctl — это ничто иное как эмуляция того, что можно было бы выразить через echo show >/mnt/acme/2/ctl в настоящем Plan 9. Просто /mnt/acme был бы у каждого инстанса редактора свой. Это невозможно в юниксах, поэтому эмулируется через 9p write acme/2/ctl. Но в коде Acme это будет выглядеть как отслеживание изменений в файле /mnt/acme/2/ctl. Это просто файл с точки зрения программы, ничего особенного.)

Как решить эту проблему? Не ставить курсор на окно с изменёнными размерами, если изменение было вызвано созданием нового окна. Даже если новое окно подвинет десять других окон выше, Acme не должен ни на одно из них ставить курсор мыши.

Как это реализовано сейчас программно? Увы, не знаю.

Источники, которые могут помочь:

  • ознакомиться с тем, что вообще такое Acme, чтобы не чувствовать себя как в тёмном лесу, можно здесь.
  • архитектура описана здесь, в секции Concurrency in the implementation (с тем отличием, что Acme с тех пор был переписан на язык C)
  • структуры данных хранятся в src/cmd/acme/dat.h
  • для конкурентности используется libthread, реализующий стиль CSP в языке C
  • для рисования используется libdraw
  • тонкие отличия диалекта C от ANSI подробно написаны здесь. Но, в целом, в подавляющем степени это всё тот же C.

Исправление kaldeon, :

Plan 9 может быть непривычным, но он практически во всех аспектах проще любого современного юникса. Ядро, юзерспейс, документация — всё написано очень ясно и коротко. Концепции необычные, но зато нет enterprise-scale абстрактной фабрики абстрактных фабрик, нет десятилетних легаси и техдолга, когда качество кода приносится в жертву функциональности, и нет башни из слоновой кости, когда порог входа не ниже PhD в computer science.

Одна из основных графических программ — Acme, текстовый редактор. Это настолько мощная программа, что один из разработчиков при переходе на Linux/macOS портировал все юзерспейсные программы Plan 9, чтобы получить Acme. Так и появился plan9port.

Если пакет есть в репозитории (например, в Arch Linux есть), можно ставить оттуда. Если нет, можно вручную склонировать git-репозиторий в /usr/local/plan9 и выполнить ./INSTALL (он не будет ничего трогать за пределами /usr/local/plan9).

После установки нужно добавить путь к бинарникам:

export PLAN9=/usr/local/plan9
PATH="$PATH:$PLAN9/bin"

Чтобы не возникло конфликтов (/bin/grep vs /usr/local/plan9/bin/grep), путь лучше добавить в конец PATH.

Установка более подробно описана здесь, но описанных инструкций должно быть достаточно.

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

Код Acme находится в src/cmd/acme. Заходим туда и выполняем команду mk (аналог make). Потом пробуем запустить o.acme.

Acme — это мультиоконный текстовый редактор. Сегодня мультиоконность в текстовых редакторах принято реализовывать через табы. В Acme окна располагаются по-вертикали в каждой колонке. Управление полуавтоматическое: Acme пытается сам угадать наиболее выгодное расположение, но пользователь может его изменить с помощью прямоугольника в левом-верхнем углу.

Баг связан именно с автоматической механикой. Если в любом месте написать команду (условно echo hello world) и исполнить её, нажав на колесо мыши (если есть только тачпад, то нажатие на колесо мыши эмулируется нажатием на тачпад во время удержания клавиши Alt), то Acme автоматически создаст новое окно с названием +Errors, в котором будет напечатан вывод этой команды. Кроме того, курсор мыши сам встанет на место нового окна. И если мы его закроем (нажав на Del колесом мыши), то курсор мыши вернётся обратно.

Кроме тех случаев, когда он по ошибке остаётся на месте, выдёргивая пользователей из состояния нирваны. Именно в этом состоит баг. В Acme есть куча других незаметных багов, но этот самый противный, потому что напрямую ломает ожидания пользователя. Это аффектит всех пользователей.

Демо. Демо без голоса, потому что сейчас половина третьего ночи и все остальные (нормальные) люди дома спят. Если нужно, завтра запишу версию с голосом.

В демо объясняется механизм возникновения ошибки, потому что его проще объяснить на примере. Но ключевые моменты нужно вынести в текст. Основной виновник — это поведение, при котором курсор ставится на окно, чьи размеры были изменены автоматически. +Errors некуда встать, другое окно отодвигается, на него ненадолго встаёт курсор мыши, появляется +Errors и курсор мыши встаёт на окно +Errors, запоминая предыдущее невидимое расположение. Когда +Errors удаляется, курсор встаёт на место пододвинутого окна, где курсор находился долю секунды.

При этом в +Errors нет ничего особенного. Это просто самый частый случай. Новое окно может быть создано в результате любой причины, будь это необходимость показать пользователю вывод команды (этот случай мы рассмотрели), создать новое пустое окно или что-нибудь ещё. Вот ещё одна демка проблемы.

Нет ничего плохого в том, что курсор встаёт на окно, чьи размеры были изменены. Это помощь пользователю со стороны интерфейса. Кстати, это поведение можно вызвать не только действием пользователя, последствия которого сложно отследить в коде (handleClick и дальше удачи), но и через API. Демо. Можно по коду проследить что делает Acme, когда кто-нибудь записывает строку show в файл ctl.

(echo show |9p write acme/2/ctl — это ничто иное как эмуляция того, что можно было бы выразить через echo show >/mnt/acme/2/ctl в настоящем Plan 9. Просто /mnt/acme был бы у каждого инстанса редактора свой. Это невозможно в юниксах, поэтому эмулируется через 9p write acme/2/ctl. Но в коде Acme это будет выглядеть как отслеживание изменений в файле /mnt/acme/2/ctl. Это просто файл с точки зрения программы, ничего особенного.)

Как решить эту проблему? Не ставить курсор на окно с изменёнными размерами, если изменение было вызвано созданием нового окна. Даже если новое окно подвинет десять других окон выше, Acme не должен ни на одно из них ставить курсор мыши.

Как это реализовано сейчас программно? Увы, не знаю.

Источники, которые могут помочь:

  • ознакомиться с тем, что вообще такое Acme, чтобы не чувствовать себя как в тёмном лесу, можно здесь.
  • архитектура описана здесь, в секции Concurrency in the implementation (с тем отличием, что Acme с тех пор был переписан на язык C)
  • структуры данных хранятся в src/cmd/acme/dat.h
  • для конкурентности используется libthread, реализующий стиль CSP в языке C
  • для рисования используется libdraw
  • тонкие отличия диалекта C от ANSI подробно написаны здесь. Но, в целом, в подавляющем степени это всё тот же C.

Исходная версия kaldeon, :

Plan 9 может быть непривычным, но он практически во всех аспектах проще любого современного юникса. Ядро, юзерспейс, документация — всё написано очень ясно и коротко. Концепции необычные, но зато нет enterprise-scale абстрактной фабрики абстрактных фабрик, нет десятилетних легаси и техдолга, когда качество кода приносится в жертву функциональности, и нет башни из слоновой кости, когда порог входа стоит на PhD в computer science.

Одна из основных графических программ — Acme, текстовый редактор. Это настолько мощная программа, что один из разработчиков при переходе на Linux/macOS портировал все юзерспейсные программы Plan 9, чтобы получить Acme. Так и появился plan9port.

Если пакет есть в репозитории (например, в Arch Linux есть), можно ставить оттуда. Если нет, можно вручную склонировать git-репозиторий в /usr/local/plan9 и выполнить ./INSTALL (он не будет ничего трогать за пределами /usr/local/plan9).

После установки нужно добавить путь к бинарникам:

export PLAN9=/usr/local/plan9
PATH="$PATH:$PLAN9/bin"

Чтобы не возникло конфликтов (/bin/grep vs /usr/local/plan9/bin/grep), путь лучше добавить в конец PATH.

Установка более подробно описана здесь, но описанных инструкций должно быть достаточно.

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

Код Acme находится в src/cmd/acme. Заходим туда и выполняем команду mk (аналог make). Потом пробуем запустить o.acme.

Acme — это мультиоконный текстовый редактор. Сегодня мультиоконность в текстовых редакторах принято реализовывать через табы. В Acme окна располагаются по-вертикали в каждой колонке. Управление полуавтоматическое: Acme пытается сам угадать наиболее выгодное расположение, но пользователь может его изменить с помощью прямоугольника в левом-верхнем углу.

Баг связан именно с автоматической механикой. Если в любом месте написать команду (условно echo hello world) и исполнить её, нажав на колесо мыши (если есть только тачпад, то нажатие на колесо мыши эмулируется нажатием на тачпад во время удержания клавиши Alt), то Acme автоматически создаст новое окно с названием +Errors, в котором будет напечатан вывод этой команды. Кроме того, курсор мыши сам встанет на место нового окна. И если мы его закроем (нажав на Del колесом мыши), то курсор мыши вернётся обратно.

Кроме тех случаев, когда он по ошибке остаётся на месте, выдёргивая пользователей из состояния нирваны. Именно в этом состоит баг. В Acme есть куча других незаметных багов, но этот самый противный, потому что напрямую ломает ожидания пользователя. Это аффектит всех пользователей.

Демо. Демо без голоса, потому что сейчас половина третьего ночи и все остальные (нормальные) люди дома спят. Если нужно, завтра запишу версию с голосом.

В демо объясняется механизм возникновения ошибки, потому что его проще объяснить на примере. Но ключевые моменты нужно вынести в текст. Основной виновник — это поведение, при котором курсор ставится на окно, чьи размеры были изменены автоматически. +Errors некуда встать, другое окно отодвигается, на него ненадолго встаёт курсор мыши, появляется +Errors и курсор мыши встаёт на окно +Errors, запоминая предыдущее невидимое расположение. Когда +Errors удаляется, курсор встаёт на место пододвинутого окна, где курсор находился долю секунды.

При этом в +Errors нет ничего особенного. Это просто самый частый случай. Новое окно может быть создано в результате любой причины, будь это необходимость показать пользователю вывод команды (этот случай мы рассмотрели), создать новое пустое окно или что-нибудь ещё. Вот ещё одна демка проблемы.

Нет ничего плохого в том, что курсор встаёт на окно, чьи размеры были изменены. Это помощь пользователю со стороны интерфейса. Кстати, это поведение можно вызвать не только действием пользователя, последствия которого сложно отследить в коде (handleClick и дальше удачи), но и через API. Демо. Можно по коду проследить что делает Acme, когда кто-нибудь записывает строку show в файл ctl.

(echo show |9p write acme/2/ctl — это ничто иное как эмуляция того, что можно было бы выразить через echo show >/mnt/acme/2/ctl в настоящем Plan 9. Просто /mnt/acme был бы у каждого инстанса редактора свой. Это невозможно в юниксах, поэтому эмулируется через 9p write acme/2/ctl. Но в коде Acme это будет выглядеть как отслеживание изменений в файле /mnt/acme/2/ctl. Это просто файл с точки зрения программы, ничего особенного.)

Как решить эту проблему? Не ставить курсор на окно с изменёнными размерами, если изменение было вызвано созданием нового окна. Даже если новое окно подвинет десять других окон выше, Acme не должен ни на одно из них ставить курсор мыши.

Как это реализовано сейчас программно? Увы, не знаю.

Источники, которые могут помочь:

  • ознакомиться с тем, что вообще такое Acme, чтобы не чувствовать себя как в тёмном лесу, можно здесь.
  • архитектура описана здесь, в секции Concurrency in the implementation (с тем отличием, что Acme с тех пор был переписан на язык C)
  • структуры данных хранятся в src/cmd/acme/dat.h
  • для конкурентности используется libthread, реализующий стиль CSP в языке C
  • для рисования используется libdraw
  • тонкие отличия диалекта C от ANSI подробно написаны здесь. Но, в целом, в подавляющем степени это всё тот же C.