Krzysztof Wesołowski Programowanie, elektronika, automatyka – doświadczenia i projekty

9maj/10

Zapisywanie ustawień aplikacji – QSettings w QT

Kontynuując tradycję rzadkich wpisów o ciekawych rzeczach które warto poznać/wykorzystać chciałbym wam przybliżyć trochę klasę QSettings. Do tej pory większość moich aplikacji nie potrafiło sensownie obsługiwać pamiętania różnych drobiazgów między uruchomieniami. Często najważniejsze rzeczy zapisywano w jakimś "własnym" typie plików, podczas gdy cała reszta była resetowana po każdym uruchomieniu.

Klasa QSettings rozwiązywała część tych problemów - pozwalając skierować grupę ustawień do pliku/rejestru. Niestety, pierwszy wymyślony sposób ich użycia stał się bardzo szybko uciążliwy - zapisywanie setek ustawień w jednym miejscu, pilnowanie aby odczyt zgadzał się z zapisem - jak łatwo się domyślić szybko stało się to nie do opanowania.

Niedawno czytając dokumentację, i stając przed podobnym problemem znalazłem sensowniejsze podejście - wraz z dostarczonymi metodami pozwalające zminimalizować nakład pracy.

Zacznijmy od samego początku naszego programu, dostarczając parę istotnych informacji:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QApplication::setOrganizationName("RainLabs");
QApplication::setOrganizationDomain("rainlabs.pl");
QApplication::setApplicationName("Orbi Eye");
QApplication::setApplicationVersion("0.2 alpha");

AutoPhotoAdvanced b;
b.setWindowTitle(QApplication::applicationName()+" v"+QApplication::applicationVersion());
b.show();
return a.exec();

}

Po takim wywołaniu każda klasa potrzebująca skorzystać z ustawień może to zrobić niezwykle szybko i wygodnie - np. w konstruktorze/destruktorze, za pomocą:

QSettings settings;
settings.setValue(....) / settings.value(...)

dzięki takiemu podziałowi każde ustawienia są niezależne, zaś dokonane na początku ustawienia aplikacji pozwalają korzystać z domyślnego konstruktora, co ułatwia ich używanie w całym programie, nie uciekając się do kopiowania kawałka kodu tam i z powrotem lub co gorsza pamiętania jakie argumenty przekazać za każdym razem konstruktorowi.

28mar/10

Darmowe mapy do użytku komercyjnego?

Wielokrotnie przygotowując projekt uwzględniając jakiekolwiek zależności geograficzne potrzebowałem mapy. Często dowolnej, przykładowej. Pomijając już użycie jako programista - ile razy potrzebowałeś mapy do potrzeb projektu graficznego?

Większość z nas nie zastanawia się kto jest właścicielem map które "za darmo" ogląda się w sieci. Zarówno w przypadku GoogleMaps, portalu zumi.pl czy innych serwisów związanych z mapami, nawigacją sytuacja jest niestety trudna. Właścicielem map są najczęściej duże firmy kartograficzne, czerpiące zyski z tytułu posiadania praw majątkowych do tych map. Nawet zrobienie PrintScreena takiej mapy może zakończyć się wycieczką na salę sądową - oczywiście im większą "korzyść" my z tego tytułu odniesiemy (lub im większa mogą odnieść wygrywając z nami) tym bardziej jest to prawdopodobne.

Kończąc to czarnowidztwo chciałbym polecić wam idealne rozwiązanie takich problemów - serwis http://www.openstreetmap.org/. Zawiera on dokładne mapy większości miejsc na ziemi, i umożliwia ich eksport w olbrzymiej ilości formatów. Najważniejsza jest jednak licencja - Creative Commons, BY-SA. dopuszcza ona także użytek komercyjny (a takim jest chociażby mapka dla uczestników dowolnego eventu), oraz tworzenie dziel pochodnych (czyli np. wplatanie ich w inne publikacje). Linkuję jeszcze link do FAQ na temat kwestii prawnych: http://wiki.openstreetmap.org/wiki/Legal_FAQ.

Mam nadzieję, że dzięki tej wiedzy unikniecie zbędnych wątpliwości/kłopotów, promując przy okazji kolejną świetną inicjatywę.

27lut/10

Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3

Na blogu znajomego zamieściłem wpis na temat związany z nowoczesnymi mikrokontrolerami z którymi ostatnio miałem doczynienia - zapraszam do lektury.

Link: Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3

2lut/10

System sprzedaży biletów na Bal Elektryka 2010

W okresie grudnia uczyłem się trochę Symfony (akurat było to 1.4.1 i Doctrine). Wynikiem i powodem zabawy był system sprzedaży biletów na tegoroczny Bal Elektryka.

Główną inspiracją był system Balsit, stworzony przez Rafała Bednarza na Bal w roku 2009. W przypływie nadmiernej chęci do pacy stwierdziłem, że można go napisać od nowa, rozbudowując niektóre możliwości/zmieniając funkcjonalność.

System składa się z front-endu do rejestracji gości - każdy chcący kupić bilet rejestrował się na komputerze, członek naszego samorządu sprawdzał poprawność wpisanych danych. Użytkownik otrzymywał unikalny numer, potrzebny zaraz przy następnym stanowisku.

Sprzedawca obsługiwał system sprzedaży - kupujący wybierał miejsce, wpłacał należność i otrzymywał wypisany bilet. Relacje tworzone były automatycznie, system ułatwiał sprzedaż biletu parom.

Całościowo  umożliwił osiągnięcie tempa powyżej 2 biletów na minutę :)

Sam system nie wykorzystywał innowacyjnych pomysłów - po prostu wykorzystywał wielkie możliwości frameworka :)

Załączam skompresowane źródła, włącznie z użytym Symfony 1.4.1: balsit 0.8.

19gru/09

Modelowanie urządzenia hamującego lądujący samolot

Sprawozdanie dotyczące modelowania urządzenia hamującego samolot. Skupiono się w nim na aspektach takich jak modelowanie fizyki pomiędzy oddziaływającymi elementami, oraz ewentualne modyfikacje mające wpływ na działanie całego systemu.

Jest również jedyne moje  sprawozdanie z zadań 5,6,7,8, gdyż pozostałe mogły być dostarczone bez opisu - jako działające modele.

Sprawozdanie 5 - Modelowanie urządzenia hamującego lądujący samolot (1/2)

19gru/09

Prototypowanie sterownika dla robota APR-20

Kolejne, jeszcze krótsze sprawozdanie. Tym razem sterownik pozwala niezależnie sterować wszystkimi 5 serwomechanizmami w robocie. Sterownik jest o tyle prymitywny, że nie umożliwia zadawania żadnych trajektorii. Z informacji przez nas uzyskanych wynika, że taki prawdziwy sterownik stworzymy w bliżej nieokreślonej przyszłości :)

Sprawozdanie 7 - Prototypowanie sterownika dla robota APR-20