вівторок, 2 грудня 2008 р.

Як це: "Qt Embedded для Linux" початківцям

Еволюція

Icon - Qt Designer Device - MOTOMING A1200 blue box 120px
Після того як Trolltech був поглинутий Noki-єю та став Qt Software графічні та мультимедійні можливості цього кросплатформеного фреймворку значно розширилися. І хоч Qt for device creation існували під різними назвами вже давно позитивні зрушення стали зараз особливо помітними.

Qt Running on Three Different Mobile OS's
Збільшилася кількість мультимедійних модулів, анонсовано підтримку на Symbian S60 а це вже понад 8 млн. проданих пристроїв.


Вантажимо, Компілимо, Запускаємо
Завдяки власній системі збірки програмних продуктів дуже рідко виникають проблеми, але QtEmbedded виявився не таким інтуїтивним, і тому й з'явився цей допис. Він розрахований на людей які пробували свої сили на Qt for Desktop та хочуть так само відчути на дотик QtEmbedded.



Більшісь коду ваших стандартних додатків не доведеться переписувати для мобільних притроїв крім очевидно інтерфейсів. Але 1) необхідна "особлива" версія Qt; 2) потрібний емулятор/термінал для відображення і вхаємодіїї з мобільним софтом. 3) Linux.

Отож по порядку:
  • Вантажимо Qt for ApplicationDevelopment
    Це необхідно для того щоб зібрати віртуалний фреймбуфер. Адже він повинен запускатися на вашому звичайному комп'ютері.
    cd path/to/Qt/tools/qvfb
    make
    ./qvfb


  • Вантажимо Qt Embedded Opensource

    cd path/to/QtEmbedded
    ./configure -qvfb make
  • Запускаємо

    ./dragdroprobot -qws



Корисно прочитати:
http://doc.trolltech.com/4.4/qvfb.html

середу, 5 листопада 2008 р.

Додана кнопка "Планети разработчиков"

Участник планеты Developers.org.ua

Додана кнопка "Планети разработчиков"
Інтегруємося у спільноту!

четвер, 9 жовтня 2008 р.

Автоматичний переклад веб сторінок на Українську

Всі мабуть вже знають про http://translate.google.com/ , і про те що нещодавно туди додана підтримка української мови.

Швидко перекласти всю сторінку на українську можна додавши в закладки Firefox такий рядочок:

javascript:document.location.replace("http://209.85.135.104/translate_c?hl=uk&sl=auto&tl=uk&u="+document.location);

Найкраще розмістити це десь на панелі закладок.

Blogged with the Flock Browser

четвер, 25 вересня 2008 р.

Gentoo на довго

Сергій Лисовенко радить:

AntonG, беріть 4 - гирну флешку - скину вам дистфайли (з купою сміття) і дерево портів.
І одна маленька порада для початківців: дженту краще починати ставити з вже встановленого іншого дистрибутиву (чрутитись і бавитись).
Все робиться так:
1) ставимо якийсь інший дистр наприклад, Федору
2) в домашньому розділі (припускається, що вінт розбитий на рута, домашку і своп) створюєм каталог gentoo.
3) розпаковуєм туди stage 3 (про це вже детальніше на сторінках підручника дженти), ставим портаж, засипаєм весь мотлох. який можна засипати (дистфайли маю на увазі)
4) монтуєм і чрутимся, так , як це описано в підручнику дженти http://www.gentoo.org/doc/en/handbook/index.xml
5) компілимо все для свого задоволення і паралельно насолоджуємся роботою за тим лінуксом, якого встановили
6) наводим марафет в файлах fstab, passwd та інших - підадміністровуєм одним словом
7) завантажуємось з дистрибутивного диска в режимі рятувальника, монтуєм рутовий розділ, командою rm -rf зносимо з нього всі папки крім  /boot , /lost+found, /lib/modules. Після чого монтуєм домашку і копіюєм все з папки дженти, крім boot (думаю, не треба казати, що це робиться банальним cp -r )
8) завантажуємось з вінта, якщо зроблено все правильно - має почати вантажитись - залишиться лише підмарафетити ікси (не забудьте їх попередньо скомпілювати).

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

Взято з http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1220690222
Blogged with the Flock Browser

четвер, 21 серпня 2008 р.

Google-pertools для аналізу Qt4 програм з Unix

Google-pertools проект створений для виявлення, аналізу та видалення готових програм на проблеми повязані з виділенням пам'яті або швидкодією.

Проаналізувати швидкодію своєї просрами можна так:
  1. Програма має бути злінкована з -lprofeler. Додайте до свого .pro файлу рядок
    LIBS += -lprofiler
  2. Зкомпілюйте як завжди qmake && make
  3. Запускаємо і виконуємо критичні для швидкодії дії що підлягають аналізу:
    $ CPUPROFILE= ./some_executable
  4. Генеруємо звіт у зручному для вас форматі:
    pprof --ps ./some_executable otput_file_name.prof > report.ps

Доступні формати:
  • --text Generate text report
  • --gv Generate Postscript and display
  • --list= Generate source listing of matching routines
  • --disasm= Generate disassembly of matching routines
  • --dot Generate DOT file to stdout
  • --ps Generate Postcript to stdout
  • --pdf Generate PDF to stdout
  • --gif Generate GIF to stdout
Має вийти щось типу


середу, 25 червня 2008 р.

DNS сервер для динамічних IP адрес.

У наш час не рідкими стали варіанти підключення до безлімітних пакетів. Чому б не тримати свій домашній комп'ютер увінкненим і не отримати доступ до персональних файлів з будь-якого кутка світу (роботи).

ВСЕ ПРОСТО!

Треба мати постійний ідентифікатор в мережі (IP адресу 127.0.0.1) або ім'я (DNS example.com ).

Але ж провайдер в будьякому випадку дає вам якусь IP адресу. Роботу ускладнює тільки те що вона постійно змінюється, або провайдер інтернет не дає гарантії що вона не зміниться.


Проблему можна вирішити за допомогою DynDNS сервіса. Ідея проста: кожного разу коли ваш домашній сервер входить у мережу інтернет інформація про вашу IP адресу поновлюється на DNS сервері і будь хто може встановити прямий зв'язок з вашим комп'ютером.

Наприклад побачити/показати свою персональну сторінку ви зможете набравши в рядку адреси свого оглядача інтернет http://mycomputername.homeip.net/ або щось інше із їхнього списку стандартних доменних імен.


Для поновлення данних вже написано досить багато софта для Windows та Linux. Технологія випробувана багатьма користувачами за 10 років існування.

Прошу вибачення якщо вам здається що стання про серйозні речі написана в ламерському тоні. Буду радий відповісти на ваші питання.



Blogged with the Flock Browser

вівторок, 20 травня 2008 р.

Frame buffer vga modes

Here's a table showing frame buffer vga modes:


Color depth | 640x480 800x600 1024x768 1280x1024
-----------------+-------------------------------------
256 (8bit)| 769 771 773 775
32000 (15bit)| 784 787 790 793
65000 (16bit)| 785 788 791 794
16.7 Mill.(24bit)| 786 789 792 795

Blogged with the Flock Browser

Налаштовуємо Dual head для відеокрт фірми ATI

Оригінальне обговорення проблеми http://www.fedoraforum.org/forum/showthread.php?t=124634.


Отож
DUAL HEAD: Відкрийте термнал



su -
Тепер введіть цей текст у термінал

( Припускається що ви намагаєтесь налаштувати горизонтально розташовані монітори)

aticonfig --dtop=horizontal --overlay-on=1


тоді



aticonfig --desktop-setup=horizontal


Тепер перезавантажте X сервер.

Blogged with the Flock Browser

четвер, 8 травня 2008 р.

Встановлення Qt 4 на MacOS

Я не великий знавець MacOS 10.4.8 Tiger  і це є мій перший досвід роботи на цій ОС, та встановити Qt у мене вийшло.
Для початку краще встановити якийсь файловий менеджер з двома панелями muCommander чи xFolders.
На тій машині що мені дали уже був встановлений компілятор gcc-4.0.1
  1. Завантажуємо безкоштовну версію qt, краще в бінарній формі без рядка "src" в назві файлу.
  2. Запускаєм інсталятор.
  3. Все, готово!
Зкомпілювати щось можна командами  qmake -spec macx-g++ та make подібно Unix системам

Але для повноцінного процесу розробки схоже не вистачає Apple Xcode набору інструментів.
Щоб завантажити треба безкоштовно зареєструватися як "Розробник для Apple".

Dual Head для Відеокарт ATI на комерційних драйверах Fglrx в Linux

Для Fedora Core дуже зручно використовувати менеджер пакунків yum
Зпочатку встановіть yum-kmod розшорення а потім kmod-fglrx - комерційний ATI модуль ядра.

sudo yum install yum-kmod
sudo yum install kmod-fglrx

Всі комерційні драйвера доступні тільки з livna репозиторію.

Далі за допомогою livna-display-config графічної утиліти налаштовуємо що потрібно, зберігаємося, виконуємо 2 команди :
su -
aticonfig --dtop=horizontal --overlay-on=1
aticonfig --desktop-setup=horizontal
і перезавантажуємо графічне середовище (може вистачити logout).

Мій /etc/X11/xorg.conf
 
# Xorg configuration created by system-config-display

Section "ServerLayout"
    Identifier     "Multihead layout"
    Screen      0  "Screen0" LeftOf "Screen1"
    InputDevice    "Keyboard0" "CoreKeyboard"
    Option        "Xinerama" "on"
    Option        "Clone" "off"
EndSection

Section "Files"
    ModulePath   "/usr/lib/xorg/modules/extensions/nvidia"
    ModulePath   "/usr/lib/xorg/modules"
EndSection

Section "Module"
EndSection

Section "ServerFlags"
    Option        "AIGLX" "on"
EndSection

Section "InputDevice"
    Identifier  "Keyboard0"
    Driver      "kbd"
    Option        "XkbModel" "pc105"
    Option        "XkbLayout" "us+inet"
EndSection

Section "Monitor"
    Identifier   "Monitor0"
    ModelName    "LCD Panel 1280x1024"
    HorizSync    31.5 - 64.0
    VertRefresh  56.0 - 65.0
    Option        "dpms"
EndSection

Section "Monitor"
    Identifier   "Monitor1"
    VendorName   "Monitor Vendor"
    ModelName    "LCD Panel 1280x1024"
    HorizSync    31.5 - 64.0
    VertRefresh  56.0 - 65.0
    Option        "dpms"
EndSection

Section "Device"
    Identifier  "Videocard0"
    Driver      "fglrx"
    Option        "AddARGBGLXVisuals" "True"
    Option        "OpenGLOverlay" "off"
    Option        "VideoOverlay" "on"
    Option        "DesktopSetup" "horizontal"
    Option        "OverlayOnCRTC2" "1"
EndSection

Section "Device"
    Identifier  "Videocard1"
    Driver      "fglrx"
    Option        "AddARGBGLXVisuals" "True"
    Option        "OpenGLOverlay" "off"
    Option        "VideoOverlay" "on"
    Option        "DesktopSetup" "horizontal"
    Option        "OverlayOnCRTC2" "1"
    BoardName   "ATI Technologies Inc RV370 secondary [Sapphire X550 Silent]"
    BusID       "PCI:1:0:1"
    Screen      1
EndSection

Section "Screen"
    Identifier "Screen0"
    Device     "Videocard0"
    Monitor    "Monitor0"
    DefaultDepth     24
    SubSection "Display"
        Viewport   0 0
        Depth     24
        Modes    "1280x1024" "1280x960" "1280x768" "1152x864" "1024x768" "800x600" "640x480" "640x400"
    EndSubSection
EndSection

Section "Screen"
    Identifier "Screen1"
    Device     "Videocard1"
    Monitor    "Monitor1"
    DefaultDepth     24
    SubSection "Display"
        Viewport   0 0
        Depth     24
        Modes    "1280x1024"
    EndSubSection
EndSection

Section "Extensions"
    Option        "Composite" "Enable"
EndSection


Шкода тільки що 3D ефекти Compiz  не запрацювали нормально.

понеділок, 5 травня 2008 р.

Бази даних: ключі, індекси та складні запити.

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

До цих пір ми мали справу лише з одною таблицею у базі даних. Таблиця називалася mp3 та містила дані про mp3-файли деякої колекції. Я навмисне не став робити у цій таблиці поля, що містять ім’я виконавця або назву альбому для пісень, з одної причини.

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

Звичайно так будують схеми баз даних, я поясню що означають елементи цієї схеми.

Кожен великий прямокутник являє собою таблицю. На цій схемі їх три – mp3 (пісні у файлах mp3), albums (альбоми) та performers (виконавці).

Рядки у прямокутниках, позначені як “column” являють собою поля таблиці. Для таблиці mp3 це вже знайомі нам поля filename, title, filesize, bitrate та year. Також додане поле id, зараз поясню навіщо.

Оскільки таблиці певною мірою являють собою сукупність предметів або явищ реального світу, то об’єкти, що містяться в них, тобто рядки, мають бути унікальними. Дійсно, які б два предмети або явища ми не розглядали, між ними завжди є різниця, інакше це були б не два об’єкти, а один. Так само немає сенсу і в двох однакових рядках у таблиці, хоча, звісно, практично це можна зробити.

Для забезпечення унікальності у таблиці виділяють одне поле, що гарантовано є унікальним для таблиці і фактично визначає рядок. Це поле називають первинним ключем (primary key). На схемі первинний ключ позначається підкреслюванням та позначкою *PK.

У багатьох випадках для таблиці важко або неможливо виділити первинний ключ із інформаційних полів. Як приклад можна розглянути базу даних співробітників якоїсь установи – якщо таблиця містить Ф.І.П. робітника, дату народження, відділ, спеціальність, то яке б поле ми не брали, воно не є гарантовано унікальним – цілком можливо, що у одному відділі будуть працювати двоє людей з однаковими даними. В такому випадку рядку таблиці присвоюють ідентифікатор – деяке число, унікальне для таблиці і роблять його первинним ключем. Так ми і зробили для таблиці mp3 – додали ще одне поле id та зробили його первинним ключем. Про поля perf_id та album_id – дещо пізніше.

Так само ми створили ще дві таблиці – виконавці performers з тим самим id та іменем чи назвою name і альбоми albums з id, назвою альбому title та роком виходу year.

На схемі також видно стрілки, що показують зв’язки (залежності) між таблицями. Звісно, якщо є пісня, то вона може належати до якогось альбому. Так само вона належить якомусь виконавцеві. Для простоти задачі ми вважаємо, що пісня входить тільки до одного альбому і належить тільки одному виконавцеві. Тож до кожної пісні (рядку у таблиці mp3) ми можемо додати посилання на рядок у таблиці performers та посилання на рядок у таблиці albums. Цими посиланнями і є поля perf_id та album_id.

Якщо поле одної таблиці є посиланням на рядок у іншій таблиці, то таке поле називається зовнішнім ключем (foreign key, FK). Ця взаємодія показана у вигляді стрілки – наприклад, взаємодія таблиці mp3 з таблицею albums показана стрілкою до albums (поле у mp3 посилається на рядок у albums). Біля стрілки підписані назви ключів – зовнішній ключ у таблиці mp3 – FK_mp3_albums та первинний ключ у albums – UQ_albums_id. UQ (unique) вказує на те, що це поле унікальне (що завжди так для первинного ключа).

Числа біля стрілки (1 та 0..*) показують порядок зв’язку. так, порядок 0..*-1 означає, що одному рядку у таблиці albums відповідають нуль або більше рядків у таблиці mp3.

Також біля стрілки вказано, по яких полях іде зв’язок (album_id=id).

Тож нижче полів у прямокутниках таблиць (чорним кольором) записані ключі – первинні та зовнішні, а також ознака унікальності для первинного ключа.

З ключами розібралися (якщо це не зовсім зрозуміло, раджу перечитати ще раз, тому що це досить важливо), тепер мова піде про індекси.

Уявіть собі, що вам потрібно працювати з деякою енциклопедією. Енциклопедія являє собою набір статей. Вам необхідно швидко знаходити потрібну статтю. У цьому випадку є сенс розташувати статті у алфавітному порядку. Так само якщо вам потрібно знаходити деяке слово всередині статті, то логічно мати у енциклопедії алфавітний покажчик.

Такі самі покажчики існують і в таблицях баз даних і звуться індексами. Іх дія прозора для користувача – індекс треба створити у таблиці тільки один раз, а далі сервер сам вирішує, як і коли ними користуватися. Розглянемо приклад с таблицею mp3. Для початку приведемо її до вигляду, що його ми розглядали на початку уроку. Додамо до таблиці поля id, album_id та perf_id у phpMyAdmin на закладці “Структура”.

Після створення полів видалимо всі записи з таблиці mp3 (закладка “очистити”).

Після чого подумаємо, які індекси нам потрібні. Коли вирішують таке питання, то звичайно думають, які операції з виборки будуть проводитися над таблицею. По-перше, поле id є первинним ключем, а по ключовому полю завжди будується індекс, причому це особливий тип індексу – унікальний індекс. Якщо у таблиці є поле з унікальним індексом, то сервер не дозволить вставити у таблицю рядок зі значенням цього поля, що є у таблиці.

Оскільки ми маємо зв’язувати цю таблицю по полях album_id та perf_id з таблицями albums та performers, то нам необхідно буде робити виборки по цих полях. А отже, необхідні індекси для цих полів. Створення індексу по полю виконується у phpMyAdmin кліком по піктограммі зразу справа від піктограмми створення первинного ключа. Тож створимо індекси для цих двох полів. В результаті у списку індексів будемо мати:

На перший погляд може здатися, що оскільки створення індексу значно підвищує швидкість виборки з таблиці, то можна відразу створити індекси по усіх полях. Насправді це не дуже гарна ідея. Якщо розглянути приклад з енциклопедією, то індексація (тобто алфавітний покажчик чи розташування статей у алфавітному порядку) безперечно збільшує швидкість пошуку. Проте якщо стоіть задача додавання до енциклопедії нових статей, їх видалення або редагування, то більша частина часу цих операцій буде припадати саме на оновлення індексу – наприклад, додавання номера сторінки до багатьох позицій алфавітного покажчика. Так само відбувається і з таблицями баз даних. Що більше індексів має таблиця, то більша швидкість пошуку в ній, але й менша швидкість додавання, видалення та зміни рядків. Тож індекси доцільно створювати лише по тих полях, по яких безпосередньо йде пошук, а саме по тим, що будуть вказуватися у умові WHERE sql-запитів. Насправді швидкість виборки з таблиці по проіндексованому полю майже не залежить від кількості рядків у ній.

Тепер розглянемо запити не по одній таблиці, а по двох чи більше. Для цього створимо вже описані таблиці albums та performers. Для цього перейдемо безпосередньо до бази multimedia та створимо таблиці так само, як ми створювали таблицю mp3 пару уроків тому. Створимо також первинні ключі з поля id у цих таблицях.

Для того, щоб було на чому тренуватися, додамо пару рядків у кожну таблицю. Зверніть увагу, що ключ id у нас унікальний, тому повторень у цьому полі не може бути. В поле id будемо записувати числа за порядком – 1, 2, і т.д. Виходячи з mp3, що є зараз на моєму комп’ютері, в мене вийшли такі таблиці (у вас, залежно від вашого музичного смаку, скоріш за все вийдуть інші):

Зверніть увагу, що хоча тут і є деяка відповідність – альбом з id=1 належить виконавцеві з id=1, і альбом з id=2 належить виконавцеві з id=2, проте це не є правило, а просто співпадіння через те, що у розгляд я взяв лише кілька пісень. Тобто id у таблиці albums та id у таблиці performers не пов’язані аж ніяк. 

Тут зверніть увагу на те, що значення у полях album_id та perf_id вказують на саме ті id у таблицях albums та performers, яким належать відповідні пісні, наприклад, перший рядок має album_id=2, це значить, що він належить до альбому з id=2, тобто Angel’s Egg.

Тепер, коли в нас є деякий матеріал для практики, розглянемо, які sql-запити ми можемо виконувати для цих даних. Згадаємо, як ми робили виборку (SELECT) з одної таблиці. Це було приблизно так:

SELECT filename FROM mp3

Такий запит значив виборку усіх полів filename з таблиці mp3. Тепер поставимо задачу вивести назву пісні та її виконавця. Я покажу формування запиту по кроках. По-перше, нам треба об’єднати у FROM дві таблиці:
... FROM mp3, performers ...

Тепер нам треба визначити які поля вибирати:
SELECT title, name FROM mp3, performers ...

Тепер нам треба зв’язати ці дві таблиці:
SELECT title, name FROM mp3, performers WHERE mp3.perf_id=performers.id

Тобто в перекладі на людську мову цей запит може звучати так:

“вибрати поля title та name з таблиць mp3 та performers, причому так, щоб поле perf_id рядка таблиці mp3 дорівнювало полю id таблиці performers.”

Насправді умова mp3.perf_id=performers.id реалізує згаданий вище зовнішній ключ – зв’язок між таблицями mp3 та performers по полям id=perf_id.

Будь ласка, якщо цей матеріал хоч трохи незрозумілий – перечитайте ще раз та спробуйте зрозуміти його як можна глибше, тому що це базові речі, які бажано розуміти на рефлекторному рівні.

Якщо ж це зрозуміло – розглянемо виборку з трьох таблиць. Виберемо всі назви пісень з іменами їхніх виконавців та альбомами, до яких вони належать. sql-запит буде виглядати так:

SELECT mp3.title, performers.name, albums.title

FROM mp3, performers, albums

WHERE mp3.album_id=albums.id AND mp3.perf_id=performers.id

Деяка складність тут полягає у тому, що деякі поля (наприклад, id або title) мають однакову назву у різних таблицях. Тому, щоб було точно відомо, які саме поля ми маємо на увазі, ми додаємо назву таблиці перед назвою поля через крапку. 

Якщо ми хочемо, щоб назви стовпчиків у таблиці результату мали іншу назву (тут ми не можемо сказати, який title що означає), ми можемо скористатися так званими аліасами (alias). Аліаси вказуються після назви поля чи таблиці зі словом AS:

SELECT mp3.title AS song, performers.name AS performer, albums.title AS album

FROM mp3, performers, albums

WHERE mp3.album_id=albums.id AND mp3.perf_id=performers.id

Звісно, ми можемо додавати і інші умови до цього запиту, наприклад виберемо те саме, але щоб пісні були не старшими 1990-го року:
SELECT mp3.title AS song, performers.name AS performer, albums.title AS album

FROM mp3, performers, albums

WHERE mp3.album_id=albums.id AND mp3.perf_id=performers.id

AND mp3.year>1990

 

Тож що ми засвоїли на цьому уроці.

  1. Рядки у таблицях мають бути унікальними. Запорукою унікальності є первинні ключі
  2. Таблиці можуть мати зв’язки по деяких полях, ці зв’язки називаються зовнішніми ключами
  3. По полях таблиць можна створювати індекси, що збільшують швидкість пошуку в таблицях
  4. Можна будувати запити для кількох таблиць, об’єднуючи іхні рядки за допомогою зовнішніх ключів

Передерто з http://www.ua-admin.com/

вівторок, 8 квітня 2008 р.

Запис і конвертація відео з робочого столу Linux

Для гнома є така чудова штука gtk-recordMyDesktop - можна записувати відео з робочого столу без додаткового навантаження на процесор.
Все буде чудово відтворюватися на будь-якому Linux але Windows ...

Тому кодуємо це все добро в простіший формат

mencoder <вхідний файл>.ogg -o <вихідний файл>.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=800 -oac mp3lame


Мій файл відтворився на голій вінді без будь-яких додаткових кодеків.

вівторок, 1 квітня 2008 р.

Flock веб переглядач

Цей пост написаний у внутрішньому редакторі постів :) Flock бравзера.

Товстий та інші шришти змінюються дуже швидко, це вам не веб живий.

  • списки
  • різні
  1. нумеровані
  2. і не дуже
    спеціальне перенесення
  3. ....
Посилання на себе

От тільки вставити зображення цей редактор намагається тільки з інтернету а не з локальної робочої станції.
Blogged with the Flock Browser

вівторок, 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;
}

понеділок, 25 лютого 2008 р.

Відновти Grub після того як була змінена таблиця розділів чи потертий MBR (головний завантажувальний запис)

  1. Завантажуємся з чого небуть з ліцензією GPL
  2. Монтуємо розділ на якому GRUB зберігав налаштування свої. (скоріше всього твій єдиний Linux розділ)

Перший варіант ручний:

  • sudo grub
  • find (шлях до змонтованого розділу)/boot/grub/stage1
    виведе щось типу (hd0,1) - список розділів на яких були встановлений груб.
  • root(hd0,1) - вказуємо розділ на якому збережена конфігурція.
  • setup(hdo) - нарешті встановлюємо груб.
  • quit
Простий варіант:

/sbin/groob-install --root-directory=DIR /dev/sda

Компіляція Mono для Ubuntu 7.10 amd64

Оскільки Mono розвивається дуже швидко і розробники Ubuntu не завжди встигають за змінами виникає потреба в компіляції mono з svn co svn://anonsvn.mono-project.com/source/trunk/mono*.

$ svn co svn://anonsvn.mono-project.com/source/trunk/mcs
$ svn co svn://anonsvn.mono-project.com/source/trunk/mono
$ svn co svn://anonsvn.mono-project.com/source/trunk/gtk-sharp
$ svn co svn://anonsvn.mono-project.com/source/trunk/gnome-sharp
$ svn co svn://anonsvn.mono-project.com/source/trunk/olive
$ svn co svn://anonsvn.mono-project.com/source/trunk/moon
$ svn co svn://anonsvn.mono-project.com/source/trunk/monodoc
$ sudo apt-get install libavcodec0d libavformat0d libgtk2.0-dev libnspr-dev firefox-dev libavcodec-dev libavformat-dev libasound2-dev librsvg2-dev
$ sudo apt-get install autoconf automake libtool build-essential bison libgtksourceview* libglade*-dev
$ sudo apt-get install prevu
$ sudo prevu-init
Налаштовує середовище для білда. Це може зайняти деякий час.

$ apt-get remove mono-common
$ apt-get install build-essential pkg-config libglib2.0-dev bison libcairo2-dev libungif4-dev libjpeg62-dev libtiff4-dev
Завантажити і зкомпілити libgdiplus.

$ sudo apt-get install mono-mcs
будемо компілити з ubuntu версією компілятора.

Далі стандартно:
$ confugure
$ make
$ sudo make install

(перевірено, взято з форуму ubuntu)

Перед компіляцією gtk-sharp та іншших додатків залежних від моно важливо не забути

$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

Це допоможе уникнути помилку на етапі конфігураціїї
"You need to install either mono or .Net"


Порядок компіляції :
  1. mono + mcs
  2. gtk-sharp
  3. monodoc
  4. mono-tools
  5. gtk-sharp
  6. gnome-sharp
  7. gtksourceview2-sharp
  8. monodevelop
Все зкомпілилось ідеально, крім Firebird і NUit модулів.

Оце почав я свій блог. Модно зараз ;)

Привіт всім хто скоріше всього випадково потрапив на цю сторінку.
На створення блогу автора спокусила можливість публікування зображень. Google Picasa для цього не дуже придатна.
Мета цього блогу : описувати основні подіі і думки з мого життя. Сподіваюся мій досвід стане вам у пригоді.

Інший мій блог задумувався як вело - персональна сторінка. Також можете подивитися ;)