Własne zapasowe repozytorium GIT

Oto prosty sposób na przeniesienie repozytorium GIT na pendrive, czy inną przenośna pamięć.

  1. Dla uproszczenia dodamy sobie nasze wymienne repozytorium do pliku /etc/fstab w tym celu:
    ls -l /dev/disk/by-uuid # odnajdujemy na liście nasz urządzenie,
    w moim przypadku sdb1
    mkdir /mnt/git-gsoc # tworzymy odpowiedni katalog do montowania
    chown lock:lock /mnt/git-gsoc # zmieniamy właściciela

    przy użyciu ulubionego edytora edytujemy /etc/fstab. Dodajemy następującą linie:

    UUID= /mnt/git-gsoc	 user,rw,noauto 0 0
  2. Teraz przydało by się zawartość naszego obecnego repo przenieść do nowego …  wystarczy skopiować główny katalog repozytorium 😉 (prostota git’a)

Mając już sklonowane repozytorium przydał by się jeszcze jakiś skrypt który za nas wykona zbędne rzeczy (tj. podmontuje pamięć, odpali git-deamon, a potem po sobie posprząta ;)).

#! /usr/bin/bash
# Copyrighted, 2009
# Developed by Dariusz Luksza <dariusz[at]luksza[dot]org>
# License: GPL v2
 
case "$1" in
connect)
	echo -n Montuje urzadzenie ...
mount /mnt/git-gsoc &amp;&gt; /dev/null
if  [ "$?" -eq "0" ]
then
		echo " DONE."
		echo -n Startuje git gaemona ...
		git daemon --export-all --base-path=/mnt/git-gsoc/backup --detach \
			--pid-file=/mnt/git-gsoc/git-daemon.pid --enable=receive-pack --listen=localhost
		echo " DONE."
exit 0
else
		echo Wystapil blad podczas montowania, sprawdz urzadzenie!
exit 1
	fi
	;;
disconnect)
if [ -e /mnt/git-gsoc/git-daemon.pid ]
then
		echo -n Zatrzymuje git daemona ...
kill `cat /mnt/git-gsoc/git-daemon.pid`
rm /mnt/git-gsoc/git-daemon.pid
		echo " DONE."
		echo -n Odmontowuje urzadzenie ...
sync
		umount /mnt/git-gsoc/
		echo " DONE."
exit 0
else
		echo Daemon nie zostal uruchomiany
		exit 1
	fi
	;;
*)
	echo Uzycie:
	echo "    " $0 "[connect|disconnect]"
	;;

Oczywiście każdy sam musi sobie dostosować ścieżki dostępu 🙂

Kiedy mamy już wszystko poustawiane warto by sprawdzić czy wszytko działa poprawnie tj. uruchamiamy powyższy skrypt z parametrem connect i po chwili powinniśmy mieć uruchomionego daemona GITa. Teraz wystarczy do naszego lokalnego repozytorium dodać to które właśnie utworzyliśmy:

git remote add backup git://localhost/&lt;nazwa repo&gt;

i używać uchwytu backup 😉

Miłej zabawy ;>

Zmiana środowiska graficznego

Chyba nadeszła ta chwila kiedy to w końcu trzeba zmienić środowisko graficzne … po prawie pięciu latach spędzonych na Fvwm-Crystal nadeszła chyba pora na zmianę.

Jakie są przyczyny ? Osobiścnie nie narzekam na Crystala jest:

  • mały
  • szybki
  • poręczny (jeżeli się już nauczy podstawowych skrótów)

Ale posiada jedną bardzo wielką wadę … wszystko było by OK gdyby nie to, że zachciało się mi podłączyć zewnętrzny monitor. W tym momencie Crystal (konkretniej mówiąc pages czyli przestrzenie robocze) wariuje, wyświetlane jest jednocześnie “półtorej” przestrzeni roboczej (tj. cała aktywa i kawałek następnej). Próbowałem nawet restartować i przeładowywać recepturełale to jeszcze pogorszyło efekt …

Tak więc staję znowu przed pytaniem “jakiego WMa wybrać”. Nie jest to dla mnie pytanie proste … bo szczerze mówiąc nie znam nic innego 😉 Jedno wiem na pewno, nie będzie to ani KDE ani Gnome.

Dla ścisłości … jakie wytyczne musi spełniać nowe środowisko:

  • możliwość konfiguracji do 12 przestrzeni roboczych i przełączanie się między nimi przez +F[1-12] (lub +F[1-12])
  • możliwość przełączenia się pomiędzy dwoma sąsiadującymi przestrzeniami przy pomocy +[ i +]
  • możliwość przełączenia się pomiędzy dwoma ostatnio używanymi przestrzeniami za pomocą +
  • możliwość ciągłego podglądu wszystkich przestrzeni roboczych tj. tego co jest na nich odpalone (w Crystalu mam na prawej krawędzi pasek który reprezentuje wszystkie przestrzenie robocze oraz aplikacje na nich odpalone oczywiście umożliwia on również przełączanie pomiędzy przestrzeniami)
  • brak żadnych pasków zadań i menu (jedno menu “ekranowe” tj. po kliknięciu LMB w pulpit)
  • możliwość zdefiniowania aplikacji które mają się odpalać automatycznie
  • możliwość maksymalizacji okna poprzez +=
  • możliwość zdefiniowania od jakiego rozmiaru ma być zmaksymalizowane okno
  • nie powinno się rozjeżdżać po podłączeniu zewnętrznego monitora

oczywiście wszystkie te funkcjonalności nie muszą być od razu dostępne ale dane środowisko powinno być na tyle konfigurowalne żeby umożliwić mi ustawienie wszystkich tych opcji ale też nie chcę tonąć w plikach i skryptach konfiguracyjnych …

Cóż, poszukiwania czas zacząć … może ktoś pod powie parę ciekawych środowisk ? ;>

cda2mpc

Parę dni temu postanowiłem zgrać moją skromną kolekcję płyt audio do formatu MPC. Nie chcąc marnować czasu (i zaśmiecać systemu zbędnym softem), postanowiłem napisać sobie mały i prosty skrycik w Python’ie. Założenia

  • prostota
  • automatyczność (wkładam płytę odpalam skrypt i zapominam … ;))
  • zapis wyjściowych plików w pewnym ustalonym schemacie katalogów (wykonawca, nazwa albumu i utworu pisana camel case’em dodatkowo nazwa utworu poprzedzona jego numerem oraz praw dostępu: 400 (dla utworów_ i 500 (albumu))
  • automatyczne pobieranie informacji o utworach bez konieczności ich przepisywania (tj. wykorzystanie CDDB, a konkretnie cddb-py)

Oto efekt (należy pamiętać żeby podmienić baseDir !):

#! /usr/bin/python
 
"""
cda2mpc, Copyrighted, 2009
Ripps directly from CD audio to musepack (mpc) format.
Developed by Dariusz Luksza 
License: GPL v2
"""
 
import CDDB, DiscID, re
from sys import stdout
from string import capitalize
from os import chmod, makedirs as mkdir
from subprocess import Popen, PIPE, call
 
baseDir = '/home/lock/muzyka/'
 
def camelCase(value):
    return "".join([capitalize(w) for w in re.split(re.compile("[ _]?"), value)])
 
print 'Getting CDDB info ...',
stdout.flush()
cdrom = DiscID.open()
discId = DiscID.disc_id(cdrom)
 
(queryStatus, queryInfo) = CDDB.query(discId)
 
if isinstance(queryInfo, list):
	queryInfo = queryInfo[0]
 
(readStatus, readInfo) = CDDB.read(queryInfo['category'], queryInfo['disc_id'])
 
album = queryInfo['title']
splitAt = album.index('/')
 
artist = album[:splitAt - 1]
album = album[splitAt + 2:]
print ' DONE.'
 
print 'Starting to encoding:', artist, '-', album
 
saveDir = baseDir + camelCase(artist) + '/' + camelCase(album) + '/'
try:
	mkdir(saveDir, 0700)
except OSError:
	pass
 
for i in range(discId[1]):
	title = readInfo['TTITLE' + `i`]
	wavTrack = saveDir + 'track.wav'
	fileName = saveDir + `i + 1` + '-' +camelCase(title) + '.mpc'
	print '\tEncode track:', title , ' (', `i+1`, '/', discId[1], ')'
	print '\t\tStage 1 (wave) ...',
	stdout.flush()
 
	p = Popen(['cdparanoia', '-q', `i + 1`, wavTrack], stdout=PIPE)
	p.wait()
	if p.returncode is not 0:
		print ' ERROR!!'
		continue
	print ' DONE.'
	print '\t\tStage 2 (mpc) ...',
 
	stdout.flush()
	mpcCmd = ['mppenc', '--deleteinput', '--xtreme', '--silent', '--artist',
			artist, '--album', album, '--title', title, wavTrack, fileName]
	p = Popen(mpcCmd, stdout=PIPE, stderr=PIPE)
	p.wait()
	if p.returncode is not 0:
		print ' ERROR!'
		continue
	chmod(fileName, 0400)
	print " DONE.\n\tCOMPLETED."
 
chmod(saveDir, 500)
print 'COMPLETED.'
call('eject')

pommed-1.25 suspend on lid

Pommed jest deamon’em umożliwiającym korzytanie z mac’owych klawiszy funkcyjnych (tych od ściszania czy rozjaśniania ekranu lub też od manipulacji głośnością) obsługuje również wbudowane czujniki oraz zmianę intensywności podświetlenia klawiatury … oraz potrafi przyciemnić ekran kiedy się odłączy zasilanie … właśnie ta funkcjonalność wzbudziła moje zainteresowanie …

Dlaczego, skoro już obsługiwanie jest zdarzenie odłączenia od zasilania, nie obsługiwane jest zdarzenie zamknięcia klapki (tzw. LID). IMHO przejście w stan uśpienia było by najrozsądniejszym rozwiązaniem reakcji na zamknięcie przez użytkownika wieka laptopa.

Chwila grzebania w kodzie programu ujawniła, że takie rozwiązanie nie jest intuicyjne dla autora aplikacji, lub z jakiś powodów zostało odrzucone w procesie developmentu … domyślnie pommed w wersji 1.25 w reakcji na zamknięcie klapki … wyłączy podświetlenie klawiatury, oczywiście jeżeli takowe jest obecne w tam modelu mac’a. W przypadku kiedy nie posiadamy podświetlanej klawiatury zdarzenia LID są  ignorowane … szkoda bo można to wykorzystać w inny sposób.

Tutaj dostępny jest patch dodający możliwość konfiguracji zdarzenia LID. Domyślnie po opuszczeniu klapki zostanie wykonana komenda pm-suspend. W gruncie rzeczy może to być dowolna komenda która piszemy w pliku konfiguracyjnym … to chyba na tyle.

Ten sam patch wysłałem również do autora aplikacji … może poprawi moje błędy (bo w C nie pisałem już od wieków ;>) i jakoś dodatkowo rozwinie ta funkcjonalność.