Archive for category Linux

Wyświetlanie komunikatów w języku angielskim

W systemie używam na co dzień języka polskiego, ale bywają sytuację, gdy język angielski jest wg mnie dużo lepszym rozwiązaniem. Przynajmniej w dwóch przypadkach jest bardziej użyteczny:

  • wyświetlenie komunikatów o błędach – ułatwia to wyszukiwanie informacji na dany temat;
  • wyświetlanie stron MAN – mam wrażenie, że wersje angielskie są obszerniejsze i bardziej aktualne.

Za konfigurację języka wyświetlanych komunikatów odpowiada zmienna systemowa LC_MESSAGES. Pozostaje teraz tylko ustawienie tej zmiennej. Można to zrobić przynajmniej na dwa sposoby:

  • w pliku ~/.bashrc – jeżeli chcemy parametr ustawić tylko dla jednego użytkownika;
  • utworzyć plik o nazwie /etc/profile.d/angielskie_komunikaty.sh – jeżeli parametr ma zostać ustawiony każdemu użytkownikowi logującemu się do systemu.

Ja wybrałem drugą wersję, ale w każdym przypadku należy dodać do pliku następującą linię:

export LC_MESSAGES=C

Po ponownym zalogowaniu się do systemu zarówno komunikaty jak i strony MAN powinny być wyświetlane po angielski.


Ustawienie zmiennej LC_MESSAGES na język angielski w bashu spowoduje także zmianę języka używanego przez środowisko graficzne (w moim przypadku KDE automatycznie przeszło na język angielski). Jeżeli nam to przeszkadza, to należy poprzestać tylko na następnym punkcie.

Jeżeli jednak chcemy aby były po angielsku wyświetlane tylko strony MAN, to należy utworzyć odpowiedni alias, który zmodyfikuje ustawienia językowe dla polecenia man:

alias man='man -L C'

Druga możliwość zmiany języka, może być użyte w praktyce z każdą aplikacją (przedefiniowanie wartości zmiennej środowiskowej przed wywołaniem wybranego polecenia):

alias man='LC_MESSAGES=C man'

Powyższą linię można umieścić np. w pliku ~/.bashrc.

Tags: , ,

Problemy z siecią wifi po aktualizacji systemu do Ubuntu 10.10

Podkusiło mnie i zaktualizowałem Ubuntu do wersji 10.10 dobry miesiąc przed wydaniem. Generalnie poszło bez jakiś wielkich problemów, ale po restarcie systemu okazało się, że przestała mi poprawnie funkcjonować łączenie z siecią wifi.

Podczas próby nawiązywania połączenie otrzymywałem z aplikacji Wicd komunikat mówiący o podaniu błędnego hasła. Oczywiście, hasło jak najbardziej było poprawne. Po jakiś kombinacjach, restartach połączenie wróciło — ale po kilku sekundach następowało ponowne rozłączenie i próba inicjalizacji sieci, i tak bez przerwy.

Przejrzałem masę różnych forów, błędów i różnych rozwiązań, ale nic nie pomagało. Nawet próba ręcznej konfiguracji sieci czy też reinstalacji Wicd.

Przy kolejnej próbie przypomniałem sobie o pewnym wynalazku o nazwie network-manager, z którym rozstałem się już dawno temu. Sprawdziłem co się z nim dzieje i okazało się to strzałem w dziesiątkę. Usługa ta została podczas aktualizacji zainstalowana, uruchomiona i w najlepsze przeszkadzająca.

Teraz to wszystko graniczyło się do dwóch kroków:

  1. Zatrzymanie usługi:
    $ sudo stop network-manager
  2. Wyłączenie uruchamiania tej usługi podczas startu komputera, czyli należy zmienić plik /etc/init/network-manager.conf. Poniższy skrypt dokona odpowiedniej modyfikacji (zakomentuje linijki odpowiedzialne za start usługi), a oryginalny plik zapisze pod nazwą /etc/init/network-manager.conf.old (plik ten może potem zostać skasowany):
    $ sudo sed -i.old -e '/start/,+1s/^/#/' /etc/init/network-manager.conf

Nauczka dla mnie: jak nie używasz jakiegoś domyślnego rozwiązania, bądź przygotowany na problemy po aktualizacjach.

Tags: , ,

Masowa konwersja filmów przy użyciu ffmpeg + generowanie miniaturki

W swojej kolekcji posiadam sporo filmów nakręconych przy użyciu aparatu fotograficznego (jak pewnie prawie wszyscy :)). Filmy te łącznie ze zdjęciami udostępniam w formie albumu ze zdjęciami. I tutaj pojawia się mały kłopot: dobrze jakby filmy były zakodowane do formatu FLV, a do tego przydałaby się miniaturka zdjęcia.

W Internecie łatwo można znaleźć przepisy jak dokonać konwersji pojedynczy plik do formatu FLV przy użyciu ffmpeg, a miniaturki można stworzyć używając aplikacji ffmpegthumbnailer (więcej na ten temat w tym wpisie Generowanie miniaturek z plików wideo przy użyciu aplikacji ffmpegthumbnailer). Ja natomiast chciałem mieć rozwiązanie, które spełni takie warunki jak:

  • automatyczne skanowanie wybranego katalogu i wyszukiwanie nowych plików z filmami
  • konwersja nowych filmów do formatu FLV (ale nie należy ruszać już utworzonych plików)
  • utworzenie miniaturki konwertowanego pliku

I oto skrypt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

# katalog do skanowania
IN_PATH="~/zdjecia"

# rozszerzenie z filami brane pod uwagę
EXTENSIONS=".*\.\(mp4\|mpeg\)"

(
    IFS="
    "

    for PLIK in `find "${IN_PATH}" -iregex ${EXTENSIONS}`; do
        # generowanie miniatury
        [ -f "${PLIK}.thm" ] ||
            (echo "Miniatura: ${PLIK}.thm"; ffmpegthumbnailer -i "${PLIK}" -o "${PLIK}.thm" -q10 -c jpeg -s 640)

        # jeżeli istnieje plik flv, to nic nie rób
        [ -f "${PLIK}.flv" ] && continue

        # konwersja pliku na format FLV
        echo "${PLIK}  ->  ${PLIK}.flv"
        ffmpeg -i "${PLIK}" -ar 22050 -ab 56 -r 25 -b 512k "${PLIK}.flv"

        # ustawienie takich samych czasów modyfikacji
        touch -r "${PLIK}" "${PLIK}.flv"
    done
)

Na pewno każdy będzie musiał przynajmniej częściowo dostosować skrypt do własnych potrzeb. U mnie działa i robi to czego oczekuję. A oto co się w nim dzieje:

  • IN_PATH="~/zdjecia"
    Katalog, w którym znajdują się pliki z filmami, tylko on (łącznie z podkatalogami) będzie skanowany.
  • EXTENSIONS=".*\.\(mp4\|mpeg\)"
    Definicja rozszerzeń, które będą brane pod uwagę (wielkość liter nie ma znaczenia). Jeżeli zajdzie potrzeba umieszczenia kolejnego na tej liście, należy dopisać je przed \) i rozdzielić od poprzednie przy użyciu \| (więcej na dokumentacji do polecenia find).
  • IFS="
        "

    Zmienna o nazwie Internal Field Separator, pozwala na podział parametrów wg słów. Domyślnie zawiera znaki: spacja, tabulator, nowa linia. Należy przedefiniować tę zmienną, aby można obsłużyć poprawnie występowanie spacji w wynikach zwracanych przez polecenie find. Nowa postać powinna zawierać tylko dwa znaki: znak nowej linii (czyli Enter) oraz znak tabulatora. Na pewno linię tę będzie trzeba wprowadzić ręcznie w edytorze, na stronie jest zapisana błędnie.
  • find "${IN_PATH}" -iregex ${EXTENSIONS}
    Odszukanie plików o podanych rozszerzeniach w wybranym katalogu.
  • [ -f "${PLIK}.thm" ] ||
    Sprawdzenie, czy istnieje miniatura. Jeżeli jej nie ma, to należy ją utworzyć.
  • ffmpegthumbnailer -i "${PLIK}" -o "${PLIK}.thm" -q10 -c jpeg -s 640
    Utworzenie miniatury na podstawie oryginalnego filmu.
  • [ -f "${PLIK}.flv" ] && continue
    Sprawdzenie, czy istnieje plik FLV. Jeżeli istnieje, to powrót do początku pętli i przetwarzanie kolejnego filmu (czyli nic więcej nie robimy).
  • ffmpeg -i "${PLIK}" -ar 22050 -ab 56 -r 25 -b 512k "${PLIK}.flv"
    Przetworzenie zadanego pliku do formatu FLV, przy zadanych parametrach.
  • touch -r "${PLIK}" "${PLIK}.flv"
    Ustawienie czasu modyfikacji nowo utworzonego pliki na taki sam oryginalny. Przydatne podczas przetwarzania zdjęć i filmów z więcej niż jednego aparatu (można wtedy sortować po czasie modyfikacji, niezależnie od nazwy pliku).

Tags: , , , ,

Generowanie miniaturek z plików wideo przy użyciu aplikacji ffmpegthumbnailer

Aplikacja ffmpegthumbnailer pozwala na wygenerowanie miniaturki z plików wideo obsługiwanych przez ffmpeg. Jednocześnie sposób jej użycia jest bardzo prosty, chociaż jest obsługiwana z poziomu linii poleceń.

Polecenie to wykorzystuje aplikację ffmpeg, więc obsługuje dokładnie ten sam zestaw formatów wideo.

W Ubuntu można te aplikację zainstalować przy użyciu polecenia:

sudo aptitude install ffmpegthumbnailer

W przypadku Ubuntu 10.04 zostanie zainstalowana wersja 2.0 aplikacji.

A sposób użycia:

ffmpegthumbnailer -i plik_wideo.avi -o miniaturka.thm -c jpeg -q10 -s 640 -t 5

Poszczególne opcje oznaczają:

  • -i plik_wideo.avi – plik wejściowy, z którego będzie generowana miniaturka
  • -o miniaturka.thm – wygenerowana miniaturka
  • -c jpeg – format pliku z miniaturką, nie trzeba tego podawać jeżeli zdefiniujemy rozszerzenie w nazwie pliku, dopuszczalne wartości to jepg oraz png
  • -q10 – jakość grafiki, 10 oznacza najwyższą
  • -s 640 – rozmiar miniatury, domyślnie wartość 128, wg dokumentacji od wersji 2.0.1 można używać wartości 0, co oznacza wygenerowanie miniatury o wielkości pliku wideo
  • -t 5 – miejsce, skąd pobrać miniaturę, w tym przypadku w 5 procencie długości filmu, domyślanie wartość 10%., można także podać czas w formacie hh:mm:ss

W moim przypadku polecenie to szczególnie dobrze się sprawdza w skryptach, gdzie trzeba automatycznie generować szereg miniatur.

Źródła

Tags: , , ,

Usunięcie rozszerzenia z nazwy pliku w bashu

Prosty problem do rozwiązania: w skrypcie napisanym w Bashu z nazwy pliku usunąć jego rozszerzenie, czyli zostawić sobie tylko nazwę pliku. Przez rozszerzenie rozumiem wszystko co występuje po ostatniej kropce.

Pierwszym moim pomysłem było utworzenie wyrażenia regularnego, ale to wygląda jak strzelanie z armaty do muchy. Więc trzeba zajrzeć do dokumentacji polecenia bash, i tam można znaleźć taką oto definicję:

${parameter%word}
${parameter%%word}
        Remove matching suffix pattern.

Konstrukcja ta działa następująco: w wartości podanego parametru (parameter) wyszukuje zadany ciąg znaków (word) i w przypadku znalezienie ucina jego jak najkrótszy fragment (w przypadku użycia %) lub jak najdłuższy (w przypadku użycia %%).

Tak będzie wyglądało usunięcie jakiegoś rozszerzenia z pliku:

~$ PLIK=nazwa.jeden.dwa
~$ echo ${PLIK%.dwa}
nazwa.jeden

Jak widać w efekcie ciąg znaków .dwa został usunięty. Teraz trzeba rozszerzyć to zachowanie na dowolne rozszerzenie, czyli zamiast rozszerzenia użyć znaku * (gwiazdki):

~$ PLIK=nazwa.jeden.dwa
~$ echo ${PLIK%.*}
nazwa.jeden
~$ echo ${PLIK%%.*}
nazwa

Proszę zwrócić uwagę na różnicę pomiędzy % a %%. W przypadku użycia % zostało usunięte tylko ostatnia rozszerzenie (czyli najkrótszy ciąg mogący zostać dopasowany). Natomiast przy użyciu %% zostały usunięte znaki od wystąpienia pierwszej kropki, czyli największy zakres jaki pasował do zdefiniowanego wzorca.

Istnieje także wariant tego polecenia umożliwiający usuwanie pierwszych znaków (czyli prefiksu), zamiast znaku % należy użyć #:

${parameter#word}
${parameter##word}
        Remove matching prefix pattern.

Źródła

Tags: , , , , , , ,