Cursedsnake 0.5

UWAGA! Ten wpis ma już 16 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Niedawno wpadłem na pomysł napisania jakiejś gry. Dawno niczego „twórczego” nie pisałem, a i pomysł akurat się przyplątał – napisać snake`a pod konsolę, dla treningu.

Żeby maksymalnie uprościć sobie pracę, wybrałem bibliotekę ncurses do obsługi klawiatury i ekranu. Wszystkie metody i pola wrzuciłem w klasę, dla czytelności i prostszych ewentualnych modyfikacji. Jakichś specjalnych rozwiązań brak, bo w końcu temat oklepany, jednak starałem się pisać i wymyślać wszystko od zera. Główna pętla chodzi na liczniku z użyciem clock(), wąż jest reprezentowany w pamięci jako lista jednokierunkowa. Kodziłem sobie we wdzięcznym IDE o nazwie Code::Blocks.

From Snake

Obecna wersja to 0.5, lecz w zasadzie nie mam już pomysłów na jakieś nowe funkcje w tej grze. Różnice w stosunku do poprzednich wersji można śledzić w changelogu. Kod jest w miarę uporządkowany, można się przyczepić do mieszania języków w nazwach zmiennych, ale może to poprawię kiedyś.

Co do licencji, to nie myślałem nad tym dłużej, dlatego nie widzę problemu w wykorzystywaniu źródeł w różnych celach, jeżeli ktoś się będzie bawił w modyfikacje, to proszę tylko o umieszczenie informacji o autorze.

Oto link do pobrania źródeł (jest to paczka z projektem Code::Blocks, plik źródłowy to main.cpp):

CursedSnake 0.5

Z góry dziękuję za wszelkie sugestie w komentarzach. 😉

Qt4

UWAGA! Ten wpis ma już 17 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Podchodzę do Qt4 już trzeci raz, i się przekonać nie mogę. Co im przeszkadzało, że w Qt3 Designerze można było aplikację wyklikać? A teraz Qt4 Designer to po prostu edytor formatek, a IDE ogranicza się do grupowania plików, by je przygotować go qmake. A ja chcę napisać prostą aplikację, przyzwyczajony do Qt4 Designer, a ostatnio jeszcze Delphi 7 z laborek. I przeglądam kilka IDE, ale nie mogę niczego podobnego do Qt3 Designer znaleźć.

Marzy mi się rozszerzenie

UWAGA! Ten wpis ma już 17 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Buszując po internecie – najczęściej w serwisach informacyjnych, różnego rodzaju portalach, itp. – znajduję mnóstwo nazwisk. Czy to polityków, czy osób z showbiznesu, czy jeszcze innych. Nie wiem, czy to tylko moja przypadłość, ale gdy nie kojarzę dokładniej danego nazwiska (chociażby z tego powodu, że telewizję oglądam sporadycznie) lub chcę się dowiedzieć, kim ta osoba jest – najczęściej zaglądam do Wikipedii i czytam informację o tej osobie. Nie zawsze jednak mi się chcę, co jednak wywołuje u mnie głód wiedzy: trudno mi się skoncentrować na reszcie artykułu.

I tak sobie myślę: czy dałoby się w prosty sposób wyławiać z kodu strony nazwiska oraz czynić te znalezione odnośnikami do strony w Wikipedii? Od strony ideowej jest to dość proste.

Otóż – gdy mamy kod strony, a dostęp do takowego na pewno mają rozszerzenia w Firefoksie – wystarczy przeszukać stronę za pomocą wyrażeń regularnych pod kątem występowania najczęstszej postaci nazwisk: spacja – duża litera – małe litery – spacja – duża litera – małe litery – spacja. Postanowiłem to sprawdzić grepem i rzeczywiście dla następującego wyrażenia: [[:space:]][[:upper:]][[:lower:]]*[[:space:]][[:upper:]][[:lower:]]*[[:space:]] znajdywanie nazwisk jest dość skuteczne. Przykładowo, dla dwóch losowych stron z któregoś portalu internetowego dostaję:

[dandys@localhost ~]$ grep -o [[:space:]][[:upper:]][[:lower:]]*[[:space:]][[:upper:]][[:lower:]]*[[:space:]] Desktop/1.php
 Dariusza Rosatiego
 Janusz Onyszkiewicz
 Rzeczypospolitej Polska
 Niemiec Carl
 Andrzeja Szczypiorskiego
 Zbigniewa Herberta
[dandys@localhost ~]$ grep -o [[:space:]][[:upper:]][[:lower:]]*[[:space:]][[:upper:]][[:lower:]]*[[:space:]] Desktop/2.php
 Sejmu Stefana
 Donald Tusk
 Unii Europejskiej
 Unii Demokratycznej
 Anna Bikont
 Jerzego Turowicza
 Portret Stefana
 Markiem Jurkiem
 Marka Jurka
 Jan Rokita
 Unii Demokratycznej
 Porozumienia Centrum
 Unii Demokratycznej
 Henryka Goryszewskiego
 Polskiej Partii
 Jerzy Robert

Jest tam parę niepasujących wyników, jednak i to byłoby do przejścia, gdyby pomijać takie przypadki i również tworzyć je jako linki.

Gdy już mamy te wyrażenia, należałoby wrzucić je w Google w celu pominięcia fleksji (wpisanie np. „Marka Jurka” w wyszukiwarkę z Wikipedii nie zawsze kierowałoby na stronę o Marku Jurku). Jednak to już kwestia wrzucenia: WYRAŻENIE site:pl.wikipedia.org w Google i użycie „Szczęśliwego trafu” doprowadzi nas do pożądanej strony.

To tyle teorii, dopiero teraz zaczynają się schody. Otóż pięknie byłoby mieć takie rozszerzenie w Firefoksie, jednak zupełnie nie mam pojęcia o ich tworzeniu. Jeżeli pomęczy mnie to dłużej, to spróbuję się trochę podszkolić w tym względzie. A może coś takiego już istnieje?

[Qt] sms-0.2

UWAGA! Ten wpis ma już 17 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Wprawdzie napisałem tę wersję już ponad tydzień temu, ale jakoś z braku czasu nie wrzuciłem. Poprawione błędy z poprzedniej wersji (m.in. obrazki dodane wreszcie do zasobów pliku wykonywalnego) oraz dodane funkcje z TODO. Oto i lista zmian w stosunku do wersji poprzedniej:

  • wprowadzenie historii wiadomości (użytkownik w łatwy sposób może wybrać, czy daną wiadomość chce zapisać w pliku historii),
  • dodanie wygodnej przeglądarki SMS-ów z historii,
  • edytor książki telefonicznej,
  • zmiany w interfejsie (np. zmiana sposobu wywoływania historii oraz edytora książki telefonicznej).
  • Brakło mi pomysłów na wersję 0.3, więc gdyby ktoś znalazł błędy w obecnej wersji lub miał jakiś pomysł – prosiłbym o napisanie go w komentarzu lub na mój e-mail.


    Linki do ściągnięcia:

    Kod źródłowy – sms-0.2.tar.bz2

    Binaria dla Linuksa (bez bibliotek) – sms-0.2-bin.tar.bz2


    A oto zrzuty ekranów z nowej wersji:

[Qt] sms-0.1

UWAGA! Ten wpis ma już 17 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Ostatnio z nudów i braku internetu na stancji, postanowiłem przepisać mój konsolowy program do wysyłania SMS-ów na jakąś „okienkową” bibliotekę. W moim wydaniu „jakąś” oznacza oczywiście Qt. 🙂

Wciągnęło mnie to dość. Ułożyłem GUI, użyłem QSocket zamiast socket.h, pobawiłem się trochę QListBox. Postanowiłem, że będę regularnie rozwijał ten program. I tak oto, po poprawieniu masy błędów i problemach z wspominanym QListBox, wydałem wersję 0.1, której funkcjonalność ogranicza się na razie jedynie do wysyłania SMS-ów i możliwości skorzystania z (manualnie jeszcze tworzonej) książki telefonicznej. Stworzyłem już jednak „listę życzeń” TODO, która w obecnej wersji wygląda następująco:

  • usunięcie dolnego paska zmiany rozmiaru,
  • usunięcie możliwości maksymalizacji,
  • logowanie wysłanych SMS-ów do pliku historii (jako opcja zależna od użytkownika),
  • dodanie opisów do elementów (podpowiedzi),
  • walidacja numeru,
  • edytor książki telefonicznej,
  • przejście TAB-em to kolejnych pól i przycisków.

To na razie tyle, po napisaniu tych opcji nadam projektowi numer wersji 0.2. Oczywiście, czekam też na wszelkie sugestie, które można zgłaszać w komentarzu do tego wątku, lub – jeśli komuś tak wygodniej – poprzez e-mail. Będę na bieżąco aktualizował powyższą listę.

Projekt powstaje oczywiście na licencji GNU GPL, ale po to, aby ktoś mógł sobie w przyszłości podejrzeć jego kod i być może się czegoś nauczyć, a nie po to, aby można było się wylansować na moich błędach (co już się zdarzało). Naprawdę – proszę o wyrozumiałość i konstruktywną krytykę, jestem otwarty na wszelkie propozycje. 🙂


A oto linki do poszczególnych wersji programu:

Kod źródłowy – sms-0.1.tar.bz2

Binaria dla Linuksa (bez bibliotek) – sms-0.1-bin.tar.bz2


Brak tam jeszcze wersji skompilowanej statycznie (wie ktoś, jak to zrobić dla Qt?) oraz wersji dla Windows. Tę drugą próbowałem wykonać, jednak dostaję błąd przy kompilacji. Gdyby komuś się to udało – proszę o kontakt.

I na koniec screen dla patrzących. 🙂

Z góry dziękuję za wszelkie sugestie i pomysły!

Konsolowy program do wysyłania SMS (przez bramkę Plus GSM)

UWAGA! Ten wpis ma już 17 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Ostatnio fascynuję się programowaniem sieciowym i jestem na etapie zainteresowania nagłówkami HTTP. Tak się składa, że chciałem sobie zautomatyzować proces wysyłania SMS-ów, aby nie wchodzić na sms.plusgsm.pl, a uruchomić sobie jeden konsolowy program, wpisać nadawcę, odbiorcę i treść.

W nagłówku wysyłanym przez program nie ma informacji o ID ciasteczka (wycięta celowo) po to, aby ominąć jedną z wielu ograniczeń bramki – czyli 10 SMS-ów na dobę z jednego komputera. Ograniczenia jednak są – ilośc SMS-ów wysłanych z bramki na konkretny numer GSM oraz z jednego IP.

Program nie obsługuje póki co polskich znaków w treści SMS-a, zaś zmienna nadawcy może zawierać jedynie litery, bez interpunkcji i znaków białych.

Może komuś akurat przyda się ten program. 😉 Zamieszczam jego źródło:

Dlaczego to nie działa?

UWAGA! Ten wpis ma już 17 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Czy ktoś może mi powiedzieć, dlaczego w poniższym kodzie podświetlony warunek nie wykonuje się? Chodzi mi o przypadek, gdy str2 nie zostanie znalezione w str1. Mimo tego, że według dokumentacji funkcja strstr() powinna zwracać NULL.

#include 
#include 

using namespace std;

int main()
{
char str1[80], str2[80];
char *ptr;

cout << "Wpisz tekst do przeszukania:";
cin >> str1;

cout << "Co mam wyszukac?";
cin >> str2;

ptr = strstr(str1, str2);
cout << "Znalazlem: " << '\'' << str1 << '\'' << " w ";
cout << '\'' << str2 << '\'' << '\n';
cout << ptr;
if(ptr==NULL) cout << "Nic z tego!"; // highlight
return 0;
}


Dandys IM v0.1 :)

UWAGA! Ten wpis ma już 17 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Ostatnimi czasy z nudów wziąłem się wreszcie za naukę socketów w C++. Miałem to już zrobić na początku maja, mam nawet wydrukowane samouczki, jednak myślę, że to właśnie one mnie do tego zniechęcały. A to nie był← pisane pod kątem C++, a to były zbyt obszerne i za dużo w nich było teorii. Dopiero kolejne poszukiwania (bodajże przedwczorajsze) naprowadziły mnie na właściwy trop. I tak oto, aby poznać sockety w praktyce, postanowiłem napisać sobie pseudokomunikator – Dandys IM. 😉

Póki co ma on tylko funkcję serwera (klienta mi się dopisać nie chciało, dlatego robi z niego teraz Telnet) i parę błędów (m.in. taki, że wiadomości pojawiają się czasem dopiero po wysłaniu wiadomości przez nas), ale mi to wystarczyło, żeby się przekonać, jak to fajnie, gdy mój pierwszy program z socketami potrafi porozumiewać się ze światem. 🙂

Niżej zamieszczam źródełko programu, jak komuś się chce, to wiadomo, co robić (nie wiadomo? no to: g++ socket_server.cpp -o socket_server). Jakby komuś się aż tak nudziło i poprawił buga, o którym pisałem, to proszę o kontakt.

I na koniec podziękowania dla testerów, których to często nękałem ostatnio:

Dzięki chłopaki za czas!

I oczywiście dokumenty, z których korzystałem przy nauce. Polecam ściągnięcie obydwu, wydrukowanie i parę godzin analizy.

 

Ruszyła XIV Olimpiada Informatyczna!

UWAGA! Ten wpis ma już 18 lat. Pewne stwierdzenia i poglądy w nim zawarte mogą być nieaktualne.

Wczoraj ruszyła XIV Olimpiada Informatyczna. Jak zwykle do rozwiązania mamy pięć zadań.

Póki co, dopiero je wydrukowałem, jednak w wolnym czasie postaram się przejrzeć i zacząć „dłubać”. 🙂 Jeśli coś wymyślę, podzielę się spostrzeżeniami (oczywiście mieszcząc się w ramach regulaminu).

Czy ktoś z Was bierze również w niej udział? Jeśli tak, to w jakim jesteście wieku (która klasa) i który raz próbujecie? Macie na swoim koncie jakieś sukcesy? 🙂

Zapraszam do dyskusji w komentarzach.