čtvrtek 9. září 2004

Hádanka o třech vypínačích

Mam tu další velice pěkně vypečenou hádanku.

Máme místnost, uvnitř místnosti je žárovka. Před místností jsou tři vypínače, ale pouze jeden rozsvěcuje žárovku. Místnost nemá žádná okna a není do ní z venku vidět. Úkolem je najít řešení, které umožní najít vypínač rozsvěcující žárovku. S vypínači je možno manipulovat jak je libo, ale do místnosti se můžeme podívat pouze jednou a pak určit vypínač.

Další hádanky

Konference Java vs .NET

Ač chvilku před termínem konání, nedá mi to, abych zde nezmínil jednodenní konferenci Java vs .NET. Konference se bude konat 14. září 2004 v Kongresovém centru Praha. Program vypadá opravdu zajímavě, dobrou známkou jsou partneři konference (Sun, IBM, Microsoft ...). Cena registrace je 800 kč. Pokud jde o mě, rád bych se zúčastnil. A co vy, půjdete?

středa 8. září 2004

Já a manuály

Možná by se tenhle spot měl jmenovat já a zdroje informací, ale název jsem volil vzhledem k velice povedenému článku Viléma Málka Manuály aneb Jak jsem se naučil nedělat si starosti a mít rád internet.

Velice dobře si vzpomínám na svůj první počítač. Z dobré vůle rodičů jsem se stal vlastníkem osmibitového počítače Didaktik M. Součástí tohoto počítače byla i manuál nebo jak to nazvat. Za pár měsíců jsem dostal knihu o programování v BASICu, která byla ještě v specificky tvrdých deskách. Moje zkušenosti ze těmi všemi manuály, referenčními příručkami, knihami, HOWTO brožurami jsou velice bohaté.

Postupem času a doby, která byla ovlivněna masivním nástupem internetu jako prostředku pro získávání informací, se i pro mě samotného stal internet tím hlavním zdrojem nejen technických informací. Dle mého soudu největší boom nezpůsobil ani samotný fakt, že je dokumentace a informace dostupná v elektronické podobě, ale fulltextové vyhledávače.

Vyhledávače, abych byl konkrétní Google jehož s NkD familiérně nazýváme přítel na telefonu, se pro mě staly klíčovou složkou práce. Absolutně každý manuál, příručka nebo stažený dokument se po čase vytratí z pamětí a zůstane zapomenutý na disku. Naproti tomu je vyhledávač schopen poskytnout ihned bez dlouhého hledání.

I v době moderních technologií se kniha neztratí ba naopak, má to své ale. Z mého pohledu bych knihu volil ve dvou případech. Jsem začátečník, pak potřebuji vstoupit do problematiky a pak jsou tzv. knihy pro začátečníky tím pravým ořechovým. Druhý případ je ten, kdy potřebuji proniknout do hloubky problému, pak jsou specializované knihy velice dobrým pomocníkem.

Nakonec japonec, nakonec jsem si trochu schválně schoval odborná periodika. Odborná periodika mají trochu jiný význam a přikládám jim důležitost při rozšiřování obzorů. Odborná periodika mi také slouží ke konfrontaci vlastních názorů a k utříbení pohledu na danou problematiku.

úterý 7. září 2004

Pořadí událostí v prohlížečích

Rád bych se s Vámi podělil o velmi zajímavou věc. Programuji pro třívrstvou aplikaci prezentační vrstvu webu a narazil jsem na problém s eventami v prohlížečích. Potřeboval jsem vytvořit za pomoci HTML a JS popup kalendář. Chci aby se choval následovně: Na stránce je malý button. Když na něj user klikne zobrazí se absolutně pozicovaný DIV s kalendářem, který je zobrazen dokud je user ukazatelem myši nad kalendářem nebo nad tlačítkem vyvolávajícím kalendář.

To znamená, že na událost onmouseout těchto dvou prvku zavolám JS funkci a ta skryje DIV s kalendářem. Všechno by krásně fungovalo, kdyby ten inkriminovaný DIV neměl v sobě vnořené další elementy (tlačítko pro výběr měsíce, jednotlivé dny....)

Nejlépe to předvedu na příkladu:

        
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>

  <script language="JavaScript">
    var logID = 0;
    function addLog(message) {
      var log = document.getElementById("console");
      logID++;
      log.value = log.value + logID + " : " + message + "\n"
    }
    function clearLog(){
      var log = document.getElementById("console");
      log.value = "";
      logID = 0;
    }
  </script>

 </head>
 <body style="margin:20px 20px 20px 20px;">
  <div id="outter" align="center" style="border:1px solid black;
     background-color:#AAAAff;width:100px;height:100px"
     onmouseover="addLog('outer DIV - mouse over');"
     onmouseout="addLog('outer DIV - mouse out');">
     
      Outer DIV
      <br /><br />
      <div style="border:1px solid black;
          background-color:#AAFFAA;width:50px;height:50px;margin:auto;"
          onmouseover="addLog('inner DIV - mouse over');"
          onmouseout="addLog('inner DIV - mouse out');">
          
        Inner DIV
      </div>
    </div>
   <br />
   <input onclick="clearLog();" type="button" value="clear LOG" />
   <br />
   <textarea id="console"
       style="width:500px;height:300px;"></textarea>
 </body>
</html>

Ilustrační obrázek

Nyní si projdeme události jak jsou vyvolávány když hýbeme myší podle červené šipky v obrázku:

 
1 : outer DIV - mouse over
2 : outer DIV - mouse out
3 : inner DIV - mouse over
4 : outer DIV - mouse over
 

Překvapivé jsou eventy 2 a 4. Zvláště eventa 2 nám znemožňuje na událost onmouseout outterDivu skrýt outterDiv. Můj původní předpoklad byl, že se eventy chovají tak, že outter mouse over a outter mouse out se vyvolá pouze v případě, že myší najedu a nebo sjedu z tohoto divu avšak jeho "děti/vnořené elementy" nikdy nevyvolají tyto eventy u svého "rodiče/nadřazeného elementu". Nalezl jsem zatím dvě řešení problému.

První řešení

 
//JavaScript  
var mysNadDiv = false;
var delayCallID = 0;
function delayCall(funcCall, delay){
  clearTimeout(delayCallID);
  delayCallID = setTimeout(funcCall,delay);
}
function hideDiv(){
 if (!mysNadDiv) {
  document.getElementById('outter').style.display="none";
 }
}

//do html k outter divu
onmouseover="mysNadDiv=true;"
onmouseout="mysNadDiv=false;delayCall('hideDiv();',200);"

Jde v podstatě o zpožděné zavolání funkce v JS při eventě 2 a než se skutečně zavolá hideDiv tak mezitím eventa 4 znemožní skrytí přes proměnou 'mysNadDiv'. Ve výsledku se outter Div skryje jen když opravdu myš opustí outter Div. clearTimeout je v JS funkci proto, aby se nekumulovalo zbytečně více timerů při rychlém přejíždění myši.

Druhé řešení

Hlídat si pozici myši a vykašlat se na eventy. Outter Div skrýt jen tehdy, když se souřadnice myši dostanou mimo definovanou oblast outer Divem.

Jestli někdo zná lepší řešení, sem s ním. Jen bych rád podotknul, že inner Divů může být klidně 100 a v každém inner Divu můžou být další vnořené elementy a musí Vámi navrhnuté řešení stále fungovat s pokud možno nejméně přidaného kódu.

pondělí 6. září 2004

Spring rozšiřuje podporu aspektově orientovaného programování

Nejdříve krátká svižná pro ty z Vás jenž slyší o AOP (Aspektově orientované programování) poprvé, doporučuji přečíst starší spot Pavla Kolesnikova Co je to Aspect Oriented Programming?. Pokud Vás AOP zaujalo pak je J2EE framework Spring tím pravým místem kde aspecty vyzkoušet. Potěšující zprávou je oznámení rozšíření podpory na AOP framework AspectWerkz.