Moduł ten potrafi między innymi konwertować kod programu w języku perl do kodu w języku C ale to nie jedyna możliwość tego modułu. Moduł ten dostępny jest w AUR - polecam ustawić zmienną skiptest na 1, u mnie gdzieś tam przy module B::CC muli i wywala się ale inne moduły działają raczej dobrze.. Wersja B::C 1.27 działa najlepiej z perlem w wersji 5.12.1 (dla użytkowników innych systemów/dystrybucji z inną wersję perla polecam zapoznanie się z tą stroną). Moduł nie jest jakoś bardzo dopracowany ale porusza ciekawe zagadnienie związane z językami skryptowymi, no cóż poniżej podam dwa przykładowe sposoby jego wykorzystania..
perl→C→elf
Są dwie szkoły kompilacji:
- perlcc foo.pl -o foo
- perl -MO=C,-O2,-ofoo.c foo.pl
perl /usr/lib/perl5/vendor_perl/bin/cc_harness -o foo foo.c
Jak widać w pierwszym przykładzie, jest to nakładka ułatwiająca kompilację. Drugi przykład jest już trochę bardziej złożony - pierwsze polecenie generuje kod C, a następne generuje komendę z parametrami kompilatora gcc i go uruchamia. W obu przypadkach generuje się gotowy do służby plik elf. :)
perl→perl bytecode
Jest też możliwość kompilacji do bytecode (coś jak pythonowe pyc):
Fajny moduł pogody ostatnio znalazłem.. Łatwe i przyjemne jak sami widzicie. Tych kilka linijek kodu perl:
#!/usr/bin/perl
use Weather::Google;
use encoding 'utf8';
my $gw = Weather::Google->new('Warszawa, PL');
my ($temp,$info) = $gw->current('temp_c', 'condition');
printf("%s°C (%s)\n", $temp, $info);
# $C = (5/9)*($F-32); # Farenhajty na Celsjusze
# print "Today's high: ", $gw->forecast('Today','condition') . "\n";
Żeby to w conky działało wystarczy dopisać: ${execi 1800 /path/to/nasz_plik.pl}.
BTW. 1800 to 30 minut(?).
Optymalizacja baz danych sqlite3 dla firefoxa podnosi wydajność i przyśpiesza start przeglądarki.. Poniższy skrypt jest wyposażony w detekcję na obecność sqlite3 w systemie i sprawdzi czy firefox jest już uruchomiony. Skrypt wyszuka wszystkie pliki baz danych w katalogu użytkownika i je zoptymalizuje..
#!/bin/bash
#detekcja firefoxa
if pgrep -u "`id -un`" -x "firefox" &> /dev/null
then
echo "Wpierw zamknij firefoxa.."
exit 1
fi
#detekcja sqlite3
if ! BIN="`which sqlite3 2> /dev/null`"
then
echo "Brakuje programu sqlite3.."
exit 1
fi
#optymalizacja
find ~/.mozilla/ -type f -name "*.sqlite" -exec $BIN {} VACUUM \;
find ~/.mozilla/ -type f -name "*.sqlite" -exec $BIN {} REINDEX \;
Pastebinowy mirror..
Napi-bash (strona domowa) daje nam możliwość szybkiego pobrania napisów do filmów, które mamy na dysku. Nie umie ich wysyłać ale nie miałem takiego zamiaru. Skrypt ma wersję gui i cli, a także specjalną procedurę integracyjną z nautilusem. Są cztery sposoby użycia:
- Tryb cli, wszystko na konsoli:
napi-bash -c <plik> [kolejne pliki]
- Tryb gui, informacja w libnotify (powiadomienia systemowe):
napi-bash -g <plik> [kolejne pliki]
- Jako "skrypt nautilusa", wystarczy podlinkować napi-bash do folderu
~/.gnome2/nautilus-scripts/ (będzie działał jak wywołany z opcją "-g").
- Zrobić albo plik .desktop umieszczający ikonkę w menu programy albo skrót klawiszowy w twoim środowisku graficznym (wymagany zenity dla okna wyboru pliku):
napi-bash -g
Nautilus, skróty klawiszowe: Jeżeli mamy uaktywnione dynamiczne skróty klawiszowe, wystarczy wejść do menu "Plik → Skrypty", zaznaczyć podlinkowany wcześniej skrypt i nacisnąć swoją kombinację klawiszy.
Na stronie domowej można obejrzeć przykładowe zrzuty ekranu, changelog oraz pobrać program.
Ostatnio niechcący natrafiłem w polskim repo Archa na mały skrypt o nazwie "radio", trochę on mało wygodny pomyślałem, z ciekawości zajrzałem do środka, to co zobaczyłem wzbudziło we mnie "fuj" (o gustach się nie dyskutuje). Pod wpływem chwili napisałem ten skrypt, dłużej pisałem ten komentarz, może to przez późną porę 3:30 w nocy. Wracając do skryptu: użytkownik dostaje prosty konfig (możliwość dodania swoich stacji), interface na ncurses, posortowaną listę, itd.
Kod programu:
#!/bin/bash
##################################################################
# Nazwy i adresy stacji radiowych zaczerpnięte ze skryptu: #
# http://www.supermegazord.pl/paczki/radio/ #
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
# Autor: 3ED <krzysztof1987@gmail.com> http://3ed.jogger.pl/ #
##################################################################
# Lokalizacje radiowych list
for i in "/usr/share/dradio/dradio.lista" "$HOME/.dradio.lista"; do
if [ -r "$i" ]; then . $i; fi
done
play() {
dialog --infobox 'Odtwarzam strumień:
'"$2"'
>>> '"$1"' <<<
Aby przerwac i powrocic do menu nacisnij "q"
Regulacja glosnosci "vol- 9" i "vol+ 0"
Pauza "p", wyciszenie "m"' 10 50
mplayer -really-quiet $2 &> /dev/null
}
typeset tmp=/tmp/.radio.name
typeset -i e=0
until [ "$e" != "0" ]; do
e=1
eval $(echo 'dialog --cancel-label "Zakończ" --ok-label "Odtwarzaj" --menu "Wybierz stację" 24 40 40 '$(
for i in ${!NAME[*]}; do echo '"'"${NAME[$i]}"'" ""'; done|sort
)' 2> $tmp; e=$?')
if [ "$e" != "0" ]; then
break
else
e=1
fi
NAMESEL="$(cat $tmp)"
for i in ${!NAME[*]}; do
if [ "${NAME[$i]}" = "${NAMESEL}" ]; then
e=0
play "${NAME[$i]}" "${ADRESS[$i]}"
fi
done
done
clear
Lista stacji radiowych:
# /usr/share/dradio/dradio.lista
# Konfiguracja radiowej listy
NAME+=("Radio Zet")
ADRESS+=("http://www.radiozet.pl/content/stream/radiozet.pls")
NAME+=("RMF FM")
ADRESS+=("http://213.251.141.62:8000/")
NAME+=("POLSKASTACJA Best of 80 90")
ADRESS+=("http://polskastacja.pl/play/aac_np.pls")
NAME+=("Radio Złote Przeboje")
ADRESS+=("http://lodz.radio.pionier.net.pl:8000/pl/zloteprzeboje.ogg")
NAME+=("Polskastacja Muzyka na Topie")
ADRESS+=("http://polskastacja.pl/play/aac_mnt.pls")
NAME+=("Planeta fm")
ADRESS+=("http://213.251.141.82:8150")
NAME+=("Radiostacja")
ADRESS+=("http://213.251.141.82:8150")
NAME+=("Radio Eska")
ADRESS+=("http://warszawa1-1.radio.pionier.net.pl:8000/eska-warszawa.ogg")
NAME+=("Antyradio")
ADRESS+=("http://213.251.138.121:7000")
NAME+=("Tylko Polskie Przeboje")
ADRESS+=("http://polskastacja.pl/play/aac_tpp.pls")
NAME+=("Best stacja")
ADRESS+=("http://www.beststacja.net.pl/48.m3u")
NAME+=("TOK FM")
ADRESS+=("http://sask1-3.radio.pionier.net.pl:8000/pl/radiotok.ogg")
NAME+=("Jungletrain")
ADRESS+=("http://stream1.jungletrain.net:8000")
NAME+=("Bassdrive")
ADRESS+=("http://uk.streams.bassdrive.com:8000")
NAME+=("Radio Team")
ADRESS+=("http://www.emiter.teamradio.pl:8095")
NAME+=("Art Radio")
ADRESS+=("http://www.radioart.pl/radioART_jedynka.m3u")
NAME+=("Radio Luz")
ADRESS+=("http://radioluz.pwr.wroc.pl/listen.pls")
NAME+=("Radio Afera")
ADRESS+=("http://lodz.radio.pionier.net.pl:8000/pl/afera.ogg")
NAME+=("Radio Akadera")
ADRESS+=("http://lodz.radio.pionier.net.pl:8000/pl/akadera.ogg")
NAME+=("Radio Centrum")
ADRESS+=("http://www.centrum.fm/ogg96.m3u")
NAME+=("Roxyfm")
ADRESS+=("http://lodz.radio.pionier.net.pl:8000/pl/roxyfm.ogg")
NAME+=("Radio horyzont")
ADRESS+=("http://radiohoryzont.net:9050")
NAME+=("Radio merkury")
ADRESS+=("http://lodz.radio.pionier.net.pl:8000/pl/merkury.ogg")
NAME+=("Radio kolor")
ADRESS+=("http://radiokolor.streamhost.pl:8074")
NAME+=("Idobi Radio")
ADRESS+=("http://72.13.82.202:80")
NAME+=("Radio Zak")
ADRESS+=("http://lodz.radio.pionier.net.pl:8000/radiozak.ogg")
NAME+=("Radio dla Ciebie")
ADRESS+=("http://sc9232.xpx.pl:9232")
NAME+=("Nectarine")
ADRESS+=("http://nectarine.sik.fi:8002/live.mp3")
NAME+=("Radio Wa Ma")
ADRESS+=("http://213.251.139.121:9500")
NAME+=("Radio Ławeczka")
ADRESS+=("http://www.laweczka.net/laweczka.m3u")
NAME+=("Radio Maryja")
ADRESS+=("mms://195.94.205.211/rm")
First public released aurpac. This is Light'n'fast manager aur and pacman repository. Now pacman is used only for search and remove packages, but this is verion 0.1. ;)
Features in this verion: coloring outputs, very fast searching tool looks like pacman (-Ss and -Ssp), installing (with deps) from aur (-S), upgrading (-Su), printing information about package (-Si), all from pacman -R*.
Pierwsze publiczne wydanie aurpac. Jest to lekki i szybki menadżer repozytoriów aur i pacmana. Obecnie pacman jest używany tylko do wyszukiwania i usuwania paczek, ale to dopiero wersja 0.1.
Nowości w tej wersji: koloruje output, bardzo szybkie narzędzie do wyszukiwania w aur wyglądające jak pacman (-Ss i -Ssp), instalowanie (z zaleźnościami) z aur (-S), aktualizowanie (-Su), wyświetlanie informacji o pakiecie (-Si), wszystko z pacman -R*.
Get source/żródła from aur site.
Narzędzie to służy do wyświetlania w menu "Miejsca" (en: "Places", możesz nazwać inaczej), podstawowe pozycje jak "Domowy" (en: "Home"), czy wyszukiwanie plików, itp. oraz dodatkowe podmenu: "Zakładki" (en: "Bookmarks") oraz "Ostatnio używane" (en: "Recently used"). Te dwa podmenu są generowane automatycznie na podstawie mechanizmów większości przeglądarek plików opartych na gtk, takich jak np: nautilus, thunar, pcmanfs, itp. oraz dolphin (KDE4, nie testowane). Generowane są przy pomocy regexpów tak by menu wyświetlało się jak najszybciej jest to możliwe (do tego perla użyłem).
Plik konfiguracyjny jest bardzo prosty, w części "opcje podstawowe" można wybrać polecenia, które będą wywoływane podczas konkretnych akcji, np: podczas uruchamiania "Domowy" standardowo zostanie wywołany "nautilus --no-desktop", można zmienić to polecenie np. na "pcmanfs", itd. To samo tyczy się innych opcji.
Druga część pliku to "opcje zaawansowane", tutaj jest miejsce na dopisanie przy użyciu echo lub wbudowanych funkcji, dodatkowych opcji, lub ich modyfikacja. Opcja: "print_item <name> <cmd> [path]" służy po prostu do wyświetlania pozycji, mogą one być dowolnymi programami, oczywiście. "Path" ("/ścieżka/do/") nie jest wymagany, a "name" służy do określania nazwy (proszę się nie martwić o te $"śmieszne" parametry, one po prostu pobierają ich polskie odpowiedniki przy pomocy gettext, jest to zwyczajny tekst). Opcja "seperator" służy tylko i wyłącznie do oddzielania poziomymi krechami, pozycji. "bookmarks_menu" i "recentlyused_menu" generują automatycznie zawartość dla wcześniej wspomnianych podmenu.
Ta malutka aplikacja dostępna jest w AUR, zapraszam do testów.
Openbox od wersji 3.4.7 posiada program gdm-control, który potrafi skonfigurować tak GDM, że gdy zakończymy sesje, wykona on ustawioną mu akcję. Oczywiście jak na news przystało, ciekawe, ciekawe, ale jak u licha tego używać? Można zrobić wpisy w menu, coś na podobieństwo tego:
<item label="Wyłącz komputer">
<action name="Execute">
<execute>
gdm-control --shutdown && openbox --exit
</execute>
</action>
</item>
Szczerze? Nie podoba mnie się to! Postanowiłem napisać małą aplikacyjkę (o ile można to tak nazwać).. Moim wyborem padł gtkdialog i glade. Tak wygląda chwilka klikania (lub "mlaskania urządzeniem wskazującym" - wyborne jabłko) w glade:

a tak wygląda wygenerowany przez niego kod xml:
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
<widget class="GtkWindow" id="MAIN_WINDOW">
<property name="width_request">620</property>
<property name="title">Wyłącznik openbox</property>
<property name="icon_name">application-exit</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
<property name="modal">False</property>
<property name="resizable">False</property>
<property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="focus_on_map">True</property>
<property name="urgency_hint">True</property>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="border_width">6</property>
<child>
<widget class="GtkButton" id="button1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="gdm-control --none"/>
<signal name="clicked" handler="openbox --exit"/>
<signal name="clicked" handler="exit:Normal"/>
<child>
<widget class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="icon_size">6</property>
<property name="pixel_size">128</property>
<property name="icon_name">system-log-out</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkButton" id="button2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="gnome-screensaver-command -l"/>
<signal name="clicked" handler="exit:system-lock-screen"/>
<child>
<widget class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="pixel_size">128</property>
<property name="icon_name">system-lock-screen</property>
</widget>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button3">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="gdm-control --reboot"/>
<signal name="clicked" handler="openbox --exit"/>
<signal name="clicked" handler="exit:Normal"/>
<child>
<widget class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="icon_size">0</property>
<property name="pixel_size">128</property>
<property name="icon_name">view-refresh</property>
</widget>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button4">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="gdm-control --shutdown"/>
<signal name="clicked" handler="openbox --exit" />
<signal name="clicked" handler="exit:Shutdown"/>
<child>
<widget class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="icon_size">0</property>
<property name="pixel_size">128</property>
<property name="icon_name">system-shutdown</property>
</widget>
</child>
</widget>
<packing>
<property name="position">3</property>
</packing>
</child>
</widget>
</child>
<child>
<widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="Akcja">
<property name="visible">True</property>
</widget>
<packing>
<property name="padding">6</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="Anuluj">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_default">True</property>
<property name="receives_default">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="exit:Anuluj" />
<child>
<widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<child>
<widget class="GtkImage" id="Anuluj_image">
<property name="visible">True</property>
<property name="stock">gtk-cancel</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">3</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="Anuluj_label">
<property name="visible">True</property>
<property name="label" translatable="yes">Anuluj</property>
<property name="justify">GTK_JUSTIFY_CENTER</property>
</widget>
<packing>
<property name="fill">False</property>
<property name="padding">3</property>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
Tak to się uruchamia:
gtkdialog --glade-xml=PATHTOFILE/shutdowner.glade \
--program=MAIN_WINDOW
Prawda, że bułeczka z masłem?
O takim np. kodem wyświtlisz info:
curl 'http://aur.archlinux.org/rpc.php?type=info&arg='"flv2x264" \
2>/dev/null \
|sed 's/{\|}\|\[\|\]//g
s/^\("type":".*"\),"results":\(.*\)/,\1,\2/g
s/,"/'"\n"'/g
s/":/=/g
s/\\\//\//g'
A takim wyszukasz pakiety:
curl 'http://aur.archlinux.org/rpc.php?type=search&arg='"pacman" \
2>/dev/null \
|sed 's/{\|}\|\[\|\]//g
s/^\("type":".*"\),"results":\(.*\)/,\1,\2/g
s/,"/'"\n"'/g
s/":/=/g
s/\\\//\//g' \
|sed '/Name=/!d
s/Name="\(.*\)"/\1/g'
Oczywiście to nie jest może uniwersalny interpretator jsona pod bash ale z zadaniem sobie radzi, mój klient aura jest o to oparty ale jest też wiecznie niedokończony, więc na razie go nie udostępnię.. Jest jakiś inny interpretator tego ohydnego jsona dla basha?
Opiszę tutaj moją konfigurację niezależną od WM/DE. Można to sobie dowolnie zmodyfikować.
Scroll_Lock: Należy do pliku '~/.xmodmaprc' dopisać taką linijkę:
add mod3 = Scroll_Lock
Nazwy klawiszy multimedialnych: Programem xev uruchomionym na konsoli należy sprawdzić 'keycode' przycisków (te białe okienko musi być aktywne, wyniki na konsoli).
Później wrzucić keykode do '~/.xmodmaprc' wraz z nową nazwą. Ja mam tak:
keycode 160 = XF86AudioMute
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume
keycode 162 = XF86AudioPause
keycode 144 = XF86AudioPrev
keycode 153 = XF86AudioNext
Wydaje mi się, że keycode są w każdej klawiaturze takie same, klawiatury różnią się tylko ilością przycisków, oto niektóre z nich:
keycode 234 = XF86Back
keycode 233 = XF86Forward
keycode 232 = XF86Stop
keycode 231 = XF86Refresh
keycode 229 = XF86Search
keycode 230 = XF86Favorites
keycode 178 = XF86HomePage
keycode 236 = XF86Mail
keycode 164 = XF86AudioStop
Akcje klawiszy: Program xbindkeys posłuży do podczepienia pod klawisze dowolnych poleceń. Można to oczywiście też zrobić w swoim WM ale oczywiście to tylko dodatkowa robota, za każdą zmianą trzeba przypisywać od nowa, a tu "raz ciach i koniec".
#Ustaw klawisz jako rozpoznawalny modyfikator dla xbindkeys
#keystate_numlock = enable
#keystate_capslock = enable
keystate_scrolllock= enable
#
# /-----------------------\
# | Klawisze | Nazwa |
# |-------------|---------|
# | CTRL | Control |
# | Shift | Shift |
# | ALT (Lewy) | Alt |
# | ALT (Prawy) | Mod5 |
# | WIN | Mod4 |
# | Scroll Lock | Mod3 |
# | Num Lock | Mod2 |
# \-----------------------/
#
# Multimedialne na mojej klawiaturze:
# XF86AudioLowerVolume, XF86AudioRaiseVolume, XF86AudioMute,
# XF86AudioPause, XF86AudioPrev, XF86AudioNext
# ---------------------------------------------------------
# "Tutaj polecenie. "
# XF86AudioLowerVolume + Control
# Jeśli nie chcesz to olej plus i wszystko po prawej..
Gotowe skrypty bash: Dwa mojego autorstwa skrypciki na licencji GPL3:
#!/bin/bash
# Klient MPD
shownotify() {
notify-send "${sinf[1]}" "${sinf[0]}"
}
xselcopy() {
echo "${sinf[0]}"|xsel
}
for i in $@; do
if [ "$i" = "-s" ]; then
shift
opts[0]="shownotify"
elif [ "$i" = "-c" ]; then
shift
opts[1]="xselcopy"
fi
done
eval $(echo "sinf=(\\"; mpc $@|sed '1,2!d; s/\(^.*$\)/"\1"/g; s/$/ \\/g'; echo ")")
for i in ${opts[*]}; do $i; done
# Sposób użycia:
# nazwa_tego_skryptu [-s] [-c] [mpc_opts]
#
# Opcje:
# -c Kopiuje tytuł do schowka
# -s Wyświetla chmurkę z nazwą piosenki i postępem
#!/bin/bash
# sterowanie głośnością.. (trochę stary skrypt ;))
volmove="4" # procentowy przeskok
MUTEFILE="/tmp/xbindkeys.mute.tmp" # zapisuje poziom przez wyciszeniem
OSDFILE="/tmp/xbindkeys.osd.tmp" # zapisuje pid skryptu
OSDSLEEP=(3 3) # ('czas do chmurki' 'czas jej wyświetlania')
MIXER="Master Playback Volume" # nazwa kontrolera, patrz amixer controls
if [ -f $OSDFILE ]; then
kill `cat $OSDFILE`
rm $OSDFILE
fi
printvol() {
if [ ! -f $OSDFILE ]; then
echo $$ > $OSDFILE
sleep ${OSDSLEEP[0]}s
rm $OSDFILE
notify-send -t ${OSDSLEEP[1]}000 $"$1"
fi
}
GETVOL() {
amixer cget name="$MIXER"|sed '/:[[:space:]]values=/!d; s/.*values=\(.*\)/\1/g'
}
SETVOL() {
amixer cset name="$MIXER" $1|sed '/:[[:space:]]values=/!d; s/.*values=\(.*\)/\1/g'
}
function mute {
if [ "$(GETVOL)" = "0" ]; then
if [ -e "$MUTEFILE" ]; then
local -i VOL
VOL="$(SETVOL $(cat $MUTEFILE))"
printvol "Anulowanie wyciszenia: ${VOL}%"
rm $MUTEFILE
fi
else
GETVOL > $MUTEFILE
SETVOL 0
printvol "Wyciszenie.."
fi
}
function vol {
local -i VOL
VOL="$(SETVOL $[$(GETVOL)${1}volmove])"
printvol "Sila dzwieku: ${VOL}%"
}
if [ "$1" = "+" ]; then vol +
elif [ "$1" = "-" ]; then vol -
elif [ "$1" = "mute" ]; then mute
fi
# Sposób użycia:
# nazwa_tego_skryptu [[-] albo [+] albo [mute]]
Edytowany: 10 grudnia 2008
Skopiuj ten skrypt do jakiegoś katalogu, nadaj mu prawo do wykonywania i uruchom. Wymagany jest checkinstall i unzip, ponadto skrypt musi nazywać się "w32codecs-all.b4d". Instalacja odbywa się poprzez dpkg..
#!/bin/bash
# Sample and simple build4deborah
# 3ED 2008 GPL3
pkgname=w32codecs-all
_pkgname=windows-all
pkgver=20071007
pkgrel=1
arch=i386
license=nonfree
source=("ftp://ftp1.mplayerhq.hu/MPlayer/releases/codecs/windows-all-$pkgver.zip")
group=checkinstall
maintainer=aftomat
#deps=not_in_checkinstall
if [ "$1" = "chkinst" ]; then
#---------INSTALL--------#
# only instalation command
mkdir -p /usr/lib/win32/
mv Readme.txt doc-pak/
cp -r * /usr/lib/win32/
#----------END-----------#
else
for i in ${source[@]}; do wget -c "$i"; done
#---------PREPARE--------#
# 1. uncompress, get in..
# 2. configure, build
unzip $_pkgname-$pkgver.zip
cd $_pkgname-$pkgver/
#----------END-----------#
checkinstall --pkgname=$pkgname --pkgversion=$pkgver --pkgarch=$arch --pkgrelease=$pkgrel --pkglicense=$license --pkggroup=$group --pkgsource=${source[0]} --maintainer=$maintainer -y $PWD/../$pkgname.b4d chkinst
fi
Nota 1: Plik ten można przerobić tak by tworzył pakiet do "czego innego TM".
Nota 2: Proste aż miłe.. Kto zna tak samo prosty odpowiednik dla debiana? ;p
Nota 3: Gdybyś tworzył w oparciu o to i nie chciałbyś ustawiać wszystkich zmiennych: ${parametr:-słowo} (patrz man bash)..
27 kwietnia, 2008
Napisane w: Skrypty
(1)
Jest to podobny skrypt do mpd-add-pls-stream z tym że dodatkowo obsługuje m3u (między innymi strumienie icecast). Mozna by powiedzieć że to jest druga wersja..
#!/bin/bash
#
# Version 0.1.99.2 (20081229 beta 2) by 3ED <krzysztof1987 [at] gmail [dot] com>
# Desc-pl: Skrypt dodaje losowy strumień z pliku listy odtwarzania do głównej listy odtwarzania w mpd..
# Desc-en: Script adding random stream from playlist file to main playlist in mpd..
MPC_BIN="/usr/bin/mpc"
typeset -i maxran random
msg() {
zenity --error --title "Mpd Add Stream Playlist" \
--text "$@"
}
if [ -r "$@" ]; then
plsfile="$@"
else
msg "Ścieżka do pliku playlisty jest nieprawidłowa lub plik nie istnieje."
# msg "Path to playlist file is wrong or file don't exist." # Ok, ok, I know, gettext..
exit 2
fi
if [ -z "$MPC_BIN" ]; then
msg "Zainstaluj program mpc, w przeciwnym wypadku dodawanie strumieni do bieżącej listy odtwarzania będzie niemożliwe."
# msg "Please, install mpc, becouse I cann't add this stream to your main playlist."
exit 1
fi
if [ "${plsfile}" != "${plsfile%.m3u}" ]; then
urls=($(sed '/http/!d' ${plsfile}))
if (( "${#urls[*]}" > "0" )); then
random="$[RANDOM % ${#urls[*]}+0]"
$MPC_BIN add "${urls[$random]}"
fi # else empty list ;)
elif [ "${plsfile}" != "${plsfile%.pls}" ]; then
urls=($(sed '/^File.*/!d; s|^File.*=\(http.*\)|\1|g' ${plsfile}))
if (( "${#urls[*]}" > "0" )); then
random="$[RANDOM % ${#urls[*]}+0]"
$MPC_BIN add "${urls[$random]}"
fi
else
msg "Nieznany format pliku.\nNie udało się dodać strumienia do playlisty."
# msg "Unknown file format.\nI don't add this to your main playlist."
fi
Aktualizacja do wersji beta 2: 20081229
Po raz kolejny wystukałem jakiś skrypt w wolnej chwili i postanowiłem się podzielić. Tym razem będzie to ładny i czytelny rc.local dla dystrybucji posiadających init Debiana. Gdy ktoś tam wrzuci więcej niż kilka poleceń to robi się nie tyle co bałagan, a raczej rewolucja, nieczytelne, brzydkie i co tam jeszcze może przyjść na myśl. Postanowiłem wyjść temu na przeciw i w pare chwilek napisałem sobie coś takiego:
#!/bin/sh -e
#
# rc.local
#
err_stat() {
typeset -i stat="$1"
echo -e "\033[0;41;37;1m \`--> Failed (#$stat).\033[0m"
unset stat
}
rc_exec() {
echo -e "\033[0;32;1m \`--> \033[0;1mStarting:\033[0m $1"
if [ -z "$2" ]; then
$1 || err_stat $?
else
$2 || err_stat $?
fi
}
echo -e "\033[0;32;1m::\033[0;1m Starting local script..\033[0m"
#--------Configuration Start Here--------#
rc_exec "Tytuł, to wywoła się z błędem" "polecenie-hshfsfshkfhsd"
rc_exec "echo polecenie, a to juz nie"
#---------Configuration End Here---------#
unset err_stat rc_exec; exit 0
To narzędzie służy do wyświetlania informacji o pliku video. Okienko można wygenerować za pomocą zenity lub twojego ulubionego. Potrafi generować pliki .nfo automatycznie. Thunar nie posiada nawet tego pierwsze więc można sobie obie funkcje podpiąć.. Potrzebny jest mplayer, bash.
Przykładowe wpisy w thunarze:
- "video.nfo pokaż"
videonfo -z %f
- "video.nfo zapisz"
zenity --question --text="Czy napewno chcesz wygenerować plik .nfo dla\n%n?" && videonfo -n %f
#!/bin/bash
#
f_help() {
cat <<EOF
video.nfo wersja 0.0.99.1 (RC) 2007 | 3ED <kas1987@o2.pl>
Składnia: videonfo [OPCJA] [PLIK]
Możliwa jest tylko jedna opcja i tylko jeden plik na raz.
Program jest rozprowadzany na licencji GPL2 lub nowszej.
Możliwe opcje:
-z, --zenity wyświetli informacje w okienku zenity
-n, --nfo zapisze informacje do pliku .nfo
-h, --help wyświetli tę informację
EOF
}
f_nfo_top() {
cat <<EOF
-----------------------------------------------------------
## ## ## ## ####
## ## ## ## ##
## ## ## ###### ##### ###### ###### ## ######
## ## ## ## ## ##### ## ## ## ## #### ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
### ## ###### ##### ###### ## ## ## ## ######
-----------------------------------------------------------
EOF
}
f_nfo_bottom() {
cat <<EOF
-----------------------------------------------------------
EOF
}
f_readfile() {
if [ -e "$1" ]; then
eval $(mplayer -vo null -ao null -frames 0 -identify "$1" 2>/dev/null |sed -ne '/^ID_/ {s/[]()|&;<>`'"'"'\\!$" []/\\&/g;p}')
ID_FILESIZE="$(echo $(du -h0 "$1")|cut -d\ -f1)"
NFO_FILENAME="${ID_FILENAME}.nfo"
else
echo "Plik nie istnieje.."
exit 1
fi
}
f_print() {
f_readfile "$1"
cat <<EOF
Rozmiar pliku: ${ID_FILESIZE}B
Kontener pliku: $ID_DEMUXER
Czas trwania: $[$(echo $ID_LENGTH|cut -d. -f1) / 60] min
Kodek wideo: ${ID_VIDEO_FORMAT}
Wideo bitrate: $ID_VIDEO_BITRATE bps
Wymiary obrazu: ${ID_VIDEO_WIDTH}x${ID_VIDEO_HEIGHT}
Wideo FPS: $ID_VIDEO_FPS
Kodek Audio: $ID_AUDIO_CODEC
Audio bitrate: $[ID_AUDIO_BITRATE /1000] kbps
Audio rate: $ID_AUDIO_RATE
Kanałów audio: $ID_AUDIO_NCH
EOF
}
if [ "$1" = "-h" -o "$1" = "--help" ]; then
f_help
elif [ "$1" = "-z" -o "$1" = "--zenity" ]; then
f_print "$2"| \
zenity --text-info --title="video.nfo" --width="250" --height="380"
elif [ "$1" = "-n" -o "$1" = "--nfo" ]; then
if [ -e "$2" ]; then
f_nfo_top > "${2}.nfo"
f_print "$2" >> "${2}.nfo"
f_nfo_bottom >> "${2}.nfo"
else
f_print
fi
else
f_print "$1"
fi
Zadaj pytanie, a odpowiem na nie..
#!/bin/bash
echo -n "Pytanie: "; read
echo -n "Odpowiedz: "
[ "$[RANDOM % 2+1]" = "1" ] \
&& echo "Nie." \
|| echo "Tak."
Skrypt dla Firefoxa, akcja "otwórz plik w". Dodaje losowy adres strumienia playlisty pls np. ze strony shoutcast do playlisty MPD. Wymagania: mpd, mpc, bash, linux/unix like system.
#!/bin/bash
plsfile="/tmp/playlist.pls"
cat "$@"|grep ^File|sed -e's#^File.*=\(http.*\)#\1#g' > $plsfile
typeset -i maxran random
maxran="`cat $plsfile|wc -l`"
if [ "$maxran" -gt "0" ]; then
random="$[RANDOM % $maxran+1]"
addurl="`cat $plsfile|head -n$random|tail -n1`"
mpc add $addurl
fi
Zalecane uprawnienia dla pliku to 755.
Program który przebuduje każdą paczkę dostępną w abs wraz z kompilacją lub ściągnięciem za pomocą pacmana zależności. Ma możliwość podania wersji którą chcesz zainstalować lub pobrania najnowszego revision pakietów cvs/svn/itp. Standardowo pakiety kompilują się w /tmp/repack-build ale możesz to zmienić za pomocą zmiennej builddir na samym początku. Przykład instalacji przy użyciu repackage:
$ pacman -Q bar
bar 1.4-1
$ repackage -S bar=1.3.1
==> Entering fakeroot environment
==> Making package: bar 1.3.1-0 (Wt, 25 wrz 2007, 12:33:12 CEST)
..
Kod programu:
#!/bin/bash
#
builddir="/tmp/repack-build"
bin_versionpkg="/usr/bin/versionpkg"
msg() {
echo -e "\\033[1;32m*** \\033[1;37m$1\\033[0;37m"
}
build() {
unset pkgdir fpkgdir revision_number
if [ "`echo $2|grep =|wc -l`" -gt "0" ]; then
pkgname="`echo $2|cut -d= -f1`"
pkgver="`echo $2|cut -d= -f2`"
if [ ! -x "$bin_versionpkg" -a "$pkgver" = "get" ]; then
unset pkgver
msg "Package \"versionpkg\" not installed!"
fi
else
pkgname="$2"
unset pkgver
fi
if [ ! -d "$builddir" ]; then
mkdir "$builddir"
fi
cd "$builddir"
fpkgdir="`find /var/abs -type d -name $pkgname`"
ffind="0"
for i in $fpkgdir; do
if [ -r "$i/PKGBUILD" ]; then
let ffind++
sel_pkgdir[$ffind]="$i"
echo "${ffind}. $i"
fi
done
if [ "$ffind" -gt "1" ]; then
echo -n "Please, select your option [auto-select \"1\" - 15s]: "
typeset -i sel_no
read -n 1 -t 15 -r sel_no; echo
if [ -n "$sel_no" ] && [ "$sel_no" -gt "0" ] && \
[ "$ffind" -ge "$sel_no" ]; then
# ?????????????? please, repair this
[ -n "$sel_no" ] && \
pkgdir="${sel_pkgdir[$sel_no]}" || \
pkgdir="${sel_pkgdir[1]}"
else
pkgdir="${sel_pkgdir[1]}"
fi
else
pkgdir="${sel_pkgdir[1]}"
fi
unset fpkgdir ffind sel_pkgdir sel_no
if [ -n "$pkgdir" ]; then
cp -a $pkgdir $builddir/$pkgname
cd $pkgname
if [ -n "$pkgver" ] && [ "$pkgver" = "get" ]; then
msg "Retrieving latest revision.."
revision_number="$($bin_versionpkg -m 2> /dev/null)"
if [ -n "$revision_number" ]; then
msg "Newer revision detected: $revision_number"
pkgver="$revision_number"
else
msg "Oups.. This isn't revision repo and version will not be changed.."
unset pkgver
fi
fi
if [ -n "$pkgver" ]; then
eval "sed -i -e's#\(pkgver=\).*#\1$pkgver#g' PKGBUILD"
if [ -z "$revision_number" ]; then
sed -i -e's#\(pkgrel=\).*#\10#g' PKGBUILD
sed -i -e's#\(md5sums=\)('.*')#\1#g' PKGBUILD
fi
fi
if [ "`grep arch= PKGBUILD|wc -l`" -lt "1" ]; then
echo "arch=('i686')" >> PKGBUILD
fi
makepkg -$1 || pkgnotbuild=($pkgnotbuild $pkgname)
else
pkgnotfound=($pkgnotfound $pkgname)
fi
}
absup() {
if [ "`sudo -l|grep "/usr/bin/abs"|wc -l`" -gt "0" ]; then
sudo abs
else
msg "Please, give password for root to upgrade abs PKGBUILD tree.."
su -c abs
fi
msg "Upgrade PKGBUILD tree is finished.."
}
### BEGIN ###
if [ "${#@}" = "0" -o "$1" = "--help" -o "$1" = "-h" -o -z "$1" ]; then
cat <<EOF
repackage version 0.1.99.1 2007 | GPL2 | 3ED <kas1987@o2.pl>
Usage:
repackage [-S|-Sd|-So|-Sdo|-Sod] <package-name[=<ver>|=get]> ..
repackage [-B|-Bd|-Bo|-Bdo|-Bod] <package-name[=<ver>|=get]> ..
repackage [-c|-cc|-y|-h]
Options:
-S Depends install with pacman
d not clean cache
o package build only
-B Depends build from source
d not clean cache
o package build only
-c clean cache
-cc delete all files in tmp
-y refresh abs tree
-h show help options
<ver> - put your version of this program
get - versionpkg method for cvs/svn/ltd
EOF
exit 0
elif [ "$1" = "-S" ]; then
buildopts="iSscf"
elif [ "$1" = "-Sd" ]; then
buildopts="iSsf"
elif [ "$1" = "-So" ]; then
buildopts="scf"
elif [ "$1" = "-Sdo" -o "$1" = "-Sod" ]; then
buildopts="sf"
elif [ "$1" = "-B" ]; then
buildopts="iSbcf"
elif [ "$1" = "-Bd" ]; then
buildopts="iSbf"
elif [ "$1" = "-Bo" ]; then
buildopts="bcf"
elif [ "$1" = "-Bdo" -o "$1" = "-Bod" ]; then
buildopts="bf"
elif [ "$1" = "-c" ]; then
if [ -d "$builddir" ]; then
cd $builddir
for i in *; do
if [ -d "$i" ]; then
cd $i
rm -rf src/ pkg/
cd ..
fi
done
fi
msg "Complite.."
exit 0
elif [ "$1" = "-cc" ]; then
if [ -d "$builddir" ]; then
rm -rf $builddir
fi
msg "Complite.."
exit 0
elif [ "$1" = "-y" ]; then
absup
exit 0
fi
for i in $@; do
if [ "`echo $i|cut -c1`" != "-" ]; then
build "$buildopts" "$i"
fi
done
[ -n "$pkgnotbuild" ] && msg "This package is not build: ${pkgnotbuild[*]}"
[ -n "$pkgnotfound" ] && msg "This package is not found: ${pkgnotfound[*]}"
Ostatnia aktualizacja: 14 listopad 2007
Włącza lub wyłącza numlock.
Opcja "1", "true" lub "True" aktywuje.
It enables or disables the numlock.
Options "1", "true" or "True" for enable.
Plik (File): "/etc/gdm/Init/Default" - na samym dole (on bottom):
NUMLOCK="true"
NUMLOCK_BIN="/usr/bin/numlockx"
if [ -f "$NUMLOCK_BIN" -a -n "$NUMLOCK" ] && \
[ "$NUMLOCK" = "1" -o "$NUMLOCK" = "true" -o $NUMLOCK" = "True" ]
then
$NUMLOCK_BIN on
fi
unset NUMLOCK NUMLOCK_BIN
Aktualizacja: 06 listopad 2007
Skrypt ten wykorzystuje kodeki x264, mp3 oraz kontener avi. Tworzy małe pliczki wideo o dobrej jakości. Posiada opcje do ustawiania jakości wideo i dzwięku. Jest on prostym w obsłudze skryptem bash, wymaga on mplayera, x264, lame. Po uruchomieniu zobaczysz:
flv2x264 version 0.1 2007 | 3ED <kas1987@o2.pl>
Usage:
flv2x264 [-v <v-br>][-a <a-br>][-o <output>] -i <input>
flv2x264 -h (or) -V
Options:
-v video bitrate [default=280]
-a audio bitrate [default=64]
-o output avi file
-i input flv file
-h show help options
-V more info about this program
Tworzy on pliczki których rozmiar jest zbliżony do flv (+/- 1MB na 20MB plik flv). Można go również wykorzystać niestandardowo do plików avi, wmv, itp. Dzięki opcji -v ustawisz ilość ramek na sekundę wideo, a dzięki opcji -a ustawisz ilość kb na sekundę dźwięku. Opcja -o nie jest wymagana ale możesz jej użyć by zapisać pod inną nazwą plik wynikowy - w przeciwnym wypadku zapisze się on pod nazwą oryginalną + "2x264.avi" czyli np. "gumisie.flv2x264.avi". Opcją -i służy do określenia pliku do konwertowania czyli np. "gumisie.flv", jest wymagana. Skrypt ten jest objęty licencją GPL2. Można go pobrać stąd: flv2x264.
x264 to open-sourcowy format jak się okazuje bardzo dobry. Wychodzi bardzo mały plik w dobrej jakości. Postanowiłem napisać sobie skrypt do konwertowania właśnie do tego formatu plików FLV. Dlaczego bez start.sh, getopts nie wykonuje się to nie wiem. W razie czego piszcie mi tu komentarze.. ;) A oto skrypt flv2x264.
Tak powinien wyglądać output po wpisaniu "flv2x264 -h":
flv2x264 version 0.1rc1 2007 | 3ED <kas1987@o2.pl>
Usage:
flv2x264 [-v <v-br>][-a <a-br>][-o <output>] -i <input>
flv2x264 [-h]
Options:
-v video biterate [default=300]
-a audio biterate [default=64]
-o output avi file
-i input flv file
--20070701--EDIT:
PKGBUILD dla Arch Linux.. Właśnie chodzi o to z tym starterem że wykorzystując PATH systemowy flv2x264.sh nie chciał mi wykonać getopts. Ocb to nie wiem i nie miałem czasu sprawdzić. Jak coś będę wiedział to zaktualizuje pkgbuild i wpis na blogu. Zachęcam do używania i zgłaszania ewentualnych błędów w komentarzach albo na jabberze..
--20070701--EDIT:
Wersja rc2: To ze starterem już nie aktualne.. Dla mnie działa bez niego. Drobne poprawki w kodzie..
Ile pakiet zajmuje miejsca na dysku po zainstalowaniu? W plikach desc bazy pacmana jest ale postanowiłem napisać coś co mi wyliczy dokładniej. Proszę oto skrypt - prezent. Skrypt w publicznej domenie bo nie zależy mi na tym kto co z nim zrobi ponieważ jest mało zaawansowany.
#!/bin/bash
#Autor: 3ED
#Ograniczenia du :-(
du_max_char="129290"
if [ $# = 0 ]; then
echo "pac-size wersja 0.2; Publiczna domena"
echo "·····································"
echo "Przykład użycia: $0 pakiet [pakiet] [pakiet] [..]"
echo
else
for pkg in $@; do
dus="0"
if [ $(echo $pkg|cut -c 1) != "-" ]; then
files="$(pacman -Ql $pkg|cut -d\ -f2)"
if [ $(echo $files|wc -c) -gt $du_max_char ]; then # metoda 1
for file in $files; do
[[ -f "$file" ]] && duf=$(du -b $file|cut -d/ -f1)
dus=$[dus+duf]
done
else # metoda 2 - szybsza lecz ograniczona, patrz "du_max_char"
if [ ! -z "$files" ]; then
dus="$(du -bc $files|tail -1)"
dus="$(echo $dus|cut -d\ -f1)"
fi
fi
[[ $dus != 0 ]] && \
echo "$pkg: $[dus/1024/1024],$[(dus-((dus/1024/1024)*1024*1024))/1024]MB"
fi
done
fi
Pomocny program, można go dodać np. do nautilus-actions. Ładne okienko ułatwi i uprzyjemni całą sprawę. Przykład użycia: gtocacp mplayer /katalog/plik. Po zakończeniu się mplayera zostanie wyświetlone okienko w gtk2 odliczające od 60 sekund w dół z 1 sekundową częstotliwością odświeżania pasku postępu oraz informacji pisemnej.
Wymagania: komputer z systemem Linux/BSD oraz program zenity.
#!/bin/bash
#Autor: 3ED
shutdown_command="sudo shutdown -h now" #1
#cancel_command="recordmydesktop $HOME/out.ogg" # ;-)
if [ -z "$@" ];then #2
echo "gtocacp wersja 0.2.1; Publiczna domena."
echo "·······································"
echo "Przykład użycia: $0 mplayer /path/to/video"
echo
if [ x$LANG != x"pl_PL.UTF-8" ]; then
echo "(uwaga, kodowanie inne niz UTF8)"; fi
exit 0
fi
"$@" #3
[[ "$?" = 127 ]] && exit 1 #4
( #5
loop=60
until [ $loop = 0 ]; do let loop--
sleep 1s
echo "$[100-${loop}*100/60]"
echo "# Zostało $loop sekund zanim zostanie wyłączony komputer.."
done
) |
zenity --progress \ #6
--title="Wyłącznik czasowy komputera" \
--text="Zostało 60 sekund zanim zostanie wyłączony komputer.." \
--percentage=0 --auto-close && $shutdown_command #7
Opis (raczej dla newbie):
- Polecenie które zostanie wykonane po zakończeniu odliczania (oczywiście w zmiennej)
- Tekst gdy nic nie wpiszemy jako parametr.. ("-z" - puste?)
- Nasz parametr czyli polecenie do wykonania
- Gdy polecenie zwróci kod 127 skrypt przerwie z kodem 1
- Pętla odliczająca 60 razy po 1 sekundzie po czym jest kończona i przerywa zenity
- progress - typ okna; title - tytuł okna; tekst - tekst w okienku na start; procentage - od ilu procent pasek postępu zaczyna; auto-close - patrz punkt 5.
- Gdy zenity nie zostanie przerwane czyli doliczy do stówki i samo się zamknie zwróci kod 0 czyli po "&&" polecenie zostanie wykonane, gdy klikniesz na anuluj program zwróci kod 1 czyli polecenie po "||" uruchomi się. Np. recordmydesktop - gdyby ktoś chciał coś popatrzeć gdy śpimy to można go nagrać..
Jak widać jest to bardzo prosty skrypt, mam nadzieję że komuś pomogłem, a nawet zachęciłem do konsoli. Myślę nad publikacją większej ilości skryptów i o wiele dłuższych - skomplikowanych ale tutaj? Może jakiś inne miejsce? Co proponujecie?