Synology Photostation PostgreSQL Database

Last update : November 17, 2015

The Synology DSM 5.0 operating system uses the database PostgreSQL version 9.3 for Photostation 6.0 which can be administered with phpPgAdmin.

The Synology phpPgAdmin package created by Nigel Barnes (alias Pernod 70) has been updated on March 31, 2014 to work with the new Synology DSM version 5.1. The new package version is 5.1.0-002, the sources are available at Github.

The following configuration files are used :

by phpPgAdmin

  • /usr/syno/synoman/phpsrc/phpPgAdmin/conf/config.inc.php
  • /usr/syno/synoman/phpsrc/phpPgAdmin/conf/config.inc.php-dist

by PosrtgreSQL

  • /etc/postgresql/pg_hba.conf
  • /etc/postgresql/pg-ident.conf
  • /etc/postgresql/postgresql.conf
  • /etc.defaults/postgresql/pg_hba.conf
  • /etc.defaults/postgresql/pg-ident.conf
  • /etc.defaults/postgresql/postgresql.conf

config.inc.php

I named this configuration file phpPgAdmin in the Synology Config File Editor. The original content is show below :


<?php

 /**
 * Central phpPgAdmin configuration. As a user you may modify the
 * settings here for your particular configuration.
 *
 * $Id: config.inc.php-dist,v 1.55 2008/02/18 21:10:31 xzilla Exp $
 */

 // An example server. Create as many of these as you wish,
 // indexed from zero upwards.

 // Display name for the server on the login screen
 $conf['servers'][0]['desc'] = 'PostgreSQL by Synology';

 // Hostname or IP address for server. Use '' for UNIX domain socket.
 // use 'localhost' for TCP/IP connection on this computer
 $conf['servers'][0]['host'] = '';

 // Database port on server (5432 is the PostgreSQL default)
 $conf['servers'][0]['port'] = 5432;

 // Database SSL mode
 // Possible options: disable, allow, prefer, require
 // To require SSL on older servers use option: legacy
 // To ignore the SSL mode, use option: unspecified
 $conf['servers'][0]['sslmode'] = 'allow';

 // Change the default database only if you cannot connect to template1.
 // For a PostgreSQL 8.1+ server, you can set this to 'postgres'.
 $conf['servers'][0]['defaultdb'] = 'template1';

 // Specify the path to the database dump utilities for this server.
 // You can set these to '' if no dumper is available.
 $conf['servers'][0]['pg_dump_path'] = '/usr/bin/pg_dump';
 $conf['servers'][0]['pg_dumpall_path'] = '/usr/bin/pg_dumpall';

 // Example for a second server (PostgreSQL for Windows)
 //$conf['servers'][1]['desc'] = 'Test Server';
 //$conf['servers'][1]['host'] = '127.0.0.1';
 //$conf['servers'][1]['port'] = 5432;
 //$conf['servers'][1]['sslmode'] = 'allow';
 //$conf['servers'][1]['defaultdb'] = 'template1';
 //$conf['servers'][1]['pg_dump_path'] = 
'C:\\Program Files\\PostgreSQL\\8.0\\bin\\pg_dump.exe';
 //$conf['servers'][1]['pg_dumpall_path'] = 
'C:\\Program Files\\PostgreSQL\\8.0\\bin\\pg_dumpall.exe';
 
 
 /* Groups definition */
 /* Groups allow administrators to logicaly group servers together under
 * group nodes in the left browser tree
 *
 * The group '0' description
 */
 //$conf['srv_groups'][0]['desc'] = 'group one';

 /* Add here servers indexes belonging to the group '0' seperated by comma */
 //$conf['srv_groups'][0]['servers'] = '0,1,2'; 

 /* A server can belong to multi groups. Here server 1 is referenced in both
 * 'group one' and 'group two'*/
 //$conf['srv_groups'][1]['desc'] = 'group two';
 //$conf['srv_groups'][1]['servers'] = '3,1';

 /* A group can be nested in one or more existing groups using the 'parents'
 * parameter. Here the group 'group three' contains only one server and will
 * appear as a subgroup in both 'group one' and 'group two':
 */
 //$conf['srv_groups'][2]['desc'] = 'group three';
 //$conf['srv_groups'][2]['servers'] = '4';
 //$conf['srv_groups'][2]['parents'] = '0,1';

 /* Warning: Only groups with no parents appears at the root of the tree. */
 

 // Default language. E.g.: 'english', 'polish', etc. See lang/ directory
 // for all possibilities. If you specify 'auto' (the default) it will use 
 // your browser preference.
 $conf['default_lang'] = 'auto';

 // AutoComplete uses AJAX interaction to list foreign key values 
 // on insert fields. It currently only works on single column 
 // foreign keys. You can choose one of the following values:
 // 'default on' enables AutoComplete and turns it on by default.
 // 'default off' enables AutoComplete but turns it off by default.
 // 'disable' disables AutoComplete.
 $conf['autocomplete'] = 'default on';
 
 // If extra login security is true, then logins via phpPgAdmin with no
 // password or certain usernames (pgsql, postgres, root, administrator)
 // will be denied. Only set this false once you have read the FAQ and
 // understand how to change PostgreSQL's pg_hba.conf to enable
 // passworded local connections.
 $conf['extra_login_security'] = false;

 // Only show owned databases?
 // Note: This will simply hide other databases in the list - this does
 // not in any way prevent your users from seeing other database by
 // other means. (e.g. Run 'SELECT * FROM pg_database' in the SQL area.)
 $conf['owned_only'] = false;

 // Display comments on objects? Comments are a good way of documenting
 // a database, but they do take up space in the interface.
 $conf['show_comments'] = true;

 // Display "advanced" objects? Setting this to true will show 
 // aggregates, types, operators, operator classes, conversions, 
 // languages and casts in phpPgAdmin. These objects are rarely 
 // administered and can clutter the interface.
 $conf['show_advanced'] = false;

 // Display "system" objects?
 $conf['show_system'] = false;

 // Minimum length users can set their password to.
 $conf['min_password_length'] = 1;

 // Width of the left frame in pixels (object browser)
 $conf['left_width'] = 200;
 
 // Which look & feel theme to use
 $conf['theme'] = 'default';
 
 // Show OIDs when browsing tables?
 $conf['show_oids'] = false;
 
 // Max rows to show on a page when browsing record sets
 $conf['max_rows'] = 30;

 // Max chars of each field to display by default in browse mode
 $conf['max_chars'] = 50;

 // Send XHTML strict headers?
 $conf['use_xhtml_strict'] = false;

 // Base URL for PostgreSQL documentation.
 // '%s', if present, will be replaced with the PostgreSQL version
 // (e.g. 8.4 )
 $conf['help_base'] = 'http://www.postgresql.org/docs/%s/interactive/';
 
 // Configuration for ajax scripts
 // Time in seconds. If set to 0, refreshing data using ajax 
will be disabled (locks and activity pages)
 $conf['ajax_refresh'] = 3;

 /** Plugins management
 * Add plugin names to the following array to activate them
 * Example:
 * $conf['plugins'] = array(
 * 'Example',
 * 'Slony'
 * );
 */
 $conf['plugins'] = array();

 /*****************************************
 * Don't modify anything below this line *
 *****************************************/

 $conf['version'] = 19;

?>

config.inc.php-dist

This is a backup copy of the main configuration file config.inc.php.

pg_hba.conf

Client authentication in PostgreSQL is controlled by a configuration file, which traditionally is named pg_hba.conf (HBA stands for host-based authentication). I named this configuration file PostgreSQL in the Synology Config File Editor. The original content is show below :


# TYPE DATABASE USER ADDRESS        METHOD
local  all      all                 trust
host   all      all  127.0.0.1/32   trust
host   all      all  ::1/128        trust

A backup copy with these default values is stored in the /etc.defaults/ folder.

pg-ident.conf

The configuration file pg-ident.conf is used to map the operating system user name to a database user name if an external authentication system is involved. In the Synology setup this file and the backup copy stored in the /etc.defaults/ folder are empty.

postgresql.conf

The original content is show below :


hba_file = '/etc/postgresql/pg_hba.conf'
ident_file = '/etc/postgresql/pg_ident.conf'

external_pid_file = '/run/postgresql/postmaster.pid'

listen_addresses = '127.0.0.1'
max_connections =64

shared_buffers = 24MB

log_destination = 'syslog'
syslog_ident = 'postgres'
client_min_messages = notice
log_min_messages = warning
log_min_error_statement = error
log_min_duration_statement = -1

track_activities = off
track_counts = off

autovacuum = off

datestyle = 'iso, mdy'
lc_messages = 'C'
lc_monetary = 'C'
lc_numeric = 'C'
lc_time = 'C'

escape_string_warning = off
synchronize_seqscans = off

standard_conforming_strings = off

A backup copy with these default values is stored in the /etc.defaults/ folder.

Configuration

Out of the box with the default configuration parameters, the login to the PostgreSQL database with the phpPgAdmin app works with the username postgres and an empty password.

After an update or upgrade of the DSM operating systme, the phpPgAdmin webpage (http://yourdomain/phpPgAdmin/) is usually no longer accessible. You must reinstall the 3rd party phpPgAdmin installation package with the following steps :

  1. deinstall phpPgAdmin
  2. set the confidence level in parameters to the required 3rd party installation
  3. install manually the latest phpPgAdmin package
  4. check the configuration files with the configuration editor (mainly the extra_login_security parameter which I set to false in the config-file named phpPgAdmin)
  5. Start the phpPgAdmin package in the package center
  6. Go to the phpPgAdmin webpage, enter the default login credentials and verify your databases
phpPgAdmin Interface on Synology

PostgreSQL database management with phpPgAdmin on Synology

The last update of the Synology System was done on November 17, 2015, followed by a new installation of phpPgAdmin.

Export

To export the Photo PostgreSQL database for backup purposes, I select the photo database, click the tab “Export” in the menu bar, select “Structure and Data” with the Format “SQL”, chose the option “download” and finally click the button “Export”. The file is saved with the name “dump.sql” in the standard local download folder.

Export

Export PostgreSQL Synology photostation database with phpPgAdmin

Links

A list with links to sources providing additional informations about the Synology PostgreSQL database is shown hereafter :

Raspberry Pi

Dernière mise à jour : 23 janvier 2016

Le Raspberry Pi est un nano-ordinateur monocarte à processeur ARM développé par la fondation Raspberry Pi. Cet ordinateur, qui a la taille d’une carte de crédit, est destiné à encourager l’apprentissage de la programmation informatique; il permet l’exécution de plusieurs variantes du système d’exploitation libre GNU/Linux et des logiciels compatibles. Seule la carte mère nue est fournie, sans boîtier, alimentation, mémoire, clavier, souris ni écran, afin de diminuer les coûts et de permettre l’utilisation de matériel de récupération.

Ordinateur Raspberry Pi modèle B

Ordinateur Raspberry Pi modèle B

Raspberry Pi

Les ordinateurs Raspberry Pi et les accessoires afférents sont disponibles auprès de différents distributeurs et revendeurs, parmi eux Amazon. Fin 2015, il y  a quatre modèles disponibles : PI 1 A+, PI 1 B+, PI 2 B et PI Zero. Dans le passé il y avait encore les modèles PI 1 A et PI 1 B.

La documentation officielle est disponible sur le site web de la fondation. Je dispose d’un ensemble d’ordinateurs Raspberry Pi modèle B rev. 2 (2011.12), avec des modules de caméra Raspicam et des kits Bright Pi 1.0. Les caractéristiques principales sont présentées ci-après :
Ordinateur :

  • System on a chip (SoC) processeur : Broadcom BCM2835, 700 MHz (ARM, distribution armhf)
  • RAM : 512 MByte
  • Carte mémoire : Full SD
  • Ethernet : 10/100 Mbits
  • HDMI port : 1
  • USB 2.0 ports : 2
  • Composite video output : Cinch
  • Audio output : 3,5 mm audiojack
  • Camera interface CSI-2 : 1
  • LCD display interface DSI : 1
  • Extensions : 26
  • Nombre de GPIO (general purpose input/output) : 17
  • Alimentation : microUSB, 5 Volt, 700 mA

Caméra :

  • Sensor : OmniVision OV5647
  • Résolution : 2.592 x 1.944 pixels
  • Focus : fixe >= 1m
  • Vidéo : 1080p30, 720p60 and 640x480p90

Bright Pi v1.0 :

  •  interface I2C
  • 4 LED’s bright white
  • 8 LED’s Infrarouge

Raspbian

Comme j’utilise déjà Debian sur un autre ordinateur, je me suis décidé d’installer la version Debian adaptée au Raspberry Pi, appelée Raspbian, sur mes nano-ordinateurs.

Carte mémoire 8GB reformatée

Carte mémoire 8GB reformatée

Le système d’exploitation Raspbian, les autres logiciels et les données sont enregistrés sur une carte mémoire SD 8GB classe 10. Comme ma carte SD n’était pas vierge, mais formatée sur un autre système, la procédure de reformatage classique ne fonctionnait pas.

J’ai procédé comme suit dans le terminal de commande Windows :

diskpart
list disk
select disk 1
clean
format fs=FAT32 quick
assign

Pour installer le système d’exploitation sur la carte mémoire, j’ai utilisé l’outil Win32DiskImager. La version la plus récente est 0.9.5. Les instructions comment procéder” sont disponibles sur le site web de l’organisation Raspberry Pi.

Outil Win32DiskImager

Outil Win32DiskImager

Raspicam

J’ai connecté le module camera (Raspicam) à la platine Raspberry PI sur base des instructions de set-up données sur le site web de Raspberry. Les caractéristiques sont indiquées dans les détails techniques. La caméra a été fixée sur un support spécifique.

Raspicam avec support

Raspicam avec support

Des bibliothèques (logiciels) pour piloter la caméra sont disponibles pour bash et pour Python. Les trois commandes de base en ligne pour gérer la caméra sont :

Les détails des commandes sont décrits dans l’API du module Raspicam.

Bright Pi

Bright-Pi module

Bright-Pi module

Bright Pi est un kit d’éclairage pour ajouter à la caméra Raspicam, développé par Pi Supply. Le module comprend 4 LED’s Cree blanches puissantes et 8 LED’s Liteon infrarouge.

J’étais un supporteur du projet Bright Pi sur Kickstarter.

Les éléments du module sont fournis séparément, il faut soi-même les assembler et souder. Les instructions d’assemblage et de programmation sont disponibles sur le site web de Pi-Supply.

Bright Pi utilise le bus I2C pour échanger des données avec le Raspberry Pi moyennant le chip Semtech SC620 (voir datasheet). Pour activer le bus I2C dans Raspian, il faut ajouter les deux lignes

i2c-bcm2708
i2c-dev

à la fin du fichier /etc/modules. Pour ce faire, on peut utiliser l’éditeur nano sur Raspberry Pi. Pour sauver le fichier modifié, on pousse <Ctrl>+o, ensuite <Ctrl>+x pour quitter l’éditeur. La prise en compte des nouveaux modules se fait lors d’un reboot. Pour installer les outils i2c, il faut entrer les commandes

pi@raspberrypi ~ $ sudo apt-get install python-smbus
pi@raspberrypi ~ $ sudo apt-get install i2c-tools

Pour voir les modules connectés, on peut entrer la commande

pi@raspberrypi ~ $ sudo i2cdetect -y 1
Détection des modules connectés au bus I2C

Détection des modules connectés au bus I2C

On voit qu’un seul module avec l’adresse 0x70 est connecté, le Bright Pi. Pour piloter le module Bright Pi, on utilise la commande

i2cset [-y] i2cbus chip-address data-address value

Les paramètres sont :

  • -y : option pour désactiver le mode interactif (pas de confirmation nécessaire)
  • i2cbus : 1
  • chip-address : 0x70
  • data-address : 0x00 LED’s on/off; 0x01, 0x03, 0x06, 0x08 dimming IR LED’s couples; 0x02, 0x04, 0x05, 0x07 dimming white LED’s; 0x09 gain register
  • value : dimming values : 6 bit multipliers; gain values :0000 = 31,25 microampère; 1111 = 500 microampère; max = 25 millampère par LED

Quelques exemples sont montrés ci-après :

white LED1 12 mA : sudo i2cset -y 1 0x70 0x02 ...
white LED2 1 mA :
white LED3 
...

Clavier

Comme alimentation, j’utilise le chargeur d’une tablette qui fournit 2 ampères à 5 Volt. Lors de la première mise sous tension, le Raspberry se configure automatiquement. Il ne reconnaît toutefois pas le layout de mon clavier luxembourgeois QWERTZ (respectivement français-suisse) et il faut le modifier manuellement comme suit :

pi@raspberrypi ~ $ sudo raspi-config
raspi-config

raspi-config

Le menu 4 (International Options) donne accès sélections “Change Locale”, “Change Timezone” et “Change Keyboard Layout”. Mon clavier Microsoft Wired Keyboard 600 ne fait pas partie des claviers figurant dans la liste déroulante des modèles de clavier. J’ai choisi le clavier Generic 105-key (Intl) PC. Un layout luxembourgeois n’est pas relevé, le layout du clavier français-suisse figure parmi les layouts allemands. Faut le savoir !

Via le menu 4 on peut également changer le fuseau horaire (le Luxembourg figure sur la liste des pays européens) et la langue d’affichage, par exemple pour passer en français.

Remote Desktop

Avant de pouvoir entrer des commandes il faut faire un login au système. Les paramètres par défaut pour le login sont : user name = pi ; password = raspberry. L’adresse IP attribuée par DHCP est 192.178.1.60. Pour pouvoir piloter dans l’avenir ce Raspberry, et dans la suite ses confrères, à partir de mes ordinateurs connectés en réseau local, j’ai installé le service RDP (Remote Desktop Protocol) de Microsoft sur le Raspberry Pi :

pi@raspberrypi ~ $ sudo apt-get install xrdp

Après un redémarrage du Raspberry (commande sudo reboot ou sudo poweroff), le serveur xrdp sesman est configuré pour démarrer automatiquement lors de chaque mise sous tension.

Sur les ordinateurs Windows, le service RDP est disponible d’office et peut être démarré avec le menu Accessories/Remote Desktop Connection.

Microsoft Remote Desktop Connection

Microsoft Remote Desktop Connection

Après l’établissement de la connexion, le Raspberry retourne un avertissement

Avertissement

Avertissement RDP

et ensuite la fenêtre de login suivante (module sesman-Xvnc) :

XRDP Login Window

XRDP Login Window

Ici on découvre le prochain bug. Le clavier français-suisse de mon PC Windows n’est pas supporté par le service xrdp, mais il est interprété comme un clavier anglais. Il faut donc saisir le mot de passe raspberrz au lieu de raspberry pour réussir le login. Faut le savoir !

Support du clavier français-suisse par xrdp

Linux xrdp utilise par défaut le fichier keymap /etc/xrdp/km-0409.ini (us-english) si un fichier keymap non-existant est demandé. Il semble que le client Windows xrdp demande le keymap 20409 non disponible, indépendamment du clavier connecté. Le seul remède consiste à remplacer dans Raspian le fichier km-0409.ini par le contenu du fichier keymap du clavier utilisé. Dans mon cas il s’agit du fichier km-100c.ini (voir liste des keymaps).

On peut générer ce fichier avec la commande

pi@raspberrypi ~ $ sudo xrdp-genkeymap /etc/xrdp/km-100c.ini

Attention : il faut toutefois passer en mode graphique avec la commande startx et ouvrir le LXTerminal pour passer la commande, si non on obtient le message d’erreur << unable to open display ” >>.

Cliquez sur le fichier km-100c.ini pour visualiser son contenu. Il faut encore modifier le code de quelques touches qui ne sont pas reconnus correctement. Il s’agit notamment des combinaisons <alt-gr> et des touches curseur :

  • @
  • #
  • ~
  • ¢
  • ¬
  • up

Les touches mortes (dead keys) fonctionnent correctement.

Il suffit ensuite de renommer le fichier km-0409.ini en km-0409-old.ini et de copier le fichier km-100c.ini en km-0409.ini. Faut le savoir !

Applications

Après vérification de l’authenticité de l’usager, le desktop du Raspberry se présente sur l’écran et réagit aux commandes du clavier et de la souris.

Raspberry Pi's Desktop

Raspberry Pi’s Desktop

Les programmes et applications installés d’office sur le Raspberry Pi sont :

Je me propose d’ajouter les programmes suivants :

Pour activer la caméra, il faut passer dans le menu 5 (Enable Camera) de raspi-config. Pour tester la caméra et faire une première photo, on entre la commande

pi@raspberrypi ~ $ raspistill -o camtest1.jpg

Si la caméra est positionnée à l’envers, il faut tourner l’image de 180 degrés. Cela se fait aisément avec les options “vertical flip” et “horizontal flip”.

pi@raspberrypi ~ $ raspistill -vf -hf -o camtest2.jpg

Liens

Les liens suivants fournissent des informations additionelles concernant des projets Raspberry et le clavier XRDP :

Dependency Walker

Dependency Walker is a free utility that scans any 32-bit or 64-bit Windows module (exe, dll, ocx, sys, etc.) and builds a hierarchical tree diagram of all dependent modules. For each module found, it lists all the functions that are exported by that module, and which of those functions are actually being called by other modules. Another view displays the minimum set of required files, along with detailed information about each file including a full path to the file, base address, version numbers, machine type, debug information, and more.

Wikedia states that Dependency Walker was included in Microsoft Visual Studio until Visual Studio 2005 (Version 8.0) and Windows XP SP2 support tools. The utility was developed by Steve P. Miller, but is copyrighted to Microsoft. The latest version is 2.2.6000, released on October 29, 2006.

The following figure shows the dependencies of the TuxDroidServer program.

Dependency Walker version 2.2.6000, bny Steve P. Miller

Dependency Walker version 2.2.6000, by Steve P. Miller

 

Tux Droid Development

Last update : September 1, 2020

Referring to my recent post about the Tux Droid History, I would like to share my findings about the progress of the software development done by the community to keep Tux Droid alive.

Test environment

I use the following equipments to install and test the software :

1. PC Windows 7 64 bits

Windows 7 Edition Familiale Premium
Service Pack 1
Intel Core2 Quad CPU Q8400@2,66 GHz
RAM : 4 GB
Screen resolution : 1.024 x 768 pixels

2. PC Windows 7 32 bits

Windows 7 Edition Familiale Premium
Service Pack 1
Intel Pentium D CPU@2,66 GHz
RAM : 4 GB
Screen resolution : 1.280 x 1.024 pixels

3. Laptop Vista 32 bits

Windows Vista Home Premium
Service Pack 2
Intel Core2 DUO CPU T6400@2GHz
RAM : 4 GB
Screen resolution : 1.280 x 800 pixels

4. Laptop Linux Debian 32 bits

Gnome 3.4.2
Intel Core2 CPU U7500@1GHz
RAM : 1 GB
Screen resolution : 1.366 x 768 pixels

5. Tablet Samsung 2 7.0

Android Version 4.1.1
Dual Core Processor 1GHz
Memory : 16 GB
Screen resolution : 600 x 1.024 pixels (in portrait mode)

6. Tux Droid V2

Firmware : ?
5 ATMEL AVR microcontrollers
RAM : 128 MB

First Tests

Tuxbox 2.0

To start testing, I installed the binaries TuxBox_Setup_French_7_Vista.exe from the Tux Droid community depot on PC 1 and 2 and on Laptop 3. On Laptop 4, I installed the package tuxbox-French-TTS-3.1.4-i386.deb from the same website.

TuxBox 2.0 is running fine on all four equipements.

I uninstalled TuxBox 2.0 on the different computers before continuing the tests to avoid a mixing of libraries and files.

TuxDroidServer

Joël Matteotti developped the TuxDroidServer, using the TCP protocol, to manage the Tux Droid. I installed his Windows binaries TuxDroidServer-rev150-win32-binaries.zip on equipement 1, 2 and 3 and his Linux tarball TuxDroidServer-rev150-linux-i686-binaries.tar.gz on equipment 4. Here are the results of my tests :

  • PC 1 (Windows 7 64 bits) : works as expected, but only in compatibility mode XP service pack 3
  • PC 2 (Windows 7 32 bits) : works (with crashes) in normal or compatibility mode
  • Laptop 3 (Vista 32 bits) : crashes even before the server is started, in normal or compatibility mode (see following figure)
TuxDroidServer crash

TuxDroidServer crash

  •  Laptop 4 (Linux Debian 32 bits): Installation fails due to missing file libcurl.so.4. I was not yet able to find and install this shared library.

When the server is started on Windows, libtuxdriver version 29 is indicated. I expect to see version 30, referring to the documentation.

TuxDroidServer started

TuxDroidServer started

I don’t find any information about the warning concerning the STATUS FRAME.

TuxDroidClient

The window of the TuxDroidClient has fixed dimensions of 728 x 888 pixels and cannot be resized. I can only use it on PC 2 where the screen hight is sufficient to display the client window.

TuxDroidClient Error Message

TuxDroidClient Error Message

The error message displayed by the TuxDroidClient seems to have a problem with the character unicode.

Android Controller

I copied the Android package TuxDroidControler-1.3.0-Android-2.3.3, created by Joël Matteotti, to my Android Development workspace and installed it succesfully with the command

adb install bin/TuxDroidControler.apk

on my equipment 5 (Samsung tablet 2  7.0 ). After saving the IP address, port number and Tux key of the server in the app, it works as expected (knowing that it is still a proof of concept).

TuxDroid Android App

TuxDroid Android App

Next steps

In the next step I will try to set up a Tux Droid Development environment for Windows and Linux to compile the binaries from the SVN sources and to progress with my tests based on the most recent software revisions. I will also have a closer look at the firmware and at the driver updates and check if my Tux Droids have the latest firmware. Finally I will file all identified bugs in the Bug Tracker.

Debian Linux

Last update: December 25, 2021

En 2012 j’ai installé avec succès la distribution Debian Linux sur un ancien notebook Sony Vaio, avec clavier AZERTY, 1 MB RAM et processeur Centrino Duo. Dans le cadre d’un projet j’étais amené à compiler une librairie Java complexe sur base d’un fichier Rakefile. Comme la compilation échouait sous Windows XP, Vista et 7, je cherchais d’autres solutions pour progresser. Comme le créateur du fichier Rakefile effectuait ses développement sous Linux, je privilégiais la piste d’installation d’un nouveau système de développement Linux sur un ordinateur séparé comme première solution.

Linux

Linux est le nom couramment donné à tout système d’exploitation libre fonctionnant avec le noyau Linux. Le noyau Linux a été créé en 1991 par Linus Torvalds pour les compatibles PC construits sur l’architecture processeur x86. Depuis, il a été porté sur de nombreuses architectures et il est utilisé dans une très large gamme d’ordinateurs, de serveurs et de systèmes embarqués. Ses caractéristiques principales sont d’être multitâche et multi-utilisateur. Linux bénéficie d’une communauté de milliers de programmeurs qualifiés qui font évoluer le noyau et les paquets.

Commandes Linux

Linux dispose de centaines, voire de milliers de commandes. Une vue d’ensemble des commandes Linux les plus importantes a été publiée en 2021 par PC & Network Downloads (PCWDLD).

Linux Commands Cheat Sheet (PCWLDL)

PCWLDL publie des tutoriels et revues et fournit des conseils dans le domaine des technologies d’information, en particulier en relation avec des applications Linux/Ubuntu/Centos/Unix/Cisco etc.

Distributions Linux

Il existe plusieurs distributions Linux différentes, par exemple :

Debian Linux

Comme la distribution Debian est à l’origine de différentes autres distributions et considérée comme très stable, j’ai choisi cette variante de Linux pour la création du système de développement. Il y avait trois versions Debian à l’époque : stable = Squeeze, testing = Wheezy, development = Sid disponibles pour 12 architectures. La version Wheezy disponible il y a un an était 7.2, publiée le 12 octobre 2013. En 2015, la  version stable est Jessie.

J’avais téléchargé les images ISO officielles pour DVD pour l’architecture i386. Il s’agit des fichiers suivants :

  • debian-7.2.0-i386-DVD-1.iso
  • debian-7.2.0-i386-DVD-2.iso
  • debian-7.2.0-i386-DVD-3.iso
  • debian-update-7.2.0-i386-DVD-1.iso

Les fichiers ont été gravés sur DVD avec le programme Free ISO Burner. J’ai démarré le notebook Sony Vaio avec la première DVD installé dans le lecteur et suivi les instructions sur l’écran. Les fichiers iwlwifi-3945-1.ucode et iwlwifi-3945-2.ucode ont été demandés lors de l’installation. J’ai cherché ces deux fichiers sur Internet et chargé sur un stick USB. Les autres DVD ont été scannés par le système et l’insertion de l’une ou l’autre DVD dans le lecteur a été demandé en fonction de l’installation des différents paquets. J’ai du répéter l’installation plusieurs fois à cause d’erreurs de manipulation (try and error). Finalement le système était opérationnel et le desktop se présentait comme suit :

Debian Linux Desktop

Debian Linux Desktop

Je viens de faire début novembre 2014 la mise à jour de Wheezy sur la version 7.7 édité le 18 octobre 2014. Une mise à jour de maintenance a été effectuée le 4 avril 2015.

Signalisation de la disponibiltié d'un update

Signalisation de la disponibilité d’un update

Software Update

Software Update

Display Manager

Debian Linux supporte trois gestionnaires d’affichage principaux :

Lors du login, je peux choisir les gestionnaires suivants :

  • GNOME (= default)
  • GNOME Classic
  • KDE Plasma Workspace

Je préfère le gestionnaire GNOME pour l’affichage.

Permissions et Sécurité

Dans Linux tout fichier se voit attribuer des droits pour 3 identités :

  • le propriétaire – l’utilisateur qui a créé le fichier ou l’utilisateur que root a désigné comme propriétaire
  • le groupe (qui n’est pas forcément le groupe du propriétaire)
  • les autres (ceux qui ne font pas partie du groupe)

Pour chaque identité il existe 3 droits d’accès :

  • r – read (le droit de lecture)
  • w – write (le droit d’écriture)
  • x – execute (le droit d’exécution)

La commande ls -l nous permet d’afficher les droits d’un fichier. La commande chmod (CHangeMODe) permet de définir et de changer les droits d’accès d’un fichier ou d’un ensemble de fichiers. L’option -R permet de traiter les répertoires de façon récursive.

Lors de l’installation de Linux, on met en place au moins deux comptes :

  • Le compte root dont le nom est «root» et à qui on attribue un mot de passe. C’est le Superutilisateur ou l’administrateur du système.
  • Un compte utilisateur auquel on peut attribuer n’importe quel nom («mbarnig» par exemple).

La commande whoami affiche le nom du compte. En mode utilisateur, le terminal affiche l’invité de commande

mbarnig@debian:~$

A condition de connaître le mot de passe de «root», un utilisateur peut devenir super-utilisateur et tout faire sur le système, en entrant la commande su, validée par “Enter”. Le mot de passe est demandé, et après la saisie correcte, le terminal affiche l’invité de commande

root@debian:/home/mbarnig#

La commande sudo (Substitute User Do) est similaire, mais les droits sont plus limités. On n’a pas besoin d’entrer le mot de passe «root». En outre, la validité du rôle «root» est limité dans le temps, il y a une expiration automatique après 15 minutes.

gksu

commande gksu

Pour utiliser des applications graphiques en mode «root», on a recours aux commandes gksu et gksudo. Une autre manière de devenir superutilisateur est d’ouvrir le terminal «root». Pour quitter le mode «root», on entre la commande exit. Pour suspendre le système, on utilise le menu Suspend. Pour arrêter le système, on presse simultanément Ctrl-Alt-Del, afin d’afficher la fenêtre Power-Off.

Structure des fichiers

Linux voit ses disques comme une unique arborescence. Une partition contient la racine du système de fichier, qu’on note /. D’autres partitions (CD-ROM, memory stick, …) peuvent être montées dans des répertoires. La structure standard des répertoires est décrite par le FHS (Filesystem Hierarchy Standard).

Les répertoires racine sur mon système Debian sont :

  • bin – contient les commandes de base nécessaires au démarrage et à l’utilisation d’un système minimaliste
  • boot – contient les informations nécessaires au démarrage de la machine
  • dev – contient les fichiers spéciaux correspondant aux périphériques
  • etc – contient la plupart des fichiers de configuration
  • home – contient les répertoires personnels des utilisateurs. L’utilisateur mbarnig a pour répertoire /home/mbarnig (alias Home)
  • lib – contient les principales bibliothèques partagées
  • lost+found – contient les fragments de fichiers perdus après la réparation d’un disque endommagé
  • media – point de montage pour les médias amovibles
  • mnt – point de montage pour les systèmes de fichiers temporaires
  • opt – contient les logiciels commerciaux
  • proc – contient des fichiers avec des infos sur l’état du système et des processus en cours d’exécution
  • root – contient le répertoire de l’administrateur système
  • run – répertoire non standard pour centraliser les fichiers résidant en mémoire
  • sbin – contient les commandes de base nécessaires à l’administration système
  • selinux – Linux security module (LSM) qui permet de définir une politique de contrôle d’accès
  • srv – contient des données pour les services hébergés sur le système
  • sys – contient des données relatives au nouveau système de fichiers virtuels
  • tmp – contient les fichiers temporaires
  • usr – (UNIX System Resources) : contient des répertoires semblables à ceux présents à la racine mais qui ne sont pas nécessaires au fonctionnement minimal du système
  • var – contient des données fréquemment réécrites

Pour naviguer à la racine on utilise la commande

cd /

Pour chercher un fichier, on utilise les commandes

root path    : find / -name "filename"
current path : find . -name "filename"

On peut utiliser le joker (l’étoile *) avec des noms de fichier incomplets.

L’occupation du disque est indiquée avec le Disk Usage Analyzer.

Linux Disk Usage Analyzer

Path

Les commandes qu’on écrit au clavier dans le shell sont cherchées dans l’ordre des répertoires contenus dans la variable PATH. Son contenu est une chaîne qui contient les chemins des répertoires séparés par deux-points (:). Pour afficher le contenu de la variable PATH, on utilise la commande

echo $PATH

Sur mon système le contenu se présente comme suit, avec les options de formatage


mbarnig@debian:~$ echo $PATH | tr : \\n
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

Il a plusieurs scripts d’initialisation qui définissent les variables d’environnement, comme le PATH. Les plus usuels sont :

  • /etc/bash.bashrc  : script valable pour tous les utilisateurs, exécuté par une shell interactive lancée dans une session existante
  • /etc/profile  : script valable pour tous les utilisateurs, exécuté par une shell login qui demande UserID/Password, par exemple pour accéder au Desktop Debian lors du démarrage du système
  • ~/.bashrc  : script valable pour l’utilisateur identifié, exécuté par une shell interactive
  • ~/.profile  :script valable pour l’utilisateur identifié, exécuté par une shell login

Le caractère tilde ( ~ ) est utilisé pour spécifier le répertoire home d’un usager, comme par exemple /home/mbarnig. L’interprète de commande effectue la substitution

~/hello.txt  >> /home/mbarnig/hello.txt
~/hi.txt >> /home/hi.txt

Les scripts /etc/bash.bashrc, ~/.bashrc, etc/profile et ~/.profile sont des fichiers cachés qui ne sont visibles qu’avec l’option “show hidden files” dans le menu de l’explorateur de fichiers. La modification d’un fichier dans le répertoire /etc/ n’est possible qu’en “root”, par exemple avec la commande

gksu nautilus /etc/profile

Une shell login recherche les scripts ~/.bash_profile, ~/.bash_login et ~/.profile dans cet ordre. Par défaut, les deux premiers fichiers (~/.bash_profile et ~/.bash_login) ne sont pas présents sur Debian.

Une shell non-interactive est activée par un programme et n’exécute aucun des scripts énumérés ci-avant. Les usagers qui souhaitent utiliser la même configuration pour les shells logon et non-login peuvent charger (source) le script ~/.bashrc dans le script ~/.profile, respectivement le script /etc/bash.bashrc dans le script /etc/profile.

J’ai opté pour inclure tous les variables d’environnement (PATH, …) dans le script ~/bashrc. Ce script est lu le premier si on ouvre le terminal standard en tant que usager, c.à.d. si on n’est pas “root”.

Environnement de développement

J’ai installé les paquets ruby, rake, java, gcc et g++ avec les commandes suivantes dans le terminal de commande root :

root@debian:/home/mbarnig# apt-get install ruby1.9.1
root@debian:/home/mbarnig# apt-get install rake
root@debian:/home/mbarnig# apt-get install default-jdk
root@debian:/home/mbarnig# apt-get install gcc
root@debian:/home/mbarnig# apt-get install g++
root@debian:/home/mbarnig# apt-get install subversion
root@debian:/home/mbarnig# apt-get install scons
root@debian:/home/mbarnig# apt-get install libfltk1.3

En outre les paquets suivants ont été installés de la même manière : autoconf, automake, xorg-dev, freeglut3-dev. Pour tester l’environnement de développement, des programmes Hello World ont été compilés dans différentes langues de programmation.

Java

Le code suivant a été écrit avec l’éditeur gedit et enregistré comme fichier HelloWorld.java dans le répertoire Home/Java.

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World");
}
}

Avec la commande

mbarnig@debian:~$ javac HelloWorld.java

dans l’application Terminal, le programme a été compilé en HelloWorld.class. Le programme est exécuté ensuite avec

mbarnig@debian:~$ java HelloWorld

La compilation de la librairie Java avec le fichier Rakefile a été également exécutée correctement, en invoquant la commande rake dans le répertoire en question.

C++


Le code suivant a été écrit avec l’éditeur gedit et enregistré comme fichier helloworld.cpp dans le répertoire Home/C++.

#include <iostream>
using namespace std;
int main()
{
cout << "hello world\n";
return 0;
}

Avec la commande

mbarnig@debian:~$ g++ helloworld.cpp -o helloworld

dans l’application Terminal, le programme a été compilé en exécutable helloworld. Le programme est exécuté ensuite avec

mbarnig@debian:~$ ./helloworld

Gestion des paquets

Un paquet est un logiciel ou une partie d’un logiciel, qui a été préparé dans un format spécial, afin de faciliter sa recherche, la consultation d’informations à son sujet, ainsi que son installation et sa désinstallation. Ce paquet prend la forme d’un fichier avec un nom particulier : nom-du-logiciel_numéro-de-version_nom-de-l’architecture.deb. Un fichier paquet contient les binaires du programme ainsi qu’un certain nombre d’en-têtes. Le système de gestion des paquets de Debian est très performant et très facile à utiliser. Grâce à lui, les logiciels s’installent, se retirent et peuvent être mis à jour très facilement.

La commande de base pour manipuler des paquets Debian est dpkg. Elle ne peut toutefois pas télécharger des fichiers ou gérer des dépendances. Pour installer un paquet .deb disponible on utilise la commande

dpkg --install nom_paquet.deb

Lors de l’installation les différentes étapes et les erreurs éventuelles sont affichées. L’installation peur s’effectuer en deux temps comme suit

dpkg --unpack nom_paquet.deb
dpkg --configure nom_paquet.deb

On peut obtenir des informations sur les paquets avec les options suivantes :

  • dpkg –listfiles nom_paquet  (sans .deb) : liste des fichiers installés par un paquet
  • dpgk –search file : paquet d’où provient ce fichier
  • dpkg –status nom_paquet.deb : entêtes d’un paquet installé
  • dpkg –list : liste des paquets connus du système
  • dpkg –contents nom_paquet.deb : liste des fichiers contenus dans un paquet non-installé
  • dpkg –info nom_paquet.deb : entêtes d’un paquet non-installé
  • dpkg –remove nom_paquet.deb : suppression d’un paquet installé, sans les dépendances et fichiers de configuration
  • dpkg –purge nom_paquet.deb : suppression d’un paquet installé, avec les dépendances et fichiers de configuration

La commande dpkg tient un journal verbeux de toutes ses actions dans /var/log/dpkg.log.

À un niveau plus élevé, on trouve les commandes apt et apt-get (advanced package tool) tout comme un outil plus récent aptitude qui peut être utilisé en mode console où en mode graphique. aptitude est la commande recommandée pour gérer les paquets. On peut toutefois mélanger les commandes aptitude det apt-get. Une autre interface graphique est Synaptic.

Synaptic

Synaptic Package Manager

Une ancienne interface qui n’est plus recommandée est DSelect.

apt a besoin qu’on lui fournisse une liste de sources de paquets : c’est le fichier /etc/apt/sources.list qui décrira les différents emplacements (ou sources) publiant des paquets Debian. La liste des sites web miroirs qui distribuent les paquets Debian est disponible sur le site web de l’organisation Debian. Les archives Debian au Luxembourg sont hébergées sur les sites web debian.mirror.root.lu/ (root S.A.) et debian.mirror.lhisp.com/ (lhisp Luxembourg Hosting)

Un générateur en-ligne d’une liste source Debian est disponible sur le site web debgen.simplylinux.ch. Mon fichier /etc/apt/sources.list se présente comme suit :

deb http://ftp.de.debian.org/debian stable main 
contrib non-free
deb http://ftp.debian.org/debian/ wheezy-updates main 
contrib non-free
deb http://security.debian.org/ wheezy/updates main 
contrib non-free

Création d’un paquet .deb

Un paquet Debian n’est pas seulement une archive de fichiers destinés à l’installation, mais il contient également des méta-informations pour gérer les dépendances, les conflits, les suggestions, l’installation et la suppression des fichiers. Le fichier-méta le plus important est control. Un exemple simple pour intégrer le programme helloworld dans un paquet .deb est présenté ci-après :

Package: helloworld
Version: 1.0
Installed-Size: 1024
Maintainer: Marco Barnig - mbarnig@pt.lu
Architecture: i386
Section: custom
Priority: optional
Essential: no
Filename: helloworld.deb
Depends: bash
Description: affiche le texte "hello world" sur l'écran

Les paquets plus complexes utilisent en outre les paramètres suivants :

Recommends: dépendances facultatives (liste des paquets 
dont l'installation est recommandée pour que le système 
fonctionne correctement)
Suggests: autres dépendances facultatives 
Conflicts: liste des paquets qui peuvent entrer en conflit 
avec le paquet 
à installer 
Tag: clés de recherche 
Size: taille du paquet 
MD5sum: empreinte digitale du paquet (sécurité)

En plus du fichier control, le paquet Debian peut contenir un certain nombre de fichiers et de scripts appelés par dpkg à différentes étapes du traitement du paquet. Il s’agit des fichiers suivants :

preinst - ce script est exécuté préalablement l'installation 
du paquet
postinst - ce script est exécuté après l'installation 
du paquet
md5sums - liste des empreintes numériques de tous les 
fichiers du paquet
conffiles - liste des fichiers de configuration

Pour assembler le paquet, un répertoire mon_paquet est créé avec le contenu suivant :

/DEBIAN/control
/usr/bin/helloworld

Ensuite on peut générer le paquet avec la commande dpkg-deb :

dpkg-deb --build mon_paquet

On peut répertorier le nouveau paquet dans le répertoire Home avec la commande

find -name mon_paquet.deb

et l’installer avec la commande

dpkg -i mon_paquet.deb

Mise à jour

Le système de paquets utilise sa propre base de données pour garder une trace des paquets qui sont installés, de ceux qui ne sont pas installés et de ceux qui peuvent être installés. Le programme apt-get utilise cette base de données pour retrouver comment installer les paquets demandés par l’utilisateur ainsi que pour retrouver les paquets supplémentaires nécessaires afin qu’un paquet sélectionné fonctionne correctement. Pour mettre à jour cette liste, on utilise la commande

apt-get update

Cette commande vérifie la liste des paquets trouvés dans les archives dans /etc/apt/sources.list. La mise à niveau de paquets est effectuée avec la commande

apt-get upgrade

L’option -u oblige apt à afficher la liste complète des paquets qui seront mis à niveau.
Pour faire la mise à jour vers une nouvelle distribution, on utilise la commande

apt-get dist-upgrade

(distribution-upgrade). Cette commande est aussi utilisée pour faire la mise à niveau dans les dépendances des paquets installés. Les commandes

apt-get clean
apt-get autoclean

sont utilisées pour supprimer des paquets non-utilisés. Pour afficher la version installé d’une distribution Debian, on utilise la commande

cat /etc/debian_version

ou

lsb_release -a

De Wheezy à Jessie

La version 8.0 de Debian, connue sous le nom de Jessie, a été initialement publiée le 26 avril 2015. La version 8.6 a été publiée le 17 septembre 2016. Comme mon système actuel avait un problème de démarrage, j’ai du réinstaller fin 2016 la version originale de Debian 7 (Wheezy) à partir de mes DVD’s. Pour activer le WiFi, j’ai copié le fichier iwlwifi-3945-ucode à l’emplacement /lib/firmware. Ensuite j’ai procédé à un update / upgrade de Wheezy, suivi d’un changement de version en remplaçant “Wheezy” par “Jessie” dans la liste “/etc/apt/sources.list“.

Pour aller dans le mode terminal, entrez ctrl+alt+f1. Pour retourner dans le mode graphique, entrez ctrl+alt+f7.

Liens

La liste suivante fournit des liens vers des sites web avec des informations utiles au sujet de Linux :

ISO image

Free ISO image Burner

Free ISO image Burner

An ISO image is an archive file of an optical disc, a type of disk image composed of the data contents of every written sector of an optical disc, including the optical disc file system. The name ISO is taken from the ISO 9660 file system used with CD-ROM media. ISO image files usually have a file extension of .iso. ISO images are uncompressed and do not use a particular container format; they are a sector-by-sector copy of the data on an optical disc, stored inside a binary file.

ISO images can be created from optical discs by disk imaging software, from a collection of files by optical disc authoring software, or from a different disk image file by means of conversion. Software distributed on bootable discs (fox exampe Linux Debian) is often available for download in ISO image format.

ISO burner

To burn an ISO image to a CD or DVD, you need a disc image burner software. There are several such tools available. I use Free ISO Burner from SoftSea. This program is very simple and easy to use and hide all complex settings. The current version is 1.2, released on January 10, 2011.

File date before 1980

Last update : September 16, 2013

If files have a date before 1980, Windows Explorer shows a blank in the date column. This is the case for the created, modified or picture taken date. Sorting files or pictures by their real date taken is impossible. The correct date is however displayed in the properties box.

I you have a photo or video collection, the fact that files with a date before 1980 are not sorted as expected is an awesome problem which has not yet been solved in Windows 8. Since Windows itself did not exist before 1980, there seems to be a problem with creation or last modified date and time for a file stamped before that time.

Date created gives us the information about when the file was moved to a specific location. Date modified is about the date when the file was last modifie. The modified date can be prior to the creation date of a file.

The picture taken date is saved in the Exif metadata of a picture file. For videos, there exist no similar standardized property. Videos encoded with Apple Quicktime are stamped with proprietary metadata com.apple.quicktime.creationdate. The file creation or modification dates are used as timestamp for avi, mp4 and MOV video files.

Most photo or video tools however manage files with a date before 1980 as expected. I tested the following applications :

  • Synology PhotoStation
  • Synology VideoStation

 

WordPress taxonomies

In WordPress, a taxonomy is a grouping mechanism for posts. WordPress has three built in taxonomies : categories, tags and links. WordPress allows to create your own custom taxonomies which are an extremely powerful way to group various items in all sorts of ways.

I created the custom taxonomy Family for my family blog. The WordPress plugin Custom Post Type UI, developed by Brad Williams and Michael Beckwith, is a useful tool to manage custom taxonomies.

Additional informations about WordPress taxonomies are available at the following links :

WPtouch 3 Pro WordPress Taxonomy Support

Last update : July 20, 2013
I use the WPtouch 3 Pro plugin for my WordPress Family Blog, together with the User Access Manager (UAM) plugin, created by Alexander Schneider. I noticed that the taxonomy support of WPtouch 3 Pro does not work as expected. All categories and tags are displayed on the mobile without respecting the restrictions defined by the UAM plugin. The reason is that WPtouch retrieves the taxonomy informations directly from the database with an SQL request, instead of using the wordpress functions get_categories() and get_tags(). For categories WordPress even offers the function wp_list_categories() with formatting support.

Usually I don’t like to modify the core code of WordPress themes and plugins, but in this case the only feasible solution to solve this problem was to change the two functions wptouch_fdn_ordered_cat_list() and wptouch_fdn_ordered_tag_list() in the WPtouch 3 Pro theme foundation file plugins/wptouch-pro-3/themes/foundation/root-functions.php.

function wptouch_fdn_ordered_tag_list( $num, $include_count = true )

I changed the following code :

echo '<ul>';
$sql = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}term_taxonomy INNER JOIN {$wpdb->prefix}terms ON {$wpdb->prefix}term_taxonomy.term_id = {$wpdb->prefix}terms.term_id WHERE taxonomy = 'category' AND {$wpdb->prefix}term_taxonomy.term_id NOT IN ($excluded_cats) AND count >= 1 ORDER BY count DESC LIMIT 0, $num");
if ( $sql ) {
foreach ( $sql as $result ) {
if ( $result ) {
echo "<li><a href=\"" . get_category_link( $result->term_id ) . "\">" . $result->name;
if ( $include_count ) {
echo " <span>(" . $result->count . ")</span></a>";
}
echo '</a>';
echo '</li>';
}
}
}
echo '</ul>';

by the new code :

$args = array (
'orderby' => 'count',
'order' => 'DESC',
'exclude' => $excluded_cats,
'number' => $num );
$categories = get_categories($args);
echo '<ul>';
foreach ($categories as $category) {
echo '<li><a href="' .get_category_link($category -> term_id). '">' .$category -> name. '';
if ($include_count) {
echo '<span> (' .$category -> count. ')</span>';}
echo '</a></li>';}
echo '</ul>';

function wptouch_fdn_ordered_cat_list( $num )

I changed the following code :

echo '<ul>';
$sql = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}term_taxonomy INNER JOIN {$wpdb->prefix}terms ON {$wpdb->prefix}term_taxonomy.term_id = {$wpdb->prefix}terms.term_id WHERE taxonomy = 'post_tag' AND {$wpdb->prefix}term_taxonomy.term_id NOT IN ($excluded_tags) AND count >= 1 ORDER BY count DESC LIMIT 0, $num");
if ( $sql ) {
foreach ( $sql as $result ) {
if ( $result ) {
echo "<li><a href=\"" . get_tag_link( $result->term_id ) . "\">" . $result->name . " <span>(" . $result->count . ")</span></a></li>";
}
}
}
echo '</ul>';

by the new code :

$args = array (
'orderby' => 'count',
'order' => 'DESC',
'exclude' => $excluded_tags,
'number' => $num );
$tags = get_tags($args);
echo '<ul>';
foreach ($tags as $tag) {
echo '<li><a href="' .get_tag_link($tag -> term_id). '">' .$tag -> name. '<span> (' .$tag -> count. ')</span></a></li>';}
echo '</ul>';

The new code provides the same WPtouch features and functionalities as the old one and is fully compatible with the UAM plugin.

One disadvantage of core changes in a plugin is the need to replace the modified files when an automatic update of the plugin is done. This was the case in July  2013 when the new versions 3.0.5 and 3.0.6 were loaded.

Compressing Human Knowledge

Marcus Hutter, a German computer scientist and professor at the Australian National University, funded in August 2006 a 50.000 euros cash prize, which rewards data compression improvements on the first 100.000.000 characters of a specific version of English Wikipedia (envik8). Specifically, the prize awards 500 euros for each percent improvement in the compressed size of the file enwik8. The prize baseline was 18,324,887 bytes, achieved by PAQ8F, a free lossless data compression archiver. The contest is open ended and is open to everyone. The ongoing competition is organized by Marcus Hutter, Matt Mahoney and Jim Bowery.

The goal of the Hutter Prize is to encourage research in artificial intelligence (AI). The organizers believe that text compression and AI are equivalent problems. There is no general solution to achieve this goal because the descriptive complexity is not computable. In algorithmic information theory the measure of the computational resources needed to specify an object is called the Kolmogorov complexity, named after Andrey Nikolaevich Kolmogorov, a Soviet mathematician.