Category Archives: Technology


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!


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

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ść.