вівторок, 25 березня 2008 р.

Як вставити Python у програму. Embedding Python in Another Application

Найпростішим прикладом може бути виконання Python коду у вашій програмі без взаємодії з нею:

#include

int
main(int argc, char *argv[])
{
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print 'Today is',ctime(time())\n");
Py_Finalize();
return 0;
}





http://xivilization.net/pydocs/2.6/extending/embedding.html

пʼятницю, 14 березня 2008 р.

Служби каталогів LDAP

Думаю ви вже перечитали гору визначень про LDAP ;)

Якщо коротко то :

LDAP це протокол доступу до служби каталогів.

Служба каталогів подібна до бази данних але схольна до збереження данних орієнтованих на атрибути. Сервери служб каталогів оптимізовані для зчитування інформації, іноді редагування заборонене взагалі.

Одна з відомих реалізацій сдужби є Active Directory

Вона забезпечує централізоване управління користувачами, групами службами і мережевими ресурсами. Існує можливість розширення схеми Active Directory для визначення нових класів і властивостей об'єктів, дозвіл імен у Active Directory, реплікація з декількома господарями в середовищі рівноправних контроллерів доменів. Існує можливість керувати безпекою - зокрема перевірка достовірності, управління доступом і підтримка шифрування.

Висновок:
Служби каталогів використовуються для централізованого управління мережевими ресурсами, правами та ролями користувачів, тощо.

Дещо взято з http://flame.s2s.msu.ru/?q=node/view/19

пʼятницю, 7 березня 2008 р.

Addin друга спроба (Mono, Plugin)

http://en.wikipedia.org/wiki/Plugin
http://www.mono-project.com/Introduction_to_Mono.Addins

Є багато причин чому ви можете вирішити дописувати розширення для ваших продуктів:
  • Дозволити стороннім розробникам розширювати чи змінювати можливості програми.
  • Підтримувати можливості ще не передбачені.
  • Зменшити розмір основної програми.
  • Розділити код через проблеми пов'язані з ліцензуванням.

.Net & MONO бачення:


Модель Mono.Addins складається з 4-х компонентів:
  • Add-in host: розширяєма за допомогою додатків програма чи бібліотека.
  • Extension point: місця де додатки реєструють типи розширень.
  • Extension node: елемент що має атрибути що описують розширення. Точки (місця) розширень можуть декларувати типи розширень з якими вони працюють.
  • Add-in: набір файлів які реєструють нові гілки в одній або декількох точках розширення визначених розширюваною програмою.
Приклад:
Реалізуємо текстовий редактор що буде розширений за допомогою додатків.


ICommand library (TextEditorLib.dll)

[assembly:AddinRoot ("TextEditor", "1.0")]

[TypeExtensionPoint]
public interface ICommand
{
void Run ();
}

An add-in (SampleAddin.dll)

[assembly:Addin]
[assembly:AddinDependency ("TextEditor", "1.0")]

[Extension]
class HelloWorldExtension: ICommand
{
public void Run ()
{
Console.WriteLine ("Hello World");
}
}

The host application (TextEditor.exe)

public class Application
{
public static void Main ()
{
AddinManager.Initialize ();
foreach (ICommand cmd in AddinManager.GetExtensionObjects (typeof(ICommand)))
cmd.Run ();
}
}

This is what the manifest for the TextEditor host would look like:

<Addin id="TextEditor" version="1.0" isroot="true">
<Runtime>
<Import assembly="TextEditor.exe"/>
<Import assembly="TextEditorLib.dll"/>
</Runtime>
<ExtensionPoint path = "/TextEditor/TypeExtensions/ICommand">
<ExtensionNode objectType="ICommand"/>
</ExtensionPoint>
</Addin>

And this could be the manifest for the add-in:


<Addin>
<Runtime>
<Import assembly="SampleAddin.dll"/>
</Runtime>
<Dependencies>
<Addin id="TextEditor" version="1.0" />
</Dependencies>
<Extension path = "/TextEditor/TypeExtensions/ICommand">
<Type type="HelloWorldExtension" />
</Extension>
</Addin>

середу, 5 березня 2008 р.

Google MapReduce Qt realisation. Конкурентні потоки.

Google розробка MapReduce реалізована в Qt 4.4.x. Що ж це таке і як воно працює ?

Ця розробка задумана для полегшення програмування і обчислення поширених завдань на багатопроцесорних кластерах. В Qt вона реалізована для мультиядерних систем.

API виглядає так:

QFuture mappedReduced(list, mapFunction, reducefunction);
Припустимо що нам потрібно порахувати частоту появи слів в декількох документах:
В цьому випадку map функція буде рахувати входження слів в кожному документі паралельно, а reduce об'єднає результати в фінальне значення частоти.

На вході маємо список текстів що містять документи:
QList list;
map функція бере документ і повертає хеш із данними про кількість входження кожного слова в документі.
QHash mapFunction(const QString &document);

Reduce функція братиме проміжні результати виконання map і формуватиме фінальний результат. Система забезпевить виклик reduce тільки однією map одночасно.
void reduceFunction(QHasht &finalResut, const QHash &intermediateResult);

Тепер можна використати це все разом:
QFuture<qhash >counting =  mappedReduced(list, mapFunction, reduceFunction);
Оскільки mappedReduced( ) повертає QFeature є декілька способів синхронізуатися з результатом. Найпростіший спосіб це просто викликати QFuture::result() що заблокує виконання поки результат не буде готовий. Якщо блокування не допустиме (програма має графічний інтерфейс) можна використати сигнал-слот зв'язок щоб відобразити стан обчислень та отримати результат. Також можливо зупинити обчислення QFuture::cancel().

Таким способом зручно виконувати багато поширених завдань: пошук, сортування, компресія, тощо.

Лінки:
Qt Concurrent integrated!
MapReduce was originally developed by Google to simplify writing parallel algorithms for computer clusters.

понеділок, 3 березня 2008 р.

Application settings best practices або Де зберігати налаштування вашої програми.

Швидкий огляд інтернету підтвердив мої підозри на те що для збереження налаштувань найкраще використовувати спеціальний клас що зможе зберігати, відображати, міняти та повідомляти про зміни налаштувань.
У .net є такий клас.
Для GTK є GConf.

Plugin enabled application або як пишуться плагіни.

Реалізувати підтримку плагінів для програми найпростіше використавши інтерфейси і динамічно завантажувані бібліотеки.
Та виникає декілька питань що відносяться до дизайну:
  • Як обробляти події та надавати доступ до даних, глобальних змінних.
  • Скільки контролю давати плагіну.
  • Що писати в Plugin.init().

Так виглядає примітивний додаток до плеєра Rhythmbox на мові Python
import rb
class FloonitzPlugin (rb.Plugin):
def __init__(self):
rb.Plugin.__init__(self)
def activate(self, shell):
print "Hello World"

Використано Introduction to Rhythmbox plugins

А це куб-плагін для Compiz - 3D менеджера вікон:
CompPluginVTable cubeVTable = {
"cube",
"Desktop Cube",
"Place windows on cube",
cubeInit,
cubeFini,
cubeInitDisplay,
cubeFiniDisplay,
cubeInitScreen,
cubeFiniScreen,
0, /* InitWindow */
0, /* FiniWindow */
0, /* GetDisplayOptions */
0, /* SetDisplayOption */
cubeGetScreenOptions,
cubeSetScreenOption,
cubeDeps,
sizeof (cubeDeps) / sizeof (cubeDeps[0])
};

CompPluginVTable *
getCompPluginInfo (void)
{
return &cubeVTable;
}