Vybírám licenci pro geoANDhash

Když jsem doposud páchal jakýkoliv projekt, většinou jsem si nechal zdrojáky pro sebe a výslednou podobu jsem nějak vypustil mezi širokou veřejnost, šiř se jak šiř. Teď jsem však dospěl do fáze, kdy bych se rád nějakým způsobem podělil i o zdrojový kód, aby se mohli připojit další, resp. chcisi nechat projekt hostovat na google code a při registraci je potřeba uvést, pod jakou licencí je daný kód možné šířit. Proto bych chtěl vyzkoumat, která licence by pro mě byla nejvhodnější.

Když jsem doposud páchal jakýkoliv projekt, většinou jsem si nechal zdrojáky pro sebe a výslednou podobu jsem nějak vypustil mezi širokou veřejnost, šiř se jak šiř. Teď jsem však dospěl do fáze, kdy bych se rád nějakým způsobem podělil i o zdrojový kód, aby se mohli připojit další, resp. chcisi nechat projekt hostovat na google code a při registraci je potřeba uvést, pod jakou licencí je daný kód možné šířit. Proto bych chtěl vyzkoumat, která licence by pro mě byla nejvhodnější.

Nejvhodnější vlastnosti by pro mě měla zřejmě Creative Commons – Attribution-Share Alike 3.0 Unported, která povoluje šířit a modifikovat za podmínek, že produkt bude označen dle mých podmínek a pokud bude pozměněn, musí být dále šířen pod toutéž licencí, nebo licencí kompatibilní.

http://www.czilla.cz/podpora/shrnuti-mpl.html

http://www.root.cz/clanky/gnugpl-pravni-rozbor-licence/

http://www.martinvseticka.eu/index.php?sekce=browse&page=137

http://www.gnu.cz/article/30/

http://cs.wikipedia.org/wiki/BSD_licence

http://www.it-joker.cz/Pocitace-weby/71-Obsah-zdarma-a-licence,-aneb-jak-se-v-nich-vyznat.html

Mimetype detection in upload component

I posted short topic about my way to uploading files to Alfresco some time before. Now I turned all that code into my own component and added it to Tag Library and also added mimetype detection and some other amazing stuff. I'll try to describe some facts about my implementation in this blogpost, so be encouraged to keep reading ;-).

I posted short topic about my way to uploading files to Alfresco some time before. Now I turned all that code into my own component and added it to Tag Library and also added mimetype detection and some other amazing stuff. I'll try to describe some facts about my implementation in this blogpost, so be encouraged to keep reading ;-).

I'm not going to describe how to build own component, there are many tutorials on web (for example here or here) and it's much simplier than stuff I'm going to write about (many ughly javascript code). So let's begin.Firstly, thanks to component,jsp code is simplified. I compressed whole code into component (form inputs, labels, also js libraries includes), so my code lookslike this (note that javascript part is optional and is there just to disable OK button on page load; also mimetype selector is optional).

<%@ taglib uri="http://www.shmoula.cz/jsf/component/tags" prefix="shmoula" %>

<script type="text/javascript">
function pageLoaded(){
    document.getElementById("dialog:finish-button").disabled = true;
}
window.onload = pageLoaded;
</script>

. . .

    <h:inputHidden id="fileId" value="#{SlowUpload.fileId}" />
    <shmoula:upload label="soubor" />
    <r:mimeTypeSelector id="mime-type" value="#{SlowUpload.mimeType}" />

. . .

FileId parameter does still the same thing – it connects get data with post data – identificator is created and then AJAX call is made, in which goes this id and filename to servelt, which creates a new FileBean and also get mimetype from filename and send it back. You can see this snippet on following listing.

 public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
       PrintWriter out = response.getWriter();
       
       try{
           // creating a new bean for fileinfo storing and also setting some info
           this.fileUploadBean = new FileUploadBean();
           this.uploadId = request.getParameter("uploadid");
           String filename = request.getParameter("filename");

           // fetching mimetypeService from SlowUpload bean; more info follows
           SlowUpload slowUpload = (SlowUpload)request.getSession().getAttribute("SlowUpload");
           MimetypeService mimetypeService = slowUpload.getMimetypeService();
       
           // guessing and returning mimetype
           // if mimetype is not recognized, application/octet-stream is returned

           out.print(mimetypeService.guessMimetype(filename));
           
       }catch(Exception e){
           out.print("FALSE");
       }
}

MimetypeService must be injected into SlowUpload bean, so I need some Setters in my class for that and definition in Faces config:

 <managed-bean>
       <managed-bean-name>SlowUpload</managed-bean-name>
       <managed-bean-class>cz.shmoula.SlowUpload</managed-bean-class>
       <managed-bean-scope>session</managed-bean-scope>
. . .
       <managed-property>
           <property-name>mimetypeService</property-name>
           <value>#{MimetypeService}</value>
       </managed-property>
. . .
   </managed-bean>

 Now onComplete function is called thanks to prototype library AJAX calling. In this function a right option in select box is selected just through a simple loop, as you can see:

function callbackFunction(originalRequest){
    var vystup = new String(originalRequest.responseText);
    
    if(vystup=="FALSE"){
        rollback(1);
        alert("Chyba pri uploadu");
    }else{
        var select = document.getElementById("dialog:dialog-body:mime-type");
        for(i=0;i<select.length;i++){
            var selectVal = new String(select.options[i].value);
            if(selectVal.match(vystup)!=null){
                select.options[i].selected = true;
                select.selectedIndex = i;    
                break;
            }
        }
    }
}

And after all this whole formular is sent to servlet via POST method. All this is described in previous post, so you can check it out there. But there is one change – servlet returns success of operation inside hidden input. So I changed servlet this way:

response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(". . .<input type="hidden" id="iframe_status" value=""+this.fileUploadBean.getFileName()+"" />. . .");

On client side is after (un-)successfully file upload called handle_upload() function, which gets value from included iFrame and decides that operation was or was not successfull and call appropriate actions:

function handle_upload(){
    var doc = getIframeDocument();
    var filename = doc.getElementById("iframe_status").value;
   
    if(filename != "FALSE"){
        var fileNameInput = document.getElementById('dialog:dialog-body:fileName');
        if(fileNameInput!=null)
            fileNameInput.value = filename;
        checkButtonState();
    }else{
        rollback(1);
        alert("Chyba pri uploadu!");
    }
}

CheckButtonState function does nothing else, than enable OK button for complete submit all those information (if some other conditions came true) and rollback function sets form target to original target – …/dialog/container.jsp.

That's all folks! Simplified procedure of my component activity. I wish I have not to write these hacks and all those things are accessible by developer in alfresco (they are there, but you can't use them outside specified containers or-how-to-name-that) some simple way. Maybe in future I hope!

Geohashing

Jaro je čas, který s sebou přináší nové touhy a plány do budoucna. I na mě se jednou za čas přilepí pocit vyzkoušet něco nového, případně někde narazím na něco, co mě dokáže totálně pobláznit a definitivně tomu propadnout, než celý tento stav ve velmi brzké době zase nezmizí :-). Ne, nemám na mysli jarní zapalování lýtek mých vlastních, ani odhalování lýtek příslušnic něžného pohlaví. Mám na mysli věc mnohem více nerdí, ke které je spíše než vymýšlení originálního oslovení potřeba umět zahashovat řetězec algoritmem MD5. Mám na mysli Geohashing.

Jaro je čas, který s sebou přináší nové touhy a plány do budoucna. I na mě se jednou za čas přilepí pocit vyzkoušet něco nového, případně někde narazím na něco, co mě dokáže totálně pobláznit a definitivně tomu propadnout, než celý tento stav ve velmi brzké době zase nezmizí :-). Ne, nemám na mysli jarní zapalování lýtek mých vlastních, ani odhalování lýtek příslušnic něžného pohlaví. Mám na mysli věc mnohem více nerdí, ke které je spíše než vymýšlení originálního oslovení potřeba umět zahashovat řetězec algoritmem MD5. Mám na mysli Geohashing.

Image and video hosting by TinyPic

Ano, opravdu Geohashing, ne Geocaching, nespletl jsem se. Ovšem princip je velice podobný. Taky je k němu zapotřebí znát nějaké souřadnice, GPSka taky přijde vhod, stejně tak připojení k internetu pro získání Dow Jonesova indexu. Ale popořadě. V květnu 2008 vyšel na xkcd strip popisující algoritmus, jak získat náhodné souřadnice v rámci určité oblasti na celé zeměkouli. Představa je taková, že celý svět je rozdělen do mřížky 1×1 stupeň vždy počínaje celým číslem severní šířky a celým číslem východní délky o velikosti přibližně 110x110km. Každá takováto buňka se nazývá „gratikula“ (eng. graticule), která je většinou pojmenovaná podle největšího města, které v této oblasti leží. Každý den je na základě výše zmíněného Dow Jonesova indexu (ukazatel vývoje na americkém akciovém trhu, defakto jakýsi generátor pseudonáhodného čísla) vygenerována hodnota, která je spojena s aktuálním datem a zahashovaná algoritmem MD5. Výsledný 32bitový řetězec je rozdělen na dvě části, z nichž jedna po převodu dává přírůstek k severní šířce a druhá k východní délce. Tyto hodnoty se tedy přičtou k (celočíselným) výchozím souřadnicím dané gratikuly a vzniknou tak naprosto náhodné souřadnice místa uvnitř této oblasti. No a úkolem geohashera je se na tyto souřadnice v daný den dostat, zanechat tam zprávu a pořídit důkaz (foto).

Zní a vypadá to možná složitě, ale je to jednoduché. Existuje množství nástrojů, které výsledné souřadnice dokáží generovat, takže není nutné nic složitě ručně počítat. Mimo jiné existuje implementace pro iPhone, velmi pěkné počítadlo jako mashup uvnitř google mapy a v neposlední řadě, protože jsem majitelem telefonu se systémem Android, tak vzniká i implementace pro tento systém. To bude zřejmě důvodem existence tohoto článku – abych se pochlubil a dal vědět, že je se na co těšit :-). V prvotní fázi se seznamuju s SDK Androida a zkouším vyvíjet, ale počítám, že do konce příštího týdne by mohla spatřit světlo světa první betaverze generátoru geohashe.

Takže bych poprosil o poctivé sledování tématu geohashing v tomto blogu, protože se budou ve velmi brzké době dít veliké věci! Mám i veliké množství nápadů ne přímo do aplikace, ale i pro web a velmi rád bych je všechny uvedl do reality.

Debug mode v G1

Dostal jsem nápad na jednoduchou aplikačku pro Androida, tak jsem se odhodlal na můj domácí notebook nainstalovat Eclipse a Android SDK. Už tu tato kombinace jednou byla, ale protože jsem měl nainstalovánu hromadu modulů (PDT, vývoj pro EE i ME…), tak šlo celé Eclipse k čertu a já na Androidí SDK zanevřel :-).

Dostal jsem nápad na jednoduchou aplikačku pro Androida, tak jsem se odhodlal na můj domácí notebook nainstalovat Eclipse a Android SDK. Už tu tato kombinace jednou byla, ale protože jsem měl nainstalovánu hromadu modulů (PDT, vývoj pro EE i ME…), tak šlo celé Eclipse k čertu a já na Androidí SDK zanevřel :-).

Teď jsem však vyzkoušel druhý pokus a vše zatím funguje. Stáhl jsem Ganymede bundlované pro Java vývojáře a podle návodu na dev stránkách androidu nainstaloval SDKčko a plugin do Eclipse. Nutno podotknout, že tohle by zvládla i necvičená opice.Problémy měly teprve nastat, ale popořádku :-). Všechno frčelo bez problémů (teda až na drobnost, kterou jsem si nedávno prošel na mém DEV stroji – a sice, že Eclipse má problémy s GCJ a vyžaduje JDK od Sunu, takže rozřešeno během mrknutí oka). HelloAndroid aplikace deploynuta na emulátor, přichází touha dostat ji do telefonu. Nahrávám na kartu, spouštím installer, instaluji…ouha – Open volba je disablovana. Aha, aplikačka asi nebude podepsaná. Zkusím jinou možnost – přímý deploy do telefonu.

Na dev stránkách, ze kterých jsem čerpal informace, jsem však nenašel, jak na to. Přidržel jsem se mého oblíbeného hesla STFG a našel, co jsem hledal – Developing on a Device. Návod stručný a jasný, ale nefunguju. Googlení mi neneslo žádné ovoce, tak jsem se zeptal a díky Fuxoftovi dospěl k řešení: je nutné spustit Android Debug Bridge Server. Prvotní pokusy bezúspěšné, po restartu počítače a telefonu success objeven – je nutno spouštět adb start-server pod rootem, jinak se telefon nepřipojí. Pokud server běží, je možné napíchnout telefon a adb devices jej vypíše (není nutno ani v telefonu dávat mount). Díky tomu sem teď můžu dát screenshot mé krásné plochy (pomocí ddms – mooc pěknej debugovací nástroj, zapříčinil mi dlouhý wooooow efekt :-)).

Image Hosted by ImageShack.us

Takže teď přepínám v nastavení parametrů spuštění volbu výběru zařízení z Automatic na Manual a dávám run…chvíle napětí a mám tu dialog:

Image Hosted by ImageShack.us

A sakra, device v1.1 a SDK verze 1.0 :-(. takze failed, jdu spat a mrknu na to zitra 😉 Natáhl jsem novější SDK – v1.1 r1 a stejně se mi nepodařil deploy na telefon, navíc mi přestává fungovat připojení zařízení jako Mass Storage (resp připojení funguje, ale odpojení už ne). Trápil jsem se s tím docela dlouho a nakonec to vzdal (ale až budu mít náladu, ještě se k tomu vrátím a pogooglím). V každém případě jsem ale aplikaci do telefonu dostal – stačí se držet návodu popisujícím podepsání aplikace, takže jsem si vytvořil vlastní keystore, vytvořil .apk (Export unsigned application), podepsal a snažil se o upload do zařízení. Pomocí ddms či adb push se absolutně nedaří – ddms mi sice zobrazí adresářovou strukturu, ale jakmile pushnu, přestane reagovat, adb push dělá to stejné. Ok, zkouším to jinak – mountnu mass storage, nahraju .apk na kartu a snažím se domountovat… nic :-(. Do třetice zkouším nahrát aplikaci na web a stahuju ji do telefonu, instalace… a úspěch! Jde to spustit a funguje, sláva! Krkolomně, ale lepší než drátem do oka, budu muset zjistit, proč mě to nefunguje, jak má.

Vývojářské nástroje pro Androida hodnotím kladně, i když jsem narazil místy na mouchy (a určitě jich ještě pěkných pár bude) , o kterých není v oficiální dokumentaci zmínka a člověk se musí složitě pídit po řešení. Naštěstí je však komunita vcelku velká a množství zdrojů je taky poměrně velké. Rád bych zmínil především diskuní fórum anddev a oficiální mailing listy na google groups. Těším se na další programování a laborování s Androidem, opravdu z něj mám dobrý pocit.