Monthly Archives: June 2007

Rozdělení editoru VS

Kliknout omylem se někdy vyplatí. Přišel jsem tím na jednu zajímavou fičurku. Mezi zavíracím křížkem a scrollbarem se nachází “prostor”, který když popotáhnete, rozdělí se aktuální okno na dvě části.

Nikdy jsem to nepotřeboval, ale když o tom vím, možná se to nějak využije.

Tlačítko Start ve Vistě :)

Určitě všichni známe ty poznámky hnidopichů, že vypínat počítač přes tlačítko Start je pomatené. Vista jim však udělal čáru přes rozpočet. Tlačítko Start je pryč a máme pouze logo Windows. Ale něco přece jen zbylo.

No uvidíme, s jakou vtipnou historkou přijdou “milovníci” tlačítka Start. Ale aspoň budou mít do čeho se navážet. :)

Vypnutí hibernace na notebooku

Včera jsem potřeboval na jednom notebooku s WinXP vypnout podporu pro hibernaci. Šel jsem na jistotu do Ovladacích panelu, ale ouha, vyrobce tam nacpal nejakou svoji utilitu, takze klasicky MS dialog nikde. Samozřejmě přes ten jejich “rohy kulaté, menu krásně animovaná”-dialog šlo nastavit pár věcí kolem baterky, ale o hibernaci ani památky. Jak z toho ven? Zkusil jsem smazal soubory hiberfil.sys ručně (páč jsem slyšel, že to hibernaci vypne), bum, neúspěch, soubor se drží zuby nehty (to by mě zajímalo, jak jej nějaké BFU smazalo). No nic, chvíli jsem laboroval s tím “rohy kulaté, menu krásně animovaná”-dialogem, ale nic. Pak mi to (náhodou :) ) cvaklo. Příkaz powercfg. Stačilo powercfg /? a hned to bylo jasno. Proč jsem jej hned na začátku nepoužil, nemusel bych se pak rozčilovat nad tou utilitou výrobce.

Counting, counting, counting …

OK, not so describing title, but …

A few days ago, when I was talking with my colleague, and discovered interesting fact that some people doesn’t know about count function behavior in several cases. Let me show small example.
Create database on your favourite server. Then create simple table, something like create table test (id int);. Insert some data (null values too). Now try to execute these two statements: select count(*) from test; and select count(id) from test;. Wow! You got different results.

In fact it’s not so wow how it looks like. Yep, count(*) counts null values too but count(some_column) counts only not null rows (not null in this column). And it’s obvious. The count(*) has no idea whether to count rows, where first column is null and all others not or last is null and others not or … who knows. But when you specify column name, then this is straightforward.

I hope this isn’t new for you. ;)

Překlad aplikace

Asi všichni čekáte, že zde budu rozebírat možnosti, jak udělat různé jazykové mutace ASP.NET stránek. Omyl. Dokonce nebudu ani rozebírat způsoby jak dělat více jazyků ve WinForms aplikaci (i když mám v plánu jednu aplikaci takto lokalizovat, takže možná nějaké postřehy budou). Chci ukázat něco v PHP a MySQL (to koukáte co?), nicméně postup je použitelný i na jinou kombinaci technologií.

Dostala se mi do rukou aplikace – e-shop – v PHP, který potřeboval být rozšířen o jeden další jazyk. Nešlo jenom o to, aby tlačítko “Odeslat dotaz” mělo jiný nápis, šlo hlavně o to, aby výrobky aspol. fungovalo ve dvou jazycích. Protože aplikace nebyla napsána moc čistě a databáze taky nevypadala, že by se o ní dalo opřít, řešil jsem, jak s co nejmenším hrabáním do kódu (a tedy potenciálním poškozením něčeho) tohle vyřešit. Napadla mě zajímavá myšlenka, kterou jsem nikdy nezkusil, ale zdálo se mi, že by mohla fungovat.

Rozšířil jsem tedy všechny tabulky, u kterých to dávalo smysl o další sloupce, kde byly názvy, popisy, parametry ceny, slevy atp. k výrobkům v dalším jazyku. (Pozn.: Nepřišel jsem na způsob, jak v MySQL změnit pozici sloupce po vytvoření. Ne že by to vadilo, jen je to přehlednější. Takhle jsou nové na konci. Ale asi to nějak jde. :) ) Původní sloupce také přejmenoval (dal jsem suffix podle jazyka). Následovala tvorba view, které měly stejný název jako tabulka, jen suffix podle jazyka a vracely záznamy přesně ve formátu původních tabulek, včetně původních názvů sloupců. Potom jsem vzal PHP skripty a všechny odkazy na tabulky ve from, join apod. jsem přepsal tak, aby četly z daného view (jazyk byl uložen v proměnné a přidán do příkazu). Ještě jsem pro ně přidal alias na původní jméno, protože se na pár místech odkazovalo na sloupec plným jménem.

Celé to fungovalo bez složitých změn v kódu, bez přepisování názvů sloupců na hromadě míst (o kterých nikdo neví kde jsou :) ) a výkon to nijak neubírá. Lehce se pak upravili i inserty a updaty (i když by šlo použít i view a updatnout 2x) a bylo téměř vymalováno.

Rozhodně jsem nevymyslel kolo, ale nikdy jsem takovýto postup nezkusil a nevěděl jsem, jestli někde nenarazím na něco co jsem nedomyslel. Zatím vše funguje. Uvidíme co se po… :)

Ukázka:
1. tabulka “sroubky” (id, nazev, popis, co_ja_vim)
2. úprava “sroubky” (id, nazev_cz, popis_cz, co_ja_vim_cz, nazev_rr, popis_rr, co_ja_vim_rr)
3. vytvoření view “sroubky_cz” as select id, nazev_cz as nazev, popis_cz as popis, co_ja_vim_cz as co_ja_vim from sroubky
4. to samé pro sroubky_rr
5. pak jen upravit pár míst app (rozhodně méně, než hledat, kde všude je jaké echo atp. ;) )
6. +/- hotovo (upravit event. inserty, updaty)