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:

2012. június 23., szombat

Firefox sqlite tömörítés

Már régen írtam cikket a Firefox könyvjelzők szinkronizálásáról Dropboxban, mely művelet során a places.sqlite fájlban eltárolt könyvjelzőket tároljuk el Dropboxban. A könyvjelzőkön kívűl még sok mindent tárol a Firefox SQL adatbázisban, például a cookie-kat, letöltéseket, kiegészítőket is. Ezen fájlok viszont hajlamosak a hosszantartó böngészések során igencsak megnőni. Az Sqlite nevű program azonban tartogat egy megoldást, mellyel jelentősen csökkenthetjük ezen fájlok méretét (Dropboxban tárolás esetén hasznos tulajdonság), és ezzel a böngésző gyorsaságát is növelhetjük.
Az interneten sok leírás található, hogyan tömöríthetnénk ezeket a fájlokat, én az sqlite3 nevű programot használom, szükség esetén feltelepíti a szkript:
#!/bin/bash
if [ `aptitude search '~i ^sqlite3$' | grep "sqlite3" -c` == '0' ];
then
sudo apt-get install sqlite3
fi

for i in /home/$USER/.mozilla/firefox/*/*.sqlite
do
echo -en "\e[1;33mOptimizing: \e[0;37m$i... "

sqlite3 $i 'VACUUM;'

if [ $? -eq 0 ]
then
echo -e "\e[1;32mOK\e[0;37m"
else
echo -e "\e[1;31mERROR\e[0;37m"
fi
done
 A következőképpen állíthatjuk szolgálatunkba a szkriptet:
sudo gedit /usr/bin/vacuum
A megnyíló Geditbe illesszük be a fenti szkriptet, majd adjunk neki futási jogosultságot:
sudo chmod +x /usr/bin/vacuum

Ezután már futásra kész a szkript, bármilyen mappából kiadhatjuk a vacuum parancsot, én nálam a places.sqlite fájlt jelentősen rövidítette:
-rw-r--r--  1 chef chef 10485760 jún   22 22.35 places.sqlite
-rw-r--r--  1 chef chef 4214784 jún   22 23.06 places.sqlite