március, 2008 havi archívum

Ígéreteimmel ellentétben sajnos tegnap nem tudtam folytatni a megkezdett eszmefuttatásomat, mivel tegnap eléggé lefárasztott az este 6-tól 8-ig tartó analízis zh-m. Visszaolvasva a tegnapelőtti blogbejegyzésemet észrevettem egy hibát, amelyet szintén a fáradságomra fognék. Ugyanis értelemszerűen nem a Runtime telepítésével lehetnek problémák, hanem a Silverlight Tools for VS08 csomag telepítésével. Mellesleg erre a mellékelt url címéből is rá lehet jönni, de most már emiatt nem javítok bele a bejegyzésbe.
 
Eszköztámogatottság
Nos, a sok magyarázkodás után folytassuk ott, ahol tegnapelőtt félbehagytam, vagyis az eszköztámogatottságnál. Ugyebár alapkoncepciónk az, hogy egy alkalmazás = markup + kód, vagyis amit el lehet készíteni deklaratív módon azt megpróbáljuk az Expression Studio segítségével megalkotni, és csak az üzleti logika, illetve adatelérési réteg, stb. megírásához használjuk a Visual Studio-t!
Két kérdés merülhet fel ilyenkor bennünk:
Az egyik, hogy mit tudunk megvalósítani deklaratív módon, vagyis hol vannak a XAML határai? 
– A másik kérdés pedig mindez miért jó nekünk?
Először a második kérdésre válaszolok. Ha a megjelenítési réteget külön tudjuk választani a tényleges kódtól, akkor magunkat megkíméljük egy csomó kódolástól, illetve a designerek is így nagyobb szabadság fokot kapnak! Ez azért valósítható meg, mert a WPF-ben látott deklaratív adatkötést a Silverlight 2.0 is támogatja már. Szerintem ez a legjobb dolog az egészben, ugyanis ha csak silverlight-os objektumok állapotait akarjuk megváltoztatni események bekövetkezésekor, akkor mindezt megtehetjük Expression Blend-ben. Sőt akár CLR-beli objektumokat is felhasználhatunk adatkötéshez! Nekem nagyon bejön ez a feature. Mutatok egy egyszerű példát, csak hogy érezzük a dolog súlyát:
<TextBlock x:Name=”lblAge” Text=”{Binding Age, Mode=OneWay  }” />
<TextBox x:Name=”txtName” Text=”{Binding Name, Mode=TwoWay  }” />
 
Az első kérdésre visszatérve, hogy hol is vannak a xaml határai, szintén egy példa segítségével próbálok meg választ adni. A Silverlight 2.0-ban a vezérlők már skinezhetőek! Ezt azt jelenti, hogy hasonlóan az ASP.NET-es Skin fájlokhoz, megadhatjuk egy adott vezérlőcsoportnak az alapkinézetet leíró tulajdonsággyűjteményét. Ezeket a Control Resource tagjein belül definiálhatjuk az úgynevezett Setter tagekkel. Mindezzel csak arra akartam utalni, hogy a XAML jóval többre képes annál, mintsem csak vonalak, meg görbék leírására.
Szóval, ha eszköztámogatottságról beszélünk, akkor főleg az Expression Studio-ra kell gondolnunk, ugyanis ezekben a szoftverekben fogjuk nagyrészt a Silverlight alkalmazásunkat fejlesztgetni.  Például amikor egy olyan SL alkalmazást akarunk elkészíteni, mely média lejátszására is alkalmas, akkor a Blend mellett szükségünk lesz az Expression Encoder-re, illetve Designer-re is. A jó hír az, hogy ezek végre ténylegesen képesek jól és hatékonyan együttműködni, például a mediaelement skin-jeit könnyen átalakíthatjuk Blend-ben. Tehát az Expression Studio egyes tagjai között, illetve a Visual Studio és az Expression Blend között az átjárhatóság nagyon jól meg lett oldva…
 
 
Új szolgáltatások
Ebbe a témakörbe sok minden beletartozik, ezért csak néhány dolgot emelnék ki, melyek számomra érdekesebbek voltak. Az egyik legfontosabb új szolgáltatása az SL 2.0-nak az a több mint 20 vezérlő, amely most már szerves részét képezi a plugin-nak. Ezek között vannak olyanok melyek alapfunkciók ellátására szolgálnak (pl.: Button, CheckBox, stb.). Mások például az elrendezés (layout) kialakításában nyújtanak segítséget (StackPanel, Canvas, Grid), és megint mások pedig speciális feladatokra lettek kifejlesztve (pl.: adatkötéshez ott van a DataGird, illetve a ListBox).
Őszintén szólva nekem néhány vezérlő nem tetszik. Az egyik közülük például a Gird, ugyanis eléggé hülyén van felépítve az egész. A Gird-ről annyit kell tudni, hogy oszlopokat, meg sorokat kell benne definiálnunk, majd utána az úgynevezett Attached vagy Extented tulajdonságok segítségével tudunk az egyes cellákba elhelyezni vezérlőket. (Attached properties alatt olyan tulajdonságokat értünk, melyek alapban nem tartoznak az adott vezérlőhöz, hanem a konténer vezérlőjüktől kapják őket pl.: Canvas.Top vagy Grid.Row, stb.) Ami igazán zavar az egészben az a sok RowSpan-ozás. De ez van izélések és pofonos.
Egyik másik újdonsága az SL2.0-nak, hogy van benne egy úgynevezett DispatcherTimer objektum, mely a Winforms-os Timer-nek felel meg. Ebben nem vagyok teljesen biztos, hogy az 1.1-ben még nem volt, de nekem így rémlik. Ez értelemszerűen az animációk kódból történő menedzselésekor válik hasznossá.
A következő érdekes dolog számomra az volt, hogy egy Silverlight alkalmazás egy úgynevezett xap fájlba fordul le, amely valójában egy szimpla zip fájl. Emiatt ha egy aspx vagy html oldalon hosztolni akarunk egy SL progit, akkor erre az állományra kell hivatkoznunk.
Végül, de nem utolsó sorban ott van a DeepZoom, mely gigapixeles képek megjelenítésére és nagyítására képes valós időben!
 
Tutorialok, segédanyagok
Fontosnak tartom, hogy erről is ejtsek néhány szót, ugyanis a web-en eléggé elszórtan találhatóak csak jó leírások! Például a hivatalos Silverlight oldalon található SL 2.0-s howto videók szerintem eléggé gyengusra sikeredetek. Főleg, ha hozzá vesszük még azt, hogy a harmadik videóban bemutatott példaalkalmazás kódját kérni kellett, hogy ugyan tegyék már fel. Sajnos ugyanaz az illető írta a tutorialokat is, mint aki készítette a videókat. Ez meg is látszik a minőségükön (össze-vissza vannak formázva a szövegek, a kódrészletekhez tartozó magyarázatok szinte semmit se ér… ja és az első cikkben 3 oldalon keresztül magyarázza, hogy miért nem úgy mutatja be a technológiát, ahogy kéne.) Letölthetőek pdf állományban is a tutor-ok, de ha jót akarunk magunknak, akkor inkább ne tegyük (borzasztóan néz ki)!
Szerencsére azért a Silverlight.net-en találhatóak úgynevezett hands-on-lab-es  gyakorlatok, melyek a MIX08 konferenciára készültek, ezért eléggé színvonalas leírásokkal, kódokkal, és 5letes példaalkalmazásokkal találkozhatunk bennük. (http://silverlight.net/learn/labs.aspx)
Akiknek mindez nem lenne elég, azoknak összegyűjtöttem egy-két blog címet:
 
Remélem ezzel a kis kétrészes élménybeszámolóval, illetve félig technológiai leírással senkinek nem vettem el a kedvét a SL 2.0-tól. A blogbejegyzést értelemszerűen nem silverlight gyorstalpalónak szántam, hanem inkább rövid összefoglalónak, hogy mi is történt az 1.1-es Alpha release óta. Akik a Silverlight alapjaival is meg szeretnének ismerkedni, azoknak ajánlom az MsPortal Tanulmányi hetet!

Silverlight 2.0 Beta 1 – I. rész

Posted: 2008. március 25. in Silverlight
Az MsPortal-os Tanulmányi hétre készülő Silverlight-os anyag kapcsán volt szerencsém megismerkedni a Silverlight 2.0-val. Az itt szerzett tapasztalataimat, észrevételeimet szeretném most veletek megosztani.
 
Telepítés
A legelső meghökkentő dolog számomra a Silverlight Runtime mérete volt. Az 1.0-s verzióé ~3.5mb volt, a 2.0 Beta 1-é pedig ~4,5mb! Ebben az az igazán meglepő, hogy csomó újdonság került bele a plugin-ba és mégse nőtt meg a mérete drasztikusan. Olyan dologra gondolok itt, mint például:
– adatkötés
– LINQ
– több mint 20 vezérlő
– kódból menedzselhető DOM
– szálkezelés
– aszinkron programozhatóság
– DeepZoom
– stb.
Íme egy kép, mely bemutatja mit is tartalmaz az új beta: (DeepZoom technológiára is egy tök jó példa)
http://joestegman.members.winisp.net/DeepZoom/
 
Tehát, amit a képen is látható, tényleg rendesen megpakolták ezt a ráadásul platform független plugin-t. A kérdés már csak az, miért nem tudják ugyanezt megcsinálni a nagy .NET framework-kel is?!
Mielőtt neki láttam volna a SL Runtime telepítésének azelőtt pár nappal olvastam egy MIX-es blogbejegyzést melyben felsorolta a szerző a telepítés során előfordulható problémákat és azokra az orvosságokat. Őszintén szólva kicsit megijedtem, mert kb. 3 oldal hosszú volt maga a cikk és ennek legalább a kétszerese a hozzáfűzött kommentek listája. Lippi-nek mondtam is ezután, hogy nem vagyok benne biztos, hogy Silverlight 2.0 lesz a Tanulmányi héten. De szerencsére telepítés közben semmilyen probléma nem adódott, több gépen is teszteltem, úgyhogy végül is SL 2.0 Beta 1 kerül majd bemutatásra a jövő héten. Mellesleg a blogbejegyzés itt található:
http://weblogs.asp.net/bradleyb/archive/2008/03/06/installation-tips-for-sivliverlight-tools-beta-1-for-visual-studio-2008.aspx
A letöltése, illetve telepítése a Runtime-nak körülbelül fél percet vesz igénybe, és nem most túloztam! Tényleg gyorsan feltelepül, és nem is igényel gép újraindítást, összesen a böngészőt kell újból beizzítani és már használhatjuk is a Silverlight-ban írt oldalakat.
A másik progi, amit mindféleképpen fel kell telepíteni a Silverlight runtime mellé, hogy tudjuk SL-es alkalmazásokat fejleszteni, az a Silverlight Tools Beta1 for VS08. Ez viszont felszedett pár kilót az 1.0-ás verziónál kiadott társához képest, ugyanis ez már majdnem 55mb! A mérettel együtt a telepítés ideje is drasztikusan megnőtt, ugyanis ez majdnem 8perc volt, míg teljesen feltelepült a csomag. A benne lévő dolgok, azért kárpótoltak, de erről majd picit később…
Én még felszórtam a gépemre a Blend most már 2.5-ös márciusi preview-ját, illetve a Silverlight SDK-t is. Sajnálatos módon nem kerültek új demók a Blend legújabb verziójába, emiatt kicsit szomorú is vagyok.
 
Első alkalmazás létrehozása
Miután minden progit felszórtam, elindítottam a VS08-at és megdöbbentem. Ugyanis bármennyire is logikusnak tűnne, hogy a Silverlight project template-nek a Web-es projekt sablonok között a helye, nem ott van. Ott csak a Silverlight Script Application sablon található, amellyel 1.0-ás SL alkalmazást tudunk létrehozni. Emiatt a File >> New Project-et kell választanunk, és a project types-nál pedig a Visual C#-on belül a Silverlight fület! Itt két SL-es project template található: Silverlight Application, Silverlight Class Library.
Amikor létre akarunk hozni egy új SL alkalmazást, akkor a Visual Studio felajánlja nekünk, hogy létrehoz hozzá egy teszt projektet, ugyanis a Silverlight alkalmazások önmagukban nem futtathatók. Tehát lehetőségünk van arra, hogy egy WebSite vagy egy WebApplication legyen a hostkörnyezetünk, amelyben automatikusan kapunk két TestPage-t: egy aspx-eset, illetve egy html-eset (mindkettőbe alapba be lesz ágyazva az újonnan létrehozott SL alkalmazással!). De ha nem igényeljük a http-n keresztül történő elérést, akkor választhatjuk azt is, hogy egy sima lokális (alapban rejtett) html teszt fájlt hozzon létre a Visual Studio nekünk. Ilyenkor értelemszerűen nincs lehetőségünk arra, hogy valós környezetben leteszteljük például a jogosultságokat.
Miután kiválasztottam a Create WebSite 4 hosting-ot, nagyon megörültem, ugyanis egy XAML megjelenítő kezdett el betöltődni. Igaz kicsit lassan, de biztosan! Szóval nagy öröm volt látni azt, hogy végre itt is meg lehet tekinteni a markup kódunk eredményét, nem kell Blend-ért nyúlni. Igaz ez a Beta-ben még csak Read-only, tehát vezérlőket még nem tudunk ráhúzni, de azt ígérik, hogy a véglegesben már ez is megoldható lesz. Bár én el tudom képzelni azt a variációt is, hogy ez megmarad Read-Only nak, ugyanúgy ahogy a Blend "IntelliSence mentesnek". Természetesen jobb lenne a világ, ha mindkettő támogatna mindent, de akkor nem lehetne két terméket eladni.
 
Nos ma sajnos csak ennyi fért bele a blogbejegyzésbe, mert a beadandó progik megírása kicsit elhúzódott, de holnap folytatom tovább az élménybeszámolómat az alábbi témákkal:
– Eszköztámogatottság
– Új szolgáltatások
– Tutorialok, segédanyagok
 

Online Office ala MS

Posted: 2008. március 25. in Tippek, Trükkök
Tegnapelőtti netes barangolásom közben találtam rá az Office net-es változatának béta verziójára. Az elgondolás annyira már nem új keletű, sőt inkább válasz a Google által kifejlesztett Online Office-ra. A dolog lényege, hogy telepítés nélkül meg lehessen nézni, illetve esetleg szerkeszteni az office dokumentumainkat.
Google Dokumentumok
http://docs.google.com/
 
MS Office Live Workspace
 
Képek alapján mindkettő szép és jó, majd ha egyszer sok időm lesz, akkor letesztelem melyik a jobb…

Estefelé még visszatérek egy SL 2.0 élménybeszámolós blogbejegyzéssel!
 

Mielőtt rátérnék a címben említett témára szeretnék boldog születésnap kívánni a Visual Studio-nak, ugyanis tegnaphoz képest 11 éve, 1997 Március 19.-én mutatták be a Visual Studio 97-et!  Azt hiszem, ez a nap ugyanolyan nagy hangsúlyt kap a Microsoft történelmi napjai között, mint a .NET bejelentése, vagy a Silverlight bemutatása. Mindhárom nap kétséget kizárólag egy új korszak kezdete volt,… illetve lett.
http://www.platinumbay.com/blogs/dotneticated/archive/2008/03/18/happy-visual-studio-birthday.aspx

Miután elénekeltük közösen a HAPPY BIRTHDAY-t, térjünk vissza az eredeti témánkhoz! Természetesen nem a föld globális felmelegedéséről, vagy az influenzajárványról szeretnék információkat megosztani veletek a kövi két hónappal kapcsolatban, hanem egy két dolgot az MS háza tájáról.
A legelső dolog egy konferencia, még pedig a „Visual Studio 2008 termékbejelentés ”-re keresztelt változat.  A  címből szerintem kimaradt egy vessző vagy pedig egy és, illetve egy többesszámjele. Ugyanis a SQL Server 2008, illetve a Silverlight 2.0 Beta 1 termékbejelentések miatt kerül megrendezésre ez a konferencia, hogy megmutassák mindezek hogyan integrálódnak a Visual Studio 2008-ba. A konferencia március 27-én lesz, és itt lehet regisztrálni rá:
http://www.microsoft.com/hun/msdnkonferencia/080327/reg.aspx
Tehát, aki még nem tette volna meg, az regeljen!

Az utána jövő következő program az „MsPortal tanulmányi hét” fedőnevet viseli. Az időpontról annyit lehet tudni, hogy ha minden jól megy, akkor a húsvét utáni héten lesz. A tanulmányi hét célja, hogy minden nap bemutatásra kerül majd egy új Microsoft-os technológia, melyre összesen napi félórát kell csak rászánni, hogy elsajátíthassátok az alapokat. Naponta egy rövid (~2 oldalas) technológiai leírást, illetve egy tutorialt (leírás + videó) kell végignéznetek, ahhoz hogy sikeresen tudjátok teljesíteni a napi vizsgasort (5kérdés). Természetesen a legjobbak ajándékot is kapnak!
Az alábbi 5 témakörről lesz szó a tanulmányi héten: Vista gadget, WPF, WCF, Silverlight, Linq.
Remélem nem árulok el túl nagy titkot azzal, ha elmondom, hogy a Silverlight-os napért én vagyok a felelős .  Mindenkinek csak ajánlani tudom, hogy vegyen részt a programban, mert napi félóra tényleg nem sok és cserébe egy átfogó képet kaphattok az új technológiákról!
Bővebb infó:
http://msportal.hu/blogs/lipi/archive/2008/03/18/vajon-mi-a-nagy-csend-oka-msportal-tanulm-225-nyi-h-233-t.aspx

Végül, de nem utolsó sorban, itt van lassan a nyakunkon a III. WTW verseny is, mely most már egyszerre 7 országban fog zajlani. A konkrét időpont május 17.-e, illetve 18.-a.  Szerintem nem is szaporítom tovább róla a szót, hiszen aki ott volt az előzőkön, az tudja mekkora buli, aki pedig még nem volt, az is értesülhetett róla a blogomból…
A verseny hivatalos oldala:
http://mswtw.com/

Természetesen ezen kívül is lesz még egy jó pár MS rendezvény, melyekről az MSDN hírlevélből értesülhettek, vagy az alábbi weboldalról:
http://www.microsoft.com/hun/events/default.mspx

Én mindenkinek csak ajánlani tudom, hogy próbáljon meg időt keríteni a rendezvényekre, mert egyedül ekkora mennyiségű információt nehéz lenne összekapargatni, mint amennyi az eseményeken majd ingyen az ölünkbe fog hullni.
_________________________

Jövő hét elején egy rövid Silverlight 2.0 Beta 1 élménybeszámolóval fogok majd jönni, addig pedig mindenkinek Kellemes Húsvéti Ünnepeket kívánok, és a lányoknak pedig sok locsolót! (nem mintha túl sok hölgy látogatót vonzana a blogom, bár ki tudja!  )

 

AJAX Control Toolkit –
NoBotExtender

Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:
http://devportal.hu/Portal/Detailed.aspx?NewsId=4bb3a972-9fbb-4cae-975e-9343ac120eb9
vagy

http://cid-8dcaf3b0da4fb828.skydrive.live.com/embedrowdetail.aspx/ACTsorozat/ACT|_XX|_NoBot.zip

Ma egy igazán érdekes és hasznos extender-rel fogunk megismerkedni, még pedig a NoBot-tal, melyet a spam robotok kiszűrésére találtak ki.
 
NoBot alapok
Manapság egyre gyakrabban találkozhatunk olyan fórumokkal, blogokkal vagy portálokkal, ahol üzenetküldés esetén meg kell adnunk egy képen látható szám-, vagy betűsorozatot. Erre azért van szükség, mert léteznek olyan intelligens szoftverek (ezeket hívjuk robotoknak vagy szimplán botoknak), melyek képesek regisztrálni egy adott oldalra és az ő levelezőrendszerüket felhasználva spamelnek. Ezért egy úgynevezett CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) technikával szokás megbizonyosodni arról, hogy az üzenet küldője ténylegesen ember. Nagy általánosságban ezek a tesztek olyanok, hogy egy embernek nem jelent különösebb nehézséget megoldania, ellenben egy szoftvernek szinte lehetetlen feladat. A legelterjedtebb ilyen teszt, amikor egy semleges háttéren keresztbe-kasul futnak egyenesek, és ezeken helyezkednek el torzított betűk, illetve számok különböző színekben, méretekben.(Az ilyen dinamikusan generált képeket  kacsáknak szokták hívni!)
Az elmúlt pár évben elég sok kutatás volt a CAPTCHA technikákkal kapcsolatban, melyeknek eredményeképp érdekesebbnél érdekesebb tesztek születtek. Az egyik kedvencem az, amikor egy képen látható több figura, melyek max 40%-ban fedik egymást, és néhány alaknak hiányzik egy-két testrésze. Azt kell ilyenkor megadnia a felhasználónak, hogy hány teljes alakzat látható a képen. Azért erre már durva lenne programot írni.
A NoBot fejlesztői viszont úgy gondolták, hogy olyan technikát kéne használniuk, mely nem igényel a felhasználótól semmilyen interakciót, emiatt szinte láthatatlan! Ennek az egyedüli hátránya az, hogy minden egyes postback-et „figyeli a nagy tesó”, emiatt a teljesítménye esik az oldalunknak, ezért inkább csak kisebb oldalhoz ajánlják. A NoBot az alábbi pár technika segítségével tudja kiszűrni a kérés feladói közül a botokat:
Az oldalkérés és a postback között eltelt időt figyeli (egy ember egy űrlapot nem tud 2 másodperc alatt kitölteni).
Egy adott IP címről érkező kéréseket számolja (1 percen belül egy ember átlagosan 3-5 oldalt kér le a szerverről).
Java scripttel kiszámoltat valamit, amit után szerver oldalon ellenőriz (DOM hívás segítségével még azt is le lehet ellenőrizni, hogy böngésző-e az oldalt kérő szoftver).

Az utolsó technikánál saját java kód is megadható, míg az első kettőnél, csak egy-egy küszöbindex!

NoBotExtender használata
A mai példaalkalmazásunk rendkívül egyszerű: lesz egy gombunk, mellyel postback-et válthatunk ki, és lesz egy NoBot vezérlőnk, mellyel ezeket figyeljük. (Természetesen lesz egy „robotságméter”-ünk is két címke képében). Kezdjünk is hozzá a barkácsoláshoz!
Húzzunk a formunkra egy Button-t, egy Nobot-ot, illetve két Label-t, majd állítsuk be őket az alábbi módon:

<asp:Button ID="Button1" runat="server" Text="Kattanj rám!" /><br />
<hr style="width:100px; text-align:left;" />
<asp:Label ID="lbl_state" runat="server" Text=""></asp:Label><br />
<asp:Label ID="lbl_log" runat="server" Text=""></asp:Label><br />

<ajaxToolkit:NoBot ID="NoBot1" runat="server"
            ResponseMinimumDelaySeconds="5"
            CutoffMaximumInstances="5"
            CutoffWindowSeconds="60"
            OnGenerateChallengeAndResponse="CustomChallengeResponse" />

A ReponseMinimumDelaySeconds tulajdonság segítségével a kérés és a postback közötti minimális időt szabhatjuk meg másodpercekben. Jelen esetben, ha az oldal megérkezése után 5 másodpercen belül rákattintunk a gombra, akkor robot-nak fog minket minősíteni a rendszer (lentebb ezt majd bővebben kifejtem).
A CutoffMaximumInstances-en keresztül az azonos IP címről érkező kérések számát korlátozhatjuk egy adott időintervallumon belül.
A CutoffWindowsSeconds segítségével a postback-ek nyomon követésének az idejét szabályozhatjuk. Tehát az itt beállított idő alatt annyi postback érkezhet maximum, mint amennyit beállítottunk a CutoffMaximumInstances-nél. (Jelen esetben 1perc alatt max. 5)
Értelemszerűen érdemes ezeket az értékeket összehangolni. (pl.: ha az rmds 20 és cws 60, akkor nincs értelme annak, hogy a cmi értéke 3 vagy annál nagyobb legyen!)
Kódrészletünk végén pedig feliratkozunk a GenerateChallengeAndResponse eseményre, ahol egy saját számolgatós java kódot fogunk implementálni.

Még mielőtt ezen eseményhez megírnánk a kezelőfüggvényét, azelőtt készítsük el a „botméter”-ünket! Ezt a Page_Load-ban fogjuk elkövetni, valahogy így:

if (IsPostBack)
{
    NoBotState state;
    lbl_state.Text = NoBot1.IsValid(out state) ? "Valószínűleg ember" : "Valószínűleg bot";
    lbl_state.Text += " – <i>" + state.ToString() + "</i><br />";

    StringBuilder sb = new StringBuilder();
    foreach ( KeyValuePair<DateTime, string> ip in NoBot.GetCopyOfUserAddressCache())
    {
        sb.AppendFormat("<b>{1}</b> – <i>{0}</i><br />",ip.Key.ToString(), ip.Value);
    }
    lbl_log.Text = sb.ToString();
}

Ahhoz, hogy ez a kódrészlet működjön mindenféleképpen szükségünk lesz az alábbi pár névtér using-olására: System.Collections.Generic; AjaxControlToolkit; System.Text.
Azért tesszük az egész kódunkat egy „IsPostBack-es blokkba”, mert első oldalkérésnél felesleges, hogy lefusson a botellenőrzés. A validálás különben úgy történik, hogy az IsValid függvény visszaad egy bool értéket attól függően, hogy bot (ilyenkor false-szal tér vissza), vagy ember (true) ül szerinte a hívó oldalon.
Mellesleg az lbl_state.Text = NoBot1.IsValid() ? "Valószínűleg ember" : "Valószínűleg bot"; értékadás egy rövidítése az alábbi kódnak:

if (NoBot1.IsValid()) lbl_state.Text = "Valószínűleg ember";
else lbl_state.Text = "Valószínűleg bot";

Van egy túlterhelése is az IsValid-nak, ahol megadható neki egy NoBotState enumerátor típusú változó, amely bővebb információval szolgál nekünk a bot „lebukásával ” kapcsolatban. Az enum az alábbi értéket tartalmazza:
Valid: emberi viselkedésre vallanak a klienstől érkező kérések
InvalidBadResponse: ha nem egyezik meg a javascript által visszaadott érték a szerver oldalon kiszámított értékkel. (ha rosszul írjuk meg a CustomChallengeResponse-t, akkor mindig ilyen hibát fog adni a NoBot!)
InvalidResponseTooSoon: hamarabb történt postback, mint a ReponseMinimumDelaySeconds -nél beállított időegység.
InvalidAddressTooActive: túllépte a kliens a CutoffMaximumInstances-nél megadott értéket
InvalidBadSession: nem használható a session
InvalidUnknown: egyéb ismeretlen hiba

Ezek után egy StringBuilder segítségével összefűzzük egy string-be a NoBot által logolt IP címeket és a kéréseik idejét. Azért használunk SB-t, mert a string-eknél használatos konkatenáció (+) művelethez képest ez sokkal hatékonyabb.
A naplót a NoBot GetCopyOfUserAddressCache metódusának segítségével tudjuk lekérni, mely egy SortedList<DateTime, string> objektummal tér vissza. Itt bármilyen olyan asszociatív tömb (lista) használható az iterációhoz, amelynek van generikus megfelelője (tehát ahol meg lehet szabni a kulcs, illetve az érték típusát)!
Fontos, hogy a naplóban eltárolt adatok megőrződnek mindaddig, amíg nem érkezik újabb valid kérés! Tehát, ha a fejlesztőgépünkön többször is elindítjuk az alkalmazást, és az első postback-et 5 másodpercen belül elkövetjük, akkor láthatjuk az előző körben eltárolt logot.
Amennyiben ezt nem szeretnénk, akkor az if (IsPostBack) else ágában hívjuk meg a NoBot EmptyUserAddressCache() metódusát!

CustomChallangeResponse
Végül már csak annyi dolgunk maradt, hogy megírjuk az egyedi java-tesztelő függvényünket. Egy kis számítási feladatról lesz szó, ahol az aktuális dátum hónapjához hozzá kell majd adni egy random értéket (0 és 12 között), és vissza kell adni az így kapott új dátum hónapjának a sorszámát. A véletlengenerált számot egy Label-ben fogjuk eltárolni, amelyet DOM-on keresztül érünk el, így is tesztelve azt, hogy a kliens egy böngésző, nem pedig egy bot.
A függvényünk az alábbi módon kerül implementálásra:

protected void CustomChallengeResponse(object sender, NoBotEventArgs e)
{
    Label monthlabel = new Label();
    monthlabel.ID = "lbl_date";
    Random r = new Random();
    monthlabel.Text = r.Next(12).ToString();
    monthlabel.Style.Add(HtmlTextWriterStyle.Visibility, "hidden");
    ((NoBot)sender).Controls.Add(monthlabel);

    e.ChallengeScript = string.Format("var p = document.getElementById(‘{0}’).innerText; var now = new Date(); now.getMonth() + parseInt(p);", monthlabel.ClientID);
    int plussz;
    int.TryParse(monthlabel.Text, out plussz);
    e.RequiredResponse = DateTime.Now.AddMonths(plussz-1).Month.ToString();
}

Fontos, hogy NobotEventArgs-ot használjunk, ne sima EventArgs-ot!
A monthlabel-nél két dolgot érdemes megjegyeznünk. Az egyik, hogy ha direktbe állítjuk be a címke Visible tulajdonságát false-ra, akkor a java kódunk nem fog lefutni, mivel nem fogja tudni elérni a címkét. Hasonló dolog fog történni akkor is, ha a Visibility helyett a Display stílustulajdonságot állítjuk be None-ra. Ennek az az oka, hogy Display=None esetén a böngésző egyszerűen kihagyja az adott tag-et, míg Visibility-nél csak nem jeleníti meg, de feldolgozza, és a helyére pedig egy placeholder-t helyez el!
A másik dolog, hogy a címkét a Nobot vezérlőnk Controls collection-jéhez kell hozzáadnunk, nem pedig az oldalhoz! Ezt azért így oldjuk meg, mert a Page Controls gyűjteményéhez az oldal életciklusának valamely korábbi eseményénél tudunk csak új vezérlőt felvenni (pl.: Page_Init, Page_Load, Databind, stb.).

A NobotEventArgs objektumnak számunkra két fontos tulajdonsága van: a ChallengeScript, illetve a RequiredResponse. (Mindkettő string típusú!) Az elsőnél a kliens oldalon kiszámíttatni kívánt java kódot kell megadnunk. Fontos, hogy a getElementById-nak a ClientID-t passzoljuk át, ne a sima ID-t! A RequiredResponse-nál pedig a számítási feladat végeredményét kell megadnunk. Az itt beállított értékkel fogja majd összehasonlítani a Nobot a kliensoldali script által visszaadott értéket.
Nem tudom valakinek feltűnt-e, de a szerveroldalon kiszámított válasznál az aktuális dátumhoz nem random értéknyi hónapot adtunk hozzá, hanem ennél eggyel kevesebbet! Ennek az az oka, hogy java scriptben a hónapok nullától vannak számozva, nem pedig egytől, így például a decembernél a getMonth() függvény 11-et fog visszaadni. Emiatt kell kivonni egyet a véletlengenerált számunkból.

Elkészültünk az alkalmazásunkkal, tesztelgessük, majd használgassuk!!

Lego Kiállítás

Posted: 2008. március 9. in Rendezvény információk
Tegnap volt szerencsém eljutni a Duna Plazában lévő, majdnem egy teljes hónapig megtekinthető, LEGO kiállításra. A LEGO kocka 50 éves évfordulója alkalmából a magyar LEGO fan-ok megleptek minket egy teljesen ingyenesen megtekinthető és nagyon gazdag kiállítással. Nem csak boltban vásárolható kit-ek kerültek a vitrinekbe, hanem saját alkotások is! (ezek voltak az igazán durvák:-)

A kiállított LEGO modellek az egész DUNA PLAZA területén szerteszét találhatóak, van köztük ami mozog, van amelyik megérinthető, … és van olyan is, amely csak távcsővel tekinthető meg. Ezen kívül van lehetőség interaktív játékra is, lehet XBOX360-on LEGO STAR WARS-ozni, LEGO Racers-ben kisautókat távirányítani és hétvégénként közös LEGO várépítés is van a kisebbeknek.
 
Összegezve a látottakat, egy tényleg nagyon igényes és szórakoztató kiállítást sikerül összehozniuk a szervezőknek, amelyet érdemes lehet akár többször is megtekinteni. Az egyetlen negatívum számomra az volt, hogy alig volt TECHNIC LEGO kiállítva, de az egyedi alkotások kárpótolták ezt a hiányosságot.
 
Én mindenkinek ajánlom, hogy menjen el és nézzen körbe, mert megéri!
 
Bővebb infó:
 
Ízelítőnek néhány általam lőtt kép:

http://xforum3.atw.hu/list.html

 
AJAX Control Toolkit –
MutuallyExclusiveCheckBox
 
Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:

http://cid-8dcaf3b0da4fb828.skydrive.live.com/embedrowdetail.aspx/ACTsorozat/ACT|_XIX|_MutuallyExclusiveCheckBox.zip

 
Ezen a héten egy olyan vezérlőt mutatok be Nektek, amely nem elég, hogy kimondhatatlan nevet kapott, még értelme sincsen túl sok.
 
MutuallyExclusiveCheckBoxExtender alapok
Ez az extender pontosan az, amely nélkül eddig is megvoltunk és ez után is megleszünk. Ugyanis ez a vezérlő arra hivatott, hogy jelölőnégyzeteket csoportokba rendezhessünk azért, hogy az egy adott kategóriába sorolt checkbox-ok közül mindig csak egyet lehessen kiválasztani. Magyarul választókapcsolókká transzformálhatjuk át őket. És ennyi! Ez az a nagy funkcionalitás, amelyre a kölcsönösen kizáró jelölőnégyzetek extender összesen képes.
Sokáig gondolkodtam azon, milyen scenario-k esetén jöhetne jól az MECBE, és csak egyetlen egyet sikerült nagy nehezen kitalálnom, de ebben is van némi bibi. Ez az ominózus eset nem más, mint amikor egy olyan kérdőívet kell készítenünk, ahol nagyrészt checkbox-okat használunk, vagyis túlnyomóan olyan kérdések vannak, melyekre több lehetséges válasz adható meg. Ilyenkor a felhasználói élmény miatt esetleg érdemes lehet MECBE-t használni, hogy választókapcsolókkal ne törjük meg az oldal egységét. Ezzel viszont az lehet a baj, hogy a kliens az oldalunkra látogatása előtt már biztosan találkozott radiobutton-nal, illetve checkbox-szal, vagyis tudja melyik mire való. Ezért inkább csak megkavarhatjuk vele, mintsem, hogy fokoznánk a User Experience-t.
Az egyetlen dolog, amivel többet tud a MECBE-s checkbox a radiobutton-nál az az, hogy képes visszaállni alapállapotba, vagyis amikor egyik vezérlő sincsen kiválasztva. Ha másért nem is, akkor ezért már biztosan megéri használni!
Szerintem nem véletlen az sem, hogy egyetlen egy normális példaalkalmazást sem lehet találni az interneten vele kapcsolatban.
 
MECBE használata
A mai példaalkalmazásunk rendkívül kreatív: megmutatjuk, hogy ugyanazt létre tudjuk hozni rádiógombokkal is, mint amit checkbox-okkal meg MECBE-ekkel.
Két-két group-unk lesz mindkét vezérlőcsoportnál, lesznek az egyesek és lesznek a nullák. Ezen csoportokon belül pedig 3-3 elem lesz. A példaalkalmazásból most csak egy rövidebb részletet emelnék ki:
 
<asp:CheckBox ID="CB_11" runat="server" Text="1.1" />
<ajaxToolkit:MutuallyExclusiveCheckBoxExtender ID="MECBE_11"
    runat="server" TargetControlID="CB_11" Key="1" />
<asp:CheckBox ID="CB_12" runat="server" Text="1.2" />
<ajaxToolkit:MutuallyExclusiveCheckBoxExtender ID="MECBE_12"
    runat="server" TargetControlID="CB_12" Key="1" />
 
A Key tulajdonság segítségével adhatjuk meg a közös csoportazonosítót. Magyarul ugyanaz, mint a radiobutton-nál a GroupName. Összesen ennyit kell „csak” megjegyeznünk!!!!