Regenerate thumbnails in Shotwell 0.15 (for last month)

I love Shotwell for it’s simplicity and easy export to Piwigo. After Christmas I added new photos to my library but after that I made some modifications to them (red eye reduction, etc…). Because Shotwell generate thumbnails only on import, all my modifications were not visible on preview.

I’ve started searching how to regenerate thumbs and found this info. There were two issues with this method:

  • this howto was for old version (with old paths) and only for 128px thumbs
  • I definitely don’t want to regenerate thumbnails for 40k photos!

After some tweaking this will do work for thumbnails from last month (enough for me):

sqlite3 ~/.local/share/shotwell/data/photo.db \
  "select id||' '||filename from PhotoTable where date(timestamp,'unixepoch','localtime') > date('now','start of month','-1 month') order by timestamp desc" | 
while read id filename; do
  tf1=$(printf ~/.local/share/shotwell/thumbs/thumbs128/thumb%016x.jpg $id);
  tf2=$(printf ~/.local/share/shotwell/thumbs/thumbs360/thumb%016x.jpg $id);
  test -e "$tf" ||  {
    echo -n "Generating thumb for $filename";
    convert "$filename" -auto-orient -thumbnail 128x128 $tf1
    convert "$filename" -auto-orient -thumbnail 360x360 $tf2
    echo
  }
done

Remember to install imagemagick:

apt-get install imagemagick

Debian – zablokowanie aktualizacji pakietu

W teorii nie powinno się blokować aktualizacji pakietów bo łatają dziury itd…. Ale! Zdarzyły mi się ostatnio dwie sytuacje, które do tego mnie zmusiły:

  • aktualizacja hudsona kończyła się błędem przy starcie usługi,
  • aktualizacja domU Xen skończyła się problemem z kompatybilnością mechanizmu udev w systemie i jądrze (hypervisor miał starsze jądro niż spodziewało się DomU).

W takich sytuacjach bardzo przydaje się możliwość zablokowania aktualizacji jednej “psującej” paczki na pewien okres czasu by nie opóźniać innych aktualizacji a sobie dać czas na rozpracowanie problemu.

Wstrzymywanie aktualizacji pakietu

Aktualizację wstrzymujemy o tak:

echo "paczka hold" | dpkg --set-selections

Odblokowanie aktualizacji pakietu

By ponownie zezwolić na aktualizację wystarczy:

echo "paczka install" | dpkg --set-selections

Sprawdzenie listy wstrzymanych paczek

dpkg --get-selections | grep hold

Źródło:
http://www.debianadmin.com/how-to-prevent-a-package-from-being-updated-in-debian.html

Kopiowanie wolumenów LVM z dd i netcat

Niedawno chciałem skopiować maszynę wirtualną z jednego hypervisora na innego. Były to 3 wolumeny LVM o rozmiarach od 50 do 100GB. Dawno temu zrobiłem sobie skrypty do backupu – jeden kompresuje wolumeny LVM – a drugi pozwala odtworzyć z dekompresja na drugim serwerze. Tyle że przy tak dużej maszynce będzie to trwało masakrycznie długo – fajnie byłoby móc równocześnie kopiować i odtwarzać (live)…

I wtedy przypomniało mi się narzędzie netcat – zrobiłem snapshoty wolumenów i mogłem zaczynać. W najbardziej podstawowej wersji potrzebowałem tylko tyle:

  • na źródle:
    dd if=/dev/vgsas/vm1-sys | pv --size 50G | nc -l -p 8888
  • na docelowym:
    nc 192.168.1.10 8888 | dd of=/dev/vgsas/vm1-sys

Lub wariacje z kompresją:

  • na źródle:
    dd if=/dev/vgsas/vm1-sys | pv --size 50G | pigz -2 | nc -l -p 8888
  • na docelowym:
    nc 192.168.1.10 8888 | pigz -d | dd of=/dev/vgsas/vm1-sys

No dobra – pv nie jest najbardziej podstawowe… Ale umożliwia podgląd postępu wysyłania/obierania (zależy, z której strony go wrzucić) co przy tak długim procesie jest niezmiernie przydatne.
Do kompresji zalecałbym pigz (czyli Parallel GZIP) z ratio dostosowanym do przepustowości sieci – po gigabicie się nie opłacało nawet na ośmiordzeniowcu.

Tworzenie patch’y z poleceniami diff i patch

Jest kilka powodów dla których tworzenie patchy jest przydatne – jeśli tu jesteś to pewnie masz jakiś własny…

Tworzenie patch’a

diff -crB old new > from-old-to-new.patch

W powyższym poleceniu założyłem że old i new to katalogi z wieloma podkatalogami i plikami – stąd opcja -r. -c dodaje kilka linijek “kontekstu” przez co łatwiej rozeznać się w patch’u. Opcja -B ignoruje puste linie, których patchowanie mnie nie interesuje.

Patchowanie

Na początek zawsze warto wywołać polecenie z opcją –dry-run by zobaczyć czy patch wykona się poprawnie:

patch --dry-run -p1 -i from-old-to-new.patch

Opcja -p1 zakłada że uruchamiamy patcha z folderu “projektu”, który chcemy patchować. Opcję -i można z powodzeniem zastąpić przekierowaniem < .
Jeżeli nie widzimy żadnych komunikatów “FAILED” to możemy uruchomić patcha:

patch -p1 -i from-old-to-new.patch

Rozsynchronizowane serwery NTP

Miałem ostatnio zabawną sytuację gdy kilka serwerów z zainstalowanym NTPD miało rozjazdy rzędu kilkunastu sekund. Wyszło na to że moje serwery synchronizowały się z różnymi zewnętrznymi serwerami NTP pomiędzy, którymi były rozjazdy i te rozjazdy synchronizowały się na moich serwerach. Jeden “z moich” ustanowiłem głównym a wszystkie inne przekierowałem na niego (komentując wszystkie inne serwery NTP w konfiguracji). Wymusiłem synchronizację:

ntp -q

Sprawdziłem jak duży jest offset i jitter (powinny być bardzo małe):

ntpq -p

i tak rzeczywiście było – problem z głowy.

P.S.
Jeżeli nie potrzebujemy/chcemy/etc instalować serwera NTP to możemy zamiast tego użyć polecenia ntpdate w cronie (np. co godzinę):

ntpdate moj.serwer.ntp