Author Archive

Gdynia _PRAWIE_ dostępna dla inwalidów

Jak powszechnie wiadomo „prawie” robi wielką różnicę.

Oto przejaw geniuszu projektanta bądź talentu wykonawcy.

Gdynia Główna – nowy peron SKM, jakże dostępny dla inwalidów na wózkach i matek z dziećmi:

Czyżby nastała pora na nowy sport ekstremalny – jazda na jednym kole wózka inwalidzkiego/dziecięcego?

Nic, tylko pogratulować 😉

Makro spacerkiem po Redzie

Kilka fotek pstrykniętych komórką Sony Ericsson K550i przy okazji spaceru z rodzinką:

Spacerem po Redzie

Błąd wysłania formularza

Ku pamięci…
Nazwa funkcji w JS nie może być taka sama jak id jakiegoś pola formularza.
FF sobie radzi, opera i m$ – nie.

Żeby nie być gołosłownym…
W pewnym projekcie zaistniała potrzeba użycia javascriptu do submitu formularza z uprzednim podmienieniem wartości pola hidden na wartość podaną jako parametr funkcji.
Czuję, że jak zwykle zakręciłem i nie wiadomo o co mi chodzi.
Do rzeczy więc.
Mamy sobie stronkę:




http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
Form error
name="author" content="Kashub" />

>
<?
if(!empty($_POST)) {
echo '
POST:
' . var_export($_POST, 1) . '

’;
}
?>

action=„” method=„post” id=„updateWirtForm”>
type=„text/javascript”>
function sru(avid) {
document.getElementById(’sru’).value = avid;
document.getElementById(’updateWirtForm’).submit();
}

type=„hidden” name=„sru” id=„sru” value=„” />
href=„#” onclick=„sru(’1′)”/>wyślij z podmianą hiddena



Na pierwszy rzut oka nic szczególnego – po kliknięciu na link ma się ustawić wartość wpolu hidden i wysłać formularz.
W wyniku spodziewamy się czegoś takiego:

POST:
array (
'sru' => '1',
)

wyślij z podmianą hiddena

… i tak też się dzieje na Firefoksie.
Wszystko było by fajnie, ale spójrzmy co na to np. Opera:

JavaScript - http://localhost/f.php
Event thread: click
Error:

name: TypeError

message: Statement on line 1: The Object does not implement [[Call]]
Backtrace:
Line 1 of script

sru("1");
At unknown location

[statement source code not available]

Również pod m$ie zaawansowany debug wyświetlił niezwykle treściwą informację – „Błąd na stronie”. Być może dało by się gdzieś doczytać komunikat, ale pod winkiem jakoś nie da się ni
c więcej 🙂

Rozwiązanie okazało się bardzo proste, ale nieco nieoczekiwane. Wystarczy zmienić albo nazwę funkcji w javascript albo id hiddena w formie.
Mam nadzieję, że zaoszczędzę komuś nieco czasu dzięki temu wpisowi 🙂

Włam do bankomatu przez bluetooth

Receptura:

Podchodzimy do bankomatu PKO w Redzie:

Włączamy w komórze bluetooth’a i nawiązujemy połączenie z bankomatem.
Bankomat grzecznie nas informuje, że odnaleziono nowe urządzenia:

W telefonie wciskamy kombinację klawiszy XXX-X-XX-XXXXX-XX-XX, następnie zieloną słuchawkę i podstawiamy jakiś worek
pod bankomat, który wypluje wówczas wszystkie banknoty, które posiada w środku.

Na koniec wciskamy „Rozłącz” i idziemy do kolejnego bankomatu celem powtórzenia operacji 😉

Makro komórką

Kilka fotek machniętych sonyeryksonową komórą z nudów u rodziców na podwórku 🙂
BTW, ma lepsiejsze makro niż

Trochę makro

Jestem – mieszkam :)

Tak… w końcu się udało.
Mam gdzie mieszkać! 🙂
Nie, nie oznacza to, że wcześniej spałem pod mostem 😀
Udało się w końcu z mieszkaniem. Kupiłem mieszkanko z pół roku temu (oczywiście podpisując cyrograf na 30 lat, czyli biorąc kredyt mieszkaniowy) i w końcu udało się z miesiąc temu je wykończyć lepiej niż mi się marzyło.
Chciałem tylko na tyle, żeby szło mieszkać, czyli generalnie kilka niezbędnych „mebli” w łazience i materac w pokoju ;D
Do całkowitego ukończenia mieszkania jeszcze daleka droga, ale pomalutku „się zrobi”.

Ale do rzeczy. Ten post ma być podziękowaniem dla osób, bez których bym nadal „nie mieszkał”. Z tego miejsca dziękuję serdecznie:

  • Mamie – za zaangażowanie, poświęcenie masy czasu na załatwienie wszystkiego, organizację, pomysły, pracę twórczą, projektowanie, itp.,
  • Tacie – za wkład finansowy, bez którego ani moje marzenia, ani Mamy pomysły na nic by się nie zdały,
  • Bratu – bez Niego moje marzenia z Mamy pomysłami i Taty pomocą finansową też na nic by się zdały, bo nie było by komu zrobić tego wszystkiego,
  • Koledze Mariuszowi – za pomoc w ściągnięciu na miejsce Żony i Córeczki, bez których nie miałbym po co tu mieszkać,
  • wandzie (wtajemniczeni wiedzą o co chodzi) – za to, że nie muszę oglądać jej gęby ani słuchać, jak bez przerwy robi awantury Rumcajsowi kompletnie o nic. Napisałbym z byle powodu ale to nie starcza, bo bywa na ogół, że bez powodu (sic!).

Dziękuję też wszystkim innym, którzy wspierali mnie w jakikolwiek sposób, zwłaszcza Żonie za wsparcie psychiczne.

Raz jeszcze z całego serca dziękuję Wam!

p.s. Osoby zainteresowane parapetówą z przykrością informuję, że już po. Kto przyszedł, ten wyszedł 😛

Skype na OpenSuse 10.2 x86_64

Zachciało mi się wrzucić Skype na swoim pingwinowym laptopie a tu klops. Skype nie chce banglać na OpenSuse 10.2 .
Po przegooglowaniu kawałka świata okazało się, że skype z rpm, to se mogę w buty schować, b oi tak nie pójdzie. Trze było pokombinować inaczej. Dokładnie już nie pamiętam co i jak, ale mniej więcej żeby Skype działał trzeba zrobić tak:
Pobrać sobie skype jakiś tam 'static’, czyli:
wget http://www.skype.com/go/getskype-linux-static
Potem jak się zassa, to trza by to wypakować:
tar -jxf skype_static-1.4.0.118.tar.bz2
No i fajnie jest skype, jak wpiszemy w konsoli ./skype to… no właśnie, to wielkie g… – coś krzyczy, że czegoś tam sobie nie ma.
Żeby skype banglał na naszym 64-bitowym OpenSuse 10.2 trzeba mu dociągnąć cosik z 32 bitow. Generalnie sprawa wygląda tak, że ściągamy libsigc++2-2.0.17-32.i586.rpm:
wget http://ftp.gwdg.de/pub/opensuse/distribution/10.2/repo/oss/suse/i586/libsigc++2-2.0.17-32.i586.rpm
Potem trza by przejść na root’a, żeby móc zrobić to, co za chwilę zrobimy:
su
mc

Tak, to słynny legendarny Midnight Commander. Jest on nam potrzebny, bo ma pewny 'ficzer’, o który w innych programikach dość ciężko w dzisiejszych czasach – umożliwia łażenie po rpm’ach tak, jakby to były katalogi. Przyda się nam to, bo musimy cosik wyciągnąć ze ściągniętego przed chwilą rpm’a.
Wchodzimy za pomocą mc do libsigc++2-2.0.17-32.i586.rpm -> CONTENTS.cpio -> opt -> gnome -> lib Jak używasz KDE, to się nie przejmuj, ja też, ale mimo wszystko używamy katalogu 'gnome’. Z katalogu, do którego przed chwilą weszliśmy kopiujemy libsigc-2.0.so.0 oraz libsigc-2.0.so.0.0.0 do katalogu /lib w naszym systemie.
Po skopiowaniu zamykamy mc (klawisz F10). Następnie wpisujemy exit żeby wrócić z root’a na naszego 'normalnego’ usera.
Wpisujemy w konsolkę ./skype & i… powinno banglać.
Piszę, że powinno, bo nie mam pojęcia, czy u Ciebie zadziała czy nie. U mnie pomogło, u kolegi też, więc jest duża szansa, że i Tobie pomoże, jeśli masz kłopoty ze Skype’m.
Jeśli chodzi o mnie, to do używania Skype’a u mnie jeszcze daleko z dwóch powodów, a mianowicie dodupnej jakości czy raczej głośności dźwięku oraz jeszcze bardziej dodupnego dostawcy internetu, u którego padu-padu nawet potrafi przymulać (poza przymulaniem własnym).
Gdyby ktoś miał jakieś pytania/uwagi/cokolwiek, to pisać w komentarzach, może przejdzie moderację 😉

Koniec z goleniem nóg!

No tak… w końcu stało się to, co prędzej, czy później stać się musiało.
Zanim posądzicie mnie o jakieś skłonności trans czy coś, przeczytajcie o co chodzi z tym goleniem nóg 🙂
No ale może od początku… albo nie… od końca, o!
Krótko mówiąc w końcu zmieniam pracę!
Zaczęło się niewinnie. Numer telefonu od kogoś do kogoś (niestety publicznie nie mogę zdradzić, bo obiecałem), jeden dzień wolnego akurat w pracy, więc poszedłem na rozmowę nazwijmy to kwalifikacyjną. Pogadaliśmy na luzie i usłyszałem Zadzwonię do ciebie w poniedziałek. Niczego nie podejrzewając siedziałem wczoraj w byłej (heh, jak to fajnie brzmi) pracy. No właśnie…. Siedziałem… ale o tym za chwilę.
Zamiast dzwonić w poniedziałek zadzwonili już w piątek z informacją Od poniedziałku zapraszamy do pracy. Odpowiedziałem więc, że będę, tylko muszę iść powiedzieć do widzenia szefowej. Tak też zrobiłem. Nie wiem do końca co sobie o mnie myślała, ale mimo wszystko miło chociaż ostatniego dnia pracy dowiedzieć się, że władzy na mnie zależało.
Siedziałem, bo taka to praca była. I nie to, żeby siedzieć przy kompie i zajmować się programowaniem czy czymkolwiek użytecznym, tylko praca jako tzw. zapchaj dziurę, a konkretnie siedziałem na recepcji i to nie pierwszy raz, bo nie ma komu tak siedzieć(sic!). I właśnie stąd taki temat wpisu, bo nie mając innego wyjścia zwyczajnie naśmiewałem się sam z siebie, że stanowisko zobowiązuje i muszę golić nogi 😀
Dużo by pisać i opowiadać o tamtej byłej pracy i rzeczach, które tam musiałem robić, ale wolę zapomnieć. Pewnie nie będzie łatwo, powróci nie raz w koszmarach wraz ze wszystkowiedzącym i upartym prawie tak bardzo jak ja Zorrem (wtajemniczeni z lekką znajomością hiszpańskiego wiedzią o co biega 😉 ).
Póki co zostawiam to wszystko w spokoju i pewnie tak już pozostanie. Póki co czekam jeszcze na wypłatę za wrzesień, więc spokój może przerodzić się w niemałą i niemiłą (już nie dla mnie) wojnę, ale to tylko ostateczność w postaci obrony przez atak 😉 Taki już jestem, że jak mi ktoś nadepnie na odcisk, to po trupach, ale udupię. No ale może nie będę musiał się użerać :]
Co będzie dalej się zobaczy. Jednego jestem niemal pewien, że ani przez moment nie pożałuję tego kroku.
Teraz będę pracował bliżej, od poniedziałku do piątku po 8 godzin, wolne weekendy, urlop (normalnie szok! co to znaczy „urlop”?), zwrot kosztów dojazdu, itp. ale przede wszystkim będę robił to, co lubię, czym się interesuję i to, w czym chcę się dalej rozwijać.
Co z tego wszystkiego wyniknie dowiem się już wkrótce.
Póki co kończę wywód, bo nic mi się już dziś nie chce. Znowu zaczęło się jeżdżenie w weekendy na parodię uczelni.

p.s. Dziękuję wszystkim normalnym z tamtej roboty. Fajnie czasami było ponabijać się z pozostałych – cholernych tchórzy, dupowłazów i kablarzy.

Category: Bez kategorii  Tags:  Leave a Comment

Kashub Geek za 3625 dolców?!?

Hmm… idąc za linkiem na wykopie zrobiłem sobie teścik.
Pytanka wypełniałem uczciwie i wyszło mi oto coś takiego:
50% Geek
Tylko kto mi powie co to oznacza? Czy 50% Geek to dobrze, czy źle?
Myślę, że ciężko tak po prostu to stwierdzić po jednym „badaniu”.
Ale mam plan. Wypełnię sobie ten teścik raz jeszcze, na przykład za kilka miesięcy. Wtedy zobaczymy jak zmienia się moja „Geekowatość” 😀
Tylko żeby się nie okazało, że jest już za późno… 0_o

//edit
Widzę, że stronka ma kilka ciekawych testów. Nie wiem czy to, co napiszę nie okaże się dla mnie zagrożeniem, ale wyszło mi, że martwy jestem warty $3625 :
$3625.00The Cadaver Calculator – Find out how much your body is worth. From Mingle2 – Free Online Dating

Sposób programisty na blokowanie reklam

Wszystkich nas denerwują natrętne i wszędzie obecne reklamy na stronach internetowych.
Osoby mniej cierpliwe starają się je blokować na różne sposoby, np. używając tworzonych do tego celu programów czy też plug-in’ów do przeglądarek.
Nie wszyscy jednak wiedzą, że istnieje jeszcze sposób, który polega na wskazaniu systemowi operacyjnemu, że w przypadku, gdy przeglądarka łączy się z jakimś adresem (np. z serwerem reklam), to ma zamiast tego łączyć się z wybranym innych adresem. Najczęściej jest to przekierowanie tych wywołań na adres własnego komputera, czyli na adres 127.0.0.1, czyli inaczej localhost.
Blokowanie reklam tym sposobem odbywa się poprzez dopisanie znanych serwerów do pliku hosts w systemie operacyjnym. W porządnych systemach operacyjnych lokalizacja tego pliku to /etc/hosts. W Windows 98 jest to domyślnie c:\windows\hosts, w Windows XP oraz Viściec:\WINDOWS\system32\drivers\etc\hosts. W tym czymś ostatnim, to AFAIK nie da się tak po prostu mieszać w omawianym pliku, ale tutaj jest na to sposób.
Struktura pliku jest bardzo prosta. W pierwszej kolumnie wpisujemy adres ip, na który mamy zostać przekierowani przy odwołaniu do serwera, którego nazwa podana jest w kolumnie drugiej. Przykładowy wpis wygląda następująco:

127.0.0.1 pagead2.googlesyndication.com

Dzięki dodaniu tej jednej linijki do naszego pliku hosts nie będziemy już na przykład zmuszeni do oglądania reklam z Google’a.
Jak się zapewne domyślasz wystarczy dodać inne serwery z reklamami do naszego pliku hosts i jesteśmy wolni od reklam. Pojawia się tylko pytanie Skąd wziąć te wszystkie adresy, albo choćby większość z nich? Czy trzeba je samemu śledzić i wpisywać ręcznie? Spokojnie, nie trzeba. Można sobie pobrać stąd lub wykorzystać ten, którego ja używam (tu wielkie dzięki dla Vip’a).
No dobra. Mamy adresy, wszystko niby ok, już nie ściągamy znikąd reklam, tylko kierujemy na swój komputer. Ale co dalej? Mi osobiście nie podobał się ani komunikat o błędzie, że nie można załadować strony ani też po odpaleniu Apache’a ładowanie domyślnej stronki z localhost’a.
Postanowiłem wykorzystać moc wirtualnych hostów w Apache’u.
Najpierw do httpd.conf dodałem nowego wirtualnego hosta, na który chciałem przekierowywać wszystko, co mi plik hosts wyłapuje. W sekcji odpowiedzialnej za hosty wirtualne dodałem tych kilka linijek. Oznaczają one tyle, że w katalogu /mnt/lin2/web/v/localhost

 DocumentRoot /mnt/lin2/web/v/localhost

…mam sobie plik index.php, który jest zarówno domyślnym plikiem, jak również plikiem, który jest wykonywany w przypadku, gdy żądanego obiektu nie można odnaleźć na serwerze:

 DirectoryIndex index.php
ErrorDocument 404 /index.php

Zdecydowana większość wyświetleń będzie się opierać właśnie na błędzie 404.
OK, po restarcie Apache'a doszliśmy więc do tego, że jak chce się gdzieś pokazać reklama, to się nie pokaże, tylko odwoła mi się do pliku /mnt/lin2/web/v/localhost/index.php.
To niestety jeszcze nie wszystko. Jeśli chodzi o jakieś iframe’y, to można by w pliku index.php napisać po prostu [spam] i to by wystarczyło. Dla mnie to jednak za mało.
Chcę, żeby mój skrypt:

  • działał dla
    • stron html,
    • zdjęć, animacji i obrazków,
    • skryptów JavaScript
  • posiadał funkcjonalność, która pozwoli mi określić jaki element został właśnie zablokowany, aby wiedzieć jaki adres usunąć z pliku hosts na wypadek gdyby nie podobało mi się to, że zablokował dany element.

Przechodzimy więc do naszego pliczku index.php.
Aby wiedzieć czego dotyczy dane żądanie i co zostało zablokowane używamy:

$req = $_SERVER['REQUEST_URI'];

Samo to nie wystarczy, bo musimy jeszcze wiedzieć jaki adres odblokować w hosts. Pełną ścieżkę wraz z nazwą serwera pobieramy więc za pomocą:

$full_path = $_SERVER['HTTP_HOST'] . $req;

Mamy już pełny adres pod zmienną

$full_path

. Przechodzimy więc do części właściwej – wypisania w miejscu, gdzie miała być jakaś reklama napisu [SPAM] wraz z pełną ścieżką żądanego elementu. Jeśli zablokowany element to strona HTML, to wystarczy kawałek kodu (już z kolorowaniem):

"width: 98%; height: 98%; overflow: auto;
background-color: #fee; color: #f00;
font-family: courier; font-size: 14px;"
>
[SPAM] <?php echo $full_path; ?>

Jeśli gdzieś był jakiś iframe z blokowaną przez nas reklamą, to zamiast owej reklamy zobaczymy przewijane okienko z jasnoczerwonym tłem i czerwonym napisem z adresem zablokowanego elementu. Proste? Proste!
Przejdźmy teraz do skryptów JavaScript. Tu sprawa nieco się komplikuje. Najpierw sprawdźmy, czy adres żądanego elementu kończy się na .js:

if (eregi('^(.)+(js)$', $req))

Teraz musimy wypisać nasz komunikat za pomocą JavaScriptu na stronie, która ten skrypt wywołała:

document.write('
background-color: #fee; color: #f00;
font-family: courier; font-size: 14px;">'
+
'[SPAM]<?php echo htmlspecialchars($full_path) ?>'
);

Żeby przeglądarki wiedziały, że mają do czynienia ze skryptem JS musimy jeszcze przed wysłaniem w/w treści wpisać:

header('Content-type: text/javascript');

Wszystko niby ładnie i pięknie, jednak w testach się okazało, że tak generowany skrypt nie działa, czyli nie wypisuje treści w referującym dokumencie. Po chwili zastanowienia znalazłem gada. Błąd polegał na tym, że jeśli element nie istnieje (a na ogół nie istnieje), to serwer www wysyła nagłówek 404, który informuje przeglądarki, że tego, co otrzyma za chwilę nie ma interpretować jako skrypt, bo coś nie poszło. Rozwiązaniem jest dodanie przed w/w linią poniższego kodu:

header('HTTP/1.1 200 OK');

Dzięki temu przeglądarka uzna, że plik skryptu istnieje i poprawnie go wykona.
Pozostało nam teraz napisanie kodu, który będzie się wykonywał w przypadku, gdy blokujemy jakiś obrazek. Najpierw sprawdźmy, czy żądany element jest obrazem (na podstawie rozszerzenia oczywiście):

if (eregi('^(.)+(jpg|png|gif|jpeg|svg|bmp)$', $req))

Informujemy przeglądarkę, że będziemy wysyłać np. GIF’a:

header('Content-type: image/gif');

Tworzymy tego GIF’a o wysokości np. 20 px i szerokości równej ilości liter w adresie żądanego elementu razy 10 px + 30 px na napis [SPAM]:

$obrazek = ImageCreate(10*strlen($full_path)+30,20);

Teraz na obrazku piszemy znany już nad pełny adres żądanego elementu:

ImageString($obrazek,4,3,2,'[SPAM] ' .
htmlspecialchars($full_path),$kolor_tekstu);

I na koniec wysyłamy spreparowany obrazek do przeglądarki:

ImageGif($obrazek);

No i to wszystko!
Troszkę pisania, ale bynajmniej nie muszę oglądać reklam, szybciej ładują mi się strony i widzę co zablokowałem na wypadek, gdybym jednak chciał gdzieś tam coś obejrzeć :]
Osoby, którym się nie chce pisać podaję kod źródłowy pliku odpowiedzialnego za przechwytywanie reklam ze stron internetowych. Może nie jest to kod idealny, pewnie można go i ulepszyć i przyspieszyć, dodać obsługę np. flash’a, napisać w OOP, itp, ale podaję go tylko jako przykład i jeden ze sposobów na natrętne reklamy na stronach www.
Na zakończenie screen z zasypanej na ogół reklamami stronki przy użyciu opisanej metody ich blokowania: