Neděle, leden 30, 2011

Kniha Steve Krug: Nenuťte uživatele přemýšlet


Kniha Nenuťte uživatele přemýšlet od Steve Kruga v druhém vydání pro mě byla příjemným překvapením. Přečetl jsem si o ní na www.root.cz na základě tamějšího kladného hodnocení jsem si jí objednal. Jde o útlou knížečku rozsahu 164 stran. Po dlouhé době jsem měl v ruce počítačovou knihu, která byla vytištěna celá barevně.

Kniha se zabývá vytvářením takzvaného použitelného webu. Vůbec to není o programování. V knize jde pouze jak a kde informace na webových stránkách zveřejnit. Jak udělat hlavní stránku, jak udělat na webu navigaci a menu, jak web testovat. Nejde o žádné teoretické poučky. Pravidla jsou vysvětlena na mnoha příkladech. Každý, kdo navrhuje webové stránky, by si knihu měl přečíst. Už jenom kapitola o uživatelském testování, aneb jak ho udělat levně a jednoduše, je skvělá. Knihu mohu na 100 procent doporučit.

CPRESS; 164 stran; doporučená cena 299,- Kč

Pátek, leden 21, 2011

Výběr CMS/redakčního systému Weebly, Webnode, Jimdo, Drupal, Joomla a nakonec Contao

Pro firmu jsem vybíral redakční systém. Náš web je velmi jednoduchý a zatím stačily statické html stránky. Tento způsobe je sice na první pro správu pohled jednoduchý, ale stránky může editovat pouze ten kdo umít html a je schopen opravenou stránku včetně obrázků přenést pomocí FTP na server. Rozhodl jsem se nasadit CMS/redakční systém.

Nejprve jsem myslel na to použít online CMS/redakční systém. Vybral jsem tato možná řešení:

Weebly:  asi nejlepší a kupodivu nejlevnější. Diskový prostor neomezen a platí se pouze 49$ za rok. Do tohoto prostoru lze uložit až 10 domén. Vše funguje výborně. Bohužel jsou zde problémy s češtinou. Aplikace nepodporuje utf-8 a české znaky se ukládají jako &xxx entity. To by mohl být problém. Odezva sice více jak 100 ms, ale přesto velmi pěkné. Zvolil bych a nic dalšího nehledal, kdyby fungovalo utf-8 a čeština.

Webnode: český produkt, který je úspěšný po celém světě. Velmi bohaté a rozmanité prostředí. Zdejší programátoři Javascript opravu umí. Odezva okolo 10 ms, fantastické. Bohužel cena je z nabízených možností nejvyšší, 2998,- Kč za rok. V ceně je 1 GB a prostor pro jednu doménu. Našel jsem několik negativních zkušeností, ohledně spolehlivosti a technické podpory. Také nemám rád firmy, které se snaží skrýt ceník svých služeb.

Jimdo: z online variant můj favorit. Jde o německou službu a tedy technická dostupnost (21 ms) a nasazení utf-8 jsou pro mne velkým lákadlem. Cena průměrná, tedy 60€ za rok. V ceně 5 GB a prostor pro jednu doménu.

Nakonec jsem se rozhodl pro nasazení Open Source řešení na pronajatém prostoru. Nabízí to větší variabilitu a možnosti a je to i levnější. Je s tím sice více práce, ale protože mě to baví, rád do toho investuji vlastní čas.

Nyní bylo důležité vybrat ten správný redakční systém. Žádné zvláštní požadavky jsem na něj neměl. Nejvíce cenami ověnčené jsou Drupal a Joomla. Více se mi líbí Drupal i když je s ním zpočátku asi více práce.   Našel někoho, kdo mi s jeho konfigurací pomůže. Joomla také není špatná, ale filozofie Drupalu je mi trochu bližší. Mám raději minimalistické produkty, do kterých se postupně předává další potřebná funkčnost.
Potřebuji ale na jednu stránku umístit text a pod to obrázkovou galerii a pod to třeba ještě text. Jsem  překvapen, ale pro Drupal a Joomla to není nic standardního a jednoduchého. Nakonec jsem si o Drupalu přečetl jednu knihu a dospěl k závěru, že Drupal a Joomla jsou výborné redakční systémy, ale spíše pro noviny než pro firmu. U těchto produktů se očekává neustálý přísun článků, které se postupně zobrazují a mizí do archivu. Nevím jak v jiných firmách, ale u nás na psaní článků čas nemáme a potřebujeme spíše pár statických stránek, které se občas mění nebo rozšíří. Pro tohle redakční systémy  jako Drupal a Joomla nejsou navrženy a je nutné je přihnout

Těsně před tím, než jsem zadal specialistovi na Drupal práci, jsem narazil na CMS Contao. Dříve známe pod názvem TYPOlight. To je přesně co potřebuji. Bez problémů s češtinou. Možné desítky objektů na jedné stránce a snadno pochopitelné ovládání. K dispozici jsou stovky rozšíření. Sice zde není taká paleta grafických vzhledů zadarmo jako u Drupalu nebo Joomla, ale přesto se mi to jeví skvělé. Během několika desítek minut jsem lokálně produkt nainstaloval, nakonfiguroval a spustil. Ovládání snadné, publikování ještě jednodušší. Až nabudu další zkušnosti a budu mít zase trochu času, napíši o Contao samostatný článek.

Úterý, říjen 19, 2010

Python nebo Java pro Google App Engine

Vybírám technologii pro novou web aplikaci. Vývojáři se zadají podle vybrané technologie. Pak mohu ignorovat většinou nejdůležitější kritérium – znalosti vlastního týmu. Umístění webové aplikace do cloudu považuji za velmi výhodné. Mám poroto tyto důvody:
·       Nemusíme se starat u údržbu a upgrade hardware.
·       Nemusíme se starat o údržbu a upgrade operačního systému dalšího potřebného software.
·       Nemusíme řešit jak moc bude aplikace vytížená. Poskytovatel cloudu nám zajistí, že v případě vysoké zátěže, bude automaticky přidán další hardware a v případě nezájmu uživatelů nebudeme za zbytečný hardware platit. Platíme pouze zato, co spotřebujeme.
·       Nemusíme řešit datovou konektivitu. Pokud je webová aplikace mezinárodní, není to snadný úkol. Internet sice propojuje kontinenty, ale odezvy některých vzdálených serverů mohou být dost pomalé. To může uživatele odrazovat. Poskytovatelé cloudů mají tento problém obvykle dobře vyřešen.
Tedy zůstali mi tyto technologie:
·       Microsoft Azure a ASP.NET MVC.
·       Google App Engine (GAE) a Java nebo Python.
Microsoft jsem vyřadil. MVC architektura je u ASP.NET už na dobré úrovni a C# je podle mého názoru špičkový jazyk. Bohužel Microsoft je dodavatelem nejen výborného vývojového prostředí, ale také operačních systémů. Štve mě to, že nejnovější technologie fungují u Microsoftu pouze na jeho nejnovějších operačních systémech. Například vývojové prostředí Visual Studio v poslední verzi již na Windows XP nespustíte. Chápu proč to Microsoft dělá, ale Open Source nástroje těmito problémy netrpí.
Nyní mi tedy zůstaly pouze dvě technologie. Python a jeho špičkový web framework Django a Java. U Javy to s frameworky není snadné. Jenom Open Source jich je podle serveru http://java-source.net/open-source/web-frameworks 64! Já jsem si nechal poradit podle několik zdrojů a vybral Stripes. O tom ale až dále.

Rychlost provádění kódu

Rychlost je důležitá u cloudů ze dvou důvodů. V první řadě, aby program běžel rychle a mohl zvládnout nějaké případné matematické úlohy. To je zřejmé. Druhý důvod je, že se platí za spotřebovaný čas CPU. Čím program běží rychleji, tím levnější to je.
Musím ale přiznat, že rychlost provádění kódu není hlavním kritériem. Ve srovnání s ostatními náklady nejsou platby za čas CPU nijak vysoké. Navíc webová aplikace v naprosté většině neprovádí nijak složité výpočty. Pokud jsou u webové aplikace problémy s rychlostí, je pro to několik důvodů, ale programovací jazyk mezi nimi není.
Přesto jsme provedl základní testy. Použil jsem test ze stránky http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/ Přizpůsobil jsem ho Google App Engine a spustil lokálně i na Google serverech. Vlastní naměřené hodnoty  nejsou důležité. U vzdálených jsem byl dobrým výkonem Javy příjemně překvapen.
Co se týká rychlosti, tak Java byla 31x rychlejší. Google App Engine též umožňuje v programu sledovat kolik procesorového času vylo aplikací spotřebováno. V tomto kritériu byla Java 60x úspornější. Tedy Java je z hlediska nákladů na spotřebu CPU 60x úspornější.
Z tohoto hlediska je Java jednoznačným vítězem.

 Webový framework

Jak jsem již psal výše, zde není snadné porovnání. U Pythonu to je jednoduché. Existují dva hlavní. Django a Turbogears.
U Javy je situace mnohem složitější. Za prvé má kombinace Java a Google App Engine problém se startem aplikace. Pokud třeba použijete framework Spring MVC a pro ukládání objektů do databáze JDO, je problém se startem aplikace. Pokud u GAE aplikace několik minut neběží, cloud ji odloží na disk. Při prvním požadavku se musí nahrát do paměti. U Java virtuálního stroje se nahrávají všechny knihovny. JDO i  Spring MVC jsou knihovny velké. Podle některých zpráv v konferenci může start aplikace trvat i několik desítek sekund. To mnoho návštěvníků webu odradí a přejdou jinam. Google podle některých informací pracuje na možnosti si připlatit za vlastní Java virtuální stroj. Lepším řešením je ale použít knihovny malé, které se nahrají okamžitě. Průzkumem jsem došel k tomu požít pro přístup k databázi interface Objectify-appengine a jako web framework nasadit Stripes.
Django je nepochybně dospělejší framework. Také má velké množství vývojářů a právě se dokončuje jeho verze a úpravy pro nasazení i nerelačních databází, jaká je například u GAE. Má ale i některé nevýhody. Je dost komplexní a původně bylo Django vytvořeno pro vydávání elektronických novin. To je zde i dnes znát. V polovině roku 2009 přešel velký známý server sourceforge.net z PHP na Python a zvolil místo Djanga Turbogears. Jedním z důvodů byl nízký výkon šablon Django. Django má ale skvělou administraci a lze se ho snadno naučit.
Podle mého názoru je lepší Python/Django, ale jen o kousek.

Programovací jazyk a produktivita programátora

Oba jazyky jsou objektové. Java má sice kvůli rychlosti i primitivní typy, přesto jde o vyspělé objektové jazyky. Hlavní rozdíl mezi nimi je v tom, že Java je staticky typovaný jazyk, kdežto Python dynamicky. Na výhody a nevýhody obou řešení existují dlouhé články. Osobně preferuji statické typování. Mám raději, když mě kompilátor upozorní na chybu i když za to zaplatím více naklapanými řádky. Refaktoring je další důvod proč osobně preferuji Javu.
Za hlavní nevýhodu Javy považuji její „ukecanost“ a někdy zbytečnou složitost. U Pythonu se mi moc nelíbí syntaxe. To je ovšem velmi subjektivní.
Co je asi nejdůležitější je efektivita programátora. Ta se velmi špatně měří. Je něco jiného program napsat a je úplně něco jiného ho dlouhodobě udržovat. V tom prvním vítězí Python a v tom druhém Java.  Čím větší je projekt, tím vhodnější je Java a naopak.
Pro oba jazyky existuje několik kvalitních vývojových prostředí. Zmíním například Eclipse. Samotné je naprogramováno v Javě a dá se v něm programovat jak Java, tak pomocí pydev pluginu i  Python.
Oblíbenost programovacího jazyku je důležitá. Ukazuje jak obtížně se pro projekt najde programátor a i jak obtížné je si jako programátor práci najít. Podle Tiobe indexu k dnešnímu dni má Java 17.9 procent (1. místo) a Python 4.5 procent (7. místo). Trend je ale ve prospěch Pythonu. Za polední rok Java poklesla o 1.5 procentního bodu. Python stoupl o 0.7 procentního bodu. Oba trendy jsou dlouhodobé.
Moje osobní preference upřednostňuje Javu, ale když se pokusím o osobní odstup, jsou pozice vyrovnané.

Úterý, listopad 18, 2008

Potíže s MS SQL Server Management Studiem

Jak jsem již psal, nainstaloval jsem novou Microsoft SQL databází verze 2008. Jde o zdarma šířenou verzi Express. Malá poznámka pro ty, kteří Management Studio nepoužívají: je to aplikace, která zajišťuje velkou část administrace Microsoft SQL serveru a interaktivní práci s jeho daty. Je poměrně náročná na hardware, ale celkem dobře se s ní pracuje.

MS SQL Management Studio mohu porovnávat například s aplikací SQLyog , která provádí podobné činnosti jako Management Studio, ale pro SQL databázi MySql. V tomto porovnání Microsoft prohrává. Je pomalejší, pomaleji startuje a SQLyog Community Edition je stejně zdarma jako MS SQL Management Studio. SQLyog má mnohem vícefunkcí a méně chyb.

Nejvíce mě na Management Studiu vadí tyto věci:

  • Nepodařilo se mi ho přesvědčit, aby přesunulo sloupce v tabulce tak jak potřebuji. Po této operaci, kterou Designer tabulky viditelně umí, dojde při uložení změn v tabulce k chybě, která se hlásí jako "Název změněné tabulky" . Ano, nepletu se. Tak se chyba opravdu hlásí. Chybu jsem vyřešil tak, že tuto operaci provádím pomocí Visual Studia, které toto zvládá bez problémů.
  • Velmi často při uložení změn v tabulce dojde k chybě ukládání. Netuším o jakou chybu jde, protože se hlásí stejně jako chyba předchozí. Možná jde dokonce o stejnou chybu? V každém případě to dost obtěžuje. Chybu opět řeším změnami tabulek v databázi přes Visual Studio. Ještě, že ho máme...
  • Strukturu databáze a data určená pro vývoj ukládám na Subversion server Assembla.com. Slouží mi o pro správu verzí struktury a dat SQL serveru. Na Subversion je ovšem lepší ukládat textové soubory a to rozhodně záloha MS SQL serverů není. Textový soubor si tedy vyrábím v Management Studiu pomocí Generate Scripts. Jsem rád, že to Microsoft umí. Bohužel průvodce neumím zkrátit a nastavené volby si nepamatuje. Je to velmi zdlouhavé, zdržující a protivé. řešení neznám.
  • Potřebuji se často podívat, jaký vlastně přesně příkaz nebo dotaz včetně hodnot SQL server zpracovává. To bych považoval za běžný požadavek, který už umělo bez problémů i FoxPro. SQL 2008 toto nezvládá. Není to sice snad ani tolik chyba Management studia, ale někde si postěžovat musím. Placené verze MS SQL serveru obsahují v Management Studiu profiler, který mimo jiné zvládá i zobrazování příkazů, které SQL server zpracovává. Je to mocný a jasný nástroj. Plně chápu, že v Express verzi, která je k dispozici zdarma, tato schopnost nemusí být obsažena. Na druhé straně by mohla být nahrazena například prostým logováním provedených příkazů do souboru. Bez toho je to špatné. Samozřejmě existují na toto nějaké náhradní berličky. Jedna z nich, která se jeví velmi dobře, je Open Source program SQL Server 2005 Express Profiler. Ten ovšem, jak je zřejmé již podle názvu, pracuje pouze pod verzí 2005 SQL serveru. Pod SQL 2008 se mi ho bohužel nepodařilo rozchodit. Samozřejmě je možné použít například log LINQ to SQL. Tento způsob ovšem není moc obratný a navíc není schopen ukázat všechny příkazy. Dobré řešení jsem zatím nenašel.
Nemohu samozřejmě vyloučit, že všechny výše uvedené nedostatky jsou zaviněny pouze mojí neznalostí. Nejsem na MS SQL žádný guru. Přesto jsem z SQL 2008 Express dost rozladěn.

Velmi zajímavá a užitečná reakce na tento článek od Jardy Jiravy.

Úterý, listopad 04, 2008

Hlasování: co by jste vybral(a) pro vývoj web aplikace?

Nechal jsem na tomto weblogu probíhat hlasování o otázce "Co by jste vybral(a) pro vývoj web aplikace?". K dispozici bylo tyto možnosti:
  • ASP.NET
  • Java (servlety, JSP, JSF,...)
  • PHP
  • Python (Django, TG,...)
  • Perl
  • RoR
  • Něco jiného

Přesné výsledky jsou k dispozici na obrázku. Hlasování se zúčastnilo celkem 143 lidí. Na jedné straně se to zdá dost málo. Na druhé je to zajímavý výsledek v tom, že se ho zúčastnili lidé, kteří čtou tento odborný weblog a tedy mají o problematice dobré znalosti. S přehledem zvítězila možnost ASP.NET s 37 procenty hlasů. Na druhém místě je PHP (26 procent) a Java (25 procent). Naopak o poslední místo se dělí Perl a RoR.

Vítězství ASP.NET i nad PHP je myslím důkazem toho, že Microsoft technologie .NET a především ASP.NET je opravdu kvalitní a Microsoftu se povedlo vytvořit velmi kvalitní technologii. Bohužel to tak neplatí vždy, například MS SQL 2008 je krásným příkladem nedotaženého produktu.

Zúčastněte se prosím aktuálního hlasování. Jde o podobně odbornou otázku a výsledky tohoto hlasování budou určitě stejně zajímavé.

Úterý, říjen 21, 2008

Test rychlosti SQL procedur: MySql a MS SQL 2008

Na základě připomínky k mému článku Rychlejší je zápis do souboru nebo do databáze? jsem se rozhodl otestovat z manuálů známé tvrzení, že je rychlejší používat vložené SQL procedury proti přímému volání SQL příkazů. Vytvořil jsem tabulky a plnil ji 100000 záznamy. Nejprve byla tabulka bez indexů a pak s indexy. Tabulku jsme plnil nejdříve klasickým SQL INSERT příkazem, potom pomocí SQL procedury.

Použil jsem tabulku:
CREATE TABLE `tableinsert2` (
 `cislo` int(11) NOT NULL,
 `datum` datetime NOT NULL,
 `retezec` varchar(255) NOT NULL
)  
Pro přístup k MySql 5.1 byl použit .NET connector od MySql verze 5.2.3. Databáze MySql je verze 5.1.25. MS SQL 2008 Express je verze 10.0.1600.22. Protože jsem testoval jak MySql, tak MS SQL, je tedy opět možné porovnat rychlost těchtodvou databází.

MySql procedura

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`insert2tableinsert2`$$
CREATE DEFINER=``@`` PROCEDURE `insert2tableinsert2`(IN pcislo INT, IN pdatum DATETIME, IN pretezec VARCHAR(255))
BEGIN
 insert into TableInsert2 (cislo,datum,retezec) values (pcislo,pdatum,pretezec);
END$$
DELIMITER ;

MS SQL procedura

ALTER PROCEDURE [dbo].[insert2tableinsert2]
 @pCislo int,
 @pDatum datetime,
 @pRetezec nvarchar(255)
AS
BEGIN
 SET NOCOUNT ON;
 insert into dbo.TableInsert2 (cislo,datum,retezec) values (@pCislo, @pDatum,@pRetezec);
END

Vlastní testovací kód

public class TestRychlostiSqlProcedur {
public void RychlostSqlProcedur() {
const uint POCET_ZAZNAMU = 100000;
zaznam z;
DateTime cas;
System.TimeSpan sts;

// ulozeni do databaze MySql
/*
MySqlConnection mc = new MySqlConnection("Database=test;Data Source=localhost");

MySqlCommand commInsert = new MySqlCommand();
commInsert.Connection = mc;
mc.Open();

// vymazani obsahu tabulky z predchozich testu
commInsert.CommandText = "TRUNCATE TABLE tableinsert2";
commInsert.ExecuteNonQuery();

// Ulozeni do databaze primo
cas = System.DateTime.Now;

for (uint k = 0; k < POCET_ZAZNAMU; k++) {
 z = novyZaznam(k);
 commInsert.CommandText = "INSERT INTO tableinsert2 (cislo,datum, retezec) Values ("
  + z.cislo + ",'"
  + OtherMetod.DateTime2IsoDateTime(z.datum) + "','"
  + z.retezec + "')";
 commInsert.ExecuteNonQuery();
}
sts = DateTime.Now - cas;
Console.WriteLine(cas + " --> " + DateTime.Now);
Console.WriteLine("Ukladani do databaze MySql primo (ms): " + sts.TotalMilliseconds);

// vymazani obsahu tabulky z predchozich testu
commInsert.CommandText = "TRUNCATE TABLE tableinsert2";
commInsert.ExecuteNonQuery();

cas = System.DateTime.Now;

// Priprava procedury
commInsert.CommandText = "insert2tableinsert2";
commInsert.CommandType = System.Data.CommandType.StoredProcedure;

for (uint k = 0; k < POCET_ZAZNAMU; k++) {
 z = novyZaznam(k);
 commInsert.Parameters.Clear();
 commInsert.Parameters.AddWithValue("@pcislo",z.cislo);
 commInsert.Parameters.AddWithValue("@pdatum", OtherMetod.DateTime2IsoDateTime(z.datum));
 commInsert.Parameters.AddWithValue("@pretezec", z.retezec);
 commInsert.ExecuteNonQuery();
}

sts = DateTime.Now - cas;
Console.WriteLine(cas + " --> " + DateTime.Now);
Console.WriteLine("Ukladani do databaze MySql pres proceduru (ms): " + sts.TotalMilliseconds);

mc.Close(); // uzavreni databaze
*/


// ulozeni do databaze MS SQL pres INSERT -----------------------------------------------------------------------
SqlConnection conn = new SqlConnection("server=CORE2-DUO-18\\SQLEXPRESS2008;database=test;trusted_connection=yes");
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
// vymazani obsahu tabulky z predchozich testu
sqlCom.CommandText = "DELETE FROM tableinsert2";
sqlCom.ExecuteNonQuery();

cas = System.DateTime.Now;
for (uint k = 0; k < POCET_ZAZNAMU; k++) {
 z = novyZaznam(k);
 sqlCom.CommandText = "INSERT INTO tableinsert2 (cislo,datum, retezec) Values ("
  + z.cislo + ",'"
  + OtherMetod.DateTime2IsoDateTime(z.datum) + "','"
  + z.retezec + "')";
 sqlCom.ExecuteNonQuery();
}
sts = DateTime.Now - cas;
Console.WriteLine(cas + " --> " + DateTime.Now);
Console.WriteLine("Ukladani do databaze MS SQL pres INSERT (ms): " + sts.TotalMilliseconds);

// ulozeni do databaze MS SQL pres proceduru -----------------------------------------------------------------

// vymazani obsahu tabulky z predchozich testu
sqlCom.CommandText = "DELETE FROM tableinsert2";
sqlCom.ExecuteNonQuery();

cas = System.DateTime.Now;
// Priprava procedury
sqlCom.CommandText = "insert2tableinsert2";
sqlCom.CommandType = System.Data.CommandType.StoredProcedure;

for (uint k = 0; k < POCET_ZAZNAMU; k++) {
 z = novyZaznam(k);
 sqlCom.Parameters.Clear();
 sqlCom.Parameters.AddWithValue("@pCislo", (int) z.cislo);
 sqlCom.Parameters.AddWithValue("@pdatum", OtherMetod.DateTime2IsoDateTime(z.datum));
 sqlCom.Parameters.AddWithValue("@pretezec", z.retezec);
 sqlCom.ExecuteNonQuery();
}

sts = DateTime.Now - cas;
Console.WriteLine(cas + " --> " + DateTime.Now);
Console.WriteLine("Ukladani do databaze MS SQL pres proceduru (ms): " + sts.TotalMilliseconds);

conn.Close();

}

struct zaznam {
 public DateTime datum;
 public uint cislo;
 public string retezec;
}

private zaznam novyZaznam(uint cislo) {
 zaznam nzaznam = new zaznam();
 nzaznam.datum = DateTime.Now.AddHours(cislo);
 nzaznam.cislo = cislo;
 nzaznam.retezec = nzaznam.datum.ToString() + "|" + cislo + "|" + nzaznam.datum.ToString();

return nzaznam;
}
}

Výsledky

Databáze Operace Čas (ms) Koeficient
Indexy 3) Mysql text 1) INSERT 26 594 1,00
procedura 31 141 1,17
MySql parameters 2) INSERT 27 109 1,02
procedura 37 503 1,41
MS SQL 2008 INSERT 55 447 2,08
procedura 38 091 1,43
Bez indexů Mysql text 1) INSERT 22 360 1,00
procedura 25 169 1,13
MySql parameters 2) INSERT 23 359 1,04
procedura 31 816 1,42
MS SQL 2008 INSERT 49 347 2,21
procedura 36 616 1,64

1) parametry jsou proceduře předány vytvořením textového příkazu. např. commandtext="call nazevprocedury(10,'jedna'");. 2) parametry jsou proceduře předány pomocí volání metody Parameters.AddWithValue (doporučovaný přístup) 3) Indexy jsou vytvořeny nad každým sloupcem. Tedy celkem tři indexy nad tabulkou.

Výsledky jsou zajímavé. Je zde několik závěrů na které stojí za to upozornit:
  • MS SQL 2008 je pomalejší než MySql. V některých případech je čas více jak dvojnásobný proti MySql.
  • U MySql je rychlejší použít přímo příkaz INSERT než SQL proceduru. Naopak u MS SQL 2008 je rychlejší použít SQL proceduru. Domnívám se, že chování MS SQL je logičtější a MySql musí procedury ještě vylepšit.
  • U MySql je k mému překvapení rychlejší proceduru volat pomocí textového volání než používat doporučovaný způsob volání Parameters.AddWithValue. Platí samozřejmě pro testovanou verzi. V příštích verzích databáze se toto může a mělo by upravit.
  • Rozdíl mezi tabulkou s indexy a tabulkou bez indexů je mnohem menší, než jsem předpokládal.
  • U MySql jsem použil tabulky typu MyISAM. Podle mého minulého testu jsou totiž tabulky InnoDb při vkládání záznamů neuvěřitelně pomalé. Proto jsem je v tomto případě vůbec netestoval.

Moje interpretace výsledků je taková, že MySql je rychlejší a není moc podstatné, zda použijete u obou databází uložené procedury nebo budete SQL příkazy zadávat přímo. Sice existují určité rozdíly mezi těmito dvěmi způsoby, ale nejsou podstatné. Je nutné vzít v úvahu, že šlo o test, kde se zadávalo 100000 záznamů. Tímto testech nechci nijak naznačovat, že SQL procedury není vhodné používat. Jenom argumentace, že jsou jednoznačně rychlejší není správná. Rychlejší jsou podle tohoto testu u MS SQL 2008. Navíc rozdíl v rychlosti není nijak závratný. U plně indexované tabulky 0,69x a u neidexované tabulky 0,74x. V průměru tedy jsou u aktuální MS SQL databáze SQL procedury rychlejší 0,72x.

Úterý, říjen 14, 2008

Děkuji virům a podobné havěti

Chtěl bych tady veřejně poděkovat všem virům, trojanům, malware, botnety, spyware, rootkitům a další příbuzné podobné havěti. Vím, že je to jako bych děkoval chřipce nebo dokonce rakovině. Ale proti nemocem je počítačová havěť také něčím užitečná. Čím? Provádí přirozený výběr a významně vylepšuje jednotlivé programy a celý koncept informačních technologií. Bez počítačové havěti bychom na tom byli mnohem hůře.

Za prvé by operační systém MS Windows všech typů a generací byl mnohem děravější a křehčí než je dnes. Útočníci a zloději dat by měli mnohem snazší cestu a existovalo by mnohem méně integrovaných ochran a nástrojů než dnes.

Za druhé a především by se asi dále rozvíjela koncepce velmi výkonných osobních počítačů na které je nutné instalovat další a další programy a jejich aktualizace. Dnes zřejmě pomalu tato éra končí, pokud nedojde k nějaké významné změně. Viníkem jsou kriminální živly, které produkují tolik počítačové havěti, že včasná obrana proti nim je nemožná. Není možné ochrany tak často a intenzivně aktualizovat a jejich práce tak zatěžuje počítače, že nakonec nebude možné na osobním počítači dělat nic jiného, než ho kontrolovat, zda není napaden. Samozřejmě trochu přeháním, ale jenom trochu. Podle společnosti Symantec existuje více škodlivého software než toho prospěšného.

Proti tomu lze nasadit jedinou účinnou strategii: povolit běh na počítači pouze schváleným programům. Dnes ochranné programy kontrolují každý spouštěný program a hledají v něm znaky z databází známých škůdců. Strategie bude zřejmě muset být opačná. Kdo ovšem bude tou autoritou, která bude programy schvalovat? To si nedovedu představit ani technicky, ani organizačně a ani právně. Jediné co by mohlo fungovat a již funguje, je vrátit se zpět ke kořenům informačních technologií. Myslím tím koncept tenkého klienta na kterého se nic moc neinstaluje. Mám pár známých a příbuzných a pro ty všechny by stačil. Občas zpracují fotku, přečtou pár emailů, občas email napíší, vyhledají si něco na internetu, poslechnou hudbu a napíší fakturu. To je střelením od boku tak 95 procent dnešních uživatelů počítačů. Děti navíc hrají hry a klábosí přes kecálky. Mimo her by tenký klient na bázi internetového prohlížeče obsahujícího multimediální doplňky tohle všechno zvládl. Co se týká her, tak stejně se nás Sony, Microsoft a Nintendo snaží přesvědčit, že patří na konzole. Tak to asi také nemusí být problém. Velmi se mi líbí myšlenka osobního počítače, který má všechen software uložen v BIOSu včetně operačního systému (asi Linuxu) a aplikace si spouští na intermetu. Výrobce BIOSu nebo základní desky a umožní jednou za čas provést automatický upgrade a to je vše. Pouze se nakonfiguruje automaticky sít a spustí je prohlížeč. To není žádné sci-fi, to je současnost. Mě se to líbí a počítačová havěť na tom má svůj podíl. Tedy děkuji. I když to tak nakonec masově nedopadne, je to hezká naděje.