четверг, 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