Subversionサーバー移行手順

はじめに

Solarisで立てていたSubversionサーバーをNASのLinuxに移すことになりました。個人的にはGitにしたかったんですが、まあ、コードをガリガリ書くような環境じゃないのでいいかな……。

とにかく、svnadminコマンドとか初めて触ったのでおかしなところがあったら指摘プリーズ。

概要

  1. 移行元バックアップ
  2. 移行先Subversionサーバー立ち上げ
  3. バックアップから復元
  4. 新リポジトリの設定
  5. 旧リポジトリのコミット禁止

1. 移行元バックアップ

移行元サーバーにて以下のコマンドを実行する。(「>」は半角にして下さい)

svnadmin dump 移行元ディレクトリ > ダンプファイル

2. 移行先Subversionサーバー立ち上げ

移行先サーバーにてリポジトリ格納用のディレクトリを作成し、Subversionサーバーを立ち上げる。

ex.:

mkdir /share/MD0_DATA/svn
svnserve -d -r /share/MD0_DATA/svn`

3. バックアップから復元

ダンプファイルからリポジトリを復元する。 2. 移行先Subversionサーバー立ち上げ で作成したディレクトリにて以下のようにコマンドを実行する。(「<」は半角にして下さい)

mkdir 移行先ディレクトリ
svnadmin create 移行先ディレクトリ/
svnadmin load --bypass-prop-validation 移行先ディレクトリ < ダンプファイル

4. 新リポジトリの設定

ダンプファイルには設定までは含まれていないようなので、新リポジトリにて再設定する。
移行先ディレクトリ/conf/svnserve.conf を以下のように編集する。

編集前:

# password-db = passwd

編集後:

password-db = passwd

さらに、移行元ディレクトリ/conf/passwd というファイルを 移行先ディレクトリ/conf/passwd にコピーする。

5. 旧リポジトリのコミット禁止

コミット開始をフックするテンプレートスクリプトがあるのでそれを利用する。
移行元ディレクトリ/hooks にて以下のコマンドを実行。

cp start-commit.tmpl start-commit
chmod +x start-commit

start-commit の内容を以下のように編集する。コミット時にcommit.lockという名前のファイルが存在すると異常終了するスクリプトである。

#!/bin/sh
REPOS="$1"
USER="$2"

if [ -e "$REPOS/commit.lock" ];
then
  echo "Service temporary unavailable." 1>&2
  exit 1
fi
exit 0

その後、commit.lock ファイルを作成する。

touch 移行元ディレクトリ/commit.lock

コミット実行時に Service temporary unavailable. 以外のエラーになる場合は start-commit の一行目を #!/bin/bash に変更する。


参考

響 Radio Stationの番組(iPhone向け)を録音する

 いつもはWindows Media Player向けを録音していたのですが、「神様と運命覚醒のクロステーゼ × 日本一RADIO」の2014年6月4日更新分は番組紹介ページ内のリンクが壊れているので録音出来ませんでした。

そこで、同じ番組紹介ページにあるiPhone版をどうにかして保存できないか試してみました。

取り敢えず番組紹介ページの該当部分のリンクを見てみる。

$ wget -q -O - http://hibiki-radio.jp/description/nippon1 | grep iphone | ruby -ruri -e 'puts URI.extract(ARGF.read, "http")'

http://www2.uliza.jp/IF/iphone/iPhonePlaylist.m3u8?d=910&p=2807&v=140604_nippon1-ip

そしてそのリンク先の内容は

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=110000

http://aka-hibiki-hls-vod.uliza.jp/910/140604_nippon1_140604_nippon1-ip-00000562.m3u8

m3u8プレイリストのURLでした。じゃあこのプレイリストの中身はと言うと

$ head 140604_nippon1_140604_nippon1-ip-00000562.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:10,
140604_nippon1_140604_nippon1-ip-00000562/23889-1.ts
#EXTINF:10,
140604_nippon1_140604_nippon1-ip-00000562/23889-2.ts
#EXTINF:10,
140604_nippon1_140604_nippon1-ip-00000562/23889-3.ts
#EXTINF:10,
140604_nippon1_140604_nippon1-ip-00000562/23889-4.ts

339個のtsファイルに分割されてるっぽい!

しょうがないから全部wgetする。連番ダウンロードはcURLの方が向いてるのですが、まああんまりサーバーに負担を掛けたくないので間隔を空けてます。

$ for i in {1..339}; do
> wget http://aka-hibiki-hls-vod.uliza.jp/910/140604_nippon1_140604_nippon1-ip-00000562/23889-${i}.ts && sleep 1
> done

ファイルが全部揃ったら、連結してみる。

$ cat 23889-{1..339}.ts >140604_nippon1_140604_nippon1-ip-00000562.ts

連結したファイルはVLC.appで再生できました。あ、wgetの “–output-document” オプションで連結したほうがスマートだったかも。

RTSPストリーミングを録音

毎週聴いていた Web ラジオのストリーミング形式が MMS から RTSP に変更されました。

当初、GNU WgetcURL コマンドで試行錯誤してみたのですが、録音出来ませんでした。><

さらに少し調べてみると、マルチメディア変換ツール FFmpeg で以下のように入力ファイルに直接 URL を指定すればいいということが分かりました。(4行で表示してますが本当は1行です)

ffmpeg -i
  rtsp://qt.web-radio.biz:1935/lantisnet/mp4:maousama_13_130531_h.mp4
  -vcodec copy -acodec copy -scodec copy
  maousama_13_130531_h.mp4

これでようやく安心して Web ラジオが楽しめます。ストリーミングってなんとなく苦手なんですよねー。

Android tablet N80RK

Vido N80RK

買いました。一ヶ月くらい前に。
Android カメラアプリの開発用にしようとしたのですが、
200万画素の背面カメラにはオートフォーカス機能がありませんでした。
OCR とか到底無理じゃないか……orz
しょうが無いので OCR の前処理のテストとか読書用に使っております。

Mac の adb に認識させる

USB で Mac に接続して adb devices を実行してみたら N80RK が認識されていませんでした。
以下のように USB の Vendor ID を調べ、 adb_usb.ini に追記すると認識されるようになりました。 Mac には lsusb コマンドが無いんですね。

$ /usr/sbin/system_profiler SPUSBDataType
                (略)
            N80RK:

              Product ID: 0x0010
              Vendor ID: 0x2207  (Fuzhou Rockchip Electronics Co., Ltd.)
              Version: 2.22
                (略)
$ echo "0x2207" >> ~/.android/adb_usb.ini && adb kill-server

それで、 adb で何をやりたかったというと、
たとえばスクリーンショット。

$ adb shell screencap /sdcard/001.png
$ adb pull /sdcard/001.png ./

…… pull コマンドとかってワイルドカード使えないのが困りますよね。
あるいはページめくりのためにタップするのが面倒臭いので、コマンドで周期的にタップ。

$ for i in {001..317}; do
    adb shell input tap 100 600 && sleep 60
done

うーん、やっぱりちゃんとしたタブレット用スタンド欲しいなあ。


参考

PDFファイルをKobo Glo向けのCBZファイルに変換する

Kobo Glo で PDF を読もうとしたら異様に動作が重かったです。その PDF ファイルだけかも知れませんが。

仕方が無いので CBZ ファイル(画像ファイルを ZIP でかためたもの)に変換するスクリプトを作成しました。文字情報は失われますが、検索とかコピペとかしない文書なので軽さ最優先です。

pdftocbz.sh hogehoge.pdf

と実行すると、同じ場所に最適化されたCBZファイルが出来ます。元のPDFファイルにタイトルや著者名が埋めこまれていると、それを使って「[著者名] タイトル.cbz」みたいなファイル名になります。

tdtds/kindlizer · GitHub を手本に作りました。やっと convert コマンドの使い方が分かってきた気がします、今さら。

PDFを画像ファイルに

「pdfを画像ファイル」で検索してる方がいるらしいので、PDFファイルから画像を取り出す方法をちょっと調べてみました。主に Mac か Linux 環境向けです。Windows の場合は……「かんたんPDFダイエット」とか使えばいいんじゃないですかね。

Poppler (または Xpdf) を使う

Poppler に “pdftoppm” というコマンドがありますのでそれを使います。

pdftoppm hoge.pdf output

と実行すると、hoge.pdf をファイル名の先頭に output をつけた画像ファイルに出力します。
主に以下のようなオプションがあります。

-png, -jpeg  :PNG, JPEGファイルを生成
-gray    :グレースケールのPGMファイルを生成
-r 数字    :解像度 (DPI) を指定
-o      :奇数ページのみ
-e      :偶数ページのみ

-png, -jpeg, -tiff, -gray などのオプションが無いと PPM ファイルを生成するはず。その場合は ImageMagick の mogrify で変換しましょう。

mogrify -format png output*.ppm

以下、ヘルプのコピペです。

% pdftoppm --help
pdftoppm version 0.22.0
Copyright 2005-2012 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdftoppm [options] [PDF-file [PPM-file-prefix]]
  -f <int>                 : first page to print
  -l <int>                 : last page to print
  -o                       : print only odd pages
  -e                       : print only even pages
  -singlefile              : write only the first page and do not add digits
  -r <fp>                  : resolution, in DPI (default is 150)
  -rx <fp>                 : X resolution, in DPI (default is 150)
  -ry <fp>                 : Y resolution, in DPI (default is 150)
  -scale-to <int>          : scales each page to fit within scale-to*scale-to pixel box
  -scale-to-x <int>        : scales each page horizontally to fit in scale-to-x pixels
  -scale-to-y <int>        : scales each page vertically to fit in scale-to-y pixels
  -x <int>                 : x-coordinate of the crop area top left corner
  -y <int>                 : y-coordinate of the crop area top left corner
  -W <int>                 : width of crop area in pixels (default is 0)
  -H <int>                 : height of crop area in pixels (default is 0)
  -sz <int>                : size of crop square in pixels (sets W and H)
  -cropbox                 : use the crop box rather than media box
  -mono                    : generate a monochrome PBM file
  -gray                    : generate a grayscale PGM file
  -png                     : generate a PNG file
  -jpeg                    : generate a JPEG file
  -tiff                    : generate a TIFF file
  -tiffcompression <string>: set TIFF compression: none, packbits, jpeg, lzw, deflate
  -freetype <string>       : enable FreeType font rasterizer: yes, no
  -aa <string>             : enable font anti-aliasing: yes, no
  -aaVector <string>       : enable vector anti-aliasing: yes, no
  -opw <string>            : owner password (for encrypted files)
  -upw <string>            : user password (for encrypted files)
  -q                       : don't print any messages or errors
  -v                       : print copyright and version info
  -h                       : print usage information
  -help                    : print usage information
  --help                   : print usage information
  -?                       : print usage information

Automator を使う (Mac OS X 限定)

Mac OS X の自動化ツール Automator に PDF 関連のアクションが結構あります。
「PDF ページをイメージとしてレンダリング」というアクションが今回の目的にあいそうです。
「奇数ページと偶数ページを抽出」というアクションもありますね。

スクリーンショット 2013-02-07 4.58.09

響 – Hibiki Radio Station – 録音スクリプト修正

Hibiki Radio Station の番組詳細ページの Windows Media Player ファイルを保存するためのスクリプトです。
本当はTOPページで rtmpdump するのがいいんでしょうけど手っ取り早いので。
asx ファイルが変わったみたいので対応しました。

02/05追記:なんだか頻繁に録音失敗するので、一回リトライするようにしました。っていうか mimms にレジュームオプションなんてあったんですね……。

02/13追記:mimmsは途中終了してもエラーにならないらしいので ”||” 演算子の意味が無い……。どんな場合でも二回mimmsするようにしました。

#!/bin/sh -e
# hibiki.sh ver.0.5.6 (2013-02-13)
# require wget, ruby, and mimms
TMPFILE="/var/tmp/tmp.$$"
trap 'rm -f ${TMPFILE}' EXIT

if [ $# -eq 1 ]; then
  STR=$1

  # save asx file
  wget -q -O - http://hibiki-radio.jp/description/${STR} | grep WMV | ruby -ruri -e 'puts URI.extract(ARGF.read, "http")' | head -1 | xargs wget -q -O ${TMPFILE}
  if [ -z ${TMPFILE} ]; then
    echo "download ERROR"
    exit 1
  fi
  TITLE=`cat ${TMPFILE} | ruby -rrexml/document -e 'puts REXML::Document.new(ARGF).elements["ASX/entry/title"].text'`
  WMVFILE=`cat ${TMPFILE} | ruby -rrexml/document -e 'puts REXML::Document.new(ARGF).elements["ASX/entry/Ref"].attributes["href"]'`
  if test a"$TITLE" = a"" ; then
    echo "asx detection failed."
    exit 1
  fi

  mimms -r ${WMVFILE} "${TITLE}.asf"
  mimms -r ${WMVFILE} "${TITLE}.asf"

else
  echo "usage: `basename $0` STRING"
fi

WebRadioRecorder/hibiki.sh at master · unot/WebRadioRecorder · GitHub

Upgrade Windows XP to 8 in VMware Fusion

Windows 8 Pro のアップグレード版が今月末まで安いというので、何となく買ってなかった VMware Fusion 5 と一緒に買ってアップグレードしようとしました。

VMware Fusion 5 につつがなくアップグレードし、ゲストOSとしてWindows XPが正常に動作していることを確認しました。続いてWindows XPから8にアップグレードしようとし……、そこで2点ほど引っ掛かったのでここに記します。

Windows XP からアップグレード出来ない

HDDの仮想SCSIコントローラーの互換性が無いとかでアップグレードが進められません。
解決方法は、

  1. 共有設定をオフにしてWindows XPを終了。(スナップショットがあればそれも消す)
  2. メニュー→仮想マシン→設定→ハードディスクを開く
  3. ハードディスクを削除。その際「ファイルの保持」を選択する
  4. Finderで仮想マシンファイルを右クリックし、「パッケージの内容を表示」
  5. vmdkファイル(で、連番の付いていないもの)を右クリックし、テキストエディットで開く
  6. “buslogic” の文字列を探して “ide” に置換し、保存する
  7. Fusionのメニュー→仮想マシン→設定で「デバイスを追加」
  8. 「既存のハードディスク」を選択する
  9. 「この仮想ディスクを作成した仮想マシンと仮想ディスクを共有する」をチェック
  10. 上で編集したvmdkファイルを選択して開く

以上です。要するに、既存のハードディスクの設定をIDEに変更して開き直せばいいのです。

ネットワークが繋がらない

めでたく Windows 8 にアップグレードできましたが、インターネットに接続できません。
これの解決方法は、

  1. Windows 8 を終了
  2. Finderで仮想マシンファイルを右クリックし、「パッケージの内容を表示」
  3. vmx ファイルを右クリックし、テキストエディットで開く
  4. ethernet0.virtualDev = "e1000e" を追記し、保存する

これで Windows 8 を起動すると、しばらくしてネットワークが認識されました。めでたしめでたし。

ちなみに今だけ無料という Media Center Pack は導入していません。Windows のコントロールセンターから辿っていくと800円になっていて面倒くさくなりました。


参考:

自炊スキャンデータをKobo Gloに最適化

Kobo Glo 買いました。Kindle Paperwhite と比較したんですが、やっぱり microSD が挿せないのは不便ですから。あと Kindle のコンテンツそんなに持ってませんし。

で、自炊した小説(JPEGファイルをZIPでかためたもの)を Kobo Glo で表示してみたんですが、文字がかすれ気味でちょっと読み辛いです。

そこで電子ペーパーに最適化する方法を検索。見つけたのは以下の記事。

Kindle Paperwhiteで自炊した本を読む手順と便利なツール | ごりゅご.com

calibre というオープンソースのアプリがあるんですね。WindowsでもMacでもLinuxでも動くそうです。

という訳で早速Macにインストールして変換してみたんですが……、あんまり綺麗じゃないですね。原稿とディスプレイの縦横比が違うと悲惨なことに。それにも増して厭だったのが、日本語ファイル名がアルファベットになることです。設定で変えられるとは思うんですが。

他の手は無いかと更に検索。

ScanSnap後の画像処理 – \ay diary

なるほど、ImageMagick の convert コマンドでトリミング出来るんですね。私はZIPを展開したあと、以下のようにターミナルで実行しました。

for i in *.jpg; do
    convert ${i} -type grayscale -sharpen 5 -fuzz 50% -trim -linear-stretch 2%x2% -bordercolor white -border 2%x2% png:- | convert - -depth 4 -resize 758x1024 ${i%.jpg}.png
done

"-type grayscale" でグレースケールに、
"-sharpen 5" で鮮鋭化、
"-fuzz 50% -trim" でファジーにトリミング、
"-linear-stretch 2%x2%" でヒストグラムを引き伸ばしてコントラストを上げ、
"-bordercolor white -border 2%x2%" で白枠を付け(ギリギリにトリミングすると読み辛いので)、
"-depth 4" で 4-bit 化(ファイルサイズが小さくなりますが、ImageMagickのバージョンによっては対応してないかも)、
"-resize 758x1024" で Kobo Glo 用に解像度変換しています。

ライトノベル一冊当たり6分程度かかります。GNU Parallel が使えるようでしたら、

ls *.jpg | parallel -j4 "convert {} -type grayscale -sharpen 5 -fuzz 50% -trim -linear-stretch 2%x2% -bordercolor white -border 2%x2% png:- | convert - -depth 4 -resize 758x1024 {.}.png"

みたいにすると速くなるかも知れません。更にファイルサイズを小さくしたい場合は、以下のように OptiPNG を実行すると5%くらい小さくなるでしょう。

optipng *.png

元ファイルが PDF の場合は kindlizer を使うといいかも。ImageMagick の他に Poppler, sam2p, PDFtk, Rake が必要になります。

Kindlizerの使い方 – はてなの鴨澤

あ、ImageMagick も Parallel も OptiPNG も Homebrew で一発インストールしました。


追記

シェルスクリプトにしてみました。ZIPでかためたJPEGファイルをKobo Gloに最適なCBZファイルにします。→ Zipped jpeg files to CBZ file for Kobo Glo.

crontabで隔週実行

今宵は会社の忘年会でした。自分ひとりだけ別部署に派遣されているので、普段会えない人に会えるのが嬉しいですね。

それはさておき、隔週放送のwebラジオを録音したくなりました。crontabで設定しようとしたのですが、どうもひと工夫必要なようです。曜日の項で “wed/2″ とか記述すると変なタイミングで実行されてしまいました。
で、Google先生にお伺いをたてて出てきたのがこの記事。

crontabで隔週実行 – jarp,

「年末年始で破綻しそう」とありますが、どうせ盆と正月は放送日程が乱れるので結局以下のようにしました。
‘%’ はエスケープすることに注意しましょう。

59 20 * * wed expr `date +\%V` \% 2 && /path/to/aandgplus.sh 60

これで「隔週水曜日20時59分」にコマンドが実行出来るようになりました。