Windows Vista? Zmniejszyć partycję i postawić Ubuntu

vista_cloudTen tekst pisałem miesiąc temu, ale nie miałem od tamtego czasu sposobności aby go opublikować. Plan był prosty. Na świeżo wypakowanym notebooku Della była zainstalowana Vista Home Premium – na jednej partycji, zajmującej cały dysk. Zaplanowałem zmniejszenie partycji do minimum, a następnie pozostawienie jej na później (w dalszym zamyśle – na nigdy), na reszcie dysku instalując Linux Ubuntu. Po kilku pierwszych czynnościach, próbach wykonania czegokolwiek, lekko sfrustrowany, zacząłem pisać tekst, który bardzo szybko przybrał na sile i urósł do rozmiarów tego wpisu :)

Myślę, że produkt Microsoft Windows 7 zrecenzuję pod kątem wykonania podobnych czynności niebawem, ponieważ Microsoft dał mi prawo do darmowego upgrejdu Visty :)

Microsoft Windows Vista Home Premium

Świeży, preinstalowany system przez Della, zajmuje 30 GB. Windows XP z grami, pakietami Office i wieloma innymi aplikacjami zbieranymi przez lata, z tego co pamiętam, na partycji 25 GB miał jeszcze trochę miejsca. Ubuntu do swobodnej pracy, pomieści się na 10 GB i będzie miał jeszcze zapas. Ba, można go uruchomić nawet z 1 GB pendrive’a z persistent storage (tzw. trwały dysk – zapisywane dane pozostają obecne nawet po restarcie).

Pierwsze kliknięcia

Wybierając Komputer / Zarządzaj (zatwierdzając monit UAC), a tam Menadżer dysków – mamy możliwość zmniejszenia rozmiaru partycji. Tutaj zaskoczenie, minimalnym rozmiarem partycji systemowej (przy zajętości dysku 30 GB) okazuje się 150 GB. Cóż. Wybrałem ów minimalny rozmiar, zatwierdziłem zmiany, komputer przez chwilę się wytężał, aby ostatecznie pojawił się komunikat Odmowa dostępu. Ponowna próba dała ten sam rezultat.

Dalsze kliknięcia

Postanowiłem walczyć dalej. Znalazłem darmowe oprogramowanie do zmiany rozmiaru partycji – EASEUS Partition Master Home Edition – łudząco przypominający program Partition Magic czy GParted. Niestety. Tutaj również poległem. Jak się okazało, ów oprogramowanie w wersji darmowej jest dostępne jedynie na wersję 32-bitową systemu. Za 64-bitową należy już zapłacić. To że 64-bitowy system nie jest w stanie poradzić sobie z aplikacją 32-bitową uważam również za porażkę architektów tego bądź co bądź – komercyjnego systemu.

Zdalne wsparcie administracyjne w oparciu o RealVNC również nie jest możliwe o ile UAC jest włączony – kiedy tylko pojawia się monit UAC o autoryzację wykonania danej operacji, RealVNC jest rozłączane. Po ponownym połączeniu nie ma możliwości pracy na tym oknie poprzez RealVNC. Jest to oczywiście niesamowity sukces separacji, jak dla systemu, który był tworzony na bazie środowiska graficznego.

Ostatecznie zdecydowałem się na wykorzystaniu Ubuntu Live CD i GParted’a. Jaki będzie efekt dowiem się za 7 minut. Aktualizacja: Po ponownym restarcie Visty, pojawiło się Narzędzie do naprawy systemu podczas uruchamiania pokazujące komunkat “Trwa próba naprawienia…” – próba trwała godzinę – przez ten czas nie było nam dane dowiedzieć się czy proces ten coś robi, czy się zawiesił. Zadnych szczegółów. Nic. A jednak! Vista odniosła sukces i wstała! Przypominają mi się tutaj narzekania użytkowników Gnome’a pod Linuxem, że jest mało opcji itp. Z tego co pamiętam, a Gnome używam na codzień – jeśli w jakiejś aplikacji trwa dłużej wykonywana czynność – zawsze istnieje możliwość zobaczenia szczegółów. Panowie z Visty powinni spróbować zgapić to tak samo jak ten widget zegarka ;)

Coś mnie tchnęło i spróbowałem zainstalować jeszcze VirtualBox‘a. Oczywiście pojawiło się kilka monitów UAC, tak jakby jeden nie wystarczał… Ostatecznie sam instalator zdecydował, że dalej nie zabrnie, mimo kolejnych autoryzacji i zażyczył sobie za pośrednictwem kolejnego monitu, uruchomienie instalatora na prawach administratora. W takim momencie wystarczy nacisnąć Naprawa instalacji i zrobione. Postęp jest. Kiedyś było dalej, dalej, dalej. Teraz trzeba coś przeczytać i klikać w większej ilości
miejsc.

Wrażenia okiem użytkownika Ubuntu

Opiszę jeszcze swoje wrażenia, jako człowieka pracującego na codzień na Linux Ubuntu. Szczerze współczuje użytkownikom Visty. Kilka na pozór łatwych czynności naprawdę mnie zmęczyły (fakt, były też zaawansowane, czyli takie które… właśnie ni stąd ni z owąd, pojawił się kolejny ekran autoryzacji UAC. Java się chce aktualizować… kontynuuj… czyli takie które mogą zainstalować wirusa w sterownikach urządzenia). Swoją drogą, takie wtrącenia są wkurzające, prawda? ;) Pod Linuxem Ubuntu wykorzystuje się sudo. Ma ono bardzo prostą właściwość włączoną domyślnie – jeśli trzeba wykonać jakąś czynność na uprawnieniach administratora – monit pojawia się raz. Jeśli w określonej ilości czasu miałaby nastąpić ponownie sytuacja z potrzebą uruchomienia danej czynności na administratorze, jest ona uruchamiana. Dopiero jeśli ten czas się skończy, użytkownik musi się ponownie zautoryzować. Na dodatek nie jakimś głupim kliknięciem, tylko podając hasło do swojego konta.

W tzw międzyczasie dowiedziałem się jeszcze, że Vista nie ma profili sprzętowych, czyli próba uruchomienia systemu za pomocą środowiska zwirtualizowanego na tym samym, fizycznym dysku twardym jest poważnym proszeniem się o kłopoty.

Jako, że moje dotychczasowe doświadczenia z Vistą opierały się o wsparcie telefoniczne dla jej użytkowników, głównie w kwestiach uruchomienia sieci (a w zasadzie ewentualnego aktywowania ustawień DHCP), miałem okazję doświadczyć już problemów ze stosem IPv6 w tym systemie. Wygląda na to, że we wczesnych, nie aktualizowanych Vistach, jeśli użytkownik ma aktywowane IPv6 na interfejsie, nie uzyska adresu IPv4 od serwera DHCP. Takich przypadków miałem już kilka, co dość mizernie świadczy o tym systemie operacyjnym. Stos IP jest jest podwaliną na której można budować bezpieczny system. Jeśli ów stos kuleje, bezpieczeństwo systemu nie jest już tak istotne.

Podsumowanie

Nie wiem jak Wy oceniacie ten system, ale dla mnie, kierunek rozwoju platformy Microsoftu jest lotem koszącym. Nie wiem czego można się spodziewać po Windows 7, ale z tego co widziałem, wiem, że czeka mnie więcej telefonów od zagubionych dusz, które nie potrafią doklikać się do ustawień połączeń sieciowych. Złożoność systemu powinna rosnąć, ale nie w ten sposób. Przejście powinno być płynne. Bez rewolucji. Skoro architekci Windowsów tyle natchnienia czerpią z graficznych środowisk Linuxowych, to powinni zainteresować się tym, czy złożoność interfejsu oraz ilość “pokręteł” jest dla użytkowników problemem czy błogosławieństwem. Historii na ten temat nie trudno znaleźć. Przykładowa – sam Linus Torvalds, który stworzył pierwszego kernela Linuxowego, nie raz miał okazję się już przesiadać między Gnome, KDE i spowrotem :)

Wyłączenie użytkownikowi MOTD na Ubuntu

Tematyka niniejszego wpisu jest, można powiedzieć wręcz banalna, ale myślę, że to trick warty poznania lub przypomnienia. Nie dotyczy tylko i wyłącznie dystrybucji Ubuntu, ale w zasadzie wszystkich Linuxów.

Jeśli logujesz się po ssh na inny komputer, wyświetlana jest zawartość Message Of The Day (/etc/motd). Jeśli nie chcesz tego widzieć, w swoim katalogu domowym wystarczy utworzyć plik o nazwie .hushlogin, wersja copy & paste:

cd
touch .hushlogin

(polecenie cd bez parametrów to kolejny trick – sprawia, że zostajemy przeniesieni do naszego katalogu domowego)

Efekt

Zilustrowałem poniżej:

nme@desktop ~ $ ssh laptop
Linux laptop 2.6.31-14-generic-pae #48-Ubuntu SMP Fri Oct 16 15:22:42 UTC 2009 i686

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/

  System information as of Fri Nov  6 20:56:41 CET 2009

  System load: 0.16              Memory usage: 18%   Processes:       155
  Usage of /:  7.1% of 35.51GB   Swap usage:   0%    Users logged in: 1

  Graph this data and manage this system at https://landscape.canonical.com/

Last login: Fri Nov  6 20:55:19 2009 from desktop.local
nme@laptop ~ $ touch .hushlogin
nme@laptop ~ $ logout
Connection to laptop closed.
nme@desktop ~ $ ssh laptop
nme@laptop ~ $ 

Proste, aczkolwiek przydatne :)

Dwa komputery z Linuxem – jedna klawiatura i mysz

Czy kiedykolwiek zdarzyło Ci się pracować na dwóch komputerach – np. notebooku i komputerze stacjonarnym, albo dwóch stacjonarnych jednocześnie? Frustrujące uczucie, kiedy mylą się myszki, prawda? Jeśli oba komputery pracują pod Linuxem – jest na to sposób! :)

x2x

Ostatnio coraz częsciej pracuje na większej ilości komputerów jednocześnie. Zwykle jest to komputer stacjonarny i notebook, ale bywają też bardziej rozbudowane konfiguracje. W takich sytuacjach aż chce się mieć możliwość aby wyjechać myszką “za” ekran i “wjechać” na drugi, najechać na aplikację i coś wpisać za pomocą klawiatury, tej, z której korzystałem do pracy na pierwszej stacji roboczej. Da się to zrobić -  rozwiązaniem tego problemu jest mała aplikacja o nazwie x2x.

Aplikacja x2x świetnie współpracuje z ssh. Mamy dzięki temu szyfrowane połączenie między oboma stacjami roboczymi i nie musimy się obawiać, że ktoś podsłucha co wpisujemy.

Aby korzystać z x2x, musimy go najpierw zainstalować. Robimy to na komputerze do którego chcemy się podłączyć, czyli – jeśli standardowo pracujemy na komputerze stacjonarnym, a chcemy mieć możliwość “wyjechania myszką” na notebooka, x2x musimy zainstalować na notebooku.

sudo aptitude install x2x

Kiedy mamy już zainstalowaną aplikację, możemy ją wykorzystać.

x2x w Ubuntu 9.04 i wcześniejszych

Jeśli notebook stoi po lewej stronie, jak na obrazku załączonym powyżej, musimy podać parametr -west. Mamy do dyspozycji również -north, -south-east.

ssh -X notebook "x2x -west -to :0.0"

W tym momencie możemy już pracować na obu komputerach, korzystając z klawiatury i myszy z pierwszego z nich.

x2x w Ubuntu 9.10 Karmic Koala

Nowe X’y, nowy gdm – sprawy się nieco skomplikowały. Problem zaczął doskwierać również innym i został rozwiązany przez Roberta Jennigsa i Davida Boersma’ę. Aby cieszyć się z x2x w Karmic, możemy skorzystać z poniższego skryptu.

Musimy ustawić w nim następujące parametry:
- USER – nazwa użytkownika na którego logujemy się na zdalnej maszynie
- HOST – adres IP komputera lub jego nazwa w DNS lub /etc/hosts
- HOSTNAME – nazwa zdalnego komputera (taka sama jak zawartość /etc/hostname)
- SIDE – z której strony naszego podstawowego ekranu myszka może wyjechać

#!/bin/bash
#
# x2x Karmic problem solution based upon:
# https://bugs.launchpad.net/ubuntu/+source/x2x/+bug/471726
# Many thanks to Robert Jennings and David Boersma!

# Setup:

USER=user               # remote host username
HOST=ip                 # remote host IP or name
HOSTNAME=nazwa_hosta    # remote /etc/hostname
SIDE=west               # north / south / west / east
COMPRESSION="-C"        # comment out for LAN

# No need to change anything below:

MERGE="xauth merge /var/run/gdm/auth-for-$USER*/database"
LIST="xauth list"
REMOVE="xauth remove $HOSTNAME/unix:0"
X2X="x2x -$SIDE -to :0.0"

#ssh -X $COMPRESSION $USER@$HOST "$MERGE; $LIST; $X2X; $REMOVE"
#ssh -X $COMPRESSION $USER@$HOST "$LIST"
ssh -X $COMPRESSION $USER@$HOST "$MERGE; $X2X; $REMOVE"

Ja już się uzależniłem, Wam również polecam! :)

Cisza na blogu

Kolega ostatnio zapytał, dlaczego na blogu zapanowała taka grobowa cisza.
Fakt, przez prawie półtorej miesiąca nic tu nie zamieściłem. Czynników które ten fakt spowodowały było kilka, m.in nowy rok akademicki który dla mnie wiąże się z nieco bardziej wytężoną pracą (korzystając z okazji pozdrawiam moich studentów i studentki :) ) czy wrednym przeziębieniem które męczyło mnie ponad dwa tygodnie.

Głównym czynnikiem który spowodował zastój na blogu była jednak zmiana pracy. Poznaje teraz nowe środowisko, zarówno pod względem społecznym jak i systemowym :) Nie mam w zasadzie powodów do narzekań – jest dobrze, choć niestety blog trochę ucierpiał, bo zmalała zarówno liczba subskrybentów jak również ilość dziennych odwiedzin.

Mam jednak nadzieję, jako, że wspomniane wcześniej środowisko systemowe jest nieco odmienne, że będę miał niebawem więcej ciekawych zagadnień o których będę mógł napisać. Na tą chwilę więcej czytam niż piszę, ale sytuacja niebawem się odmieni. Dlatego dziewięciu wiernych słuchaczy nie powinno być zawiedzonych :) Jedno jest pewne – nie zamierzam tego bloga zarzucić.

Przespałem, jeśli o wpisy chodzi, kilka ważnych wydarzeń – takich m.in jak wyjście nowego Ubuntu 9.10 Karmic czy betę VirtualBox 3.1.0, ale myślę, że wszystko jest do odrobienia :)

Tych którzy wcześniej ten blog subskrybowali, a teraz przestali, jeśli będą mieli okazję ten tekst przeczytać – zachęcam do zastosowania prostej zasady – nigdy nie kasujcie subskrypcji ze swoich czytników feedów. Jeśli na jakimś blogu jest zastój, lub wpisy pojawiają się rzadziej – warto skatalogować je jako “Martwe” czy “Rzadkie”, bo kto wie, może niechący umkną Wam rzeczy o których chcielibyście wiedzieć, a dzięki takiemu zabiegowi od razu będziecie widzieli nową aktywność.

Na koniec tego krótkiego wpisu mała dygresja – Media zapowiadają, że za dwa tygodnie nastąpi szczyt zachorowań na grypę. Pocieszające jest to, że na nową, AH1N1 choruje w kraju w przybliżeniu 600 osób. Dla kraju liczącego sobie 38 mln obywateli, ta liczba brzmi jak szansa na wygranie w Lotto… czego w przeciwieństwie do grypy, Wam życzę! :)

Wprowadzenie do systemu kontroli wersji Mercurial

mercurialPoniższy tekst jest jedynie wprowadzeniem do pracy z Mercurialem. Osoby które chcą pogłębić swoją wiedzę w zakresie tego tematu – zachęcam do przeczytania darmowej książki dostępnej w Internecie – Mercurial: The Definitive Guide.

Aby pracować na Mercurialu musimy go najpierw zainstalować. Dla systemu Windows Mercurial jest jedną wygodną do zainstalowania paczką. Informację jak zalecam to zrobić pod Ubuntu, zamieściłem tu: Instalacja Mercurial z GUI TortoiseHG pod Ubuntu 9.04.

Konfiguracja wstępna

Zanim rozpoczniemy pracę z Mercurialem, należy w swoim katalogu domowym utworzyć plik .hgrc w którym konfigurujemy swojego użytkownika. Plik ten powinien zawierać następującą treść:

[ui]
username = Imie Nazwisko < konto@domena.pl >

Pod Linuxem lub Unixem warto również ustawić zmienną środowiskową EDITOR wskazującą na nasz
ulubiony edytor. W moim wypadku, w pliku .bashrc w katalogu domowym
musiałem dodać na końcu linijkę:

export EDITOR="vim"

W tym momencie możemy już przystąpić do pracy.

Tworzenie repozytorium

Załóżmy, że jesteśmy w katalogu testy.

Utwórzmy w nim plik notatki.txt zawierający jedną linijkę tekstu:

To są moje notatki

Utwórzmy też katalog dokumenty, a w nim umieśćmy plik do-zrobienia.txt zawierający następującą treść:

[ ] Zrobić przelewy za październik
[ ] Podać do Energetyki stan licznika

Struktura plików i katalogów wygląda zatem następująco:

user@host testy $ ls
dokumenty  notatki.txt
user@host testy $ ls dokumenty/
do-zrobienia.txt

Możemy w tym momencie utworzyć sobie repozytorium Mercuriala. Przechodzimy zatem do katalogu testy i wydajemy komendę:

user@host testy $ hg init

W katalogu powinien pojawić się podkatalog .hg

Co teraz możemy zrobić? Dostępne komendy pojawią się po wydaniu komendy hg bez parametrów:

user@host testy $ hg
Mercurial Distributed SCM

basic commands:

 add        add the specified files on the next commit
 annotate   show changeset information by line for each file
 clone      make a copy of an existing repository
 commit     commit the specified files or all outstanding changes
 diff       diff repository (or selected files)
 export     dump the header and diffs for one or more changesets
 forget     forget the specified files on the next commit
 init       create a new repository in the given directory
 log        show revision history of entire repository or files
 merge      merge working directory with another revision
 parents    show the parents of the working directory or revision
 pull       pull changes from the specified source
 push       push changes to the specified destination
 remove     remove the specified files on the next commit
 serve      export the repository via HTTP
 status     show changed files in the working directory
 update     update working directory
 view       start interactive history viewer

use "hg help" for the full list of commands or "hg -v" for details

Jeśli chcemy uzyskać większą ilość komend, należy uruchomić polecenie
hg help.

Zobaczmy status naszego katalogu. Możemy napisać hg status, jednak można też zastosować skróconą wersję komendy:

user@host testy $ hg st
? dokumenty/do-zrobienia.txt
? notatki.txt

Widzimy, że system Mercurial widzi dwa pliki. Przed ich nazwami figuruje znak pytajnika, co oznacza, że Mercurial nie do końca wie, co to za pliki.

Dodawanie plików do repozytorium

Do dodawania plików do repozytorium służy komenda hg add [nazwa pliku], przy czym nazwa pliku jest parametrem opcjonalnym. Jeśli jej nie podamy – Mercurial doda wszystkie nieznane pliki w naszym katalogu i podkatalogach do repozytorium.
Dodajmy nasze pliki do repozytorium.

user@host testy $ hg add
adding dokumenty/do-zrobienia.txt
adding notatki.txt

podglądając status widzimy:

user@host testy $ hg st A dokumenty/do-zrobienia.txt A notatki.txt

Zatwierdzanie i weryfikowanie zmian

możemy w tym momencie zatwierdzić zmiany:

user@host testy $ hg commit

W tym momencie uruchomi się nam edytor w którym uzupełniamy pierwszą linię. Pozostałe zostały zasugerowane przez Mercuriala:

utworzone repozytorium

HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: Imie Nazwisko 
HG: branch 'default'
HG: added dokumenty/do-zrobienia.txt
HG: added notatki.txt

Jeśli chcemy którąś z tych linii pozostawić, powinniśmy usunąć HG: sprzed wpisu.

Po zapisaniu pliku, jeśli Mercurial znajdzie choć jedną linię opisu (czyli w naszym wypadku tekst “utworzone repozytorium”), zapisze to jako nową wersję (revision).

Możemy podejżeć zmiany:

user@host testy $ hg st
user@host testy $

Jak widać, nie ma żadnych. Zobaczmy zatem historię:

user@host testy $ hg log
changeset:   0:996ae301b615
tag:         tip
user:        Imie Nazwisko 
date:        Tue Oct 13 08:40:12 2009 +0200
summary:     utworzone repozytorium

user@host testy $

Dokonajmy jakiejś zmiany w pliku dokumenty/do-zrobienia.txt, powiedzmy, że teraz wygląda tak:

[x] Zrobić przelewy za październik
[ ] Podać do Energetyki stan licznika

Sprawdzając status widzimy:

user@host testy $ hg st
M dokumenty/do-zrobienia.txt
user@host testy $

Możemy też podejżeć co zostało zmienione:

user@host testy $ hg diff
diff -r 996ae301b615 dokumenty/do-zrobienia.txt
--- a/dokumenty/do-zrobienia.txt	Tue Oct 13 08:40:12 2009 +0200
+++ b/dokumenty/do-zrobienia.txt	Tue Oct 13 08:46:21 2009 +0200
@@ -1,2 +1,2 @@
-[ ] Zrobić przelewy za październik
+[x] Zrobić przelewy za październik
 [ ] Podać do Energetyki stan licznika
user@host testy $

Zatwierdzę teraz zmiany, sprawdzę status i historię:

user@host testy $ hg commit
user@host testy $ 

user@host testy $ hg st
user@host testy $ 

user@host testy $ hg log
changeset:   1:155c93da6b65
tag:         tip
user:        Imie Nazwisko 
date:        Tue Oct 13 08:48:01 2009 +0200
summary:     aktualizacja

changeset:   0:996ae301b615
user:        Imie Nazwisko 
date:        Tue Oct 13 08:40:12 2009 +0200
summary:     utworzone repozytorium

user@host testy $

Usuwanie plików z repozytorium

Teraz usunę plik notatki.txt:

user@host testy $ hg remove notatki.txt
user@host testy $ ls
dokumenty
user@host testy $

Zatwierdzę zmiany i zobaczę historię. Ograniczę sobie przy okazji historię do dwóch najaktualniejszych zmian:

user@host testy $ hg commit
user@host testy $ hg log -l 2
changeset:   2:ec95d15664fb
tag:         tip
user:        Imie Nazwisko 
date:        Tue Oct 13 08:51:36 2009 +0200
summary:     usunięte notatki

changeset:   1:155c93da6b65
user:        Imie Nazwisko 
date:        Tue Oct 13 08:48:01 2009 +0200
summary:     aktualizacja

user@host testy $

Zdecydowałem jednak, że przywrócę plik notatki. Cofnę zatem ostatniego commita komendą rollback, zobaczę jaki
jest status i przywrócę plik notatki.txt:

user@host testy $ hg rollback
rolling back last transaction
user@host testy $ hg log
changeset:   1:155c93da6b65
tag:         tip
user:        Imie Nazwisko 
date:        Tue Oct 13 08:48:01 2009 +0200
summary:     aktualizacja

changeset:   0:996ae301b615
user:        Imie Nazwisko 
date:        Tue Oct 13 08:40:12 2009 +0200
summary:     utworzone repozytorium

user@host testy $ hg st
R notatki.txt
user@host testy $ ls
dokumenty
user@host testy $ hg revert notatki.txt
user@host testy $ ls
dokumenty  notatki.txt
user@host testy $

Myślę, że jako wprowadzenie, taki opis wystarczy :)

Drażniący dzwięk podczas pracy na baterii w Ubuntu

intel-core2-duoLinux Ubuntu jest na tą chwilę chyba najlepszą Linuxową dystrybucją na desktopa. Jest ona jednak nadal świeża i zdarza się, że czasami ma pewne problemy z nowszym sprzętem.

Jednym z takich problemów z którym się zetknąłem jest drażniący pisk czyli dźwięk o wysokiej częstotliwości (ang. high-pitch noise) podczas pracy notebooka na zasilaniu bateryjnym. Przyczyną tego dzwięku jest wyższy tryb ACPI odpowiedzialny z zarządzaniem zasilaniem i temperaturą. Więcej szczegółów technicznych można znaleźć na stronach Intela opisujących C-State Architecture.

Mój notebook ma procesor Intel Centrino (Core2) Duo T5600 i niestety ten problem go dotyczy.

Stare rozwiązanie stosowane w Ubuntu 8.04

W jądrze systemu ustawiona jest możliwość zmiany tego parametru podczas pracy systemu (parametr CONFIG_ACPI_PROCESSOR=y).

Aby dźwięk ustał należy uruchomić komendę:

echo 2 >/sys/module/processor/parameters/max_cstate

Można pokusić się o dodanie takiego skryptu do /etc/acpi.d który ten problem rozwiąże, ale lepiej zastosować następne rozwiązanie.

Szczegółowe informacje można znaleźć tutaj.

Nowe rozwiązanie dla Ubuntu 8.04, 8.10 i 9.04 oraz prawdopodobnie pozostałych

W konfiguracji grub’a, do parametrów kernela należy dodać processor.max_cstate=2, przykładowy wpis:

title           Ubuntu 9.04, kernel 2.6.28-15-generic
root            (hd0,1)
kernel          /vmlinuz-2.6.28-15-generic root=/dev/mapper/sys-root ro quiet splash processor.max_cstate=2
initrd          /initrd.img-2.6.28-15-generic
quiet

Rozwiązanie to ma tą wadę – trzeba o nim pamiętać i uzupełniać w konfiguracji gruba nowe kernele o ten parametr. Jeśli to rozwiązanie jest dla Ciebie przydatne to zachęcam do oznaczenia go sobie w Google Readerze jako ulubione, bo kto wie, być może będzie potrzeba aby do niego wrócić :)

Mercurial w Eclipse IDE

eclipse_logoŚrodowisko programistyczne Eclipse jest jednym z najlepszych spośród tych dostępnych za darmo. Osobiście preferuję vim’a, ale większość programistów przywykło do większych luksusów :)

Eclipse jest dostępny zarówno pod Windows jak i pod Linuxem. Jego instalacja w systemie Microsoftu jest dość prostą czynnością.

W Linux Ubuntu, Eclipse jest niby też dostępny w standardowej dystrybucji, ale mnie osobiście nigdy nie udało się go z sukcesem uruchomić ze standardowej paczki. Tym z Was, którzy chcą z niego skorzystać pod Ubuntu zachęcam do pobrania Eclipse z ich strony, następnie rozpakowanie go do docelowego katalogu, a na koniec ręczne stworzenie skrótu.

Eclipse zostało stworzone w Javie i w zamyśle jest IDE służącym do tworzenia aplikacji właśnie w tym języku. Dzięki zaawansowanemu systemowi rozszerzeń możliwe jest jednak jego wykorzystanie do tworzenia aplikacji w innych językach. Właśnie ten mechanizm umożliwi nam również uzupełnienie Eclipse’a o system kontroli wersji.

Aby mieć możliwość z korzystania z Mercuriala, konieczna będzie jego instalacja w systemie. Dla systemu Microsoft Windows można go pobrać z tej strony. Dodatkowo warto zainstalować TortoiseHG. Kroki opisujące instalację pod Linux Ubuntu wraz z TortoiseHG opisałem tutaj.

Wtyczka Mercurial-Eclipse

Aby za pomocą środowiska Eclipse posługiwać się systemem kontroli wersji Mercurial, konieczne będzie dodanie jego repozytorium do dostępnych źródeł w Eclipse. W tym celu wybieramy Help / Install new software… / Add… i podajemy:

name: Mercurial Eclipse
location: http://www.vectrace.com/eclipse-update/

Osobiście testowałem plugina w wersji 1.4.1286 – zainstalował się i działał prawidłowo.

Po zainstalowaniu, plugin poprosi o restart środowiska Eclipse. Kiedy już Eclipse zacznie ponownie działać, powinniśmy mieć dostęp do nowej funkcjonalności.

Dość ważną kwestią jest na początku zaglądnięcie do ustawień Mercuriala – Window / Preferences, wybieramy Team / Mercurial. Należy tutaj podać Mercurial Username w postaci Imię nazwisko <adres@email>. Zaleciłbym również zaznaczenie opcji Automatically associate Mercurial with new projects containing hg repository.

Jeśli chodzi o zakładanie repozytorium dla istniejącego już projektu – w Eksploratorze workspace wybieramy projekt, naciskamy prawy klawisz myszy, następnie Team / Share project – tam wybieramy Mercurial i na następnej stronie wizarda Use project root.

Jeśli repozytorium już było założone – trzeba zaglądnąć do projektu podobnie jak przy tworzeniu nowego repozytorium, wybrać Share project, a na końcu Use existing .hg repository.

W tym momencie możemy już korzystać z bardziej urozmaiconej zawartości popup menu Team :)

eclipse-mercurial

Instalacja Mercurial z GUI TortoiseHG pod Ubuntu 9.04

mercurial-3Mercurial jest jednym z najpopularniejszych ostatnio systemów kontroli wersji. Został on napisany w języku Python i coraz więcej projektów jest do niego migrowanych. Google Code umożliwia wybór jednego z dwóch systemów kontroli wersji – jednym z nich jest SVN, drugim właśnie Mercurial.

Różnice między scentralizowanym a rozproszonym systemem kontroli wersji

Zasada działania Mercuriala jest zbliżona do Git‘a – oba są tzw. rozproszonymi systemami kontroli wersji. SVN z drugiej strony jest systemem zcentralizowanym. Praca na systemie rozproszonym jest o tyle wygodna, że każda lokalna kopia repozytorium może być traktowana jako pełnoprawna i całkowicie niezależna. Rozwijając kod który jest obsługiwany w takim systemie kontroli wersji, commitowanie, czyli zatwierdzanie mniejszych porcji zmian jest znacznie wygodniejsze i nie wymaga zaprzątania głowy głównego repozytorium… którego tak naprawdę wcale nie musi być.

Jak to robi Linus Torvalds?

Większe projekty, takie jak jądro Linuxa coraz częściej przechodzą na rozproszone systemy kontroli wersji. Linus Torvalds bardzo zachęca wszystkich do migrowania do Gita z SVN’a. Git został napisany właśnie z myślą o developerach jądra systemu Linux. Głównymi zaletami według niego są dwie kwestie – pierwsza: znacznie wygodniejsze merge’owanie (łączenie zmian wprowadzonych przez różnych developerów) oraz druga – rozproszone repozytoria pozwalają na hierarchiczne scalanie kodu (z punktu widzenia pracy grupowej). Dzięki tej drugiej, Linus może powierzyć np. opiekę nad modułami jądra dotyczącymi sieci komuś, kto zna się na tym konkretnym temacie lepiej, potrafi weryfikować zmiany i poprawki. Zebrane do repozytorium przez opiekuna drzewa sieci poprawki, Linus może włączyć do jego repozytorium, które traktowane jest jako główne mając pewność, że wszystkie zmiany zostały odpowiednio zweryfikowane.

Kontrola wersji z linii komend

Mercuriala można zainstalować ze standardowego pakietu w Ubuntu. Na pakiet składa się jedna aplikacja – hg. Za jej pomocą można wykonać wszystkie operacje na repozytorium z poziomu linii komend.

$ hg
Mercurial Distributed SCM

basic commands:

 add        add the specified files on the next commit
 annotate   show changeset information by line for each file
 clone      make a copy of an existing repository
 commit     commit the specified files or all outstanding changes
 diff       diff repository (or selected files)
 export     dump the header and diffs for one or more changesets
 forget     forget the specified files on the next commit
 init       create a new repository in the given directory
 log        show revision history of entire repository or files
 merge      merge working directory with another revision
 parents    show the parents of the working directory or revision
 pull       pull changes from the specified source
 push       push changes to the specified destination
 remove     remove the specified files on the next commit
 serve      export the repository via HTTP
 status     show changed files in the working directory
 update     update working directory
 view       start interactive history viewer

use "hg help" for the full list of commands or "hg -v" for details

Kontrola wersji z poziomu interfejsu graficznego

Istnieje jednak możliwość pracy graficznej. Windowsowi użytkownicy jako graficzny interfejs zwykle wykorzystują TortoiseHG, który wywodzi się z TortoiseSVN. Pod Linuxem możemy również wykorzystać TortoiseHG.

Instalacja Mercuriala i TortoiseHG pod Ubuntu 9.04

Uruchomienie komend zamieszczonych poniżej sprawi, że nasz Mercurial zostanie “podniesiony” do najnowszej stabilnej wersji, pojawi się nam TortoiseHG również w wersji stabilnej, a następnie TortoiseHG zostanie włączone do domyślnego menadżera plików w Gnome – Nautilusa. Zainstalowana zostanie również aplikacja Meld, która czyni merge’owanie całkiem przyjemną czynnością w interfejsie graficznym :)

# Najpierw przechodzimy na roota, tego którego w Ubuntu nie ma ;)  

sudo -i

# Dodajemy drzewo stable repozytorium Mercuriala z Ubuntu Launchpad PPA

cat >/etc/apt/sources.list.d/mercurial.list << EOF
deb http://ppa.launchpad.net/mercurial-ppa/stable-snapshots/ubuntu jaunty main
deb-src http://ppa.launchpad.net/mercurial-ppa/stable-snapshots/ubuntu jaunty main
EOF
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key 323293EE

# Dodajemy drzewo stable repozytorium TortoiseHG z Ubuntu Launchpad PPA
cat >/etc/apt/sources.list.d/tortoisehg.list << EOF
deb http://ppa.launchpad.net/tortoisehg-ppa/stable-snapshots/ubuntu jaunty main
deb-src http://ppa.launchpad.net/tortoisehg-ppa/stable-snapshots/ubuntu jaunty main
EOF
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key D5056DDE

# odświeżamy listę repozytoriów i pobieramy pakiety oraz dodajemy obsługę bindingsów Pythona w Nautilusie

aptitude update
aptitude install -y python-nautilus mercurial tortoisehg tortoisehg-nautilus meld

# doinstalowujemy pakiet iniparse
wget http://iniparse.googlecode.com/files/python-iniparse_0.3.1-1_all.deb
dpkg -i python-iniparse_0.3.1-1_all.deb
rm python-iniparse_0.3.1-1_all.deb

Po wykonaniu tych komend najlepiej się przelogować ponownie, aby Nautilus zdał sobię sprawę z wprowadzonych zmian. Można też (już na swoim użytkowniku) uruchomić komendę:

nautilus -q

Która spowoduje przeładowanie Nautilusa (może nam zniknąć do następnego zalogowania zawartość pulpitu). Jeśli wszystko pójdzie pomyślnie, w efekcie możemy zarządzać repozytorium w następujący sposób:

mercurial-1

Powiadomienia SMS mBank mobile – drugie podejście

Dwa miesiące temu przedstawiłem dwa sposoby w jaki można sobie uruchomić powiadomienia SMS od aplikacji lub o przychodzących mailach. Oba miały pewne wady więc zdecydowałem się powrócić do tematu raz jeszcze.

Pierwszym rozwiązaniem, było wykorzystanie +48xxxxxxxxx@text.plusgsm.pl
Rozwiązanie dobre, bo dostajemy natychmiast powiadomienie na komórkę. Dodatkowo większość skrzynek pocztowych ma możliwość ustawienia automatycznej kopii na drugi adres – więc w dosłownie chwilę możemy sobie ustawić automatyczne powiadomienie o mailach.
Rozwiązanie to ma jednak swoją wadę – dostajemy pełną treść, która nie zmieści się w jednym SMS’ie jeśli w mailu jest jakakolwiek treść poza samym tematem.

Drugim zasugerowanym przeze mnie rozwiązaniem było wykorzystanie możliwości wysyłania powiadomień SMS z Google Calendar. To rozwiązanie również jest dobre. Możemy wykorzystać konto w Google Apps, dzięki czemu adres powiadomień jest bardziej uniwersalny, ale ma też swoje wady – chodzi mianowicie o dzienny limit powiadomień SMS z kalendarza Google. Jak się przekonałem, taki limit jest. Dokładnej liczby nie znam, ale w przybliżeniu to około 25 SMS’ów.

Rozwiązanie optymalne?

Postanowiłem zatem poszukać czegoś po środku. Wykorzystałem obsługę skrzynki Google do pobierania wiadomości, a następnie jedynie nadawcę i temat przekazuje do usługi text.plusgsm.pl. Wydaje mi się, że rozwiązanie jest optymalne. Oto kod:

#!/usr/bin/env python
# -- encoding: utf8 --

__author__ = 'mw AT nme.pl'
__version__ = '1.4'
__date__ = 'pią, 25 wrz 2009, 13:22:28 CEST'

class setup:
    verbose = False
    class google:
        login = 'KONTO@GOOGLE'
        password = 'HASŁO'
    class notify:
        recipient="+48xxxxxxxxx@text.plusgsm.pl"

import poplib
import email
import email.Header
#import sms
import smtplib
import re

class Fwd:

    def __init__(self,address,subject):

        mesg = "From: %s\nTo: %s\nSubject: %s\n\n" % (address, setup.notify.recipient, subject)
        server = smtplib.SMTP('smsb.plusgsm.pl')
        if setup.verbose:
            server.set_debuglevel(1)
        server.sendmail (address, setup.notify.recipient, mesg)
        server.quit()

class Mailbox:

    def __init__(self):

        self.server = poplib.POP3_SSL('pop.gmail.com', 995)
        self.server.user(setup.google.login)
        self.server.pass_(setup.google.password)
        self.server.set_debuglevel(0)

        # fetch
        count = self.server.stat()[0]
        if setup.verbose:
                print count
        if count:
            for i in range(1,count+1):
                (header, msg, octets) = self.server.retr (i)
                mail = email.message_from_string('\n'.join(msg))
                address = email.Header.decode_header(mail['From'])[1]
                if address[1]:
                    address = address[0].decode(address[1],'ignore')
                else:
                    address = address[0]
                address = re.sub('>\s*$','',re.sub('^\s*< ','',address))
                subject = email.Header.decode_header(mail['Subject'])[0]
                if subject[1]:
                    subject = subject[0].decode(subject[1],'ignore')
                else:
                    subject = subject[0]
                #print subject
                #sms.parse(subject.split())
                Fwd(address,subject)
                #self.server.dele (i)

        # commit
        self.server.quit()

mbox = Mailbox()

Aby te powiadomienia działały, na koncie shellowym umieszczamy skrypt, nadajemy mu prawa do uruchomienia, przechodzimy do edycji crona:

chmod +x pop2smsV2.py
crontab -e

dodajemy zadanie do crona, aby był uruchamiany co minutę:

* * * * * /home/NAZWA/bin/pop2smsV2.py >/dev/null 2>&1

Podsumowanie

Teraz to rozwiązanie najbardziej przypomina mi to które miałem w Erze. Trzeba niestety użyć do tego shella z cronem. OVH odpada z dwóch powodów – brak crona oraz brak dostępu do sieci z poziomu shella. Może i by się dało uruchomić to jako CGI z ich webowym cronem, ale niestety mija się to trochę z celem, ponieważ cron OVH może być uruchamiany najczęściej co godzinę.

Przewagą tego rozwiązania nad powiadomieniem z Ery jest brak limitu skrzynki 12 MB. Limitem jest ponad 7 GB co nie stanowi już problemu. Jeśli nie chcemy zostawiać na skrzynce śladu – możemy usunąć komentarz z linii self.server.dele (i) – co spowoduje kasowanie przesłanych jako SMS wiadomości.

Zaletą obsługi powiadomień za pomocą crona jest to, że możemy ustalić sztywne godziny w których skrypt ma działać – możemy ustawić, że powiadomienia mogą przychodzić pomiędzy 8:00, a 16:00 oraz 18:00 – 22:00 (trzeba się wtedy liczyć z faktem, że o ósmej rano otrzymamy wszystkie SMS’y z nocy). Jeśli chcemy mieć powiadomienia aktywne w godzinach 8:30 – 22:30, robimy to następującymi regułami:

30-59   8 * * * /home/nme/sms-notify/pop2smsV2.py >/dev/null 2>&1
*    9-21 * * * /home/nme/sms-notify/pop2smsV2.py >/dev/null 2>&1
0-30   22 * * * /home/nme/sms-notify/pop2smsV2.py >/dev/null 2>&1

Dodatkowo – dzięki temu rozwiązaniu mamy adres do powiadomień, znacznie łatwiejszy do zapamiętania – bo w postaci np. powiadomienia@nasza-domena.pl :)

Kontrolka button w jQuery UI

Ogólny trend rozwoju interfejsów aplikacji spycha je coraz bardziej w kierunku webowym. Zmieniają się dzięki temu developerzy i sposób postrzegania aplikacji. Lekkość aplikacji zaczyna być w cenie. Krowiaste applety Javy, przerośnięte Flashe zaczynają powoli ustępować lżejszym rozwiązaniom. Jednym z nich jest jQuery UI.

Czym jest jQuery UI

jQuery UI to mini-framework dla aplikacji po stronie klienta. Powstał on przy projekcie jQuery, a zespoły tych projektów są dość mocno zintegrowane – świadczy o tym m.in About jQuery, wspólna dokumentacja oraz tempo rozwoju. Zespół UI jest dodatkowo zrzeszony w Filament Group, pod szyldem którego publikuje całkiem często dość ciekawe artykuły bądź to opisując UI, Aria, bądź uzupełniając kontrolki o nowe i jednocześnie je omawiając. Na ich stronie nie znalazłem RSS’a, ale o nowościach zawsze wspominają na swoim Twitterowym profilu filamentgroup – którego kanał RSS sobie zasubskrybowałem w moim Google Readerze – rozwiązanie spisuje się dobrze :)

Za pomocą jQuery UI możemy przygotować graficzny interfejs naszej aplikacji webowej. Mamy do dyspozycji bibliotekę funkcji rozszerzających standardowe efekty o nowe, własne kontrolki, tematy graficzne (które możemy rozszerzać o własne) wraz z rewelacyjnie narysowanymi ikonkami, dostosowanymi do każdego z tematów. Żeby zobaczyć jak to wszystko wygląda w różnych standardowych tematach graficznych – przykładowy podgląd ThemeRoller.

Standardowa baza kontrolek (widget’ów) jest niewielka – kontrolka daty, okno dialogowe, progress bar, taby. Dodatkowych można się doszukać na SVN’ie w labsach albo poprzez wspomnianą wyżej stronę filamentgroup.

Wprowadzenie do jQuery UI w Twitterowym stylu ;)

Do html’a naszej aplikacji załaczamy CSS z wybranego tematu jQuery UI oraz skrypty jQuery i jQuery UI – przykładowo:

<link href="theme/start/jquery-ui.css" type="text/css" rel="stylesheet"/>
<script src="js/jquery.js" type="text/javascript"></script>
<script src="js/jquery-ui.js" type="text/javascript"></script>

Mamy teraz dostępną całą paletę styli i narzędzi jQuery UI. Zarówno jedno jak i drugie jest bardzo łatwo rozszerzalne.

Jak to rozbudować?

Stworzymy sobie przycisk (ang. button) – przyda się nam omówiona w poprzednim wpisie biblioteka do generowania dynamicznego CSS. Tak mniej więcej wygląda początkowy szkielet aplikacji:

$(document).ready(function() {

    var self = this;
    self.css = new CSS('dynamic');
    //include('button.js');

});

Jak wszyscy wiemy, w JavaScript nie ma include. Można zrobić tak aby był, ale o tym napiszę niebawem. Póki co w jego miejsce możemy wstawić kod właściwej kontrolki.

// ui.button

self.css.replace('.cx-button',{
	'outline':'0',
	'margin':'0 4px 0 0',
	'padding':'.4em 1em',
	'text-decoration':'none !important',
	'cursor':'pointer',
	'position':'relative',
	'text-align':'center',
	'zoom':'1'
});
// remove extra button width in IE
self.css.replace('a.cx-button',{
	'float':'left'
});

(function($) {

$.widget('ui.button', {
	_init: function() {
		this.element
			.addClass('cx-button ui-state-default ui-corner-all')
			.hover(function() {
				if (! $(this).hasClass('ui-state-disabled')) {
					$(this).addClass('ui-state-hover');
				}
			},function() {
				$(this).removeClass('ui-state-hover');
			})
			.mousedown(function() {
				if (! $(this).hasClass('ui-state-disabled')) {
					$(this).addClass('ui-state-active');
				}
			})
			.mouseup(function() {
				$(this).removeClass('ui-state-active');
			})
			.disableTextSelect();
	},
	disabled: function() {
		this.element.addClass('ui-state-disabled');
	},
	enabled: function() {
		this.element.removeClass('ui-state-disabled');
	},
	destroy: function() {
		this.element
			.removeClass('cx-button ui-state-default ui-corner-all ui-state-hover ui-state-active ui-state-disabled')
			.unbind('mouseenter mouseleave');
	}
});

})(jQuery);

Takie właśnie przyciski zostały przeze mnie użyte na przykładowej stronie flatforma.appspot.com – należy najpierw przekliknąć się w accordeonie po lewej, a wtedy pojawią się przyciski, które dodają nowe zakładki. Dla leniwych zrzut ekranu:

flatforma-screenshot

Zachęcam do analizy przedstawionego w tym tekscie kodu – można go uznać za bazowy szkielet do tworzenia kontrolek.

Temat został szerzej opisany na stronach Filament Group:
Styling Buttons and Toolbars with the jQuery UI CSS Framework

« Nowsze wpisyStarsze wpisy »