pondělí 22. prosince 2014

Recenze - Android 2 - Průvodce programováním mobilních aplikací

V knize se často opakují stejné nebo podobné informace. Hlavně v částech kde je popisováno rozhraní crud operaci které maji stejné vstupní parametry (uri, where, orderby).
Taky je docela škoda, že výpisech zdrojových kódů nejsou zvýrazněna místa o terých se zrovna píše. Například si musíte projít celý výpis souboru AndroidManifest.xml aby jste se podívali jak vypadá jeden řádek konfigurace (android:configChanges="KeyboardHidden|orientation") o které se píše v předchozím odstavci.
Dale mě na teto knize hrozně štvou názvy jednotlivých kapitol. Co vám řekne název kapitoly "Přihrávka přes plot", "Šlechta a poddaní"?

Na straně 213 pak máme klasickou ukázku toho co se stane když překládáme názvy v kódu. Jedna část textu mluví o 'tenký' a zbytek o 'thin'.

16 kapitola - rozepsat životní cyklus aplikace na pouhé 3 stránky mi přijde hodné málo. Navíc s odkazem na prostudování online dokumentace hned na první stránce.

Celá knížka mi připadá jako reklama na firmu CommonsWare a její knihu "The Busy Coder's Guide to Android Development". Jestli tato kniha má sloužit jen jako výtah z knihy která má 3000 stránek, tak si myslím, že to šlo ještě zkrátit.

Za 600,- Kč a 50 hodin času by byl asi lepší tréning Pluralsight.com

Obsah knihy podle mě
1 [18"] - dodavatele obsahu, aktivity
2 [60"] - manifest
3 [13"] - aktivita tlačítko
4 [17"] - xml designer R.Layout.main
5 [25"] - TextView - popisek (Label), EditText - vstupní pole
6 [50"] - kontejnery - <LinearLayout >
7 [37"] - Widgety
8 [60"] - Adaptery
9 [60"] - Date a Time picker, dialog, zaĺožky
10 [15"] - IME = virtuální klávesnice
11 [25"] - XML definice menu a dub menu, kontextové menu
12 [9"] - fonty
13 [18"] - obálka nad HTML WebKit widget
14 [2"] - Toast - pop up zprávy
15 [51"] - vlákna
16 [21"] - Životní cyklus aktivity
17 [23"] - filtry záměrů -BroadcastReceiver
18 [23"] - spouštění aktivit a podaktivit
19 [36"] - Rotace android>screenOrientation = "{portrait, landscape, sensor}"
20 [39"] - Práce s prostředky - Texty (res/values-cs/strings.xml), obrázy (ImageView)
21 [19"] - Práce s nastavením a jeho ukládání
22 [30"] -SQLite databáze. Create, Insert Update, Delete
23 [10"] -Soubory, InputStrem, OutputStream
24 [18"] - Knihovny JAR
25 [16"] - HttpClient, Json
26 [21"] - URI
27 [40"]- str.271 metoda insert je napsána na pěst. Proč vytváří novou instanci ContentValues?
28 [19"] - Top-Sekrit že by preklep v překladu?
29 [28"] - Vytvoření služby
30 [8"] - Vyvolání služby
31 [10"] - Upozornění
32 [18"] - Určení polohy
33 [20"] - Mapy
34 [6"] - Telefonování
35 [20"] - Vývojové nástroje
36 [66"] - Různé velikosti obrázků
37 [14"] -
38 [13"] -
39 [3"] -

Celkový čas čtení knihy
50 hodin (čtu pomalu no)

Zdroj:

http://knihy.cpress.cz/android-2.html

úterý 16. prosince 2014

Upgrade Notebooku HP ProBook 6450b za 8.000,- Kč

Transcend 128GB SSD - 1.965,- Kč
Windows 8.1 - 2.777,- Kč
Eset Smart Security 8 - 3.174,- Kč (na 3 roky)
Visual Studio 2013 Comunity
Microsoft SQL Express 2014

A na to všechno je 35GB málo proto si založte systémový disk alespoň 50GB jinak budete muset velikosti oddílů šoupat pomocí tohoto návodu.
http://www.tweakhound.com/2013/01/02/how-to-resize-your-windows-8-partition/

Zabralo mi to asi 4 hodiny než se mi povedlo spustit projekt ve VisualStudiu a pokračovat v práci.

pondělí 15. prosince 2014

ASP.NET MVC - postup práce a časový odhad

Odhad pracnosti
Co myslíte? Jak dlouho Vám bude tohle všechno trvat ?

Nová entita v DAL
V databátové vrstvě založte novou Entitu pro požadovaný záznam

Repository pro entitu
Vytvořte CRUD repository které bude Vytvářet, Číst, Editovat a mazat.

Vytvořit Controller pro entitu
Vytvořte Controller který bude umožňovat práci s entitami. Zobrazí jejich seznam, Umožní vytvoření nové a editaci stávajících. Případně mazání a zobrazení záznamu pouze pro čtení.

Překlad Controller
Controller většinou neobsahuje moc textu. V assembly s překlady vytvoříme texty pro hlášky o stavu operace. Ty jsou ale většinou stejné pro více controllerů, tak je stačí vytvořit pouze jednou.

Vytvorit ViewModely pro UI - List, Edit
Vytvořte ViewModely pro seznam a editační formulář. ViewModel pro editační formulář může být stejný s formulářem pro vytvoření nového záznamu. Ale v seznamu budeme většinou zobrazovat méně podrobné informace.

Překlad ViewModelů
V assembly s překlady vytvoříme texty pro anotace ViewModelů pro seznam a Formulář.

Vytvořit pohledy UI - List, Edit, Create - Scafolding
Pomocí Scaffoldingu necháme vygenerovat views pro Index, Create, Update, Detail a Delete

Překlad View
Nakonec je potřeba vytvořit překlady pro nadpisy jednotlivých stránek (Index, Edit, Create, Detail, Delete)

Vytvořit Mapování Mapper
Do konfiguračního souboru AutoMapperu přidáme předpis pro mapování z Entity na ViewModel.

Notifikace o stavu operace
Controller musí informovat o stavu operace. Po uložení záznamu oznámí uživateli že byl záznam uložen. Pokud došlo k chybě, tak oznámí že data nejsou uložena a vypovídající informaci o důvodu chyby.

Validace vstupů
Před uložením dat se provede validace na straně kliena i na straně serveru. Pokud data nejsou platná, zobrazí se hlášení proč nění možné data uložit

Přidat navigaci do Menu
Doplnit do menu odkaz na nově vytvořený seznam záznamů. Doplnit logiku pro zobrazení tohoto seznamu. Např. pokud je uživatel v roly Administrátor.

Testy
UnitTesty Controllerů jestli vrací požadovaná data. Mockování repository.
Testování View pomocí Selenia

Tipy Triky
Překládejte aplikaci průbježně. Není pro programátora nic hroznějšího než 4hodiny v kuse kopírovat texty do Excelu a nahrazovat je za odkaz do Resource

pátek 28. listopadu 2014

Chrome Extension Quick Start Guide

Poplatek za developera 
5$ ~ 122,-Kč

Jednoduchý Chrome Extension se dá naprogramovat během 3 hodin.
Pokud by nákaldy na vývoj byly 1.000,- Pak při prodeji licence za 10 Kč by stačilo 100 prodaných kusů, aby se vrátily náklady.

Většinou se Extensions nabízejí zdarma jako podpora prodeje hlavního produktu.

Publish
Publikování vaší položky v Internetovém obchodě Chrome může trvat až 60 minut. V praxi se tam ale během 20-ti minut objeví.

Soubory je potřeba zabalit do ZIPu a nahrát přes panel vývojáře.
Častá chyba: pokud zabalíte do zipu *.CRX soubor tak Vám bude panel vývojáře hlásit, že nemůže najít manifest. Pokud přidáte do ZIPu i manifest tak Vám bude hlásit při instalaci, že nemůže najít javascripty atd.

Jak dlouho to trvá?
Za cca 4 hodiny se dá udělat prototyp, který bude dělat zhruba to co jste zamýšleli. Pokud to není mega složitá fíčurka

Panel vývojáře
https://chrome.google.com/webstore/developer/dashboard?hl=cs

Ikona

  • 128x128px

Snímek obrazovky:

  • 1280x800 nebo 640x400px

Video na Youtube
Propagační dlaždice: 

  • 440x280px 
  • 920x680px
  • 1400x560px

Jak na více jazyků ?
https://developer.chrome.com/webstore/i18n?hl=cs

InstallPage
http://stackoverflow.com/questions/5745822/open-a-help-page-after-chrome-extension-is-installed-first-time

Quikstart 
https://developer.chrome.com/extensions/getstarted

Samples 
https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples
https://developer.chrome.com/extensions/samples

Tutorial
http://markashleybell.com/building-a-simple-google-chrome-extension.html

Context menu
http://tomoprogramming.blogspot.cz/2013/08/simple-tutorial-for-chrome-extension.html

https://developer.chrome.com/extensions/contextMenus

AddButton on Page
http://stackoverflow.com/questions/14068879/modify-html-of-loaded-pages-using-chrome-extensions

Match
https://developer.chrome.com/extensions/match_patterns

jQuery
Je důležité dodržet pořadí. Pokud pořadí scriptů prohodíte, nebude mít Váš script při jeho spuštění ještě dostupnou knihovnu jQuery.

"content_scripts": [

    {

      "matches": ["<all_urls>"],

       "js": ["jquery-2.1.1.js", "myscript.js"]

    }



],

http://carl-topham.com/theblog/post/creating-chrome-extension-uses-jquery-manipulate-dom-page/

Manifest Icons
https://developer.chrome.com/extensions/manifest/icons

Background Page
https://developer.chrome.com/extensions/background_pages

Event Page
https://developer.chrome.com/extensions/event_pages

Ostatní
http://stackoverflow.com/questions/5797661/replace-text-in-website-with-chrome-content-script-extension

https://developer.chrome.com/extensions/content_scripts

středa 26. listopadu 2014

Zachycení kláves CTRL + S ve webové stránce

<!doctype html>
<head>
<title>CTRL + S</title>
<script src="./jquery-2.1.1.js"></script>
</head>
<body>
<script>
$(window).keypress(function(event) {
    if (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) return true;
    alert("Ctrl-S pressed");
    event.preventDefault();
    return false;
}); </script> </body> </html>

Zdroj: 
http://stackoverflow.com/questions/93695/best-cross-browser-method-to-capture-ctrls-with-jquery

středa 5. listopadu 2014

nUnit - DataDriven Test

  1. Do testovací metody doplníme parametry.
  2. Metodu odekorujeme namísto atributu Test atributem TestCase který obsahuje parametry pro jedem testovací scénář.
  3. V metodě použijeme jednotlivé parametry jako vstupní parametry testu nebo jako očekávané výsledky testu.

[TestCase(123, "FVBAN", "BP14", "17Ř00U", Payment.PaymentMethodType.bank, "BAN")]
        [TestCase(-123, "BANFP", "BV14", "17Ř00P", Payment.PaymentMethodType.bank, "BAN")]
        [TestCase(123, "FVBAN", "PP", "17Ř00U", Payment.PaymentMethodType.payU, "PAYU")]
        [TestCase(-123, "POPLBAN", "PV", "17Ř00P", Payment.PaymentMethodType.payU, "PAYU")]
        public void Map_Payment_To_BankDokl(
            int amount,
            string predkont, 
            string rada, 
            string cleneni, 
            Payment.PaymentMethodType method, 
            string methodCode)
        {
            // Arange           
            var date = DateTime.Parse("2014-04-11");

            var payment = new Payment()
            {
                Amount = amount,
                ConstantSymbol = "12345",
                CounterpartAccountBank = "0100",
                CounterpartAccountNumber = "1212121212",
                Date = date,
                Description = "Karel nese čaj",
                PaymentMethod = method,
                SpecificSymbol = "123456999",
                VariableSymbol = "999999",
            };

            var bankDokl = new BankDokl();

            // Act
            AutoMapper.Mapper.Map(payment, bankDokl);

            // Assert
            Assert.AreEqual(Math.Abs(payment.Amount), bankDokl.Amount);
            Assert.AreEqual(payment.ConstantSymbol, bankDokl.ConstantSymbol);
            Assert.AreEqual(payment.CounterpartAccountNumber, bankDokl.Ucet.Ucet);
            Assert.AreEqual(payment.CounterpartAccountBank, bankDokl.Ucet.BKod);

            Assert.AreEqual(payment.Date, bankDokl.DatPlat);
            Assert.AreEqual(payment.Description, bankDokl.Note);
            Assert.AreEqual(methodCode, bankDokl.Ucet.Zkrat);
            Assert.AreEqual(payment.SpecificSymbol, bankDokl.SpecificSymbol);
            Assert.AreEqual(payment.VariableSymbol, bankDokl.VariableSymbol);

            Assert.AreEqual(rada, bankDokl.DRada);
            Assert.AreEqual(cleneni, bankDokl.Cleneni);
            Assert.AreEqual(predkont, bankDokl.PrKont);
        }

Zdroj:
http://www.nunit.org/index.php?p=testCase&r=2.5