Posts Tagged Linux

Zmiana rozdzielczości w X-server przy użyciu polecenia

Od czasu do czasu muszę podłączyć laptopa do rzutnika, co w moim przypadku wiąże się z reguły z koniecznością zmiany rozdzielczości na niższą. Można zrobić oczywiście przy pomocy menu konfiguracyjnego i wybranie odpowiedniej opcji, ale chciałbym to móc zrobić przy użyciu polecenia.

Polecenie które umożliwia zarządzanie rozdzielczością wyświetlania na ekranie nazwy się xrandr. Pozwala ono na ustawienie rozmiaru oraz orientacji ekranu. Domyślnie zdefiniowane rozdzielczości można sprawdzić przy pomocy przełącznika -q:

$ xrandr -q
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 320 x 175, current 1920 x 1200, maximum 1920 x 1200
default connected 1920x1200+0+0 0mm x 0mm
   1920x1200      50.0*    51.0     52.0     53.0  
   1920x1080      54.0  
   1680x1050      55.0     56.0

Jeżeli mam ochotę na ustawienie rozdzielczości 1680×1050, wystarczy że wydam polecenie:

$ xrandr -s 1

Numeracja rozdzielczości zaczyna się od zera.

To oczywiście jest najprostsze użycie tego polecenia. Można także definiować własne tryby, łącznie z takimi gdzie obszar pulpitu jest większy od rozdzielczości ekranu. Można także zdefiniować własny kształt ekranu, np. w formie trapezu. Pozwoli on na kompensację błędnego działania rzutnika (przykład ze strony MAN polecenia):

xrandr --fb 1024x768 --output VGA --transform 1.24,0.16,-124,0,1.24,0,0,0.000316,1

Źródła

Tags: , , ,

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

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