CodeStat
December 10, 2012, 5:32 PM in Programming, Qt

Dzisiaj chciałem przestawić prosty programik który napisałem 1.5 roku temu jeszcze raczkując w Qt i który ostatnio doprowadziłem do użyteczności – CodeStat.

Program służy do badania paru faktów na temat kodu programów. Podaje informacje o ilości linijek pustych, z komentarzem oraz z kodem w danym pliku. Potrafi szukać w wielu folderach i podfolderach naraz.

System pozwala na wybieranie jakiego rodzaju pliki powinny być brane pod uwagę podczas skanowania folderów, a jakie ignorowane. Do znajdywania komentarzy używane są wyrażenia regularne.

Istnieje możliwość zapisania stworzonych statystyk do kilku formatów: HTML, CSV, Textile. Nie ma problemu z dodawaniem nowych formatów, są one definiowane w plikach .json.

Program można ściągnąć stąd: instalator lub zip

Kod dostępny jest na githubie razem ze specyfikacjami plików json, zachęcam do wysyłania mi dodatkowych filtrów i formatów eksportu.


Sterowniki SensorKinect i Windows 8
November 26, 2012, 9:33 PM in Technology, Windows

Jakieś dwa tygodnie temu postanowiłem wykonać upgrade Windows 7 na 8 (nie narzekam), wszystko przebiegło bezboleśnie ale dzisiaj odkryłem, że w przeciwieństwie do 7, Windows 8 nie widzi sterowników do Kinecta.

Ponieważ programuję w C++, nie używam Kinect SDK, a sterowników stąd. Okazuje się, że problemem są podpisy cyfrowe dla sterowników. Oto jak (w miarę) szybko ominąć ten problem:

Potrzebny nam będzie program o nazwie “inf2cat” który wygeneruje nam Security Catalog (plik .cat). Okazuje się że Microsoft udostępnia nam ten pliczek za darmo, wymagane jest “tylko” ściągnięcie ważącego 300 MB WDK (Windows Driver Kit). Po ściągnięciu i instalacji wchodzimy do folderu sterowników i wykonujemy:

  1. inf2cat /driver:"." /os:8_X86,8_X64

Jeżeli wszystko przebiegło pomyślnie powinniśmy zobaczyć

  1. Catalog generation complete.

Następnie musimy wyłączyć sprawdzanie certyfikatów dla sterowników:

  1. bcdedit /set LoadOptions DDISABLE_INTEGRITY_CHECKS
  2. bcdedit /set testsigning on

Teraz restartujemy system, podłączamy Kinecta, wskazujemy sterownik i instalujemy go.
Teraz pozostaje nam tylko włączenie sprawdzania certyfikatów (trzeba być bezpiecznym).

  1. bcdedit /set LoadOptions DDISABLE_INTEGRITY_CHECKS
  2. bcdedit /set testsigning off

Gotowe!


Nowy telefon
May 22, 2011, 11:42 PM in Personal, Qt

Telefon którego używałem do wczoraj – Nokia e63, zakupiłem w listopadzie 2009, nie był więc taki stary, chociaż w świecie elektroniki półtora roku to niemało, zaczynało mi brakować w nim pewnych funkcjonalności no i ekran mógł być większy. Jednak nie byłem aż tak zdeterminowany by kupić nowy telefon (brak środków pieniężnych też był tutaj czynnikiem). Sytuacja jednak się zmieniła, bo od wczoraj jestem właścicielem nowiutkiej Nokii N8, do tego zapłaciłem za nią 0 zł. Ale zacznijmy od początku.

Był wtorek, 29 marca 2011, jeżeli dobrze pamiętam to pogoda była całkiem ciepła, co dziwne bo zima w tym roku była bardzo długa i mroźna. O godzinie 12 skończyłem wykłady i na rowerze pojechałem pod halę Expo gdzie odbywały się Akademickie Targi Pracy. Pojechałem tam bardziej w celach rozpoznawczych niż zawodowych (no i oczywiście po darmowy stuff ;)), wiadomo że nie ma ofert pracy dla studenta II roku. Wypełniłem kilka formularzy na praktyki (nikt się do mnie nie odezwał, nie wiedzą co tracą :P), moją uwagę zwróciło stoisko firmy Comarch (nie tylko dlatego, że rozdawali jedną z moich ulubionych zabawek – jo-jo), gdzie można było wypełnić quiz z wiedzy o C++, a najlepsze osoby miały zostać zaproszone na warsztaty pod tytułem “Qt Declarative UI i Qt Mobile” w maju. Ponieważ lubię się sprawdzić, lubię Qt oraz długopis po wypełnieniu quizu można było sobie zostawić – wypełniłem quiz… i w sumie zapomniałem o sprawie. Gdzieś tam na początku maja przypomniał mi się ten quiz, ale uznałem że jakby mieli mnie zaprosić to już by to zrobili. Okazało się że oni o mnie nie zapomnieli i 17 maja otrzymałem maila, że “Podczas targów (…) okazałeś się jednym z lepszych kandydatów, dlatego teraz chcielibyśmy zaprosić Cię do wzięcia udziału w warsztatach (…)”. Bardzo się ucieszyłem, że mój zakres wiedzy C++ jest “jednym z lepszych” i zapisałem sobie datę (21 maja) w kalendarzu.

W dzień warsztatów pojawiłem się w budynku Lodex (przy okazji Politechnika ma piękny kampus, może to tylko ja, ale w wiosennym słońcu, z zieloną trawą wyglądało to naprawdę ładnie) i czekałem… Warsztaty miały zacząć się o 14, ja byłem już o 13.20, ma się to ADHD ;) O 14 pojawili się panowie z Comarcha, usiedliśmy (miało być 15 osób, przybyło 12 albo 13) sobie na sali wykładowej i po krótkim wprowadzeniu oraz rozdaniu smyczek i kubków Pan Przemysław Jacak przeprowadził wykład na temat Qt Quick/Qt Declarative/QMLa, wideo z tego samego wykładu można znaleźć tutaj (część 1 z 7). Po wykładzie, czyli ok 16.40 nastąpiła przerwa (firma zapewniła napoje i przekąski, duży plus dla nich). Następnie przeszliśmy do części konkursowej, mieliśmy na podstawie informacji zdobytych na tym wykładzie napisać program w QML który będzie pokazywał pogodę dla wybranego miasta, mieliśmy do tego użyć informacji pogodowych z iGoogle, niestety nie wszyscy mieli połączenie z internetem dlatego dostaliśmy plik .xml z pogodą dla Łodzi i na tym mieliśmy pracować. Na program mieliśmy ok 80 minut. O godzinie 18 każdy przedstawił ile udało mu się napisać, okazało się że ja miałem najbardziej kompletny program (z 20 minut i byłby gotów). No i tak to było, jury pogratulowało mi i przekazało w moje ręce Nokię N8. A reszta… jest milczeniem… Dlatego jeszcze trochę napiszę ;)

Co do samego telefonu to nie będę tutaj pisał recenzji, bo się do tego nie nadaje, może za jakiś czas (miesiąc?) napiszę sprawozdanie z tego jak się go używa i co mnie wkurza (coś na pewno będzie). Co do poziomu quizu z wiedzy o C++, był on dość podchwytliwy i wymagał zastanowienia się. Pytania polegały głównie na tym, że był kawałek kodu i pytania do niego, pytania dotyczyły m.in. virtual, dziedziczenia oraz operacji na wskaźnikach. Co do poziomu samego konkursu to byłem podwójnie zaskoczony: raz że konkurs był bardzo łatwy jak na tak cenną nagrodę, dwa że tak mało ludzi dało sobie radę z zadaniem po ponad dwugodzinnym wykładzie który dokładnie nam wytłumaczył jak używać qmla. Ale to wygląda jakbym narzekał, a ja nie narzekam, cieszę się i to bardzo, ledwo mogę uwierzyć że moje umiejętności programistyczne wreszcie na coś się przydały ;)

Dlatego pamiętajcie dzieciaki: warto się uczyć programowania :)


Dobre nawyki w programowaniu – const corectness
April 7, 2011, 6:05 PM in Programming, Technology

Język C++ pierwszy raz zobaczyłem na oczy w 3 klasie gimnazjum, czyli jakieś 6 lat temu. Od tego czasu coś tam sobie grzebałem w tym języku, mniej lub bardziej. Jednak tak poważniej zacząłem programować od jakichś 3 lat. Wcześniej nie zwracałem uwagi na optymalność kodu, prędkość działania, chociaż o czytelność kodu zawsze dbałem ;) Dużo dały mi tutaj studia, które mimo że tak naprawdę nie nauczyły mnie niczego nowego, to zmusiły do refleksji nad moim stylem pisania. Postanowiłem pisać bardziej profesjonalnie.

Jedną z zasad poprawnego pisania kodu w C++ jest tzw. zasada “const corectness” która mówi o tym gdzie powinno się stosować słowo kluczowe const, a gdzie nie. Oczywiście ktoś może powiedzieć, że const oznacza że coś ma nie zmieniać wartości, więc jeśli mam stałą zmienna to dam przed nią const i po problemie. Nie jest to podejście złe, ale dość naiwne, ponieważ const ma także inne zastosowania.

Może jeszcze zanim zacznę wymieniać zastosowania const, wytłumaczę czym różni się zapis

  1. const int PI = 3.14;

od

  1. #define PI 3.14

Oczywiste jest, że różnią one się sposobem w jaki deklarujemy stałą, bo w pierwszym przypadku mamy zmienną o stałej wartości, a w drugim przypadku informację dla preprocesora, że należy wszystkie wystąpienia “PI” zamienić na “3.14”. Dla kompilatora jednak jest to duża różnica, w pierwszym przypadku kompilator widzi że ma do czynienia ze zmienną o stałej wartości i może tej informacji użyć, w drugim przypadku kompilator widzi tylko “3.14”, tak jakby użytkownik tam wpisał tą liczbę.

Skoro to już wytłumaczone, to może przejdę do zastosowań const. Const można stosować przed zmienną, po znaku * w deklaracji wskaźnika, na liście argumentów funkcji oraz w przy funkcjach w programowaniu obiektowym.

Spójrzmy na te trzy linijki kodu:

  1. const int *ptr;
  2. int *const ptr;
  3. const int *const ptr;

W pierwszym przypadku mamy const przed nazwą zmiennej, czyli ptr jest zmiennym wskaźnikiem na stałego inta, możemy zmienić obiekt na który będzie wskazywał ptr, ale nie samą wartość obiektu.
W drugim przypadku mamy const po znaku *, czyli mamy stały wskaźnik na zmienny int, oznacza to, że nie możemy zmienić obiektu na który on wskazuje, możemy jednak dalej zmieniać wartość tego obiektu.
W trzecim przypadku mamy połączenie obu powyższych linijek, mamy stały wskaźnik na stały obiekt. Nie zmienimy ani wskaźnika, ani wartości obiektu.

Zdaję sobie sprawę, że różnice są bardzo subtelne, dlatego pokaże przykład który powinien rozwiać niepewności:

  1. int *ptr; // zwykły wskaźnik na inta
  2. *ptr = 0; // zmieniam wartość inta na który wskazuje wskaźnik
  3. ptr = 0; // zmieniam adres int na który wskazuje wskaźnik
  4.  
  5. const int *constInt; //wskaźnik na stałego inta
  6. *constInt = 0; // chcę zmienić wartość stałego inta – nie przejdzie
  7. constInt = 0; // zmieniam adres wskaźnika – nie ma problemu
  8.  
  9. int *const constPtr; //stały wskaźnik na zmiennego inta
  10. *constPtr = 0; // zmieniam wartość inta – nie ma problemu
  11. constPtr = 0; // chciałem zmienić adres wskaźnika – nie da rady
  12.  
  13. const int *const constIntPtr; // stały wskaźnik na stałego inta
  14. *constIntPtr = 0; // nie da rady
  15. constIntrPtr = 0; // kit :( (a może :) bo przecież tak napisaliśmy kod)

No to teraz opowiem o używaniu const na liście argumentów funkcji. Normalnie gdy deklarujemy funkcję:

  1. void doSomething(int data);

do funkcji zostanie wysłana kopia zmiennej, dlatego zmiany na niej nie będą widoczne poza tą funkcją, aby tego uniknąć wysyłamy zmienne przez referencje:

  1. void doSomething(int &data);

Co jednak jeśli nie chcemy by nasza zmienna mogła być zmieniana, ale jest to duży obiekt i zrobienie jego kopii zajęłoby za dużo czasu/zasobów? Const przybywa na pomoc! Jeśli zdeklarujemy naszą funkcję jako:

  1. void doSomething(const int &data);

do funkcji zostanie wysłana stała referencja, czyli nie będziemy mogli zmienić nic w tej zmiennej i nie będzie robiona kopia.

Ostatnie zastosowanie const o jakim dzisiaj wspomnę to const w funkcjach przy programowaniu obiektowym. Weźmy taki przykład:

  1. class Point
  2. {
  3.   public:
  4.   ()
  5.     void setX(const int &x) { m_x = x; }
  6.     int x() const { return m_x; }
  7.  
  8.   private:
  9.     int m_x;
  10.     int m_y;
  11. };

Jak widać zgodnie z poprzednim punktem funkcja setX przyjmuje stałą referencję, ale w tym przykładzie uwagę należy zwrócić na const przy funkcji x(). W taki sposób użyte const mówi kompilatorowi, że w tej funkcji nie będziemy zmieniać wartości pól klasy (w tym przypadku m_x i m_y). Jest to także użyteczne dla programisty, jeśli przez przypadek będziemy jednak chcieli coś zmienić w klasie z tej funkcji, kompilator nam na to nie pozwoli, użyteczne ;)

I to na tyle na temat używania const w C++. Może niedługo znowu napiszę coś o pisaniu profesjonalnego kodu. ;)


Problem z grą Batman: Arkham Assylum
April 7, 2011, 4:46 PM in Technology

Kilka tygodni temu na Steamie była promocja na grę Batman Arham Assylum więc kupiłem ją sobie. Ściągnęło się wszystko bez problemu, ale gdy chciałem uruchomić grę pojawił się błąd:

Problem signature:
 Problem Event Name: CLR20r3
 Problem Signature 01: BmLauncher.exe
 Problem Signature 02: 1.0.4058.31110
 Problem Signature 03: 4d541d90
 Problem Signature 04: System.Drawing
 Problem Signature 05: 2.0.0.0
 Problem Signature 06: 4ca2bad4
 Problem Signature 07: 7af
 Problem Signature 08: 70
 Problem Signature 09: System.ArgumentException
 OS Version: 6.1.7601.2.1.0.256.1
 Locale ID: 1033

Przeszukałem cały internet wzdłuż i wszerz i nie udało mi się znaleźć rozwiązania tego problemu, forum producenta ani Steama nie okazało się pomocne. Dopiero gdy zacząłem szukać po kodzie błędu okazało się że ten problem nie dotyczy tylko tej gry, ale jest to problem bardziej ogólny. Problem dotyczy braku czcionki wymaganej przez aplikację. Jakiś czas temu bawiłem się czcionkami w systemie i musiałem usunąć którąś. Postanowiłem więc skopiować czcionki z obrazu instalacyjnego Windowsa. Oczywiście pliki na płycie nie są tak po prostu dostępne, są one trzymane w pliku wim. Na szczęście Windows ma wbudowany program do montowania tych plików. Oto co należy zrobić:

Włączamy Windows PowerShell, jeśli mamy Windows 7, Vistę SP1 to znajduje się on w “Start > Wszystkie programy > Akcesoria > Windows PowerShell”, w przeciwnym wypadku – przydałby się update ;)

Gdy mamy już uruchomionego naszego PowerShella (którego kolor tła może się średnio dobrze kojarzyć)

  1. dism /Mount-Wim /wimfile:Z:\sources\install.wim /index:1 /MountDir:C:\win7wim /ReadOnly

Gdzie Z:\ to dysk w którym znajduje się płyta Windowsa, a C:\win7wim to folder gdzie ma zostać zamontowany plik .wim.

Po zamontowaniu w folderze C:\win7wim zobaczymy strukturę folderów która wygląda tak jak świeżo zainstalowany system, teraz możemy skopiować czcionki z tego folderu do folderu w naszym systemie i cieszymy się działającym Batmanem ;)

Chociaż może zanim zaczniemy grać możemy chcieć odmontowac plik .wim, robimy to tak:

  1. dism /Unmount-Wim /MountDir:C:\win7wim /Discard

IT Academic Day 2010 na Uniwersytecie Łódzkim
December 9, 2010, 2:31 PM in Technology, University

Microsoft nie jest taki zły jak się go rysuje. To tyle z mojej strony, dziękuję ;)

A tak na serio, może rozwinę chociaż troszkę tą myśl. Otóż nie dawno byłem uczestnikiem (i jednym z organizatorów jako członek Studenckiego Centrum Informatycznego) konferencji ITAD 2010.

Nie będę tłumaczył dokładnie co to jest ten ITAD, każdy google i wikipedię ma, powiem tylko tyle że są to konferencje organizowane przez studentów we współpracy z firmą Microsoft. Studenci starają się ściągnąć reprezentantów lokalnych firm by opowiedzieli o technologiach wykorzystywanych w ich pracy. W tym roku naszemu wydziałowi udało się zaprosić firmy: ABB, AMG.net, Teleca i Microsoft. Firma Kaspersky nic nie prezentowała, ale dała trochę itemków więc mają honorable mention.

Pierwszym wykładem były “Programy akademickie Microsoft” poprowadzone przez Jana Kleczkowskiego. Pan Kleczkowski opowiadał o możliwościach jakie Microsoft daje studentom by ułatwić im drogę przez studia i przy okazji przyzwyczaić ich do produktów jedynego słusznego producenta oprogramowania ;) Wspominał o programach MSDN Academic Alliance, DreamSpark, Student Partner, Microsoft Internship, ITAcademy a także grupach .NET na uczelniach w Polsce. Więcej linków tutaj.

Jak widać Microsoft ma naprawdę dużo do zaoferowania studentom, ale czy studenci są chętni do wykorzystania tych możliwości, oto jest pytanie. Microsoft prowadzi ranking wykorzystania licencji z MSDN AA, naszej uczelni nawet tam nie ma…

Zostały też poruszone tematy innych produktów Microsoftu, skierowanych nie tylko do studentów, m.in. Hotmail, Sky Drive czy Office Web Apps. I tu wyszła na jaw pewna ciekawa rzecz, gdy pan Jan pytał ile osób używa tych usług, okazało się że nie tak wiele jak mogłoby się wydawać, używają oni google’owych zamienników, Gmail, Picasa, Google Docs. Ja sam używam produktów Google’a, ale właściwie czemu tak jest? Wydaje mi się, że to przez mentalność ludzi pod tytułem “Microsoft to najgorsze zło, a Google jest super, chociaż kradnie nasze dane”. Tak skrótowo mówiąc. No i dlatego też takie zdanie we wstępie wpisu, ten MS wcale nie taki straszny, przynajmniej wreszcie mam legalny system, legalne Visual Studio.

Następny wykład także prowadził pan Kleczkowski, tym razem o innowacjach w MS. Wspomniał coś o WebMatrix, ale tak naprawdę mało kto go słuchał, bo niedaleko stała konsola XBOX 360 z podłączonym Kinectem. Tak więc, szybko zakończono wykład, wspomniano o budowie Kinecta i rozpoczęto część praktyczną ;) Ja także zagrałem i moje uczucia są mieszane: z jednej strony jest to naprawdę niesamowita technologia, oferuje ogromne możliwości, ale podczas gry były odczuwalne lagi (mimo, że Kinect odświeża informacje o pozycji graczy 30 razy na sekundę). Jednak Kinect używa procesora konsoli więc może mały upgrade firmware’a, następna generacja konsol i będzie idealnie ;)

Następny wykład był na temat konkursu Imagine Cup 2011. Na tym wykładzie mnie nie było (obowiązki organizatora), więc nie mam nic do powiedzenia :P

Kolejny wykład był prowadzony przez Macieja Kowalewskiego z AMG.net. Pan Maciej opowiadał o projekcie, jaki firma w której pracuje wykonuje na zlecenie OrangeVideo on Demand. Nie potrafię tutaj teraz z pamięci zrekonstruować wszystkiego, jednak pamiętam że użyli technologii SmoothStreaming oraz Silverlight.

Po firmie AMG.net mieliśmy możliwość wysłuchać wykładu Rafała Legiędzia i Michała Śliwonia z firmy ABB na temat ASP.net MVC 3 z zastosowaniem Entity Framework 4. Ci ciekawe ci panowie byli może 3-4 lata starsi ode mnie, a już mieli 3 letni staż pracy, perfect. Zaprezentowane nam zostały możliwości ASP.net MVC na przykładzie prostego silnika blogowego, w jakieś 50 minut udało im się stworzyć działający blog z możliwością komentowania, oczywiście nie jest to jakieś niesamowite osiągnięcie, podobne wyniki można osiągnąć w Django, RoR czy lepszym frameworku do PHP, taka jest właśnie potęga frameworków ;) Prezentację z tego wykładu oraz kod źródłowy silnika blogowego w repozytorium SVN można znaleźć tutaj.

Ostatnim wykład został poprowadzony przez Mieszka Lassotę z firmy Teleca. Pan Mieszko zaprezentował Managed Extensibility Framework, który jest jednym z komponentów frameworka .NET 4.0 i służy w skrócie do bezproblemowego tworzenia rozszerzeń do aplikacji. Prezentacja i kod programów z wykładu są dostępne tutaj.

Jak widać, wszystkie prezentacje były w jakiś sposób związane z produktami firmy Microsoft co muszę przyznać zmusiło mnie do myślenia. Czy oznacza to, że wszystkie firmy używają teraz C# i technologii .NET? Czy był to akurat taki dobór firm. A może fakt, że MS jest patronem konferencji sprawił, że prezentacje były takie, a nie inne. Ciężko powiedzieć, w każdym razie widać, że warto chociaż wiedzieć, że istnieje takie coś jak C#, .NET, ASP.NET, w razie jakby pytali na rozmowie kwalifikacyjnej ;)

Ja jako programista aplikacji internetowych (a przynajmniej tak lubię siebie nazywać) najbardziej zainteresowałem się wykładem o ASP.NET MVC, idea MVC i frameworków nie jest mi obca, dlatego możliwe że w najbliższym czasie zapoznam się bliżej z tym produktem firmy MS, zobaczymy co z tego wyjdzie ;) Co oczywiście nie znaczy, że zacznę się ograniczać do jednej technologii, trzeba być otwartym, spróbować wielu frameworków zanim się wybierze jeden :)

Ps. Oficjalna strona ITAD 2010 na UŁ jest dostępna tutaj, rzuca się w oczy coś szczególnego? :P


Instalacja Redmine na Ovh
November 2, 2010, 12:12 PM in Technology

W związku z tym, że mam na głowie coraz więcej większych projektów postanowiłem zainwestować w jakiś system zarządzania projektami z bugtrackerem. Kiedyś używałem Traca, który mimo że ciągle rozwijany, nie oferuje tak dużo opcji jak konkurencja, dlatego mój wybór padł na Redmine, napisany w Ruby on Rails.

Nigdy jednak nie miałem do czynienia z językiem Ruby i nie wiedziałem jak uruchomić serwer i z czym to się je. Do tego większość tutoriali na necie tłumaczy jak to zrobić gdy się ma konto roota, wiadomo że gdy posiada się serwer wirtualny, nie ma dostępu do konta roota, trzeba sobie poradzić inaczej.

Najnowsza wersja Redmine wymaga Ruby w wersji 1.8.6 lub 1.8.7, na szczęście na ovh jest wersja 1.8.7. Gorzej już z wersją rails oraz rack, potrzebne są odpowiednio 2.3.5 i 1.0.1 a dostępne są 2.3.8 i 1.1.0. Normalnie nie byłoby to problemem, wystarczyłoby uruchomić odpowiednią komendę i starsze wersje ściągnęłyby się i zainstalowały same. Jednak na shellu ovh nie ma dostępu do sieci, dlatego należy te pakiety ściągnąć i zainstalować ręcznie. Tak więc aby zainstalować Redmine potrzebujemy te pakiety:

Rack 1.0.1
Rake 2.8.3
ActiveSupport 2.3.5
ActiveRecord 2.3.5
ActionPack 2.3.5
ActionMailer 2.3.5
ActionResource 2.3.5
Rails 2.3.5

Jak już mamy te wszystkie pliki na naszym koncie, możemy je zainstalować. Skoro jednak nie mamy dostępu do roota, musimy to zrobić lokalnie, tworzymy folder, w którym zainstalują się te pakiety, np gems i wpisujemy takie polecenia:

  1. $ GEM_PATH=$HOME/gems
  2. $ gem install rack rake activesupport actionpack activerecord actionwebservice actionmailer activeresource rails —local –no-rdoc –install-dir $GEM_PATH

Następnie instalacja przebiega podobnie do tego co opisane jest w pomocy Redmine, tzn:
Ściągamy najnowsza wersję Redmine, uploadujemy plik .zip lub .tar.gz na nasz serwer i rozpakowujemy go. Następnie zmieniamy nazwę plikowi config/database.yml.example na config/database.yml i edytujemy jego zawartość (ja używam bazy danych MySQL):

  1. production:
  2.   adapter: mysql
  3.   database: nazwa_bazy
  4.   host: server_bazy
  5.   username: uzytkownik_bazy
  6.   password: haslo_uzytkownika

Następnie wykonujemy polecenia:

  1. $ rake generate_session_store
  2. $ RAILS_ENV=production rake db:migrate
  3. $ RAILS_ENV=production rake redmine:load_default_data

Teraz pozostaje tylko uruchomić serwer, jednak tutaj pojawia się problem, ponieważ serwer tworzony jest tylko lokalnie, na porcie 3000, nie mamy do niego dostępu z naszej domeny, trzeba to zmienić. W panelu ovh tworzymy subdomenę która przekierowywać będzie do folderu redmine/public, a w tym folderze umieszczamy plik .htaccess:

  1. RewriteEngine On
  2.  
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteRule (.*) http://_adres_hosta_:3000/$1 [P]

W miejsce _adres_hosta_ należy wpisać to, co zwróci serwer po wykonaniu komendy:

  1. hostname

Teraz, kiedy już mamy ustawioną naszą subdomenę i plik .htaccess, wystarczy tylko uruchomić serwer, robimy to komendą:

  1. ruby script/server webrick -e production -d

W ten sposób serwer jest uruchamiany w tle, więc bez problemu możemy wylogować się.

Na koniec mały skrypcik, który zrestartuje serwer, przydatne jest to, ponieważ po doinstalowaniu wtyczki lub motywu graficznego potrzebny jest restart serwera, oto skrypcik:

  1. #!/bin/bash
  2.  
  3. pid=$(ps x -o pid,command | grep ruby | head -n1 | cut -d" " -f1)
  4. kill -9 $pid
  5. ruby script/server webrick -e production -d

Argh
October 10, 2010, 2:00 AM in Personal

Tytuł taki, a nie inny. Nie za bardzo mam teraz ochotę i pomysł na jakiś inny. Ogólnie chodzi o to, że właśnie wróciłem z kina. Ale może zanim powiem coś więcej, skupię się na moich upodobaniach filmowych.

Nie wiem, czy to dlatego, że świadomie wybieram na co iść do kina, czy to po prostu ja, ale podoba mi się 95% filmów które oglądam, często czytam/oglądam w internecie jak ludzie jadą po filmach, wymieniają co w nich było głupiego i zaskakujące jest to, że zgadzam się z tymi zarzutami, ale i tak film mi się podobał, najlepszym przykładem jest chyba film Transformers 2, ludzie klną na ten film, tworzą kilkunastominutowe filmy opisujące czemu jest on głupi i nie wart obejrzenia, ale… mi się podobał, nie wiem, może jestem mało wymagającym widzem. W tym roku oglądałem w kinie (kolejność chronologiczno losowa):

  1. Niezniszczalni
  2. Salt
  3. Jak ukraść księżyc 3D
  4. Incepcja
  5. Uczeń czarnoksiężnika
  6. Książę Persji
  7. Alicja w krainie czarów

Wszystkie te filmy mi się, mniej lub bardziej, podobały. Teraz jednak wróciłem z filmu który mnie tak zdenerwował, że muszę się tutaj o tym wyżalić: Śluby panieńskie.

Jeszcze zanim na dobre rozpoczął się film zauważyłem pewien fakt: czemu w polskich filmach bezpośrednio przed filmem jest tyle log różnych firm/wydawców czy cholera wie czego tam jeszcze. W amerykańskich pokażą logo wytwórni i jazda z tym koksem. Ale to i tak szczegół. Film reklamowany jest jako “komedia wszech czasów”, nie wiem czy autorzy tego hasła mieli na myśli książkę, film czy obie rzeczy. Od początku widziałem, że będzie to ekranizacja lektury razem z zachowaniem oryginalnych tekstów (a’la Pan Tadeusz), dlatego nie spodziewałem się szału, wiedziałem że z takim formatem filmu wiążą się pewne konsekwencje. Dlatego film jako ekranizacja lektury wypada dobrze, dobra jest także gra aktorów. Gdyby na tym się skończyło, byłoby super. Ale nie, twórcy mieli własną wizję, wizję o której myśl dalej sprawia że burzy się we mnie krew. Ten film mnie po prostu zdenerwował, nie wiem czy zdarzyło mi się dotąd coś takiego. Dłużej już nie trzymam w niepewności i powiem o co chodzi, otóż autorzy wpadli na genialny pomysł dodania do filmu scen z rzeczami z naszych czasów (komórki, gazety, papierosy, piwo, samochody, itp.). Akcja filmu rozgrywa się w roku 1825. Kiedy Radost po raz pierwszy wyjął telefon komórkowy by zadzwonić do kąpiącej się nago Klary miałem lekki efekt WTF (What a Terrible Failure), jednak liczyłem że zostanie to wyjaśnione w jakiś sposób, np że to wszystko dzieje się w jakimś odciętym od świata terenie a’la Osada (kolejny film jechany przez wielu, który mi się podobał). Nawet jeśli nie byłoby to wytłumaczone, wybaczyłbym, taki żarcik, hahaha, idziemy dalej. Jednak nie, ten motyw powtórzył się jeszcze z 6 albo 7 razy, za każdym razem denerwując mnie coraz bardziej, sprawiając mi prawdziwy ból fizyczny. Nigdy nie miałem ochoty po prostu wyjść z sali, ale za 4 razem poczułem taką chęć i się bardzo zdziwiłem, lubię jednak poznać wszystkie fakty (w tym przypadku obejrzeć całe “dzieło”) by móc je komentować, dlatego zostałem. W całym filmie nie ma żadnego wytłumaczenia, dlaczego postacie używają nowoczesnych urządzeń, dlaczego w tle widać obsługę filmu, dlaczego widoczne są siedzenia reżysera i aktorów, nic! TAK NIE MOŻNA ROBIĆ!!!! Jako widz podczas oglądania filmu jestem w stanie w dużo uwierzyć, po angielsku ma to swoją nazwę “suspension of disbelief” czyli zawieszenie niewiary, zawieszam swoją niewiarę, podczas oglądania filmu jestem w stanie uwierzyć że istnieją zombie, czary, sztylet cofający czas, że każdy strzał bohatera filmu akcji jest celny a strzelająca do niego niewielka armia nie trafia ani razu, albo że kojot nie zacznie spadać, dopóki nie spojrzy w dół ;) Jednak za zawieszenie mojej jako widza niewiary trzeba sobie zasłużyć, filmy zazwyczaj tłumaczą rzeczy w które normalnie trudno byłoby uwierzyć (“aha, te inteligentne roboty które umieją się zmieniać w samochody pochodzą z kosmosu, teraz ma to sens”), tutaj czegoś takiego nie ma, film po prostu postanowił w rok 1825 wsadzić telefony komórkowy i inne badziewie.

Ja nie wiem, może ja czegoś nie łapię, jest to możliwe. Może jestem zbyt płytki, często gdy patrze na zdjęcie którym ludzie się zachwycają, nie widzę powodów do tego, czy redukcja kolorów do odcieni czerni i bieli, dodanie ziarna, efektu głębi ostrości i sprawienie że pół zdjęcia jest w cieniu i nic nie widać sprawia że jest ono dziełem sztuki którym trzeba się zachwycać (szczególnie z tymi zdjęciami czarno-białymi, wygląda na to, że 3 minuty w Photoshopie dodają +5 do artystyczności zdjęcia), nie czaję tego. Ale niektórzy czają i się tym zachwycają, może tak samo jest w przypadku tego filmu. Ale czy to znaczy że nie mam prawa na niego jechać? W końcu nawet jeśli nie jestem jakimś profesjonalnym krytykiem, nie znam się na wszystkim, to jestem przeciętnym widzem i swoje zdanie mam, może ono nikogo nie obchodzić, ale skoro żyjemy w (powiedzmy) wolnym kraju to nikt mi nie zabroni wyrazić mojej opinii, w skrócie brzmi ona tak: ten film był do dupy. Gdyby wyciąć z niego te sceny, czyli jakieś 10-15 minut, byłaby to standardowa ekranizacja lektury którą można puścić uczniom na lekcji do obejrzenia. Teraz ktoś mógłby powiedzieć “mówisz, że bez tych scen byłaby to standardowa ekranizacja, a autorzy chcieli zrobić coś niestandardowego, czemu jesteś taki konserwatywny, nie lubisz jak ludzie mają oryginalne pomysły? Ty faszysto, jesteś gorszy od Hitlera i Stalina, bla bla bla…”. Otóż nie, nie mam nic przeciwko eksperymentowaniu w filmach, ale musi mieć to jakiś sens i podłoże (czyli musi być WYTŁUMACZONE!!!!), NIE MOŻNA ROBIĆ TAKICH RZECZY BEZ WYTŁUMACZENIA… ekhem, gdzie to ja mam te pigułki co mi doktor przepisał, o już mam, może wezmę więcej, przy okazji lepiej będzie mi się spać, a może stracę pamięć krótkoterminową i zapomnę że oglądałem to badziewie.

I to nie jest tak, że ten reżyser nie potrafi dobrze zekranizować lektury, bo raz już to zrobił i wyszło to bardzo dobrze. Czytałem Przedwiośnie i bardzo podobała mi się ta książka, jednym z powodów tego był też fakt, że film na jej podstawie jest zrobiony bardzo dobrze. Ale tutaj… szkoda gadać. Jedyne co mnie pociesza, to fakt że nie musiałem płacić za bilety, wygrałem je za poprawne rozwiązanie krzyżówki w darmowej gazecie Przegląd Bełchatowski. Nie wiem jak jest z tym w Polsce, ale w USA można zażądać zwrotu pieniędzy za bilet jeżeli film się nie spodobał, bo chyba uznałbym to za jedne z najgorzej wydanych pieniędzy jak dotąd.

Podsumowywać ten jakże krótki tekst pisany o jakże wczesnej godzinie reklamowanie tego filmu jako komedii wszech czasów jest okłamywaniem widza i pluciem mu prosto w twarz. A to jak bardzo jestem wkurzony widać po liczbie emotikonek których użyłem w tym wpisie, ta się nie liczy ;)

Za to muzyka w filmie była całkiem fajna :P


O formacie DTB
September 28, 2010, 2:24 AM in Programming, Technology

Dawno, dawno temu, gdy jeszcze dinozaury chodziły sobie swobodnie po Ziemii (czyli w roku 2004) był sobie komunikator Konnekt. Był to bardzo dobry komunikator, na tyle dobry że dalej używam go, mimo że nie jest rozwijany od 5 lat. Komunikator ten używał do zapisywania archiwum i konfiguracji autorskich baz danych DataTable, które można zapisywać było do plików .dtb. Konnekt napisany był przy użyciu biblioteki StaminaLib (firmy Stamina) i mimo że sam program nie miał otwartego źródła, to już ta biblioteka tak, dostępna jest nawet specyfikacja formatu DataTable. Była (a właściwie będzie w nie-tak-odległej przyszłości) mi potrzebna możliwość odczytu archiwum i konfiguracji Konnekta, mogłem niby użyć klas do obsługi tych baz danych ze StaminaLib, ale biblioteka ta jest pisana pod MSVC i bla, bla, bla. Z tych i innych powodów postanowiłem sam napisać program do czytania tych plików. W Qt ;)

Tak jak samo odczytywanie plików i danych w nich nie było problemem (dzięki wcześniej wspomnianej specyfikacji) to okazało się, że niektóre kolumny w bazach danych są zakodowane hasłami. Po pewnej ilości reverse engineeringu udało mi się dojść do wartości tych haseł, są 2 – jedno dla archiwum, drugie dla reszty plików. I to w sumie tyle co chciałem napisać, chciałem tylko się pochwalić moimi l33t hacking skillz ;)

Program dostępny jest na moim githubie, na pewno przyda się wielu osobą (not), mi z pewnością (ale o tym więcej za jakiś czas).


O OAuth i Twitterze słów kilka(set)
August 15, 2010, 12:10 AM in Qt, Technology

Twittera w sumie używam głównie do śledzenia tego, co robią inni, sam niby też dodaję co jakiś czas aktualizacje, ale czy ktoś to w ogóle czyta, czy to kogoś interesuje? Pewnie średnio. Ale dzięki temu potem łatwiej mi zlokalizować w czasie kiedy pracowałem nad jakimś projektem lub kiedy obejrzałem dany film ;-)

Jedyny problem jaki mam z Twitterem, to brak dobrego klienta na Windowsy. Twitter nie może narzekać na małą ilość klientów, ale bardzo duża ich część albo używa Adobe Air, za którym nie przepadam, albo jest przeładowana graficznie (czy wyszło jakieś rozporządzenie mówiące, że klienci Twittera nie mogą wyglądać jak natywne programy, bo ja chyba o czymś nie wiem). Potrzebuje prosty program z podstawowymi funkcjami, który będzie sobie siedział w tray’u i wyświetlał informację, gdy ktoś doda aktualizację.

Ciągle uczę się Qt to pomyślałem, że dobrym ćwiczeniem będzie napisać taki program samemu.
Zacząłem od znalezienia biblioteki do obsługi API Twittera, znalazłem QTwitLib, zacząłem pisać. Program zaczął nabierać kształtów, w pewnym momencie potrzebowałem coś sprawdzić w dokumentacji API, wchodzę na dev.twitter.com, a tam piękny komunikat “As of June 30, 2010, basic auth will no longer be supported.” sprawdzam czego używa QTwitLib, oczywiście autoryzacji HTTP, no to wypad. Zacząłem szukać innej biblioteki z obsługą nowego sposobu autoryzacji – OAuth (“cóż to za magiczny protokół?”), znalazłem QOAuth (której autorem jest polak ;-) ), zraziła mnie trochę zależność od QCA, ale co tam. Po kilku godzinach prób kompilacji QCA, dałem sobie spokój (później okazało się, że to nie wina QCA, czy tym bardziej QOAuth, ale bug w Qt 4.7 beta 1). Usiadłem do dokumentacji OAuth na dev.twitter.com i po pewnej walce udało mi się wyskrobać własną bibliotekę OAuth, bez potrzeby QCA (QCA było tam głównie potrzebne do wyliczenia sygnatury algorytmem HMAC-SHA1, ja napisałem do tego własną funkcję).

A teraz może w skrócie, OAuth – z czym to się je?
OAuth jest protokołem autoryzacji opracowanym w 2006 roku między innymi przez ludzi z Twittera, daje on dostęp aplikacjom klienckim do działania w imieniu użytkownika (np. publikacja aktualizacji) bez znania jego hasła, użytkownik sam wybiera którym aplikacjom pozwala na dostęp i może to prawo im w każdej chwili odebrać.

Działa to na tej zasadzie: twórca aplikacji (np. ja ;-) ) rejestruje ją u dostarczyciela usługi (np. Twitter) i otrzymuje unikalny klucz (consumer_key) i tajny ciąg znaków (consumer_secret). Zanim aplikacja będzie mogła działać w imieniu użytkownika, musi ona go prosić o autoryzację, w tym celu najpierw wysyła zapytanie o bilon (token) do serwera usługodawcy. Teraz może na chwilę zatrzymajmy się by wytłumaczyć sobie na czym polegają zapytania i po co aplikacji te klucze były. Otóż każde zapytanie musi (oprócz innych ważnych informacji jak wersja OAuth czy czas zapytania) zawierać klucz aplikacji i być podpisane sygnaturą. Sygnatura jest obliczana na podstawie treści zapytania oraz tajnym ciągiem znaków otrzymanym podczas rejestracji aplikacji. Tylko poprawnie podpisane zapytania dostaną poprawną odpowiedź. Metody podpisywania są 3: kluczami RSA, zwykły ciąg znaków (Plaintext) lub właśnie algorytmem HMAC-SHA1. Twitter obsługuje tylko ten ostatni format.

Jeśli dobrze podpisaliśmy nasze zapytanie o token, otrzymamy tymczasowy bilon, on też składa się z klucza (token_key) i tajnego ciągu znaków (token_secret). Mając token, wysyłamy użytkownika pod odpowiednio spreparowany link, pod którym użytkownik zostanie zapytany czy zezwala naszej aplikacji na działanie w jego imieniu. Jeśli wyrazi zgodę otrzyma numer PIN, który powinien wpisać w naszej aplikacji. My, po otrzymaniu PINu, wysyłamy zapytanie, tym razem o stały token. Jeśli znowu wszystko poszło dobrze, otrzymamy token. Zapisujemy go gdzieś i od teraz możemy pobierać aktualizacje znajomych użytkownika, wysyłać aktualizacje na jego konto itd.

Tak w skrócie wygląda OAuth (na przykładzie Twittera), zainteresowanych by wiedzieć więcej, zapraszam tutaj.
Ja wracam do prac na biblioteką i programem, mam zamiar wydać je razem ze źródłem, więc zainteresowanych proszę o cierpliwość.


« Previous entries