Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

DIODA - wykrywanie (C#) i jej ewolucja w przeciągu 30 dni konkursowych

Dioda konkursowa - Intel królem marketingu

Sam pomysł na formę konkursu z diodą jest genialny. Osoby biorące udział w "zawodach" co chwile musiały sprawdzać czy na stronie nie ma żółtej "gwiazdeczki". To automatycznie sprawiało, iż liczba użytkowników oglądających portal, z pewnością wzrosła przez ten miesiąc.

Mam nadzieje, że redakcja udostępni jakieś statystyki, odnośnie użytkowników biorących udział w konkursie i odwiedzin vortalu. A że popularność portalu wzrosła jest pewne.

W mojej pracy przed rozpoczęciem konkursu, większość osób korzystała z dp.pl jedynie w celu ściągania aplikacji. Od kiedy rozpoczął się konkurs, każdy wiedział co kryje się pod hasłem "dioda", oraz część osób na bieżąco obserwowała rankingi na stronie i niektórzy nawet założyli konta i także czekali na diodkę. Było w tym wiele emocji, nerwów i niesłychanie dużo frajdy :P

Pytania specjalne były naprawdę wciągające. Ale to co mnie zaskoczyło i również wciągnęło to pytania normalne, z 4 odpowiedziami. Mowa tu oczywiście o słynnym pytaniu:

Kiedy powstał pierwszy dostępny komercyjnie procesor Intela?
Wtedy pojawił się na rynku pierwszy komputer osobisty z procesorem Intel® 8088 (był to IMB PC).

Dyskusja jaka wywiązała się po pojawieniu się pytania chyba zaskoczyła wszystkich. Większość z nas "przekopała" internet w poszukiwaniu danych odnośnie pierwszych procesorów Intela. Każdy przedstawiał swoje racje i obawy. To było coś niesamowitego. Szkoda, że konkurs już się skończył. Ale zostawił na pewno w nas bardzo miłe wspomnienia, czekamy na kontynuację! :)

Ale nie zbaczajmy z tematu, to jeszcze nie czas na podsumowanie. Głównymi beneficjentami konkursu są oczywiści poszczególni użytkownicy, którzy wygrali nagrody. Ale również sam vortal dobreprogramy.pl no i oczywiście... INTEL. Reklamę jaką sobie zrobiła firma Intel jest wręcz bezcenna. Przez miesiąc logo była na stronie głównej dp.pl, każda z osób biorących udział w konkursie czekała na pytania związane z firmą Intel, świadomość związana z marką wzrosła niewątpliwe.
Przeliczmy wartość nagród (ceny z ceneo.pl, cena plecaka obliczona "na oko":P):

1x MSI Classic CR620-049XPL - 1x 2 145zł = 2 145zł
3x ASUS Eee PC 1001PX - 3x 1 059zł = 3 177zł
30x Plecak intel - 30x 150zł = 4 500zł
--------------------------------------------------------------------
9 822 zł

Nie jestem tam jakimś marketingowcem, ale nie jest to chyba wygórowana wartość jak na miesięczny konkurs. Oczywiście pewnie firma Intel mogła dopłacić dla osób przygotowujących konkurs i "wesprzeć" dobreprogramy.pl Ale chyba popularność konkursu zaskoczyła wszystkich i przyniosła dla każdej ze stron wymierne korzyści.

Uffff, zaraz, miało być o wykrywaniu diody, a nie jakieś analizy konkursu:) Zatem do dzieła.

Dioda konkursowa od kuchni

Opisany sposób jest jedynie informacja, o tym jak można było wykryć diodę jednym z wielu, wielu sposobów.

Pierwsze spojrzenie na diodę mogło mylnie sugerować, iż żółta dioda zapala się poprzez plik swf:

http://www.dobreprogramy.pl/App_Themes/Intel/images/dioda.swf

Jednakże już samo spojrzenie na sam plik swf, sugerowało, iż jest inaczej. Gdy pytanie konkursowe było aktywne, żółta dioda konkursowa była ustawiana jako tło i "przykrywana" plikiem swf który przyjmował kolor niebieski, lub był przezroczysty, co sprawiało, iż dioda migała na żółto. Ktoś w komentarzach, słusznie zauważył, iż dioda na stronie http://konkurs.dobreprogramy.pl/, gdy nie ma pytania miga na niebiesko. Oczywiście. Tło było niebieskie, a plik swf z niebieskim kolorem migał również niebieskim kolorem.

Następnie należało odkryć skąd jest brany kolor diody. Z pomocą przyszedł dodatek Firebug do Firefoxa, po jego uruchomieniu otrzymałem coś niezwykle pomocnego:

Rys. 1 Dioda w ostatnim dniu konkursu

Na załączonym obrazu widać, iż tło z diodą pobierane jest z web serwisu. Musimy zatem pobrać te tło i odpowiednio je zinterpretować, aby móc wykryć żółtą diodę.

Zdjęcie pochodzi z ostatniego dnia konkursowego.

Dioda miała kilka wcieleń podczas całego konkursu. Postaram się opisać każde z nich oraz sposób wykrycia żółtej diody.

Przepis na diodę - Dioda w sosie własnym

Załóżmy, że korzystamy z darmowych, dostępnych składników. Oto one:

Do wykrycia diody potrzebujemy:
- instalka Microsoft Visual C# 2010 Express
- Firefox
- dodatek Firebug do Firefoxa
- połączenie z internetem

Czas przyrządzenia wersji najprostszej: kilka minut.

Smacznego!

I jeszcze coś...

Po przeanalizowaniu regulaminu konkursu, nie znalazłem nic, co mówiło by o tym, iż nie można używać aplikacji do sprawdzania diody. Dodatkowo wiele osób w komentarzach pod wpisami na stronie głównej chwaliło się swoimi programami. A, że czołówka w większość miała aplikacje jakieś własne, to chyba nikt w to nie wątpi.

Dioda 1.x

/Analiza - Dioda 1.0/Pierwsza dioda była bardzo prosta:

Rys. 2 Dioda 1.x zwracana przez web serwis

Zabezpieczaniem był prostokąt zawierający losowe kolory pikseli. Co uniemożliwiało sprawdzenie, czy web serwis zwraca diodę żółtą, na podstawie rozmiaru/sumy kontrolnej obrazka.

Link do web serwisu był również ciekawy:

http://www.dobreprogramy.pl/ContesstIsActive.ashx?q=20101009124534

Query string zawierał ciąg znaków, który był "losowy". Dzięki czemu na starszych przeglądarkach (np. IE6) obrazek zwracany z web serwisu nie był cacheowany.
Jednakże łatwo zauważamy, iż jest to aktualna data w formacie:

ROKmiesiącDZIEŃgodzinaMINUTAsekunda.

/Kod - Dioda 1.0/

Zastosowałem Obiekt Parametrs, dzięki czemu niektóre parametry można było ustawić w oknie opcji.
Opis parametrów obiektu Parameters: par.Ur - url do web serwisu, który zwracał obrazek z diodą par.PixelX - współrzędna X jaką należy sprawdzić par.PixelY - współrzędna Y jaką należy sprawdzić par.ColorR_From - składowa R pixela, granica dolna par.ColorR_To - składowa R pixela, granica górna par.ColorG_From - składowa G pixela, granica dolna par.ColorG_To - składowa G pixela, granica górna par.ColorB_From - składowa B pixela, granica dolna par.ColorB_To - składowa B pixela, granica górna

Kod sprawdzający czy dioda się "zapaliła": public bool IsDiodeActive(Parametrs par) { DateTime now = DateTime.Now; WebClient wc = new WebClient(); byte[] data = wc.DownloadData(par.Url + "?q=" + now.Year.ToString("0000") + now.Month.ToString("00") + now.Day.ToString("00") + now.Hour.ToString("00") + now.Minute.ToString("00") + now.Second.ToString("00") ); Bitmap bitmap = new Bitmap(new MemoryStream(data)); Color c = bitmap.GetPixel(par.PixelX, par.PixelY); if (c.R >= par.ColorR_From && c.R = par.ColorG_From && c.G = par.ColorB_From && c.B = par.ColorR_From && c.R = par.ColorG_From && c.G = par.ColorB_From && c.B <= par.ColorB_To) { return true; } else { return false; } }

Krótki opis:
- metoda IsDiodeActive zwraca true/false z informacją czy dioda się zapaliła, czy nie
- za pomocą obiektu WebClient pobieramy obrazek z web serwisu
- tworzymy link z uwzględnieniem query stringa (nie jest to obowiązkowe!)
- rzutujemy pobrane dane na bitmapę
- wyciągamy odpowiedni pixel z bitmapy
- sprawdzamy czy RGB pixela mieści się w granicach dla żółtej diody

Update - Dioda 1.1W międzyczasie, było kilak zmian, które sprowadzały się do zmiany nazwy web serwisu zwracającego dane. Trudność polegała na tym, iż stary web serwis zostawał aktywny, lecz zwracał cały czas niebieską diodę. Dzięki temu, iż url do web serwisu był w parametrach, można było szybko podmienić poprawny web serwis.

Podsumowanie
+ świetny pomysł z samą diodą i plikiem swf
- trochę słabe zabezpieczenia

Ogólna ocena:
4-/6

Dioda 2.x

/Analiza - Dioda 2.0/

Kolejne wcielenie diody było miłym zaskoczeniem. Ktoś tam po drugiej stronie włożył w to sporo pracy. Nazwałem tą wersje 2.0, gdyż zmiany są dość znaczące: (kliknij by powiększyć!)

Rys. 3 Dioda 2.x

Jak zwykle z pomocą przyszedł Firebug. Z załączonego obrazka widzimy, iż bitmapa zwracana przez web serwis, już jest inna. Znajdują się na niej 8 diod. Nawet gdy nie było pytania, zawierała ona zarówno niebieskie, jak i żółte diody. Celem było znalezienie w jaki sposób wybierana jest dioda poprawna, do wyświetlenia.

Tak, Firebug jest niemalże niezbędny:P Szybka analiza kodu strony, pozwoliła na znalezienie ukrytego kodu CSS, który odpowiadał za przesuniecie bitmapy tak, by odpowiednia dioda została wyświetlona, patrz rys. 3 (A).

/Kod- Dioda 2.0/

Zmieniony kod:public bool IsDiodeActive(Parametrs par) { WebClient wc = new WebClient(); byte[] dataHtml = wc.DownloadData("http://konkurs.dobreprogramy.pl/"); string plainHtml = Encoding.UTF8.GetString(dataHtml); Point p = GetOffset(plainHtml); byte[] dataImg = wc.DownloadData("http://konkurs.dobreprogramy.pl/ContestHandler.ashx?q=" + GetQuery(plainHtml)); Bitmap bitmap = new Bitmap(new MemoryStream(dataImg)); Color c = bitmap.GetPixel(par.PixelX + p.X, par.PixelY + p.Y); (... dalej jak w wersji 1.0 ) }

Krótki opis:
- zmiana była dość znacząca, teraz pobieramy cała stronę (http://konkurs.dobreprogramy.pl/, gdyż jest lżejsza niż http://dobreprogramy.pl)
- dla strony metoda GetQuery odszukuje query string do doklejenia na koniec zapytania do web serwisu (także nie jest to obowiązkowe!)
- metoda GetOffset dla pobranej całej strony wyszukuje przesunięcie, algorytm jest maxymalnie prosty, wyszukujemy słowa #diode, i tniemy/skracamy kod aż będziemy mieli pożądane dane (patrz rys. 3 (A))
- teraz ściągamy bitmapę z ośmioma diodami
- robimy przesunięcie pixela o dane otrzymane z parsowania strony html przez metodę GetOffset
- dalej robimy taka samo jak dla diody 1.x

Update - Dioda 2.5Bardzo znaczący update diody. Można powiedzieć, iż wersja 2.0 powinna od razu zawierać zmiany wprowadzone w wersji 2.5.

W samej diodzie nic się nie zmieniło. Zmienił się tylko (lub aż), kod CSS ustawiający diodę. Prosty kod CSS (patrz rys. 3 (A)), został zamieniony na "zamotany" kod przedstawiony na rys. 3 (B).

Jednakże przyklejając go do Notepad++ szybko się orientujemy, że kod ten został tylko delikatnie obfuskowany, co widzimy na rys. 3 (C). Dodano komentarze, które zaciemniały kod. Mała zmian, ale dość pomysłowa :)

Zatem należało zmienić tak algorytm, ażeby najpierw usunął komentarze z kodu CSS. Dodatkowo w tej wersji url do web serwisu, brać można również z kodu CSS, co zostało zaznaczone na (B) i (C).

/Kod- Dioda 2.5/

Zmieniony kod:public bool IsDiodeActive(Parametrs par) { WebClient wc = new WebClient(); byte[] dataHtml = wc.DownloadData("http://konkurs.dobreprogramy.pl/"); string plainHtml = Encoding.UTF8.GetString(dataHtml); string[] values = GetDataFromHtml(plainHtml); Point p = new Point(int.Parse(values[1]), int.Parse(values[2])); byte[] dataImg = wc.DownloadData("http://konkurs.dobreprogramy.pl" + values[0]); Bitmap bitmap = new Bitmap(new MemoryStream(dataImg)); Color c = bitmap.GetPixel(par.PixelX + p.X % 108, par.PixelY + p.Y % 108); (... dalej jak w wersji 2.0 ) }

Krótki opis:
- nadal pobieramy kod html z http://konkurs.dobreprogramy.pl/
- parsujemy go metodą GetDataFromHtml, która z zaznaczonego kodu (B) pobiera adres do web serwisu oraz przesunięcie. Oczywiście wcześniej pozbywa się komentarzy w kodzie CSS
- gdy już mamy uri do web serwisu i przesunięcie, ściągamy obrazek z diodami
- na tym etapie musimy jeszcze, na owym znalezionym przesunięciu zastosować działanie modulo 108, gdyż wartością mogą być większe niż rozmiar obrazka (108 px)
- następnie robimy jak w poprzednich aplikacjach, czyli sprawdzamy kolor pixela

Update - Dioda 2.6Taaak, to było genialne. W piątek, czyli w ostatnim dniu, kiedy było pytanie normalne, zmieniono obliczanie przesunięcia:) Było to o tyle genialne, iż nikt nie spodziewał się, że przed ostatnim pytaniem normalnym, redakcji będzie chciało się cokolwiek zmieniać :P Za to duży plus :)
Podsumowanie
+ sporo zmian w stosunku do wersji 1.x
+ ciekawy pomysł z przesunięciem w kodzie CSS
+ dopiero teraz zaczęło coś się dziać :P

Ogólna ocena:
5+/6

Podsumowanie

Mam nadzieje, że przedstawione sposoby zachęcą kogoś do zagłębienia się w programowanie. Przedstawione kody źródłowe były dość ogólne. Sposób wyświetlania diody już się zmienił (wersji 2.6 jeszcze nie zrobiłem:P).

Oczywiście, może ktoś napisać, iż prostszym sposobem i efektywniejszym było sprawdzanie koloru diody w już wygenerowanej stronie za pomocą jakiegoś color pickera. I miałby rację! Ale, takie pisanie programu, który analizuje stronę html, web serwis itp., dostarczało mi większej radości. A o to tu chyba chodziło :)

Może napiszę jeszcze co mi się nie podobało w konkursie. Przede wszystkim pytania w nocy! Pytania o 7 z rana są jeszcze w ok, ale o 2 w nocy to już lekka przesada. Również pytania specjalne ze względu na ich wyższy stopień zaawansowania, można było oceniać wg innej (wyższej) punktacji. Poza tym dla 2. i 3. miejsca można było jakieś małe nagrody dać. Chociaż po plecaku :P

Mając możliwość, dziękuje redakcji, iż mogłem wziąć udział w tak emocjonującym i dającym wiele frajdy konkursie. Coś niesamowitego! Dzięki. Gratuluje zwycięzcom i wszystkim uczestnikom konkursu! Mam nadzieję, iż jeszcze zostanie zorganizowany jakiś podobny konkurs, gdyż takiej pozytywnej energii zgromadzonych we wszystkich uczestnikach konkursu, nie można zmarnować!:)

No i pozdrowienia dla dwóch osób z teamu ;)

Dziękuję i pozdrawiam. 

programowanie hobby inne

Komentarze

0 nowych
Eleks   9 #1 02.11.2010 12:29

Dzięki @djfoxer!
Takie coś chciałem zobaczyć po konkursie! Spisałeś się na medal! Pozdro ;)

  #2 02.11.2010 12:36

Dioda 2.6 miała również szum na sobie :) Zawsze dostawałeś nieco inny kolor, wiec colorpicker niestety by poległ :) Oczywiście i na to można znaleźć sposób :)

Ryan   15 #3 02.11.2010 13:00

A ja dodam, że nieobowiązkowy query string diody 2.0 był nieobowiązkowy z powodu błędu w kodzie. To także uległo zmianie ostatniego dnia. ;]

kjackiew   4 #4 02.11.2010 13:16

Widzę, że podobny rozwój miał Twój program jak mój Budzik :)
Tylko ja pisałem po jak najmniejszej linii oporu (np. bez query string, wartość koloru miałem w jednej liczbie i sprawdzałem wartość w jakimś tam małym zakresie)

%108 - modulo zawsze się przydaje :) czasami mi jakieś dziwne warningi się pojawiały a tam później było sprytnie przesunięcie zrobione :)

Ale parsowanie w 2.5 zrobiłeś o niebo lepiej jak ja. Pewnie przez to że swój kod pisałem tuż przed snem o 2 w nocy i była tendencja aby szybciej :D

Wersji 2.6 także nie robiłem bo już nie było po co, nawet nie sprawdzałem co nowego się pojawiło, wiem od testerów że im się posypało :D


BTW. ktoś mógłby pokazać jak wygląda plecak w powiększeniu ??

kjackiew   4 #5 02.11.2010 13:18

Tak dla porządku Twoja aplikacja nie uwzględnia pierwszej wersji zabezpieczeń:)

Na początku było
http://www.dobreprogramy.pl/ContestIsActive.ashx?q=20101009124534

potem
http://www.dobreprogramy.pl/ContesstIsActive.ashx?q=20101009124534

matzu   5 #6 02.11.2010 13:29

Nie wiem jak u Ciebie wygląda parsowanie HTML-a, ale najlepszy sposób to było użycie Xpath + wyrażenia regularne. Przykładowo odnośnie piątkowych zmian ...

Wyrażenie Xpath -> //style 0x80.

Pozdrawiam,

matzu   5 #7 02.11.2010 13:30

Z jakiegoś powodu ucięło mi tekst :D Jeszcze raz

Nie wiem jak u Ciebie wygląda parsowanie HTML-a, ale najlepszy sposób to było użycie Xpath + wyrażenia regularne. Przykładowo odnośnie piątkowych zmian ...

Wyrażenie Xpath - //style zwraca wszystkie tagi HTML oznaczone nazwą style. Będzie to tablica 4 elementów dla strony Autoryzacja.html. Wiadomo do czego zmierzam :)

Jeśli chodzi o zmieniający się odcień niebieskiego (wprowadzony również w piątek) to na obejście tego problemu naprowadził mnie użytkownik głowacki. Wystarczy zastosować przedział RGB dla wszystkich odcieni niebieskiego w odpowiednim warunku. Niebieski to Red mniejsze niż 0x80, Green większe od 0x80, Blue większe od 0x80.

Pozdrawiam,

djfoxer   18 #8 02.11.2010 13:38

@Eleks
Dzięki, trochę czasu mi zajęło napisanie tego ;)

@tomick
Ahhh, to temu znajomego ColorPicker wariował:P

@Ryan
Dziwne było właśnie to, że query string w Diodzie 2.0 mocno został skomplikowany, a nie był potrzebny do niczego ;)

@kjackiew
Jak zacząłem zbieranie materiałów odnośnie diody, nie pamiętałem jaka była pierwsza nazwa ws zwracającego obrazek, dzięki za zauważenie tego. Wersja 1.1 to były te zmiany nazw ws.

djfoxer   18 #9 02.11.2010 13:46

@matzu
Na początku też myślałem o wrzuceniu tego do XMLa, ale ze względu na to, iż nie miałem zbyt dużo czasu oraz nie pamiętałem dokładnie składni Xpath zrobiłem to na zwykłym parsowaniu stringa:P

Ryan   15 #10 02.11.2010 13:46

Query String był potrzebny w przypadku, w którym request do strony miał miejsce w innej minucie niż request do diody. To, czy się zauważy potrzebę czytania QS, czy też nie zależy od tego co robi bot i jak często. ;)

  #11 02.11.2010 13:48

@kjackiew: My też zrobiliśmy testy na Twoim kodzie ;) W Moim prywatnym odczuciu zapomniałeś o beepie przy Exception ;) Bo właśnie wyjątkami zaczęło sypać po zmianie diody :) Osobiście robiłem testy na każdym znalezionym w sieci kodzie :)

matzu   5 #12 02.11.2010 13:50

@djfoxer

Nie trzeba tego wrzucać do XML-a. HTML to szczególny przypadek XML-a (przynajmniej ja bym to tak określił). Strona Autoryzacja.html nie zawierała błędów w składni, więc XPath radzi sobie z nią bez problemów.

matzu   5 #13 02.11.2010 13:52

@Redakcja
Prosiłbym o usunięcie postu nr 6. Na forum w dziale błędów napisałem dlaczego tak się wyświetlił, a nie inaczej (można też potem usunąć ten post :D).

djfoxer   18 #14 02.11.2010 13:54

Przycisk wyślij dla dodawani komentarzy nie jest blokowany po dodaniu komentarzu? :P

@Ryan
@tomick
Jesli byliście świadomi istnienia różnych aplikacji skanujących diodę przez ws, czy nie baliście się "przypadkowego" ataku DDoS, ze strony osób skanujących diodę? Pytam się bo wiem, iż niektórzy robili skan nawet co 0.1s.

Ryan   15 #15 02.11.2010 14:02

Co 0.1s? Dobry sposób na marnowanie łącza. :) Odświeżanie co 1s to tylko 85k wywołań na dzień, więc żaden DDoS. ;]

kjackiew   4 #16 02.11.2010 14:11

@tomick
Tak, brakowało beepa w Excpetion. Tzn wcześniej był ale w wersji publicznej nie dałem, bo na przykład ludzie mając problemy z netem pisaliby że są fałszywe alarmy itp
Ogólnie mój kod mogliście łatwo ominąć jak ujrzał światło dzienne.:)

Jakby konkurs wystartował teraz z teraźniejszymi zabezpieczeniami to myślę, że nie chciałoby mi się pisać tego Budzika :D

djfoxer   18 #17 02.11.2010 14:34

@Ryan
Ok, rozumiem :)

  #18 02.11.2010 15:14

Myślę, że znalazłoby się jeszcze kilka niewykorzystanych pomysłów na utrudnienie zabawy :)

jozzy   3 #19 02.11.2010 16:25

@tomick - mogliście css porozrzucać po całym kodzie strony:) Wtedy byłaby zabawa.

Pod koniec konkursu najlepszy rozwiązaniem było wykorzystanie silnika np. Webkit. Później tylko kolor z punktu x,y -> RGB : if (r > 200 and r 50) and (g < 200). Rozwiązanie odporne na zabawę z css.

  #20 02.11.2010 17:24

I mieliśmy taki pomysł ;) ]:->

cayman3_11   3 #21 02.11.2010 18:30

hmm i ja stworzyłem coś podobnego (nawet sygnał przy wyjątkach był ;) )
Niestety dioda 2.6 pokonała także mnie - licząc sumę kontrolną z obszaru 36x36px niestety (albo na szczęście) dostałem całą serię fałszywych alarmów...

Mój programik miał natomiast jedną zasadniczą zaletę - był to widget pod Androida, więc komputerek nie chodził 24/7 (za to co najmniej raz dziennie "ktoś do mnie dzwonił" :D )

B.Andy   4 #22 02.11.2010 18:44

I tak najłatwiej print screen i porównać wartość RGB, chociaż byłem zaskoczony, gdy mimo niebieskiego kolorku aplikacja cały czas informowała o zmianie, dopiero później (zresztą przez przypadek :-P) zauważyłem, że są dwie niebieskie diody, a wtedy wystarczyła akceptacja odchylenia. Mimo to nawet, nawet jeśli masz program to i tak trzeba siedzieć cały czas przed komputerem. Ale zabawa całkiem całkiem :-)

majcovsky   4 #23 02.11.2010 19:52

To właśnie szumy wspomniane przez Tomicka zmusiły mnie do czuwania od piątkowego południa :> Gdyby zrobiono to wcześniej, konwersja koloru do HSL rozwiązałaby sprawę ;]

command-dos   18 #24 02.11.2010 21:27

ja to robiłem trochę inaczej - linux way ;) w bashu...

wget -O ~/dioda/ContestIsActive.ashx $data
convert -crop 2x2+13+13 ~/dioda/ContestIsActive.ashx ~/dioda/my.png
convert ~/dioda/my.png -map ~/dioda/map.png ~/dioda/my1.png
convert ~/dioda/my1.png ~/dioda/my2.bmp

przy diodzie w wersji 1.0 pobierałem obrazeczek z shitem po prawej i wycinałem kwadracik o wielkości 2x2 pixele o koordynatach x=13 i y=13. Potem ograniczałem mu paletę kolorów do 3 (tło, żółty i niebieski) według wcześniej spreparowanego obrazka z taką paletą (map.png), co chroniło mnie przed zmianą zabarwienia żółtego koloru. Potem nie wnikając w szczegóły konwertowałem to do bmp, bo png przy porównaniu plików czasem różniły się.

diff --binary ~/dioda/my2.bmp ~/dioda/active.bmp
if [ ! $? -eq 0 ]; then
echo "Niebieska dioda - gramy dalej" >> ~/dioda/dioda.log
echo "Niebieska dioda - gramy dalej"
else
touch ~/dioda/testfile
echo "Żółta dioda - Wysyłanie sms" >> ~/dioda/dioda.log
echo "Żółta dioda - Wysyłanie sms"
lynx "http://www.era.pl/msg/api/do/tinker/omnix?message=Dioda!&number=numer_tel&am..."
fi

i dostawałem sms'a ;) z bramki era omnix. Wymagane do tego było zainstalowane w ubuntu dodatkowo:
-imagemagic,
-lynx (choć z firefox'a też możnaby było, ale z terminala, nie z konsoli).
Potem zmienił się link do diody i stary cały czas wskazywał na niebieską, więc trzeba było wycinać linijkę html'a i kontrolować położenie diody.

Od wersji 2.0 przestałem bawić się w kontrolowanie html'a (oczywiście nie zrezygnowałem z tego, co robiło się do tej pory, w razie powrotu do dawnych metod przez redakcję) ze względu na duże możliwości mieszania w kodzie przez redakcję - tutaj możliwości zmian było dużo więcej...
Wykorzystałem program CutyCapt, do zrzucania stron internetowych do obrazka, i tak doszły dodatkow linijki do skryptu:

./CutyCapt --url=http://konkurs.dobreprogramy.pl --out=Cuty.png

i po staremu wycinałem z tej bitmapy kwadracik 2x2 pixele:
convert -crop 2x2+272+137 ~/dioda/Cuty.png ~/dioda/my.png
convert ~/dioda/my.png -map ~/dioda/map.png ~/dioda/my1.png
convert ~/dioda/my1.png ~/dioda/my2.bmp

po tym także następowało porównanie obrazeczków, którym wcześniej ograniczyłem paletę kolorów, tak aby żółty był zawsze żółtym, a niebieski - niebieskim ;) Oczywiście to wszystko w pętli i odświerzanie co 30 sek...

Najbardziej obawiałem się zmiany pozycji diody, która jednak (chyba) nie nastąpiła. Czasem redakcja puszczała diodę fake'a, bo dostawałem sms'a, a tu na stronie niebiesko?! A może był to jakiś sms z poprzedniego dnia ;) bo skrypt leciał na kilku kompach i zwyczajnie mogłem się pogubić i bramka też ;)

jozzy   3 #25 02.11.2010 21:58

To chyba tylko ja miałem powiadomienie za pomocą telefonu :) Klient SIP + dzwoń komórka = 2-3 sekundy + bieg do najbliższego komputera :]

Radius01   3 #26 02.11.2010 23:03

Czytając wpis przypominają mnie się niektóre kwestie związane z programowaniem. Ale żeby do tego wracac to nie. Dobrze i czytelnie zostały opisane problemy i sposoby na wykrycie diody. Widać z tego, że osoby, które chciały w jakiś sposób ułatwić sobie zabawę musiały się sporo nagłówkować, żeby to osiągnąć. Do tego Redakcja też nie dawała za wygraną. Zrobiła się swojego czasu rywalizacja ;-)

Pozdrawiam

Ryan   15 #27 03.11.2010 00:17

@majcovsky: niby jak HSL rozwiązałoby sprawę? :) Losowy szum po przekonwertowaniu do HLS wciąż będzie widoczny w postaci losowych wartości na każdym z kanałów. Co do fałszywych alarmów w diodzie 2.* - cóż, tak się kończy ignorowanie magicznej wartości przy pobieraniu grafiki. :>

Airborn   8 #28 03.11.2010 02:07

następnym razem dioda będzie RGB z płynnym mieszaniem barw ;)

majcovsky   4 #29 03.11.2010 09:10

@Ryan: więc tak jak mówi command-dos - niebieski zawsze byłby niebieskim, a żółty żółtym, i wtedy problemu by nie było. :)
Jeżeli chodzi o fake-alarmy, to sypało nimi dość często (narzędzie, z którego korzystałem oparte było na silniku Trident, więc jakiekolwiek błędy programistyczne w grę nie wchodzą ;)

Ryan   15 #30 03.11.2010 17:20

Ale byłyby niebieskim i żółtym o różnej pozycji na kole barw. Wciąż nie jest to ==. Równie dobrze można wykonać ciut bardziej wysublimowaną operację na wartości RGB i uzyskać pożądane rezultaty. :) Błędy natomiast mogły się pojawiać we wczesnej wersji 2.0. Bo była jeszcze nieopisana wersja, nazwijmy to, 2.1. ;]

djfoxer   18 #31 03.11.2010 17:23

@Ryan
Oooooo :) Wersja 2.1? :) Zdradzisz jakieś szczegóły?

Ryan   15 #32 03.11.2010 17:34

Zmieniła się głównie hydraulika. Po stronie użytkownika niespecjalnie widać było coś innego. Chyba, że ktoś śledził także zmiany w nagłówkach HTTP. :)

command-dos   18 #33 04.11.2010 16:44

@Ryan - "...Po stronie użytkownika..." - fajnie to brzmi ;) mając na myśli bardziej programistę :)

model12   6 #34 07.11.2010 20:35

Witam.A biorący udział w konkursie dalej czekają na statystyki dotyczące słynnego konkursu. Ich brak zaczyna utwierdzać biorących udział iż cały konkurs był ustawiony.Ale to moje prywatne zdanie.

master_zonk6   7 #35 07.11.2010 21:04

i wszystko jasne... ;)

djfoxer   18 #36 07.11.2010 21:34

@model12
"cały konkurs był ustawiony" - właśnie odkryłeś spiskową teorię dziejów :P

infortica   1 #37 07.11.2010 23:24

Witam wszystkich uczestników konkursu Intela i dobrych programów,
ciekawa dyskusja o sposobach wykrywania diody.

Zdradzam swój sposób na jej sprawdzanie:
przeglądarka Firefox + ReloadEvery odświeżane, co 3 sekundy,
program w delphi sprawdzający, co 1 sekundę kolor piksela ekranu w miejscu diody.
Czas napisania programu i testowania czy działa ok 2 godzin.

Jak to robiłem?
Uruchamiałem firefoxa i ustawiałem jego okno tak, aby dioda była widoczna w rogu ekranu.
Za pomocą kombinacji klawiszy zapamiętywałem współrzędne piksela diody z niebieskim kolorem pod kursorem myszy.
Aktywowałem sprawdzanie, co 1 sekundę czy pod zapamiętanym pikselem zmienił się kolor.
Po wykryciu zmiany odtwarzałem muzykę, informującą cały mój dom o diodzie:)
Były ciekawe momenty, kiedy żona krzyczała słysząc muzykę: Bartek!!! Dioda!!!

Sposób, jaki ma działać program był intuicyjny i pierwszy, jaki mi przyszedł do głowy.
Zdarzały się falstarty jak się wysypało odświeżanie strony, ale to były marginalne sytuacje.
Zabrakło mi wytrwałości i szczęścia, aby wygrać coś więcej niż plecak, ale i tak wspominam miło czas spędzony z diodą.
Moim zdaniem zaletą takich konkursów jest "konieczność" poszerzania wiedzy, co uważam za duży plus.

Czekam na kolejne konkursy pozdrawiam redakcję i wszystkich uczestników zabawy z diodą.

  #38 08.11.2010 10:15

Mial byc konkurs dla wszystkich i fajna zabawa, a wyszlo wielkie oszustwo, w ktorym szary czlowieczek nie ma zadnych szans ze sztabem programistow piszacych i uzywajacych skrypty.

Moim zdaniem konkurs pozostawil po sobie wielki niesmak zamiast milych wspomnien...

djfoxer   18 #39 08.11.2010 18:31

@karolloss
Nie rozumiem Twoich pretensji. To jeśli ktoś miał ciekawy pomysł, jak można sobie pomóc, to jest oszustem?

Zepher   3 #40 08.11.2010 21:53

Miałem dwa programy do wykrywania diody.

Pierwszy I:
- sprawdzał czy jest internet, następnie pingował dobreprogramy.pl sprawdzając czy strona jest dostępna
- pobierał źródło strony usuwał wszystkie komentarze, spacje, entery i tabulatory.
- sprawdzał ile jest webserwisów w kodzie strony, dzięki czemu od razu wykryło mi zmianę diody 2.5 na 2.6
- znajdował odpowiedni webserwis i przesuniecie dzielone modulo 108
- pobierał obrazek i sprawdzał w odpowiednim miejscu kolor piksela
- gdy piksel nie był niebieski otwierał mi stronę z captchem
- program alarmował dopiero po dwóch "nieniebieskich" pikselach z rzędu, przez co nie miałem praktycznie fałszywych alarmów i dzięki czemu mogłem spokojnie spać w nocy :)
- ping do dobreprogramy.pl miałem na poziomie 4-5 ms obrazek był niewielki więc mogłem sobie nawet pozwolić na sprawdzanie co 100ms. W praktyce najczęściej ustawiałem 300ms, co owocowało informowaniem o diodzie po 301-600ms (drugi wykryty z rzędu "nieniebieski" kolor) od chwili pojawienia się żółtej diody.



Program II
Program zapasowy, sprawdzanie odbywało się dużo rzadziej. Podobnie jak w pierwszym programie dwa zmiany pod rząd alarmowały.
Aplikację starałem napisać tak, żeby był w miarę elastyczny, parametry do programu były wczytywane z pliku konfiguracyjnego. Program podłączał do wybranego okna firefoxa bądź opery przez uchwyt tego okna i robił screena samego okna co określony czas. Następnie ze screena wycinał odpowiedni, całkiem duży dla bezpieczeństwa fragment i ten fragment potem sprawdzał. Takie okno przeglądarki można było dowolnie przesuwać w czasie działanie programu. Następnie program sprawdzał diodę na 3 sposoby.

sposób pierwszy:
- po uruchomieniu program automatycznie wyszukiwał niebieską diodę, zapamiętywał współrzędne i sprawdzał te współrzędne co określony czas.

sposób drugi:
- program przeszukiwał wycięty wcześniej fragment strony w poszukiwaniu odpowiedniego koloru żółtego. (zabezpieczenie przed przesunięciem diody)
- sprawę w przypadku firefoxa bardzo ułatwił adblock pozbywając się zbędnych elementów łącznie z "diodą flash":
http://img837.imageshack.us/img837/4968/konkursadblock.png

sposób trzeci:
- podobnie jak w drugim przypadku operowałem na fragmencie screena okna firefoxa lub opery.
- sposób oparty o RGB - zliczałem sumę R dla wszystkich pikseli, oddzielnie sumę G i sumę B.
- w przypadku opery te sumy oscylowały w określonych przedziałach (na stronie było parę ruchomych flashy), pojawienie się żółtej diody powodowało jednak dużo większą zmianę wyliczonych sum
- w przypadku firefoxa z adblokiem sumy zawsze miały tę samą wartość
- metodę tę uważam, za najlepsze zabezpieczenie, była odporna na wszelkie ewentualne próby przesunięcia diody, delikatne zmiany kolorów czy też zmianę świecenia np na czerwony czy zielony co też brałem pod uwagę.

Czas działania metody 2 i 3 był uzależniony od wielkości fragmentu, ale nawet na laptopie w trybie "oszczędzania energii" był niższy niż 500ms

Drugi program miał opcję powiadamiania mailowo, a na mailu miałem ustawione powiadamianie sms. Dla ciekawskich dodam, że sms przyszedł około 55 sek po testowym "pojawieniu się diody". Opcja jednak się nie przydała, gdyż dioda zawsze pojawiała się gdy byłem w okolicach komputera, a wtedy miałem ją wyłączoną.

Po zmianie diody z 2.5 -> 2.6 oba programy zaalarmowały. Pierwszy program bo pojawił się trzeci webserwis. Nie wiedziałem co planuje redakcja więc postawiłem na drugi najpewniejszy według mnie program.
W drugim programie wyłączyłem sposób pierwszy (dioda niebieska delikatnie zmieniła kolor co powodowało alarmy) i tak doczekałem już końca konkursu :)



Hmmm to chyba mniej więcej wszystko na temat moich programów. Mam nadzieję, że w miarę komunikatywnie to ująłem :)

  #41 08.11.2010 21:59

@djfoxer
To trzeba było już na samym początku powiedzieć, że konkurs jest przeznaczony tylko dla osób z dobrymi pomysłami.

Powinien on nosić nazwę
"Konkurs Intela na najlepiej zorganizowanego skrypciarza"
albo
"Konkurs Intela - bez skryptu, bez szans".

;)

djfoxer   18 #42 09.11.2010 09:04

@karolloss
"Pretensje do garbatego, że ma proste dzieci" ;)

@Zepher
Pogadamy przy okazji ;)

Ryan   15 #43 05.12.2010 14:59

@karalloss: A gdzieś było napisane, że to loteria i każdy może wygrać, bez względu na wkład własny? :)

djfoxer   18 #44 05.12.2010 22:23

@Ryan
Piszecie teraz swój tekst o diodzie rozumiem? ;)

Ryan   15 #45 05.12.2010 22:46

Podobno. ;)

djfoxer   18 #46 05.12.2010 22:48

@Ryan
Czyli Twoja wizyta tutaj nie jest zupełnie przypadkowa? ;)