2013-01-01
_ 明けましておめでとうございます
明けましておめでとうございます。今年もよろしくお願いします。
_ pam_usbを使ってUSBメモリで認証をする
Google+のDebianコミュニティにUSBメモリを使ってログインする動画が流れていたので試してみました。 (例ではubuntu/mintで説明しているのだけど、なぜDebianコミュニティに投稿したのだろう。謎。)
これを書く前に少しググってみたらpam_usb (aluzzardi/pam_usb GitHub)の開発の歴史は古く、USBメモリを使った認証ネタは結構あったよう *1 *2 *3 ですが、今ならデバイス自動認識で面倒も少ないのでお手軽に使えるのではと思います。
pam_usbを試す前にライブCDなどを準備しておく
システムのpam周りをいじるので、ログインできなくなる可能性があります。 ですので、ライブCD/DVD/USBメモリなどをあらかじめ準備しておき、不測の事態に備えておいてください。
pam_usbのインストール
aptを使ってpamusb-commonをインストールするとlibpam-usbなど必要なものがインストールされます。
$ sudo aptitude install pamusb-common
pamusb-confを使ってUSBメモリとユーザーの登録
pam_usbは公開鍵認証でUSBメモリに秘密鍵を入れて認証もできるのですが、ひとまずはネタ元動画と同じようにUSBメモリを鍵にしてユーザーのログインをできるようにします。
USBメモリの登録
あらかじめ認証に使うUSBメモリを差しておきます。 そしてpamusb-confコマンドに--add-deviceオプションに適当なデバイス名(例ではUSBKEY)を指定して実行します。
$ sudo pamusb-conf --add-device=USBKEY(USBKEYには適当な名前をつけてください) * No device configured for user "hoge". [sudo] password for hoge: Please select the device you wish to add. * Using " silicon-power (E69508006873)" (only option) Which volume would you like to use for storing data ? * Using "/dev/sdb1 (UUID: 4683-EADE)" (only option) Name : USBKEY Vendor : Unknown Model : silicon-power Serial : E69508006873 UUID : 4683-EADE Save to /etc/pamusb.conf ? [Y/n] y Done.
実行すると最後に「/etc/pamusb.confに保存しますか?」と尋ねられるので、保存して登録は終わりです。
ユーザーの登録
USBメモリを使ってログインするユーザーをpamusb-confコマンドを使って登録します。
$ sudo pamusb-conf --add-user=name=hoge Which device would you like to use for authentication ? * Using "USBKEY" (only option) User : name=hoge Device : USBKEY Save to /etc/pamusb.conf ? [Y/n] y Done.
設定をすると/etc/pamusb.conf以外にUSBメモリに.pamusbという隠しディレクトリと認証用のファイルも作成されます。
$ ls -la /media/USBKEY/.pamusb/ 合計 12 drwx------ 2 hoge hoge 4096 1月 1 12:45 . drwx------ 3 hoge hoge 4096 1月 1 12:49 .. -rw-r--r-- 1 hoge hoge 1024 1月 1 12:45 hoge.debian.pad
pamusb-checkを使って登録したUSBメモリ・ユーザーで認証できるかチェックする
登録したUSBメモリ・ユーザーで認証ができるかをチェックします。
登録したUSBメモリを差したままにしておき、pamusb-chekckを登録したユーザーで実行します。
$ pamusb-check hoge * Authentication request for user "hoge" (pamusb-check) * Device "USBKEY" is connected (good). * Performing one time pad verification... * Access granted.
問題なく認証できました。--dumpオプションを指定して設定を表示します。
$ pamusb-check --dump hoge Configuration dump for user hoge (service: pamusb-check): enable : true debug : false quiet : false color_log : true one_time_pad : true deny_remote : true pad_expiration : 3600 seconds probe_timeout : 10 seconds hostname : debian system_pad_directory : .pamusb device_pad_directory : .pamusb
登録していないユーザーでチェックしてみます。
$ pamusb-check fuga * No device configured for user "fuga".
「デバイスに設定されていません」と出ました。 次にUSBメモリを抜いてpamusb-checkを実行します。
$ pamusb-check hoge * Authentication request for user "hoge" (pamusb-check) * Device "USBKEY" is not connected. * Access denied.
USBメモリが接続されていないので拒否されました。
suやsudo、GDM3などの認証に使ってみる
pam_usbの設定は、関連パッケージのインストール時点で/etc/pam.d/common-authに設定されます(詳しくは後述)。 common-authはsuやlogin、各ディスプレイマネージャーの設定からincludeされているので、基本的には何もすることなくpam_usbの認証が使えることになります。
pamusb-checkが成功した人は、USBメモリを差したまま、端末で「su hoge」などを実行してsuで登録したユーザーに変更してみてください。パスワード無しでそのユーザーになれたはずです。
続いて、いったんログアウトして、登録したユーザーを選択してください。 これもパスワード無しでログイン出来たはずです。
/etc/pam.d/common-authの編集
pam_usbの設定はインストール時点で登録されるので基本的には変更することはありませんが、変更する場合についてちょっと考えてみました。
CASE1: USBメモリが差してあるとpam_usb認証、差してない場合はパスワード認証になる
pam_usb関連パッケージをインストールしたときの設定です。 pam_usbの認証を試してUSBメモリの認証に失敗すれば通常のパスワードログイン認証になります。
# here are the per-package modules (the "Primary" block) auth sufficient pam_usb.so auth [success=1 default=ignore] pam_unix.so nullok_secure try_first_pass
CASE2: USBメモリに登録したユーザーのみログイン可(パスワード認証のみのユーザーはログイン不可)
この設定はミスすると、ログインできなくなるので設定の際にはお気をつけ下さい。
パスワード認証を無効にして、USBメモリに登録したユーザーのみログインができる設定です。
common-authの17行目のpam_usbの設定を、sufficientからrequiredに変更して、18行目のpam_unixをコメントアウトします。 するとUSBメモリの認証しか行われなくなり、USBメモリに登録されたユーザーだけしかログインできなくなります。 (パスワードのみでログインするユーザーはログイン不可)
# here are the per-package modules (the "Primary" block) auth required pam_usb.so # auth [success=1 default=ignore] pam_unix.so nullok_secure try_first_pass
CASE3: USBメモリの登録ユーザーかつパスワードもログインに必要(パスワード認証のみユーザーはログイン不可)
この設定もミスすると、ログインできなくなるので設定の際にはお気をつけ下さい。
CASE2以上に使う人がいるのかと思いますが、パスワード認証のみのユーザーはログイン不可、USBメモリにユーザーを登録してあり、なおかつパスワード認証に成功した人のみがログインできる設定です。
設定はcommon-authの17行目のpam_usbの設定をrequired、18行目のpam_unixが有効にします。
# here are the per-package modules (the "Primary" block) auth required pam_usb.so auth [success=1 default=ignore] pam_unix.so nullok_secure try_first_pass
_ それにしても
新年早々何をかいてるんだか。 年末はバタバタしてて掃除できなかったから掃除しよ。
2013-01-03
_ tDiaryをバージョンアップした
うちのサーバーはこの日記をはじめ、いくつかtDiaryが動いているのだけど、Rubyは1.8だし、いろいろあってバラバラのバージョンのtDiaryが動いててちょっと気持ち悪い状態だったのでDebianパッケージのtDiaryを使うように変更してバージョンアップしました。
が、これが大変でした。
移行前にVirtualBoxで試したときは、うまくいったのでそれほど時間かからず終わるかと思って2日遅くから作業を始めたら、昔の設定ミスで画像が表示されていないページを発見したり、思わぬ不具合に遭遇したりして結局まるまる1日がかりになってしまいましたとさ。
ということで不具合メモ。
blogkitのarchive_dropdownプラグインとdropdown_calendarプラグインでリンクが「YYYYMM.html」形式にならない
SilverRecipeのサイトで、サイドバーのarchive_dropdownプラグインから移動できるかテストしたら、リンクURIが「YYYYMM.html」とならず「?date=YYYYMM」ってなってた。
「えー!」っと思って調べたけど、html_anchorプラグインは有効だし、mod_rewriteでマッチしているよう。YYYYMM.htmlでアクセスしても問題なくアクセスできるから、もういいかと諦めたらdropdown_calendarプラグインも同じような状態ということを発見。 とりあえず、自分のところはdropdown_calendarを外して変更して対処。
DebianパッケージのtDiaryは3.1.3なのでtDiary 3.2をダウンロードして確認したけど、症状が同じだったので、これはDebianパッケージの問題じゃなくてtDiaryの問題かも。
Debianパッケージのままの依存関係ではGFMスタイルが使えない(使えました)
tDiaryの記法にGFM(Github Flavered Markdown)スタイルが入ってたので試してみようかとスタイルをコピーして*1tdiary.confを変更して、pygments_cssプラグインを有効にしたらこんなエラーが出た。
Plugin Error Errors in plugins? Retry to Update or Configure. TDiary::PluginError Plugin error in '50sp.rb'. Plugin error in '/usr/share/tdiary/contrib/plugin/pygments_css.rb'. cannot load such file -- pygments (plugin/50sp.rb):132:in `rescue in block (3 levels) in load_plugin' /usr/share/tdiary/tdiary/plugin.rb:65:in `rescue in initialize' /usr/share/tdiary/tdiary/plugin.rb:56:in `initialize' /usr/share/tdiary/tdiary.rb:225:in `new' /usr/share/tdiary/tdiary.rb:225:in `load_plugins' /usr/share/tdiary/tdiary.rb:377:in `load_plugins' /usr/share/tdiary/tdiary.rb:186:in `do_eval_rhtml' /usr/share/tdiary/tdiary.rb:162:in `eval_rhtml' /usr/share/tdiary/tdiary/dispatcher/update_main.rb:31:in `run' /usr/share/tdiary/tdiary/dispatcher/update_main.rb:6:in `run' /usr/share/tdiary/tdiary/dispatcher.rb:21:in `dispatch_cgi' /usr/share/tdiary/update.rb:36:in `<top (required)>' /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require' /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require' update.rb:7:in `<main>'
Configureのリンクをクリックしても設定画面に戻れないし、ちょっと焦ったけれど日記データにあるtdiary.confのプラグイン設定からpygments_css.rbを削除してひとまず設定画面には戻れた。
で、原因を探ってたけど結論から書くとRuby関連のパッケージが足りなかった。 ということでruby-albinoとruby-yajlパッケージ、gem2debでpygments.rbパッケージを作って放り込んで使えるようになった。
$ sudo apt-get install ruby-albino ruby-yajl $ gem2deb pygments.rb $ sudo dpkg -i ruby-pygments.rb_0.3.7-1_all.deb
これはtdiary-contribパッケージにBTSしてたほうがいいかな。
複数行の整形済みテキストが使えない
とりあえずエラーはなくなったけど、複数行の整形済みテキストがうまくパースされない。
``` # ほげほげ ```
こんなシェルスクリプトのコメント行が見出しになってしまう。 なにかライブラリが足りないのかな?とりあえずWikiスタイルに戻す。
*1 コピーしなくてもシムリンク貼ってあった
2013-01-04
_ 別の環境を動かすschrootが超便利なのでメモった
amd64な環境でi386なバイナリを動かそうと思ったのだけど、multiarchだとライブラリのパッケージがバッティングしてインストールできなかったのでschrootを使ってみた。
chrootな環境は、仮想環境の中でもう一つの環境を動かしたり、いろいろゴニョゴニョする事は多いと思うのでメモ。
インストール
schrootのインストールはサクっとaptで。debootstrapはすでに入ってるいる人は多いと思うけど念のため。
$ apt-get install schroot debootstrap
debootstrapでschroot環境を作る
debootstrapを使ってschrootをする環境を作ります。 ここで注意ですが、debootstrapを実行するとき--include=sudoとオプションを指定してsudoもインストールしておきましょう。
なぜかというと、debootstrapでインストールした状態ではsudoはインストールされません。 今どきのDebian環境では、rootを作成せずsudoを使ってユーザーに管理者権限を持たせてある場合があると思いますが*1、その状態のままschroot環境に入ると、sudoがないので管理者権限が使えないという悲しい状態になります。
ということでdebootstrapには--include=sudoをつけて実行しておきましょう。
# mkdir -p /srv/chroot/squeeze-i386 # debootstrap --arch=i386 --include=sudo squeeze /srv/chroot/squeeze-i386 http://ftp.jp.debian.org/debian
schrootの設定
/etc/schroot/schroot.confを編集してschrootの設定をします。
# vi /etc/schroot/schroot.conf
コメントアウトされた設定を見るといろんな使い方ができるようですが、とりあえずはシンプルにschroot.confの末尾にこんな感じで設定を書きます。
[squeeze] description=Debian Squeeze i386 type=directory directory=/srv/chroot/squeeze-i386 users=(ユーザー名) groups=(グループ名) aliases=stable,default
schroot環境を使ってみる
登録している環境のリストを見る
-lオプションをつけるとschroot.confに登録している設定一覧が表示されます。
$ schroot -l chroot:default chroot:squeeze chroot:stable
登録している環境の状態を見る
-cオプションで環境の名前と-iオプションで環境の状態が表示されます。
$ schroot -c sid -i ─── Chroot ─── Name squeeze Description Debian squeeze i386 Type directory Message Verbosity normal Users (ユーザー名) Groups (グループ名) Root Users Root Groups Aliases stable default Preserve Environment false Default Shell Environment Filter ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|IFS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMAIN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TERMPATH)$ Run Setup Scripts true Configuration Profile default Script Configuration Session Managed true Session Cloned false Session Purged false Directory /srv/chroot/squeeze-i386 Personality linux32 User Modifiable Keys Root Modifiable Keys User Data setup.config default/config setup.copyfiles default/copyfiles setup.fstab default/fstab setup.nssdatabases default/nssdatabases Filesystem Union Type none
schroot環境にログインする
ログインする場合はschrootするだけでログインできます。 schroot環境に入っているときはコマンドプロンプトに「(環境名)」がつくので、すぐにわかると思います。
$ schroot -c squeeze (squeeze)hoge@machine:~$
schroot環境のプログラムを実行する
$ schroot -c squeeze /bin/ls
と、こんな感じで実行できるのならXを使うプログラムを実行したくなると思いますが、実行するとこうなります。
$ schroot -c squeeze icedove Error: no display specified
慣れた人なら、xhostコマンドでXサーバーのアクセス許可をしたり、環境変数DISPLAYを設定したり面倒なことをしなきゃなんないのかと思うかもしれませんが、親の環境を引き継いでコマンドを実行する-pオプションをつけると、この問題もあっさり回避できます。
$ schroot -p -c squeeze icedove
これで親の環境とシームレスにschroot環境のプログラムを実行できますね。
おわりに
schrootは普通のディレクトリにchrootする以外に、aufsでCOWな環境にできたり、ブロックデバイスにも使えるみたいなので、もうちょっといじってみよう。 あと、いろいろ/homeとかマウントされたり親環境からコピーされるファイルなどの設定は/etc/schroot/以下にあるので、それを見ると良いよ。
*1 Debianインストール時にrootのパスワードを空にするとなるんですよ
2013-01-07
_ 風邪ひいた
土曜に京都で開催された2013年第一回関西Debian/Ubuntu新年会に出てから、彼女の家に遊びに行ったのだけど風邪をひいてしまった。 頭、痛い。
_ シェルスクリプトで時間差を求める
ラジオを録音したいと思ったのでシェルスクリプトで時間計算をどうしたらいいのか調べてみた。
NHKラジオ第1のすっぴん!の放送時間は朝8時から11時50分までということで、この差分を求めてみます。
$ date -d "2013/1/8 08:00" 2013年 1月 8日 火曜日 08:00:00 JST $ date -d "2013/1/8 11:50" 2013年 1月 8日 火曜日 11:50:00 JST
このままじゃ計算できないのでUNIX時間に変換する。
$ date -d "2013/1/8 08:00" "+%s" 1357599600 $ date -d "2013/1/8 11:50" "+%s" 1357613400
計算できるようになったのでexprなりbcなりで終了時刻から開始時刻を引くと秒数が出る。
$ expr 1357613400 - 1357599600 13800
すっぴん!は3時間50分なのでbcで秒数を出して比べてみます。
$ echo "(60*3+50)*60" | bc 13800
合ってますね。 これをrtmpdumpの終了時間に設定すれば録音できるかな。
UNIX時間から通常の時間表示に変換する
逆にUNIX時間から通常の時間表示に変換することもあるけど、よく忘れるのでメモ。
$ date -d "@1357599600" 2013年 1月 8日 火曜日 08:00:00 JST
こういう方法もあるけど、上のほうが覚えやすいかも。
$ date -d "1970-1-1 GMT +1357613400 second" 2013年 1月 8日 火曜日 11:50:00 JST
2013-01-11
_ 日本のストリーミングラジオの録音について調べてみた
ラジオを録音したいなと思ったので調べたものをまとめてみた。
radiko.jp(民放AM/FM)
- ストリーミング方式: RTMP
- 放送エリア外で聞かせたくないので、認証しないと聞けない。
- 非公開の放送局情報や番組表APIがある
直接録音するのは面倒臭い。 聞く局も限られてるから、録音しなくてもいいかな。
らじる★らじる(NHK)
- ストリーミング方式: RTMPとMMS
- Flashが使えない場合はWindows Mediaのストリーミングで聞けるようになってる。
- RTMPの場合はrtmpdump、MMSはmplayerかmsdlを使うといい
- らじるらじるをrtmpdumpで録音する
- mplayerはWAVで書き出しリアルタイムでmp3にエンコードしてるとコケる(らじるらじるに限らないけど) → mplayerとlameで らじるらじる の長時間録音 | メモなど
- RTMPの場合はrtmpdump、MMSはmplayerかmsdlを使うといい
- 認証などはないので素直にキャプチャできます。
- 非公式の番組表APIがある
- http://cgi4.nhk.or.jp/hensei/api/sche-nr.cgi?tz=all&ch=netr1&date=2012-05-19
- 時間帯: tz=[morning|afternoon|night|all]
- チャンネル: ch=[netr1|netr2|netfm]
- 日付: date=YYYY-MM-DD
- http://cgi4.nhk.or.jp/hensei/api/sche-nr.cgi?tz=all&ch=netr1&date=2012-05-19
配信が2段構えになってるのはさすが。 RTMPのほうはAACで、MMSはWMAで配信なので、rtmpdump使ってAACのほうを録音すると音質はよさげ。 でも、手軽さならMMSのストリームをダンプするほうが早いので迷うところ。
コミュニティFM(CSRA/JCBA)
- ストリーミング方式: CSRA:MMS JCBA:RTMP
- CSRAはMMSだけど、JCBAはRTMPになってるのはなぜ。
- CSRAとサイマルラジオ、JCBA(日本コミュニティ放送協会)に分かれてるのでややこしい。
- CSRAとサイマルラジオは同じなんだけど、ストリーミングのドメイン名がcsra.fmとsimulradio.jpに分かれてたり、いったいなんなん?
- 認証やDRMは、かかってないのでmplayerのdumpstreamやmsdlでキャプチャできる。
- JCBAのほうは気づいている人がいないのか、rtspdumpでダンプするには解析しなきゃいけない。
- ラジオ局の情報や番組表のAPIなどは用意されていない。
- サイト自体手作りでスクレイピングしようにも例外が多いから、手で直さないと使えない感じ。
- ていうかストリーミングもURIが統一されてなかったりシステムもバラバラな感じ。
CSRAのキャプチャは問題なくできる。JCBAはrtmpdumpでキャプチャできそうだけど調べないとわからない。 ラジオ局が多いのに統一されたインターフェースもなく、データが整理されてないから全国を網羅しようと思ったら結構大変。
_ timeoutコマンドで時間を限定してコマンドを実行する
ラジオ関連の話です。
mplayerのdumpstreamは、Ctrl+Cで止めない限り延々ダンプし続けます。 なんとか止める方法はないかと調べてたけど、検索で引っかかるのはmplayerをバックグラウンドで実行後、killをsleepで一定時間スリープさせて止めるものばかり。 これはこれでいいのだけど、もう少しスマートにできないかなと思って調べたら、timeoutコマンドを使えば一定時間経過後にコマンドが終了できるので、これを使うのがよさげ。
使い方はこんな感じ。
$ timeout 時間 コマンド
FM GENKIのストリーミングを1分間だけダンプするには、こんな感じで書くと1分後に終了します。 (注: コマンドは1分で終了しますが、mplayerは開始直後、バッファにデータを貯めるので録音自体は50秒前後です。)
$ timeout 1m mplayer -playlist http://csra.fm/asx/fm-genki.asx -dumpstream -dumpfile fmgenki.asf
_ Dropbox-Uploaderを使ってコマンドラインからDropboxにアップロードする
- andreafabrizi/Dropbox-Uploader · GitHub: https://github.com/andreafabrizi/Dropbox-Uploader
Dropboxにファイルをアップロードするシェルスクリプト。 Dropbox APIを使ってるので最初にAPIキーの設定が必要だけど、指示に従えばすぐに設定できるのでサクッと使えます。
ラジオ録音スクリプトと組み合わせれば、録音して、どこでもラジオが聞けるぜ!
2013-01-13
_ 「殺して38&つーさん 結婚パーティー!!」に行ってきたよ
TV JACK 1000でもお世話になった、殺してさんが結婚して、結婚記念ライブを開くというので行ってきた。
みんなニコニコ。ホント、いいライブだったよな。 神戸だけど姫路勢ばっかり。マッシュルームが残ってたらなぁ。
2013-01-19
_ 姫路IT系勉強会 Vol.13で「デザイナーさんに送る「黒い画面は怖くない!」(チートシート付き)」という発表をしたよ
チートシートやハンズオン用のLive USBメモリを作ったのだけど、結果から言うと大失敗。
ターゲットを「ターミナル自体が使えない/使いたくない人」と想定して資料を作ったのだけど、来てた人は、ある程度まで触れる/抵抗は無いけどちょっと苦手という、それなりに使える人だった事、そしてハンズオンぽくやりたいなと考えてたけど、事前のアナウンスができてなかったのでうまくまわらなかった。
ということで、資料を作りなおして、またどこかでやり直したいです。
2013-01-21
_ ジアンジアンのマスターが亡くなられたそう
- ジアンジアン | 矢谷の気合いブログ。: http://yataniumeco.jugem.jp/?eid=6
マッシュルームが亡くなり、次はジアンジアンのカレーも亡くなった。 さみしいな。
2013-01-27
_ 関西Debian勉強会で奈良に行ってきた
- KansaiDebianMeeting/20130127 - Debian Wiki: http://wiki.debian.org/KansaiDebianMeeting/20130127
奈良で関西Debian勉強会があったので行って、月刊Debianポリシーをちょこっとだけ話をしました。
Drupal 紀野さんのDebianとDrupal話しは面白かったな。 告知が十分でなかったのか、奈良開催だったせいかわからないけど、人が少なかったのはちょっと残念。
懇親会は焼鶏とお鍋 奈良町 雷門というお店で、鍋と鳥料理を堪能しましたとさ。 また、奈良はゆっくり行きたい。
2013-01-30
_ image_ex.rbが使えないと思ったら、ImageMagickとnetpbmが入ってなかった
この日記に写真をアップロードしたら原寸で表示されて「なぜ?」と思って調べたら、サーバーの不要なパッケージを削除した際にImageMagickとnetpbmをざっくり消してたみたい。
image_ex.rbって、tdiary-contribに含まれるパッケージだから、recommendsかsuggestsに書いてあってもよいかも。
_ いろいろ追記
しばらく日記が書けなかったから、書き留めたいことを追記した。
_ Markdownとドキュメント変換ツール「pandoc」を使って、Debian勉強会の資料を作成しよう
- Pandoc - About pandoc: http://johnmacfarlane.net/pandoc/
東京エリア/関西Debian勉強会の資料は、発表スライドとは別にTeXで紙の資料を作成しています。(勉強会gitリポジトリ) TeXで書かれた資料の一部を抜き出すとこんな感じ。
\dancersection{タイトル}{発表者名} \subsection{大見出し} 本文がここにありまして見出しが続いたりします。 \subsubsection{小見出し} \begin{itemize} \item アイテム1 \item アイテム2 \end{itemize}
要はHTMLみたいに文書をタグで囲んで意味づけしてやればいいのだけど、プレーンテキストのマークアップはemacsとやてふを使っても結構時間がかかります。
そこで、Markdownを使って書いてDebian勉強会の資料をサクっと作ってしまおうというのが今回のエントリです。
ネタばらしすると、今月の月刊Debianポリシーの資料作成が間に合いそうになかったので、苦肉の策でpandocの変換を試したら、これが以外に良かったので残しておこうという話でもあったりします。
Markdownで書く
最初にMarkdownで資料を書きます。Markdownを書くエディタは何でも構いません。プレビューしながら書けるReTextでも、emacsのmarkdown-modeでも使いやすいエディタで書いてください。
Markdownの書式ですが、pandocで使われるMarkdown書式はオリジナルのMarkdown書式からPHP MarkdownやGithub Flavored Markdownのいいとこ取りした、Pandoc’s markdown書式になってます。 基本的には、作表などオリジナル書式に足りないところを足しているだけなので、書く上でそんなに戸惑うことはないと思います。
上のTeXをpandoc Markdownで書くとこんな感じになります。
% タイトル % 発表者名 大見出し ------- 本文がここにありまして見出しが続いたりします。 ## 小見出し * アイテム1 * アイテム2
pandocで変換してみる
これをpandocを使って変換します。hoge.mdで保存しておいたMarkdownテキストを変換するならこんな感じ。
$ pandoc -o hoge.tex hoge.md
出力例はこんな感じ。
\subsection{大見出し} 本文がここにありまして見出しが続いたりします。 \subsection{小見出し} \begin{itemize} \item アイテム1 \item アイテム2 \end{itemize}
dancersectionはDebian勉強会のマクロだから仕方ないとして、ほぼ完璧ですね! 細かいところで言えば、HTMLのリンクが\href{}に展開されるけど、Debian勉強会では\url{}という違いぐらいだと思います。
いろいろいじればDebian勉強会のスタイルにあったTeXにも変換できそうだから、これからいじってみます。
_ libreofficeをバックエンドに使ったドキュメント変換ツール「unoconv」もいい!
- DAG: unoconv: Convert between any document format supported by OpenOffice: http://dag.wieers.com/home-made/unoconv/
OpenOffice.org/LibreOfficeをヘッドレスで動かしてWord/Excelの文書を変換するサーバーなんてのがありますが、pandoc関係を検索してたらコマンドで変換できるツールがありました。 リポジトリにあるのでapt-get install unoconvでインストールできます。
pandocと組み合わせたら、なんでも文書が変換できるんじゃない?