All streams
Search
Write a publication
Pull to refresh
83
0
Алексей Мандрыкин @alman

Пользователь

Send message
Простите, ошибся блогом. Перенёс в правильное место.
Честно скажу — не знаю. Я долго думал где её разместить и мой выбор пал на блоге «Я пиарюсь», где я её и опубликовал. Но через несколько минут статья чудесным образом оказалась в блоге «Системное программирование», что меня сильно удивило. Впрочем, раз уж так получилось, пусть будет здесь. Вероятно, способы описания низкоуровневых протоколов больше всего интересно именно системным программистам.
В общем ваши пожелания и предложения принимаются в комментариях.

Возможность запустить микроядро L4 Pistachio и несколько модулей к нему. GNU grub умеет и с флешки, но Ваше решение интересней. Т.е. хотелось бы поддержку Multiboot Specification в объёме, достаточном для загрузки Pistachio.

Наверное это уже наглость с моей стороны, но хочется также версию загрузчика для архитектуры ARM.

Кстати, первый раз вижу человека, который написал загрузчик для «чужих» операционных систем. Моё почтение.

Так что лично я выступаю за конституционную монархию с умеренной цензурой.


Хотелось бы уточнить, какое место в конституционной монархии Вы отводите парламенту?
Второй спорный момент — передача власти по наследству.
Третий спорный момент — аристократия.
Также немного непонятно о какой стране идёт речь, когда Вы выступаете за конституционную монархию.

Рональд Рейган тоже был актёром. Но не был священником. Если учесть, что по первому образованию Охлобыстин программист, то вообще крыша съезжает — какая-то «гремучая смесь».

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

Кстати, в «интернетах» Охлобыстин тоже зажигает, причём, в 1999 году он уже активно проповедовал в Сети. Ну и как быть? Мне Охлобыстин очень симпатичен как актёр, но его мировоззрение противоречит моему. Монархиста в президенты? Я бы поостерёгся.

Кстати, может быть кто-нибудь выложит ролик в каким либо видеоформате доступном для скачивания? Очень хочется посмотреть, а после прочтения обсуждения хочется ещё больше. Смотреть в онлайне по GPRS каналу не представляется возможным, а вот скачал бы с удовольствием.

А, это все было реализовано в предыдущих версиях для литовского языка. Только там без суффикса было: окончание (из шаблона склонения), приставки («не» для прилагательных и куча для глаголов) и основная часть (корень + возможные суффиксы).


Продолжаете ли развивать литовскую версию и почему в русской версии отказались от разбиения?

{ TranslateMessage(&msg); DispatchMessage(&msg); } я вроде «был отключивши», ибо такой код делал возможным закрыть программу во время распознания, и она ломалась, потому что при закрытии clean-up запускался неуведомив ядро.


Такая проблема решается довольно просто. Анализируете сообщение и в случае WM_CLOSE корректно завершаете программу. Как вариант, если это сообщение придёт где-то в глубине рекурсивного обхода дерева, можно бросить исключение и перехватить его в удобном месте.

— Просто где-то в 2005 я нашел свободный словарь для проекта iSpell, предназначенный для спеллинга литовского языка; я им воспользовался ибо там можно было выудить не только форму слова, но и ее атрибуты (род, число, падеж, лицо) — а именно это необходимо для проверки согласования.

А в не думали пойти немного дальше? Не просто хранить атрибуты, но и разбивать слова на составные части — корень, суффикс, окончание? Вероятно, при некотором везении, можно существенно сжать словарь.

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


Не пробовали использовать эту тему в качестве базы предложений?
Скормить всю статью своей программе. Как только встретилось новое слово — тут же предложить пользователю анализ этого слова и ввод атрибутов. Неизвестная словоформа — предложить пользователю ввести/отредактировать шаблон словоформы.

Защищая порядочность программы, могу предположить, что она просто подобрала ближайшие слова из словаря; безо всякого злого умыслу.
… И опять-таки, такой фразы я просто не тестировал…

А если бы тестировали, то не поленились бы добавить эту фразу в базу знаний экспертной машины? А вот если бы дали такую возможность пользователям — непосредственно из программы, не изучая формат файлов dic.txt и rules.txt, то люди бы повнимательнее посмотрели на Ваш продукт.

На мой взгляд в той ситуации было бы правильнее вручную добавить недостающие слова в словарь (по 12-48 форм для каждого слова) и усовершенствовать шаблон (хотя я бы не рискнул улучшать шаблон, тем более для Маяковского; учитывая мои потуги последних месяцев — дай бог простое английское предложение осилить).


Думаете, с Пушкиным было бы проще? ;)

А если серьёзно, то во время распознавания хотя бы изредка проверяйте сообщения Windows:

if( GetMessage(&msg,NULL,0,0) != -1 ) { TranslateMessage(&msg); DispatchMessage(&msg); }

Тогда Windows не будет считать, что программа зависла.

Кстати, спеллчекер из Microsoft Word какой-то там версии как-то справлялся с согласованием слов. Так что конкуренты у Вашего продукта есть. Ваша программа интересна тем, что с её разработчиком можно пообщаться, задать вопросы и внести предложения.

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

Еще раз повторяю, что программа предназначена для демонстрации работы ее ядра; ибо 4 года разработки были потрачены именно на ядро, а не на наполнение БД слов и БД шаблона предложения.


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

Моя программа должна писать туда откуда ее запустили (и куда ее перед этим записал пользователь, соответственно). Если она пишет свои три текстовых файла в системный каталог — это серьезная проблема.




Разумеется, я не переписывал программу в system32. Судя по всему, это проблема Firefox, если программа запускается из «Списка загрузки».

У меня была идея, чтобы это все еще происходило он-лайн; и не только со словарем (они есть в интернете в свободном доступе, но я не нашел быстро такого (кроме литовского), чтоб в нем указывались атрибуты формы слова),


А что с литовским языком? Распознавание 5% процентов — это уже интересно.
Кстати, а в эстонском и латвийском языках шаблоны идентичны литовским?

но и самое главное — с шаблонами: возможность объединять шаблоны, созданные разными пользователями, или вообще сделать создание шаблонов полуавтоматическим — по принципу обучения экспертной системы — когда ей объясняешь новое правило, а она прогоняет его по всем подходящим фразам, чтобы уточнить для каких фраз правило не действует — обычно человек этого не учитывает, когда вписывает в шаблон новое правило.


Хочу такую версию. Интересно поиграться и, возможно, пополнить (её) лексикон. Если бы Ваша программа позволяла простым способом её обучать и хранить полученную информацию в какой либо базе данных — то это стало бы интересным. Кроме того — различным словам можно было бы в отдельных полях назначить контекст, предметную область, частоту употребляемости, этимологию и прочие атрибуты, которые, впоследствии могут пригодиться для более глубокого анализа текста. А ещё атрибуты жаргона и ненормативной лексики не помешали бы.

Фраза из Маяковского:

Я русский бы выучил только за то, что им разговаривал Ленин!


Дала восхитительные результаты:

ты вводил большой ( неполнота 10, плохость стиля 1, исправлений 7 )
ты вводил большое ( неполнота 10, плохость стиля 1, исправлений 7 )


А вот на таком предложении программа уходит в бесконечный цикл:


В принципе, я верю в Ваш движок, но без словарей (базы знаний экспертной системы) он не сможет заблистать в полную мощь. Вот если бы как-то централизованно собирать экспертные данные от различных пользователей в единую базу данных, то могло бы получиться весьма интересно.
Скачал. Посмотрел. Впечатление двоякое. С одной стороны — почтение разработчику за то, что взялся за интересную задачу, с другой стороны — интерфейс перегружен и, что хуже, результаты на моих тестах были неудовлетворительны. Вероятно, словарь слишком мал?

Ещё замечание: не стоит прикладной программе писать в \Windows\System32 — для этого есть более подходящие места.

Если качество работы действительно зависит от словаря, то было бы логично предоставить пользователю возможность непосредственно из программы расширять словарь. А в идеале — возможность объединять словари, созданные разными пользователями. Я не знаю, может быть такая возможность имеется, но я не могу разрешить писать «неизвестной» программе в \Windows\System32.

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

попытками написать свой фронт-энд компилер.
Вот с этого момент можно подробнее? Ну очень интересно.
Тим Паттерсон написал 4000 строк ассемблера, которые, как потом выяснилось, были копипастами.

С этого места, пожалуйста, подробнее. Что и у кого он «закопипастил»? Файловую систему (структуру, ибо сырцов FAT, насколько я понимаю, у него не было) он взял из Microsoft Basic. Некоторые идеи подсмотрел в CP/M. Но где там копипаста? Кстати, вот интересная статья: The Roots of DOS. А чем Вы подтвердите свой наезд на Патерсона?

Современные системы хорошо умеют «прятать» железо от пользователя и это правильно. Но что делать, если хочется ручками «попереставлять битики» в IDE контроллере, сетевой карте или видеокарте? Тут и приходит на помощь старая и «добрая» MS-DOS. Я не знаю более простого способа, чем связка MS-DOS + Borland C для начального знакомства с железом. А если добавить к этому виртуальную машину, то вообще удобно и просто.

Но в этой бочке мёда есть и большая такая ложка дёгтя. Почему-то в режим ожидания ввода, MS-DOS (например, версия 6.22) так и не научилась делать команду HLT. Соответственно, виртуальная машина под MS-DOS «кушает»всё отведённое ей процессорное время, физический процессор греется, кулер шумит и бешено вращается, в комнате становится ещё теплее, а электросчётчик спешит догнать кулер. Спрашивается — в каком таком цикле крутится DOS, если при любом раскладе можно выполнить HLT (останов процессора и переход в режим низкого энергопотребления) и просто ждать прерывания?
Спасибо! Как говорится: век живи — век учись. Благодаря предоставленной Вами формуле, мне удалось немного реабилитироваться. Странно, что хабраобщество обошло вниманием столь полезный комментарий.

Кстати, у Вас небольшая опечатка — лишняя угловая скобка, но это сущие пустяки по сравнению с идеей.
Хмм. Видать, люди не заценили «ассемблерный алгоритм». Что ж, признаю, что игра «pushf; pop ax» — не самый оптимальный вариант. apangin предложил гораздо более красивое решение.

#include "stdio.h"

static char    *  cake_message = "cake";
const char    *  match_message = "Yummy!!!";
const char    *  error_message = "The cake is a lie :(";

int test( char * str )
{
  int          result;
  unsigned long  *  cake_ptr32, * arg_ptr32;
  unsigned long    diff;
  char        ch = str[4];
  const char    *  result_message = match_message;

  // Длина входящей строки не более 4-байт
  result = (int) ((unsigned char) (str[4] | -str[4]) >> 7);

  // Сравниваем слова как 32-х битные значения
  cake_ptr32 = (unsigned long *) cake_message;
  arg_ptr32 = (unsigned long *) str;
  diff = *cake_ptr32 - *arg_ptr32;
  result |= (int) (( diff | -diff ) >> 31);
  
  result_message += result * (error_message - match_message);

  puts(result_message);

  return result;
}

int main(int argc, char * argv[])
{
  test("on");
  test("cake");
  test("cakecake");

  return 0;
}


* This source code was highlighted with Source Code Highlighter.


Проверил этот пример в MSVC 2005 и gcc 4.1.2 — результат правильный.

Но что вы будете делать, если по условию надо ветвить код, а не подбирать строку?
Хотя… старые и добрые setjmp/longjmp никто не отменял. :)

упс. Простите, в пункте 11 копипаста с шага 3.

И ещё не помешает инкремент регистров esi и edi. Хотя, если склероз мне не изменяет, то можно писать и так:
mov al, [esi+1];
sub al, [edi+1]
и на каждой итерации ручками прописывать смещение относительно esi и edi. Ну это уже кто как привык.

Один знакомый заявил мне, что любая программа может быть написана без использования if/else.


Условие задачи не запрещает использовать операторы while и for. Поэтому извращаемся:

int res;

for( res = strcmp(input, "cake"); res == 0; )
{
puts("Yummy!!!");
// Здесь бы не помешал goto для избежания избыточной проверки,
// но раз уж объявили goto вредным - кушаем так.
break;
}

while( res != 0 )
{
puts("The cake is a lie :(");
break;
}


За такой код надо наказывать, но он без if/else.

На x86 ассемблере точно так же можно заменить cmp и jz/jnz на инструкцию loop. Пожалуй, это ещё больший изврат, чем вышеприведённый пример.

Более того:

System.out.println((char)(x*'s'));


^^ В библиотечных функциях никто так извращаться не будет. Посему без if/else программе не обойтись. Тут лишь можно поспорить на тему, является ли System.out частью программы или нет.

И наконец, даже на x86 ассемблере можно обойтись без cmp, jz/jnz. Я основательно забыл ассемблер, поэтому вместо кода предлагаю алгоритм.

0. Обнуляем регистр ebx
1. Устанавливаем esi на введённую строку
2. Устанавливаем edi на сравниваемый шаблон.
3. Загоняем в al код символа (для эстетов и любителей юникода ax или eax)
4. Вычитаем из al значение по адресу edi — соответственно изменяется флаг равенства и другие флаги.
5. Заносим регистр флагов в стек командой pushf
6. Берём значение из стека в регистр eax
7. Сдвигаем eax вправо, чтобы бит z попал в младший бит (я не помню, может быть он уже младший?)
8. Делаем «логическое И» регистра ax c единицей, чтобы сбросить все биты кроме младшего (после сдвига в него попал флаг z).
9. Инвертируем младший бит (нам нужно знать о несовпадении символов)
10. Делаем «логическое ИЛИ» с регистром ebx — в случае несовпадения в нём будет 1, иначе ноль.
11. Повторяем с шага 1 для каждого сравниваемого символа, но без цикла, чтобы не нарушить условие задачи. Иными словами — копипаста с шага 1.
12. В результате получаем в регистре ebx значение 0 при совпадении, или значение 1 при несовпадении.
13. Считаем разницу между переходом при совпадении строки и переходом при несовпадении.
14. Умножаем регистр ebx на разницу переходов, рассчитанную на предыдущем шаге.
15. Прибавляем к регистру ebx адрес перехода на ближайшую метку — в результате имеем адрес, соответствующий выполнению условия или адрес перехода при нарушении условия.
16. Я не помню, есть ли команда jmp [ebx], поэтому воспользуемся следующей последовательностью: push ebx; ret — кладём ebx на стек и «возвращаемся» на рассчитанный адрес.

Брр. ДА ВЕДЬ ЭТО ЖЕ ГНУСНОЕ ИЗВРАЩЕНИЕ! но без cmp и jz/jnz

Очень интересно, где, как и для чего используется QNX в автомобилях. Не могу ничего представить кроме встроенного навигатора. Не поделитесь информацией? Особенно интересен вариант, где несколько систем в одной машине.

Вы даже себе не представляете, насколько MacOS является Unix. Я бы дальше больше сказал — MacOSX это Unix поверх микроядра Mach. Так что два кита :)
Кстати, я фанатично верю, что микроядро L4 круче микроядра Mach.

Каким-то образом Майкрософту удалось сертифицировать Windows NT как POSIX совместимую, ну мы же знаем, что это не так — хотя бы потому, что Windows не поддерживает нативного вызова fork().

Альтернативные операционные системы есть, развиваются и на них кое-кто работает, но в целом это капля в море, тем более что большинство из них все равно так или иначе используют уже готовые компоненты других ОС

Очень хороший момент. Разумеется, место Linux занято самим Linux. Но всё, что нужно альтернативной операционной системе — как можно лучше поддерживать POSIX стандарт. Ну или Win32, но тут могут возникнуть лицензионные проблемы с Microsoft, в то время как POSIX — открытый стандарт. Именно по этой причине, я считаю, ReactOS — темная лошадка. С одной стороны совместимость с программным обеспечением Windows, с другой стороны — никаких гарантий от исков со стороны Майкрософт.

И что самое интересное, если «альтернативная» система станет POSIX совместимой, тогда можно ломать стандарты и писать свои. Но не ранее.

А какая ОС хороша на ваш опытный взгляд (кроме вашей, конечно :) ) — исходя из требований, что она должна быть либо свободной, либо отечественной?


Вот Вы правильно поставили вопрос. Я серьёзно. Фишка как раз в том, что не существует коммерческой операционной системы, принадлежащей российской компании. Во всяком случае я о такой не слышал. Но принимать свободную международную систему как фундамент для национальной программной платформы — неправильно.

Именно по той причине, что не существует российской компании, обладающей исключительными правами на какую либо операционную систему. Для софтверных IT компаний конкуренция в виде СПО выполняет стимулирующую роль. В России как бы конкурентов Linux'у нет, не считая мировых лидеров, но это не российские компании. Соответственно, при таком раскладе в России СПО будет использоваться лишь для давления на зарубежные корпорации для выбивания скидок и условий.

Мне в голову только семейство *BSD приходит, но они, афаик, значительно уступают GNU/Linux по юзабилити на десктопах (ваша тоже, как я понял, сейчас чисто серверный вариант).


Не всё так однозначно. Что касается десктопа, то всё, что не Windows, то является надстройкой над X-сервером. (привет, MacOSX) По большому счёту, с этой стороны разница между FreeBSD и Linux больше в головах маркетологов и дистростроителей. Если мне склероз не изменяет, то некоторые умельцы успешно умудрялись собрать Linux окружение поверх BSD ядра. Или наоборот.

Под ОС я в данном контексте понимаю набор софта от (микро)ядра до DE и далее.

Вы заставили меня почувствовать себя стариком :) Ещё помню времена, когда велись холивары на тему, является ли графическая оболочка составной частью операционной системы.

Кстати, у меня не чисто серверный вариант. Если совсем точно, то у меня даже не операционная система, а набор POSIX совместимых сервисов поверх микроядра L4 Pistachio. Вместе всё выглядит как операционная система. Вполне реально прикрутить GUI к Хамелеону, портировав XFree86 сервер и KDE/Gnome в придачу.

Наконец, вот чего мне так и не удалось найти, так это российский компилятор. Точнее, нашлось несколько, но… автор одного из них потерялся (слышали Pascal/Modula/C компилятор «Странник»?), автор другого — полугосударственная компания с дохлым сайтом и почти мёртвым форумом, которые даже на попробовать не дают свой компилятор.
Выше я уже ответил Алексею — когда речь идёт о вещах, связанных с национальной операционной системой, перестаю адекватно оценивать реальность — неуправляемые эмоции переполняют меня. Сожалею, но ничего не могу с собой поделать. Дело в том, что я потратил более 10 лет на создание операционной системы, достиг результатов, о которых раньше мог только мечтать. Помимо этого есть чёткое представление, куда и как развивать систему и какие баги надо фиксить.

Несмотря на мою любовь к Linux и знание его архитектуры и истории, я расцениваю GNU/Linux как потенциального конкурента. Именно отсюда и происходят эмоции.

Тем не менее, если отложить в сторону эмоции, я не считаю, что Linux хорош в качестве операционной системы для НПП.

Information

Rating
Does not participate
Location
Ростовская обл., Россия
Date of birth
Registered
Activity