-Поиск по дневнику

Поиск сообщений в eugene20237

 -Подписка по e-mail

 




ИИ: анализатор экспериментов

Суббота, 19 Мая 2012 г. 22:00 + в цитатник
В этом посте я приведу очень простой пример предметной области и алгоритм анализатора экспериментов, указанного в схеме к прошлому посту. Вообще, лог экспериментов - это аналог последовательности команд на языке ассемблера. Поэтому в нём могут быть скрыты условные переходы и циклы за логикой примитивных операций. В данном посте я не рассматриваю варианты поиска циклов и условных переходов в логе экспериментов. Для упрощения понимания сути работы анализатора он будет искать одну единственную каноническую конструкцию - простую последовательность операций. Операция в данном случае означает действие ИИ на объект исследования, выполняемое в ходе эксперимента.

Предметная область
Существует единственный объект исследования, состояние которого описывается набором дискретных параметров. Каждый параметр представляет собой флаг, т.е. может принимать только значения 0 и 1. Для этого объекта допустимо несколько примитивных действий, каждое из которых определённым образом меняет состояние объекта. Изменение состояния объекта имеет внутреннюю логику и недоступно извне. Т.е. объект исследования является для нас "чёрным ящиком". Однако, каждое примитивное воздействие всегда оказывает однозначный простой эффект. Кроме того, существует несколько фиксированных последовательностей команд, которые оказывают на объект новые эффекты. Эти эффекты меняют параметры состояния объекта отлично от примитивных действий.

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

Цель и задача
Анализатор просматривает лог экспериментов и пытается обнаружить все последовательности команд и новые эффекты, которые они оказывают на объект. Полученные наборы действий являются новыми стратегиями поведения ИИ, что есть результат его обучения. Требуется определить все эти наборы действий.

Модель данных
A - это множество примитивных действий, допустимых для объекта исследования.
A = { a1, ..., ax }.
C - это эксперименты, т.е. последовательность наших действий, применяемых к объекту.
C = { c1, ..., cn }, где ci принадлежит множеству действий A.
S - состояние системы после каждого эксперимента. Каждое состояние объекта состоит из m флагов.
S = { s1, ..., sm }, где si может быть 0 или 1.

Если проанализировать последовательности C и S, то можно выявить удачные блоки, приводящие к новым эффектам на множестве S. E = { e1, ..., el } - это искомые последовательности действий, где ei принадлежит множеству команд A = { a1, ..., ax }.

Алгоритм анализа экспериментов
Для начала необходимо сопоставить каждому действию ci эффект, который оно оказывает на объект исследования. Эффект воздействия - это изменение переменных состояния из множества S. Для того чтобы собрать эту информацию введём хранилище эффектов воздействий и обозначим его множеством D.
D = { d1, ..., dx }, где di = { ds1, ..., dsn };
Каждый эффект - это изменение параметров состояния объекта, которое хранится во множестве S и меняется после каждого эксперимента. Обозначим изменение каждого параметра из множества S структурой ds:
dsi = { S[i][j-1], S[i][j] }.
Как видно из формулы, эта структура хранит два состояния параметра S[i] - до эксперимента под номером j и после. Здесь j - номер эксперимента, который лежит в интервале от 1 до n.
Для построения множества D можно использовать следующий простой алгоритм.
PHP:

2
while (j<=&& LEN(D) < x)
{
  
C[j]
  
A[c]
  if (
D[a] == NULL)
  {
    
= {}
    for (
i=1i<=mi++)
    {
      
ds = { S[i][j-1], S[i][j] }
      
d[i] = ds
    
}
    
D[a] = 
  
}
  
j++
}
font>


Этот алгоритм будет правильно работать при условии, что каждое примитивное воздействие всегда оказывает однозначный простой эффект. Это указано в описании предметной области. Если же эффект от примитивного воздействия будет разным, то потребуется учитывать также вероятности этих эффектов в дополнение к множеству D. В этом посте я ограничусь описанием самого простого случая.

Теперь можно анализировать весь лог экспериментов C, чтобы найти в нём последовательности действий приводящие к неожиданным эффектам. Для этого предлагается просматривать лог до появления неожиданного изменения состояния и когда оно будет замечено, сохранить несколько предыдущих экспериментов, привязав их к этому эффекту. В данном случае мы будем запоминать 10 предыдущих экспериментов в список T. Далее продолжаем просматривать лог C и при обнаружении уже запомненного эффекта добавляем ему в соответствие новые 10 предыдущих экспериментов. Делаем так до тех пор, пока для каждого эффекта не накопится достаточно количество появлений и соответствующих экспериментов. В данном случае мы ограничимся 3-мя появлениями каждого эффекта. Три эффекта будем считать уже закономерностью. Теперь для каждого эффекта сравниваем группы экспериментов и, если среди них есть одинаковые последовательности команд, добавляем эти команды в искомое множество E. В целом, псевдокод алгоритма построения множества E выглядит следующим образом.
PHP:

= {} // список неожиданных эффектов
1
while (j<=n// анализируем эксперименты
{
  
C[j]
  
A[c]
  
= {}
  for (
i=1i<=mi++) // формируем d
  
{
    
ds = { S[i][j-1], S[i][j] }
    
d[i] = ds
  
}

  if (
D[a] != d// неожиданный эффект
  
{
    
// запоминаем эффект в другой переменной
    
= []
    
j
    
while (i>=&& i>=j-10// находим 10 предыдущих действий
    
{
      
C[i]
      
A[c]
      
= {}
      for (
k=1k<=mk++) // формируем d
      
{
        
ds = { S[k][i-1], S[k][i] }
        
d[i] = ds
      
}
      
// запоминаем в список t действие a и его эффект d
      
t[LEN(t) + 1] = { a}
      
i--
    }
    
// сохраняем 10 предыдущих действий для эффекта f
    
T[f][LEN(T[f]) + 1] = t
  
}
  
j++
}

// формируем множество E
for (fZin T // f - ключ, Z - значение в коллекции T
{
  if (
LEN(Z) >= 3// является ли это закономерностью?
  
{
    
= [] // элемент искомого множества E
    
Z[1// эталонный образец последовательности, приводящей к эффекту f
    // ищем, где заканчивается одинаковая последовательность действий
    
for (j=2j<=LEN(Z); j++)
    {
      
Z[j]
      
LEN(t)
      do
      {
        
t[i].// действие
        
t[i].// изменение состояния
        
if (== o[i].&& == o[i].d)
        {
          if (
e[LEN(e) + 1] == NULL)
            
e[LEN(e) + 1] = a
        
}
        else
          break
        
i++
      }
      while(
<= LEN(t))
    }
    
E[f] = // добавляем новую стратегию в множество E по ключу f
  
}
}
font>


Вот и всё, множество E построено. Оно содержит последовательности действий, которые приводят новым эффектам. Обратите внимание, что множество E представлено в псевдокоде ассоциативным массивом. В этом массиве каждому ключу f (сам эффект) сопоставлены последовательности действий из множества A, которые приводят к этому эффекту. Таким образом, элементы из множества E можно использовать в качестве новых, теперь уже составных, действий. Эти составные действия можно применять к объекту исследования чтобы добиться какого-либо эффекта f.

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

Если Вы нашли логические ошибки в псевдокоде или у Вас есть другие ценные мысли по ИИ, прошу писать в комментарии. Спасибо.

Метки:  

Многоагентное программирование

Суббота, 19 Мая 2012 г. 04:35 + в цитатник
Вот подумалось, так что мысли сырые. А что если изобрести такой стиль программирования, где все объекты жили бы в реальном времени и обменивались сообщениями? Представьте себе стратежку типа Старкрафта. В ней юниты и здания - это программные объекты, которые друг с другом взаимодействуют и в итоге чего там строют. Так вот, если программные объекты представить в виде таких же юнитов, то для них можно будет писать функции жизни, а не реакции на события, как в традиционном ООП. Т.е. представлять себе процесс не виде алгоритма, а в виде взаимодействий объектов, как в реальной жизни.

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

Было бы интересно. Просто для фана, поиграться. А потом, глядишь, и выйдет чего.

UPDATE: всё это называется многоагентными системами. Программировать в них можно вот так например.

Метки:  

Принципы самообучающегося интеллекта

Вторник, 27 Марта 2012 г. 07:09 + в цитатник
Я уже начинаю путаться в своих рассуждениях об искусственном интеллекте. Рассуждения эти происходят исключительно в моей голове, поэтому я забываю, где я нахожусь и к чему пришёл. Чтобы не запутаться во всём этом, я решил написать этот пост, в котором постараюсь обозначить исходную точку своих рассуждений.

Суть самообучения нашего маленького виртуального мозга состоит в том, что он анализирует данные о своих экспериментах и на основе этого анализа строит и запоминает алгоритмы успешного поведения. Для упрощения задачи будем считать, что ВИ (виртуальный интеллект) живёт исключительно ради собственных исследований. Его смыслом жизни является постоянное увеличение базы построенных алгоритмов. Новые алгоритмы поведения будем называть "жизненным опытом", а их построение - "обучением".

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

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

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

Так как девушки - существа пассивные, наш маленький друг будет инициативным. Он сам ломится к разным девушкам и начинает общение. Он пишет им одну из оригинальных фраз для знакомства, использую действие "познакомиться". Некоторые из них не отвечают или посылают его - их он обходит стороной, реагируя на ответ среды "отказ". Когда же девушка ответила что-то более приветливое, ВИ также адекватно реагирует на это, выбирая одну из тем, на которую он будет раскручивать девушку.
Т.к. никаких знаний о собеседнике на этом этапе у нас нет, начинается случайный перебор возможных действий. Всегда, в условиях полной неизвестности которые были у нас лишь в глубоком детстве, мы используем случайный выбор любого из возможных действий.
Выбрав одну из тем и пообщавшись на эту тему с девушкой, ВИ оценивает ответ среды в виде параметров "интерес", "эмоциональность", "знание", "благосклонность девушки" и возможно некоторых других. ВИ запоминает соответствие его действия ответным параметрам, которые пришли от внешнего мира. Далее ВИ продолжает случайным образом перебирать темы, запоминая параметрические ответы окружающей среды на его действия. Разговор на каждую тему является для ВИ экспериментом. После каждого проведённого эксперимента знаний об объекте исследования, коим для него является девушка, становится больше. ВИ уже не будет говорить с ней о недавнем матче Спартака и ЦСКА, если после предложенной аналогичной темы о футболе девушка написала нечто такое, что все параметры ответа оказались достаточно низкими. Однако, если ответ девушки на какой-либо вопрос оказался, например, эмоциональным и благосклонность при этом не уменьшилась, то ВИ конечно разовьёт эту тему, а также все схожие темы, потому что в таком случае он построит новое поведение:
PHP:

action вызывать_переживания
()
{
  
выбрать_случайную_тему("секс""гарри-поттер""бывший бойфренд""аниме");
  
говорить_на_выбранную_тему();
}
font>


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

выбрать_тему
("секс");
говорить_на_выбранную_тему();
-> 
проанализирована ответная реакция: { интерес: +2эмоциональность: +5знание0благосклонность_девушки}
выбрать_тему("гарри-поттер");
говорить_на_выбранную_тему();
-> 
проанализирована ответная реакция: { интерес: +1эмоциональность: +4знание: +2благосклонность_девушки: +}
выбрать_тему("бывший бойфренд");
говорить_на_выбранную_тему();
-> 
проанализирована ответная реакция: { интерес0эмоциональность: +6знание: +1благосклонность_девушки: +}
выбрать_тему("аниме");
говорить_на_выбранную_тему();
-> 
проанализирована ответная реакция: { интерес: +3эмоциональность: +4знание: +2благосклонность_девушки}
font>


Анализируя этот лог экспериментов ядро ВИ может сделать вывод, что эмоциональность объекта исследования проявляется в этих темах с заметной регулярностью. Значит можно добавить в арсенал новое действие для повышения эмоционального уровня девушки. ВИ только что научился разогревать эту особу! Совершенно самостоятельно написал себе подпрограмму. Думаю, также иногда поступают и люди, набираясь жизненного опыта.
Однако, продолжим рассказ об обольщении После нескольких удачных серий экспериментов ВИ обучился таким действиям как "зазогреть девушку", "приструнить девушку", "поучить девушку", "утомить девушку", "повысить настроение девушки", "разозлить девушку", "заинтересовать девушку" и т.п. После этого ВИ уже стал повсеместно использовать свои новые действия. Теперь он не просто болтает на случайные темы, но и выстраивает их определённые последовательности, желая достичь нужного эффекта. Да уж, всё просчитано наперёд у этих роботов Так вот, теперь ВИ имеет возможность анализировать в логах свои изученные действия! Это ключевой момент, поскольку на данном этапе обучения ВИ перешёл на новый уровень абстракций. Например, теперь он может выяснить, что если сначала "повысить благосклонность" девушки, затем "вызвать интерес" и далее "разогреть", то она, с большой долей вероятности, соглашается прислать свои голые фотки =) Поэтому ВИ построит новое действие "раскрутить девушку на фотки". Этот анализ уже будет произведён с использованием более сложных абстракций, которыми теперь ВИ может оперировать.

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

AI (600x668, 10Kb)

Метки:  

Hello World в подарок программисту

Суббота, 10 Марта 2012 г. 01:00 + в цитатник
Моя девушка решила меня порадовать и написала Hello World. Так приятно это!

<input type="button" value=" Нажми меня " ONCLICK="AlertButton()" >
<script>
function AlertButton()
{
window.alert("Hello, World!");
}
</script>

Метки:  

Костыль для асфальтирования

Пятница, 09 Марта 2012 г. 21:41 + в цитатник
- Достаточно ли уделять час своего времени для работы на эгрегор миссии? (для души)
- По началу.
- Как это по началу?
- А потом втянешься и сам будешь хотеть больше.
- А вот правда. Я вот что подумал. Если у меня начинает теряться интерес к работе, значит я в ходе своей деятельности не работаю даже часа в течение дня на свой эгрегор. Т.е. как-то не так работаю. Сразу приходит в голову такой костыль: вырезать этот час из рабочего времени и заниматься в течение часа чем-то интересным для себя. Это должно восстановить баланс.
- Если теряется интерес - значит ты эксплуатируешь старые наработки и не развиваешься. Очень хорошо, что ты это сразу отслеживаешь.
- Разумеется, но асфальт класть надо довольно часто. Это не идеальное решение, это костыль. В идеале нужно было бы сделать асфальтирование интересным. И если я прав, то эта формула подходит для любой рутинной деятельности. Потому что ранее я посвящал рутинным задачам весь день или не работал вообще - это была ошибка.
- Начнешь заниматься чем-то включающим, поработаешь на энергии часика 2, а потом уже можно будет на этой энергии продолжить класть асфальт, насколько ее хватит.
- Только бы сработало!

Метки:  

Мотивация с помощью листа бумаги

Суббота, 11 Февраля 2012 г. 19:59 + в цитатник
Вобщем мотивационный метод использовал такой: берёшь лист бумаги и пишешь там текущие задачи. Слева от каждой задачи рисуешь пустой квадратик как в бланке для голосования. Когда задача будет выполнена, ставишь в квадратике галочку. Листок держишь перед глазами на столе. Очень скоро руки сами полезут выполнять эти задачи. Для меня работает.

Метки:  

О чтении книг

Четверг, 02 Февраля 2012 г. 01:10 + в цитатник
Ещё одна очевидная истина о повышении мотивации в работе:
Чтение образовательных книг о конкретном деле повышает интерес к этому делу.
К.О.

Метки:  

FDT мегасетап

Четверг, 29 Декабря 2011 г. 08:58 + в цитатник
Пару дней ковырялся чтобы настроить IDE для серверной и клиентской части одного проекта. Захотелось мне заставить IDE одновременно работать как серверной так и с клиентской частью чтобы не тратить внимание на переключение между разными средами. Сложность в том, что клиент и сервер на разных языках, соответственно на Флеше и на Питоне. И вот наконец получилось!

В качестве основы взял среду FDT4, потому что она быстрая и на ней уже работает Флеш. Установил в неё PyDev и кучу разных плагинов, в т.ч. для синхронизации с удалёнными серверами. Серверную часть пока запускаю на той же машине, что и клиентскую, но ничто не мешает и править серверный код удаленно потому что есть RSE для Эклипса. Отдельная проблема была с FlashPlayer, потому что для юнит-тестов он совершенно не нужен и его окошко надо было спрятать. Как это сделать нормально пока не знаю, может быть надо писать тесты на Adobe AIR. Я же извратился и вызываю плеер через браузер в одной и той же вкладке, а само окно браузера скрыл навсегда сторонней утилиткой. В результате у меня получилась IDE с двумя консолями и двумя проектами, где ничто не отвлекает от сути.

FDT_setup (700x526, 249Kb)

Метки:  

Optimus - Demo версия

Воскресенье, 04 Декабря 2011 г. 20:44 + в цитатник
Мы закончили работу над демкой игры Optimus online!
Если этот пост вдруг прочитает потенциальный инвестор , добро пожаловать на партнёрский сайт, где выложена демка, скриншоты и инфа об игре.


Метки:  

Мышление есть компиляция

Понедельник, 28 Ноября 2011 г. 12:00 + в цитатник
labirint-mysh-b962 (225x300, 10Kb)
Большая просьба к знающим людям, скажите на верном ли я пути и куда копать?

Меня снова накрывают размышления об ИИ. Продолжаю развивать свою мысль о генерации новой стратегии на основе прожитого опыта. Т.е. есть некий жизненный опыт, который упрощённо можно считать логом команд и изменений состояния системы:
O = { C, S }, где C - это множество наших действий (команд), а S - состояние системы после каждого нашего действия;
C = { c1, ..., cn }, где ci принадлежит множеству команд A = { a1, ..., ax };
S = { s1, ..., sn }, где si = { d1, ..., dy }.

Если проанализировать этот лог, то можно выявить удачные блоки и даже построить из этих данных новые алгоритмы, приводящие к успеху. В общем случае новый алгоритм можно представить в виде функции:
f(p1, ..., pz) = E = { e1, ..., el }, где ei принадлежит множеству команд A = { a1, ..., ax };
f можно представить в виде функции на языке программирования с фиксированным набором параметров p1,...,pz.
Кроме того, есть частный случай, когда z = 0, т.е. функция не параметризированная. Тогда её тело E является всего лишь набором команд, которые могут быть просто фрагментом из лога C.

Задача состоит в том, чтобы разработать метод генерирации E из O. Т.е. преобразование O -> E. Это будет алгоритмом генерации алгоритма.

Метки:  

Понравилось: 1 пользователю

И снова Юпитер

Среда, 23 Ноября 2011 г. 01:09 + в цитатник
Сегодня было очень чистое небо. Юпитер великолепен. Мне показалось что он был больше чем раньше. Сделал с балкона пару фоток через телескоп. Сфотографировать его во всей красе у меня не получается. Но всё же лучше чем раньше. А глазами его вообще отлично видно. Заметно объемную форму, обе полосы и спутники.
jupiter_final (572x377, 30Kb)

Метки:  

Утилитка для компоновки спрайтов в один файл

Понедельник, 17 Октября 2011 г. 15:08 + в цитатник
Многие игровые движки, в частности на флеше, используют для анимации всяких взрывов и других эффектов большие картинки, в которых содержатся все изображения анимированного спрайта. Нормальных цивильных программ для этой простой задачи компоновки я найти не смог.

Есть утилита, которая называется "SpriteImage Composer", очень старая и глючная. Она делает именно то, что требуется и до недавнего времени я пользовался ей. Она сохраняет коллекцию спрайтов в один большой PNG файл. Однако проблема в том, что эти файлы слишком много весят, если хранить в них длительную анимацию. Например, 4 секундный ролик размером 128x128 в таком формате занимает уже более 1 Мб. Если таких анимаций будет много, то суммарный размер данных для игры уже является неприемлемо большим.

Решение придумал следующее. Для анимационных эффектов не особо важна точность деталей картинки, поэтому её можно сжимать с потерями, т.е. в JPEG. Но JPEG не поддерживает прозрачность. Как же быть? А вот как: собираем все спрайты в большую картинку, а потом сохраняем её в виде двух частей. Первая часть - сама картинка анимаций в виде JPG-файла, а вторая - альфа канал, тоже в виде отдельного JPG-файла. Затем в целевом приложении загружаем оба файла, компонуем в единую картинку с прозрачностью и разбиваем по кадрам. Преимущество такого подхода в том, что суммарный размер пары JPG-файлов в несколько раз меньше, чем единая PNG-картинка.

Именно этот подход использует моя крохотная утилитка, написанная под Adobe AIR. Скачать её и использовать может каждый разработчик, столкнувшийся с этой элементарной проблемой: http://code.google.com/p/fire-starter/
Программа является OpenSource'ной - берите и делайте с ней всё, что хотите.


Метки:  

Голос Духа

Суббота, 24 Сентября 2011 г. 20:11 + в цитатник
Сегодня гулял по улицам, пытаясь слушать голос Духа. Прикидывал в какую сторону лучше свернуть с точки зрения Духа. За основу взять чувство облегчения, которое приходит при правильном выборе и напряжение, если выбрал неправильно. Голос его очень тонкий, трудно различить. Но можно! Например, могут возникнуть страхи, которые не имеют отношения к Духу. Всё это надо учиться фильтровать... Интересно, что Дух направлял меня всегда в места с людьми, которые я сам точно обошёл бы стороной, по привычке. Проходя мимо людей возникали какие-то чувства, атмосфера менялась. Прогулка получилась интересной. Если я себя не обманываю и правда могу различить голос Духа, то это для меня великое открытие. Но "голос" его слышится с трудом.

Метки:  

Понравилось: 1 пользователю

Дисциплина != Монотонность

Вторник, 30 Августа 2011 г. 20:04 + в цитатник
Думаю что моя ошибка в том, что я приравнял дисциплину к монотонности. Ведь дисциплина или внутренняя упорядоченность - это возможность стремления к цели, проходя через тернии. Например, если стоит задача поддерживать себя в форме, то это не значит что надо поделить свой день на распорядок и регулярно отжиматься перед завтраком. Это распорядок, но это не дисциплина. Меня пытались этому научить, но мне это не подходит. Ведь есть и другие способы решить ту же самую задачу, например спорт или в Wii можно поиграть )) Мне нужно просто отбросить монотонные методы, но сохранить стремление.

Когда герой идет спасать принцессу проходя тысячу препядствий - это же тоже самое и это интересно. А кому-то лучше делать 20 отжиманий в 7 утра Отжимать принцессу куда интереснее

Метки:  

Синглетоны с вайфайем

Суббота, 06 Августа 2011 г. 04:16 + в цитатник
То что сейчас будет написано возможно противоречит каким-нибудь принципам "правильного" проектирования ПО, так что будьте осторожны ))

Предлагаемый подход родился в моей голове чтобы упростить доступ к объектам классов вида "синглетон". Кто не в курсе, знайте, что это классы с объектами в единственном экземпляре и временем жизни равным (или примерно равным) времени работы программы. Классический подход предлагает передавать их по цепочкам в виде параметров и хранить в объектах-клиентах посредством агрегации (в виде ссылок). Такой подход похож на прокладывание сетевых проводов, где устройства взаимодействуют лишь с соседями, прямо или косвенно соединёнными проводами. Прокладывать провода или же обеспечивать каждый раз передачу синглетона по иерархии геморно. Поэтому предлагается устроить нечто похожее на wifi-сети в проектируемой объектно-ориентированной системе. Сделать синглетоны доступными всем, посредством статической переменной (метода) - почему бы и нет?

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

Выгода от этого подхода огромна! Нет гемору с параметрами и ссылками!
Подробности описал в этой статье.

Метки:  

Тесты поиска по строкам в AS3

Суббота, 06 Августа 2011 г. 02:56 + в цитатник
Провёл сейчас любопытные тесты поиска по строковому набору из 10 тыс. эл-тов:
DICTIONARY[]: 155 ms
ARRAY[]: 196 ms
ArrayList::getItemIndex(): 19839 ms
VECTOR::indexOf(): 9923 ms

Для 100 тыс. эл-тов:
DICTIONARY[]: 1579 ms
ARRAY[]: 1473 ms
OBJECT[]: 1539 ms
OBJECT::hasOwnProperty(): 2029 ms

Вывод: не надо даже пытаться использовать indexOf(), т.к. он ищет без хеш-таблицы. ArrayList вообще в топку. Dictionary, Array и Object абсолютно идентичны. hasOwnProperty() использовать не надо.

Метки:  

Мы запустили космический аппарат Спектр-Р

Понедельник, 18 Июля 2011 г. 09:21 + в цитатник
Популяризирую интерес к космическим исследованиям
"Ракета-носитель "Зенит-3М" с российской астрофизической обсерваторией для изучения Вселенной "Спектр-Р" стартовала с космодрома Байконур утром в понедельник, 18 июля. Как сообщает пресс-служба Роскосмоса, отделение космического аппарата от разгонного блока "Фрегат-СБ" произойдет около 10:00 по московскому времени.
Астрофизическая обсерватория "Спектр-Р" была создана по заказу Роскосмоса в рамках проекта "Радиоастрон". Разработкой научной аппаратуры занимался астрокосмический центр ФИАН, основным исполнителем стало ФГУП "НПО имени Лавочкина".

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

Планируется, что обсерватория проработает не менее пяти лет."




Видео на эту тему можно посмотреть вот здесь .

Метки:  

х/ф Запрещённый приём

Пятница, 15 Июля 2011 г. 03:07 + в цитатник
Посмотрел сейчас этот фильм и сижу под впечатлениями. Чего в инете про него какую-то фигню пишут? Фильм очень глубокий и депрессивный. Жаль, что у неё не получилось достичь свободы для себя.

Метки:  

Статья о сетевом взаимодействие в реальном времени

Среда, 13 Июля 2011 г. 00:47 + в цитатник
Моё коллега недавно перевел статью о том как организовано сетевое взаимодействие в игре Counter Strike. Если кому интересно, можете почитать с комфортом: на русском языке и с картинками: http://gamecrafta.ru/blog/6.html

Метки:  

Методы борьбы с DDoS

Воскресенье, 10 Июля 2011 г. 19:29 + в цитатник
liveinternet.ru/users/d0rc/...175219976/ Пожалуй сохраню тут ссылочку на полезную статью.

Защита от DDoS. Нет веб-сервера, кроме nginx, и Сысоев пророк его. И действительно, если у вас по каким-то причинами стоит что-то, кроме nginx, можете сразу ползти на кладбище, так как помочь вам уже никак не получится. В частности, если у вас стои...

Метки:  

Поиск сообщений в eugene20237
Страницы: 7 6 5 4 [3] 2 1 Календарь