utorok 14. júla 2009
Announcing new company web page
Since today there is a new company web page available at www.zont.eu.
utorok 7. júla 2009
New blog structure
After observing other companies successfully integrate a blog into their enterprise web pages, I made decision that this blog will become inseparable part of my company's web page which is being created at the moment.
The main goal is to bring a life into the not really very interesting static web presentation of the company, which in my opinion was already done successfully by others.
I plan to publish in this blog mainly technical solutions to problems which I have to tackle with, but which might be of interest for others as well, to a lesser degree I plan to publish news concerning the company as such.
Nové zameranie blogu
Po vzore iných spoločností, ktoré integrovali blog do svojej firemnej web stránky som sa rozhodol, že tento blog sa stane taktiež nedeliteľnou súčasťou mojej firemnej web stránky, ktorú v súčastnosti pripravujem.
Hlavným cieľom je oživiť nie príliš zaujímavú statickú webovú prezentáciu spoločnosti, tak ako sa to podľa môjho názoru podarilo iným.
Do blogu plánujem prispievať hlavne technickými riešeniami problémov, s ktorými sa stretnem, ale ktoré by mohli byť užitočné aj pre niekoho iného, taktiež v menšej miere novinkami ohľadom spoločnosti.
streda 1. júla 2009
Workaround for GWT Menubar issue 374
Issue link: Command based top level MenuItems (no sub-menu) stay highlighted when mouse leaves MenuBar.
Short description:
MenuItems on main MenuBar that have no sub-menus stay highlighted even after the mouse leaves the MenuBar. For example the fragment below produces just such a menu...
Workaround:
All workarounds provided on issue page required users to maintain their own GWT builds, which is pretty annoying for such a small nuisance. I have slightly modified one of those solutions, so that now you can package it into your application. It breaks some good practices concerning encapsulation, but it seems to work quite well with GWT 1.6.4. However use only at your own risk.
package com.yourcompany.gwtfix;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
public class FixedMenuBar extends MenuBar {
private static final String DEPENDENT_STYLENAME_SELECTED_ITEM = "selected";
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
MenuItem item = myFindItem(DOM.eventGetTarget(event));
if (item == null) {
return;
}
if (DOM.eventGetType(event) == Event.ONMOUSEOUT) {
this.setSelectionStyle(item, false);
} else if (DOM.eventGetType(event) == Event.ONMOUSEOVER) {
this.setSelectionStyle(item, true);
}
}
private void setSelectionStyle(MenuItem item, boolean selected) {
if (selected) {
item.addStyleDependentName(DEPENDENT_STYLENAME_SELECTED_ITEM);
} else {
item.removeStyleDependentName(DEPENDENT_STYLENAME_SELECTED_ITEM);
}
}
private MenuItem myFindItem(Element hItem) {
for (MenuItem item : getItems()) {
if (DOM.isOrHasChild(item.getElement(), hItem))
return item;
}
return null;
}
public FixedMenuBar() {
super();
}
public FixedMenuBar(boolean autoClose) {
super(autoClose);
}
}
nedeľa 7. júna 2009
Jemný úvod do Jess
Zhodou okolností sa mi podarilo pri modifikovaní svojho súborového systému zmazať tú nesprávnu partíciu na disku, niečo také vždy poteší. :)
Ale všetko zlé je na niečo dobré a pri prehľadávaní mojich archívov som medzi starými CD-čkami našiel svoju starú (2005) diplomovú prácu a rozhodol som sa, že predtým než ju zase niekde stratím, radšej ju zverejním.
Niektoré časti mi už v dnešnej dobe pripadajú úsmevné, ale v prípade, že poznáte napríklad JBoss Rules (Drools) a chceli by ste vedieť čo to vlastne je pravidlový systém (rule engine) a ako principiálne pracuje Rete algoritmus, tak si pozrite prvú kapitolu.
V práci nieje zmienka o Drools, pretože som tam používal Jess (Java Expert System Shell), ale oba systémy sú založené na vylepšených implementáciách Rete algoritmu.
Myslím, že je to písané celkom jednoduchou a pochopiteľnou formou, ale Jess bol pôvodne klonom CLIPSu a jeho syntax sa podobá na LISP, takže typicky bloky kódu sú vymedzené okrúhlymi zátvorkami a taktiež je tam prefixový zápis operátorov.
Link na stiahnutie: Diplomová práca (2005)
streda 3. júna 2009
Ako na geolokáciu s WorldIP API
Pojem geolokácia (Geolocation) v tomto kontexte znamená určenie reálnej geografickej polohy počítača podľa jeho IP adresy.
Požiadavka:
Web stránka podporuje viac jazykových mutácií, medzi ktorými si užívateľ môže vybrať jazyk, ktorému rozumie. Pri otvorení stránky sa implicitne vyberie jazyk, ktorým sa hovorí v krajine, z ktorej je užívateľ pripojený na internet. Konkrétne, ak máme web stránku, ktorá podporuje anglický a slovenský jazyk, výsledok bude, že užívateľovi zo Slovenska, alebo Čiech sa načíta slovenská verzia a pri vstupe na stránku z iných krajín sa zobrazí anglická verzia.
Riešenie:
Riešenie by malo byť jednoduché, zadarmo, rýchlo realizovateľné a dostatočne univerzálne.
Malo by bežať na Google App Engine (GAE) s klientom v Google Web Toolkit (GWT).
Na prvý pohľad sa mi zapáčilo WorldIP API, pretože formát HTTP dotazu je veľmi jednoduchý a výsledkom je iba dvojmiestny kód krajiny. Teda nieje potrebné parsovať žiadne XML a neprenášajú sa iné zbytočné údaje.
Formát dotazu je:
http://api.wipmania.com/[IPADDR]?[URL]
kde:
IPADDR - je IP adresa, ktorej geografickú lokáciu chceme zistit
URL - je doména našej aplikácie, slúži na kontrolu denných limitov
príklad: Aplikácia myappid.appspot.com sa dotazuje na pôvod IP adresy 123.45.67.89
http://api.wipmania.com/123.45.67.89?myappid.appspot.com
výsledok:
dvojznakový kód krajiny, napr. "SK" pre Slovensko.
Jednoduchá pomocná trieda, ktorá funguje aj na GAE:
public class WorldIPHelper {
...
private static final String WIP_API_URL = "http://api.wipmania.com/";
private static final String DOMAIN_NAME_PARAMETER = "?myappid.appspot.com";
...
public static String getLocaleFromWorldIP(String remoteIPAddress) {
String countryCode = "";
try {
URL url = new URL(WIP_API_URL + remoteIPAddress + DOMAIN_NAME_PARAMETER);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
char[] cbuf = new char[2];
reader.read(cbuf);
countryCode = new String(cbuf);
reader.close();
} catch (MalformedURLException e) {
log.severe(e.toString());
} catch (IOException e) {
log.severe(e.toString());
}
return countryCodeToLocale(countryCode).getLocaleString();
}
}
JSP stránka, ktorá nastavuje lokalizačnú vlastnosť GWT podľa IP adresy klienta.
... <% ... localeString = WorldIPHelper.getLocaleFromWorldIP(request.getRemoteAddr()); ... %> ... <meta name="gwt:property" content="locale=<%=localeString%>"> ...Limity: - pre GAE platí hlavne skupina kvót UrlFetch - pre WorldIP API je to 10 000 dotazov denne na jednu aplikáciu Ak by dané limity WorldIP API neboli dostačujúce, prípadne by nebolo vhodné sa z nejakého dôvodu spoliehať na externú službu, je tu tiež možnosť stiahnuť si priamo databázu IP adries, naimportovať si ju do vlastnej databázy a naimplementovať si vyhľadávanie vo vlastnej réžii. Ak ste niekedy riešili niečo podobné, tak odporučte akú službu ste použili, prípadne či ste s ňou boli spokojní.
Prihlásiť na odber:
Príspevky (Atom)