technikalia

Technika w czystej postaci, wpisy nie tylko o hackowaniu, programowaniu i elektronice...

Proste haszowanie stringa

Haszowanie stringów z wykorzystaniem prostego algorytmu Roberta Sedgwicksa z książki “Algorithms in C”. Według testów różnych prostych algorytmów opublikowanych na stronie Hash Function Efficiency, można zauważyć, że to właśnie RS jest prostym i mało kolizyjnym algorytmem. Dlatego wybrałem go do użycia w swoim projekcie, do haszowania nazw funkcji serwisowych, eventów, hooków. Jego najprostsza implementacja w C++: unsigned int RSHash(char* str) { unsigned int a = 63689; unsigned int b = 378551; unsigned int hash = 0; while (*str) { hash = hash * a + static_cast<unsigned char>(*str); a = a * b; str++; } return hash; } W źródłach mirandy, użyty przez nią algorytm znalazłem w wersji C i Asemblera, więc naszła mnie mała ochota, aby mój algorytm również nieco zoptymalizować i przy okazji przypomnieć sobie bebechy asemblera ;)

Czytaj dalej

Pomysł: Biblioteka inet

Mój HttpSession jest trochę “do dupy”, bo uzależniony jest od Windowsa i jego WinInet. No cóż, potrzebowałem na szybko jakąś łatwą i prostą obsługę sesji HTTP pod tymi okienkami, więc powstała ona taka jaka jest. Od dawana chodzi mi po głowie mała refaktoryzacja. Wydzielenie publicznego interfejsu i uniezależnienie się od systemu. Wersja Windowsowa oparta dalej na WinInet, a wersja Unixowa na cURL. Wtedy nawet Ci, co nie bardzo chcą patrzecć na WinInet, mogą poprzez jedną flagę wykorzystać w windowsowej wersji także cURL-a.

Czytaj dalej

Interpunkcja ze spacjami

Drażni mnie jak niektórzy wstawiają spacje przed niektórymi znakami interpunkcyjnymi. Co oczywiście nie jest zgodne z zasadami gramatyki, semantyki, czy czegoś tam, w języku polskim i nie tylko. W pewnym projekcie, w którym obecnie pracuję, tłumacze właśnie mają małe zboczenie do wstawiania spacji przed “!” i innymi znakami. A zapewne kolegom deweloperom nie będzie się uśmiechała ręczna edycja plików. Dlatego “machnąłem” prościutki skrypcik w Perlu ;) #!/usr/bin/perl -pi.bak BEGIN { @ARGV or print "\nusage: .

Czytaj dalej

Biblia programisty C++

Już jakiś czas temu zaopatrzyłem się w książkę “Język C++” Bjarne Stroustrupa, twórcy tegoż języka. Wydanie WNT z 1997 roku udało mi się w prawie idealnym stanie i w twardej okładce zdobyć “za grosze” na allegro ;) Dziś otrzymałem drugą książkę Stroustrupa - “Projektowanie i rozwój języka C++” z roku 1996, również wydawnictwa WNT. Z tą różnicą, że książka nowa prosto z wyprzedaży WNT na allegro. Szkoda tylko, że miękka okładka i klejona.

Czytaj dalej

PJSIP - SIP/VoIP framework

Hah, znalazłem fajnego liba do SIP-a - PJSIP, a pisząc dokładniej, to taki mały framework do softphone-a czy VoIP-a: Open Source, comprehensive, high performance, small footprint multimedia communication libraries written in C language for building embedded/non-embedded VoIP applications. Open source SIP stack and media stack for presence, im/instant messaging, and multimedia communication. PJSIP posiada dosyć duże wsparcie rozszerzeń i funkcjonalności oferowanych przez SIP (SIP extensions/features). Wydaje się być idealną alternatywą dla sipXtapi, który mnie ostatnio trochę drażni, a na nim to miałem oprzeć pewien projekt klienta, nad którym obecnie pracuję.

Czytaj dalej

Pingerek 0.7 beta

Wczoraj zaktualizowałem bibliotekę Pinger++ o kilka nowych dodatków w API, a dziś nieco zmian we wtyczce Pingerek dla komunikatora Tlen.pl. Główne zmiany to obsługa tagów w dodawanej wiadomości, bo akurat to jest mi potrzebne ;) Changelog wersji 0.7 beta: tytuł i tagi przy dodawaniu wpisu; wiadomości obserwowanych; możliwość określenia ilości pobieranych wpisów; powiadomienie o nowych wpisach znajomych; Aktualną wersję wtyczki można pobrać z forum ekipy w temacie poświęconym pluginowi oraz mojej strony projektu.

Czytaj dalej

JPainter - Paint w Javie

Moja implementacja prostego programu graficznego - Painta - na “swingu” w Javie. Program zaliczeniowy z laborek Javy na uniwerku. Planowana była większa funkcjonalność, co można zauważyć po pozycjach w menu i paskach narzędzi, ale niestety z braku czasu tylko kilka funkcji działa prawidłowo :) Źródła programu dostępne na licencji GPL i można je pobrać wraz z całym projektem NetBeans’a z projects.malcom.pl. Mój pierwszy i ostatni program w Javie ;)

Netsh - zarządzanie sieciową konfiguracją

Biorąc laptopa na zajęcia na uniwerku wkurza mnie ciągłe zmienianie ustawień sieci, głównie adresów IP, aby podłączyć się do sieci. Dlatego postanowiłem poszukać, ewentualnie napisać prosty programik do szybkiej i wygodnej zmiany ustawień sieciowych z kilku zapisanych konfiguracji. Jednym z ciekawszych programów, jaki znalazłem to Shock IP Changer. Gdybym miał sam napisać swoją wersję to pewnie wyglądałby podobnie ;) Sądząc po zachowaniu programu, prawdopodobnie do zmian konfiguracji sieci wykorzystuje on narzędzie wiersza poleceń - netsh.

Czytaj dalej

Biblioteka Grono++

Pisałem kiedyś jakąś bibliotekę do obsługi API serwisu grono.net. Głównie na potrzeby aplikacji lub pluginu tlenowego na konkurs gronowy. Ale jak się później okazało plany się zmieniły i zaniechałem brania udziału w konkursie, przez co projekt biblioteki został zarzucony. Niestety przed porzuceniem projektu, został on zaaprobowany jako projekt zaliczeniowy z programowania na uniwerku, i tak się złożyło, że wczoraj musiałem istniejące źródła doprowadzić do działania na dzisiejszą prezentację projektu. Pamiętam, że w planach miał być bardziej abstrakcyjny i obiektowy model, ale ostatecznie przyjąłem kilka prostych rozwiązań, jakie zastosowałem w Pinger++.

Czytaj dalej

Biblioteka Pinger++

Wypuściłem na LGPL-u napisaną w języku C++ bibliotekę Pinger++ służącą do łatwej komunikacji z serwisem pinger.pl. Biblioteka implementuje w pełni publicznie dostępne API serwisu, a nawet trochę więcej niż zawarto w dokumentacji dostępnej pod adresem pinger.pl/_/main/api. Wymiana danych następuje w formacie XML, do którego parsowania użyto libxml2, a obsługę sieci i sesji HTTP dostarcza moja prosta klasa HttpSession. Ze względu, iż Pinger++ implementuje w pełni API serwisu, a metody i ich argumenty odpowiadają znaczeniowo informacjom zawartym w dokumentacji API, dlatego aktualnie zrezygnowano z jakiejkolwiek dokumentacji biblioteki.

Czytaj dalej