środa, 28 września 2011

Perl, MySQL i UTF-8

Strasznie dużo czasu zmarnowałem usiłując zmienić kodowanie w bazie MySQL na UTF i dopasować skrypty Perla do tej zmiany.

Przestawienie MySQLa na UTF-8 jest proste:


mysql -u www -p --default-character-set=utf8
CREATE database kpma CHARACTER SET utf8 COLLATE utf8_bin;

Baza kpma (użytkownika www) będzie kodowana w UTF-8. Można też określić domyślne kodowanie wszystkich baz w pliku konfiguracji MySQLa, tj. w pliku /etc/mysql/my.cnf (Debian):


[mysqld]
...
default-character-set = utf8

Trochę diagnostyki:


use kpma;
show variables like 'char%';
show table status;

select tytul from Utwor;
## jest OK -- na konsoli widać poprawne różne znaki diakrytyczne

Prawdziwa męka to było zmuszenie Perla do poprawnego traktowania danych UTF.

Trzy kluczowe dla poprawnego przetwarzania UTF sprawy to: 1) klauzula binmod (patrz poniżej); 2) klauzula use utf8 (jeżeli skrypt zawiera napisy kodowane w UTF); 3) wpisy mysql_enable_utf8/SET NAMES utf8 dotyczące MySQLa.

Szkielet skryptu Perla wygląda następująco:


#!/usr/bin/perl -w
# -*- coding: utf-8 -*- --
#
use strict;
use utf8; ## skrypt zawiera napisy kodowane UTF
use CGI qw(:standard);
use DBI;
binmode(STDOUT, ":utf8"); ## bez tego problemy z UTF

my $dbname = 'kpma'; ## Nazwa bazy
my $dbuser = 'www'; ## Nazwa użytkownika MySQL
my $dbpasswd = '??????'; ## Hasło dla $dbuser

my $dsn = "dbi:mysql:$dbname:localhost:3306";

my $dbh = DBI->connect($dsn, "$dbuser", "$dbpasswd", { ChopBlanks => 1 });
$dbh->{'mysql_enable_utf8'} = 1;
$dbh->do('SET NAMES utf8');

my $SQL = "SELECT tytul FROM Utwor WHERE id_kompozytor1 = 59 ORDER BY rok ";
##my $SQL = "SELECT nazwisko FROM Kompozytor ";

my $sth = $dbh->prepare($SQL);

$sth ->execute();

while ( my @piece = $sth->fetchrow_array() ) { print ">> @piece\n"; }

$dbh->disconnect || warn "Nie mogę zamknąć bazy $dbname\n";

Jeżeli skrypt korzysta (pobiera dane) z param() to koniecznie należy zastosować funkcję decode_utf8:


use Encode; ## param() trzeba dekodować

if (param()) {# -- Wypełniono formularz --
## http://ahinea.com/en/tech/perl-unicode-struggle.html
my $who = Encode::decode_utf8(param("kto"));

Działa nawet z dość starym Perlem:


$perl --version

This is perl, v5.10.0 built for arm-linux-gnueabi-thread-multi

Copyright 1987-2007, Larry Wall

środa, 14 września 2011

Wycieczka rowerowa do Brodnicy

W poprzednią sobotę/niedzielę (2/3 09. br.) pojechałem z Miśkiem na rowerach do Brodnicy (za Kartuzami) i z powrotem. Ślady są tutajtutaj.

Wojna za progiem...

10 maja 1941 roku Rudolf Hoess (formalnie zastępca Adolfa Hitlera, tj. człowiek który zostałby fuererem gdyby, przykładowo wodzowi coś zaszkodziło) wystartował z Augsburga a następnie wyskoczył ze spadochronem niedaleko Eaglesham w Szkocji. Został aresztowany i resztę wojny spędził w więzieniu.

Propaganda 3Rz tłumaczyła prostemu ludowi powyższy -- przyznajmy szokujący incydent (wiceprezydent Biden wyskakuje na spadochronie z F16 pod Teheranem) -- iż towarzysz partyjny Hoess zwariował (Goebbels uważał takie tłumaczenie za prostackie i niewiarygodne).

Minister finansów RP 14. 09 br (albo dzień wcześniej) palnął publicznie, ich zitiere: Rostowski przywołał na koniec swą niedawną prywatną rozmowę z ,,prezesem wielkiego polskiego banku'', pracującym w ministerstwie za czasów transformacji w Polsce. Miał on mu powiedzieć, że po takich wstrząsach gospodarczych i politycznych, jakie teraz dotykają Europę, ,,rzadko się zdarza, by po 10 latach nie było także katastrofy wojennej''. I -- jak mówił minister -- ten prezes banku dodał, że ,,poważnie się zastanawia nad tym, by uzyskać dla dzieci zieloną kartę w USA''.

I co teraz na to Ministerstwo Propagandy, Oświecenia publicznego i Informacji?

Założenie repozytorium na github

Konfiguracja Gita

  1. Konfigurowanie kluczy SSH.

    Połącz się z https://github.com/<username>. Kliknij w Account SettingsSSH Public KeysAdd another public key. Skopiuj zawartość pliku id_rsa.pub do odpowiedniego pola tekstowego.

    (Uwaga: w dokumencie Set Up Git jest opisane dokładniej jak wygenerować id_rsa.pub.)

  2. Określenie użytkownika oraz jego adresu email.


    $ git config --global user.name "Firstname Lastname"
    $ git config --global user.email "your_email@youremail.com"

  3. Konfigurowanie GitHub token.

    Pobierz tokenAccount SettingsAccount Admin. Wykonaj poniższe:


    $ git config --global github.user username
    $ git config --global github.token 0123456789yourf0123456789token

    Uwaga: zmiana hasła wymaga aktualizacji tokena.

Utworzenie repozytorium

Kliknij w https://github.com/repositories/new (poprzez DashboardNew Repository).

Stwórz plik README (zalecane)


$ mkdir ~/Hello-World
$ cd ~/Hello-World
$ git init
$ touch README

## przeslanie do lokalnego repo
$ git add README
$ git commit -m 'first commit'

## przeslanie na github
$ git remote add origin git@github.com:<username>/Hello-World.git
$ git push origin master

Przykład

Repozytorium zawierające przykłady z książki Praca magisterska ...


$ git init
Initialized empty Git repository in /home/tomek/Projekty/LaTeX/text/book-examples-git/.git/
$ git add *
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
...

$ git commit -m 'first commit'
$ git remote add origin git@github.com:hrpunio/pmdzpl.git
$ git push -u origin master

Repozytorium zawierające przykłady dot. akceptacji Oprogramowania Open Source


$ git init
Initialized empty Git repository in /home/tomek/Projekty/HP/hbook/aoos-data-git/.git/
$ git add *
$ git commit -m 'first commit'
$ git remote add origin git@github.com:hrpunio/aoos.git
$ git push -u origin master
$ git status

poniedziałek, 12 września 2011

Fixing /dev/ttyUSB0 permissions for GPSBabel in fedora 15 (revisited)

Having fixed Garmin-babel communication some time ago I have encountered similar problem with another GPSdevice, namely MTK's BT747 logger. This time fixing the problem was simple.

I added the following to the /etc/udev/rules.d/51-garmin.rules:


SYSFS{idVendor}=="10c4", SYSFS{idProduct}=="ea60", MODE="0666"

Vendor ID and product ID can be figured out inspecting dmesg log:


# connect the device first
dmesg | less

So my /etc/udev/rules.d/51-garmin.rules file looks like in the following listing:


SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="0666"
SYSFS{idVendor}=="10c4", SYSFS{idProduct}=="ea60", MODE="0666"

One has to remember to stop/remove gps demon (gpsd).