Středa duben 22, 2009

Rozdíly v implementaci SQL jazyka

· rubrika Clanky · kategorie

Ti zvás, kteří již měli možnost pracovat s více databázovými systémy (DBMS), zajisté o této problematice vědí své. I když je SQL standardizován (existuje 6 verzí SQL-89, SQL-92, SQL-99, SQL:2003, SQL:2006 a SQL:2008), tak většina DBMS implementuje jen některé části. Mnohdy je k tomu vedou požadavky uživatelů nebo trhu obecně. V dnešní době je navíc většina DBMS založena na standardu SQL-92 a implementace významnějších částí standardů SQL-99 a SQL-2003 je k nalezení pouze u některých produktů. Poslední standardy SQL:2006 a SQL:2008 jsou na tom s jejich podporou momentálně nejhůře.

Zhlediska rozdílů v implementaci SQL jazyka v databázích jsem narazil na zajímavou stránku, kde se srovnává MySQL, MSSQL, Oracle, PostgreSQL, DB2 a Informix. Věřím, že některým z vás tato stránka pomůže 

20:23 — Komentář Stálý odkaz



Nové ATI Catalyst 9.4

· rubrika Blog · kategorie

ATI
Opět tu máme novou verzi ovladačů pro grafické karty společnosti ATI. Výkonové porovnání se staršími verzemi je opět dostupné na serveru Svethardware.cz. Stahovat můžete zde.

13:48 — Komentář Stálý odkaz



Úterý duben 21, 2009

Optimalizace pro import velkého nmnožství dat do databáze

· rubrika Clanky · kategorie

Optimalizace se týkají vkládání (importu) většího počtu dat, které bude rychlejší a omezí se případné chyby, které by mohly nastat (typicky závislost mezi primárním a cizím klíčem). Obecně se jedná o následující kroky, které se provedou před vkládáním dat:

Po úspěšném vložení dat dojde ke znovu vytvoření primárních a cizích klíčů, aktivování nebo vytvoření indexů a triggerů a k upravení pracovní paměti na databázovém serveru, pokud byla předtím hodnota změněna.
Samozřejmě existují optimalizace pro konkrétní typy databází. Například v PostgreSQL příkaz VACUUM a v MySQL OPTIMIZE TABLE, které by se měly používat pokud v tabulce dochází k častým změnám řádků.

14:04 — Komentář Stálý odkaz



Neděle duben 19, 2009

Skutečný výkon ATI Radeon HD 4890

· rubrika Blog · kategorie

ATINa světě jsou už nějakou dobu výsledky výkonu ATI Radeonu HD 4890 a jak možná (ne)víte, výkonově je zhruba o 10–13% lepší než HD 4870. Pro mne je to trošku zklamání, protože jsem doufal, že nedojde pouze ke zvýšení taktů (sice došlo ke změnám aby bylo možné dosáhnout vyšších taktů, ale já prostě čekal něco víc) Na druhou stranu je třeba říci, že karty méně topí a mají o něco menší spotřebu a to je určitě plus. ATI tak dostála toho co se tu již nějakou tu dobu před vydáním šuškalo. Pokud vás zajímají testy, tak vám zde uvádím seznam na všechny testy, které se mne podařilo najít (když najdete další napište do komentářů a já ho sem přidám). Seznam jsem pro přehlednost rozdělil podle jazyků, v kterém jsou dané články napsány.

Testy v českém jazyce:

Testy v anglickém jazyce:

Testy v německém jazyce:

Testy v chorvatském jazyce:

09:29 — Komentář Stálý odkaz



Neděle duben 12, 2009

PowerShell

· rubrika Blog · kategorie

Tak jsem se dneska zjišťoval, jaké volitelné aktualizace jsou dostupné pro můj operační systém Windows Vista Bussines. Narazil jsem tam na zajímavou aktualizaci „Prostředí Windows PowerShell 1.0 pro systém Windows Vista (KB928439)“. Mrknul jsem se na internet a zjistil jsem, že Microsoft Windows PowerShell je nové prostředí příkazového řádku se skriptovacím jazykem, respektive náhrada za CMD Prostředí Windows PowerShell je založeno na rozhraní .NET Framework (bez jeho přítomnosti tedy nefunguje) a umožňuje řídit a automatizovat správu systému Windows a aplikací. Více informací je k nalezení zde.

10:21 — Komentář Stálý odkaz



Sobota duben 11, 2009

"Unbuffered" dotazy

· rubrika Clanky · kategorie

Možná víte, možná nevíte, ale pokud programujete v PHP a položíte nějaký dotaz na databázi, který vrací výsledky, pomocí klasických funkcí mysql_query, pg_query atd., tak PHP čeká na všechny data od databáze, ty si uloží v paměti a teprve následně pak s nima může programátor pracovat. Při malém množství vrácených záznamů nám toto vadit nebude, ale co když budeme například exportovat tabulku s milióny záznamů? Brzo by došla pamět procesu (ne paměť přidělená PHP skriptu).
Toto by se dalo vyřešit dvěma způsoby:

  1. – Prvním dotazem si zjistit kolik nám bude vráceno záznamů a pak v cyklu číst vždy pouhých xxx záznamů, ty následně zpracovat (samozřejmě také uvolnit použité zdroje ) a pak dalším dotazem si říct o další, dokud je nepřečteme všechny.
  2. – Použít tzv. „unbuffered“ dotazy, kdy se žádná data nikde neukládají, pomocí funkcí mysql_unbuffe­red_query, …

Druhý zmiňovaný způsob lze ovšem použít pouze pro databáze MySQL, SQLite a Sybase a má několik nevýhod:

A co se děje když položíme dotaz na MySQL pomocí funkce mysql_unbuffe­red_query()? Nedalo mne to a prozkoumal jsem si zdrojové kódy PHP, kde jsem zjistil že se volá funkce
mysql_use_resul­t() v případě unbuffered dotazů
jinak při normálních dotazech funkce „mysql_store_re­sult()“: http://dev.mysql.com/…-result.html (funkce jsou z MySQL API pro C).
Rozdíl je v tom, že při volání mysql_use_result() si databáze alokuje paměť nutnou pro přečtení jednoho záznamu a
ten pošle klientovi a po zavolání funkce mysql_fetch_row() (opět MySQL API pro C) databáze přečte další řádek a ten pošle klientovi atd. dokud se nepřečtou všechny záznamy. V opačném případě se čte více dat a jak jsem již psal PHP si nejdříve vše uloží do paměti a pak stím umožní pracovat 

13:54 — Komentář Stálý odkaz



Středa duben 8, 2009

Tak nám zase zrušili chodník přátelé!

· rubrika Blog · kategorie

Člověk se nestačí divit co všechno se děje s jedním chodníkem, v ulici Husova v Liberci. Téměř každý den ho využívám k docházení do budov naší univerzity a těsně před mistrovstvím byl opraven a nově byla vytvořena i místa pro parkování ze strany silnice. Asi týden po dokončení byly části chodníku vyříznuty a následně zase „zalátovány“. Už v tuhle chvíli si asi člověk řekne, že tohle není normální. Jaké bylo pro mně překvapení, když jsem včera viděl jak dělníci odstraňují asfalt  Člověka tak napadá, zda nám chodník neopravili jenom na dobu konání MS 2009 a nyní nám vrátí chodník do původního stavu 

08:05 — Komentář Stálý odkaz



Čtvrtek duben 2, 2009

Uvozování identifikátorů v SQL dotazech

· rubrika Clanky · kategorie

Co je identifikátor snad nemusím vysvětlovat V databázích to jsou názvy tabulek, databází, sloupců a aliasů. Co se stane, když následující dotaz položíme na MySQL databázi?
INSERT INTO set (cislo1, cislo2, cislo3) VALUES (0,1,0);
MySQL nám vyhodí chybu, jelikož slovíčko set je příkaz (př. SET NAMES utf-8 ) a neočekávalo ho na tomto místě Konkrétně vypíše:
You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to
use near 'set
Zkusme nyní názvy identifikátorů napsat takto:
`nazev_identifikatoru`
Na databázi pak položíme upravený dotaz:
INSERT INTO `set` (`cislo1`, `cislo2`, `cislo3`) VALUES (0,1,0);
Nyní se data úspěšně vloží do databáze, která díky ` zjistí, že bude následovat název identifikátoru. V každé databázi je to však jinak, např. v PostgreSQL se používají dvojté uvozovky ".

18:56 — Komentář Stálý odkaz



Úterý březen 31, 2009

Zpropadený Firefox aneb synchronizace u XMLHttpRequest

· rubrika Clanky · kategorie

Je tomu teprve pár týdnů, kdy jsem se začal věnovat AJAXu, protože jsem ho potřeboval použít v mé diplomové práci. V ní jsem potřeboval zavolat jeden skript a po jeho dokončení ho znovu zavolat, jen s jinými parametry. Výsledky běhu skriptu (tzn. proběhlo to ok, nastala nějaká chyba), jsem chtěl zobrazovat do různých objektů na XHTML stránce. Napsal jsem si tedy tři funkce na práci s XMLHttpRequest, kde jsem v jedné z nich použil následující kód:
xmlhttp.open("GET",url,false);
Třetí parametr metody open říká, zda se má čekat na odpověď či nikoliv tzn. zda se použije synchroní nebo asynchroní mód.

Celé to funguje tak, že při synchroním přenosu, dojde k vytvoření nového vlákna přičemž původní je pozastaveno (tzn. je pozastavena veškerá interaktivita na straně klienta). V nově vytvořeném vláknu dojde k vyřízení požadavku a po jeho skončení se opět aktivuje vlákno původní a to zpracuje získaný výsledek. V druhém případě se nové vlákno nevytváří a uživatel tak může klidně dále využívat interaktivních stránek a po dokončení požadavku, je jeho výsledek zpracován.

Vše fungovalo dobře v Opeře 9.64, tak jsem to vyzkoušel i v IE 8 a následně ve Firefoxu 3.0.8. Jak jsem překvapivě zjistil, v mé nynější (a nejnovější) verzi Firefoxu synchroní přenos nefunguje (na internetu jsem se po té našel informace o nějakém bugu, ale už nevím kde ) a já potřeboval aby to fungovalo ve všech nejpoužívanějších prohlížečích.

Druhou metodou lze poslat více požadavků najednou a současně čekat na jejich vyřízení. Tuto variantu jsem nechtěl použít z důvodu toho, že skript na který se odkazuji exportuje data z databáze a importuje do jiné. Mnohdy jde i o statisíce záznamů a tak jsem nechtěl server moc zatěžovat vícenásobným spuštěním skriptu. Bohužel jsem po několika hodinách dospěl k názoru, že je to jediné možné řešení.

Pokud například chceme výsledky zobrazovat v různých objektech na (X)HTML stránce, tak jako já v diplomce, stačí k tomu použít třídu v JavaScriptu, kde si dokážeme uchovat jednotlivé instance XMLHttpRequestu a id objektu (bez použití třídy by jsme o ně přišli). Napsal jsem si tak vlastní třídu, kterou můžete najít níže. Předem bych chtěl schovívavost ke kódu. Vím, že mnou napsaná třída nesplňuje požadavky na znovupoužitelnost, až budu mít více času upravím ji

Zdrojový kód:

  1. /**
  2.  * Trida pro vykonavani Http pozadavku (AJAX)
  3.  */
  4.  function HttpClient() { } // HTTPCLIENT CLASS
  5.  HttpClient.prototype = {
  6.   // GET nebo POST
  7.   request_type:'GET',
  8.   // synchroni a nebo asynchroni pozadavek (synchroni nefunguje ve firefoxu 3 neco )
  9.   request_async:true,
  10.   // instance
  11.   xmlhttp:false,
  12.   //kde se zobrazi vysledek
  13.   where_show_content:'',
  14.  
  15.   // inicializace -> vytvoreni XMLHttpRequest
  16.   init:function() {
  17.     try {
  18.       // Mozilla / Opera / Safari
  19.       this.xmlhttp = new XMLHttpRequest();
  20.     }
  21.     catch (e){
  22.       // IE (snad vsechny nejpouzivanejsi verze)
  23.       var MSXML = new Array('MSXML2.XMLHTTP.5.0',
  24.          'MSXML2.XMLHTTP.4.0',
  25.          'MSXML2.XMLHTTP.3.0',
  26.          'MSXML2.XMLHTTP',
  27.          'Microsoft.XMLHTTP');
  28.       var ok = false;
  29.       for (var i=0;i < MSXML.length && !ok; i++){
  30.         try {
  31.           this.xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]);
  32.           success = true;
  33.         }
  34.         catch (e){}
  35.       }
  36.       if (!success){
  37.         alert('Váš prohlížeč napodporuje AJAX!');
  38.       }
  39.     }
  40.   },
  41.   
  42.   //provedeni pozadavku
  43.   request: function(url){
  44.     if (!this.xmlhttp){
  45.       this.init();
  46.     }
  47.     this.xmlhttp.open(this.request_type,url,this.async);
  48.     this.xmlhttp.send(null); //pro posilani POST pozadavku
  49.    
  50.     //zobrazení loadingu
  51.     document.getElementById(this.where_show_content).innerHTML = '<img src=\"images/loading.gif\" alt="" />';
  52.    
  53.     //zpristupneni this ve funkci
  54.     var self = this;
  55.     this.xmlhttp.onreadystatechange = function(){
  56.       switch(self.xmlhttp.readyState) {
  57.       case 0:
  58.         break;
  59.       case 1:
  60.         break;
  61.       case 2:
  62.         break;
  63.       case 3:
  64.         break;
  65.       case 4:
  66.         if (self.xmlhttp.status == 200) {
  67.           document.getElementById(self.where_show_content).innerHTML = self.xmlhttp.responseText;
  68.         }else {
  69.           alert('HTTP Chyba při vykonávání dotazu: ' + '[' + self.xmlhttp.status + ']' + ' ' + self.xmlhttp.statusText);
  70.         }
  71.         break;
  72.       }
  73.     }
  74.   }
  75.  }
  76.  
  77. /**
  78. * ukazka volani tridy
  79. */
  80. var client = new HttpClient();
  81. client.async = true; //asynchroni mod
  82. client.where_show_content = 'main-box'; //kde zobrazit vysledek
  83. client.request('localhost/diplomka?pg=ajax'); //url pozadavku

20:00 — Komentář Stálý odkaz



Nákupní galerie Plaza Liberec

· rubrika Blog · kategorie

26. 3. 2009, to je ten posvátný den, kdy byla otevřena nákupní galerie v Liberci jménem Plaza, která měla původně otevřít již na podzim.

Tento rok je to již třetí nákupní centrum, které bylo v Liberci otevřeno a celkový počet se tak vyšplhal na pěkné číslo pět. Nyní je tak v Liberci Nisa centrum, Plaza, Forum, Géčko a Delta. Nabízí se tu tak otázka, jak se obchodní centra vypořádají s konkurencí? Přeci jenom číslo pět není malé na Liberec, který má okolo 100 000 obyvatel. Řekněme si na rovinu, že všechna centra nabízí téměř to samé, což znamená moře podobných obchodů, především s oblečením. Navíc tu probíhá krize, která bude mít také svůj dopad. Mým názorem je, že minimálně jedno centrum tu nepřežije a bude muset skončit. Jaké to bude, to rozhodnou zákazníci, ale dá se předpokládat, že by to mohla být právě nákupní galerie Plaza.
Co se jí týče, prozatím moc nenadchne a kdo ví, zda se to vůbec někdy změní. Když se tam nyní přijde člověk podívat, asi ho (ne)překvapí, že obchodů tam prozatím mnoho není a také, že některé věci jsou nedodělané (nebo tak alespoň působí). Nepomáhá ani fakt, že je Plaza umístěna na Šaldově náměstí, protože Forum a Delta jsou umístěny přímo na FÜgnerově, kde je terminál městské hromadné dopravy.

Nejsem sám, kdo není nadšený a kdo určitě čekal více. Však přečtěte si tyto články na sreality.cz a liberecky.denik­.cz 

05:08 — Komentář [1] — Stálý odkaz



Starší Novější

XHTML 1.0 Strict - CSS