3ED Blog

15 września, 2010

Perl B::C

Napisane w: Programowanie, Skrypty (1) Otagowane: , ,

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:

  1. perlcc foo.pl -o foo
  2. 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):

  • Tworzenie pliku "foo": perl -MO=Bytecode,-H,-ofoo foo.pl
  • Uruchamianie "foo": perl foo
    • Inne

      To nie wszystkie możliwości tego modułu, opisałem tylko te najważniejsze według mnie, po resztę odsyłam do dokumentacji.

22 marca, 2010

Perlowa prognoza pogody w conky..

Napisane w: Internet, Skrypty (1)

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..

17 sierpnia, 2009

Napi-bash (napi-project)

Napisane w: Linux, Oprogramowanie, Skrypty (1)

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:

  1. Tryb cli, wszystko na konsoli:
    napi-bash -c <plik> [kolejne pliki]
  2. Tryb gui, informacja w libnotify (powiadomienia systemowe):
    napi-bash -g <plik> [kolejne pliki]
  3. Jako "skrypt nautilusa", wystarczy podlinkować napi-bash do folderu ~/.gnome2/nautilus-scripts/ (będzie działał jak wywołany z opcją "-g").
  4. 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.

24 lutego, 2009

Dradio ("radio" na ncurses)

Napisane w: Internet, Linux, Skrypty (1)

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")

15 lutego, 2009

aurpac

Napisane w: Arch Linux, Linux, Oprogramowanie, Skrypty (1)

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.

12 października, 2008

openbox-gnome-places

Napisane w: Arch Linux, Linux, Skrypty (1)

Screenshot

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:
openbox-shutdowner by 3ED
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&#x142;&#x105;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

mpd_add_stream

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

11 kwietnia, 2008

Debian rc.local vs. 3ED

Napisane w: Debian, Skrypty (1)

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

14 listopada, 2007

videonfo

Napisane w: Linux, Skrypty (1)

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

26 października, 2007

Zabawka - wszystko wiedząca kula

Napisane w: Linux, Rozrywka, Skrypty (1)

Zadaj pytanie, a odpowiem na nie..

#!/bin/bash
echo -n "Pytanie: "; read
echo -n "Odpowiedz: "
[ "$[RANDOM % 2+1]" = "1" ] \
&& echo "Nie." \
|| echo "Tak."

26 października, 2007

mpd_add_pls_stream

Napisane w: Linux, Skrypty (1)

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.

25 września, 2007

Nowy program: "repackage"

Napisane w: Arch Linux, Skrypty (1)

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

21 września, 2007

GDM i numlock dla wszystkich..

Napisane w: Arch Linux, Linux, Skrypty (1)

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.

29 czerwca, 2007

flv2x264

Napisane w: Arch Linux, Linux, Skrypty (1)

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):

  1. Polecenie które zostanie wykonane po zakończeniu odliczania (oczywiście w zmiennej)
  2. Tekst gdy nic nie wpiszemy jako parametr.. ("-z" - puste?)
  3. Nasz parametr czyli polecenie do wykonania
  4. Gdy polecenie zwróci kod 127 skrypt przerwie z kodem 1
  5. Pętla odliczająca 60 razy po 1 sekundzie po czym jest kończona i przerywa zenity
  6. 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.
  7. 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?

  • Zapowiedź świata post-nielegalnej kopii

    "Do napisania tego tekstu zainspirowała mnie duża liczba dyskusji przeprowadzonych na forach internetowych z różnymi ludźmi na temat oblicza piractwa komputerowego nielegalnego kopiowania oraz natury własności intelektualnej. Przy okazji tych dyskusji wypłynęła masa nieścisłości i dziur w obrazie rzeczywistości prezentowanym ludzkości przez organizacje takie jak ZAIKS, RIAA, MPAA, MAFIAA i różnorakich korporacyjnych lobbystów. Ponieważ nie znoszę kłamstw i niesprawiedliwości, postanowiłem, że nie będę dłużej tolerował panoszenia się fałszywej propagandy i napiszę ten artykuł, będący zwieńczeniem kilku lat przemyśleń, wspomnianych już dyskusji i argumentów użytych przez obie strony barykady."

    (Więcej..) osnews.pl [LINK]

  • Czy w projektach publicznych można kierować się zasadami ekonomii?

    "W dyskusjach nad racjonalnością ekonomiczną projektów informatycznych w administracji publicznej jest często pada argument, że "administracja publiczna nie kieruje się zasadą maksymalizacji zysku". Często to jest to tylko wygodna wymówka by odrzucić wszelkie próby obiektywizacji lub racjonalizacji wydatków publicznych."

    ipsec.pl[LINK]

  • Oszczędne państwo rozwijające swój rynek.. NIE!

    "Jesteśmy bogatym krajem. Nie musimy szukać tańszych, stabilniejszych i bezpieczniejszych rozwiązań w administracji publicznej, która wychodzi z założenia, że nie warto wspierać "małych i średnich przedsiębiorstw innowacyjnych" w Polsce."

    "Oto fakty!" na pppit.org.pl [LINK]

  • Android 1.0 działa na Qualcomm

    "Wszystko wskazuje na to, iż otwarty system Android przeznaczony na urządzenia mobilne działa na urządzeniu firmy Qualcomm."

    Filmiki z działającym androidem, trzeba to zobaczyć.

    OSNews.pl [LINK]

  • Rzeczpospolita windowsowa

    "Co by się działo, gdyby rząd zadekretował, że jedynym autem dopuszczonym na polskie drogi jest fiat albo citroën? A jednak pozwalamy, by państwo zmuszało nas do używania systemu operacyjnego Microsoftu"

    Gazeta wyborcza [LINK]

  • Wolność komputerów

    Czy programy pisane przez hobbistów mogą być równie dobre jak te tworzone przez wielkie koncerny? Ile rzeczywiście płacą za oprogramowanie zwykli użytkownicy i firmy? I czy w ogóle muszą za nie płacić?

    Rzeczpospolita [LINK]

  • Chiński UMPC z Linuksem

    Kto mi kupi takie cacko? :)

    Linux.pl [LINK]

  • Kto to jest własnowierca?

    "Propagujemy ideę zniesienia religijnego poddaństwa, zakazania poddawania dzieci religijnemu praniu mózgu i zapisywania ich do sekt i kościołów bez ich świadomej zgody. Informujemy o szkodliwych skutkach niewolnictwa religijnego. Służymy radami, jak wystąpić formalnie i duchowo z Kościoła. A przede wszystkim zmuszamy do myślenia! Jesteśmy religijnymi wyzwoleńcami niezależnymi od osób czerpiących zyski z kontroli nad ludzkimi umysłami i wierzeniami. Nowego, lepszego świata nie można zbudować na gruncie dyktatorskich tworów religijnych. Chcesz się od nich uniezależnić? Przyłącz się do nas! Zostań własnowiercą!"

    A ja pytam osochozi? Co oznacza słowo własnowierca? W co wiara? Z niektórych tekstów na tej stronie wynikać może że od tego przybywa nam sekt (w przeciwieństwie do ateizmu, który je potępia)..

    wlasnowierca.go.pl [LINK]

Foto

O blogu

3ED Blog - na różne tematy ale głównie w okół Linuksa.. Internetowy notatnik pisany w wolnych chwilach. Nie oczekuje zysku, dużej widowni - po prostu zapisuje tu to co mi przyjdzie do głowy.. Oczywiście komentarzem możesz dać mi temat do czego zachęcam.