torek, 23. november 2010

Ikariam

Na kratko bom predstavil igrico, ki mi krajša čas ob vsakodnevnem delu z računalnikom. Čeprav sama igra niti ni tako enostavna naj bo vseeno igrica, ker pač ni nič za nameščat in ni hude grafike.

Komu je tole namenjeno? Vsem, ki jim Facebook ni dovolj.
  • »Na fejsu premal dogaja!«
  • »Igram FarmVille in se res počutim kot seljak.«

Torej, če iščeš neko dopolnilo, ki malo bolj dogaja kot sam Facebook, strateg v tebi pa še ni rekel zadnje, potem beri dalje.

Ikariam je večigralska realnočasovna strateška spletna igrica, ki jo igramo kar iz našega brskalnika. Igrica je brezplačna, dogaja pa se na otočjih klasične Grčije, kjer igralec vodi in širi svoj imperij. Vzporednice bi lahko vlekli s Civilization ali pa s kakšno igrico na T (raje ne bom napisal). V nekaterih pogledih bi lahko rekli, da je podobna tudi igri Caesar III. Igrica obstaja od februarja 2008, razvija pa jo nemški Gameforge.

Potrebna je samo registracija in že imamo nadzor nad malim mestom. Prebivalci so lahko delavci v rudnikih in žagah, znanstveniki, vojaki ali pa nič od tega. V temu primeru nam plačujejo davke in tako polnijo naš proračun. Igralni svet je razdeljen na otoke – na vsakem je lahko 16 mest. Vsak otok ima svojo žago(les) in rudnik za luksuzne dobrine(marmor, vino, kristal, žveplo). Teh pet surovin potrebujemo za napredek v igri. V praksi igra nima konca saj jo stalno nadgrajujejo. Gradnja, surovine, raziskovanje, širjenje imperija, vojskovanje, trgovanje, diplomacija in zavezništvo so ključne besede. Vsak igralec pa se sam odloči v katero smer se bo razvijal. Nasprotnik ti ne more ničesar porušiti, lahko ti samo izropa surovine.

Napovednik.

Sam sem začel igrati 8.6.2009. Moj slog igre je miroljuben kolikor se le da, to je razvidno tudi iz imen mojih mest. Seveda je idealno, če imaš na začetku koga, ki ti malo objasni stvari in te tudi varuje. Filozofije igre od samega začetka nisem bistveno spreminjal: vsak dan porabi praktično vse surovine. Tak način igre te na začetku naredi nezanimivega za ropanje hkrati pa lepo rasteš. Seveda to ne gre vedno saj je ob večjih nadgradnjah nujno večdnevno kopičenje surovin. Tako, da v vsakem primeru potrebuješ vojsko, ki te varuje, saj je zanašanje na sočlane alianse jalovo. Nikoli pa nisem bil zagovornik velike vojske saj te le-ta zelo ovira pri razvoju. Veliko pa je odvisno tudi od same lokacije kamor te igrica postavi. Skrbel sem, da so bila vedno vsa mesta enako razvita.

Vedno sem se navduševal za širjenje svojega imperija v širino – več mest. Ampak nikoli na račun korupcije. Takšen način je zahteval malo bolj organiziran pristop do igranja (več o tem v nadaljevanju) in pa sledenje tujim forumom. Seveda popolne strategije ni. Vedno si omejen s samo igro, novimi spremembami, otoki, soigralci in seveda s časom. Prioriteta so mi seveda bila mesta na marmorju a sem hotel biti neodvisen tudi pri ostalih surovinah.

Predpogoj za hiter razvoj pa so seveda tudi dobro nadgrajeni rudniki in žage. Enako kot zgradbe tudi rudniki in žage potrebujejo več surovin in časa za vsako naslednjo stopnjo. Pri tem še posebej pride do izraza sodelovanje s soigralci saj nadgradnje hitro postanejo zelo drage. V sami igri pa ni mehanizma, ki bi slabim donatorjem onemogočal polno koriščenje rudnikov in žag na otokih. Svoj imperij sem poskusil enakovredno razvijati v vse smeri ampak vedno so seveda potrebni kompromisi.

Poslovni model pa seveda omogoča, da za pravi denar kupimo ti. Ambrozijo. Na takšen način se financira razvoj in strežniki. Z Ambrozijo lahko pretvarjamo surovine, premikamo mesta, povečamo proizvodnjo…

V Sloveniji imamo dva strežnika (Alpha in Beta) in kakšnih 5000 igralcev. V zimskih mesecih je seveda aktivnih več.

Gledal sem tudi na medsebojno oddaljenost mojih mest, saj počasen transport zelo vpliva na igro. Upoštevati pa je treba tudi darovanje, ki je na otoku z več lastnimi mesti, precej bolj profitno.

V vseh mestih ima zgrajene Arhitekte, Tesarje in Vinske preše – vse čim prej na stopnjo 32. Poleg tega pa še dve skladišči in Depot. V igri so tudi Templji ampak jih ne koristim.

Seveda pa se tudi borimo – branimo proti zelo dobrim nasprotnikom. Ampak vzame veliko časa.

Podrobno poročilo bitke po rundah: *KLIK*

Tako kot pri vsaki stvari pa sem tudi tukaj dodal nekaj svojega. Za lažje vodenje/odločanje si v Excelu vodim različne izračune in statistike. Vsak parameter je tudi možno enostavno spremeniti in tako pogledati malo naprej. Tako imam na pregleden način na voljo vse kar me zanima. Seveda si sproti dodajam funkcionalnosti, ki me zanimajo, ob tem pa se še malo učim Excel.

Glavne funkcionalnosti:
  • Računanje pridobivanja surovin (korupcija, stopnje, pospeševalci)
  • Računanje časa za pridobitev določene količine surovin
  • Kombinacija zahtevanih in pridobljenih surovin
  • Računanje količine surovin, ki jih je možno kupiti z dnevnim prihodkom
  • Računanje časa do nadgradnje vseh/preostanka rezidenc
  • Računanje ne/zavarovanih surovin v mestu glede na stopnje skladišč
  • Računanje lastnih stopenj in kapacitet skladišč
  • Računanje preostanka potrebnih skladišč glede na zahtevano kapaciteto
  • Računanje skupnih stopenj zgradb
  • Računanje točk generalov glede na vstavljene enote
  • Računanje cene vzdrževanja glede na vstavljene enote
  • Računanje prihodka glede na vojsko, delavce, znanstvenike in raziskave
  • Računanje prihodka glede na stopnjo mestne hiše
  • Računanje porabe vina
  • Računanje časa za raziskave glede na znanstvenike in raziskave
  • Računanje preostanka časa do končanja raziskave
  • Računanje raziskovalnih točk glede na znanstvenike in raziskave
  • Računanje časa in potrebne količine surovin za eksperimente
  • Računanje faktorjev za posamezna bojna polja







Za vse bolj vojaško usmerjene pa je Todor naredil zelo uporaben programček v Javi. Več informacij dobite na beezgetz.com.
  • 10 mest (5 marmor, 3 vino, kristal in žveplo)
  • 295.451 pridobljenih surovin na dan
    • 127.920 les
    • 94.331 marmor
    • 44.496 vino
    • 13.872 žveplo
    • 14.832 kristal
  • 11.470 delavcev
  • 1.850 znanstvenikov naredi 2.220 točk/h (53.280 na dan)
  • 16.920 zlata na uro
  • 1.936.410 skupnih točk (1.503.644 mojster gradnje)
  • 3.318 stopenj zgradb
  • 280 stopenj raziskovanja
  • 12.178 generalov

Veliko koristnih informacij za začetnike in izkušene se dobi tudi na WikiIkariam. Bi poskusil? Začni tukaj: http://si.ikariam.com/. Obstaja tudi možnost, da vas igra postavi blizu mene ampak to bom omejil samo na znance.

sobota, 23. oktober 2010

Zaprašeni biti

Ko sem pregledoval stare cd-je sem našel par zanimivih zadev. Slike, zapise, glasbo, filme. Vse pa je tako ali drugače povezano z Veluščkovo 1c v Mariboru kjer sem s tremi cimri bival dve leti, od 2003 do 2005. Je že tako, da se ob koncu radi spomnimo začetkov.

Kot se za računalničarje spodobi smo nabavili hiter kabelski internet. Slišati je bilo govorice, da smo imeli 3Mb linijo a je naš admin »mongo« poskrbel, da ni bilo prevelike evforije. Z njegovimi skriptami je do nas prišla samo tretjina, če je bil ravno lep dan. Star računalnik je služil za usmernik, ki je bil hkrati tudi server. Imenoval se je YeYz (beri jejž). Na njemu pa je tekel tudi FTP strežnik. Zdaj pa sem našel na stari zgoščenki kopijo tega ftpja. Nanj sem nalagal zelo različne zadeve – kar se mi je pač zdelo takrat zabavno.

Zgodbo pa bom začel še malo prej. Takrat, ko sem si urejal prvi analogni dostop do interneta. Najprej sem v Elektro času kupil 10m telefonskega kabla s konektorji potem pa še Motorolo SM56 od CoOoLeR-ja. In smo šli na lov za SiOL-ovimi promocijskimi zgoščenkami. Naročevali smo jih od vseh možnih sorodnikov in znancev. Pet ur interneta je bilo na posamezni promocijski kodi. Seveda smo vsako kodo izkoristili do konca in še več. Če povezave namreč nisi sam prekinil, ko je pet ur poteklo, si lahko bil na internetu še poljubno časa. Seveda pa so linije padale kar same od sebe zato prekoračitve niso bile tako dobro izkoriščene kot bi lahko bile.

Ko pa teh promocijskih akcij ni bilo več pa smo dostop spet plačevali normalno. Jaz sem imel kar dva ponudnika. ARNES, ki je bil cenejši a je imel omejitev (mislim da 10 ur na teden) in pa VOLJA.NET. Obe prijavni gesli sem dobil od CoOoLeR-ja. Računi so bili ogromni, do 10.000 sit samo za telefon. Spodaj je zgodovina dostopov iz programa NetTimer za avgust 2003. Naredil sem 83 dostopov s skupnim časom 66 ur in ceno 7900 sit.

Spodaj pa je edini dokaz, da smo imeli 3Mb kabelski internet. Beden torrent klient z leetcherskimi nastavitvami. Enosmerni sharing.

Še preden pa sem kupil nov računalnik sem navil in testiral starega. AMD Thunderbirda 800MHz sem navil na 921MHz hlajen s TT Volcano 2, GeForca 2MX pa na 200MHz. Vse skupaj na matični plošči ABIT KT7A-Raid. Tukaj pa je rezultat v 3DMarku2001 SE.

Potem pa je bil čas za nov računalnik. Naročil sem ga po delih preko spletnih trgovin. Kjer je pač bilo najceneje.

Ogromno časa smo preživeli tudi na IRC-u. Takrat je bilo res ogromno ljudi saj je bil to najpopularnejši protokol za izmenjavo neposrednih sporočil. Pisale so se skripte, slapal se je folk, prevzemali so se kanali. Pomembno je bilo tudi, da si ostale obveščal o tem kaj počneš. Ime na ircu je odražalo, če nisi bil prisoten, če si bil na kosilu… Vsi privatni pogovori z nasprotnim spolom pa so bili iste oblike: »Kako si?«, »Kolk si stara?«, »Maš sliko?«. In običajno je bilo to tudi vse. Prirejali so se tudi ti. Irc Partyi. Naš privatni kanal je bil #Tekila, ki še vedno obstaja. Na ircu se je dogajalo vse. Spremljali smo tekme. Slika je iz tekme med Portugalsko in Anglijo, ko so streljali enajst metrovke.

Seveda smo bili tudi na kanalu #Velenje in imeli +, ti. voice. Veliko zelo različnega folka.

Seveda pa nikoli niso samo lepi trenutki. Bilo je tudi nekaj izpadov.

Takrat se mi je zdelo zanimivo tudi zbiranje zajcev. Vsakemu sem določil svojega zajca.

Pozabiti ne smem niti moje zbirke hudih bejb. Poimenoval sem jih bombice, evo najboljše.

Ko smo pa dobili še mikrofon je bilo pa konec. Zbrali so se trije, ki so imeli volja do petja. Ponavljam, imeli so samo voljo, nič drugega. Tudi izbor »komadov« je zelo pester, da o interpretaciji ne govorim. OPOZORILO: Če imaš posluh raje tega ne poslušaj! Gre za zelo abstraktno zadevo. Opisal bi jo kot One-hit failure.


Veliko smo preigrali tudi mod za Quake 3, Urban Terror. To je bilo preden sem odkril CSS.

Preko interneta pa smo tudi malo nažigali Quake 3. Ampak smo običajno hitro končali. Ni bilo skilla.

Prodrli smo tudi na filmska platna. Zmontiral sem najbolj zanimive trenutke tistega jutra. Očitno je bilo super.


Popularni so bili še Bananopapi (Handsome Teens Eat Bananas :) ,Severina in njen pornič, Taja in njene gole slike (za fanta in Slovenijo). Takrat je internet ustvaril Freddya Millerja (podobno kot danes Ekrema Jevrića). CP Laško pa je bila evropski prvak.

Potem je pa prišel MSN in vse se je izrodilo.

ponedeljek, 4. oktober 2010

Iz C# v F# in nazaj

Po dolgem času sem spet zbral malo volje da nekaj spišem. Šlo bo za zadevo, ki sem jo sprogramiral že pred časom, da sem si malo ogledal C# 4.0. Nekaj F#-a in paralelizacije ter medsebojne uporabe knjižnic.

Kontekst
Računanje fakultete. Gre za matematično funkcijo, ki je zmnožek vseh manjših števil, vključno z n -
(5! = 1 * 2 * 3 * 4 * 5 = 120). Funkcije za računanje fakultet sem napisal na več načinov – za primerjavo.

F#
Gre za funkcijski programski jezik s podporo objektnemu programiranju, ki temelji na .NET platformi. Primeren je za kompleksne algoritme, simulacije, analize, matematične izračune, paralelizacijo, podatkovno rudarjenje, umetno inteligenco...

Implementacija


Rekurzivno funkcijo za izračun fakultete sem dal v posebno knjižnico, da ni bilo krožne reference. To funkcijo kličemo potem iz F#. Uporabiti je potrebno BigInteger saj rezultati kmalu postanejo ogromni.
using System.Numerics;

namespace FactorialLibrary
{
    public struct RecursiveFactorial
    {
        public static BigInteger FactorialRecursive(BigInteger number)
        {
            return number > 1 ? number * FactorialRecursive(number - 1) : 1;
        }
    }
}
F# modul z rekurzivno, iterativno in eksotično funkcijo za izračun fakultete. Spodnja funkcija pa je klic funkcije iz zgoraj omenjene C# knjižnice.
module FactorialFSharpLibrary
open FactorialLibrary

let factorialExotic(n) = Seq.fold ( * ) 1I [1I .. n];;

let rec factorialRecursive(n) =
    if n < 1I then 1I
    else n * factorialRecursive (n - 1I);;

let factorialIterative(n:bigint) = 
    let mutable result = 1I
    for i=1 to (int)n do
       result <- result * bigint(i)
    done
    result;;

let factorialRecursiveCSharp(n) =
    RecursiveFactorial.FactorialRecursive(n);;
V C# strukturi pa imamo iterativno in paralelno funkcijo za izračun fakultete. Prav tako pa kličemo tudi vse zgoraj napisane funkcije.
public struct Factorial
    {
        public static BigInteger Number { get; set; }

        public static BigInteger FactorialIterative()
        {
            var fact = new BigInteger(1);
            for (var i = 1; i <= Number; i++) { fact *= i; }
            return fact;
        }

        public static BigInteger FactorialIParallel()
        {
            var fact = new BigInteger(1);
            Parallel.For(1, (long)Number + 1, i => { fact *= i; });
            return fact;
        }

        public static BigInteger FactorialFSharpExotic()
        {
            return FactorialFSharpLibrary.factorialExotic(Number);
        }

        public static BigInteger FactorialFSharpRecursive()
        {
            return FactorialFSharpLibrary.factorialRecursive(Number);
        }

        public static BigInteger FactorialFSharpIterative()
        {
            return FactorialFSharpLibrary.factorialIterative(Number);
        }

        public static BigInteger FactorialRecursiveOverFSharp()
        {
            return FactorialFSharpLibrary.factorialRecursiveCSharp(Number);
        }
    }
V glavnem programu samo pokličemo vse metode in izpišemo rezultate. Čas izvajanja posamezne metode tudi izmerimo.
struct FactorialExamples
    {
        private const string Print = ":\n{0}";

        public delegate BigInteger ExecuteMethod();

        public static void MeasureMethod(string printLine, ExecuteMethod method)
        {
            var timer = Stopwatch.StartNew();
            var result = method();
            timer.Stop();
            Console.WriteLine(string.Format(printLine + Print, result) + "\ntime: " + timer.ElapsedMilliseconds + "ms");
        }

        public static void Main()
        {
            Factorial.Number = 100;
            Console.WriteLine("Factorial of {0}", Factorial.Number);
            MeasureMethod("recursive C# over F#", Factorial.FactorialRecursiveOverFSharp);
            MeasureMethod("iterative", Factorial.FactorialIterative);
            MeasureMethod("parallel", Factorial.FactorialIParallel);
            MeasureMethod("exotic F#", Factorial.FactorialFSharpExotic);
            MeasureMethod("recursive F#", Factorial.FactorialFSharpRecursive);
            MeasureMethod("iterative F#", Factorial.FactorialFSharpIterative);
            Console.ReadKey();
        }
    }
Rezultati fakultete števila 200 in čas izvajanja.

Testiranje
Vse funkcije tudi testiramo z Unit testi. Zgoraj so konstante za obvestila o napakah, spodaj pa klici vseh metod in primerjava njihovih rezultatov s pravilnim. Metode testiramo z različnimi argumenti.
[TestClass]
    public class TestFactorial
    {

        #region Printout fields
        private const string Recursive = "Error in recursive function";
        private const string Iterative = "Error in iterative function";
        private const string Parallel = "Error in parallel function";
        private const string ExoticF = "Error in exotic F# function";
        private const string IterativeF = "Error in iterative F# function";
        private const string RecursiveF = "Error in recursive F# function";
        #endregion

        private static void MethodRun(BigInteger parameter, BigInteger expectedResult)
        {
            Factorial.Number = parameter;
            var actual = Factorial.FactorialRecursiveOverFSharp();
            Assert.AreEqual(expectedResult, actual, Recursive);
            actual = Factorial.FactorialIterative();
            Assert.AreEqual(expectedResult, actual, Iterative);
            actual = Factorial.FactorialIParallel();
            Assert.AreEqual(expectedResult, actual, Parallel);
            actual = Factorial.FactorialFSharpExotic();
            Assert.AreEqual(expectedResult, actual, ExoticF);
            actual = Factorial.FactorialFSharpIterative();
            Assert.AreEqual(expectedResult, actual, IterativeF);
            actual = Factorial.FactorialFSharpRecursive();
            Assert.AreEqual(expectedResult, actual, RecursiveF);
        }

        #region Test Methods
        [TestMethod]
        public void TestFactorialsFor0()
        {
            MethodRun(0, 1);
        }

        [TestMethod]
        public void TestFactorialsFor1()
        {
            MethodRun(1, 1);
        }

        [TestMethod]
        public void TestFactorialsFor10()
        {
            MethodRun(10, 3628800);
        }

        [TestMethod]
        public void TestFactorialsFor20()
        {
            MethodRun(20, 2432902008176640000);
        }
        #endregion

    }
}
Rezultati testa - vsi testi so uspešni.
Za konec pa še metrika kode za C# projekte v tej rešitvi.

sobota, 18. september 2010

Mali Ekrani

Ko dvigneš noge nekam višje, položiš roke na telo in se zleknjen spraviš gledat novo epizodo priljubljene televizijske serije. Paše teh 20-40 minut malo odklopit in se prepustiti zgodbi. Za gledanje filma pa se je že potrebno psihično pripravit in malo načrtovat delovnik. No vsaj pri meni je tako. Slabe oz. dobre pol ure se nikjer ne pozna. Če pa je osebek ti. »serijski gledalec serij« mu ena epizoda ni dovolj. Poišče si še kakšno drugo serijo, ki jo bo spremljal, saj je čakanje na novo epizodo preveč boleče, časa je pa očitno preveč.

Sam se uvrščam med tiste z zmernim apetitom za serije. Seveda apetit na trenutke eskalira. To se zgodi običajno, ko spremljam kakšno starejšo serijo in imam na zalogi več epizod, sezon. Seveda pa lahko serije postanejo tudi naporne za spremljanje. To opazimo predvsem tisti, ki smo precej ciljno naravnani, se pravi, da končujemo začeto.
Zadeva ti mora biti res pisana na kožo, da se ne naveličaš. Kvaliteta serij niha med sezonami in ko število gledalcev pade pod neko mejno vrednost jo preprosto ukinejo. Jasno je, da potem gledamo »schnellkurs« sezono z vsebino N-tih sezon. Generalno gledano sem pa kar vesel, ko je konec kakšne serije.
Malo sem pobrskal po spominu in naredil seznam serij, ki sem jih gledal oz. jih še.



Naslov

Sezone

Epizode

Trajanje [min]

Vsebina

Podnapisi

Končana

Prison Break

4

22, 22, 13, 23

43

zapori, pobegi, prevare, korupcija, Michael Scofield

SLO

DA

Desperate Housewives

6

23, 24, 23, 17, 24, 23

43

skrivnosti sosedov, življenje v predmestju

SLO

NE

Dexter

4

12 na sezono

55

forenzik, serijski morilec, Dexter Morgan

SLO

NE

House M.D

6

22, 24, 24, 16, 24, 21

43

zdravniki, eksotični primeri, karakter, Gregory House

SLO

NE

24

8 in film

24 na sezono

43

protiteroristična enota, agent Jack Bauer

SLO razen 8 sez.

DA

How I Met Your Mother

5

22, 22, 20, 24, 24

22

osvajanje žensk, teorije, družba, Barney Stinson

SLO

NE

The Big Bang Theory

3

17, 23, 23

22

znanstveniki, geeki, asocialci, Penny, Sheldon Cooper

SLO

NE

Californication

3

12 na sezono

30

ženske, pijača, onegavljenje, Hank Moody

SLO

NE

Gossip Girl

3

18, 25, 22

43

Chicks Dig It :)

ANG

NE

'Allo 'Allo!

9

7, 7, 6, 6, 26, 8, 10, 7, 6

25-45

2. sv. vojna, francoski uporniki, René Artois

SLO

DA

Band of Brothers

1

10

60

2. sv. vojna, tovarištvo, neznosne razmere, četa Easy

SLO

DA

Hiter izračun pokaže naslednje številke. 36.961 minut oz. 616 ur kar je malo več kot 25 dni. Zanimivo bi bilo videti številke nekaterih, ki spremljajo po 15+ serij na leto.


Do konca serije 24 mi manjka še par epizod potem pa nekaj časa ne mislim gledati nič novega. Samo te serije, ki se še niso končale, pa že teh je kar veliko. No spremljal bom seveda naše Prepisane in morda kdaj v bližnji prihodnosti celo Family Guy-a.


Da predstavim še ti dve seriji v podobni tabelarični obliki kot zgoraj.


Naslov

Sezone

Epizode

Trajanje [min]

Vsebina

Podnapisi

Končana

Family Guy

8 in 3 filmi

7, 21, 22, 30, 18, 12, 16, 21

22

animirana, nenavadna družina, pes Brian

ANG

NE

Prepisani

1

30

5-8

bivša Juga, stripovsko vzdušje, Jonas

NE

NE


Za sledenje vsem serijam pa uporabljam enostaven koledarček na tejle povezavi. http://tv.stamcar.com/
Idealno bi seveda bilo RSS obveščanje. Če kdo uporablja kaj takšnega pa kar s predlogi na plan.

petek, 10. september 2010

Java in String switch

Končno mi je uspelo usposobiti tudi barvanje kode tukaj na blogu tako, da bom lahko lepše objavljal izrezke kode. Pa poskusimo.
Kot je znano Java 6 ne omogoča uporabe nizov (Stringov) v switch stavkih. Omogoča samo primerjavo Integer-jev, char-ov in enum-ov. S slednjimi pa si lahko pomagamo pri implementaciji želenega switch stavka za String-e. JDK7 sicer obljublja to že nekaj časa ampak bomo po vsej verjetnosti zadevo ogledali šele nekje v sredini leta 2011 (plan B). Ta JDK izdaja pa bo vsebovala samo del predvidenih specifikacij za JDK7. Kompleten paket je predviden za izdajo nekje ob koncu leta 2012 kot JDK8 (plan A).
No pa se vrnimo k namešmu problemu. Recimo, da hočemo implementirati switch stavek, ki nam bo vračal vrednosti za poljubne lastnosti grafičnih komponent. Zaradi lepše implementacije bomo te vrednosti vračali kar kot String-e.
Kot rečeno si bomo pomagali z naštevnimi tipi (enumi). Naštejmo imena komponent (velike črke) s katerimi bomo kasneje preverjali za kateri tip komponente gre. Najlažje s kratkimi imeni. Dodajmo pa še nek tip, ki nam bo predstavljal vse ostalo kar ne bo možno kasneje pretvorit.
/*
     * Enum with our simple class names
     */
    private enum ClassesEnum {
        TEXTFIELD, JCOMBOBOX, JTEXTAREA, JLABEL, JLIST, OTHER
    };
Zdaj pa definirajmo še našo metodo, ki bo vračala vrednost glede na tip komponente. Kratko ime razreda našega argumenta (komponente) pretvorimo v ustrezen naštevni tip, ki smo ga prej definirali. Seveda moramo ta imena v naštevnem tipu natančno definirati, mi smo jih z velikimi črkami.
/*
     * Returns value of given component
     */
    private static String getValue(Component component) {
        //get simple class name
        String className = component.getClass().getSimpleName().toUpperCase();
        //try to convert into enum
        try {
            ClassesEnum.valueOf(className);
        } catch (IllegalArgumentException e) {
            className = ClassesEnum.OTHER.name();
        }
        //convert to enum an get related property
        switch (ClassesEnum.valueOf(className)) {
            case JTextArea:
                return ((JTextArea) component).getText();
            case TextField:
                return ((TextField) component).getText();
            case JComboBox:
                return ((JComboBox) component).getSelectedItem().toString();
            case JLabel:
                return ((JLabel) component).getText();
            case JList:
                return ((JList) component).getSelectedValue().toString();
            default:
                return "Component is not defined!";
        }
    }
No zdaj pa še preverimo našo metodo z različnimi argumenti.
//Our test method
public static void main(String[] args) {
         // Test data
        JLabel label = new JLabel("This is label!");
        TextField textField = new TextField("This is text field!");
        JTextArea textArea = new JTextArea("This is text area!");
        JComboBox jComboBox = new JComboBox(
                    new Object[]{"This is selected item in JComboBox!"});
        jComboBox.setSelectedIndex(0);
        JList list = new JList(new Object[]{"This is selected item in JList!"});
        list.setSelectedIndex(0);
        Button button = new Button("Not defined!");

        /*
         * Test output
         */
        System.out.println(getValue(label));
        System.out.println(getValue(textField));
        System.out.println(getValue(textArea));
        System.out.println(getValue(jComboBox));
        System.out.println(getValue(list));
        System.out.println(getValue(button));
    }
To je trenutno najboljša rešitev, če ne želimo čakat na JDK7. Omenimo pa lahko še eno rešititev.
HashMap<String, Integer> map = new HashMap<String, Integer>() {
            {
                put("JTEXTAREA", 0);
                put("TEXTFIELD", 1);
                //...
            }
        };
        String testString = textArea.getClass().getSimpleName().toUpperCase();
        switch ((Integer) map.get(testString)) {
            case 0:
                System.out.println("This is text area!");
        }
Pa še končni rezultat.

nedelja, 5. september 2010

Reader


Danes bom predstavil eno zadevo, ki je iz meni neznanih razlogov premalo uporabljana. Prispevek je namenjen vsem, ki še niste slišali za Google Reader ali pa ga ne uporabljate. Gre za spletni zbiralnik novic, ki zna brati RSS in Atom vire. Gre za obrnjeno filozofijo saj novice poiščejo nas namesto da mi iščemo njih. Vse kar je potrebno narediti je, da poiščemo vire, ki nas zanimajo in se naročimo nanje. To naredimo tako, da kliknemo na katero od teh ikonna želeni strani ali pa v Readerju dodamo povezavo ročno. Podpira pa tudi naročanje na strani, ki ne ponujajo nobenih virov (klik). Za uporabo Readerja potrebujete samo Googlov (oz. gMail) račun.

Ideja
Ideja Readerja je, da poskrbi za vaše zaznamke (bookmarke), ki se jih nabere ogromno skozi čas. V najboljšem primeru je njihovo pregledovanje neprijetno, sploh če tam ni nobene nove vsebine. Ta aplikacija to dela namesto vas in vas obvešča o novih prispevkih. Seveda pa ne priporočam, da se naročite na vse možne vsebine! Najdite neko razumno število virov, ki vas res zanimajo saj drugače postane neobvladljivo in časovno potratno za vas. Tiste vire z veliko prispevki, ki jih redno pregledujete, raje še vedno obdržite med zaznamki v orodni vrstici. Naročite pa se na tiste zaznamke (vire) z manj prispevki, ki jih redkeje ali pa sploh ne obiskujete. Viri so lahko spletne strani, blogi, gmail…

Google Reader
Vire lahko potem organiziramo v mape, jih označimo, dodamo zvezdice, komentiramo, delimo s prijatelji, lajkamo, pošiljamo po elektronski pošti, pregledujemo v načinu Play…

Način Play
Za posamezen vir lahko pogledamo še ostale podobne vire ali pa pregledamo priporočene vire oz. pakete virov. Po novicah se premikamo z miškinim koleščkom ali pa s tipkovnico, novica se potem avtomatsko označi za prebrano.
Zelo pomemben del se mi zdi tudi sledenje prijateljem. Obvešča nas o novicah, ki jih delimo, in komentarjih na novice, ki s(m)o jih delili prijatelji.
Novice lahko berete tudi preko mobilnika, igralne konzole Wii ali pa kar brez povezave ampak ne več preko Google Gears.
Zadnja novost v Readerju pa so trendi. Avtomatsko se vodi statistika zate in za tvoje prijatelje o bralnih navadah, prebranih novicah in popularnosti. Na voljo je tudi vsa statistika za vire na katere si naročen. Ko si »prebral« 300k novic ti nehajo vodit statistiko zaradi performans. Na ta način lahko hitro vidimo kateri viri so »mrtvi« ali pa nas ne zanimajo in jih odstranimo.

Trendi
No ko smo pa že pri trendih si pa poglejmo še uporabo Readerja skozi leta.

Uporaba narašča
Če še niste prepričani pa je tukaj še demonstracijski video.


Če želite poskusiti začnite tukaj  Pa veselo obvladovanje spleta vam želim.

četrtek, 2. september 2010

(Space Jam)^-1

Za nami je še ena tekma košarkarske reprezentance na svetovnem prvenstvu v Turčiji.
Podaje, prodori, preigravanja, trojke in skupinske akcije. Atomska Slovenija! Uspevalo jim je tudi tisto kar ne znajo, res, ni da ni. A kaj ko se nam je spet zgodila ista stvar kot ponavadi, ko dominiramo (še pomnite fuzbal tekme proti Jugoslaviji?)...

Tekma
Da, zgodilo se nam je tistih 6 minut, ki uničijo, zadavijo in zakopljejo našo kokoš. Zgodi se Space Jam! Naši športniki imajo težave tudi z osnovnimi motoričnimi sposobnostmi. Žoge uhajajo, tekanje je nekontrolirano, smer je vprašljiva in destinacija je neznana. Gledalci pa se samo čudimo, pulz raste, sivi lasje tudi... Kako, zakaj, WTF, klinika? Preprosto ni bilo pulza.

Igra Slovenije
Tokrat smo odnesli celo kožo. Ravno ob pravih trenutkih se je pojavil pulz. Jaka nam je trznil, še sreča. Ob koncu pa je zadel še Boki.
Končni rezultat Brazilija : Slovenija 77:80 nam bo po vsej verjetnosti za tekmeca prinesel Avstralijo ali Angolo. Na papirju ugodna tekmeca...


Podobna tekma a obrnjena
P.S. Pohvale pa gredo Vidmarju. Fant zna in se bo še razvijal.

ponedeljek, 30. avgust 2010

1

Pa poskusimo. Moj cilj ni državljansko novinarstvo! Pisal bom o različnih stvareh, cilj pa je 10 objav.

Blogging