Category: it

Category was added automatically. Read all entries about "it".

vadim kataev logo compuvisor vm agent ai

Назад в будущее?

А вы заметили как изменили направление технологические тренды в программировании в связи с взрывным ростом мобильного компьютинга? Бывшие С++ проекты срочно переписывают на С. Вместо glibc проекты переходят на подмножество libc, такие как eglibc, uclibc, bionic. При программировании компьютерной графики OpenGL проекты переводят на его подмножество OpenGL ES. Сейчас главными требованиями стали мультиплатформенность программ, стабильность и компактность процессов, а так же минимальное кол-во зависимостей.
vadim kataev logo compuvisor vm agent ai

Synology NAS

Поставил дома Synology NAS. Штучка довольно полезная, если учесть что ето полноценный бизибокс линукс и он имеет майл-сервер, NFS/Photo/Blog/Web/iTunes/SSH/DynDNS/rsync демоны. Машинка имеет слабенький ARM процессор, потребляет 9-18 ватт и умеет вводить SATA диски в спящий режим.

Есть функция копирования одной кнопкой - подключаешь камеру и фото-видео копируется в заданную ранее папку, индексируется, конвертируется, создаются превьюшки, и обновляется веб страница альбома. Бакапить удобно с помошью rsync. Есть аппсы для дроидов и яблофонов.

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

vadim kataev logo compuvisor vm agent ai

Бесполезные закладки и закат эпохи доменных имён

Замечаю, что когда я нахожу полезные сервисы и создаю на них закладки, этими закладками я всё-равно никогда не пользуюсь. Практически всегда я всё-равно пользуюсь поиском в сочетании с википедией. Отчасти это оправдано ещё и тем, что в интернете изменения сейчас происходят быстро и, например, разные сервисы быстро сменяют друг друга на вершинах виртуального списка "цена-качество", и списка "полезность". Кроме того, поиск и вика работают быстрее любых онлайн-букмарк сервисов. Есть конечно несколько страниц, адреса которых необходимо реально запомнить, но их количество в районе пары десятков и стабильно держится многие годы - это разные банки, почта, билеты и разные полезные географически близкие к месту проживания сервисы.

У меня вообще есть подозрение, что доменные имена в течении следующих 5-10 лет перестанут быть необходимы и запоминать адреса страниц станет занятием бесполезным, равно как и покупать-продавать доменные имена.
vadim kataev logo compuvisor vm agent ai

Процедурная генерация планет

Заинтересовали меня методы процедурной генерации планет. Цель - получить максимально реалистичный 3D меш.

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

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

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

Потратил вечер, но сделал :) Простой Ansi C + OpenGL и немножко линейной алгебры. 80fps на Dual Core. В общем, если немного доработать, можно вполне себе красивые планеты генерировать.

vadim kataev logo compuvisor vm agent ai

И снова про Linux

Я таки обновил Gentoo и не стал перелазить на другой дистрибутив. Спасибо всем за предложения, но Debian всё таки система более отсталая и устаревшая по сравнению с Gentoo. Попробуем резюмировать листом за и против, итак:

Linux Gentoo:

[PROS]
Fresh
Fast
Flexible

[CONS]
Requires a good internet connection
Long initial installation
Slow package installation and configuring
vadim kataev logo compuvisor vm agent ai

C/C++, PythonHDL

Иногда я программирую на C/C++. Вынужденно. Но получаю при этом какой-то кайф, вызванный то ли ностальнгией то ли простотой языка. Совершенная прозрачность и контроль на всех масштабах до уровня библиотек операционной системы. Это правда и слабость языка, вернее предрасположенность к ошибкам. Контроль и гибкость в обмен на устойчивость от ошибок. Там где возможно, следует всегда избегать использования C/C++. Правильно написанный код на питоне получается не сильно хуже в плане производительности, зато complexity кода на порядки выше и софт получается более intelligent.

Мне (и не только мне) очень не хватает open source софта для работы с программной логикой. VHDL я считаю языком вполне пристойным, красивым, но увы, не самым продуктивным. Verilog - язык для разработчика "быстрый", но в то же время годный/читаемый лишь для самых простых решений (уж лучше сразу на spice :)). Убогие Xilinx/Altera tools настолько убоги, что работать с ними противно, напоминает мне работу с Java.

В общем, не хватает HDL типа питона или хотя бы перла. Может показаться абсурдом использование dynamic type для описания железа, но сложность и capacity растут на этом поле в последнее время очень быстро (равно как и популярность), так что высокоуровневое описание, средства абстракции встроенные в язык, уже достаточно востребованны.
vadim kataev logo compuvisor vm agent ai

Саморепликация программ




Саморепликация есть такой процесс, когда система создаёт свою копию. Самые популярные самореплицирующиеся программы мы видим на примере компьютерных вирусов. Существует интересная головоломка под названием "Придумывание куинов". Quine есть особый род программ, которые выводят своё содержимое при полном отсутствии ввода. То есть куину запрещается использовать чтение своего кода из файла, получение информации от другого процесса и т.д. Таким образом, в теле куина должна присутсвовать и быть организована текстовая информация таким образом, что бы output полностью точно повторял тело куина.

Например, на языке программирования BASIC куин выглядит так:
10 LIST

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

Вот например куин на языке программирования Ruby:
puts <<2*2,2
puts <<2*2,2
2

Вот пример куина на языке Python:
a='a=%s;print a%%`a`';print a%`a`

А вот на мой взгляд изящный пример на языке C:
#define T(a) main(){printf(a,#a);}
T("#define T(a) main(){printf(a,#a);}\nT(%s)\n")

Попробуйте придумать и вы куин на каком нибудь языке.

vadim kataev logo compuvisor vm agent ai

Игра Python на языке Python

Итак, из "самой маленькой в мире игры Питон на языке Питон" получилась игра немного большего размера, точнее 273 строки. Добавил музыку, звуковые и визуальные эффекты, не изменив в логике ничего принципиально. Таким образом игра достаточно простая.

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

В паузе между партиями на экран выводится код программы, так что если интересно как всё работает, из игры выходить не обязательно :)

Игра сделана в целях популяризации языка Питон, так что к качеству плиз не придирайтесь. На всю разработку игры я потратил суммарно не более 5 часов. Большая часть времени ушла на саму игру. Должен же автор сам её суметь пройти? :)

На сайте проекта имеется версия для Windows(самораспаковывающийся архив) и для Linux.

Сайт проекта
Версия для Windows
Версия для Linux

Поделитесь пожалуйста результатами и впечатлениями.
vadim kataev logo compuvisor vm agent ai

Интеллектуальные агенты. Часть 1


Найти и распарсить


Некоторые соглашения:

Агент
Сущность, взаимодействующая со своей окружающей средой. Это не просто пассивный наблюдатель, но инициатор действия. Если рассматривать агента как объект наблюдения Y в момент времени t, то можно сказать, что будущее поведение объекта Y хотя и продиктовано прошлым (t-dt) , без знания конкретной структуры конкретного объекта Y мы не сможем сделать достаточно точный прогноз о поведении объекта Y в будущем. Даже полное знание описания класса к которому принадлежит объект Y не позволит нам иметь гарантию точного предсказания поведения объекта в момент времени (t+dt) без возможности наблюдателя иметь информацию о внутреннем состоянии системы "объект Y" в момент t.

Отличия агентов от объектов
Выделим среди класса "объекты" некотрой системы все объекты, к которым не принадлежат агенты. Назовём их пассивными объектами и посмотрим на их отличия от агентов. Главное отличие состоит в том, что пассивные объекты в системе не являются сами инициаторами действий по изменению своего поведения в окружающей среде*. Так же у пассивных объектов отсутствуют механизмы защиты внутреннего состояния.

Впрочем, всё это звучит абстрактно и давайте посмотрим на примеры.
Пусть у нас есть два объекта, Камень и Жук.
Class Stone:
    states
    percept

Class Beatle:
    states
    percept


В states хранятся физические состояния объекта и на них может повлиять либо percept либо ограниченный класс законов (в случае для всех объектов это гравитация, для камня это ещё и например внутренняя радиоактивность)

percept является внешней поверхностью объекта, реагирующей на определённый класс законов (например, на свет, температуру, влажность). Таким образом, percept есть просто первый взаимодействующий слой объекта с окружающим миром.

Теперь конкретно про отличия. Скажем, мы пронаблюдали за объектами-представителями обоих этих классов и приходим к следующим выводам:

1) объект класса Beatle не поддаётся изменению своей внутренней структуры под действием некоторых воздействий на его percept. Исследуя класс Beatle, мы замечаем интересную особенность его структуры - она построена таким образом, что в state сохраняется информация о percept в моменты времени (t¹-dt¹, t¹) и имеется механизм позволяющий в момент времени t²-dt² при "похожем" состоянии percept "знать" состояние state в ещё не состоявшемся времени t², то есть образно говоря:
    if  percept[t¹-dt¹] == shadow   and  state[t¹] == low_energy:
        if percept[t²] == shadow:
            state[future(t² + dt²)] = low_energy

    if state[future(t² + dt²)] == low_energy:
        go()
    if state[future(t² + dt²)] == comfortable:
        stay()

такой объект всегда инициирует действие - избегать тени. Реализация механизма в структуре тела объекта.
Пусть вас не вводят в заблуждения обозначения low_energy и comfortable - это сделано для наглядности.
Пассивные объекты могут имеють такое поведение, но система Beatle сочетает в себе множество реакций и не только на освещённость.

2)а как выглядит поведение объекта Stone ?
    if  percept[t¹-dt¹] == temperature_up 
        state[t¹] = temperature_up
    ...
    if  percept[t¹-dt¹] == shadow
        state[t¹] = temperature_down

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

Рациональный агент
Агент, выбирающий наилучший вариант поведения среди множества альтернатив для удовлетворения определённой цели. Уровень рациональности поведения тем выше, чем лучше удовлетворяется цель.
Например, поисковый агент, который может находить более нужную информацию для пользователя за более короткое время чем другие агенты при одинаковой формулировке условий поиска для множества агентов, является более рациональным среди других агентов применительно к цели - поиску определённой информации.

Интеллектуальный программный агент
Программа, имеющая свойства рационального агента, запоминающая состояния окружающей среды, умеющая распозновать состояния окружающей среды на основе накопленной информации, делать прогнозы развития окружающей среды. Как правило, для окружающей среды используется информационное пространство Internet, а программа состоит из потока исполнения.

Посмотрим на типичную реализацию интеллектуального программного агента.
Работа агента представлена на рисунке жёлтыми прямоугольниками:



Как видим, искусственный интеллект агента базируется на обработке информационных потоков, изначально инициатором которых является человек. Данная схема так же может быть соотнесена со схемой работы службы google answers, где множество агентов-людей работая по этой схеме получают деньги от человека, задавающего вопросы.
Давайте подробно рассмотрим первую часть работы агента:

Понять и найти
Сначала человек инициирует запрос, скажем на обычном натуральном языке.
Лингвистическая конструкция сначала приводится к нормальному виду, где объекты запроса (слова), выстраивают дерево взаимосвязей have, is_a, part_of etc. Таким образом, переделанный запрос агент передаёт поисковым машинам и получает ответ либо в форме веб-страницы, либо в форме программных объектов. Например google позволяет вам бесплатно делать до 1000 запросов в сутки при подключении вашего агента через SOAP интерфейс:
import google
data = google.doGoogleSearch(search_terms)
total_results = len(data.results)
for d in data:
    print d

но я предпочитаю другую схему - самую надёжную, т.к. она не имеет ограничений на количество запросов и обрабатывает результаты которые расчитанны на клиента-человека а не на агента. Самым простым решением в таком случае становится парсинг страницы уже готовыми инструментами, например следующая комманда возвращает нам список URL на наш запрос:
lynx -dump "http://www.google.com/search?
num=10&hl=en&lr=&q=$1&btnG=Search" | 
grep '. http' | grep -v 'google'  | awk -F '. ' '{print $3}'


Не поленитесь и создайте скрипт search.sh состоящий всего из одной вышеприведённой комманды - она нам очень пригодится позднее при создании "умного" агента.

Есть ещё лучший способ:
    [...]
    req = urllib2.Request('http://www.google.com/search?lr=&ie=UTF-8&oe=UTF-8&q=' + Req)
    req.add_header('User-Agent', 'Mozilla/5.0 (X11; compatible; MSIE 5.5; Linux i666)')
    try:
        f = urllib2.urlopen(req)
    except IOError, e:
        if hasattr(e, 'reason'):
        print 'Error with reason : ';  print e.reason
    BUFSIZE = 8192 * 2
    while True:
        data = f.read(BUFSIZE)
        if not data: break
    [...]

в такой программе легко собрать необходимый парсер например с помощью наследования от класса sgmllib.SGMLParser (вспомните как работает LinuxOrgRu агент о котором я писал здесь)

Следующим шагом является просмотр страниц, к которым ведут ссылки со страницы результата поиска:
    a=open('from_google').readlines()
    a = [x[:-1] for x in a]
    x=0
    for URL in a:
        links -source ${URL} > result${x}
        x+=1


теперь посмотрим в наш директорий:
globalsearch: ls
google-search.py   result0    result12  result15  result18  result3  result6  result9
gsearch.py             result1    result13  result16  result19  result4  result7
numbers                result11   result14  result17  result2   result5  result8

у нас есть непропарсенных 20 результатов в виде html страниц. Следите за рисунком - сейчас мы в точке, где начинается кластеризация информации на relevant/irrelevant блоки.

Если вы внимательно следите за повествованием, то заметите, что всё что мы делаем поддаётся автоматизации и от человека зависят только условия запроса, поэтому мы смело можем делать все наши операции в форме скрипта.

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

Рекомендуемое чтение для этой части:
M.E. Bratman
Intention, Plans and Practical Reason Harvard University Press: Cambridge, MA, 1987

S.Brin, L.Page
The Anatomy of a Large-Scale Hypertextual Web Search Engine Computer Science Department, Stanford, 2000

G.Wooldridge
Reasoning about rational agents Massachusets Institute of Technology, 2000

Продолжение следует.
vadim kataev logo compuvisor vm agent ai

Жизнь в Linux. От скрипта до агента.

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


SCRIPTS
Первое правило автоматизации - все программы уже есть в системе и что бы заставить программы сами работать при минимальном участии человека, нужно написать скрипты.
Скрипты - это маленькие программы, оперирующие вместо функций другими программами системы.
Обычно простые скрипты пишутся без помощи текстовых редакторов. Напишем скрипт, который будет искать для нас файлы определённого типа и составлять их список в текстовый файл:

cd ~; mkdir scripts; cd scripts
echo "find / -name \"*.\$1\" > \$1" > find_types.sh
chmod u+x find_types.sh


Теперь если мы будем вызывать наш скрипт с параметром, показывающим определённое расширение, он будет находить и составлять список всех файлов такого типа, например, составим списки всех mp3 и avi файлов системы:

./find_types mp3
./find_types avi


После этого мы имеем два списка файлов, один для mp3, другой для avi. Теперь посмотрим, что полезного могут дать нам списки файлов.


MUSIC
А, например, как мы слушаем музыку ?
Используя наш список mp3 мы можем легко организовать плейлист. Что нам надо? Правильно, ещё один скрипт, назовём его play-mp3:

echo "cat mp3 | grep -i \"\$1\" | mpg123 --shuffle -@ -" > play_mp3.sh
chmod u+x play_mp3.sh


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

./play_mp3.sh enja

будет проигрывать все файлы в пути или имени которых есть слово enja или похожее на него:
/mnt/pub/jet/old_disk_D_copy/musik/4soul/enya - May it be.mp3
/mnt/pub/jet/old_disk_D_copy/musik/4soul/Enya - Now We Are Free (Gladiator Theme).mp

Если хотите, что бы скрипт играл всё, то укажите *, если у вас mp3 файлы отсортированы по стилям то укажите название стиля и т.д. и т.п. Выбор может ограничиться только вашей фантазией.
Такой скрипт удобен ещё и потому, что легко подключается к программе распознования голоса или к демону пульта дистанционного управления или ещё к чему нить. Для проигрывания следующего файла используется сигнал Ctrl+C, для выхода быстро два раза Ctr+C.


VIDEO
Напишем по аналогии с mp3 следующий скрипт:

echo "cat avi | grep -i \"\$1\" | mplayer -fs -playlist -" > play_avi.sh
chmod u+x play_avi.sh


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

./play_avi ai_lecture

Точно так же, такой скрипт легко подключить к системе распознавания голоса или к интеллектуальному агенту, которому вы можете просто сказать какое у вас настроение и агент поставит вам например хард-рок видеоклипы :)


INTERNET
По этой части отдыхают все, кроме нас с вами, линуксоидов:)
Типичная ситуация, когда на сайте множество ссылок и хочется скачать всё, но в долго тыкать по каждой ссылке. Кто то использует FlashGet и ему подобные менеджеры в винде, ну а мы используем для этого нашу скриптовую силу:

cat > down.sh
i=2
iend=100
while [ "$i" -lt "$iend" ]
do
wget -c "http://www.gorodok.ru/video/small/$i.mpg"
i=$(expr $i + 1 )
echo $i
done

Ctrl+C

Данный скрипт может качать не только файлы-видео программы Городок. Если вы присмотритесь внимательно, то на типичной веб-странице если есть много линков, то части их имён обычно отличаются упорядоченными номерами - просто меняйте в скрипте адрес и номера начала и конца.
Например, если вы любите новости недели, то можете поставить такие параметры:

i=3539
iend=3559
wget "http://video1.rfn.ru/vesti7/$i.asf"

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

Советую вместо wget использовать wpro - он умеет качать стрим-видео.
Кроме того, вы можете делать вложенные циклы и использовать механизмы простейшего анализа текста сайта с которого качаете, для этого используйте языковой словарь и HTML парсер.


AGENT
Ну куда же настоящему линуксоиду без искусственных агентов :)
Для того, что бы воплотить эту идею в жизнь на практике, я делаю следующее:

В системе крутятся несколько демонов:
1.Демон- Распознователь голоса генерирует список распознанных фраз
2.Демон- Управление реакциями на определённые фразы из списка
3.Множество скриптов - реакций агента
4.Генератор голоса агента

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

"покажи что ты видишь")
if [ "$state" = "ready" ]; then
say "Пожалуйста {Pause:300}"
cd $SPEECHSCRIPTS/vision
./detector /dev/video1 &
cd -
fi
state="void"
;;

"сколько времени?")
if [ "$state" = "ready" ]; then
$SPEECHSCRIPTS/say-time.sh
fi
state="void"
;;


Вот примерная схема работы всей системы в целом:
вот тут
и вот тут

Агент получает внимание следующим образом:

"Джек")
state="atention"
;;

"ты тут?")# |"слушай"|"мне нужна твоя помощь")
if [ "$state" = "atention" ]; then
[...]
state="ready"
fi
;;


т.е. сначала я произношу имя агента, а потом просьбу помочь и только потом я прошу его конкретно о том что мне нужно. Такая система привлечения внимания позволяет добиться того, что я могу с кем нибудь разговаривать и быть уверенным что агент не среагирует неправильно. Он реагирует только на обращение к себе и процент правильного узнавания фразы колеблется между 70-80%. С помощью хитрых средств (например, переспрашивание вопросами на которые я могу только ответить да/нет) удаётся добиться весьма высокого качества общения.

Что может такой агент ?
Конечно же, он может не только показывать картинку с вебкамеры (впрочем ещё и с детектором движения - и надеюсь скоро агент сможет распозновать хозяина по-лицу) или время или прогноз погоды или актуальные новости или цены на интересующие хозяина товары. Агент может ооооочень многое - по сути, потенциально, агент может всё, что есть в интернет либо на локальном носителе. Агент очень простой, это скорее простой рефлекторный агент, но он потенциально может перерабатывать всё что есть в интернете а это значит, что ему не обязательно уметь например видеть, что бы писать на форумах или торговать на eBay.

Всё что могут скрипты, может и агент. Кстати, характер агента вы можете так же сформировать по желанию или в зависимости например от актуальной погоды, получаемой с каких нибудь веб-сервисов. Например, агент может прочитать анекдот, полученный с os3e или включить грустную музыку если новости грустные на cnn или стереть самого себя :)

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

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

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


http://www.compuvisor.net