2012. december 27., csütörtök

Parcellite vágólapok szinronizációja


Már korábban többször is írtam vágólapkezelőkről, például itt, amikor még a Glipper-t használtam, vagy itt, amikor URL rövidítő szkriptet írtam. A Parcellite nevű vágólapkezelőt már rég óta használom, Crunchbang-en alapértelmezetten van telepítve. Van azonban egy kisebb hibája (bár ez a viccel ellentétben lehet, hogy komolyan feature), és a beállításaiban nem lehet bekapcsolni a vágólapok szinkronizációját, csak ha az elsődleges kiválasztást és a CTRL+C-s másoló eljárást is engedélyezzük. Ennek lehet, hogy van valamilyen komolyabb oka is, de akárhogy kerestem nem találtam ilyet (ha valaki tudja, nyugodtan szólhat :D). Ez ahhoz szükséges, hogy ha egy programból kilépünk a vágólapkezelő ugyan elmenti a vágólap tartalmát, azonban nem helyezi be azt a vágólapra, így nem lehet beilleszteni, csak a Parcellite kezelőfelületén való kiválasztás után.
Ez a változás az egyik újabb verzióban került a programba, ami nekem nem tetszett, így létrehoztam egy "fork"-ot, amiben ezt orvosoltam. A fenti képen látható bal oldali az alap, a jobb oldali az én változatom, ahol elég az egyik lehetőséget kiválasztani, hogy szinkronizálni lehessen a vágólapokat.
Telepítéshez:
wget https://github.com/thesnapdragon/parcellite/archive/master.zip
unzip master.zip
cd parcellite-master/parcellite-1.0.2rc5/
./configure
make
sudo make install

A Parcellite hivatalos oldala
A "fork" kódjának GitHub oldala

2012. október 24., szerda

Raspberry Pi firmware frissítés


Korábban nagyon bosszantó hiba volt a Raspberry Pi használatakor (Raspbian operációs rendszer mellett), hogy egy gyorsabb letöltésnél, egyre több ram-ot kezdett használni a Transmission, és egy idő után már nem maradt elég memória a működéséhez, ezért magától leállt a torrentkliens.
Szerencsére ez egy firmware frissítéssel megoldható, viszont sokáig nem találtam rá egy egyszerű megoldásra, amivel könnyen lehetne firmware-t frissíteni, így nagyon megörültem, amikor nem régen felfedeztem Hexxeh oldalát. Ő készített egy nagyszerű kis szkriptet, amivel nagyon egyszerű az egész:
  1. Git+ca-certificates csomag telepítése:
    sudo apt-get install git ca-certificates
  2. Szkript letöltése, telepítése, futtatási jog beállítása:
    sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update
  3. Futtatás & enjoy:
    sudo rpi-update

2012. október 4., csütörtök

Linux optimalizálása SSD-hez

  1. Első lépésként érdemes megnézni, hogy a partíciók jól lettek-e létrehozva (partition alignment megfelelő-e), de ahogy láttam a Crunchbang telepítő erre figyel, és MSDOS partíciós táblánál is (nem csak GUID Partition Table-nél, ahogy fő forrásom is írja) az első szektor 2048-nál van, ami megfelelő. Erre azért van szükség röviden, mert az SSD másképpen működik, mint a HDD: ha egy partíció nem a page size méretével osztható határon kezdődik, akkor az SSD-nek egy lap írása helyett 2 lapot kell írnia, így a sebesség és az élettartam is csökken. 25nm-es gyártási technológiánál a page size 8kB, erase block size 2MB, egy szektor 512B így kiszámolható, hogy megfelelően van eltolva a partíció.
  2. Lépés a TRIM funkció bekapcsolása. Ehhez először is 2.6.33-as vagy újabb kernellel kell rendelkezünk. Röviden a TRIM-ről: HDD esetén, ha egy fájl letörlünk, akkor az operációs rendszer az érintett szektorokat megjelöli törölhetőként és később újabb adat kiírásakor felülíródnak a korábban törölt adatok. Az SSD-nél viszont más a helyzet, mert új adatot csak üres lapokra lehet írni, törléskor azonban az operációs rendszer csak megjelöli a szektorokat törölhetőként, így azok nem tűnnek el, megjelölve továbbra is ott vannak az SSD-n. Újabb adat írásakor az erase blocknak megfelelő nagyságú részt be kell olvasni, kiírni gyorsítótárba, törölni a szükségtelen lapokat, visszaírni, majd az üres helyre az új adatokat is beírni. A TRIM egy SATA utasítás, melyet az operációs rendszer hív meg, ilyenkor ténylegesen törlődnek a szükségtelen lapok az SSD-ről. Bekapcsolásával sebességnövekedést érhetünk el.
    Ehhez az /etc/fstab fájlba kell beírnunk a discard attribútumot:
    # / was on /dev/sda1 during installation
    UUID=8a159c3a-0867-431d-a7a1-e5211fc3a8d9 /               ext4    discard 0       1
    # /home was on /dev/sda5 during installation
    UUID=fc76149a-8a7d-43eb-a676-56ae599c440a /home           ext4    defaults,user_xattr,discard 0        0       2
  3.  Az előző lépéshez hasonlóan az /etc/fstab fájlban érdemes beállítani a noatime attribútumot is. Így a rendszer nem írja ki fájloknál az utolsó hozzáférés idejét, ezzel rengeteg erőforrást megspórolva.
    # / was on /dev/sda1 during installation
    UUID=8a159c3a-0867-431d-a7a1-e5211fc3a8d9 /               ext4    noatime,discard 0       1
    # /home was on /dev/sda5 during installation
    UUID=fc76149a-8a7d-43eb-a676-56ae599c440a /home           ext4    defaults,noatime,user_xattr,discard 0        0       2
  4. Az alapértelmezett IO ütemező Crunchbang-ben a CFQ (Complete Fair Queueing Scheduler), mely a HDD olvasó/író fej helyzetét is figyelembe veszi működése során. Az SSD-nél ennek nincsen értelme, így érdemes átállítani az ütemezőt Deadline, vagy Noop ütemezésre:
    printf 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"' | sudo tee /etc/udev/rules.d/60-ssd-scheduler.rules
  5. Néhány könyvtárat, amelyekbe nagyon gyakran történik írás, nem túl jó az SSD-n tárolni, hogy ne csökkenjen az SSD élettartama számottevően. Ezeket a könyvtárakat átmeneti fájlrendszerként érdemes felcsatolni, így ezek soha nem íródnak ki a lemezre, újraindításkor tartalmuk törlődik. Felcsatolásukhoz a /etc/fstab fájlba írjuk a következőket:
    tmpfs   /tmp       tmpfs   defaults,noatime,mode=1777   0  0
    tmpfs   /var/log   tmpfs   defaults,noatime,mode=0755   0  0
    tmpfs   /var/spool tmpfs   defaults,noatime,mode=1777   0  0
    tmpfs   /var/tmp   tmpfs   defaults,noatime,mode=1777   0  0
    Én a két tmp könyvtárat, a napló fájlok könyvtárát, és a futásra váró folyamatok könyvtárát helyeztem át a memóriába. Ezzel a konstrukcióval érdemes vigyázni, mert ha elfogy a hely a memóriából, akkor a swap-et fogja használni a rendszer, valamint egyes programok nem tudnak elindulni, ha nincsenek meg a /var/log-ban a saját mappáik.
    Egy megoldás ezen mappák létrehozására, ha a rendszer indulásakor elkészítjük ezeket egy init.d szkriptben. Egy majdnem jó megoldás található itt, azonban hiányoznak a függőség alapú bootolást segítő LSB mezők (itt írtam róluk). Helyesen:
    sudo touch /etc/init.d/make-tmpfs-dirs
    sudo gedit  /etc/init.d/make-tmpfs-dirs
    másoljuk be a szkriptet:
    #!/bin/sh

    ### BEGIN INIT INFO
    # Provides: make-tmpfs-dirs
    # Required-Start:
    # Required-Stop:
    # Default-Start:  2 
    # Default-Stop:
    # Short-Description: Create temporary directories on tmpfs.
    # Description: Create temporary directories for Debconf, Apache2, GDM, ATD
    ### END INIT INFO

    # Debconf
    mkdir /var/cache/debconf

    # Apache2
    sudo mkdir /var/log/apache2
    sudo chown root:adm /var/log/apache2
    sudo chmod 750 /var/log/apache2
    # GDM
    sudo mkdir -p /var/log/gdm

    # ATD
    sudo mkdir -p /var/spool/cron/atjobs
    exit 0
    majd állítsuk be a jogosultságokat, és a megfelelő runlevel-t:
    sudo chmod u+x /etc/init.d/make-tmpfs-dirs
    cd /etc/rc2.d
    sudo ln -s ../init.d/make-tmpfs-dirs S02make-tmpfs-dirs
  6. A gyakori írások nem túl jók az SSD-nek, általában egy böngésző cache-eléskor legtöbbször nagyon kis fájlokat ír ki. Ezt is érdemes a memóriába áthelyezni, mert ezzel még a böngészést is gyorsíthatjuk.
    Firefox-ban a következőt kell tennünk:
  • Írjuk be a böngésző címsorába a következőt: about:config
  • Jobb klikk -> New -> String
  • Névnek írjuk be a következőt: browser.cache.disk.parent_directory
  • Értéknek pedig: /tmp 
A további SSD optimalizációval kapcsolatos eredményekről is itt fogok írni.  

2012. szeptember 10., hétfő

Thunar egyéni műveletek: ISO készítés, mount


A Crunchbang Linux alapértelmezett fájlkezelője a Thunar, melynek fejlesztési céljai közé tartozik, hogy gyorsabban induljon, mint bármely más böngésző, és rendkívül megbízható legyen, ezenkívül könnyen kiterjeszthető legyen a funkcionalitása plugin-ek és egyéb szkriptek segítségével. Talán gyorsaság és memóriahasználat szempontjából nem a legjobb (a PCManFM egy kicsit ebben megelőzi), viszont az általam korábban használat Konqueror-t, és Nautilus-t bőven lehagyja.
Sokáig nem használtam hozzá saját kiegészítéseket, mert a Crunchbang-ben alapból hozzá adtak már néhány egyéni műveletet (custom action, magyarul szörnyen hangzik). Ezek a következők: Fájlok keresése Catfish-el, Thunar megnyitása root jogosultsággal, Terminator megnyitása az adott mappában a felhasználó vagy root jogosultsággal.
Nautilus esetén is ezeket a kiegészítéseket használtam, de néha hasznos lenne, ha .iso fájlokat is gyorsan tudnék kezelni Thunar-ból. Például egy Daemon Tools funkcionalitását megvalósíthatná custom action-ökkel! Amikor ez eszembe jutott el is kezdtem átírni a korábbi Nautilus-nál használt .iso kezelő szkriptjeimet Thunar-os verzióra, így most megosztom, hátha szüksége van másoknak is rájuk.

előkészítés
3 szkripttel elég jól kezelni tudjuk már az .iso képfájlokat. Lesz egy képfájlt csatoló, egy leválasztó, és egy képfájlokat készítő szkript. Természetesen bárhova telepíthetőek lesznek, ez csak egy példa lesz:
#csináljunk a home-unkban egy .scripts könyvtárat, ha még nincs
mkdir -p ~/.scripts/ISOManager
#hozzuk létre a 3 szkriptet
touch ~/.scripts/ISOMount ~/.scripts/ISOunMount ~/.scripts/MakeISO
#tegyük őket futtathatóvá
chmod +x  ~/.scripts/ISOMount ~/.scripts/ISOunMount ~/.scripts/MakeISO
.iso képfájl csatolása
A Thunar-ban a Szerkesztés -> Egyéni műveletek beállítása... résznél, a "+" gomb megnyomása után adhatunk hozzá újat. A Név és Leírás mezőket töltsük ki tetszés szerint, a Parancs részhez, pedig írjuk be a következőt:
gksudo ~/.scripts/ISOManager/ISOMount %f
Megjelenési feltételeknél írjuk be, hogy csak a *.iso alakú Egyéb fájlok-nál jelenjen meg ez az opció. Ezután Terminálban:
gedit ~/.scripts/ISOManager/ISOMount
 Majd illesszük be a következő szkriptet, és mentsük el a fájlt:
#!/bin/bash
BASENAME=`basename "$1"`
ISO=`printf "%q" "$1"`
sudo mkdir -p "/media/$BASENAME"
if sudo mount -o loop -t iso9660 $ISO "/media/$BASENAME"; then
    if zenity --question --title "ISO Mounter" --text "$BASENAME Successfully Mounted. Open Volume?"; then
        thunar /media/"$BASENAME"
    fi
    exit 0
else
    sudo rmdir "/media/$BASENAME"
    zenity --error --title "ISO Mounter" --text "Cannot mount $BASENAME!"
    exit 1
fi
.iso képfájl leválasztása
Az előzőhöz hasonlóan kell hozzáadnunk, de a Parancs a következő legyen:
gksudo ~/.scripts/ISOManager/ISOunMount %f
Megjelenési feltételeknél írjuk be, hogy csak a *.iso alakú Egyéb fájlok-nál jelenjen meg ez az opció. Ezután Terminálban:
gedit ~/.scripts/ISOManager/ISOMount
Majd illesszük be a következő szkriptet, és mentsük el a fájlt:
#!/bin/bash
BASENAME=`basename $1`
sudo umount "/media/$BASENAME"
sudo rmdir "/media/$BASENAME"
zenity --info --text "Successfully unmounted /media/$BASENAME"
exit 0
.iso képfájl készítése
Ugyanúgy, mint az előzőeket. Parancs:
~/.scripts/ISOManager/MakeISO %N
Megjelenési feltételeknél írjuk be, hogy bármely fájlnál (*) jelenjen meg ez az opció, és minden fájltípust jelöljünk be. Majd Terminálban:
gedit ~/.scripts/ISOManager/MakeISO
Végül  illesszük be a következő szkriptet, és mentsük el a fájlt:
#!/bin/bash
zenity --question --text="Create an ISO image here?" || exit

(genisoimage -r -o generated.iso "$@" 2>&1 |
while read i; do
    PARCIAL=$(echo $i | grep -o [0-9]*'\.'[0-9]*)
    if [ $PARCIAL ]; then
        echo $PARCIAL
        echo "# $PARCIAL% done..."
    fi;
done
echo "# Finish." ) | zenity --progress --title="Creating \"$*.iso\""
Ha mindent jól csináltunk a következő menüpontokkal találkozhatunk Thunar-ban, ha jobb klikkel kapcsoltunk kijelölt fájlokra:




Thunar hivatalos Wiki-je, néhány új custom action
Thunar hivatalos oldala

2012. szeptember 9., vasárnap

Code::Blocks OpenGL (GLUT) támogatással


C és C++ fejlesztésekhez általában, ha valamilyen IDE-t használok az a Code::Blocks. Egyrészt nagyon könnyen konfigurálható, crossplatform és rengeteg kiegészítő érhető el hozzá.
Újabban viszont 3D grafikus programozáshoz használom, amelyhez szükséges eszközök telepítéséről és beállításáról fogok most írni.

Először is telepítsük a Code::Blocks-ot, egy nem hivatalos, de hivatalosan támogatott repository-ból (a Jens' repository-ban elérhetőek testing változatai is a programnak).
Adjuk hozzá a szükséges tárolókat és kulcsokat:
echo "deb http://apt.jenslody.de/stable squeeze main" | sudo tee -a /etc/apt/sources.list
echo "deb-src http://apt.jenslody.de/stable squeeze main" | sudo tee -a /etc/apt/sources.list

echo "deb http://apt.wxwidgets.org/ squeeze-wx main" | sudo tee -a /etc/apt/sources.list

wget -q http://apt.wxwidgets.org/key.asc -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install jens-lody-debian-keyring
Telepítsük a Code::Blocks-ot:
sudo apt-get install codeblocks
Ha mindezzel megvagyunk telepíhetjük az GLUT támogatást, amely az OpenGL kiegészítése és egyszerűbben programozhatunk benne:
sudo apt-get install libxxf86vm1 libxxf86vm-dev freeglut3 freeglut3-dev libglut3 libglut3-dev glutg3-dev libxt-dev libxt6
Ha GLUT-ot használva akarunk programozni, akkor a következőképpen kell létrehoznunk a projektünket:
A Code::Blocks megnyitása után, válasszuk ki a sablonoknál a "GLUT project"-et:
A "Go" gomb megnyomása után meg kell adnunk a projektünk címét, mentési helyét, majd egy "Next" után meg kell adni a GLUT header fájlok helyét, amit a /usr könyvtárból fog include-olni:


Ha minden kész egy F9 gombbal lefordíthatjuk a GLUT példaprogramot és futtathatjuk, ha minden rendben akkor a következőhöz hasonló eredményt kell látnunk:

2012. szeptember 3., hétfő

HP4530s Linux - További fogyasztás csökkentés


Ahogy egy korábbi cikkemben már írtam, a Linux rendszer néhány hardverközeli finomhangolásával további fogyasztást csökkentést érhetünk el. Így ezzel a laptopunk töltőmentes üzemidejének hosszát is meghosszabbíthatjuk.
Az írásomban leírtakat egy HP 4530S notebookon végeztem el Crunchbang Linux operációs rendszeren. Egyes paramétereket más gép és rendszer esetében meg kell változtatunk, máshol újabb energiaspórolási lehetőségek is léteznek, de alapvetően más környezetben is használható a szkript, melyet főként még az Ubuntu-s időmből mentettem át. Azóta sokat fejlődött a szkript, méréseim szerint körülbelül további 2W-ot lehet megspórolni vele, amely önmagában nem sok, de a korábbi cikkemmel együtt alkalmazva már nem is olyan elhanyagolható fogyasztás csökkentés.

Először is telepítsük fel a pm-utils csomagot:
sudo apt-get install pm-utils
majd hozzuk létre és tegyük futtathatóvá a szkriptünket, amely automatikus hálózati töltő csatlakozásakor, vagy kihúzásakor fog lefutni:
sudo touch /etc/pm/power.d/99-savings
sudo chmod +x /etc/pm/power.d/99-savings
sudo gedit /etc/pm/power.d/99-savings
 A megnyíló Gedit-be illesszük be a következő power.d szkriptet:
ac_power()
{
# Enable wake on lan
ethtool -s eth0 wol g

# Remount filesystems so the journal commit only happens every 30
# seconds.  By default this is 5 but, I prefer to reduce the disk
# activity a bit.
mount -o remount,commit=30,atime,diratime /
mount -o remount,commit=30,atime,diratime /home

# Set the Intel wifi to no power savings.
iwconfig wlan0 power off

# Turn Bluetooth on
modprobe bluetooth
hciconfig hci0 up

# Set kernel dirty page value back to default
echo 10 > /proc/sys/vm/dirty_ratio
echo 5 > /proc/sys/vm/dirty_background_ratio
echo 600 > /proc/sys/vm/dirty_writeback_centisecs

# Disable powersaving on disk
hdparm -B 255 -S 244 /dev/sda
 
# Turn swap on
swapon -a
 
# Turn laptop mode off
echo 0 > /proc/sys/vm/laptop_mode
 
# Turn nmi watchdog on
#echo 1 > /proc/sys/kernel/nmi_watchdog
 
# Disable powersaving on soundcard (AC97)
#echo 0 > /sys/module/snd_ac97_codec/parameters/power_save
# Disable powersaving on soundcard (HDA)
echo 0 > /sys/module/snd_hda_intel/parameters/power_save 
echo N > /sys/module/snd_hda_intel/parameters/power_save_controller

# Disable CD polling
hal-disable-polling --device /dev/scd0 --enable-polling

# Disable SATA power saving
for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo max_performance > $i; done

# Change cpu mode to ondemand
for i in /sys/devices/system/cpu/*/cpufreq/scaling_governor; do echo ondemand > $i; done

# Disable PCI power saving
for i in /sys/bus/pci/devices/*/power/control; do echo on > $i; done
}

battery_power()
{
# Disable wake on lan
ethtool -s eth0 wol d

# Change the filesystem commit times to 10 minutes.  This reduces disk
# activity
mount -o remount,commit=600,noatime,nodiratime /
mount -o remount,commit=600,noatime,nodiratime /home

# Set the intel wlan to save power
iwconfig wlan0 power on

# Turn Bluetooth off
hciconfig hci0 down
rmmod bluetooth

# Reduce disk activity by waiting up to 10 minutes before doing writes
echo 90 > /proc/sys/vm/dirty_ratio
echo 1 > /proc/sys/vm/dirty_background_ratio
echo 60000 > /proc/sys/vm/dirty_writeback_centisecs
 
# Put down the controller when not in use
echo 10 > /sys/module/snd_hda_intel/parameters/power_save
echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller
 
# Enable powersaving on disk after 60 second
hdparm -B 1 -S 12 /dev/sda
 
# Turn swap off
swapoff -a
 
# Turn laptop mode on
echo 5 > /proc/sys/vm/laptop_mode
 
# Turn nmi watchdog off
#echo 0 > /proc/sys/kernel/nmi_watchdog
 
# Turn soundcard off when not in use (AC97)
#echo 1 > /sys/module/snd_ac97_codec/parameters/power_save
#echo 1 > /dev/dsp
# Turn soundcard off when not in use (HDA)
echo 10 > /sys/module/snd_hda_intel/parameters/power_save
 
# Disable CD polling
hal-disable-polling --device /dev/scd0

# Enable SATA power saving
for i in /sys/class/scsi_host/host*/link_power_management_policy; do echo min_power > $i; done

# Change CPU frequency governor to powersave
for i in /sys/devices/system/cpu/*/cpufreq/scaling_governor; do echo powersave > $i; done

# Enable PCI power saving
for i in /sys/bus/pci/devices/*/power/control; do echo auto > $i; done

# Enable USB power saving
for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 2 > $i; done
for i in /sys/bus/usb/devices/*/power/level; do echo auto > $i; done
}

case "$1" in
    false) ac_power ;;
    true) battery_power ;;
esac
 Mentsük el a változásokat, lépjünk ki a Gedit-ből és ezzel már csökkentettük is laptunk fogyasztását! További fogyasztás csökkentő lehetőségekről is írok majd még a jövőben; legközelebb egy SSD meghajtó vásárlását tűztem ki célul az eredményekről szintén beszámolok majd. :)

LessWatts.org

2012. augusztus 17., péntek

HP4530s Bluetooth csatlakozás Crunchbangen

Most a Bluetooth életrekeltését fogom bemutatni HP 4530s laptopon, Crunchbang rendszeren.
Először arra lettem figyelmes, hogy a hciconfig parancs semmilyen kimenetet nem ad, ezért először a gépemben található Bluetooth chipset típusát akartam kideríteni, valamint hibaüzeneteket kerestem:
grep -i bluetooth /var/log/syslog
Ezt találtam, többek között:
Bluetooth: Atheros AR30xx firmware driver ver 1.0
Bluetooth: Error loading firmware
Tehát Atheros chipset-em van! Rövid keresgélés után megtaláltam, hogy Debianra milyen csomagokat kell feltenni a működéshez:
sudo apt-get install bluez bluetooth gnome-bluetooth bluez-firmware firmware-atheros
Ezenkívül, hogy biztosan legyen jogosultságunk használni a userünkkel a Bluetooth-t, állítsuk be jogosultságot rá magunknak:
sudo gedit /etc/dbus-1/system.d/bluetooth.conf
A busconfig tagen belül adjuk hozzá a következő sorokat, és mentsük el a változásokat. Természetesen a felhasználónév helyére írjuk be a saját felhasználónevünket.
<policy user="FELHASZNÁLÓNÉV">
   <allow own="org.bluez"/>
   <allow send_destination="org.bluez"/>
   <allow send_interface="org.bluez.Agent"/>
</policy>
Nézzük meg ezután, hogy a Bluetooth modul be van-e töltve:
lsmod | grep bluetooth
Ha egy hasonló kimenet kapunk, akkor már be van töltve a modul:
bluetooth             137855  24 bnep,rfcomm,ath3k,btusb
Ha nincs töltsük be, most:
sudo modprobe bluetooth
Indítsuk el a servicet:
sudo service bluetooth start
Majd az Openbox-os applet-et is indítsuk el:
bluetooth-applet &
Ekkor már meg tudjuk keresni Bluetooth eszközeinket a számítógéppel az előbb elindított applet segítségével, és párosítani is tudjuk, azonban Android esetében nekem soha nem akart csatlakozni, és a telefon a következőt írta ki:
Párosítva, de nincs csatlakoztatva
Rákeresve a problémára az internet tele van a megoldást kereső emberekkel. Grafikus felületen sehogy nem sikerült csatlakozásra bírni a telefont és a gépet, mindig "ismeretlen hiba történt", ha valamilyen fájlt szerettem volna küldeni a telefonomra. Természetesen az interneten rengeteg érdekes "megoldás" található a problémára pl.: vegyük ki és rakjuk vissza az akkumulátort, váltsuk angolra a telefon nyelvét... természetesen ezek nem működnek. :D

Viszont egy idő után konzolos felületen is kipróbáltam a csatlakozást, és valamiért az egyből működött:
Nézzük meg, hogy a Bluetooth  eszközünk jól van-e beállítva, ha kapunk valamilyen kimenetet valószínűleg rendben lesz:
hciconfig
Keressük meg a csatlakoztatni kívánt eszközt (természetesen a mobilon engedélyezni kell, hogy megtalálható legyen). Ez a program kiírja az elérhető eszközök MAC-címeit:
hcitool scan
Csatlakoztassuk az áldozatot:
sudo rfcomm connect 0 MAC-CÍM 1
A MAC-cím helyére írjuk be a telefon MAC-címét. Ha a parancs lefut akkor máris csatlakoztatva van a Bluetooth eszközünk, és küldhetünk rá fájlokat, tallózhatjuk a tartalmát, stb.

2012. augusztus 14., kedd

Raspberry Pi IP cím küldése emailben


Ha az ember SSH-n keresztül akar belépni Raspberry Pi-jére, otthon még könnyű dolga van, mert egy
nmap -sP 192.168.1.0-255
paranccsal könnyen kiderítheti mi is a helyi IP címe az eszköznek. Ha viszont már nem otthonról akarnánk belépni, a külső IP cím megszerzéséről kell gondoskodni, ami egy fokkal már bonyolultabb.
Ahhoz, hogy külső hálózatból tudjunk csatlakozni a Raspberry Pi-re, és routert használunk otthon, akkor a routerben a 22-es portot át kell irányítanunk a Raspberry-re. Ezt minden router esetében máshogy kell megtenni; én ezenkívül még MAC cím alapján rögzített helyi IP címhez kötöttem a gépet, mert így otthonról nem kell még az nmap-ot se elindítanom.
Mindez megvan mégis legtöbbször a külső IP cím megszerzésével van a probléma, újraindul a gép, áramszünet volt, megszakadt a net, stb. Ezért kitaláltam, hogy az internetre csatlakozás után küldje el - az előző cikket felhasználva - emailben a külső IP címét nekem. Természetesen ez se nekem jutott először eszembe, a hivatalos RPi wiki oldalon van egy hasonló, csak az bootolás után küldi el az IP címet, feltételezve, hogy egy rendszerindítás után csak egyszer csatlakozunk az internetre. Én olyat szerettem volna, ami minden csatlakozáskor elküldi az IP címet.
NetworkManager-hez könnyen írhat az ember ilyen szkriptet, de én nem szoktam használni ezt a programot, így az /etc/network mappában helyeztem el az emailküldő szkriptet.
  1. Először is hajtsuk végre az előző írásomban leírtakat.
  2. Terminálban adjuk ki a következő parancsokat:
    cd /etc/network/if-up.d/
    sudo touch ipaddress
    sudo chmod +x ipaddress
    sudo gedit ipaddress
    Az elkészítendő fájl nevében nem lehet . (pont), mert különben nem fog lefutni a szkript.
  3. A megnyíló Gedit-be másoljuk be a következő szkriptet:
    #! /bin/bash
    su FELHASZNÁLÓNÉV -c '(wget -q -O - checkip.dyndns.org | sed -e "s/.*Current IP Address: //" -e "s/<.*$//" | mailx -s "Raspberry IP Address (`date`)" EMAILCÍM) &'
A felhasználónév helyére írjuk be a Raspberry Pi-n használt felhasználónevünket, amihez beállítottuk a konzolos email küldést (Amely felhasználóval kiadtuk a ./setup_gmail_command_line.sh install parancsot). Az email cím helyére pedig írjuk be azt a címet, amelyen értesülni akarunk az új külső IP címről.
Egy újraindítással (sudo reboot) már ki is próbálhatjuk, hogy sikerült-e mindent beállítani. :)

2012. augusztus 10., péntek

Email küldés parancssorból


Gyakran hasznos lehet, ha parancssorból tudunk emailt küldeni. Például, ha letöltődött egy torrent, beállíthatjuk Transmission-ben, hogy küldjön egy figyelmeztető emailt nekünk, vagy bármilyen más esemény esetén is megtehetjük ezt. Egy szerverként használt Raspberry Pi-nél ez egy hasznos figyelmeztető lehetőség lehet.
Arra gondoltam, hogy ez akkor lehetne igazán hasznos, hogyha a saját Gmail-es címemről tudnék írni, így rákerestem használhatnám-e a Gmail SMTP szerverét levelezésre konzolból. Sajnos (:D) találtam egy elég szép megoldást, így most nem kellett semennyit se kódolnom. Ezen az oldalon találtam egy szkriptet, amely a mailx és msmtp programok config fájljait készíti elő a Gmail SMTP szerverével való kommunikációra.
Itt letölthetjük a szkriptet, majd futtatás előtt a /tmp/test_email fájlba kell írni valamilyen szöveget, amit tesztelésként elküldünk magunknak:
echo "Ez egy teszt mail." > /tmp/test_email
Ezután nyissuk meg a fájlt:
gedit setup_gmail_command_line.sh

Majd állítsuk be a Gmail felhasználónkat, és jelszavunkat a következő résznél
GMAIL_USER='YOUR_GMAIL_USER_NAME'
GMAIL_PASS='YOUR_GMAIL_USER_PASSWORD'
Ekkor már elindíthatjuk a programot:
chmod +x setup_gmail_command_line.sh
sudo ./setup_gmail_command_line.sh install

Ha minden jól ment mostmár küldhetünk emaileket akár parancssorból is a következő paranccsal:
mailx -s "email tárgya" -a /csatolmányelérésiút/csatolmány.zip címzett@valami.hu < /emailszövegelérésiút/email.txt

vagy, ha sietünk nem is kell külön fájlba megírni az email törzsét:

echo "teszt" | mailx -s "tesztmail" címzett@valami.hu

-s kapcsolóval adható meg az email tárgya, -a kapcsolóval a csatolmány (ez el is hagyható), utána a címzett, majd az emailünk törzse.

Kiegészítésként megírom, hogyha saját teljes nevünkön akarjuk elküldeni az email-t, akkor a szkript 107-ik sorában módosítani kell a "($GMAIL_USER)"-t, a következőképpen:
19-ik sorba írjuk be egy változóba a teljes nevünk:
$GMAIL_FULLNAME='Teljes Név'
majd a 107-ikben:
set from="$GMAIL_USER@gmail.com ($GMAIL_FULLNAME)"

Update: Nem rég vettem észre, hogy a syslog tele van a következőhöz hasonló hibákkal:
Warning: program /usr/sbin/sensible-mda unsafe: No such file or directory
SYSERR(root): Cannot exec /usr/sbin/sensible-mda: No such file or directory
Rövid utánaolvasás után azt találtam, hogy a cikkben említett telepítőszkript, nem telepíti a sendmail program egy függőségét, így az egy csomó hiba forrása lesz. A helyes működéshez szükség van a következő program telepítésére is:
sudo apt-get install sensible-mda

2012. augusztus 6., hétfő

Doxygen Ruby támogatás


Egy újabb Doxygen kiegészítés következik! Az elmúlt időben egyre többet használom Linuxos projektek alatt a Ruby nyelvet, és néha eljön az idő amikor dokumentációt kell készíteni az elkészített programokhoz. Ilyenkor mindig először a Doxygen nevű dokumentáció készítő programhoz fordulok, mint a múltkori esetben, sajnos azonban néha olyan nyelvet használok, amit nem támogat a fenti program. Így volt ez a Ruby esetében is, azonban rövid keresgélés után találtam egy kiegészítést, amivel Ruby kódokat is dokumentálhatunk Ruby-Doc stílusban. Több, mint egy éve készítette el Vincent Fourmond az említett kiegészítést, és céljai közé tartozik, hogy alkotása bekerüljön a Doxygen fő fejlesztési ágába.
Itt letölthetjük a patchet (mondjuk zip formában), csomagoljuk ki:
unzip fourmond-doxygen-ruby-patch-9a90763.zip
cd fourmond-doxygen-ruby-patch-9a90763.zip
A fordításhoz szükség lesz a következő csomagokra:
sudo apt-get install flex bison
Majd fordítsuk és telepítsük a programot:
./configure
make
sudo make install
Ezekután Doxyfile generálás után (doxygen -g), szerkesztve a Doxyfile-t keressük meg, és állítsuk be a következőket:
RUBY_RDOC_COMPATIBILITY= YES
FILE_PATTERNS          = *.rb
Lehetnek hibák a programban, de eddigi próbálkozásaim során nem futottam bele semmilyen nagyobb bug-ba, remélem hamarosan bekerül alapértelmezetten a támogatott nyelvek közé a Ruby.

2012. augusztus 1., szerda

Doxygen Bash szkript támogatás


A Doxygen egy dokumentáció generáló eszköz, amellyel viszonylag könnyen szinkronban tudjuk tartani a dokumentációnkat a kóddal, mert a dokumentációt a kódba kell írni kommentek formájában. Elég sokféle programozási nyelvet támogat, azonban például Bash szkriptek dokumentálására alapértelmezetten nem képes ez a program.
Kis módosítással azonban írhatunk akár teljes dokumentációt is a segítségével.

A Doxygen a legtöbb disztribúció fő szoftvertárolóiban szerepel, szóval telepíthetjük apt-get-tel:
sudo apt-get install doxygen
Doxyfile generálás:
doxygen -g
Ezután már szerkeszthetjük a Doxyfile-t, hogy testreszabjuk a dokumentációnkat:
gedit Doxyfile
A Bash szkriptek támogatásához a következő módosításokat tegyük meg (a megoldást egy amerikai fiatalember honlapján találtam meg):
FILE_PATTERNS = *.sh
INPUT_FILTER = "sed -e 's|##|//!|'"
FILTER_SOURCE_FILES = YES
 Ezután dupla kettőskereszt (##) után írhatjuk a dokumentációt, azonban csak kivonatok (brief description) formájában tehetjük meg. Ebben az esetben az egy oldalra szánt dokumentációkat sorfolytonosan, összefüggően kell megírni; valamint elég sok Doxygen parancsot nem használhatunk.

Én a következő parancsokat szoktam használni (az összes parancs leírása itt található):
@author
@file
@version
@mainpage
@page
@section
@subsection
@param
@return
@details
\code - \endcode
Természetesen működik néhány parancs még, de ezeket teszteltem.

2012. július 25., szerda

apt-get update/upgrade és insserv hiba

Apt-get telepítés közben valamilyen hiba történt, ekkor találkoztam a következő esettel. Telepítés közben valami tönkre ment, és onnantól frissítésnél, telepítésnél az apt-get közölte egy csomó hibaüzenet kíséretében, hogy nem hajlandó dolgozni.
Ilyesmi hibaüzeneteket kaptam:
insserv: warning: script 'smfpd' missing LSB tags and overrides
insserv: Starting smfpd depends on rc.local and therefore on system facility `$all' which can not be true!
Rövid olvasgatás után találtam egy hasonló esetet, kiderült, hogy az init.d szkripteknél az egyiknél hiányoznak az LSB mezők. Ezekben a mezőkben megadhatóak az init szkripteknél futás idejű függőségek, melyek segítségével könnyebben megállapítható egy helyes szkript lefutási sorrend bootolásnál, és fel is gyorsítható a bootolás több szkript párhuzamos futtatásával. Azonban egy optimális sorrend eldöntéséhez szükségesek ezek a függőségi információk. Először a Debian Lenny változat kiadásakor jelentek meg, Squeeze-ben pedig már alapértelmezett beállítás volt a függőség alapú boot sorrend meghatározás.
A hiba megoldásához csak a hiányzó függőségeket kell pótolnunk:

Nyissuk meg a hibás init scriptet (az error-ban az smfpd szkriptben hiányolt valamit, ez amúgy a Samsung nyomtató driver):

sudo gedit /etc/init.d/smfpd
Majd a megnyíló Gedit-ben a kommentek után helyezzük el a következő LSB mezőket:
### BEGIN INIT INFO
# Provides: smfpd # Required-Start: $syslog
# Required-Stop: $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Samsung Unified Linux Driver LPT Support daemon
# Description: Enable support for LPT port service provided by Samsung Unified Linux Driver package.
### END INIT INFO

Mentsük el a változásokat, és már kész is! :)

Kiegészítés: A hibát okozó csomagra, amúgy nem sok szükség van induláskor, mert LPT nyomtatók esetén (párhuzamos porton keresztül csatlakozó nyomtató) kapcsolja be a TCP porton keresztüli elérést. Nem sokan használnak manapság már ilyen eszközöket, szóval a hiba kijavítása után nyugodtan kikapcsolhatjuk. Ehhez ajánlom az rcconf nevű programot, mellyel kikapcsolhatjuk milyen service-ek induljanak a rendszer elindulásakor:
sudo apt-get install rcconf 
majd:
sudo rcconf 

Több információ az LSBInitScriptekről

2012. július 18., szerda

Android képernyő megosztás PC-n

Az egyetemen gyakran látom, hogy oktatók odamennek és az iPadjüket csatlakoztatják a kivetítőre egy átalakítóval, és már megy is az előadás. Ez alapján jutott eszembe, hogy ezt talán egy Android-os telefonnal is megtehetném. Az első megoldás talán egy MHL-HDMI vagy VGA átalakító lenne, sajnos ezek azonban elég drágák.
Találtam azonban egy másik lehetőséget, amelynél rövid teszt után arra jutottam, hogy bár prezentáció előadásra nem alkalmas a módszer, azonban máskor hasznos lehet. A telefon képernyőjét USB kábelen keresztül is megoszthatjuk. Ilyenkor nem iktatódik ki a "rendszerből" a számítógép, és a kép is akadozni fog, mégis mondjuk egy Androidos alkalmazás bemutatására hasznos eszköz lehet.

A, Először is telepítsük fel a Java Development Kit-et (JDK):
sudo apt-get install sun-java6-jdk
B, Szükségünk lesz az Android SDK-ra is:
     1. Töltsük le a legfrissebb SDK-t ITT.
     2. Csomagoljuk ki:
tar -xvzf android-sdk_r20-linux.tgz
     3. Lépjünk be a tools/ könyvtárba:
cd android-sdk-linux/tools/
     4.  Indítsuk el az SDK Manager-t, és telepísük fel az Android SDK Platform-tools-t
     5. Állítsuk be a rendszert, a telefon felismeréséhez:
sudo echo "SUBSYSTEM==\"usb\", ATTR{idVendor}==\"04e8\", MODE=\"0666\", GROUP=\"plugdev\"" > /etc/udev/rules.d/51-android.rules
sudo chmod a+r /etc/udev/rules.d/51-android.rules
 idVendor-hoz a telefon gyártójának USB Vendor ID-jét írjuk, innen megtudhatjuk.
     6. Másoljuk át tools könyvtárból platform-tools-ba az ADB és teszteljük, hogy minden tökéletesen működik-e?
cp ../platform-tools/adb ./
Csatlakoztassuk a telefont az USB portra, majd:
adb devices
Ha kilistázza a telefonunkat, az SDK-t helyesen telepítettük fel.

C, A telefonon kapcsoljuk be a Beállítások/Alkalmazások/Fejlesztés menüpont alatt az USB-hibakeresés opciót.

D, A képernyőkép megosztására két programot is találtam, mindkettőt Java-ban írták, szóval Linux-on kívűl Win-en, Mac-en is használhatóak.

Az első az Android Screen Cast nevű, melyet akár böngészőból is indíthatunk, vagy letöltés után:
javaws androidscreencast.jnlp
A képernyőkép megosztásán kívűl, rootolt eszköz esetén a számítógépről egérrel és billentyűzettel vezérelhető a telefon, jobb egér gombra fekvő módba vált a kép, képes videó felvételére, és van egy nagyon fapados fájlböngésző is a programban.

A másik program az AShot nevű:

Letöltés után csomagoljuk ki, és indítsuk:
unzip AndroidScreenCapture-1.1.zip
cd AndroidScreenCapture_1.1/
java -jar AShot-1.1.jar
Ez a program sokkal jobban megnyerte a tetszésem, mint az előző. Képes fullscreen-ben mutatni a telefon kijelzőjét, és forgatni is lehet a kijelzett képet.

Sajnos kicsit akadozik a kép, de van amikor hasznos lehet ez az eszköz.

2012. július 10., kedd

Gimp 2.8 telepítése Debian Squeeze-re

Már elég régen megjelent a Gimp nevű képszerkesztő program 2.8-as verziója, mely egy régen várt új funkciót tartalmaz: egy ablakban jeleníti meg az eszköztárakat a főablakkal, így sok bosszúságot előz meg, melyet még okozott. Sokat próbálkoztam már a telepítéssel forráskódból, de mindig elakadtam valamelyik függőség telepítésénél.
Most azonban találtam egy szkriptet, melynek segítségével minden függőséget lefordíthatunk és egy működő Gimp 2.8-at kapunk Debian Squeeze-en.
A szkriptet ITT találtam, köszönet érte Andrea Roscioli-nak. Eredetileg Ubuntu 10.04 (Lucid Lynx-re készítette el):
#!/bin/sh
# by this script you can install gimp 2.8 on your ubuntu 10.04 LTS lucid
# this script has been made by http://www.facebook.com/andrea.roscioli
# this script has been tested on ubuntu 10.04 LTS only
# make a new dir called tmp*****************************
mkdir -p ~/tmp/gimp
chmod 777 ~/tmp
cd ~/tmp/gimp
# download gimp**************************************
wget ftp://ftp.gimp.org/pub/gimp/v2.8/gimp-2.8.0.tar.bz2
tar -xjf gimp-2.8.0.tar.bz2
rm -f gimp-2.8.0.tar.bz2
export PATH=/opt/gimp-2.8/bin:$PATH
export PKG_CONFIG_PATH=/opt/gimp-2.8/lib/pkgconfig
export LD_LIBRARY_PATH=/opt/gimp-2.8/lib
#***************************************************
sudo apt-get build-dep gimp
sudo apt-get install git-core
#****************************************************
#install libtool************************************
sudo apt-get install libtool
#install babl***************************************
git clone git://git.gnome.org/babl
cd babl
./autogen.sh --prefix=/opt/gimp-2.8
make -j5
sudo make install -j5
cd ..
rm -rf babl
#install glib***************************************
wget http://ftp.gnome.org/pub/gnome/sources/glib/2.32/glib-2.32.2.tar.xz
tar -xvf glib-2.32.2.tar.xz
rm -f glib-2.32.2.tar.xz
cd glib-2.32.2
./configure --prefix=/opt/gimp-2.8
make
sudo make install
cd ..
rm -rf glib-2.32.2
#install gegl****************************************
wget ftp://ftp.gimp.org/pub/gegl/0.2/gegl-0.2.0.tar.bz2
tar -xjf gegl-0.2.0.tar.bz2
rm -f gegl-0.2.0.tar.bz2
cd gegl-0.2.0
./configure --prefix=/opt/gimp-2.8
make -j5 && sudo make install -j5
cd ..
rm -rf gegl-0.2.0
#install atk*****************************************
wget http://ftp.gnome.org/pub/gnome/sources/atk/2.4/atk-2.4.0.tar.xz
tar -xvf atk-2.4.0.tar.xz
rm -f atk-2.4.0.tar.xz
cd atk-2.4.0
./configure --prefix=/opt/gimp-2.8
make -j5 && sudo make install -j5
cd ..
rm -rf atk-2.4.0
#install pango***************************************
wget http://ftp.gnome.org/pub/gnome/sources/pango/1.30/pango-1.30.0.tar.xz
tar -xvf pango-1.30.0.tar.xz
rm -f pango-1.30.0.tar.xz
cd pango-1.30.0
./configure --prefix=/opt/gimp-2.8
make -j5 && sudo make install -j5
cd ..
rm -rf pango-1.30.0
#install gdk-pixbuf**********************************
wget http://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/2.26/gdk-pixbuf-2.26.1.tar.xz
tar -xvf gdk-pixbuf-2.26.1.tar.xz
rm -f gdk-pixbuf-2.26.1.tar.xz
cd gdk-pixbuf-2.26.1
./configure --prefix=/opt/gimp-2.8
make -j5 && sudo make install -j5
cd ..
rm -rf gdk-pixbuf-2.26.1
#install pixman**************************************
wget http://cairographics.org/releases/pixman-0.24.4.tar.gz
tar -zxvf pixman-0.24.4.tar.gz
rm -f pixman-0.24.4.tar.gz
cd pixman-0.24.4
./configure --prefix=/opt/gimp-2.8
make -j5 && sudo make install -j5
cd ..
rm -rf pixman-0.24.4
#install cairo****************************************
wget http://cairographics.org/releases/cairo-1.12.2.tar.xz
tar -xvf cairo-1.12.2.tar.xz
rm -f cairo-1.12.2.tar.xz
cd cairo-1.12.2
./configure --prefix=/opt/gimp-2.8
make -j5 && sudo make install -j5
cd ..
rm -rf cairo-1.12.2
#install gtk+****************************************
wget http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.10.tar.xz
tar -xvf gtk+-2.24.10.tar.xz
rm -f gtk+-2.24.10.tar.xz
cd gtk+-2.24.10
./configure --prefix=/opt/gimp-2.8
make -j5 && sudo make install -j5
cd ..
rm -rf gtk+-2.24.10
#install gimp****************************************
cd gimp-2.8.0
./configure --prefix=/opt/gimp-2.8
make -j5
sudo make install -j5
cd ..
rm -rf gimp-2.8.0
cd
rm -rf ~/tmp/gimp
Ezekután az /opt/gimp-2.8/bin/gimp paranccsal indítható a Gimp, és a "Windows->Single-Window Mode" opcióval állítható be a régen áhított funkció. Ha mindent jól végeztünk el a következőhöz hasonló látvány fogad majd: