Tworzenie prezentacji przy użyciu LaTeX cz. 4: budowa konspektu

Ostatnim elementem tworzenia prezentacji będzie budowa konspektu. Będzie on składał się zarówno z prezentacji, jak i materiałów dodatkowych, mających poszerzyć wiedzę o kolejne elementy.

W poprzednich częściach został przygotowany plik main.tex, który zawiera prezentację o Subversion. Teraz trzeba będzie zrobić:

  • stworzyć plik PDF z konspektem
  • dodać dodatkowe informacje potrzebne do budowy konspektu

Utworzenie pliku PDF

Pierwszym krokiem będzie utworzenie pliku PDF formie książki a nie prezentacji. Można to zrobić bardzo prosto, modyfikując pierwszą instrukcję z pliku main.tex:

\documentclass[t]{beamer}

Wystarczy tę linie zmienić na:

\documentclass[a4paper,12pt]{article}
\usepackage{beamerarticle
}

Teraz wystarczy skompilować plik main.tex i już konspekt jest gotowy. Oczywiście, zmienianie za każdym razem nagłówka pliku aby zmienić format prezentacji nie jest najlepszym rozwiązaniem. Dużo lepiej jest przygotować dwa dodatkowe pliki tex, w których należy umieścić specyficzne rzeczy związane zarówno z prezentacją jak i konspektem, a w pliku main.tex zostawić już tylko samą treść i elementy wspólne dla obu formatów.

  1. Usunięcie formatowania z pliku main.tex.
    Pierwszym krokiem będzie usunięcie zbędnych elementów z pliku głównego, należy zakomentować lub usunąć linię z formatem prezentacji:

    1
    2
    % Rodzaj dokumentu
    %\documentclass[t]{beamer}
  2. Utworzenie pliku subversion-jak_dziala-prezentacja.tex.
    Należy utworzyć plik o nazwie subversion-jak_dziala-prezentacja.tex, w którym zostanie zdefiniowany format prezentacji oraz włączona zawartość pliku main.tex. Od tego momentu będzie trzeba kompilować plik subversion-jak_dziala-prezentacja.tex, aby otrzymać prezentację w formacie PDF:

    1
    2
    3
    \documentclass[t,ignorenonframetext]{beamer}

    \input{main.tex
    }

    Jak widać, zostaje w praktyce typ dokumentu na prezentację i załączony plik z jej treścią.

  3. Utworzenie pliku subversion-jak_dziala-konspekt.tex.
    Ostatnim krokiem będzie utworzenie pliku subversion-jak_dziala-konspekt.tex, dzięki któremu będzie można utworzyć plik PDF z konspektem:

    1
    2
    3
    4
    \documentclass[a4paper,12pt]{article}
    \usepackage{beamerarticle}
    \setjobnamebeamerversion{subversion-jak_dziala-prezentacja}
    \input{main.tex
    }

Od tego momentu kompilacja któregoś z tych plików będzie pozwala na utworzenie odpowiedniego dokumentu, czy też prezentacji czy też konspektu.

Uzupełnienie konspektu

Teraz czas na uzupełnienie prezentacji o dodatkowe elementy, które mają znaleźć się nie w prezentacji, ale tylko w konspekcie. Generalnie należy pamiętać o jednym: w prezentacji znajdą się tylko elementy pomiędzy tagami \begin{frame} oraz \end{frame}, wszystkie inne elementy będę umieszczone już na konspekcie.

Czyli najprościej mówiąc, należy dodatkowe treści umieścić po prostu po zakończeniu każdego slajdu.

Jak to wygląda w praktyce, można zobaczyć w archiwum z pełnym projektem prezentacji o Subversion, umieszczonym poniżej.

Źródła

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

Wyświetlenie zawartości pliku od końca

Ostatnio zapragnąłem obejrzeć sobie zawartość z plikiem logu serwera Apache. Cel był następujący:

  • wybrać tylko określone linie przy użyciu polecenia grep
  • wyświetlić 20 ostatnich linii
  • wyświetlić je od końca, tak aby linie które pojawiają się na końcu były wyświetlane jako pierwsze

Dwa pierwsze punkty w realizacji są proste:

grep 'GET / ' access.log | tail -n 20

Teraz pozostaje odwrócić kolejność linii. Pierwsze moje skojarzenie to polecenie sort z przełącznikiem -r, czyli coś takiego:

grep 'GET / ' access.log | tail -n 20 | sort -r

Niestety, to nie zadziała. Dostaniemy nie odwróconą zawartość pliku, ale po prostu posortowany plik od wartości największej do najmniejszej.

Więc pozostaje dodanie numeracji do pliku (polecenie cut -n i posortowanie zawartości:

grep 'GET / ' access.log | tail -n 20 | cat -n | sort -rn

Efekt tym razem odpowiedni, ale jeszcze zostały dodatkowe linie z numeracją, można je usunąć za pomocą polecenia cut:

grep 'GET / ' access.log | tail -n 20 | cat -n | sort -rn | cut -f 2-

I koniec końców efekt jest zgodny z oczekiwaniami.

Przeglądając jeszcze dokumentację do polecenia cat zauważyłem jeszcze jedną komendę: tac, która działa jako odwrotność polecenia cat. Używając tej komendy, skrypt będzie wyglądał następująco:

grep 'GET / ' access.log | tail -n 20 | tac

I po sprawie :). Morał: warto czytać strony MAN, można zaoszczędzić sporo czasu, pisania i mocy maszyny.

Źródła

Tags: , , , , ,