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

Gammu test version 1.17.92

New Gammu testing version is out. This is mostly bug fixing release, but you should be able to do addnew with 6510 driver now. Full list of changes:

  • 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.

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

When to release 1.0?

This is not about any particular project, but more a generic thought. When should be something considered to be stable enough to be released as 1.0? Over ages I started several projects which are in different quality right now and this is maybe not completely related to version they use.

Let's take one of older ones - Wammu. It was started long time ago, it really does not get any major code changes for several years and I still don't want to make 1.0 release there. The reason is that I think that many things could be done better there. However there are quite lot of users which use it and they probably consider it stable enough :-). But they will have to live with 0.x versions as I do not plan 1.0 at all for now even if it maybe deserves it :-).

Different case is Ukolovnik. It does not have tons of features, but it's enough for me and it will be 1.0 soon. I have features to add, but I don't thing that RPC interface has to be in 1.0, it can be just thing added later.

Že se ještě vůbec snažím někomu radit

Chápu, že občas na jabber konferenci pro phpMyAdmina vleze někdo kdo má problémy s MySQL. Ale když už někdo neví co dělá a chce provozovat redakční systém v PHP, tak by aspoň mohl mít trochu slušnosti. Pojmenovat se aaa na důvěryhodnosti moc nepřidá (a koneckonců anonymitu taky ne, stejně IP adresu vím ;-)) a po prvním dotazu "hele kde mám zjistit udaje MySQL?" už se člověk nemůže ubránit pocitu co že to za blbce sem zase dorazilo. Nicméně to mě neodradilo od toho se mu pokusit poradit, ale dobře míněná snaha stejně přišla vniveč. Ostatně posuďte sami . No nic je na čase jít spát.

Vlastní exportní formát

Před týdnem jsme se dozvěděli, jak exportovat data do podporovaných formátů. Co ale dělat, když potřebujeme data ve vlastním formátu? Napsat si vlastní exportní modul není nic těžkého, jak na to se dozvíte v dnešním článku.

Začátek

Nejdříve si rozmyslete, co všechno od exportu budete potřebovat a jaké možnosti nastavení bude export mít. Vždy je lepší si nejprve ujasnit požadavky, než se vrhneme na programování. Pro ukázku v tomto článku budeme vytvářet export do textového souboru, který půjde dále zpracovat pomocí Texy! . Nastavení použijeme stejná jako mají ostatní podobné exporty, tedy možnost vypnutí dat nebo struktury, zobrazení jmen sloupců a text, kterým nahradíme NULL hodnoty.

Hlavička

Každý plugin obsahuje hlavičku, která se provádí při načítání pluginů. Ta definuje jednak informace o pluginu a také parametry, které bude možné nastavit na stránce s exporty. Pro náš export tedy bude základní hlavička vypadat takto:

 
  <?php

/*Texy! export for phpMyAdmin */

if (isset($plugin_list)) {
    /* Jméno zaregistrovaného pluginu musí být stejné jako jméno souboru */
    $plugin_list['texytext'] = array(
        'text' => 'Texy! text',         /* Jméno pluginu které se zobrazí uživateli */
        'extension' => 'txt',           /* Přípona vygenerovaného souboru */
        'mime_type' => 'text/plain',    /* MIME typ vygenerovaného souboru */
        /* Definice parametrů: */
        'options' => array(
            array('type' => 'bool',
                'name' => 'structure',
                'text' => 'strStructure',
                'force' => 'data'),
            array('type' => 'bgroup',
                'name' => 'data',
                'text' => 'strData',
                'force' => 'structure'),
            array('type' => 'text',
                'name' => 'null',
                'text' => 'strReplaceNULLBy'),
            array('type' => 'bool',
                'name' => 'columns',
                'text' => 'strPutColNames'),
            array('type' => 'egroup'),
            ),
        'options_text' => 'strOptions',
        );
} else {

/* Sem přijde kód pro export */

}
?>
 

Pokud nyní soubor s tímto PHP kódem uložíme jako libraries/export/texytext.php , měl by phpMyAdmin už tento plugin zobrazit na stránce pro export.

Implementace exportu

Pro vlastní export je potřeba implementovat několik funkcí, které mají za úkol získat data z MySQL a poslat je na výstup pomocí funkce PMA_exportOutputHandler . Tato funkce zajišťuje zpravování výstupního bufferu, kompresi a posílání dat uživateli nebo ukládání na server. Vrací false, pokud operace selhala.

Funkce, které musíme implementovat jsou tyto:

  • PMA_exportComment
  • PMA_exportFooter
  • PMA_exportHeader
  • PMA_exportDBHeader
  • PMA_exportDBFooter
  • PMA_exportDBCreate
  • PMA_exportData
  • PMA_exportStructure

Všechny by opět měly vrátit false, pokud se něco nepodařilo. Funkcí je sice hodně, ale to je jen z důvodu usnadnění psaní exportů do rozličných formátů. Jejich názvy jsou snad celkem výstižné, takže ani nebudu popisovat k čemu která slouží. Pro náš případ potřebujeme jen funkce PMA_exportDBHeader , PMA_exportData a PMA_exportStructure , ostatní mohou jen vracet true a nic nedělat.

PMA_exportDBHeader

Tato funkce má za úkol vypsat hlavičku exportu a bude tedy poměrně triviální:

 
  function PMA_exportDBHeader($db) {
    return PMA_exportOutputHandler('===' .
        $GLOBALS['strDatabase'] . ' ' . $db . "\n\n");
}
 

PMA_exportData

Teď se již dostáváme ke komplikovanějšímu úkolu – exportu dat. Začneme opět nadpisem, aby uživatel věděl, o jakou tabulku se jedná:

 
  if (!PMA_exportOutputHandler('== ' . $GLOBALS['strDumpingData'] . ' ' . $table . "\n\n")) {
    return FALSE;
}
 

Jako další krok potřebujeme načíst data z MySQL. Pro to použijeme DBI vrstvu phpMyAdmina:

 
  $result      = PMA_DBI_query($sql_query, null, PMA_DBI_QUERY_UNBUFFERED);
$fields_cnt  = PMA_DBI_num_fields($result);
 

Uživatel měl možnost si vybrat, zda chce zobrazit v hlavičce jména sloupců. Zde poprvé použijeme přístup k parametrům a podle jeho hodnoty případně zobrazíme hlavičku:

 
  global $what;

if (isset($GLOBALS[$what . '_columns'])) {
    $text_output = "|------\n";
    for ($i = 0; $i < $fields_cnt; $i++) {
        $text_output .= '|' . htmlspecialchars(stripslashes(PMA_DBI_field_name($result, $i)));
    } // end for
    $text_output .= "\n|------\n";
    if (!PMA_exportOutputHandler($text_output)) {
        return FALSE;
    }
} // end if
 

Nyní nám už jen chybí vypsat data z databáze uživateli:

 
  while ($row = PMA_DBI_fetch_row($result)) {
    $text_output = '';
    for ($j = 0; $j < $fields_cnt; $j++) {
        if (!isset($row[$j]) || is_null($row[$j])) {
            $value = $GLOBALS[$what . '_null'];
        } elseif ($row[$j] == '0' || $row[$j] != '') {
            $value = $row[$j];
        } else {
            $value = ' ';
        }
        $text_output .= '|' . htmlspecialchars($value);
    } // end for
    $text_output .= "\n";
    if (!PMA_exportOutputHandler($text_output)) {
        return FALSE;
    }
} // end while
 

A uvolnit výsledky dotazu a vrátit návratovou hodnotu:

 
  PMA_DBI_free_result($result);
return TRUE;
 

PMA_exportStructure

Export struktury je asi nejnáročnější a určitě nejrozsáhlejší, nicméně neobjevují se zde již žádné nové věci týkající se exportu, proto se na její celý kód podívejte sami v přiloženém souboru. V úvodu se načtou z MySQL parametry tabulky, poté pomocí funkcí phpMyAdmina načteme informace o relacích a MIME typech sloupců a tyto informace zformátujeme do Texy!.

Hotovo

A tím by mělo být vše hotovo. Plugin vyzkoušíme a pokud to uznáme za vhodné, pošleme do patch trackeru , aby mohl být náš plugin začleněn v další verzi phpMyAdmina.

Celý hotový exportní plugin naleznete v příloze článku.

Přílohy:

Toshiba ACPI keys, HAL and friends

Long time ago I used FnFX to handle events from ACPI keys on my Toshiba notebook. However when reinstalling notebook because of disk crash, I thought there must be a cleaner way to handle these and I found patch for acpid which added handling of these special events.

However I really didn't like patching acpid on every update and there didn't seem to be chance to merge it upstream, so I started to look for better solution. After another amount of googling, I found that HAL already has some support for Toshiba hotkeys. Unfortunately it is now disabled in Debian because most key did not emit anything using HAL.

Okay, let's fix the HAL, maybe it will get later enabled. Converting FnFX keymap to C code was quite easy and I made a patch for HAL to add support for all keys. Hopefully it get merged soon and I can then file bug on Debian package to reenable Toshiba support in HAL.

Meanwhile I'd like to find some generic way of configuring what happens on these events. For now I hacked simple Python script which listens to DBUS events and invokes appropriate commands for keys, but I hope that some such tool already exists and I just missed it. If you know something, please let me know at michal@cihar.com.

One year under my reign

One year ago, I took over Gammu maintenance. I think it time to summarize a bit what happened during that year. There were definitely good and bad releases in that time (especially strictness introduced to SMS parser in 1.13.0 took quite a lot of releases to fix various bugs), but generally I things Gammu is moving in a good way.

What I would definitely call positive:

  • Added build time testing. This helps a lot to catch regressions. However more tests could be done.
  • I cleaned up lot of code parts so that Gammu is now more resistant to bad data and should not crash in these cases.
  • Added lot of API documentation, most API functions are now fully documented.
  • More often testing releases - I try to release every week. Sometimes changes are huge, sometimes just few bugfixes. This makes Gammu occur among most vital projects on freshmeat.net.
  • Quite complete IrMC implementation together with AT/OBEX switching gives support for quite a big range of phones today.
  • SMSD got PostgreSQL support.
  • AT+CMGL support for reading messages gives us support for many phones which were not supported in the past.
  • I started to use OpenSuse Build Service and Ubuntu PPA to provide up to date binaries for many distributions.

There are also some bad things:

  • Nobody cares about build under MSVC. It is broken sometimes and I try to fix issues, but no constant testing of this causes problems.
  • Almost no new features for Nokia phones. I simply lack time to do anything more than bug fixing here.
  • Still bad support for Symbian phones. Some developer interested in this area is definitely needed. But probably OpenSync with SyncML is enough for most people.
  • The changes I made to the SMS parser broke too much things, I should have payed more attention to this change. But now things seem to be worked out.

Some statistics of last year (based on Ohloh):

ValueDec 2006Dec 2007Difference
Code Lines90,540101,687+12%
Comment Lines9,20415,336+67%
Comment Ratio9.2%13.0%+30%

All these changes were made in approximate 1200 commits.

I hope next year will not be worse :-).

Gammu test version 1.17.91

New Gammu testing version is out. Besides fixing there is important feature for people finding proper flags for not supported phones - you can do it now without recompiling Gammu! Full list of changes:

  • 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.

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

Good bye Enca

Some days ago I was notified by DEHS that Enca homepage is unreachable. Okay, this happens sometimes. But as the error lasted longer and longer, I decided to ask author about it.

Unfortunately the reply was that this nice software is not maintained anymore and computer which hosted it's homepage is gone. As it would be bad to loose this software completely, I offered place to host downloads for it. No, I'm not going to develop it, I already have enough projects for which I don't have enough time. So my server has just become a download place for Enca.