wildcat

Передсмертне булькання ЖиЖі

У зв’язку з тим, що, судячи із стрічки, ЖЖ таки остаточно здихає (ура!), нагадую, що я є на dreamwidth (але не обіцяю там активної діяльності, за винятком коментування та репосту постів із своїх інших блогів (наприклад dmytrish.net/blog – додавайте в RSS!).

Також я більш-менш часто (але коротко) писав останнім часом в фейсбук і раніше в Google+ (зараз дещо мертвуватий).

До зустрічі на інших платформах!
bartson

COMEFROM memory protection

Недавно стукнула мені в голову одна ідейка щодо memory protection у операційних системах. Мабуть, я перевинайшов якийсь велосипед або в цій ідеї є якась принципова хріновість, — це я і хочу зрозуміти за допомогою шановної публіки.

Як відомо, в юнісксоподібних (включно із NT) системах пам’ять процесів захищається через створення таблиць віртуальної пам’яті, специфічних для кожного процесу та завантаження цих таблиць (із вимиванням кеша та іншими неприємними побічними ефектами) при кожному перемиканні контексту. В результаті якщо код/дані замаплені у віртуальну пам’ять процеса, вони доступні, якщо ні — їх там не існує.

Тому мікроядра примушені ходити довгою дорогою: «відіслали повідомлення в ядро, syscall» — «ядро копіює його собі і кладе в чергу, yield процеса або context switch на процес-адресат» — «повернулись у процес-адресат, скопіювали собі, обробили запит, відіслали відповідь, syscall» — «ядро копіює відповідь собі і кладе у чергу повідомлень, yield або виклик адресанта, копіювання в віртуальну пам’ять адресанта, context switch» — «адресант приймає відповідь».

Просто віртуальну пам’ять я б назвав GOTO memory protection: вона заснована на тому, *куди* направлений стрибок коду або звернення за даними, незалежно від того, звідки переходять або звертаються.

А що ж протилежністю GOTO? Правильно, інструкція COMEFROM, яка існує в деяких езотеричних мовах і досі здавалась мені абсолютно безглуздою. Як вона працює: COMEFROM 0xdeadbeef в будь-якому місці програми створює стрибок із 0xdeadbeef у це місце.

Ідея полягає в тому, щоб перевіряти *звідки* прийшов control flow або звернення за даними, і для певних ділянок дозволяти такі звернення. для інших ні. Таким чином, можна в одному адресному просторі тримати багато доменів коду-даних, у яких немає прямого доступу один до одного, але можуть бути публічні інтерфейси.

Тобто, якщо ми хочемо файлову систему як сервіс у юзерспейсі, ми створюємо в фізичній пам’яті домен коду «інтерфейс», доступ до якого можливий із будь-якої адреси, домен «код реалізації» та «дані реалізації», доступ до якого можливий лише лише із фізичної пам’яті ділянки «інтерфейс». Далі ми мапимо ці домени в адресний простір усіх зацікавлених процесів. Коли процесу необхідно, для прикладу, прочитати файл, він просто робить виклик функції із «інтерфейсу», вона валідує дані і викликає функцію із «реалізації». Прямий виклик неможливий і призводить до PageFault/DomainFault. Спроба записати дані із стороннього коду в «дані реалізації» також повинна закінчуватись DomainFault.

Таким чином, сервіс, подібний до мікроядерного, стає просто спільним кодом усіх клієнтів, які для нього виглядають як треди, які працюють із спільним станом. І виклик цього сервісу перетворюється в два виклики функцій в юзерспейсі. Проблеми синхронізації спільних даних, звичайно, гидкі, але сішників це не зупиняє і інструментарій є (м’ютекси-семафори-бар’єри-conditionals).

Найбільша проблема цієї ідеї — що DomainFault має реалізовуватись у залізі додатково до PageFault та всієї існуючої віртуальної пам’яті.
Крім того, неясно, наскільки витратна така модель по пам’яті. В принципі, для кожної ділянки фізичної пам’яті (сторінки або сегмента?) було б достатньо вказати, чи публічний доступ до неї, чи тільки із якогось одного діапазону/сегмента.

P.S. В певному розумінні ця ідея є ідеєю security capabilities. Код, який прийшов із «інтерфейсу», має capability доступу до даних та коду реалізації, будь-який інший виклик — ні.
Слоупок

Убей питерских троллей

Сегодня Новая газета опубликовала большую статью про знаменитых "питерских троллей" они же "Ольгинские"... Люди на зарплате пишут комментарии в ЖЖ на заданную тему. Темы незамысловатые: Навальный мудак, Обама чмо, в Киева фашисты ну и т.д. Вы и сами это знаете. Почитайте, интересная статья, хотя и ничего нового.

Помимо всего прочего в статье опубликован список из 677 ников троллей.

Что делать дальше? Просто забаньте их всех и ЖЖ из помойки превратится в цветущий альпийский луг.

Сделать это очень просто.

1. Заходите в консоль ЖЖ
2. Вставляете список троллей в окошко



К сожалению, больше 50 троллей в печь не засунуть больше 50 команд одновременно через консоль выполнить нельзя, поэтому я разбил список на 14 частей, которые вам придется по очереди вставлять.

3. Нажимаете кнопочку "execute"!
4. Все, в вашем ЖЖ больше никто не будет гадить
5. Расскажи друзьям, очистим ЖЖ от говна.


Что им помешает зарегистрировать новые аккаунты? Ничего... Но это долго и дорого... Так что, если окончательно ЖЖ от платных комментов мы и не очистим, то хоть немного проветрим.
GuyFox

Хроніки Євромайдану: 22-30 листопада

Викладу свій архів фотографій Євромайдану. Постарався вибрати фото кращої якості, але деякі все одно досить розмиті (особливо нічні), перепрошую.

Collapse )
DSC_0019
Collapse )
root

implicit typing woes

Про implicit typing:

Писав на днях сервер на Happstack, а оскільки я тоді не додумався запускати ghci із :l Main.hs і дивитись типи обробників і таблиць маршрутизації (всі ці ServerPartT IO Response), то типові сигнатури я випускав, в результаті в мене вийшла програма на сотні три рядків практично без оголошень типів. Зручно? Можливо.

Але коли я в одному місці забув перед appendFile приписати liftIO, тайпчекер had gone wild: вирішивши, що тип серверних процедур це IO Response, він почав викидати абсурдні повідомлення про помилки на інших, коректних процедурах, не вказуючи на реальне джерело там, де був забутий liftIO.

Після цього я таки задумався, як з’ясувати дефолтний тип, який ховається за ServerMonad m, FilterMonad Response m, WebMonad та іншими констрейтами і написати явні типові анотації.
bartson

(no subject)

У мене сьогодні був день тикання паличкою в IDE.

IntelliJ Idea


— ставив на випадок, якщо захочеться порозбиратись із Скалою (та і з Java непогано було б познайомитись ближче, хоча б заради JVM). Стало не без бубна:
  1. під лінукс іде архів, який треба розпакувати, далі запускається все саме, але коли я наставив плагінів, Ідея почала зависати при запуску, довелось вивчити, що плагіни ставляться в ~/.IdeaIC13/config/plugins і лінійним перебором визначити, що це все IDLua);

  2. під мак є інсталятор, але перший запуск закінчується тим, що просить встановити JDK6 (при тому, що в мене уже Oracle JDK8 встановлений), щось кудись лізе і ніби встановлює, але наступного разу відбувається те саме. Виявилось, що лікується редагуванням JVMVersion у /Applications/IntelliJ Idea 13.../Contents/Info.plist із 1.6 до 1.8, а далі все чудово працює.


А загалом враження досить приємні, є плагіни практично під усе, що завгодно (Erlang, Scala, Clojure, Bash, Ocaml (глючний), Lua, і — неймовірно! — Haskell, Elixir і Rust! Правда, думаю, що на рівні vim, підсвітка синтаксису). Інтерфейс достатньо мінімалістичний, плагін IdeaVim присутній (хоч ніщо так не бісить, як імітація Віма, в якій відсутні половина звичних команд), інтеграція із командним рядком хороша (термінал Alt-F12 або ⌥-F12, плагін ShellProcess для натравлювання команд шела на виділений текст). Шрифти під лінуксом як для Java-приблуди просто божественні, Darkula look&feel приємний.

fpcomplete.com


Знімок екрана 2014-08-29 о 01.57.08
Недавно пробігав пост, що вони полегшили життя для безплатного користування, вирішив ще раз подивитись, як прогрес. Виглядає відносно гламурно, vim-mode присутній, але недороблений (Ctrl-F є, а Ctrl-B уже зайнятий переходом до визначення, причому як повернутись, неясно, Ctrl-O не працює; Ctrl-E/Y не працюють), проекти із гітхаба експортуються на ура. Загалом функціональність Віма+hasktags+haskellmode-vim присутня (перехід до визначення, тип виразу під курсором); так і не знайшов способу просто запустити ghci і гратись із repl`ом, обов’язково потрібен деплой або запуск бінарника.

Ще я зрадів, що тепер можна буде програмувати на Хаскелі на планшеті, але радість була сильно передчасною: на 7" html layout сильно поплив і з мобільних пристроїв сайт практично неюзабельний (а в цьому ж і основна сіль хмар, нормальна робота з недокомп’ютерів), а з розгорнутою клавіатурою зрозуміти, що на екрані, взагалі неможливо. Печаль.
root

Про розгрібання файлів in Unix way

Недавно в моєму фейсбуку почалась досить гаряча суперечка про те, що краще, mc чи bash. Аргументи за mc були про швидкість і м’язову пам’ять (хоч при нормальному володінні клавіатурою м’язова пам’ять на башівські команди може бути нічим не гірше), я ж захищав можливо повільніший, але набагато більш потужний підхід командного рядка.

Зараз я просто хочу розібрати приклад того, що стає можливим при правильному жонглюванні можливостями юніксового командного рядка.

Свою бібліотеку електронної літератури я з деякого часу тримаю у Дропбоксі, але тим не менш у мене часто розводяться офлайнові звалища літератури, і так на робочому комп’ютері самозародилась тека ~/downloads/Books/, в якій розвелось немало копій того, що уже лежить в ~/public/Dropbox. Завдання полягає у тому, щоб:
1) з’ясувати, які pdf-файли однакові і там, і там (тоді можна знищити зайві копії в локальному гадюшнику);
2) з’ясувати, які pdf-файли є лише локально (тоді можна їх скопом скопіювати в дропбокс);

Collapse )
Бо

ICFPC: я слоупок?

По сусідніх жежешках прокотилась хвиля вражень від реалізації SECD в рамках ICFPC 2014, а моєму репо на гітхабі поставили дві-три зірочки. Я багато пропустив? Тобто я дізнався про ICFPC хвилин за п’ятнадцять до його початку і подумав, що вже пізно і краще займусь своєю secd, а міг би написати її з користю і там.

DUM/RAP там були? Хвостова рекурсія вимагалась?
root

SECDScheme news, #2

Вчора знову дорвався до свого коду і написав на Схемі аналізатор SECD-коду на стекову коректність. Штука невелика, але корисна, та і перша ластівка винесення статичного аналізу із сішного коду у схемівський (а то я намагався зробити аналіз на вільні змінні в сішному коді, вийшло не дуже гарно).

Ганяв «компілятор» на коректність всяких крайових випадків синтаксису типу (cond), (cond (#t)), (let () ), (let ()), (begin) і т.д. — видно, краще буде написати невеликий language test suite, який буде вивіряти синтаксис і семантику операцій (хоч хотілось би готовий фреймворк на Схемі, який би перевіряв r7rs compliance). Виправив let, cond, define-форми на підтримку багатьох форм всередині (насправді, тіло загортається в begin, а begin із однією формою переписується в цю ж форму, так що скомпільований код аналогічний).

Досі є одна величезна проблема із машиною — будь-яке виключення фатальне і навіть незнайдена змінна завершує роботу. Але ж хочеться вирішити це «по-правильному», і тому я перечитував на днях про continuations, щоб через них зробити нормальну обробку помилок, вперше їх нормально зрозумів (хоч delimited ones ще потребують осмислення). Поки що в коді це виразилось тим, що з’явився тип CELL_KONT, який інкапсулює s,e,c (хоч у SECD повний стан машини включає і дамп, але з технічних причин він у клітинку не поміщається, тому будуть конси CELL_KONT і наступного фрейма дампа).

Повільно переписую систему вводу-виводу із тієї, що підтримувала тільки file та string порти, на плагінну. Схоже, плагінність це явний overkill, але коли POSIX відсутній (наприклад, всередині мого недоядра), мені зараз доводиться робити всякі неприємні хаки, щоб завести інтерпретатор, а в ідеалі хотілось би просто збирати його в вигляді максимально абстрагованої від платформи бібліотеки і лінкувати з чим завгодно, а POSIX-залежні частини чітко винести. Ех, модульність, FFI, все це треба.

Ще хочеться нарешті зробити аналіз на вільні змінні, але тут мені потрібні нормальні множини (хоч я міг би все емулювати і через асоціативні списки до пори до часу), а тут я передчуваю написання на Схемі якогось самозбалансованого дерева, чим я поки що не займався.

Ще не терпиться дістатись до по-серйозному брудного байтолюбства і почати писати JIT хоча б із асемблерних виразів прямо в Схемі. Правда, писати асемблер на Хаскелі це одне, а на Схемі уже страшнувато. І спочатку це буде тільки 32-бітний x86, який я знаю найкраще. Але байтвектори, макроси, можливість легко додати вбудовану процедуру для mmap — це все є, хіба що сішного ffi досі немає.

Інтерпретатор тим часом потихеньку розпухає, і відразу після завантаження займає більше 6000 клітинок, що на 64 бітах є 32 * 6000 = 190 Кб. Тепер не дивуюсь, що колись Ліспи вважали непрактичними (до того ж швидкістю моя машина також похвалитись особливо не може, я думаю).
shadow

(no subject)

«Хто кров’ю й волею зціпить в цемент
Безвладний пісок міліонів...» (Ольжич)


Непогана, обґрунтована стаття із несподіваної (і для багатьох дратівливої позиції) на Хвилі (вона в своєму репертуарі, кажу це як комплімент):

http://hvylya.org/analytics/society/chem-donbass-otlichaetsya-ot-ukrainyi-reaktsionnyiy-vzglyad-na-problemu.html

Насамперед, аналіз українського «шовінізму» досить гарний. Це дійсно культурна ідентичність, яка ставиться до країни, культури, національних міфів і історії як до цінності-в-собі, а чинний державний апарат розглядає приблизно по-американськи: ми якось тут громадою самоорганізуємось, а держава хай не пхає носа не в свої справи. І справедливо, що для сильно урбанізованого Донбасу пріоритети перевернуті: спочатку іде сильна і дієва держава-як-інститут, а вже потім ідентичність і так далі.

Сложилось так, что либо ты принимаешь и соглашаешься, что Украина понад усе, либо Украина делает тебе смерть ворогам (тоже условно, естественно). Это украинский национализм образца 2014 года. Я не говорю, хорошо это или плохо, я просто называю вещи своими именами: сейчас Украина пытается оформиться в мононациональное государство, в котором Крым оказался бы совершенно инородным телом, а Донбасс сродни опухоли, пока не ясно злокачественной ли.

Collapse )