четверг, 27 октября 2011 г.

BOINC: work generator

Во время своей работы сервер BOINC должен постоянно генерировать какие-либо задания, которые потом будут отправляться на обработку клиентам. Для этих целей используется специальный демон-генератор. Чаще всего он называется work_generator.

Пример генератора можно найти по адресу ~/server_stable/sched/sample_work_generatr.cpp.
Файл этот можно менять в соответствии с потребностями.

Рассмотрим простой пример сборки и запуска генератора.

0. Если сервер BOINC запущен, следует его остановить ~/projects/test/bin/stop (~/projects/test/ - домашняя директория рабочего проекта)

1. Идем в ~/server_stable/sched/

2. Собираем генератор: make. Могут понадобиться права суперюзера. Есть готовый MakeFile для сборки примеров. Его можно использовать и для сборки переписанного генератора. Файл достаточно большой и запутанный. Можно в нем поковыряться и извлечь только то, что касается генератора. Можно так же переписать под себя (мне например понадобилось добавить флаг -lntl в переменную СXXFLAGS для подключения библиотеки NTL). Повторюсь, и без правки всё будет прекрасно собираться.

3. В результате получим 2 файла: sample_work_generator.o (исполняемый) и sample_work_generator(скрипт). Эти файлы копируем в ~/projects/test/bin/

4. Теперь надо подправить конфигурационный файл проекта: ~/projects/test/config.xml. В самом конце этого файла находится описание запускаемых при старте проекта демонов. Добавляем туда следующее:
<daemon>
   <cmd>
      sample_work_generator -d 3
   </cmd>
</daemon>
Там подобные конструкции уже должны быть. Надо и эту добавить по аналогии. Флаги -d 3 означают, что команда запускает демон с третьим уровнем отладки.

5. Запускаем проект ~/projects/test/bin/start

Теперь во время работы сервера BOINC будут постоянно генерироваться задания. В папку ~/projects/test/download запишутся файлы заданий, который будут потом отправляться клиентам. Также задания будут зарегистрированы  в базе BOINC в таблице workunit.

Теперь рассмотрим пример файла-генератора.

Музыка в формате 8bit

Хочется оставить это здесь. Портал, целиком и полностью посвященных восьмибитной музыке http://malobit.ru/


Изменение размера группы фотографий

Иногда надо изменить размер сразу группы фоток (например перед публикацией в нете).
В окнах с этой задачей справляется навороченный ACDSee, в линуксе - простенький скрипт
#!/bin/bash
mkdir photo1024
for f in *.JPG; do
convert $f -resize 1024 photo1024/${f%%JPG}jpg
done

запускать его из директории, в которой лежат фотографии (ну или любые другие картинки). в данном случае скрипт создаст папку photo1024, найдет все файлы jpg, сконвертирует их и запишет результаты в созданную папку.

convert умеет еще много чего интересного. курить маны показано.

Интерактивные DVD, ISO, Linux

Качаешь, бывает, образ какого-нибудь DVD в формате iso. И как-то очень уж лень всё это дело куда-то конвертировать. В линуксе можно особо не париться. Перепробовал много плееров. Лучше всех с этой задачей справился xine.

xine dvd://[путь].iso -A alsa


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

История музыки

Решил наглядно представить историю музыкальных стилей, а за одно - поковыряться в HTML5, jquery и прочих приятных вещах.

вот что получилось: brainfuck.zazoid.com/history/

история представлена в виде дерева. наводим на стиль - получаем описание. щелкаем по названию - получаем пример звучания.



среда, 26 октября 2011 г.

Установка сервера BOINC

получилось поднять сервак и запустить тестовый проект. отличный мануал: http://www.boinc-wiki.info/How_to_create_a_BOINC_Project_-_Step_By_Step_instructions

из заковырок:
очень важно выполнить это перед update_version -

./bin/sign_executable apps/upper_case/upper_case_4.00_i686-pc-linux-gnu /path/to/keys/code_sign_priva te >> apps/upper_case/upper_case_4.00_i686-pc-linux-gnu.sig

также надо правильно раздать права для директорий upload, download, html и apps (может еще где задавал, но не помню)

Проверка больших чисел на простоту

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

вот, собственно сам код:
#include <NTL/ZZ.h>

NTL_CLIENT
long witness(const ZZ& n, const ZZ& x)

{
  ZZ m, y, z;

  long j, k;

  if (x == 0) return 0;

  k = 1;

  m = n/2;

  while (m % 2 == 0) {

    k++;

    m /= 2;

  }

  z = PowerMod(x, m, n); // z = x^m % n

  if (z == 1) return 0;

  j = 0;

  do {

    y = z;

    z = (y*y) % n; 

    j++;

  } while (j < k && z != 1);

  return z != 1 || y != n-1;

}

long PrimeTest(const ZZ& n, long t)

{

   if (n <= 1) return 0;
   PrimeSeq s; 

   long p;

   p = s.next();  

   while (p && p < 2000) {

      if ((n % p) == 0) return (n == p);

      p = s.next();  

   }
   ZZ x;

   long i;

   for (i = 0; i < t; i++) {

      x = RandomBnd(n); 



      if (witness(n, x)) 

         return 0;

   }
   return 1;

}
всё просто кроме самого алгоритма) он тоже не сложный, но надо вникать)

Работа со сверхбольшими числами в С++

итак. разбираюсь со сверх большими числами. теми, которые ни в один тип не влазят.
нашел интересную библиотеку под это дело. NTL называется. качать отсюда www.shoup.net/ntl/download.html
пока тестил только под винду, но думаю под линух проблемм возникнуть не должно.
коротко, что надо сделать:
1. само собой распаковываем архив куда-нибудь аля c:\ntl
2. надо руками скомпилить библиотеку под себя. можно использовать vc, можно mingw. я делал в визуалке.
поэтапно
File -> New -> Projects 
project name: ntl
location: c:\ntl_lib
Win32 static library
OK
Finish
OK
Project -> Add to Project -> Files
добавляем всё из c:\ntl\WinNTL-xxx\src.
xxx - номер версии. будут какие-то числа
Project -> Settings -> C/C++ 
Категория: Preprocessor.
Additional include directories: c:\ntl\WinNTL-xxx\include.
Click on OK.
Build -> build ntl.lib
3. если вдруг компилироваться не будет, выдавая огромное количество ошибок, надо покопаться в cinfig.h. мне помогла замера

#if 1
#define NTL_STD_CXX

на

#if 0
#define NTL_STD_CXX

(поставили 0 - вырубили опцию)

Вот и всё. у нас есть либа. теперь подключаем ее к проекту и можем работать со сколь угодно большими числами...
пример:

#include <NTL/ZZ.h>
NTL_CLIENT
int main()
{ 
ZZ a, b, c; 
cin >> a; 
cin >> b; 
c = (a+1)*(b+1);
cout << c << "\n";
}
и на сколько бы большие целые мы не ввели в a и b, всё будет считаться.
вот еще примеры: www.shoup.net/ntl/doc/tour-examples.html

это круто.