piątek, 31 sierpnia 2007

Moje pierwsze macro w OO Basicu

Jak zamienić wiele plików w formacie MS Powerpoint na dokumenty PDF przy pomocy programu OpenOffice ale z poziomu wiersza poleceń opisał Bob DuCharme w tekście Moving to OpenOffice: Batch Converting Legacy Documents. W skrócie postępuje się następująco: w OO należy przejść do okna dialogowego Narzędzia->Makra->Zarządzaj Makrami. Następnie utworzyć moduł, np. MyConversion i wpisać do okienka następującą treść :


' BASIC, see: http://www.xml.com/pub/a/2006/01/11/from-microsoft-to-openoffice.html
' Based on code from http://www.oooforum.org/forum/viewtopic.phtml?t=3772
' Save document as an Acrobat PDF file.
Sub SaveAsPDF( cFile )
cURL = ConvertToURL( cFile )
' Open the document. Just blindly assume that the document
' is of a type that OOo will correctly recognize and open
' without specifying an import filter.
oDoc = StarDesktop.loadComponentFromURL( cURL, "_blank", 0, _
Array(MakePropertyValue( "Hidden", True ),))

cFile = Left( cFile, Len( cFile ) - 4 ) + ".pdf"
cURL = ConvertToURL( cFile )

' Save the document using a filter.
oDoc.storeToURL( cURL, Array(_
MakePropertyValue( "FilterName", "writer_pdf_Export" ),)

oDoc.close( True )
End Sub

' Save document as a Microsoft Word file.
Sub SaveAsDoc( cFile )
' mostly a copy of SaveAsPDF
cURL = ConvertToURL( cFile )
oDoc = StarDesktop.loadComponentFromURL( cURL, "_blank", 0, (_
Array(MakePropertyValue( "Hidden", True ),))


cFile = Left( cFile, Len( cFile ) - 4 ) + ".doc"
cURL = ConvertToURL( cFile )

oDoc.storeToURL( cURL, Array(_
MakePropertyValue( "FilterName", "MS WinWord 6.0" ),)
oDoc.close( True )

End Sub


' Save document as an OpenOffice 2 file.
Sub SaveAsOOO( cFile )
' mostly a copy of SaveAsPDF. Save as an OpenOffice file.
cURL = ConvertToURL( cFile )
oDoc = StarDesktop.loadComponentFromURL( cURL, "_blank", 0, _
Array(MakePropertyValue( "Hidden", True ),))

' Set output file extension based on lower-case
' version of input extension.
Select Case LCase(Right(cFile,3))
Case "ppt" ' PowerPoint file.
cFileExt = "odp"
Case "doc" ' Word file.
cFileExt = "odt"
Case "xls" ' Excel file.
cFileExt = "ods"
Case Else
cFileExt = "xxx"
End Select

cFile = Left( cFile, Len( cFile ) - 3 ) + cFileExt
cURL = ConvertToURL( cFile )

oDoc.storeAsURL( cURL, Array() )
oDoc.close( True )

End Sub


Function MakePropertyValue( Optional cName As String, Optional uValue ) _
As com.sun.star.beans.PropertyValue
Dim oPropertyValue As New com.sun.star.beans.PropertyValue
If Not IsMissing( cName ) Then
oPropertyValue.Name = cName
EndIf
If Not IsMissing( uValue ) Then
oPropertyValue.Value = uValue
EndIf
MakePropertyValue() = oPropertyValue
End Function

Uruchamia się to następująco (Linux):

ooffice -invisible "macro:///Standard.MyConversion.SaveAsPDF($PWD/plik.ppt)"

albo via prosty jednoargumentowy skrypt oo2pdf:


#!/bin/bash
# Konwersja do formatu PDF
echo "Konwertuję $1..."
ooffice -invisible "macro:///Standard.MyConversion.SaveAsPDF($PWD/$1)"

Koniecznie trzeba podać pełną ścieżkę do pliku (stąd zmienna PWD) bo inaczej zgłoszony zostanie błąd. W MS Windows też trzeba podać pełną nazwę, co nie do końca może być wygodne. Ale to już nie moje zmartwienie. Makra działają nie tylko dla plików .ppt, ale też .doc.odt/odp.

Na ww. stronie jest też podana następująca zgrabna pętla zamieniająca wszystkie pliki (w tym przypadku .ppt) w katalogu bieżącym i jego podkatalogach:


for i in $(find ./ -name "*.ppt"); do oo2pdf $i ; done

Być może to find ./ -name jest nawet przesadne i wystarczy zwykłe for i in *.ppt; do.

czwartek, 30 sierpnia 2007

Łączenie plików PDF w jeden

Jak połączyć wiele plików PDF w jeden? Okazuje się, że tego typu montaż jest możliwy przy wykorzystaniu program epdftex, który jest standardowym składnikiem każdej nowej dystrybucji TeXa i poniższego skryptu (autor P. Pianowski):


\nopagenumbers
\def\picdir {pic/}

\hoffset -1in \voffset -1in \topskip 0pt

\newdimen\HS \HS=210mm \newdimen\VS \VS=297mm
\hsize\HS \vsize\VS

\pdfpagewidth=\HS \pdfpageheight=\VS

%\def\letter {letter} \def\aiv {a4}

\def\stronapdf #1#2#3#4{\pdfximage page #1 {\picdir #2}
\vbox to\VS{\vskip #4 \hbox to\HS{\hskip #3%
\pdfrefximage\pdflastximage \hss}\vss}
}

\newcount\odstrony \newcount\dostrony
\newcount\nstr \newcount\lstr

\def\strony#1#2#3#4#5{%
\odstrony #1 \dostrony #2
\def\przesunieciex {#3} \def\przesunieciey {#4}
\lstr \numexpr \dostrony-\odstrony+1 \relax
\nstr 1
\loop
\stronapdf \nstr{#5}\przesunieciex\przesunieciey
\vfil\break
\ifnum\nstr<\lstr \advance\nstr 1 \repeat
}

%% --- tu zmieniać: ---
\strony {01}{12}{5mm}{5mm}{plik_0.pdf}
\strony {13}{18}{5mm}{5mm}{plik_1.pdf}
... itd ...
\bye

Oczywiście koniec pliku należy zmodyfikować, wywołując polecenie \strony tyle razy ile trzeba. Powyższe wypróbowałem i działa doskonale. Trzeci i czwarty argument polecenia \strony określa przesunięcie i umożliwia dopasowanie marginesów na stronie (dla każdego pliku oddzielnie).

Inne proponowane do tego celu rozwiązania to: latex plus pakiet pdfpages, pdftk (ORA wydało nawet książkę PDF Hacks--nie wiedziałem) albo ghostscript uruchomiony w następujący sposób:


gs -q -sPAPERSIZE=A4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
-sOutputFile=out.pdf in1.pdf in2.pdf...

Więcej informacji na temat łączenia plików PDF można znaleźć w tekście: How to concatenate PDFs without pain.

wtorek, 28 sierpnia 2007

Ładniejszy Emacs, uzupełnienie

W nawiązaniu do tekstu nt. Emacsa, kol. Wanted podpowiedział, że oprócz Bitstream Vera, który faktycznie nie ma za dużo diakrytyków, jest klon tego fontu z dużą liczbą znaków pn. DejaVu (DejaVu fonts). Spróbowałem to zainstalować wpisując yum install dejavu-fonts, ale się nie udało:


Error: dejavu-fonts conflicts with fontconfig >= 2.3.0

Hmm, dziwne. Żeby czegoś nie popsuć wolałem działać ostrożnie. Rozpakowałem archiwum .rpm:


rpm2cpio dejavu-fonts-2.18-1.rf.noarch.rpm | cpio -idv

W środku nie było nic nazwyczajnego. Pliki ttf + dokumentacja. Pliki .ttf umieściłem ręcznie w /usr/share/fonts/dejavu/. Na wszelki wypadek uruchomiłem w tym katalogu mkfontdirmkfontscale. Uruchomiłem Emacsa w następujący sposób:


/usr/local/emacs23/bin/emacs-23.0.0 --font "DejaVuSansMono-14" --multibyte

Wygląda, że działa. Przy okazji i zupełnie przypadkowo wygooglałem informację nt. projektu fontów STIX. Z tego co wyczytałem ma to być podobna do Times New Roman rodzina bogatych w diakrytyki fontów. Na dniach mają być gotowe i upublicznione. Zobaczymy, być może będzie to coś ciekawego.

Kolibki Adventure Park

Pomiędzy Sopotem a Gdynią ,,od zawsze'' znajdował się tor do wyścigów motocrosowych. Akurat ten sport mnie specjalnie nie pasjonuje, łaziłem tam jednak od czasu do czasu. Obok toru jest taki zapomniany teren: jakieś budy, w których ewidentnie ciągle ktoś mieszka, zniszczone ogródki działkowe i inne budowle. Trochę to dziwne miejsce, bo kilometr-dwa obok (czyli w Sopocie) metr kwadratowy mieszkania kosztuje majątek a tutaj taka dzicz i żadnego zainteresowania zaprowadzeniem cywilizacji. BTW z zeszłym roku pełno tu było ucha bzowego. Taki nietypowy grzybek, jadalny, ale mało kto go je (przynajmniej w Polsce). Nietypowy ze względu na kształt i czas, w którym można go zbierać (zima). Aha, tak dla porównania chiński grzyb mun aka cloud ear fungus vel auricularia polytricha, gdyby ktoś uważał ucho za coś obrzydliwego.

No więc dziś się okazało, że na motocrossie jest centrum różnych dziwnych sportów. Na stronach Urządu Miasta w Gdyni: znalazłem więcej informacji na ten temat: W czwartek, 2 sierpnia w Kolibkach (na terenach dawnego motocrossu) ruszył największy park przygody w Polsce... No to Misiek przeoczył takie wydarzenie! Ale byliśmy w Zakopanem więc jest usprawiedliwiony.

Na terenie ,,bud i działek'' jest też (nowa) wieża widokowa. Przypadkowo na nią wlazłem w zeszłym roku jak była w budowie. Teraz jest już gotowa i można z niej oglądać Trójmiasto plus Hel na horyzoncie (zdjęcia, regulamin). Z dziećmi albo jak z gośćmi z Polski nie ma co robić, to można się wybrać --powinno się spodobać. Najprościej się tu dostać idąc od strony Gdyni ulicą Spółdzielczą (początek w okolicach przystanku PKP Gdynia-Orłowo). Alternatywnie, od strony Sopotu z ulicy Bernadowskiej należy skręcić w lewo, w leśną drogę, naprzeciw pierwszego budynku po prawej stronie tej ulicy, idąc od strony torów PKP (tę drogę widać na google maps).

sobota, 25 sierpnia 2007

Przed RWC 2007

Do sukcesów odchodzącego rządu oprócz spadku bezrobocia i przestępczości oraz likwidacji specsłużb dodam możliwość (wreszcie) oglądania w TV pucharu świata w najbardziej zespołowej z gier zespołowych czyli Rugby. Do tej pory był z tym kłopot, a ja jestem wielkim (platonicznym) fanem tej gry. Piłka nożna no nie wytrzymuje porównania.

Ale w tym roku i od tej edycji wreszcie przełom. RWC 2007 ma być pokazywany w Polsacie. W fazie grupowej, która kończy się 30 września interesująco zapowiadają się mecze: w grupie A -- Anglii, RPA i Samoa (9, 14, 22); w grupie B -- Walii i Australii (15); w grupie C -- Nowej Zelandii, Szkocji i Włoch (8, 23, 29) oraz w grupie D -- Francji, Irlandii i Argentyny (7, 21, 30).

Statystyki rowerowe

Jak większość jeżdżących na rowerze pilnie notuję przejechane kilometry i inne przydatne dane. Robię to w sposób dość elementarny:


<day date="2007/08/25">
<ride dist="60" exdist="60.00" bike="b">
<by name='Banino' />
<by name='Miszewo' />
<by name='Przodkowo'/>
<by name='Czeczewo'/>
<by name='Warzno'/>
<by name='Kielno' />
</ride>
</day>

Jak widać jest to plik w formacie XML; co oznaczają poszczególne elementy i atrybuty można IMHO się zorientować po ich nazwach. Odpowiednie skrypty XSLT formatują dane, liczą średnie miesięczne i roczną. Całość jest dostępna tutaj. Ponieważ system jest w miarę toporny, dziś zrobiłem rozpoznanie co w tym zakresie oferują inni i znalazłem dwa potencjalnie interesujące serwisy: bikestats oraz bikebrother.

Pierwszy z wymienionych jest prostszy: pozwala na oznakowanie wyjazdów za pomocą daty, czasu, przejechanych kilometrów oraz krótkiego opisu. Bikebrother ma dużo bardziej rozbudowany opis. Więcej można przesłać ślad GPSa trasy. Pliki GPS mogą pobrać inni użytkownicy.

Oba serwisy prezentują dane w efektowny sposób i to jest ich jedyny plus. Minusów jest więcej: dodawanie danych za pomocą formularzy to przeżytek:-) Jakiś REST-based API byłoby dużo bardziej wygodniejsze. Wpisywanie wszystkich danych do formularza Bikebrothera musi być męczące. Nie ma (albo jest bardzo starannie ukryte) eksportu danych, więc i tak trzeba robić kopie.

Reasumując na razie minusy zdecydowanie przewyższają nad plusami. No i na koniec: licencje. Oczywiście na ten temat nic nie ma, pliki zawierające ślady GPS są udostępnione ,,na kocią łapę'' (albo nie na kocią: są własnością autorów). Może jestem przewrażliwiony ale nie lubię w ten sposób dzielić się danymi. Tzn. lubię dzielić się ale na określonych zasadach, np Creative Commons. Za granicą też zresztą kombinują zamiast korzystać ze sprawdzonych rozwiązań.

Poniżej przykładowe ekrany wpisywania danych (pierwszy z Bikestat, drugi z BB; jak się kliknie to będą większe):

Bikestat Bikebrother

piątek, 24 sierpnia 2007

Zamiana plików TeX na MS Word

Jakiś czas temu Elka uaktualniła fragment swojej książki nt. akordeonów. Ma on być wydany w postaci artykułu w wydawnictwie prestiżowej Akademii Muzycznej. Oczywiście podesłanie tego w formacie .tex nie wchodziło w grę. Dokument nie jest specjalnie skomplikowany, ale zwiera kilkadziesiąt przypisów, kilkanaście rysunków i setki poleceń służących do tworzenia skorowidzów. W oryginale był to dokument plain TeXa, tyle, że łatwo (na szczęście) go było zamienić na dokument LaTeXowy:


%& --translate-file=il2-pl
\documentclass{article}
\usepackage{polski}
\usepackage{graphicx}
\newcommand\PICDIR{} %
\renewcommand\index[1]{} %% eat
\newcommand\xindex[1]{} %
\newcommand\AWindex[2][NIL]{} %
\newcommand\Piece[2][NIL]{\emph{#2}} % eat
\renewcommand{\includegraphics}[2][NIL]{%
\begin{center}\texttt{#2.eps}\end{center}}
\renewcommand\dywiz{-}
\setcounter{secnumdepth}{-1}

\title{Polska literatura akordeonowa...

Polecenia indeksujące \index, \xindex, \AWindex oraz \Piece zostały przedefiniowane: zjadają swoje argumenty i nie wstawiają nic do składu. Przedefiniowałem też \includegraphics, bo plik .rtf ze wstawionymi rysunkami miał ponad 40 Mb. Skoro ostateczny skład ma być w InDesign, to rysunki można wysłać osobno i w lepszym formacie.

BTW: konstrukcja \newcommand\polecenie[2][NIL] przedefiniowuje polecenie, które ma dwa argumenty, w tym jeden (pierwszy) jest opcjonalny, tzn. użycie takiego polecenia ma postać: \qq[pierwszy]{drugi} albo \qq{drugi}. Napis NIL, to domyślna wartość, tego (opcjonalnego) argumentu.

Kiedy mam potrzebę zamiany pliku LaTeXa na MS Word używam latex2rtf. Nie jest to program idealny, ale lepszego nie znam:


latex2rtf -i polish -C latin2 akordeony.ltx

Przełącznik -i polish powinien wstawiać generowane napisy w języku polskim (tj, Rysunek zamiast Figure itp.). Kłopot, bo tego nie robi (wersja 1.9.16a, beta). Próbowałem na różne sposoby a rzecz wydaje się banalna, jednak uparcie wstawiane są teksty angielskie (można to ew. poprawić edytując plik RTF, np. Perlem). Za to przełącznik -C, ustawiający stronę kodową, działa.

Po uruchomieniu latex2rtf, pojawiło się kilka ostrzeżeń:


akordeony.ltx:3 Unknown style option polski ignored
akordeony.ltx:4 Unknown style option graphicx ignored
akordeony.ltx:9 No existing definition for \index
akordeony.ltx:13 No existing definition for \includegraphics
akordeony.ltx:14 No existing definition for \dywiz

Ale konwersja została dokonana (prawie) prawidłowo. W szczególności latex2rtf prawidłowo zinterpretował moje redefinicje i pominął zwartość poleceń indeksujących a zamiast plików graficznych wstawił ich nazwy. Jedyny błąd jaki zauważyłem, to wstawianie zbędnego odstępu pomiędzy \footnote a następującym po numerze przypisu znakiem przestankowym, tj. numer-odstęp-kropka, zamiast numer-kropka.

Przy okazji konwersji z LaTeXa do MSW: dia potrafi wyeksportować dobrej jakości diagramy w formacie EMF.

poniedziałek, 20 sierpnia 2007

Ładniejszy Emacs

Kierując się wskazówkami ze strony www.emacswiki.org skompilowałem Emacsa 23, wersja alfa. Ten Emacs umie wreszcie korzystać z dobrej jakości fontów TrueType dzięki wsparciu Xft. Zatem:


cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co -r emacs-unicode-2 emacs
./configure --with-gtk --enable-font-backend --with-xft --prefix=/usr/local/emacs23
make
mkdir /usr/local/emacs23
chown tomek:tomek /usr/local/emacs23

Na wszelki wypadek dociągnąłem jeszcze yum install giflib-devel, bo ./configure zgłosił błąd (po co mi gify?). Oczywiście nie chcę zmieniać starego emacsa na wersję alfa, stąd pomysł zainstalowania wszystkiego w katalogu /usr/local/emacs23. Będę miał dwa The one true editor -- prawdziwie skumulowana potęga.

Teraz uruchamiam:


emacs --font "Bitstream Vera Sans Mono-10"

Krój Vera fajnie wygląda, ale polskich ogonków nie ma, i nawet nie jest to wina Emacsa tylko po prostu nie ma ich w foncie (Bitstream Vera Fonts).

Spróbowałem zatem z innym ustawieniem, i po dłuższym kombinowaniu czemu zamiast polskich znaków widzę coś zupełnie innego udało się:


## emacs-23 zdaje sie działać:
/usr/local/emacs23/bin/emacs-23.0.0 --font "Monospace-13" --multibyte

Na etapie rozruchu dodałem jeszcze --debug-init, dzięki czemu szybko ustaliłem co się gryzie ze starego .emacs i innych plików startowych z nowym Emacsem. Nie było tego dużo: hscroll-global-mode, pakiety session, trampjde. Zamiast session w dystrybucji Emacsa jest desktop.el; tramp.el też jest już w dystrybucji -- konflikt dotyczył starej wersji. Dodałem zatem kilka warunków w stylu:


(if (< emacs-major-version 22)
(progn (require 'session)
(add-hook 'after-init-hook 'session-initialize))
(progn (desktop-save-mode 1)
;; Customization follows below
(setq history-length 250)
(add-to-list 'desktop-globals-to-save 'file-name-history)) )

Emacs faktycznie używa fontu TrueType. Można to sprawdzić, np. za pomocą sposobu podanego w CSE HUJI Emacs Fonts HOWTO:


(frame-parameter nil 'font)

Wpisujemy powyższe do dowolnego bufora, ustawiamy kursor za zamykającym nawiasem a następnie C-x C-e. W minibuforze pojawi się:


"-b&h-luxi mono-medium-r-normal--15-*-*-*-*-*-fontset-startup"

Wygląda zatem, że to luxi mono Charlesa Bigelowa i Krisa Holmesa.

Jakość (czytelność) tekstu jest faktycznie znacząco lepsza, ale z wyświetlaniem poszczególnych znaków (na pierwszy rzut oka) jest różnie: niektóre znaczki jakby trochę są krzywe:-). Może to kwestia fontu? Sprawa wymaga dalszego zbadania. Poniżej dwa przykładowe ekrany (jak się kliknie to będą większe):

Emacs Emacs

niedziela, 19 sierpnia 2007

Problemów z Garminem ciąg dalszy

Okazało się, że w sobotę (28 lipca) mój Garmin Geko 301 nie tylko przestawił magicznie częstotliwość zapisu śladu, ale także cofnął się w czasie. W rezultacie kilka wpisów ,,zachodzi'' chronologicznie na siebie. Wyszło to dzisiaj, gdy usiłując wyciąć kawałek śladu przy pomocy programu gpsbabel uruchomionego w następujący sposób (por. Data Filters):


gpsbabel -t -i gpx -f plik-we.gpx -x track,start=2007081907,stop=2007081915 -o gpx -F plik-wy.gpx

otrzymałem:


trackfilter-init: Track points badly ordered (timestamp)!

Nie wiem czemu tak się stało. Mniejsza z tym. Zamiast ręcznie poprawiać błędne wpisy można spróbować dodać opcję merge, która łączy wszystkie ślady w jeden usuwając ,,części wspólne'' (jeżeli ślady nie zachodzą na siebie można zamiast merge, użyć pack)


gpsbabel -t -i gpx -f plik-we.gpx -x track,merge,start=2007081907,stop=2007081915 \
-o gpx -F plik-wy.gpx

Powyższe wytnie ślad utworzony od siódmej do piętnastej, 19 sierpnia 2007 r. BTW: do ściągnięcia zawartości Geko na dysk użyłem następującego skryptu:


#!/bin/bash
# http://wiki.openstreetmap.org/index.php/How_to_get_data_from_a_Geko_201
filename="`date +%y%m%d-%H%M`"
echo "creating $filename-waypoints.gpx"
gpsbabel -i garmin -f /dev/ttyS0 -o gpx -F $filename-waypoints.gpx
sleep 2
echo "creating $filename-tracklog.gpx"
gpsbabel -t -i garmin -f /dev/ttyS0 -o gpx -F $filename-tracklog.gpx

Do tej pory używałem okienkowego programu gpsman; gpsbabel jest wygodniejszy bo nie trzeba klikać, tyle że gpsman potrafi wyświetlić ślad, co czasami się może przydać, więc nie skreślam go ostatecznie.