Archive for November, 2005

Ме боли грбот

Лево од рбетот има една точка која цела недела ме боли. Погодете од што? :) Епа сите се жалат од рбетни болки, спондилоза и слично и упорно седат пред компјутер.

Оваа недела е навистина сочна. Вчера презентацијата во Климент беше лудници. Имаше малишани и малишанки (повеќе имаше девојчиња), кои се заинтересираа за Линукс. Кога Виктор рече „Ај да видите како се играат игри под Линукс!“ како рој од мравки се насобраа околу Виктор. Сликавме 15тина слики и се надевам да ги добијам денес/утре па да ги објавам :) Инаку утре имаме презентација во Техничко училиште. Благодарност до: проф. Мирко од ЕМУЦ-от во Битола, професорот по Информатика во Климент Охридски, професорот по Информатика во Елпида Караманди и Оливер од Биротех. Сите на овој или оној начин помогнаа и придонесоа за развој на групата и свеста за ГНУ/Линукс кај младината. Се надевам уште од мали ќе почнат да „баратаат“ со Линукс базирани системи и општо со слободен софтвер па еден ден и тие ќе држат презентации. Прекрасно е кога создаваш, а не кога рушиш. Така јас оваа недела создадов многу. Поздрав до сите членови на Лугола кои кажаа „БРАВО“ за презентацијата, поздрав до Симона која ме поддржува секогаш и секогаш вика „БРАВО!“ и поздрав до моите кои никогаш не забораваат да кажат дека се гордеат со моите активности и ми велат „БРАВО!“. Тоа мало БРАВО значи многу. А од мене, Браво за сите кои не Ни велат Браво! :)

Благодарам

Python ownz

По препорака на Јосип ѕирнав малку во Python. Супер е. Веќе почнав да го учам. Досега сум на основно ниво. Ќе продолжам од утре понатаму. Пајтон може да се комбинира со С++ и пред се со Qt :) Закон. Се надевам ќе биде Ок се. Ако некој знае добар извор на ПДФ/ХТМЛ книги нека пише…

Утре треба да го печатам постерот и ќе имаме презентација во Климент Охридски. Па така…ќе биде забавно.

Поздрав

Итс бин а бед деј

Навистина лош ден. Некако депресивен. Не дека е нервозен ама депримира. Секој втор се жали од сложеноста на денот.

Како и да е, La vita e bella!

Животот е убав...и смешен!

Падна снег

Врни снег! :(

Bowling for Columbine

Со оглед на тоа што филмот е одамна “so yesterday”, а јас го гледав дури сега, морам да ви ги кажам моите впечатоци. Едноставно филмот е прекрасен. Не е толку тежок како Ф9/11 за следење, едноставни брзи податоци кои даваат слика за тоа што да очекуваме од материјалистичкиот империјализам на Men in Black. Добро беше што Мур ги спомна Англичаните како убијци и тирани низ историјата, добро беше што покажаа слики од Индијци под пендраците на Британските идиотски колонизатори. И уште еднаш тие што го креваат британското знаме за да покажат колкави панкери и анархисти се, не заборавајте да купите Зипо. Со Зипо работите полесно се запалвуаат и подобро горат. Филмот е фантастичен! На моменти ми лазеа морници, мравки, прелетуваа тетреби…живи снимки, слики, интервјуа…се на се, прекрасно. Браво Мур! И ми дојде една идеја. Да донираме сите по некој милион долари и да го натераме Мајкл Мур да сними филм за договорот на МС со Владата, а? Веројатно ќе ископа работи што никој сега не ги знае? Или ќе му оди на Макрадули и директно в канцеларија ќе го праша што се случи воопшто? Viva Moore!

Qt Упатства, VI дел - 1 поддел

Базите на податоци се неизбежен дел од работата на 50% од апликациите што се во употреба, без разлика на тоа дали се работи за слободен или неслободен софтвер. Qt како моќен тулкит овозможува прекрасно поврзување на вашите апликации со повеќе типови на бази на податоци. Користејќи ги драјверите за MySQL, PostgreSQL па се до Sqlite. Во ова упатство за работа со бази на податоци ќе развиеме апликација која ќе вчита податоци од MySQL база, а потоа на лесен начин ќе овозможиме пребарување низ записите во табелите на базата. Целото упатство.

Qt Упатства, V дел

Работа со датотеки

QFile, QSettings

Често кога работи на одреден проект програмерот доаѓа во ситуација да прочита или запише одредена информација во датотека. Тоа може да се податоци кои ќе даваат информација која во повеќе наврати се повторува. На пример, нема потреба од постојано прашување на вашето име и презиме на секое активирање на програмата. Тоа може да се зачува во датотека и следниот пат програмата да го прочита од таа датотека тоа што му е потребно.

Овој пат ќе разгледаме две класи кои се грижат такви слични податоци да се зачуваат за покасно користење. QFile е класа која нуди секакви можности за манипулација со датотеки. Читање, запишување, отворање, проверка дали постои датотека, права на запис/читање и слично. Се она што може да се прави врз една датотека го обезбедува QFile. Како пример би навел неколку методи кои произлегуваат од оваа класа, name() - го дава името на датотеката, extists() - проверува дали датотеката постои, remove() - бриши датотека, open() - се обидува да отвори датотека – при што враќа true ако обидот е успешен и false ако не е. Има и методи преку кои може да се читаат податоци внесени под други кодни страни (cp1251, utf-8/16, итн.).

Следува мал пример за тоа како треба да се зачува текстот внесен во QLineEdit објект на наша програма во датотеката lineEdit.txt. За да не го пишувам цел стандарден код ќе ја напишам само класата која при повикување ја остварува целта која е потребна:

  1. void ClassName::writeInFile()

  2. {

  3. QString stringRead(qLineEdit->text());

  4. QFile file(lineEdit.txt);

  5. if(file.open(IO_WriteOnly | IO_Append) {

  6. QTextStream fileStream(&file);

  7. fileStream<<stringRead<<endl;

  8. file.close();

  9. }

  10. fileStream.unsetDevice();

  11. }

Најпрво одредуваме еден објект од тип QString кој ја прима вредноста на објектот qLineEdit. Ова не е задолжително со таа разлика што наместо ‘fileStream‘ да ја вчита (<<) вредноста на stringRead, би ја вчитала вредноста на qLineEdit->text(). Заради тоа што QFile објектите може да се сметаат како објекти за манипулација со влезно/излезни единици (датотеките), користиме QTextStream за читање на вредностите кои произлегуваат од излезот на датотеките. Откако го правиме записот ја затвораме датотеката. Штом се отвора мора да се затвори, нели? И потоа го ослободуваме уредот (unsetDevice()). Тоа што би било внесено како вредност во QLineEdit објектот qLineEdit ќе биде запишано во датотеката lineEdit.txt. Кога го дефинираме објектот file, во конструкторот го ставаме името на датотеката. Ако нема патека за тоа каде се наоѓа датотеката, тогаш при извршување на извршната датотека од конзола, датотеката lineEdit.txt е креирана од тековниот директориум (најверојатно од директориумот на проектот), а доколку ја активираме со двоен клик тогаш датотеката ќе се креира во ~ (/home/user/) директориумот. Имаше еден мал проблем, впрочем не беше проблем како пропуст туку јас не знаев оти тоа е така. Откако ќе ја напишев патеката на датотеката и извршев запишување во неа (а изворната дадотека стартувана со двоен клик, konqueror), и покрај тоа што имаше цела патека, датотеката се запишуваше во мојот домашен директориум. Тогаш кога работев на проектот знаев зошто бидејќи најдов на Интернет некои информации, сега заборавив. Ако некој знае зошто нека каже.

Читањето е речиси идентично. Сами разгледајте и видете како би се остварило тоа. Да не повторувам ако имате прашања или нешто не разбирате од ова што го пишувам слободно контактирајте ме.

На ред дојде класата QSettings.

Тоа е класа со која се запишуваат вредности на подесувања. Пример, имате нешто вакво:

  • Име и презиме:

  • Поштенски број:

  • Пол:

  • Телефон:

Ова се типови на податоците кои најчесто се бараат (QString, int, bool). Замислете да ги внесувате секој пат кога активирате одредена програма. Начисто би полудел (дури и повеќе од сега). Дали ви се познати оние rc датотеки, својствени за речиси сите можни апликации што ги користите под ГНУ/Линукс. Тоа се конфигурациони датотеки во кои стојат податоци за програмата која ја поседува одередената датотека. Еве како би изгледала една таква за нашите податоци:

[name_surname]

name=Aleksandar

surname=Balalovski

[personal_data]

zipcode=7000

sex=1

phone=0800232312

Следниот пат програмата нема да ги поставува истите прашања, но ќе ги вчита од датотеката. Како што можиме да видиме, постојат две категории, name_surname и personal_data. Ако ги распоредиме како дрво тогаш тоа би изгледало вака:

    • name_surname/name

      /surname

    • personal_data/zipcode

        • /sex

          /phone

Сега да видиме што му е потребно на QSettings да знае за тоа што сакаме да го внесиме. Најпрво треба објект.

QSettings settings;

Потоа треба да го употребиме методот setPath(); од класата QSettings за да ги подесиме дополнителните информации, домен, производ и начин на запишување на информациите (Глобално или кориснички). Па така добиваме:

settings.setPath(“ApplicationName”, “www.app.org”, QSettings::Global);

Првиот аргумент е името на апликацијата, вториот е некој си домен не знам точно зошто овој аргумент служи но ете секогаш го ставам. Третиот му кажува на класата QSettings да ги запише податоците на глобално ниво. Така кон нив ќе може да пристапат и другите корисници на системот, но и ќе може да се читаат и кога апликацијата ќе се активира од конзола или со глувчето (двоен клик). Следува запишувањето на податоците што треба да се зачуваат:

settings.writeEntry(“/name_surname/name/”, “Aleksandar”);

settings.writeEntry(“/name-surname/surname/”, “Balalovski”);

settings.writeEntry(“/personal_data/zipcode”, 7000);

settings.writeEntry(“/personal_data/sex”, 1);

settings.writeEntry(“/personal_data/phone”, “0800232312”);

Одете во директориумот /home/username/.qt/ каде ќе ја најдете датотеката поврзана со името на вашата апликација. Отворете ја за преглед. Треба да изгледа како претходно опишаната ситуација:

[name_surname]

name=Aleksandar

surname=Balalovski

…итн.

Првиот, вториот и петтиот запис се од тип QString, третиот од тип integer, четвртиот тип boolean. Сега записите се зачувани. Што е потребно за да ги вчитате записите и да ги дадете на некоја променлива/објект? Методот readEntry(). Овој метод е предефиниран неколку пати, речиси за сите можни типови податоци што може да ги враќа. Како прв аргумент го прима елементот од кој треба да прочита вредност, а како втор дефинира стандардна вредност во случај елементот да нема вредност. За да ги прочитаме првиот третиот и четвртиот елемент од нашиот пример треба да го напишеме следниот код:

QString name=settings.readEntry(“/name_surname/name/”, “NemaIme”);

bool pol=settings.readEntry(“/personal_data/sex/”, 1);

int zipCode=settings.readEntry(“/personal_data/zipcode/”, 0);

Така објектот name ќе добие вредност “Aleksandar”. Ако немаше вредност „Aleksandar”, објектот name ќе добиеше вредност “NemaIme”, исто и со останатите два. Значи readEntry() може да чита QString, boolean, int и други типови податоци кои стојат во елементите кои претходно иницијализирани. Манипулирањето со податоците што ги внесувате и потоа вчитувате останува на вас, во зависност од потребите на вашата апликација.

  1. Задача:

    Напишете програма која ќе бара лозинка за авторизација на влез. Доколку лозинката е точна нека се појави QMessageBox дијалог со испис „Лозинката е точна“/”Lozinkata e tocna”.

Овие две класи се доволни за работа со информации што треба да ги чувате во датотеки. Но што ако е потребно да се добијат само информации за самата датотека. На пример, дали таа постои, дали има можност за запишување во неа па дури и да се избриши од дискот. За тоа се грижи класата QFileInfo. Таа дава едноставни информации за посочена датотека. Како што кажав, може да ви ги даде сите можни информации за датотека што ви требаат. Со оглед на тоа што оваа класа е навистина лесна нема да навлегувам во подробности. Еве еден мал пример за тоа како да проверите дали одредена датотека постои и која е нејзината наставка (екстензија):

QFileInfo fi( “/home/user/archive.tar.gz” );

if(fi.exists())

QMessageBox::information(this, “Application”, trUtf8(“Датотеката постои”));

else

QMessageBox::information(this, “Application”, trUtf8(“Датотеката не постои”));

QString extension;

extension=file.extension();

QMessageBox::information(this, “Application”, trUtf8(“Екстензијата е “+extension));

Информации на цел директориум и манипулација со директориуми, разгледајте ја класата QDir. Толку овојпат.

Александар Балаловски

aleksandar.balalovski AT gmail.com

Земете пушки патроли

…и револвери. Пред некое време една од битолските НВО-и реализира проект за отворање на Интернет кафе кое ќе користи Мандрива Линукс. Идејата беше супер. Дури и Лугола беше поканета како група да учествува на отворањето, каде испрати еден претставник поради неможност на останатите. Она што ме нервира е тоа што човекот што ги администрира компјутерите е поранешен консултант и корисник на услугите на групата, но да напоменам никогаш и член на групата. Супер! Јас кога би бил на негово место би кажал Фала на тие кои ми помагаа додека ги учев основите на ГНУ/Линукс. Навистина нефер. За Лугола која како група сеуште се развива навистина афирмацијата може да и’ годи, да не зборуваме за приливот на средстава кои можат да се влеат на сметка на групата. А пак за дотичната НВО…дали тоа беа непрофитни според статут? Мислам дека веќе се каам што не се регистриравме како НВО. Особено Битола, тој дел непрофитна е напишан со онаа опција на фонтот…како се викаше…Strikeout!

Човеколики кучиња

Еве еден доказ за тоа колку Дарвин бил заблуден. Имено на сликата можете да видите човеколико куче. Тоа е еден добар пример за тоа дека човеколикиот мајмун не е претходник на човечката раса. Поентата е, најпрво кучето е многу интересна раса на изглед, изгледа како човек, куче и во фацата како прасе, а второ, ако Дарвиновата теорија е точна тогаш ќе излезе дека можеби сме настанале од кучиња, и што потоа? :)

Нов другар

Вчера имавме презентација и супер беше навистина Лугола поактивна не била и дури сега ги гледам плодовите на групата на која уште малку и фали да созрее. Интересно беше како со основците се обидовме да не употребуваме професионални термини, па така наместо „плаќање на лиценца“ во една прилика реков „нема да одите в затвор“ хахаха Инаку си најдов ново другарче, се вика Иван, еве слика. Сега треба да дојди да му кажам што е БИОС и како се инсталира Линукс :)

Така, добро е, има работа и со факултетот нервози, баш човечки…во духот на човештвото.

Next Page »