2012. augusztus 30.

Python 3 alapok

Gyakori kérdés hogy milyen programnyelvet érdemes tanulni. Minden nyelvnek vannak előnyei és hátrányai. Vannak megrögzött hívei a Logónak, Pascalnak, Basicnek, és talán még az Assemblynek is, miközben sokkal menőbb inkább PHP-t vagy éppen Java-t tanulni. Ezek viszont sokkal kevésbé hasonlítanak a klasszikus programozásra. Persze nekem is van a saját kedvencem, én Python ajánlok mindenkinek, és ennek a használatához szeretnék kedvet csinálni...

Miért pont Python?

A 3-as változat hivatalosan is használható az érettségin, és a behúzásos szintaktika egyszerű és könnyen tanulható, követhető. A karakteres felülettel a klasszikus nyelvekhez hasonlóan lehet dolgozni, az interaktív Python pedig mindent megad amit egy Logó tudna. Lehetőség van fordított kód készítésére de a forráskód közvetlenül is futtatható. A képességeihez még a gazdag funkciókészlet is hozzájárul, mindezek ellenére a nyelv nem számít igazán lassúnak sem. (v.ő.: Java, PHP) Végezetül pedig a nyelvet megtanulóknak szinte korlátlan fejlődési lehetőségeik vannak mind a web mind az asztali alkalmazások irányába tetszőleges rendszeren. (Django, Gtk, ... )

Miért ne?

A Python teljesen objektum orientált nyelv, ami a későbbiekben nagyon hasznos lesz de kezdetben vannak hátrányai is. Találkozni lehet olyan dolgokkal is a forráskódban amiket elsőre nem is olyan egyszerű megérteni. Tipikusan ilyenek a névvel és pozícióval vegyesen átadható paraméterek, vagy az alaptípusok érdekesebb metódusai a vegyesen megvalósított referencia és érték szerinti átadás.

A Python telepítése

Egy Windows rendszeren valószínűleg nincs még telepítve Python, vagy ha van is nincsen hozzá programozó felület. A Python hivatalos felülettel az IDLE-vel együtt letölthető a python.org letöltés szekciójából. Mindenképpen a 3.x változatot javaslom, ez az újabb és az érettségin is ez használható.

Szomorúan jegyzem meg hogy érettségizni Python programozási nyelvben csak Windows alatt lehet, ennek ellenére a leírást Ubuntu alatt fogom folytatni. Egyrészt remélhetőleg az érettségi kiírás is változni fog, másrészt nem jelent valódi nagy különbséget, az alternatív operációs rendszer sem.

Ubuntu alatt a hivatalos tárolókból elérhető a Python 2-es és 3-as verziója is, valamint szükség szerint az IDLE is telepíthető, de Linux alatti programozáshoz ezt nem javaslom használatra. A telepítőparancsok:

# A python3 telepítése (kötelező):
sudo apt-get install python3
#Az IDLE telepítése (Windowshoz javaslottal megyező felület):
sudo apt-get install idle3
Ezek után további lépések nélkül, megkezdhető a Python használata:

Interaktív Python

Elsőként néhány szót a python interaktív módjáról. Az interaktív Python egy olyan felület, ahová parancsok gépelhetőek be, soronként egyesével, amik azonnal végrehajtásra kerülnek és a végeredményt (visszatérési értéket) a Python kiírja. A felület elérése terminálban: python3 (Windows alatt az IDLE megnyitása ugyan ide vezet.)

Először egy üdvözlő szöveg fogadja a felhasználót, ami elmondja hogy milyen verziót használ és hol kaphat további információt róla:

Python 3.2.3 (default, May  3 2012, 15:51:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Ezek után egy >>> jelző (prompt) várja a következő sor elején, ide írhatóak a parancsok.

Kipróbálhatóak például a következők:
>>> 3+5
8
>>> 'alma' + ' ' + 'körte'
'alma körte'
>>> 3 + 'alma'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Jól látható hogy az első két parancsom gond nélkül lefutott, de amikor számot és szöveget akartam összeadni akkor már hibát kaptam. Ez pont így történne akkor is ha a programkódba írtam volna. Ne felejtsük el hogy az interaktív módhoz bármikor vissza lehet térni ha valami gond akadna.

Az első program

A Python programok futtathatóak rögtön forráskódból is, ami sok kellemetlenségtől kíméli meg a programozót kezdetben, ezért a példában is így fogok tenni. Az első programhoz csak egy sima szöveges fájl szükséges (elkészíthető pl. gedit segítségével) demo.py néven elmentve. (Windows alatt használható az IDLE Fájl->Új parancsa)
A fájl tartalma legyen a következő:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
print("Helló világ!")
Az első sor azt jelenti hogy ezt a fájlt a python3 programmal kell futtatni. Ennek a megadása nem kötelező, de erősen ajánlott.

A második sor a karakterkódolást jelzi. Ha nem ASCII tehát pl. ékezetes karakterek vannak a fájlban (öüóőúéáűí) akkor kötelező megadni. Pythonhoz mindig az UTF-8 kódolás használata javasolt, ez linux alatt, és az IDLE-ben is alapbeállítás. Ha valami mégsem működne, érdemes a szövegszerkesztő UTF-8 Bom nélkül üzemmódba állításával próbálkozni.

Ezek után következik maga a programkód, ami itt összesen annyit tesz hogy kiírja Helló világ!

Próbáljuk ki!. (Windows alatt futtatás menüpontot.)
Linux alatt terminálban:
python3 demo.py

Ha minden program helyesen lefutott, a terminál következő sorában megjelenik a Helló világ! üzenet. Összesen tehát ennyi volt szükséges egy Python program elkészítéséhez és futtatásához.

Tanuljunk meg Python nyelven

A Python nyelv megtanítása jócskán túlmutat egy blogbejegyzés terjedelmén, de az első lépések után nagyon egyszerűen, és gyorsan tanulható nyelv.

Segédanyagnak magyar nyelven Gérard Swinnen: Tanuljunk meg programozni Python nyelven című, ingyenesen elérhető könyvét javaslom. Ez a könyv a Python2-ről szól, én viszont eddig a Python3-al foglalkoztam. A Python3-hoz még nem tudok elérhető tananyagról. Ugyanezekből a forrásokból a Python 2 is telepíthető, de alternatívaként próbálkozhatunk Python2 kód Python 3 alatti futtatásával is.

A verziók között első ránézésre csak néhány formai különbség van: Az újabb változatban kötelező kitenni a zárójelet a print utasítás köré tehát print "Szöveg" helyett kötelezően print("Szöveg") írandó. Ezen kívül a % jellel készített szövegformázások sem működnek majd. Ezeket érdemes kezdetben kihagyni.

A változások pontos listája angol nyelven a Python3 manuálban tekinthető meg. Ezt  érdemes egyébként bármilyen egyéb leírásért is felkeresni.

2012. augusztus 13.

Saját IPv6 cím otthonra

A hagyományos IP címek elfogytak. Természetesen még van tartalékuk az internetszolgáltatóknak, de az átállás azért lassan-lassan megkezdődik IPv6-ra ami a föld lakosságánál is sok ezerszer több címet biztosít. Ha már az összes internetes eszköz átállt volna, akkor ugyanolyan észrevétlenül kapnánk a szolgáltatóktól az IPv6-os címeket mint a mostani IPv4-et, de sajnos itt még messze nem tart az átállás. Ennek ellenére bárki számára be lehet szerezni egy címet otthoni célra amivel kipróbálható és akár tartósan is használható az IPv6.

Áttekintés

Valószínűleg majdnem mindenki akinek otthoni internet előfizetése van, útválasztó (router) segítségével osztja el azt a lakásában, ami pedig NAT-ot használ a gépek címzéséhez. Ez azt jelenti, hogy a belső gépeknek ad egy 192.168.1.* (esetleg más) magánhálózati címet ami az internet felől nem érhető el, és csak egy közös valódi címet használnak ami az útválasztó eszközé. Ez a megoldás sok problémát felvet. Nem lehet a gépeket az internet felől közvetlenül megszólítani, megkülönböztetni bizonytalan és nehézkes, a routernek pedig erőforrás és memóriaigényes feladata van. A címek elfogyása mellett többek között ezeknek a kiküszöbölésére is ad lehetőséget az IPv6. Internetszolgáltatói támogatás nélkül természetesen ezek nem mind tökéletesen elérhetőek, de nagy részüket azért igénybe lehet venni.

Ami már működik

Az IPv6 alatt ugyan úgy működnek majd a szolgáltatások mint IPv4 alatt, nem lehet majd különbséget tapasztalni. A nagy oldalak, a Google, Wikipédia, Facebook már elérhetőek IPv6 alatt is, de nem nyújtanak extra funkcionalitást.

Az aktuális gép böngészésre használt kapcsolatának (IPv4/6) működése kipróbálható az test-ipv6.hu oldalon. A Google külön is fenntart egy címet (ipv6.google.com), amin csak IPv6 alatt érhető el a kereső, de a normál címein is működik IPv6.

Amiben igazából érdekességeket lehet majd tapasztalni azok a hálózati eszközök (pl. ping6), illetve az hogy minden port "nyitott" tehát egy gép IPv6-on nem szorul be a router mögé.

IPv6 cím beszerzése

IPv6 címet ideálisan az internetszolgáltatótól, vagy ennek hiányában IPv6 csatornán (tunnel) keresztül lehet szerezni. Az internetszolgáltatók közül Magyarországon néhány már ad ki lakossági kapcsolatokra IPv6 címeket (Externet, T-home DSL és Optika). Ha van rá lehetőség, komoly használatra mindenképpen a szolgáltatól érdemes címet igényelni. (T-home IPv6 igénylés). Más esetben marad a tunnel használata.

IPv6 tunnelből rengeteg van, de érdemes magyarországit választani. Az egyetlen ismert ilyen a SixXS rendszerében van, ezért innentől kezdve csak ezzel foglalkozom. A magyar hozzáférést itt a UPC biztosítja. A tunnel létesítéséhez először regisztrálni kell a SixXS rendszerébe. Valódi adatokat kell megadni, mert emberi ellenőrzés történik. A regisztráció után szokás szerint megerősítő e-mailt küldenek. Ingyenes e-mail címekkel a tájokoztatás szerint nem engednek beregisztrálni, ez alól valószínűleg a gmail és a hotmail kivételek.

Miután egy regisztrációt elfogadtak (erre várni kell) egy újabb értesítő e-mailt küldenek, amiben a felhasználónév és jelszó található. Ezzel lehet bejelentkezni az oldalra és új tunnelt igényelni. (Home -> Request tunnel) Itt a kapcsolat típusára érdemes kitérni:

ayiya
Automatikusan felkonfigurált csatorna, ami működik dinamikus IP-cím NAT mögül is. (Folyamatosan nyitva tartott kapcsolattal működik)
heartbeat
Automatikusan felkonfigurált csatorna dinamikus IP-címekhez, de megköveteli a célgép elérhetőségét (NAT mögül csak beállított DMZ vagy átirányítás esetén működik)
static
Statikus IP címekhez, megköveteli a célgép elérhetőségét.


Otthoni használatra nagy valószínűséggel az ayiya a legmegfelelőbb.

Az új csatorna elfogadására ismételten várni kell.

Az IPv6 cím beállítása

A SixXS rendszeréhez van egy kiváló segédprogram, az aiccu. Windows bináris, és nyers forráskód is letölthető, de én Ubuntu 12.04 LTS-t fogok használni. Ezen a rendszeren az aiccu tárolókból is telepíthető:
sudo apt-get install aiccu
A telepítés alatt megkérdezi a felhasználónevet és a jelszót, ez megegyezik a SixXS weboldalon használttal. Később is módosítható.

Érdemes még a program beállítófájlába belenézni: /etc/aiccu.conf
A telepítés után, itt is beállítható vagy módosítható a felhasználónév és jelszó. A fontosabb sorok kiemelve, kommentelve:
# Under control from debconf, please use 'dpkg-reconfigure aiccu' to reconfigure
# AICCU Configuration

# Login information (defaults: none)
username FEHLASZNALOHELYE # Felhasználónév
password JELSZOHELYE # Jelszó

# Protocol and server to use for setting up the tunnel (defaults: none)
protocol tic
server tic.sixxs.net

# Interface names to use (default: aiccu)
# ipv6_interface is the name of the interface that will be used as a tunnel interface.
# On *BSD the ipv6_interface should be set to gifX (eg gif0) for proto-41 tunnels
# or tunX (eg tun0) for AYIYA tunnels.
ipv6_interface sixxs

# The tunnel_id to use (default: none)
# (only required when there are multiple tunnels in the list)
#tunnel_id TUNNELNEVE

# Be verbose? (default: false)
#verbose true #Írja ki mibaja

# Daemonize? (default: true)
# Set to false if you want to see any output
# When true output goes to syslog
#
# WARNING: never run AICCU from DaemonTools or a similar automated
# 'restart' tool/script. When AICCU does not start, it has a reason
# not to start which it gives on either the stdout or in the (sys)log
# file. The TIC server *will* automatically disable accounts which
# are detected to run in this mode.
#
daemonize true #Futás háttérben

# Automatic Login and Tunnel activation?
automatic true #Automatikus indulás

# Require TLS?
# When set to true, if TLS is not supported on the server
# the TIC transaction will fail.
# When set to false, it will try a starttls, when that is
# not supported it will continue.
# In any case if AICCU is build with TLS support it will
# try to do a 'starttls' to the TIC server to see if that
# is supported.
requiretls false

# PID File
#pidfile /var/run/aiccu.pid

# Add a default route (default: true)
#defaultroute true

# Script to run after setting up the interfaces (default: none)
#setupscript /usr/local/etc/aiccu-subnets.sh

# Make heartbeats (default true)
# In general you don't want to turn this off
# Of course only applies to AYIYA and heartbeat tunnels not to static ones
#makebeats true

# Don't configure anything (default: false)
#noconfigure true

# Behind NAT (default: false)
# Notify the user that a NAT-kind network is detected
#behindnat true

# Local IPv4 Override (default: none)
# Overrides the IPv4 parameter received from TIC
# This allows one to configure a NAT into "DMZ" mode and then
# forwarding the proto-41 packets to an internal host.
#
# This is only needed for static proto-41 tunnels!
# AYIYA and heartbeat tunnels don't require this.
#local_ipv4_override

5-6: Az előbb említett belépési azonosító.
23: Írja ki részletesen mi történik. Ez nagyon hasznos lehet, nem kötelező.
35: Fusson a háttérben démonként. Ezt első kipróbáláskor érdemes hamisra állítani (false) hogy látható legyen mi történik. Automatikus működéshez vissza kell kapcsolni true értékre.
38: Rendszer indulással automatikusan betöltődhet-e az IPv6 is
69: Jelzi hogy a csatlakozás NAT mögül történik. Ennek automatikus érzékelésére is képes, nem kötelező.

A program a következő parancsokkal tesztelhető:
aiccu autotest
aiccu start
Az első parancs egy tesztet készít a kapcsolatról, a második pedig felépíti az IPv6 csatornát. Ha minden rendben történik akkor a már említett tesztoldalra lépve látható a kapott az IPv6 cím és néhány információ a kapcsolat minőségéről is.

Egy ilyen módon beállított gépen újraindítás után már automatikusan fel fog épülni a kapcsolat, és használhatóak az IPv6-os szolgáltatások is.
Probléma esetén, a következő parancsok hasznosak lehetnek:
# Az aiccu újrabeállítása
sudo dpkg --reconfigure aiccu
# A hibaüzenetekhez szükséges program telepítése és futtatása
sudo apt-get install busybox-syslogd
sudo logread
Amennyiben a kliens gép WiFi-n csatlakozik, ismert hiba hogy felfüggesztés után visszatérve nem kap újra IPv6-os címet. A hiba oka hogy az aiccu hamarabb akar elindulni és IPv6-os csatornát kiépíteni mint a gép csatlakozni tudna a hálózatra, így természetesen nem fog felépüni a kapcsolat. Erre megoldást jelent egy szkript létrehozása ami az aiccut minden új internet-kapcsolat létrejötte után, (így a WiFi kapcsolódás után is) újraindítja. Ehhez a /etc/network/if-up.d mappába kell elhelyezni egy indítófájlt:
sudo echo '#!/bin/sh

echo "New interface is up, Restarting AICCU"
/etc/init.d/aiccu restart
' >> /etc/network/if-up.d/aiccu
sudo chmod +x /etc/network/if-up.d/aiccu 

Biztonság IPv6 alatt

Nagyon fontosnak tartom megemlíteni hogy a tunnel beállítása után a gép rendelkezik egy publikus címmel, tehát az internet felől (de legalábbis az IPv6 része felől) elérhető. Olyan mintha közvetlenül, router nélkül csatlakozna az internetre. Bár önmagában ez nem jelenti bárki számára hozzáférést, mindenképpen elővigyázatlan dolog!
A probléma legegyszerűbben egy tűzfal telepítésével és beállításával orvosolható:
sudo apt-get install gufw
Ezek után a Tűzfalbeállítás programban (<ALT>+F2 gufw) és kapcsolható be a tűzfal. Ehhez jobb alul az Unlock vagy Feloldás gomb használata, majd a jelszó megadása után a tűzfalat bekapcsolt állapotba (Status: On) és a bejövő forgalmat tiltásra (Incoming: Deny) kell állítani.
Tűzfalbeállítás után ha egy program nyitott portot igényel azt a helyes működéshez hozzá kell adni a kivételekhez. Ilyen program például az aktív állapotú torrent kliens.

Teljesítmény és statisztikák

Az IPv6 tunnelről a sebesség tekintetében: Ez egy kényes dolog, ugyanis az IPv6 csomagok tesznek egy tiszteletkört a csatorna végpontjáig pluszban (UPC) ami jelentősen megnövelheti a válaszidőt:

Ping:
$ ping -c 5 google.hu
PING google.hu (173.194.35.151) 56(84) bytes of data.
64 bytes from muc03s01-in-f23.1e100.net: icmp_req=1 ttl=56 time=42.7 ms
64 bytes from muc03s01-in-f23.1e100.net: icmp_req=2 ttl=56 time=39.6 ms
64 bytes from muc03s01-in-f23.1e100.net: icmp_req=3 ttl=56 time=56.5 ms
64 bytes from muc03s01-in-f23.1e100.net: icmp_req=4 ttl=56 time=42.5 ms
64 bytes from muc03s01-in-f23.1e100.net: icmp_req=5 ttl=56 time=40.7 ms

--- google.hu ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 39.603/44.445/56.599/6.192 ms


$ ping6 -c 5 google.hu
PING google.hu(muc03s02-in-x18.1e100.net) 56 data bytes
64 bytes from muc03s02-in-x18.1e100.net: icmp_seq=1 ttl=55 time=113 ms
64 bytes from muc03s02-in-x18.1e100.net: icmp_seq=2 ttl=55 time=37.2 ms
64 bytes from muc03s02-in-x18.1e100.net: icmp_seq=3 ttl=55 time=44.9 ms
64 bytes from muc03s02-in-x18.1e100.net: icmp_seq=4 ttl=55 time=82.9 ms
64 bytes from muc03s02-in-x18.1e100.net: icmp_seq=5 ttl=55 time=74.3 ms

--- google.hu ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4001ms
rtt min/avg/max/mdev = 37.283/70.701/113.986/27.637 ms
Ezek az adatok egészen jók, bár a natív IPv4 kapcsolatnak azért láthatóan jobbak az adatai. Ez a hátrány természetesn natív IPv6 esetén nem jelentkezne.
Csatornázott IPv6-on 100 csomag átlagos pingje ~75ms lett, ez még mindig lényegesen jobb mint pl. egy mobilinternet esetén. Sebességet sajnos nem tudtam IPv6-on mérni, mert nem a csatorna hanem a szerver oldal volt a szűk keresztmetszet, a speedtest.net pedig nem támogatja még az IPv6-ot. Használat közben a tunnel nem okoz semmilyen érhezhető lassulást.

2012. augusztus 12.

GNOME Shell Kiegészítők

Egy korábbi bejegyzésben már írtam a GNOME Shellről általánosságban, most egy saját kiegészítő elkészítésével fogok foglalkozni. Ezek, bár a jól ismert JavaScript íródnak, elég nehezen kezelhetőek, ugyanis a shellben elérhető függvényekhez és erőforrásokhoz szinte semmilyen dokumentáció nem készült.

Kompatibilitás

A GNOME csapat a Shell fejlesztése közben több visszafelé nem kompatibilis változtatást vezetett be. A 3.1 és a 3.4-es verzió között alapvető változások történtek a kiegészítők által használt kódokban. Ebben a leírásban végig a GNOME Shell 3.4.1-es, az Ubuntu 12.04 LTS által szállított változatát fogom használni.
Ennek telepítése:
sudo apt-get install gnome-shell gnome-shell-common gnome-tweak-tool

Első lépések

A felhasználók saját GNOME Shell kiegészítői a saját mappájukban, a ~/.local/share/gnome-shell/extensions helyen találhatóak. Minden kiegészítőnek szüksége van egy egyedi névre úgynevezett UUID-re. Ennek a formája e-mail cím szerű: alkalmazásneve@a_fejlesztő_saját_egyedi_kódja. Én a helloworld@webgyerek.net azonosítót használom.

Egyedi azonosító birtokában a GNOME Shell egy segédparancsa létrehozza az alkalmazást:
gnome-shell-extension-tool --create
A következő kérdéseket teszi fel:
Name: Az alkalmazás ember által olvasható neve (Hello Világ)
Description: Egymondatos leírás (Első Shell kiegészítőm)
Uuid: A korábbiakban tárgyalt egyedi azonosító (helloworld@webgyerek.net)

A válaszok megadása után A GNOME Shell Extension Tool egy Helló Világ programot készít az összes szükséges fájllal együtt. Az új kiegészítő kipróbálásához engedélyezni kell azt, majd a újratölteni a GNOME Shellt:
gnome-shell-extension-tool -e helloworld@webgyerek.net
A shell legegyszerűbben az <ALT>+F2 futtatás ablakba r betűt írva és entert ütve indítható újra. Az alkalmazásaink nem fognak bezáródni, csak a Shell tölt be ismét. A GNOME Shellben a jobb felső sarokban (a hang ikontól balra) megjelenik két fogaskerék, rájuk kattintva pedig a Hello, world! szöveg villan fel szürke dobozban a képernyő közepén. Ha ki akarnánk kapcsolni a kiegészíőnket akkor a következő paranccsal megtehetjük. Utána szintén újratöltés lehet szükséges.
gnome-shell-extension-tool -d helloworld@webgyerek.net

Kiegészítők felépítése

Az új kiegészítő a felhasználói kiegészítők között található: ~/.local/share/gnome-shell/extensions/helloworld@webgyerek.net (Az UUID a létrehozáskor megadott!) A mappa teljes tartalmával együtt maga a kiegészítő. A következő fájlok találhatóak benne:

extension.js
Ebben található a kiegészítő JavaScript kódja. A tartalmazott kód kerül programkódként felhasználásra ha a kiegészítőt bekapcsolják.
metadata.json
Ebben a fájlban találhatóak a kiegészítő adatai, például (a létrehozáskor parancssorban megadottak), valamint néhány más beállítás és tulajdonság, mint például a GNOME Shell verziószáma amivel a kiegészítő működik.
stylesheet.css
Ha a kiegészítő használ valamilyen egyedi elemet, akkor ebben a fájlban tárolható a hozzá tartozó megjelenés és formázás. Ha nincs ilyen, ez a fájl nem kötelező.

Az extensions.js programfájlnak 3 függvényt kötelező tartalmaznia ahhoz hogy a kiegészítő üzemképes legyen.
Az init() függvény akkor fut le amikor a kiegészítő először betöltődik a shellbe. Ebben kell elhelyezni azokat a műveleteket amik előkészítik a kiegészítőnek szükséges dolgokat, de nem változtatnak sem a megjelenésen, sem a működésen.
Az enable() függvény akkor fut le, amikor a kiegészítőt bekapcsolják. Ez mindig később történik mint az init() lefutása. Ebben kell elhelyezni azokat a kódokat amik módosítják a megjelenést vagy a működést.
A disable() függvény pedig akkor kerül futtatásra, amikor kikapcsoljásra kerül a kiegészítő. Minden változtatást el kell tüntetnie amit az enable() végzett.

A forráskód

A kiegészítő forrásának elkészítéséhez természetesen tudni kell, hogyan működik a GNOME Shell felülete. Sajnos ez meglehetősen aluldokumentált:

A Shell a felület megrajzolásához mindenhol egy Clutter nevű alprogramot használ, ennek segítségével egy 2.5D térben helyezhetőek el elemek. Minden elem egy ún. actor, olyasmi mint a weben egy div blokk. Ezeknek vannak fajtái, és egyeseknek lehet további tartalma (szöveg, ikon, vagy újabb actor) valamint vannak tulajdonságaik (méret, kattinthatóság, ...).
A legfontosabb hogy minden aktornak van egy connect metódusa, amivel különböző eseményekhez rendelhetőek saját JavaScript függvények futtatásai.

Sajnos (a cikk írásakor) a Clutterhez semmilyen a JavaScript felületet bemutató leírás nincs. Elvileg a működés és a metódusok ugyan azok mint C nyelven, úgyhogy az eredeti Clutter dokumentáció használható, több kevesebb sikerrel. A feladatot bonyolítja hogy a kiegészítők valójában nem a Clutterrel dolgoznak.

A GNOME csapat készített egy újabb virtuális réteget, ami a kiegészítő JavaScript kódokon kívül automatikusan alkalmazza a CSS tulajdonságokat is az actorokon. Erre a rétegre St-ként hivatkoznak a kódokban. A több dokumentálatlan közvetítőt rétegnek köszönhetően, végeredményben legegyszerűbb a kész kódokból kitapasztalni az actorok működését. Ehhez viszont van segítség, ugyanis a Shell felülete ugyanazon a nyelven íródott mint a kiegészítők. A kódok áttekintéséhez a /usr/share/gnome-shell/js/ui mappát lehet érdemes tanulmányozni.

A "Helló Világ!" kiegészítő forráskódja, amit az érthetőség kedvéért megjegyzésekkel egészítettem ki:
//Az összes szükgéses lib betöltése 
const St = imports.gi.St; //Ez az aktorok fölé húzott, CSS-t alkalmazó réteg
const Main = imports.ui.main; //Ebben vannak a Shell alapelemei (felső panel, monitorok, dash, stb)
const Tweener = imports.ui.tweener; //Ezzel a segéddel lehet animációkat készíteni

let text, button; // A text és a button az egész kiegészítőben elérhető közös változók

function _hideHello() { //Ez a függvény fogja letörölni a "Hello, world!" felirat actorát
Main.uiGroup.remove_actor(text); //Letöröli a címkét a monitorról
text = null; //És megszünteti a létezést (hogy új kattintásnál újragyártsa majd)
}

function _showHello() { //Ez a függvény rajzolja ki a "Hello, world!" felirat actorát
//Ezek a részek új Helló feliratot csinálnak. Ha éppen még látszik, nem futnak le
if (!text) {
//Ha épp nincs felirat, készít egyet
//Ez egy címke típusú actor lesz
text = new St.Label({ style_class: 'helloworld-label', text: "Hello, world!" });
Main.uiGroup.add_actor(text); //Hozzáadja a címkét a monitorhoz
}
//Ezek a részek az animációt állítják, minden kattintáskor lefutnak, hogy újra kezdődjön.
text.opacity = 255; //Actor kezdeti átlátszósága

let monitor = Main.layoutManager.primaryMonitor; //Elsődleges monitor beszerzése



//Elhelyezzi a címkét a monitor közepére
text.set_position(Math.floor(monitor.width / 2 - text.width / 2),
Math.floor(monitor.height / 2 - text.height / 2));



//Lefuttatja az animációt, az animáció végén meghívja a _hideHello-t
Tweener.addTween(text,
{ opacity: 0,
time: 2,
transition: 'easeOutQuad',
onComplete: _hideHello });
}

function init() { //Kötelező függvény, lásd a leírásban
//Készít egy új gombot két aktorból (ez lesz a két fogaskerék gombja)
//A külső aktor (St.Bin) lesz a gomb, készít egy másik actort, amiben az ikon van
button = new St.Bin({ style_class: 'panel-button',
reactive: true,
can_focus: true,
x_fill: true,
y_fill: false,
track_hover: true });
let icon = new St.Icon({ icon_name: 'system-run',
icon_type: St.IconType.SYMBOLIC,
style_class: 'system-status-icon' });

button.set_child(icon); //Beletesszi az ikont a gombba
button.connect('button-press-event', _showHello); //Kattintásra történjem meg a _showHello
}

function enable() { //Kötelező függvény, lásd a leírásban
//Beszúrja a gombot a jobb oldali doboz 0. helyére (itt van a fogaskerék ikonos gomb)
Main.panel._rightBox.insert_child_at_index(button, 0);
}

function disable() { //Kötelező függvény, lásd a leírásban
//Kitöröli a gombot a helyéről
Main.panel._rightBox.remove_child(button);
}
A kód JavaScript, de a webhez képest felmerül egy szembetűnő újdonság: A kiegészítőkben nem a var kulcsszóval lehet definiálni változókat, az ilyenek ugyanis az egész Shellben elérhetőek lesznek. Helyette a let szóval definiálhatóak, ami csak az éppen aktuális blokkban és annak alblokkjaiban teszi őket elérhetővé. A JavaScript nyelvhez a GNOME csapat ezt a Mozillás leírást javasolja.

További források

A Shell központi UI forrásán kívül a GNOME Shell Extensionsról letöltött egyszerűbb kiegészítők forráskódja kíváló példa anyag. További olvasmány pedig angol nyelven található a témában:

2012. augusztus 8.

GNOME Shell

Amióta a GNOME 2 támogatása megszűnt, a csapból is az folyik, hogy milyen asztali környezetet érdemes használni helyette. Néhány hónapon belül megjelent a Unity, a MATE és a Cinnamon is alternatívaként a korábbi pehelysúlyú XCFE, LXDE mellett. A hivatalos utód a GNOME Shell viszont annál kevesebb figyelmet kapott, ezért ezzel foglalkozom egy bejegyzés erejéig.

Telepítés

A GNOME csapat kedvenc rendszere minden bizonnyal a Fedora. Ennek az alapértelmezett asztali környezete a GNOME Shell, így nincs teendő a telepítéssel.

A Debian alapú rendszerek kedvelőinek a legegyszerűbb az Ubuntu 12.04 LTS használata. A GNOME Shell itt elérhető a hivatalos tárolókból is, de egy frissebb változatot ad a Gnome3 csapat nem hivatalos tárolója (ppa:gnome3-team/gnome3):
sudo add-apt-repository ppa:gnome3-team/gnome3
sudo apt-get install gnome-shell
Az első sor elhagyható, de nem javaslom. Ekkor a hivatalos, régebbi verzió került telepítésre.

A telepítés után ki kell jelentkezni, majd a bejelentkező képernyőn a felhasználónév melletti ikonra kattintva a GNOME-ot választani az Ubuntu helyett. Bár a GNOME-nak van saját bejelentkező képernyője, az Ubuntu esetében ez a telepítés után is a LightDM marad. Ez kifejezetten hasznos akkor, ha több asztali környezet is van használatban, így pusztán a bejelentkezéshez nem kerülnek betöltésre a GNOME függőségek.

A GNOME Shell elképzelés

Az új felület felrúgja megszokásokat és a grafikus környezet használatát két részre bontja: Az ablakok kezelésére, alkalmazások indítására (ez a Tevékenységek nézet), és maguknak az alkalmazásoknak a használatára. Részletesebb leírás helyett ezt a bemutató videót érdemes megnézni.

Véleményem szerint az elképzelés és a módosítások igazán jók, viszont felvet néhány problémát a konkrét megvalósítás.

A GNOME csapat egyik régóta kitűzött célja az egyszerűség, a minél kevesebb "felesleges és bonyolult" beállítás megvalósítása. Ez a gyakorlatban úgy jelenik meg hogy az új környezetnek alapértelmezés szerint szinte nincsenek beállításai. A testreszabást az új kiegészítő rendszer (Gnome Shell Extensions) segítségével szeretnék megoldani, ezek azonban sajnos még messze nem kiforrottak.

Beállítások

Elsősorban a "már megszokott" beállítások kezeléséhez készült el a GNOME Tweak Tool. Az eszköz alapesetben nem a GNOME Shell része, külön kell telepíteni. Telepítés után az indítóban Speciális beállítások néven jelenik meg.
sudo apt-get install gnome-tweak-tool
Ennek a segítségével sokminden átállítható:
    Gnome Tweak Tool képernyőkép
  • Műveletek az ablakdekoráción történő különböző kattintásokkor (kicsinyít, hátraküld, stb)
  • Ablakok aktiválása (kattintásra, fókuszálásra, késleltetve)
  • Betűkészlet, méret, alávágás, élsimítás tulajdonságai
  • Asztal kezelése (ikonok használata az asztalon)
  • A shell dátum és idő megjelenítési formátuma
  • Ablakkezelő gombok helyzete (bezár, minimalizál, maximalizál)
  • Művelet a noteszgép fedelének lezárásakor
  • GTK téma, ikonkészlet, shell téma* beállítások
  • Kiegészítők ki-be kapcsolása**
* Ehhez egy további shell kiegészítő telepítése is szükséges.
**  Ez kiemelten hasznos, ugyanis a kiegészítők ki-be kapcsolása alaphelyzetben csak online működik.

Kiegészítők

Amit a GNOME Tweak Tool nem tud állítani, arra a kiegészítők között lehet megoldást keresni. Ezek a Shell megjelenését tetszőlegesen átalakíthatják, illetve szinte teljes  működését is megváltoztathatják.

A Shell 3.2-es változatáig nincs lehetőség automatikus telepítésre, a kiegészítőket kézzel, kicsomagolva kell elhelyezni a fájlrendszeren. A közös gyűjtemény a /usr/share/gnome-shell/extensions könyvtár, a felhasználók saját kiegészítőiket a  ~/.local/share/gnome-shell/extensions mappában helyezhetik el.

A mappák nem változatlanok, de a 3.2-es változattól fölfelé egy új lehetőség jelent meg. A jóváhagyott kiegészítők az extensions.gnome.org címről egy kattintással "bekapcsolhatóak". Ez magában foglalja az automatikus letöltést és telepítést is. Ugyanezen a weblapon lehetőség van a telepített kiegészítők kezelésére és törlésére is az Installed Extensions fülön. Amennyiben viszont éppen nincs internetkapcsolat, a már telepített kiegészítők kezelése sem működni. Ilyenkor a GNOME Tweak Tool használható a ki-/bekapcsoláshoz.

A kiegészítők kezelése egyelőre(?) csak Mozilla Firefox böngészővel működik!

Sajnos kiegészítőből még elég kevés van ezért érdemes lehet egyszer átfutni az összeset, esetleg feliratkozni a GNOME Shell kiegészítők RSS csatornájára. Példaképpen kiemelnék néhány hasznos darabot:
  • Window list - Hozzáad egy a régi tálcához hasonló listát a felső panelhez. Így Tevékenységek oldalra lépés nélkül lehet váltani az ablakok között.Alkalmazások szerint csoportosít, a gomb fölött tartva az egeret jelenik meg az egyes ablakok listája, ha több van*.
    *(Ennek az átállítására elméletileg van lehetőség, de a cikk írásának pillanatában a kiegészítőnek semmilyen beállítása nem működött)
  • Move Clock - Áthelyezi az órát a jobb oldalra (több helyet adva az előző listának)
  • Window Navigator - Billentyűkombinációk ablakkezeléshez Tevékenység nézetben
  • Alternate Status Menu - Hozzáadja a kikapcsolás és hibernálás lehetőségeket az állapot menühőz. (Enélkül csak Felfüggesztésre van lehetőség, a leállításhoz az ALT billentyűt nyomva tartásakor jelenik meg.)

Témák

A kiegészítők, bár megtehetik, általában nem módosítják a Shell megjelenését. Erre a célra kifejezetten a témák valók, amiből sok jó található az interneten. Ilyen például ez a válogatás.

A témák telepítésére nincsen automatikus módszer. Az alapértelmezett és mindenhol használt téma a /usr/share/gnome-shell/theme mappában található. Ennek átnevezésével pl. theme-original-ra, és egy új theme mappa létrahozásával rendszer szinten módosítható a megjelenés. (Ehhez rendszergazdai jogok szükségesek!)

A témák kezelésére elméletileg létezik kiegészítő, aminek a segítségével a GNOME Tweak Tool-ban felhasználó szinten állítható át a használt téma illetve annak elérési útja, így akár a felhasználói fiókban saját maga által letöltött témák használatára is lehetőséget adva.

    2012. augusztus 5.

    Ajánló

    Régen terveztem a webről a számítástechnikáról és úgy általában a kapcsolódó érdekességekről szóló hasznos, érdekes weboldalak összegyűjtését. Ez a lista éppen ideális lesz bemutatkozásként, és biztos hogy hasznosabb is, mint ha magamról írnék sorokat.

    Buhera blog

    A számítástechnikában mindig érdemes otthon lenni az aktuális biztonsági témákban, buherátor pedig magyar nyelven, színvonalasan foglalja össze az aktuális tudnivalókat.

    Weblabor

    A "fejlesztői forrás"-t talán mindenki ismeri. Független szakmai lapként a legszínvonalasabb magyar nyelvű cikkek otthona, és az érdekes blogbejegyzések gyűjtőhelye. Sajnos a friss tartalom egyre ritkább, de ami megjelenik, azt biztosan érdemes elolvasni. Nem árthat egy pillantást vetni a mindmáig működő levelezőlistákra sem.

    CSS Tricks

    Rengeteg hasznos és divatos "Web 2.0"-ás trükk, sajnos csak angol nyelven. Szép koncepciókat és kidolgozott aprólékos megoldásokat egyaránt találni, ráadásul rengeteg a friss és érdekes cikk. Az oldal kifejezetten a weblapfejlesztéssel foglalkozik, elsősorban HTML és CSS, de érintőleges JavaScript irányból is.

    Code Net

    A kezdőket felkaroló, egykor szebb napokat is megélt oldalból sajnos csak a fórum és a lelkes felhasználók egy kis része maradt. Programozási problémákkal viszont máig érdemes benézni a fórumba, biztos segítségre és barátságos hozzáállásra találunk.

    Magyar Ubuntu Planet

    Az Ubuntu linux köré összegyűjtött összeállítás, de rengeteg blog, és bejegyzés található itt összegyűjtve, amit ha mindet végigolvasni nem is, de átfutni érdemes, emellett érdekes lehet egy-egy pillantást vetni az eredeti blogokra is, akik hasonló, informatikai témákban posztolnak.

    Hungarian Unix Portal

    Magyar (linux)rendszergazdák és fejlesztők fórumaként működő oldal, bár a webhez csak lazán kapcsolódik, rengeteg hasznos dolgot lehet kihámozni a (szintén rengeteg) szemét közül. A fórum csak (túl)sok szabadidővel rendelkező, megszállott informatikusoknak ajánlott!

    Futottak még

    Az interneten még számos, hasznos oldal van, ami szorosan vagy éppen lazán kapcsolódik, de sajnos nem lehet mindenkiről néhány soros bemutatót írni. Előfordulhat hogy a jövőben még külön kiemelek egy-egy oldalt, de most csak felsorolásként: