Michal Čihař - Archive for Jan. 1, 2008

When non ASCII names will finally work?

By using my name in various web services I usually spot bad implementation of displaying name field in their website. I can see that over years the amount of servers which cripple my name to something like ÄŒihaÅ™ is getting lower, but there are still lots of them. When I find way how to report it, I usually do so and I always enjoy fields like "How to repeat". This time the guilty one is the MySQL bugtracker.

PS: Fortunately all Debian pages seem to catch up this year and my name is no longer crippled in NEW queue or Lintian pages :-).

phpMyAdmin používá mootools

Ve vývojové verzi phpMyAdmin se stále více využívá JavaScript a proto se už dlouho uvažovalo o použití nějakého frameworku, který by usnadnil psaní rozšířených funkcí a do budoucna i podporu pro AJAX. Jak se můžete v současném SVN přesvědčit, momentálně se zkouší používání frameworku mootools .

Prozatím se JavaScript používá na schovávání některých informací databází a tabulek , ale do budoucna se určitě dočkáte i pokročilých funkcí využívajících AJAX.

Gammu test version 1.18.90

New Gammu testing version is out. This is mostly bug fixing release, especially with lot of tweaks for Windows build and for AT driver. Full list of changes:

  • Do not link with irprops.lib on Windows.
  • Various MSVC compilation fixes.
  • Improved AT model parsing and added tests.
  • Fixed possible crash in reading SMS from AT phones (bug #515).
  • Proper fall back to automatic model when user enters wrong one.
  • Added identification of several phones.
  • Fixed reading of messages from AT phones without ME memory.
  • Improve charset detection on Motorola phones (bug #522).

You can download from usual place: http://cihar.com/gammu/.

PS: Debian users can get packages from experimental.

Na co vůbec je SSL a podepisování?

Když dnes kolegovi přišel nepodepsaný email od UPC s žádostí o posílání peněz na jiný účet, tak jsme se začali zabývat jak to vlastně v Česku funguje s elektronickým podepisováním. Napsat mezitím email všem klientům UPC s žádostí, aby peníze posílali na můj účet, je lákavá možnost :-).

Po asi pěti minutách člověk zjistí, že i jinde se jaksi na zabezpečení moc nehraje. Chcete vědět jak nainstalovat certifikát certifikační autority, kterým je podepsaný certifikát elektronického bankovnictví? Stačí si přečíst návod na stránkách banky :

Certifikát lze stáhnout a nainstalovat zde: http://www.ica.cz/RootCERT_NewSica.cer a následně jej nainstalovat dvojklikem.

Prostě nic nezkoumejte, všechno odklikejte a bude to. Ale třeba to má ona certifikační autorita popsané lépe, tak se podíváme na její stránky. Omyl, instalaci certifikátu nám provede jakýsi program pro Windows , který vše automaticky bez jakékoliv možnosti ovlivnění uživatelem provede.

U České spořitelny je certifikát pro bankovnictví podepsán Verisignem, takže aspoň má člověk celkem slušnou jistotu, že už tuto certifikační autoritu má ověřenu. Ovšem emaily jimi posílané už jsou podepsané certifikáty od jejich vlastní certifikační autority a přes veškerou snahu se mi nepodařilo najít jak by si její certifikát podle banky měl člověk nainstalovat. Nicméně po přepsání URL z http na https má člověk možnost získat tento certifikát celkem bezpečnou cestou.

Další instituce se mi už ani nechtělo zkoumat...

Jak na debianí balíčky?

Tak jsem se nechal přemluvit k napsaní seriálu o tvorbě balíčků pro Debian. Protože je přeci jen dělám už nějaký ten pátek, tak už jsem asi zapomněl na některé věci, na které jsem v začátcích narazil. A proto jsem se rozhodl napsat tento zápisek :-). Pokud jste měli (nebo máte) s něčím problémy při vytváření balíčku pro Debian, napište to do diskuze, za odměnu se vám pokusím nabídnout co nejlepší odpověď ve vznikajícím seriálu.

PS: Když mi Robert poprvé napsal, tak jsem moc netušil co psát. Teď už se blížím třinácti dílům, takže si myslím, že se máte na co těšit :-).

Znakové sady v MySQL a phpMyAdminovi

MySQL od verze 4.1 podporuje nativně práci s různými znakovými sadami. Bohužel mnoho aplikací a dat v databázích vzniklo dříve a tuto podporu nevyužívají. Pak se uživatel může potýkat s mnoha problémy. Dnes se podíváme na to, jak ty nejčastější vyřešit.

MySQL a znakové sady

Ve verzi 4.1 přibyla v MySQL podpora pro znakové sady a řazení. Ty se nastavují v několika úrovních – výchozí pro server, databázi a tabulku a nastavení pro jednotlivé sloupce. Pokud máme databáze ze starší verze MySQL, nemají přiřazen žádný způsob řazení a použije se výchozí pro server. Výchozí pro MySQL je latin1_swedish_ci , což je pro české podmínky poněkud nevhodné. Jméno řazení se skládá ze tří částí oddělených podtržítkem – první určuje znakovou sadu, druhá jazyk a třetí variantu porovnáván. Varianty porovnávání jsou tři:

ci
case insensitive – nerozlišuje velikost písmen
cs
case sensitive – rozlišuje velikost písmen
bin
binary – řadí podle hodnoty znaku a ne lexikograficky

Pro češtinu máme k dispozici tyto varianty: ucs2_czech_ci, utf8_czech_ci, cp1250_czech_cs, latin2_czech_cs.

Podpora znakových sad v phpMyAdminovi

Do phpMyAdmina přibyla podpora tyto vlastnosti MySQL ve verzi 2.6.3. Nastavit můžete výchozí porovnání pro databázi , tabulku a stejně tak i pro jednotlivé sloupce, které vidíme na přehledu tabulky .

Na úvodní stránce si také můžeme vybrat porovnávání použité pro zobrazování výsledů, ale použitá znaková sada bude vždy utf-8, protože stránky phpMyAdmina jsou v utf-8.

Co dělat když je něco špatně?

Pokud se nám některé znaky zobrazují v phpMyAdminovi špatně, je chybně nastavená jejich znaková sada. Znakovou sadu není možné měnit v přímo, protože MySQL server pak provede konverzi dat mezi těmito znakovými sadami a data budou nejspíš nenávratně poškozena! Pokud chceme jen změnit znakovou sadu sloupce, musíme ho nejprve převést na binární hodnotu (tedy na pole typu BINARY/VARBINA­RY/BLOB odpovídající CHAR/VARCHAR/TEXT) a pak zpět na původní typ jen s jinou znakovou sadou. Takto zůstanou data v nezměněné podobě a jen se změní znaková sada.

Po této změně je ale možné, že používané starší aplikace budou mít problém zobrazit správně data. Aplikace totiž bez explicitního určení znakové sady dostávají data ve výchozí znakové sadě serveru (což je latin1). Pokud k aplikaci máme zdrojové kódy, stačí hned za připojení k MySQL přidat SQL příkaz SET NAMES 'znaková sada' . Ten zajistí, že MySQL server bude posílat data ve znakové sadě, kterou aplikace používá. Pro češtinu máme opět čtyři možnosti: utf8 , latin2 , cp1250 a ucs2 .

Můj první modul pro Drupal

Jakmile jsem se rozhodl používat Drupal pro české stránky o phpMyAdminovi , bylo mi jasné, že si časem nevystačím s tím co už pro něj někdo napsal, ale budu muset vytvořit něco sám. Naštěstí dokumentace k Drupalu je celkem dobrá (rozhodně patří k tomu lepšímu co se mezi open source vyskytuje), tak vytvoření jednoduchého modulu nebylo až tak složité.

Chtěl jsem na phpMyAdmin.cz začít používat některé ze služeb měřící návštěvnost. Místo upravování šablon mi jako lepší řešení přišlo napsat si modul, který udělá co potřebuju a nebudu muset zasahovat do originálních šablon (a tím se vyhnu problémům při aktualizaci). Vzal jsem existující modul pro Google analytics, protože mi připadal podobný, ale nakonec toho z něj moc nezůstalo :-). Asi po hodině už jsem měl verzi, která fungovala celkem dobře a tak jsem si říkal, že by nebylo od věci to někde zveřejnit.

Jako logické místo se jeví Drupal.org a i tento postup je tam vzorně zdokumentován. Žádost o CVS přístup byla vyřízena během pár dnů, a já už mohl commitovat svůj první kód do jejich repository. K mému překvapení commity někdo sleduje, protože asi hodinu po prvním commitu už mi přišla reakce od někoho, že přesně takový modul potřeboval :-). Tak jsem jenom dokončil vyčištění a další den vyšla první verze modulu Český audit .

Gammu stable version 1.18.0

Good news everyone, first stable Gammu release in this year is out. Since 1.17.92 only few small fixes in SMS decoding and AT engine did happen, but there is quite big list of changes compared to 1.17.0:

  • Fixed decoding of an empty SMS.
  • Fixed some mistakes in API documentation.
  • Fixed compilation under MS Visual C++ Express.
  • Various small fixes if AT driver.
  • Add simple shell script to generate JAD file from JAR.
  • Added support for adding memory entries to 6510.
  • Phone features now can be defined in configuration, so there is no need to modify common/gsmphones.c for testing different settings.
  • Config file loading behaves more consistent in lookup. In some cases it can now find different configuration file.
  • Fixed crash when there are too many messages (bug #466).
  • Fixed crash when printing messages on Windows (bug #476).
  • Do not ask phone for IMEI so often (bug #480).
  • No need to set LD_LIBRARY_PATH for tests.
  • Properly wait for SMSD child processes (bug #486).

You can download from usual place: http://cihar.com/gammu/.

My first Drupal module

As I use Drupal for Czech phpMyAdmin pages, it was only a matter of time till I will have (or want) to add some functionality. My first Drupal module is quite trivial, but anyway I already got positive feedback on it just after committing to Drupal CVS :-). Today I finished little cleanup which my initial version required and I decided to make a first release out of it.

And what I'm still talking about? It's a module for adding measuring code for various web auditing systems used in Czechia. I didn't wanted to hack this somehow into templates and module which will provide block with those looks as best solution to me. You can get it on Drupal pages.

Oblíbené dotazy

Pokud často používáte nějaký komplikovanější dotaz, tak vás asi nebaví ho pokaždé zadávat znovu. Proto byla do phpMyAdmina přidána funkce pro ukládání a používání oblíbených dotazů. Pro její použití ovšem potřebujete mít zapnutou podporu pro rozšířené funkce .

Vytváření oblíbeného dotazu

Dotaz můžete vytvořit jakýmkoliv způsobem, třeba ho zadat jako SQL, nebo pomocí vyhledávací stránky. Po jeho provedení uvidíte pod výsledky rámeček pro přidání SQL dotazu do oblíbených, kde stačí zadat jméno a phpMyAdmin so ho bude pamatovat. Pokud dotaz nechcete spouštět, můžete oblíbený dotaz rovnou vytvořit na SQL stránce . Tato možnost je obzvláště vhodná pro dotazy, které nevrací žádný výsledek (například úprava tabulek nebo vkládání nových záznamů).

Oblíbený dotaz není omezen na jediný SQL příkaz, ale jsou zobrazeny jen výsledky toho posledního, takže není moc užitečné do něj vkládat víc dotazů vybírající nějaké řádky.

Při vytváření můžeme dotaz pojmenovat libovolně. Pokud ho ovšem pojmenujeme stejně jako se jmenuje některá tabulka v databázi, phpMyAdmin tento dotaz použije při procházení této tabulky. Tímto můžeme například omezit počet zobrazených sloupců při prohlížení tabulky.

Práce s oblíbenými dotazy

Již vytvořený dotaz se objeví na SQL stránce , odkud ho jeho vybráním můžeme spustit.

Oblíbený dotaz upravíme podobným postupem jako ho spouštíme. Jen je zapotřebí na SQL stránce zvolit „Zobrazit“ místo výchozího „Provést“. Tím bude dotaz zobrazen v editačním poli pro SQL a máme možnost ho po úpravách znovu uložit. Pokud chceme přepsat starý dotaz, nesmíme zapomenout zaškrtnout „Přepsat existující oblíbený dotaz stejného jména“.

Pokud již oblíbený dotaz nepotřebujeme, můžeme ho opět na SQL stránce vymazat zvolením možnosti „Odstranit“.

Přístup k dotazům

Standardně má k dotazu přístup pouze uživatel, který ho vytvořil, protože většinou nechceme aby k našim datům měli přístup ostatní. Pokud však chceme dotaz sdílet, nabízí nám phpMyAdmin tuto možnost, stačí při vytváření (nebo úpravách) zaškrtnout „Umožnit všem uživatelům používat tuto položku“ a pak všichni uživatelé budou moci používat tento dotaz. Toto také znamená, že ostatní uživatelé budou moci dotaz upravit a smazat.

Parametry oblíbených dotazů

Zatím jsme oblíbené dotazy vytvářeli jen pevně dané. phpMyAdmin ale umožňuje do dotazu začlenit i volitelnou část, která se přidá při zadání parametru. Hodnota parametru bude vložena namísto [VARIABLE] a zakomentovaná část dotazu bude odkomentována. Takový dotaz pak může vypadat třeba takto (používá se databáze sakila ):

 
  SELECT * FROM `city`
/* WHERE `city`.`country_id` = [VARIABLE] */
 

Pokud tedy parametr nezadáme, vybere dotaz všechny města, pokud ho zadáme, vybere jen města v dané zemi.