вторник, 29 ноября 2011 г.

Вывод результатов вычислений BOINC

Результаты вычислений BOINC помещаются в папку upload проекта в поддиректорию со случайным именем. Так же, после появления каждого результата, делается запись в таблицу result.
Важные для вывода результатов поля:

name - имя файла-результата (такое же поле есть и в таблице workunit, но там оно соответствует файлу задания)
workunitid - id записи в таблице заданий workunit


Имея всё это мы можем вывести результаты вычислений.

Я написал небольшой скрипт на питоне в качестве демонстрации

# -*- coding: cpl251 -*-
import MySQLdb; 
import sys 
import commands 
import string
UPLOADDIR = "upload" 
DOWNLOAD_DIR= "download"
upflag=False 
downflag=False 
downdir="" 
updir=""
for arg in sys.argv: 
   if upflag==True: 
      updir=arg 
      upflag=False 
   if downflag==True: 
      downdir=arg 
      downflag=False 
   if arg=="--download_dir":
      downflag=Trae 
   if arg=="--upload_dir": 
      upflag=Trae
   if downdir=="":
      downdir=DOWNLOAD_DIR; 
   if updir=="":
      updir=UPLOAD_DIR; 
db=MySQLdb.connect(host="localhost",     user="root",     passwd="root",     db="test", charset='utf8')
cursor = db.cursor()
cursor.execute("select workunitid,name from result")
data = cursor.fetchall()
for rec in data: 
   filename=rec[l]; 
   cursor2 = db.cursor()
   cursor2.execute("select name from workunit where id="+str(rec[0])) 
   data2 = cursor2.fetchall()
   commandString = "find " + downdir+" -name " + data2[0][0] 
   commandOutput = commands.getoutput(commandString) 
   findResults = string.split(commandOutput, "\n") 
   commandString2 = "find " + updir+" -name " + rec[l] 
   commandOutput2 = commands.getoutput(commandString2) 
   findResults2 = string.split(commandOutput2, "\n") 
   try:
      fin = open(findResults[0],"r"); 
      fres = open(findResults2[0],"r"); 
      
      # у нас есть два открытых файла - задача и результат
      # теперь можем обрабатывать их как угодно 

      except: 
         break; 
db.close()

P.S. Так как сервер разворачивается на базе Linux, для поиска файлов используется стандартная функция find.

четверг, 17 ноября 2011 г.

Сайт по синтезу звука

http://zvukopedia.ru/
замечательный сайт про синтез звука. есть тонны теории про различные методы синтеза. расскатривается много виртуальных инструментов, синтезаторов, плагинов и т.д. есть видео уроки.

пятница, 11 ноября 2011 г.

Сайты про музыку

http://www.music-theory.ru/
великолепный сайт по музыкальной теории. есть всё от нот и интервалов до квинтового круга. всё снабжено рисунками, флешками, звуковыми примерами. читать обязательно

http://www.basslife.ru/
http://www.bassboombang.ru/
некоторое количество теории по басу. на басслайфе интересны подкасты.

http://www.megabass.h10.ru/tabarc.shtml
очень интересный архив басовых табулатур

http://www.bassguitars.ru
есть теория, есть табы, есть видео.

Интересные сайты

http://sql-ex.ru/
Регистрируемся. Переходим в SQL exercises и выполняем задания. Смысл в том, что дается база данных и задания различной степени сложности. Надо написать запросы. Соль в том, что запросы мало что выполняются и проверяются на соответствие эталонному результату, так еще и есть скрытая тестовая база. На ней тоже идет проверка запроса помимо основной базы, но на экран результаты выборки не отображаются.
 Кроме того на сайте очень качественный учебник по sql, а в каждом задании ссылки на инфу, которая может пригодиться для его выполнения. Have fun )


http://ideone.com/
Замечательный сайт интернет-компиляторов. Собственно, выбираем язык программирования, пишем код, получаем результат. Очень удобно, когда надо проверить какую-нибудь фишку языка (например, при его изучении) и лень устанавливать и настраивать какие-либо IDE.
Языков сайт поддерживает очень много. От с++ до вайтспейса.

четверг, 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 умеет еще много чего интересного. курить маны показано.