Archive for marec, 2014

Zdanlivo mimo témy blogu – Java 8

28. marca 2014

Možno sa bude zdať divné, čo robí informácia o novej edícii Java 8 na blogu venovanom vývoju pre Windows? Určite sem nepatrí podtitul “čo má nové konkurencia?”. Stmeľujúcim faktorom je fenomén Internet vecí. Celkom ľahko (podobne ako ja ) sa môžete dostať do situácie že budete riadiť, alebo zbierať údaje z nejakého “udelátka”, ktoré bude čírou náhodou postavené na Jave. Táto pravdepodobnosť bude relatívne vysoká, nakoľko technológiu Java využíva viac než 3 miliardy zariadení. Preto som sa zúčastnil na tlačovej konferencii Oracle v Prahe k uvedeniu Java 8

Java SE 8 znamená vôbec najvýznamnejšiu inováciu v celej histórii tejto platformy. Mení sa model programovania, verzia Java SE 8 (“štandardná” Java) a Java ME 8 (verzia “micro edition”) pokračujú v konvergencii.

 

K dispozícii je nová verzia Java Standard Edition (SE) 8, oznámená bola chystaná verzia Java Micro Edition (ME) 8 a produkty, ktoré sú súčasťou platformy Java Embedded. Vývojový tím spoločnosti Oracle a ďalší poprední odborníci demonštrujú hlavné funkcie nových produktov prostredníctvom radu webcastov. K dispozícii je veľké množstvo technických materiálov a dokumentácie, ktoré sa týkajú platformy Java aj vízie Internetu vecí (Internet of Things).

 

Hlavné novinky

  • Aktuálne je už k dispozícii JDK (Java Development Kit) 8, čo je balík vývojových nástrojov a implementácia špecifikácie Java SE 8 Platform. Ide o špecifikáciu, ktorá prešla schvaľovacím procesom (Java Community Process, JCP) a je pripravená na nasadenie do produkčného prostredia. Toto vydanie znamená najvýznamnejšiu inováciu celého modelu programovania od prvého predstavenia platformy Java v roku 1996. Platforma JDK 8 bola vyvinutá v spolupráci s komunitou OpenJDK Community.
  • Spoločnosť Oracle predstavuje taktiež verziu Oracle Java SE Embedded 8, ktorá zároveň využíva nové funkcie a je optimalizovaná pre nasadenie na vložených (embedded) systémoch.
  • Produkty Oracle JDK 8 a Oracle Java SE Embedded 8 sú k dispozícii na stiahnutie.
  • Platformy Java SE 8 a Java ME 8 pokračujú smerom k tesnejšej konvergencii. Finálna verzia Oracle Java ME 8 bude k dispozícii v priebehu jari tohto roku.
  • Platforma Java 8 poskytne konzistentné prostredie naprieč všetkými IT systémami, od vložených zariadení po desktopy, dátové centrá a cloud. Zákazníci budú vďaka tomu schopní nasadzovať aplikácie rýchlejšie, spracovávať a analyzovať dáta priamo za behu (agilne) a okamžite reagovať na aktuálne udalosti.
  • Implementácia Oracle Java Embedded ešte zvyšuje hlavné prínosy jazyka Java, ktoré spočívajú v prenositeľnosti naprieč platformami. Dochádza k ďalšiemu zvýšeniu flexibility vo vzťahu k hardvéru aj platformám, čo umožňuje rýchlejšie portovanie aplikácií a pomáha zefektívniť životný cyklus produktov.

 

Java SE 8

  • Platforma Java SE 8 bola vyvinutá v tesnej spolupráci medzi spoločnosťou Oracle a celosvetovou vývojárskou komunitou. Vývoj zahŕňal vydávanie nových verzií (build) každý týždeň a neustále testovanie kódu.
  • Platforma Java SE 8 ponúka vývojárom vyššiu produktivitu a zvyšuje výkon aplikácií, pretože obmedzuje náročnosť kódu. Vylepšený je systém komentárov (anotácií), jednoduchšie sú modely pre paralelné programovanie a efektívnejšie je možné využívať moderné viacjadrové procesory.
  • Kľúčovými funkciami v novej verzii JDK 8 sú projekt Lambda (JSR 335, používanie lambda výrazov nad veľkými objemami dát), nástroj na spracovanie (engine, interpreter) jazyka JavaScript s názvom Nashorn, nové rozhranie Date and Time API JSR 310 a balík Compact Profiles. Odstránené bolo permanentné generovanie kódu z virtuálneho stroja (Java Virtual Machine, JVM) HotSpot.
  • Súčasťou JDK 8 je taktiež najnovšia verzia JavaFX, ktorá vylepšuje fungovanie Javy na strane klienta. Inovácie zahŕňajú prácu s grafikou (vrátane 3D grafiky), nové ovládacie prvky používateľského rozhrania, rozšírenú podporu pre štandard HTML5 a funkcie, ktoré vývojárom umožnia prepájať knižnicu Swing s aplikáciami v JavaFX.
  • Spätná kompatibilita platformy Java SE 8 s predchádzajúcimi verziami umožňuje ďalej využívať know-how aj prácu súčasných vývojárov a pomáha chrániť súčasné investície do technológie Java.
  • Vývojári, ktorí chcú ihneď začať využívať platformu Java SE 8, si navyše môžu stiahnuť aj integrované vývojové prostredie (IDE, Integrated Development Environment) NetBeans. Toto prostredie podporuje najnovšie funkcie platformy Java a rozširuje taktiež podporu pre štandard HTML5.
  • Podpora pre platformu Java SE 8 by mala byť zahrnutá do vývojového prostredia Eclipse (vo verzii Luna, ktorá je plánovaná na jún 2014, ale aj v ďalších verziách).
  • Spoločnosť Oracle čoskoro uvoľní podporné zdroje pre vývojárov (Java SE 8 training curriculum), ktoré im uľahčia prechod na novú verziu a aj implementáciu inovácií umožnených novou verziou platformy.
  • Spoločnosť Oracle sa naďalej intenzívne angažuje v rámci skupín Java User Groups (JUGs), ponúka vzdelávacie akcie a poskytuje technické informácie.

 

Java SE Embedded

  • Platforma Oracle Java SE Embedded 8 poskytuje vývojové prostredie pre vložené (embedded) zariadenia a Internet vecí (Internet of Things, IoT). Ponúka značnú flexibilitu, rozsiahle možnosti portovania a funkcie platformy Java SE 8.
  • Oracle Java SE Embedded 8 umožňuje vývojárom využívať tri nové profily Compact Profiles v Java SE 8. Umožňuje to na jednej strane vytvárať odľahčené platformy pre vložené systémy, na druhej strane mať prístup k plnému rozhraniu (API) platformy Java SE. Verziu Java SE Embedded 8 je možné oproti verzii 7 nasadiť oveľa efektívnejšie na vložené zariadenia, ktorá majú k dispozícii napr. iba 16 MB pamäte RAM.
  • Platforma Oracle Java SE Embedded 8 je k dispozícii pre viacero platforiem a konfigurácií – napr. Linux na procesoroch ARM, x86, PowerPC. Takisto je optimalizovaná pre komunitné projekty typu Raspberry Pi aj pre hlavné systémy Systems-on-Chip (SoC).
  • K dispozícii sú zároveň nástroje, ktoré umožňujú vytvárať upravené verzie prostredia JRE (Java Runtime Environment) optimalizované pre konkrétne vložené platformy.

 

Java ME 8

  • Verzia Java ME 8 predstavuje významnú aktualizáciu platformy Java ME. Aktualizácia a nové funkcie zahŕňajú o. i. nasledujúce vlastnosti: konvergenciu príslušného rozhrania (API) k Java SE 8, podporu moderných webových protokolov, komplexný model aplikácií, pokročilé bezpečnostné funkcie, štandardné rozhranie na správu napájania a interakciu so širokou skupinou štandardných periférií.
  • Dôležitú inováciu v prípade platformy Java ME 8 predstavuje vyššia rýchlosť aplikácií, čo je významné predovšetkým na menej výkonných zariadeniach.
  • Oracle Technology Network (OTN) a Oracle Academy poskytujú rad technických kurzov a ponúkajú taktiež súťaže pre študentov a vývojárov, kde je cenou pre výhercov napr. účasť na konferencii JavaOne 2014.
  • Java ME a Java SE v najnovších verziách silne konvergujú. Pre vývojárov to znamená konzistentnejšie prostredie a umožňuje im to viac využívať raz vytvorený kód naprieč platformami. Vývojári môžu teraz vytvárať efektívnejší a čistejší kód, ktorý je možné nasadiť v rámci obidvoch platforiem; nové špeciálne funkcie v Java ME 8 pomáhajú zrýchliť a zjednodušiť vývojový cyklus.
  • Finálna verzia Oracle Java ME Embedded 8 bude implementáciou štandardu Java ME. Súčasná verzia Oracle Java ME Embedded 8 Early Access 2 je teraz k dispozícii ako prostredia pre beh (interpreter, runtime) pre niekoľko platforiem (Qualcomm 6270T – ARM9, Raspberry Pi – ARM11 a ST Microelectronics STM32F4DISCOVERY – ARM Cortex-M4). V emulovanom prostredí je možné vyvíjať taktiež aplikácie pre operačný systém Windows 7.

 

Platforma Java v číslach

  • Celosvetovo existuje 9 miliónov vývojárov v Jave.
  • Technológiu Java využíva viac než 3 miliardy zariadení.
  • Existuje viac než 10 miliárd inteligentných kariet využívajúcich technológiu Java Cards.
  • Bezplatne je k dispozícii špecializovaný elektronický časopis Java Magazine. Vychádza raz za dva mesiace, vydáva sa zároveň vo verzii pre mobilné zariadenia. Časopis Java Magazine prináša novinky zo sveta Javy, popisuje nové produkty a poskytuje technické know-how. Vydanie tohto časopisu z tohto marca/apríla je zamerané práve na platformu Java 8. Podrobnejšie informácie o možnosti prihlásiť sa na odber tohto časopisu: pozrite oracle.com/javamagazine.

 

Podrobnejšie informácie (v angličtine)

Nedávajte aplikáciám názvy začínajúce písmenom s diakritikou

27. marca 2014

Jednej demo aplikácii som dal názov Éčka v potravinách, teda názov začínajúcej písmenom s diakritikou. Aplikácia bola schválená a daná do Store. http://apps.microsoft.com/windows/app/ecka-v-potravinach/1d9f60df-5ba0-44dd-96c1-448007ca113c

Stránku aplikácie to zobrazí, ale do storu sa Explorer neprepne a aplikáciu ani v store nenájdete. Diakritika v názvoch iných aplikácií nevadí, preto usudzujem že sa jedná o nejakú náhodnú chybu, prípadne chybu kedy Store neakceptuje prvé písmeno názvu aplikácie s diakritikou.

Ako naprogramovať hru

16. marca 2014

Hry sa dajú naprogramovať rôzne. Samozrejme nič vám nebráni využiť grafické možnosti DirectX, samozrejme treba to vedieť a v neposlednom rade treba na dobrej úrovni ovládať aj C++, čo je odporúčaný jazyk pre vývoj hier. Pre niektoré hry však použitie DirectX môže pripomínať kanón na vrabce a zle urobená hra, v ktorej sa absencia nápadu supluje grafickými efektami môže výrazne zvýšiť spotrebu energie zo zariadenia. BTW vysvetlí mi niekto, prečo tak statická hra ako MS Solitaire poriadne zohreje môj Surface s procesorom i5. Preto som rozmýšľal ako čo najjednoduchšie a zrealizovať jednoduchú a triviálnu, ale zaujímavú hru Sokoban aby čo najmenej zaťažovala procesor. V hre nie je potrebná detailná animácia, stačí ak sa bude hráč a ním presúvané bedničky posúvať o celé políčka hracieho plánu.

Popisovaný princíp bol použitý v hrách Soko http://apps.microsoft.com/windows/app/soko/6334b9c1-e297-4d84-bec2-5f058ff9f5bb a Soko Advanced http://apps.microsoft.com/windows/app/soko-advanced/8da3c7ed-58d6-41ef-a0f8-e3a90bb1947d. V obidvoch hrách je úplne rovnaký engine, hry sa líšia scénami.
Ak nepočítame tlačidlá na hornom paneli, ukazovateľ skóre a pole pre zadávanie kódov úrovní, XAML kód na zobrazenie hracieho plánu sú tri riadky. Jadrom je prvok Grid, do ktorého polí sú dynamicky umiestňované obrázky

<Viewbox Grid.Row=”2″ Stretch=”Uniform”>
<Grid x:Name=”grid_Game” Loaded=”grid_Game_Loaded” />
</Viewbox>

Procedúra na inicializáciu hracieho plánu

void InitialiseLevel()
{
  for (int i = 0; i < Hra.Level.RowCount; i++) grid_Game.RowDefinitions.Add(new RowDefinition());
for (int i = 0; i < Hra.Level.ColumnCount; i++) grid_Game.ColumnDefinitions.Add(new ColumnDefinition());
for (int row = 0; row < Hra.Level.RowCount; row++)
{
for (int column = 0; column < Hra.Level.ColumnCount; column++)
{
Pole pole = Hra.Level[row, column];
pole.PropertyChanged += pole_PropertyChanged;
Image img = new Image();
img.DataContext = pole;
img.Tapped += Pole_Click;
img.Margin = new Thickness(2);
AktualizujPole(img, pole);
Grid.SetColumn(img, column);
      Grid.SetRow(img, row);
grid_Game.Children.Add(img);
}
}
}

Konkrétny stav bunky sa načíta v riadku

Pole pole = Hra.Level[row, column];

V procedúre AktualizujPole sa zobrazí obrázok podľa objektovej reprezentácie hracieho plánu

private static void AktualizujPole(Image img, Pole pole)
{
if (pole.Content != null)
{
switch (pole.Content.Typ)
{
case “Figurka”: if (pole.Name == “Ciel”) img.Source = new BitmapImage(new Uri(“ms-appx:///assets/HracCiel.png”));
else img.Source = new BitmapImage(new Uri(“ms-appx:///assets/hracPodlaha.png”));
break;
case “Bedna”: if (pole.Name == “Ciel”) img.Source = new BitmapImage(new Uri(“ms-appx:///assets/greencrate.png”));
else img.Source = new BitmapImage(new Uri(“ms-appx:///assets/crate.png”));
break;
default: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/void.png”)); break;
}
}
else
{
switch (pole.Typ)
{
case  “Stena”: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/stena.png”)); break;
case  “Podlaha”: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/wood.png”)); break;
case “Mimo”: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/space.png”)); break;
case “Ciel”: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/green.png”)); break;
default: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/void.png”)); break;
}
}
}

Pixelová grafika

4. marca 2014

V niektorých aplikáciách, hlavne hrách je často potrebné vykresľovať grafickú scénu na úrovni pixelov. Niekedy je to dobrá alternatíva k animácii. Pre grafiku na úrovni pixelov sa najlepšie hodí objekt Writeable Bitmap.

Ukážem procedúry využité v aplikácii Chcicken Adventure http://apps.microsoft.com/windows/app/chicken-adventure/45ddf192-274b-408f-9c73-8db3fe5f470e

(dal som ju do store pôvodne pod názvom FLAPPY, ale story hry z týmto názvom dávajú preč)

Do XAM kódu stačí vložiť objekt Image o rozmeroch budúceho obrazu.

<Image Name=”gameimage” Stretch=”Fill” Grid.Column=”0″
HorizontalAlignment=”Center” VerticalAlignment=”top” Width=”864″ Height=”540″
Loaded=”gameimage_Loaded” PointerPressed=”gameimage_PointerPressed” PointerReleased=”gameimage_PointerReleased”/>

Prvok gameimage je v metóde Loaded priradený prvku

public static Image imgGame = null;

private void gameimage_Loaded(object sender, RoutedEventArgs e)
{
imgGame = (Image)sender;
}

Pri hre portovanej z osembitovej platformy som využil rozlíšenie obrázku scény hry 320 x 200 resp 640 x 400.

this.img = new WriteableBitmap(320, 200);
pixely = new byte[4 * img.PixelWidth * img.PixelHeight];
pixelStream = img.PixelBuffer.AsStream();
MainPage.imgGame.Source = img;

Každý pixel je v pamäťovej štruktúre WriteableBitmap reprezentovaný štyrmi bitmi. Jednotlivé pixely sa preto nastavujú priamym zápisom do bajtového pola takto

protected void SetPixel(int x, int y, Color clr)
{
  int index = 4 * (y * img.PixelWidth + x);
pixely[index + 0] = clr.B;
pixely[index + 1] = clr.G;
pixely[index + 2] = clr.R;
pixely[index + 3] = clr.A;
}

Užitočné môžu byť aj procedúry na vykreslenie prázdneho a vyplneného obdĺžnika

protected void fillRect(int x0, int y0, int width, int height) //vykresli vyplneny obdlznik nastavenej farby
{
for (int yy = y0; yy < y0 + height; yy++)
{
for (int xx = x0; xx < x0+width; xx++) SetPixel(xx, yy, cFarba);
}
UpdateBitmap();
}

void drawRect(int x0, int y0, int width, int height) //vykresli obrysy obdlznika nastavenej farby
{
for (int xx = x0; xx < x0 + width; xx++) SetPixel(xx, y0, cFarba); //horna ciara
for (int yy = y0; yy < y0 + height; yy++) //zvisle ciary vlavo a vpravo
{
SetPixel(x0, yy, cFarba); //v1avo
SetPixel(x0 + width, yy, cFarba); //vpravo
}
for (int xx = x0; xx < x0 + width; xx++) SetPixel(xx, y0 + height, cFarba); //dolna ciara
UpdateBitmap();
}

Aktualizácia obrázka sa robí v procedúre

protected void UpdateBitmap()
{
pixelStream.Seek(0, SeekOrigin.Begin);
pixelStream.Write(pixely, 0, pixely.Length);
img.Invalidate();
}

Ak chcete do WriteableBitmap vložiť obrázok využijete procedúru

//vlozi obrazok do bitmapy bitmap

public void PixelovyObrazok(WriteableBitmap image, int x, int y)
{
//rozmery vkladaneho obrazka
int nSirka = image.PixelWidth;
 int nVyska = image.PixelHeight;
 IBuffer ib = image.PixelBuffer;
byte[] pixely_obr = ib.ToArray();
int nZdrojIndex = 0; //index v cielovej bitmape
//po jednotlivych riadkoch vlozim binarnu reprezentaciu vkladaneho obrazka
for (int yy = y; yy < (y + nVyska); yy++)
{
for (int xx = x; xx < (x + nSirka); xx++)
  {
int nCielIndex = 4 * (yy * img.PixelWidth + xx); //index v cielovej bitmape
pixely[nCielIndex + 0] = pixely_obr[nZdrojIndex]; nZdrojIndex++;
pixely[nCielIndex + 1] = pixely_obr[nZdrojIndex]; nZdrojIndex++;
pixely[nCielIndex + 2] = pixely_obr[nZdrojIndex]; nZdrojIndex++;
pixely[nCielIndex + 3] = pixely_obr[nZdrojIndex]; nZdrojIndex++;
}
}
UpdateBitmap();
}