четверг, 3 октября 2013 г.

Octave + Fuzzy Logic Toolkit

По этой связке хорошо помогают работать следующие ссылки:
http://octave.sourceforge.net/fuzzy-logic-toolkit/overview.html
http://radio.feld.cvut.cz/matlab/toolbox/fuzzy/fuzzyt23.html

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

Не совсем понятен, параметр connection - но значение 1 туда подходит.

Еще возможной проблемой является то, что нельзя в названии значений входов и выходов использовать пробелы. Octave тогда ломается и выдает стектрейс.

Для разработки имеет смысл использовать плагин для NetBeans - OctaveNB, который предоставляет чуть ли не REPL для Octave.

Сам скрипт будет состоять из трех команд:

% Читаем систему из файла в переменную fis
fis = readfis("system.fis"); 
% Проводим вывод на системе
results = evalfis([[0.5], [-0.5]], fis);
% Показываем результаты
disp(results);

Где [[0.5], [-0.5]] - матрица, в которой каждая строка - массив значений для входа N. На выходе, соответственно - матрица значений для выходов.

Довольно легко и просто!

четверг, 26 сентября 2013 г.

"Хранить" или "Являться"? О непонимании.

Сегодня столкнулся с довольно интересной ситуацией, , из которой вырос этот философский пост.

Для начала мне задали вопрос, по поводу одного тестового вопроса, который формировался таким образом - "В каких из заданных типов можно хранить число?". Вопрос этот был в рамках языка C++ и это довольно таки простой вопрос с простой формулировкой. Вариантами ответа были int, char, char[], float и еще пара других типов. Так вот, парень задавший мне вопрос выбрал, среди прочих, вариант char[]  и аргументировал это тем, что в принципе в массиве можно хранить число.

Дело в том, что тест больше касался синтаксиса языка, и под "хранить" подразумевалась возможность написать нечто вида "X a = 22;", где X  - имя типа (ну в общем случае, конечно). Очевидно, в рамках такого понятия - char[] полностью не подходит.
Однако, это приводит к самому вопросу о том, насколько размыто понятие "хранить" в голове программистов.

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

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

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

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

среда, 18 сентября 2013 г.

Ускоряем Moodle при помощи APC + Memcached

Не так давно (если не ошибаюсь, с версии 2.4-2.5) версия Moodle стала страшно тормозить в дефолтной поставке PHP. Нет не страшно тормозить, а  тратить 30 СЕКУНД на генерацию страницы.  Впрочем, это случается с любым неминималистичным веб-фреймворком рано или поздно, а Moodle никогда не был маленьким и легковесным, в силу своей предметной области. А значит - нет смысла ругаться, надо решать проблему :)

Я нашел около двух способов ускорения, однако есть и больше. Навскидку - можно использовать WinCache под Windows и другие (см. stores). Да и Memcached не так уж обязателен Вот здесь по идее можно скачать плагин и настроить для работы Moodle Universal Cache c APC (у меня оно кладется в Memcached).

Иными словами,  здесь описан мой путь, который несколько костыльный, однако - сработал. Результатом его является то, что главная сейчас отдается за 300мс, а  время генерации страницы в худшем случае - 4с. Данная конфигурация работает на двухядерном Intel Atom D2700 и 2Гб RAM под управлением Ubuntu 12.04

Cперва установим APC. Мануал взят по ссылке [1].

sudo apt-get install php-apc
service apache2 restart

У меня юзался php-fpm (в дефолте убунты это так) и его необходимо было перезагрузить:

service php5-fpm restart

Количество памяти можно смело поднимать до 256Мб - это дает позитивный эффект, и память сильно не фрагментируются в итоге. Прикладываю конфиг /etc/php5/conf.d/apc.ini для настройки

extension=apc.so
apc.shm_size=256M
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.enable_cli=1
apc.rfc1867=1


Вторым этапом настраивается Memcached. Мануал опять же взят по ссылке [2], однако есть небольшие отличия, связанные с версией. Ставим необходимые пакеты.

sudo apt-get install memcached php-pear php5-dev 
sudo apt-get install libmemcached-dev
sudo pecl install Memcache
service apache2 restart
service php-fpm restart 


Стоит добавить следующую строку в /etc/php5/apache2/php.ini (хотя по идее инсталлер это сделает сам, у меня почему-то не сделал):

extrension=memcache.so


И в config.php самого Moodle прописываем:

$CFG->cachetype='memcached';
$CFG->rcache = true;
$CFG->memcachedhosts= '127.0.0.1';
$CFG->memcachedpconn=true;


Для полной уверенности можно выполнить:

service memcached restart

пятница, 2 августа 2013 г.

RacerPro + Apache Jena. Подводные камешки

Недавно пришлось писать клиент с использованием первых двух + использованием SparQL в качестве языка запросов.
Это довольно мутная задача, так как целью была работа именно со SparQL + RacerPro.  Jena оказалась при том, что базу знаний необходимо было таки грузить.
В качестве языка разработки клиента юзался Java, что довольно логично, учитывая наличие JRacer. 
Стоит, отметить что SparQL поддерживает только версия 2.0+ RacerPro, а она из статуса "Preview" еще давно не вышла. Поэтому при работе стоит учесть несколько фактов:
  1. Запросы придется выполнять в виде "(sparql-answer-query  "текст запроса")".  Все должно писаться в одну строку - иначе все будет ломаться.
  2. Версия 2.0 поддерживает префиксы (с запросами в Jena были проблемы)
  3. Применять UNION он не умеет
  4. Квантификаторы (к примеру "+") в запросах тоже
Имеет смысл учесть, что при изменении структуры базу знаний придется перезагружать. Из-за скупости и непонятности офф. документации как сделать красиво узнать не удалось. Если кому интересен конкретный код - вы можете его посмотреть на https://code.google.com/p/db2-ontology-coursework-2013/