15 Nov 2008

Umiem po arabsku - jedno słowo

Ostatnio się dowiedziałem, że się nie znam, a jako że arabski bardzo fajny język: Słowo "kochanie" wyraża się następująco:
  • do kobiety sie mowi: habibati
  • do mężczyzny: habibi
człowiek się uczy całe życie ;). Mi się mylnie wydawało, że mówi się "habibti" ;). Nawet tłumacz Google coś wymyślił zacytuje:

حبي

ale jak to mam przeczytać?

Perl i UTF + Locale

Czasami ja nie rozumiem jak działa Perl, dziś jest jeden z takich dni:


Oba kody robią to samo, jeden z localami drugi bez:
Code 1 - test.pl
#!/usr/bin/perl

use utf8;
use warnings;
use strict;
use locale;
#use POSIX q(setlocale);
#setlocale(&POSIX::LC_ALL, "pl");

# Uzywamy funkcji do kodowania/dekodowania
# utf8::encode($string);
# utf8::decode($string);

die "$0 testfile.txt" if scalar @ARGV <= 0; 

# pobieram caly plik
open( FH, '<', $ARGV[0] ) or die "Error: usage $0 file\n\n";
my $txt = do { local ($/);  };
close(FH);


utf8::decode($txt);
my @words = $txt =~ m/\w+/g;
map { utf8::encode($_) } @words;
print join(", ", @words)."\n";

Code 2 - test2.pl
#!/usr/bin/perl

use utf8;

use strict;
use warnings;

#use locale;
#use POSIX q(setlocale);
#setlocale(&POSIX::LC_ALL, "pl");
use open ':encoding(utf8)';
#use open ':locale';

die "$0 testfile.txt" if scalar @ARGV <= 0;

# pobieram caly plik
open( FH, '<', $ARGV[0] ) or die "Error: usage $0 file\n\n";

# tak samo jak use open 'encoding...'
#binmode FH, ":encoding(utf8)";
my $txt = do { local ($/);  };
close(FH);

my @words = $txt =~ m/\w+/g;
map { utf8::encode($_) } @words;
print join(", ", @words)."\n";

Wyniki:
$ locale
LANG=pl_PL.UTF-8
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=
$ cat input.txt
ęł@ąóąłð
łąśk
ala_ma_kota
$ perl test.pl input.txt
ęł, ą, ął, łąśk, ala_ma_kota
$ perl test2.pl input.txt 
ęł, ąóąłð, łąśk, ala_ma_kota

Tak na moje oko wyniki ze skryptu numer 2 są poprawne, ale dlaczego? Heh, czyżby ustawienie locali twierdziły, że ó nie jest litera słowa? No nie ważne, zapewne jakimś rozwiązaniem mogło by być ustawienie:
use POSIX qw(locale_h);
setlocale(LC_ALL,"pl_PL.UTF8");
ale mi się tego robić nie chciało :) Znalazłem tutorial o perlu i polskich znakach, może komuś pomoże - ja go nie stosowałem - w zupełności wystarczyła mi pragma use utf8;.

14 Nov 2008

Sun Java JRE/JDK 1.6u10 on Debian

Wszystko co robisz, robisz na własną odpowiedzialność - u mnie to zadziałało: Niedawno pojawiła się wersja 10 JDK 1.6 Suna, w Debianie nie mogę się doczekać paczki. A nowości w Javie są fajne: interfejs Nimbus, przepisany plugin do przeglądarki.
Chciałem zbudować Javę normalnym narzędziem, czyli fakeroot + make-jpgk w przypadku Javy, ale się nie udało bo to update 10 a nie 0-9. Nie dając za wygraną rozwiązałem problem, oto solucja:
apt-get install fakeroot java-package
Następnie, trzeba edytować pliki:
  • /usr/share/java-package/sun-j2sdk.sh
  • /usr/share/java-package/sun-j2re.sh
dodając do nich:
w przypadku pliku: /usr/share/java-package/sun-j2sdk.sh
## To odnajdujemy:

        "jdk-6u"[0-9]"-linux-i586.bin") # SUPPORTED
            j2se_version=1.6.0+update${archive_name:6:1}${revision}
            j2se_expected_min_size=130
            found=true
            ;;

## A to dodajemy:
        "jdk-6u"[0-9][0-9]"-linux-i586.bin") # SUPPORTED
            j2se_version=1.6.0+update${archive_name:6:2}${revision}
            j2se_expected_min_size=130
            found=true
            ;;


natomiast w przypadku: /usr/share/java-package/sun-j2re.sh

# To odnajdujemy:
       "jre-6u"[0-9]"-linux-i586.bin") # SUPPORTED
            j2se_version=1.6.0+update${archive_name:6:1}${revision}
            j2se_expected_min_size=16 # 16542512 bytes
            found=true
            ;;
# To dodajemy:
        "jre-6u"[0-9][0-9]"-linux-i586.bin") # SUPPORTED
            j2se_version=1.6.0+update${archive_name:6:2}${revision}
            j2se_expected_min_size=16 # 16542512 bytes
            found=true
            ;;
Następnie na plikach pobranych ze strony Suna uruchamiamy operację (nie jako root):
fakeroot make-jpkg jdk-6u10-linux-i586.bin
fakeroot make-jpkg jre-6u10-linux-i586.bin
Wybudują nam się paczki, które instalujemy korzystając z polecenia dpkg (jako root oczywiście):
dpkg -i *.deb
W chwili obecnej należy jeszcze ustawić odpowiednią wersje Javy, korzystając z update-alternatives:
update-alternatives --config java
update-alternatives --config javac
To są hinty co wybrać:
  • /usr/lib/j2re1.6-sun/bin/java
  • /usr/lib/j2sdk1.6-sun/bin/javac
pilum:/home/johny# java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)
Niestety w przeglądarce Java się (przynajmniej mi nie zaktualizowała - spójrz na stronę about:plugins), więc muszę to zrobić ręcznie:
ln -s /usr/lib/j2re1.6-sun/plugin/i386/ns7/libjavaplugin_oji.so /usr/lib/firefox/plugins/libjavaplugin.so

ln -s /usr/lib/j2re1.6-sun/plugin/i386/ns7/libjavaplugin_oji.so /usr/lib/iceweasel/plugins/libjavaplugin.so
po wpisaniu about:plugins odnajdujemy: Java(TM) Plug-in 1.6.0_10-b33 lub wchodzimy na strone: www.java.com/en/download/installed.jsp W razie problemów, polecam zajrzeć na:
  1. http://www.debian-administration.org/articles/142
  2. http://wiki.osuosl.org/display/DEV/Java+on+Debian
  3. http://wiki.debian.org/JavaPackage
  4. http://www.crazysquirrel.com/computing/debian/java.jspx

Intel 945 - Direct Rendering Howto

Na początek zainstalowałem parę pakietów:
apt-get install libgl1-mesa-dri\
libgl1-mesa-dev\
libgl1-mesa-glx\
mesa-utils\
xserver-xorg-video-intel
Uaktualniłem config serwera X (/etc/X11/xorg.conf): Wpierw próbowałem skorzystać z nowszych sterowników "eksperymentalnych" Intela:
Section "Device"
        Identifier      "Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller"
        Driver          "intel"
        BusID           "PCI:0:2:0"
EndSection


Section "Screen"
        Identifier      "Default Screen"
        Device          "Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller"
        Monitor         "Generic Monitor"
        DefaultDepth    24
        SubSection "Display"
                Modes           "1280x800"
        EndSubSection
EndSection
U mnie te sterowniki nie działały, ale jak masz czas i chcesz potestować, możesz rozpatrzyć opcję (powinny się znaleźć w odpowiednich opcjach xorg - ja ich nie próbowałem):
 Option  "UseFBDev"  "true"
 Option  "DRI"   "true"
 Load  "glx"
Na swoim komputerze szybko zmieniłem taktykę i wykorzystałem sterowniki i810:
apt-get install xserver-xorg-video-i810
a configa Xorg-a poprawiłem następjąco:
Section "Device"
        Identifier      "Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller"
        Driver          "i810"
        BusID           "PCI:0:2:0"
 VideoRam 262144
 Option  "UseFBDev" "true"
EndSection

Section "Extensions"
 Option "Composite" "Disable"
EndSection
Narzędzia z których korzystałem:
  • lspci | grep Graphics
     00:02.0 VGA compatible controller: Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (rev 03)
     00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03)
     
  • xdriinfo
     Screen 0: i915
     
  • glxinfo
     # TAK JEST ŹLE:
      $ glxinfo | grep direct
      direct rendering: No (If you want to find out why, try setting LIBGL_DEBUG=verbose)
    
     # Chcemy więcej info:
      $ export LIBGL_DEBUG=verbose
      $ glxinfo | grep direct
     
     # A tak jest dobrze:
      $ glxinfo | grep direct
      direct rendering: Yes
     
  • xrandr
  • glxgears
Inne instrukcje są dostępne: Problemy:
  • Compiza nie uruchamiałem - nie przepadam za glutożelkami
  • Google Earth - dalej zjada mi cały procesor (ale nie wiem czemu) zmieniłem jakość renderowania jest troszkę lepiej

2 Nov 2008

Ecartis, Gmail and UTF

Jakiś czas temu kolega (pozdrawiam Cię Skrobul) założył listę mailingową bo mieliśmy wspólny projekt na studiach - osób było 12, wszystkim wszystko działało, ale oczywiście nie mi. Ecartis nie dekodował mojego tekstu, wciąż on pozostawał jako Base64 (czyli był scrambled). Po dłuższej walce z plikami konfiguracyjnymi zostałem poinformowany, że już wszystko działa :D. Oczywiście jako, że jestem ciekawską duszą to chciałem się dowiedzieć jakie ustawienie było za to odpowiedzialne:

I sie dowiedziałem:

# humanize-mime
# Should the server strip out non-text MIME attachments.
# Example: humanize-mime = true
#
humanize-mime = false

27 Oct 2008

Windows disable write to USB stick

Jakieś dwa lata temu zapisałem się na listę dystrybucyjną newslettera Microsoftu - AcademicFlash. W ostatnim z nich znalazłem fajnego tipa, jak zablokować zapis na kluczach USB w Windows XP (przydatne jeśli wiemy, że mamy szkodnika a nie chcemy by się rozpowszechniał).
Oto solucja jaka została przedstawiona w tym newsletterze:
Aby zablokować możliwość zapisu na kluczach USB należy:
  1. Uruchomić edytor rejestru (Start > Uruchom, wpisz regedit i kliknij OK.
  2. Znajdź klucz HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\
  3. Wybierz wartość StorageDevicePolicies i stwórz w niej wartość DWORD (Nowy > Wartość DWORD) o nazwie WriteProtect
  4. Kliknij na nowo stworzonej wartości prawym klawiszem myszy i wybierz Modyfikuj
  5. W polu wartość wpisz 1
  6. Uruchom ponownie system.

29 Sep 2008

Eclipse IDE

Wybór odpowiedniego środowiska programistycznego nie jest rzeczą łatwą, w przeciągu ostatniego roku IDE (Integrated Developement Enviroment) powstało bardzo wiele, jednym z ciekawszych jest Eclipse.

Projekt ten powstał już parę lat temu pod auspicjami firmy IBM. W chwili obecnej najnowsza wersja Eclipse to 3.40.0 nosi kodowa nazwę Ganymede. Środowisko to jest o tyle ciekawe, że posiada relatywnie lekki rdzeń, do którego są włączane komponenty (pluginy). W chwili obecnej korzystam z Eclipsa do pisania programów w Javie (domyślnie instalowane), Perlu (Epic), Pythonie(PyDev), LaTeX(TeXclipse) i planuję zainstalować dodatek ułatwiający tworzenie skryptów shellowych. Różnorodność wspieranych języków nie jest jedyną zaletą tego projektu, dzięki elastycznemu systemowi pluginów można, korzystać bezpośrednio z systemu kontrolowania wersji takiego jak CVS, SVN i zapewne paru innych systemów wersjonowania oprogramowania, a także do modelowania baz danych (ERD), oraz modelowania w języku UML.

Dzięki takiej różnorodności dodatków (większość z nich można ściągnąć z Eclipse Central) możliwe jest posiadanie jednego środowiska do rozwijania programów w wielu językach, a także do opracowywania dokumentacji. Takie rozwiązanie ma swoje ogromne zalety, jedną z nich jest jednokrotne uczenie się skrótów klawiszowych, które powinny działać w każdym pluginie Eclipse.

Eclipse pozwala także na tworzenie swego rodzaju odnośników, czyli adnotacji. Adnotacją może być każdy znacznik, który jest wstawiany w edytorze (przez nas, bądź automatycznie). Przykładem może być sytuacja, gdy wyszukujemy wzorca w pliku - miejsca w których został znaleziony interesujący nas łańcuch znaków są oznaczone na marginesie edytora, a więc są adnotacjami :).

Na początku przygody z Eclipse zapamiętanie tych najpotrzebniejszych stanowi pewien problem, dlatego postanowiłem sobie zapisać te najpotrzebniejsze.

Nawigacja
Ctrl F6Przełączanie się między otwartymi edytorami
Ctrl WZamknij plik
Ctrl OLista klas i metod w pliku
Ctrl TWyświetlenie hierarchii klasy
Ctrl Shift strzałka w góręPrzeniesienie do następnej klasy/metody
Ctrl Shift strzałka w dółPrzeniesienie do poprzedniej klasy/metody
Ctrl . (kropka)Przeniesienie do następnej adnotacji
Ctrl , (przecinek)Przeniesienie do poprzedniej adnotacji
Uruchamianie programów
Ctrl F11Uruchomienie ostatnio uruchamianego
F11Debuggowanie ostatnio uruchamianego
Ctrl Shift BZbuduj/Skompiluj aktualny porjekt
Wyszukiwanie
Ctrl FWyszukiwanie w bierzącym pliku
Ctrl JWyszukiwanie inkrementalne
Ctrl HWyszukiwanie we wszystkich (bądź wybranych) plikach lub projektach
Asystent kodu
Ctrl SpacePokazuje podpowiedź asystenta
Ctrl 1 (jeden)Szybka podpowiedź rozwiązania problemu (Quick Fix)
Ctrl TabPokaż listę dopełnień
Ctrl Shift SpacePodpowiedź parametrów metody
F2Pełna dokumentacja klasy/metody (kursor musi być nad klasą bądź metodą)
Ctrl Shift PZnajdź pasujący nawias (podświetlenie go)
Formatowanie kodu
Ctrl IPoprawienie wcięć w kodzie
Ctrl Shift FFormatuj kod
Ctrl /Zakomentuj zaznaczony fragment kodu
Ctrl \Odkomentuj zaznaczony fragment kodu
Alt /Zakomentuj/Odkomentuj blok kodu (Epic)
Inne
Ctrl Shift LPomoc kontekstowa
Ctrl Shift 6Sprawdź pisownie
Esq QZawijanie wierszy w zaznaczonym kawałku tekstu (TeXclipse)
to chyba na tyle w tym temacie ;)

25 Sep 2008

GPG error: public key is not available

Chyba nigdy nie zapamiętam co z tym zrobić :). Wszystkie operacje przedstawione w tym tekście wykonujemy z konta administratora, lub poprzedzamy sudo (dla tych co mają ubuntu i sobie nie zrobili konta roota).
W: GPG error: http://.... testing Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY KEY_ID
Instalujemy z repozytorium pakiet debian-keyring (GnuPG (and obsolete PGP) keys of Debian Developers). A następnie pobieramy klucze GPG z serwerów:
gpg --keyserver wwwkeys.eu.pgp.net --recv-keys KEY_ID
gpg --armor --export KEY_ID | apt-key add -
i w końcu nie ma tego ostrzeżenia ;). Jeśli na wybranym key serwerze nie było kluczy to należy poszukać innego. Oto lista serwerów kluczy:
  • wwwkeys.eu.pgp.net
  • wwwkeys.pgp.net
  • keyring.debian.org/
  • search.keyserver.net
  • pgp.ai.mit.edu
Jeśli klucz nie może zostać z pobrany na podstawie tych serwerów, można spróbować odnaleźć na stronie repozytorium sygnaturę do GPG, jak ma to miejsce przypadku Google.
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
Może teraz zapamiętam :).

17 Sep 2008

Perl File::Basename dlaczego używać?

Często pisząc skrypty w Perlu, wymagam od użytkownika podania pliku wejściowego do przetworzenia i nazwy pliku wyjściowego/katalogu w którym mają powstać wyniki.

Ta druga wartość bardzo często może zostać wygenerowana na podstawie informacji o nazwie pliku, który należy przetworzyć. Można to zrobić na wiele sposobów, oto niektóre z nich (od siebei dodam, że wszystkich 3 używałem, ale najlepszy wydaje mi się sposób 3).
Oto kod:
#!/usr/bin/perl

# Purpose: Why we should use libraries in Perl?

use strict;
use warnings;

use File::Basename;

my $inputFilePath = "/home/johny/projects/someSampleFile.txt";
my $outDirName ;

# --
print "# version without additional modules\n";
my $ipf1 = $inputFilePath;
$ipf1 =~ /(.*\/+?)?(.*)$/;
$ipf1 = $2;
$ipf1 =~ s/\.\w{0,3}$//g;
$outDirName = $ipf1;
print $outDirName."\n\n";
# --

# --
print "# version with File::Basename::basename\n";
my $ipf2 = File::Basename::basename($inputFilePath);
$ipf2 =~ s/\.[a-zA-Z]+$//g;
$outDirName = $ipf2;
print $outDirName."\n\n";
# --

# --
print "# version with File::Basename::fileparse (3 things done!)\n";
my ($bFName, $path, $ext)  =   File::Basename::fileparse($inputFilePath, qr/\.[^.]*/);
print $bFName."\n\n";

__END__

=head1 See also

http://search.cpan.org/~rgarcia/perl-5.10.0/lib/File/Basename.pm
Oraz wyniki jego działania:
johny@pilum:~/stuff$ perl basename.pl 
# version without additional modules
someSampleFile

# version with File::Basename::basename
someSampleFile

# version with File::Basename::fileparse (3 things done!)
someSampleFile

5 Aug 2008

rsync / scp resume

Czasami każdy z nas zmuszony jest przesłać po zawodnym połączeniu dużą ilość danych (czy to w MB, czy w ilości plików) w sposób bezpieczny, ale jak to zrobić kiedy "Charyzjusze" sniffują hasła z ftp? Jednym ze sposobów jest wykorzystanie standardowych narzędzi systemu Linux:
  • rsync
  • ssh(d)
Rozwiązaniem problemu jest następująca komenda:
rsync -avzP --rsh=ssh uname_remote_srv@addr_remote:~/dir_to_get .
Jeśli demon ssh rezyduje na innym porcie niż standardowy (22), można zrobić to tak:
rsync -avzP --rsh="ssh -p port" uname_remote_srv@addr_remote:~/dir_to_get .
Co robią te opcje?:
        -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
        -v, --verbose               increase verbosity
        -z, --compress              compress file data during the transfer
        -P                          same as --partial --progress
Po dokładniejsze opcje zapraszam do zapoznania się z manualem rsynca (man rsync).

By wysłać dane na jakiś serwer wystarczy zamienić kolejnością ścieżki ;).

Największą zaletą prezentowanego rozwiązania jest wznawianie dużych transferów (nawet z klientów ftp/scp jeśli plik nie był dzielony na segmenty) - tym zajmuje się rsync. Inną zaletą jest to, że po wygenerowaniu kluczy ssh dalej nie trzeba pamiętać haseł. Taki zestaw opcji może posłużyć też do synchronizacji katalogów, ale tylko w jedną stronę ;).

26 Feb 2008

Co z tym Gentoo

Taki artykuł znalazłem w nowym Linux+ Co z tym Gentoo?
Kryzys tej dystrybucji można było zauważyć gołym okiem już od dawna. Środowisko developerów coraz to bardziej dzieliło się, panował ogólny marazm i brak konkretnego celu w rozwoju. Świetnym przykładem są polskie serwisy poświęcone Gentoo. Mimo nie najgorszego zaangażowania użytkowników, coś na nich kuleje. Poza tym sytuacja, w której przez kilka miesięcy niedostępna jest lista repozytoriów, świadczyć może o zbliżaniu się nieubłaganego końca. Szkoda by było, bowiem Gentoo jest jedną z najbardziej wyrazistych i mających wiernych fanów dystrybucji. Wydaje się, że organizacja czuwająca nad rozwojem dystrybucji sama przeżywa poważne problemy. Jej strona nie była przez wiele miesięcy aktualizowana, odwołano nawet statut, nie uchwalając nowego. Na ratunek wyruszył twórca dystrybucji Daniel Robbins, który przez wiele lat pełnił również stanowisko Chief Architect w Gentoo Foundation. Popularny niegdyś Robbins zaproponował poszukiwanie światełka w tunelu zagubionej społeczności. Wydaje się jednak, że nieco przeliczył się z oceną stanu bierności środowiska i swojej własnej popularności.

Jego pomysły były takie (wtrącenie autora bloga):
  • Fundacja Gentoo będzie odpowiedzialna za stan społeczności Gentoo, jej glówną misja będzie propagowanie, edukowanie i doradzanie użytkownikom w zakresie tworzenia oprogramowania w wolnych środowiskach.
  • Fundacja będzie odpowiedzialna za wskazywanie kierunków rozwoju i pomoc w tworzeniu projektu Gentoo.
  • Fundacja będzie odpowiedzialna za to, ze wszyscy developerzy użytkownicy i współtwórcy zewnętrznych projektów opartych o system Gentoo Linux bedą mieli swój udział w tworzeniu systemu iw sposób jasny i czysty.
  • Fundacja będzie zajmowała się kwestiami legalnościowymi, licencyjnymi wspólnie ze spolecznością
  • Fundacja Gentoo pomoże stworzyć pozytywne i mile środowisko dla wszystkich osób chcących przystąpić do projektu Gentoo.
cd: artykułu z Linux+
Jakby nie patrzeć, jego propozycja nie spotkała się z aklamacją społeczności w stanie rozpadu, lecz kontrowersyjną awanturą. Kto wie, może takie przebudzenie przyczyni się wreszcie do przełamania stagnacji w formułowaniu celów dystrybucji. Ofertę możecie znaleźć na http://blog.funtoo.org/2008/01/here-my-offer.html

Co o tym myślę:

Robbins sam zaangażował się w projekt Sabayon Linux - jako pochodną dystrybucji Gentoo bo opuścił projekt G..

Co więcej, ostatnio wygląda na to że developerzy mojej ulubionej dystrybucji nie mają chęci do pracy, albo robią coraz to mniejsze update w paczkach (bardzo częste - moim zdaniem nie wnoszące niewiele) w kolejnych wersjach, a wymagające kompilacji.
Ja nie jestem zbyt użytkownikiem Linuxa - lubię jak działa i nie mam dużo roboty z nim (ostatnio z Gentoo tak nie jest - gałąź ~x86). Niestety jako, że korzystam z gałęzi testowej nie powinienem narzekać ale litości po co wydawać co tydzień kolejną wersję pakietu różniącą się tylko numerkiem release, co więcej gałąź stabilna tak naprawdę nie pozwala mi zbudować systemu chociaż trochę podobnego funkcjonalnością do Debiana.

Co by należało zmienić:

  • Update dużych paczek powinny być jasno zdefiniowane, kompilacja nowych pakietów powinna być wymuszane jedynie jeśli zostały poprawione błędy bezpieczeństwa.
  • Każdy pakiet powinien mieć parę releasów, ale nie musi być wymagana aktualizacja co nowy release.
  • Emerge powinno mieć opcję wyświetlania co tak naprawdę zostało zmienione w pakiecie od wersji X pakietu, do wersji Y.
  • Zależności w ebuildach powinny zostać jasno sprecyzowane i ich zmiana nie powinna pociągać za sobą potrzeby rekompilacji pakietu (użytkownik któremu był potrzebny pakiet sam się dowie od czego był zależny pakiet i wyśle info na bugzille)
  • Wersje programów które nie mają pewnych funkcjonalności będących w starych wersjach powinny być tzw hard-masked
  • Instalacja systemu powinna być dostępna jedynie w dwóch wersjach, czyli:
    • stage 1
    • stage 3
  • Instalator systemu nie jest wymagany
  • Defaultowo w bootloaderze livecd powinno istnieć możliwość podania hasła i wyspecyfikowania czy ssh zostanie uruchomione
  • Wsparcie dla konsol szeregowych na live cd
  • Dołączenie dokumentacji do livecd
Mimo wszystko takie podejście nie gwarantuje sukcesu dystrybucji - bo Gentoo jest bardzo specyficzne, ale za to świetnie może służyć do budowania tzw livecd na konkretną architekturę. Oprócz tego jest to system bardzo dobry dla developerów, ponieważ cała dokumentacja jest od razu instalowana, szkoda że nie można jej paczkować oddzielnie z binariami.
Gentoo zaczyna mnie irytować.

25 Feb 2008

Gadu-Padu kradzież numerka

Żyję w Polsce, kraju wyjątków i paradoksów - chciałbym aby to było wiadome od razu na początku. Do niedawna byłem posiadaczem "elitarnego", "błyszczącego" czterocyfrowego numeru Gadu-Dudu, niestety pewnego pięknego dnia, a właściwie nocy ktoś mi zmienił hasło. Nie było by w tym nic dziwnego, jeśli nie to, że hasło miało 9 znaków. Co lepsze mogło być wygenerowane słownikowo. Każdy czytający powie "sam sobie jesteś winien". Po części się zgodzę z tym stwierdzeniem, ale chciałbym zauważyć że Operator Sieci Gadu-Gadu nie narzuca w żaden sposób polityki dobrych haseł! Co więcej nie ma limitu zapytań o hasło dla IP (TAAK!!! nie ma!!! niech żyją słowniki i brute-force), co więcej użytkownik którego konto może być atakowane metodą słownikową / bruteforce nie dostaje o tym żadnego monitu!!!. No ale to właściwie nie jest ważne ... przejdźmy do sedna, czyli kontaktu z HelpDeskiem ;).
Po odkryciu, że moje hasło nie działa postanowiłem spróbować opcji przypomnij hasło mailem (jakież by było moje zaskoczenie gdyby to działało - oczywiście ta próba nie powiodła się - ciekawy sposób zabawy jeśli dobrze rozumiem, przypomnienie hasła faktycznie przypomina nam nasze hasło, a powinno działać to zupełnie inaczej). Jak, otóż:
  • Powinno być to dwufazowe pierw przychodzi do nas link, "czy jesteś pewny że chcesz przypomnieć hasło"
  • Po jego kliknięciu powinno zostać nam wygenerowane nowe hasło (najlepiej jakieś skomplikowane) większość użytkowników i tak zapisze je tylko w programie i nie będzie go już używać nigdy
Jak jest (po domysłach):
  • Hasło jest przesyłane clear-textem w mailu.
Niestety chwilowo nie mogę tej informacji zweryfikować, ponieważ serwery rejestracyjne Gadu-Gadu nie działają.

Co do samych zmian hasła powinno być coś takiego potwierdzane e-mailem!!! No panowie nie róbcie sobie jaj, że oszczędzacie trochę transferu kosztem zadowolenia użytkowników (jeśli ktoś nie podał maila nie dostanie linku do potwierdzenia zmiany hasła - jego będą obowiązywały stare zasady).

Dobra, zostawmy już to bo zapewne Gadu-Dudu nic nie zmieni w swoim zachowaniu (jeśli by jednak szukał zmian i przypadkiem tutaj trafił to liczę, że dostane jakąś dobrą flaszkę za pomysł). Pora powiedzieć coś o helpdesku.

Halpdesk jak to helpdesk ma jedno zadanie pozwolić ludziom w firmie pracować (generalnie wysłuchać i olać klientów). A więc jak to się ma w sprawie Naszego ukochanego Operatora, otóż:
  • Ludzie tam pracujący nie czytają co się do nich pisze, ponieważ opisałem swój problem w miarę dokładnie zdziwiło mnie to, że dostałem standardową ankietę do wypełnienia (wróciła do mnie po 10 minutach - byłem pod wrażeniem szybkości helpdesku).
  • Po pierwszym mailu zauważyłem, że poczta Gadu-Dudu nie lubi Gmailowego UTF8 - przestałem go używać wypełniając ankietę.
Ankieta wyglądała następująco:
Proszę Cię o podanie odpowiedzi na wszystkie poniższe pytania.
Informacje te są niezbędne do weryfikacji Prawowitego użytkownika numeru Gadu-Gadu,
z którym występuje problem.

1. nr GG z którym występuje problem
  odp:

2. data założenia konta ( przybliżona )
  odp:

3. adres email użyty podczas procesu rejestracji (nawet jeżeli już nieaktualny)
  odp:

4. na jaki adres email ostatnio były wysyłane przypomnienia hasła
  odp:

5. adres IP, z którego nastąpiło ostatnie poprawne logowanie komunikatora
( w przypadku nie posiadania wiedzy na temat Adresu IP można posiłkować się stroną
http://www.whatismyipaddress.com/ )
  odp:

6. data ostatniego poprawnego logowania (dzień/miesiąc/rok)
  odp:

7. hasło, które ostatnio działało (takie które użytkownik pamięta)
  odp:

8. okoliczności w jakich stałeś się użytkownikiem tego konta GG
  odp:

9. inne uwagi/okoliczności
  odp:
Ze spokojem wypełniłem wszystko co pamiętałem (ip, mail i inne zostały wpisane w ankiecie), w pytaniu 9 ze szczerością obiecałem, że jak mi się coś przypomni to dopisze kolejnego maila. Co jak się później okazało stało się (znalazłem kartkę z pierwszym mailem i hasłem mojego numeru) - podesłałem.

Od momentu wypełnienia ankiety mijają już 4 dni, z firmy Gadu-Gadu nie dostałem żadnej odpowiedzi, wysłałem 2 zapytania jeszcze czy już coś słychać, czy moja prośba o przywrócenia hasła do mojego numeru GG została rozpatrzona, czy w końcu jestem prawowitym właścicielem swojego "lansiarskiego numerka".

Obecnie, czekam choć szczerze mówiąc obawiam się, że tym doświadczeniem się kończy moja przygoda z GG - nie mam zamiaru zakładać kolejnego konta tylko po to by popisać z paroma osobami, zmieniłem podejście - od dziś będę tylko na Jabberze (nie mam chęci zakładać kolejnego numeru GG i wysyłać do moich znajomych informacji o nowym numerze - za dużo mam znajomych).

Umarł król, niech żyje król. (Long live Jabber). PS: Gdyby tu trafił tech support GG to mój ticket: #INW-85350-726 ;).
PPS: Czy gdzieś popełniłem błąd, dlaczego nie uzyskałem odpowiedzi na moje pytania? Czy INW to skrót od Invalid, jeśli tak to jak powinien wyglądać pierwszy mail do tech supportu i dlaczego nie jest on umieszczony gdzieś na stronie GG w widocznym miejscu?

Jestem ciekawy doświadczeń innych z Gadu-Dudu, możecie opisać swoje przygody w komentarzach :)

1 Feb 2008

I o co chodzi?

Ciekawe:
Feb  1 15:15:11 batnet named[13863]: client 213.227.72.1#56997: query (cache) 'ghs.google.com/A/IN' denied
Feb  1 15:15:48 batnet named[13863]: client 217.17.45.156#35226: query (cache) 'ghs.google.com/A/IN' denied
Feb  1 15:17:03 batnet named[13863]: client 62.129.253.16#57693: query (cache) 'ghs.google.com/A/IN' denied
Feb  1 15:25:12 batnet named[25471]: client 81.219.231.66#32768: query (cache) 'ghs.google.com/AAAA/IN' denied
Feb  1 15:32:23 batnet named[25471]: client 194.204.152.11#32768: query (cache) 'ghs.google.com/A/IN' denied
ha! mam wytlumaczenie:
11:50:18 < koleś X wysyła do serwera Y zapytanie o wpis A na blog.0x1fff.com
11:50:46 < serwer Y wysyła do NSa dla 0x1fff.com zapytanie o wpis blog...
11:51:04 < NS(batnet) odpowiada, że a i owszem ma taki wpis, ale jest CNAME na
11:51:04   domene ghs.google.com
11:51:43 < no to automagicznie serwer Y odpytuje NSa o rozwiązanie tej nazwy
11:51:43   CNAMEowej, ponieważ w 99% przypadkach CNAMY robi się na obiekt w
11:51:43   tej samej strefie
11:52:27 > a jako, ze ten go nie ma chce mu poslac cache ktory jest
11:52:27   restrykcyjny dla localhosta i wewetrzenj sieci :> i stad ten wpis
11:52:49 < ale serwer NS mówi fuck-you, nie obsługuje żądań dla byle kogo
11:52:49   dotyczących wszystkich domen świata, bo nie jestem chłopcem na
11:52:49   posyłki
11:53:14 < więc sorry Y, ale musisz spytać kogoś innego
11:53:24 > hmm, w takim razie zwroci mu CNAME i ten dalej pyta tak?
11:53:40 > ale juz pyta googla :>
11:53:40 < tak
11:53:47 < tia

16 Jan 2008

Linux - system troubleshooting

Pracując zdalnie na systemach komputerowych, nie sposób jest uniknąć awarii. Awaria może być typowo hardwarowa - z tym nie za bardzo możemy cos zrobić zdalnie, trzeba wpakować sie do jakiegoś środku lokomocji i zając sie tym osobiście.

Inaczej sprawa się ma z awaria softwarowa, taka jakiś czas temu mi sie przytrafiła ... system plików na / uległ uszkodzeniu. Niewiele mogłem wtedy zrobić, wiec tez musiałem sie zając tym nie zdalnie, teraz bogatszy o doświadczenia tamtych dni mogę sobie napisać parę rad.

No to rady sa juz tu:

  • Mieć obraz systemu na dysku hdd, z możliwością zamontowania go przez gruba / lilo. Cos jak płytka startowa, tylko ze z hdd.
  • Zostawić niewielka pusta(!!) partycję na korą możemy wypakować powyższy obraz, lub ściągnąć któraś z wielu maleńkich dystrybucji Linuxa. Rozmiar partycji to max 700MB najlepiej jakby była na partycji podstawowej. Od biedy jeśli mamy sporo ramu można na chwilkę zamazać SWAP.
  • Jeśli spodziewamy sie ze uszkodzeniu uległ system plików, a używamy Linuxa opartego o Debiana (np Ubuntu) możemy sprobować go naprawić podczas startu. Tworząc plik /forcefsck. touch /forcefsck && shutdown -rF now

    Hint

    (wypada tu jeszcze sprawdzić wpisy w /etc/fstab) - partycja / powinna być zamontowana z: "0 1" na końcu.
  • Stworzenie live cd z większością oprogramowania i ustawionymi ipkami (Google: live cd specified for machine using Gentoo Instalation CD)
  • Jeśli mamy pare maszyn to można skorzystać z jakiegoś KVMa lub uruchomić system z init=/bin/bash (Single user mode) i przekierować w jakiś sposób wyjście konsoli na port szeregowy (do rozpatrzenia).
W sumie to na tyle więcej pomysłów chwilowo juz nie mam. Najrozsądniejszym wydaje sie stworzenie nowego systemu (odpowiednie skonfigurowanego) na dysku z którego w razie awarii moglibyśmy wybootowac i chrootowac sie do naszego właściwego systemu i wykonać odpowiednie kroki naprawcze. Uważam, ze jednym z lepszych pomysłów jest tez zostawienie livecd przy serwerze z bootowalnym i w pełni skonfigurowanym środowiskiem pracy (Gentoo nie źle sie do takich rzeczy nadaje) do którego jest możliwość połączenia sie przez ssh.

Mysql - Fast index creation

Pisząc nawet niewielkie aplikacje webowe w miarę wypełniania ich danymi zachodzi potrzeba dodania nowych indeksów to tablic w bazie MySQL, zadanie to nie jest szybkie jeśli nasza tablica ma juz w okolicach miliona rekordów, ponieważ zwyczajne:
 ALTER TABLE tbl_name ADD KEY col_name;
 ALTER TABLE tbl_name ADD KEY key_name ( tbl_name, tbl_name,
 ... );
Trwa bardzo długo, trzeba było wymyślić inny sposób zrobienia takiego zadania. Okazało sie, ze jeden z moich znajomych miał również taki problem, wiec polecił mi (wymagany jest dostęp do zapisu do plików bazy danych), domyślnie na serwerach wirtualnych czegoś takiego sie nie udostępnia, natomiast jeśli mamy serwer dedykowany i konto roota to jesteśmy w stanie bez problemu to przeprowadzić:

UWAGA: Ten sposób został sprawdzony wyłącznie na tabelach typu MyISAM!!!

  1. Tworzymy tabele o takim samym schemacie, ale o nowej nazwie czyli, mamy tablice x stworzymy sobie:
    CREATE TABLE x_new ( ... ) ; -- odpowiednio to uzupełniając
  2. Modyfikujemy odpowiednio strukturę danych (dodajemy indexy)
  3. Wyłączamy serwer MySQL
  4. Kopiujemy plik .MYD starej tabeli do nowej
    cp x.MYD x_new.MYD
    (w tej chwili baza danych jest niespójna, wiec ... )
  5. Uruchamiamy:
    mysqlcheck --repair --use-frm nazwa_bd nazwa_nowej_tabeli
    mysqlcheck --repair --use-frm test x_new
    
  6. No to indeksy są właśnie tworzone, jakimś szybszym sposobem – zapewne wynika to z tego, że dane nie muszą być ciągle dostępne.
  7. Cieszymy sie indeksami
Dlaczego tak sie dzieje, wygląda na to ze robiąc zapytanie ALTER TABLE jest tworzona tymczasowa tablica wg której jest liczony nowy index.

Hints:

CREATE TABLE new_aa ( SHOW CREATE TABLE aa );

Hints2:

INSERT INTO ... SELECT * FROM table