Apache2.2からOptionsディレクティブの仕様が変わっていたゾ

feather例によって何も考えずに apt-get してしまった。apache2 のアップグレードが動き出して、設定ファイルはどうするか?と問われたので、古いものを残すことを指示した。これで世は事もなしのはずだった。

webサーバが動いてないぢゃん。

apache2 のサービスが停止している。手動で動かそうとすると、userdir.conf と 000-default.conf が Syntax error だという。さては書き変えられたか!と確認したが、きちんと前のままだ。文句を言われている行をコメントアウトすると動き始める。

そこでapache.orgのドキュメントを調べてみた。

警告

Options で指定する際に、 + や – のついたものと、ついていないものを 混ぜて指定する記述は誤った構文で、予期しない結果になるかもしれません。

Options +ExecCGI -MultiViews FollowSymLinks

と書いてはいけないらしい。

正しくは次のようにすべてに ‘+’ または ‘-‘ を付けなければならない。

Options +ExecCGI -MultiViews +FollowSymLinks

これはapache2.2で変更になっていた。2.0では規定されていない。まいっちんぐ。

そろそろサーバを入れなおししようかと思っているので、気楽なものである。

sudoができなくなったゾ

ubuntu-logo112ちょいと調べ事があって、会社から自宅鯖にリモートログインした。

その後、しばらくapt-getでアップデートしていないことを思い出し、軽い気持ちで sudo apt-get update を行った。大量の更新がぞろぞろ流れていった。

途中でどれそれをアップデートするけど、本気か?という質問が出たが、気にせずに「Y」してしまった。

sudo (1.8.9p5-1ubuntu1) を設定しています ...
設定ファイル /etc/sudoers.d/README を新規にインストールしています ...
設定ファイル /etc/init.d/sudo を新規にインストールしています ...

Configuration file '/etc/sudoers'
 ==> Modified (by you or by a script) since installation.
 ==> パッケージ配布元が更新版を提供しています。
   どうしますか? 以下の選択肢があります:
    Y か I  : パッケージメンテナのバージョンをインストールする
    N か O  : 現在インストールされている自分のバージョンを残す
      D     : 両バージョンの差異を表示する
      Z     : 状況を調査するためにシェルを開始する
 デフォルトでは現在使っている自分のバージョンを残します。
*** sudoers (Y/I/N/O/D/Z) [デフォルト=N] ? y
設定ファイル /etc/sudoers を新規にインストールしています ...

そう、管理者権限を許可されるユーザを設定している sudoers 関連が初期化してしまったのだ。

*****@********:~$ sudo cat /etc/sudoeres
[sudo] password for *****: 
***** は sudoers ファイル内にありません。この事象は記録・報告されます。

どうしよう。

ぐぐる先生にたずねて、gpasswd でユーザを sudo グループに参加させ直せば良いことがわかった。

gpasswd -a ***** sudo

でも、そのためには管理者権限を得なくてはいけない…。

ubuntuはデフォルトでは su でのログインを許していないが、ずっと昔にGUIツールを使う必要があって su できるようにしておいたことを思いだした。あいぽんに入れてある古いメモを引っ張りだして su になり、なんとか修正完了。無事 sudo できるようになった。

めでたしめでたし

Sublime で FTP ができないゾ

sublimetext2こないだから格闘している Sublime Text だが、今度は SFTP プラグインでハマっている。こいつは編集中のファイルをセーブすると、あらかじめ設定した FTP サーバにアップロードしてくれるという、ありがたいものだ。

設定に関してはいろいろなサイトで説明されているので、そちらを参考にしてもらえば良い。

< しかし、こいつがどうやっても Connection Refused ではねられてしまう。接続先の vsftpd のログを読んでもよくわからない。xferlog_std_format = NO にしてみると、ログインには成功して、PASV モードに切り替えたところまでは記録されている。そういえば vsftpd の PASV ってクセがあったことを思い出した。

Sublime のフォーラムにヒントが載っていた。Sublime FTP plugin and Windows Server PASV モードを OFF にした!?

ものは試しでやってみた。大成功!

{
    // The tab key will cycle through the settings when first created
    // Visit http://wbond.net/sublime_packages/sftp/settings for help
    
    // sftp, ftp or ftps
    "type": "ftp",

    "save_before_upload": true,
    "upload_on_save": false,
    "sync_down_on_open": false,
    "sync_skip_deletes": false,
    "sync_same_age": true,
    "confirm_downloads": false,
    "confirm_sync": true,
    "confirm_overwrite_newer": false,
    
    "host": "ホストURL",
    "user": "ログインアカウント",
    "password": "パスワード",
    "port": "21",
    
    "remote_path": "リモートディレクトリ(絶対パス)",
    "ignore_regexes": [
        "\.sublime-(project|workspace)", "sftp-config(-alt\d?)?\.json",
        "sftp-settings\.json", "/venv/", "\.svn/", "\.hg/", "\.git/",
        "\.bzr", "_darcs", "CVS", "\.DS_Store", "Thumbs\.db", "desktop\.ini"
    ],
    //"file_permissions": "664",
    //"dir_permissions": "775",
    
    //"extra_list_connections": 0,

    "connect_timeout": 30,
    //"keepalive": 120,
    "ftp_passive_mode": false,     // <=== ココ
    //"ftp_obey_passive_host": false,
    //"ssh_key_file": "~/.ssh/id_rsa",
    //"sftp_flags": ["-F", "/path/to/ssh_config"],
    
    //"preserve_modification_times": false,
    //"remote_time_offset_in_hours": 0,
    //"remote_encoding": "utf-8",
    //"remote_locale": "C",
    //"allow_config_upload": false,

}


ftp_passive_modefalse にした結果、期待通りの動作をするようになった。ログでは依然として PASV にしているのに、設定上は false にしなければいけないのか、よくわからない。

sublimeで印刷できないゾ

sublimetext2最近お気に入りのテキストエディタは Sublime Text だ。各種プラットフォームに対応しているし、カスタマイズの自由度が高く、体に染み付いている WordStar ダイヤモンドカーソルも使える。そのためには後述のように Keybind / User を書き変えなければならないが。

この Sublime Text だが、デフォルトではプリント機能がない。どうするかというと、標準のプラグイン「Print to HTML」を使い、一旦ブラウザに出力してから、ブラウザの機能でプリントするのだそうだ。

ところがこれを使ってもブラウザに出力されない。Print to HTMLのソースを見ると、

def send_to_browser(html):
    """Create a temp file containing html and open it in the default web browser."""
    tmp_html = tempfile.NamedTemporaryFile(delete=False, suffix='.html')
    tmp_html.write(html)
    tmp_html.close()
    desktop.open(tmp_html.name)

なにやらテンポラリファイルを作っている。さてはと OS の環境変数を見たら、TMPTEMP が作られていなかった。こいつらを適切に設定し、Sublimeを再実行したところ、ちゃんと出力されるようになった。

Default (OSX).sublime-keymap

Sublime をダイヤモンドカーソル風にする定義ファイル。完全互換ではない。

/* diamond cursol definition
 * created by: azira@usagi-goten.com
 */
[
{ "keys": ["ctrl+d"], "command": "move", "args": {"by": "characters", "forward": true} },
{ "keys": ["ctrl+s"], "command": "move", "args": {"by": "characters", "forward": false} },
{ "keys": ["ctrl+e"], "command": "move", "args": {"by": "lines", "forward": false} },
{ "keys": ["ctrl+x"], "command": "move", "args": {"by": "lines", "forward": true} },
{ "keys": ["ctrl+a"], "command": "move", "args": {"by": "subwords", "forward": false} },
{ "keys": ["ctrl+f"], "command": "move", "args": {"by": "subwords", "forward": true} },
{ "keys": ["ctrl+r"], "command": "move", "args": {"by": "pages", "forward": false} },
{ "keys": ["ctrl+c"], "command": "move", "args": {"by": "pages", "forward": true} },

{ "keys": ["ctrl+t"], "command": "delete_word", "args": { "forward": true, "sub_words": true } },
{ "keys": ["ctrl+g"], "command": "right_delete" },
{ "keys": ["ctrl+y"], "command": "cut" },
{ "keys": ["ctrl+j"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} },

{ "keys": ["ctrl+shift+e"], "command": "select_lines", "args": {"forward": false} },
{ "keys": ["ctrl+shift+x"], "command": "select_lines", "args": {"forward": true} },

{ "keys": ["ctrl+q", "ctrl+d"], "command": "move_to", "args": {"to": "eol"} },
{ "keys": ["ctrl+q", "ctrl+s"], "command": "move_to", "args": {"to": "bol"} },
{ "keys": ["ctrl+q", "ctrl+r"], "command": "move_to", "args": {"to": "bof"} },
{ "keys": ["ctrl+q", "ctrl+c"], "command": "move_to", "args": {"to": "eof"} },
{ "keys": ["ctrl+q", "ctrl+e"], "command": "move", "args": {"by": "pages", "forward": false} },
{ "keys": ["ctrl+q", "ctrl+x"], "command": "move", "args": {"by": "pages", "forward": true} },

{ "keys": ["ctrl+q", "ctrl+f"], "command": "show_panel", "args": {"panel": "find"} },
{ "keys": ["ctrl+q", "ctrl+a"], "command": "show_panel", "args": {"panel": "replace"} },
{ "keys": ["ctrl+q", "ctrl+y"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard EOL.sublime-macro"} },

{ "keys": ["super+ctrl+alt+left"], "command": "navigation_history_back"},
{ "keys": ["super+ctrl+alt+right"], "command": "navigation_history_forward"}
]


追記

印刷できない原因だが、どうやら Syntax として PHP を選択した時に起きるようだ。編集中の PHP ファイルの Syntax を他のものにすると、ふつ〜にブラウザで開くことができる。

調べてみると Print to HTML というプラグインが PHP に対応していない という恐ろしい事実が発覚した。警告メッセージくらい出してほしいものだ。

とりあえずは、PHP を印刷するときは一時的に別の Syntax に切り替えるという技を使うことにした。Sublime Text 3 は大丈夫なのかな?

中の人を殺すゾ

mm-blue-w-textとあるドキュメントの翻訳をしている。静的なWebサイトを作成するのに、middleman というツールを使っている。

ビルドが終わると内蔵のWebサーバが起動するので、ブラウザですぐさま結果を確認することができてとても便利だ。しかし、CTRL+C でサーバを落とすことができることになっているのだが、

== The Middleman is standing watch on port 4567
^Clog writing failed. can't be called from trap context
^Clog writing failed. can't be called from trap context
^Clog writing failed. can't be called from trap context

ということになって、ちっとも終了できない。Google先生にお尋ねしたところ、これは MiddlemanのBug であるらしい。

新しいバージョンもでているようだが、バージョンの依存関係がややこしそうなので躊躇してしまう。

しかたがないので、プロセスを殺すことにした。以下がそのスクリプト。

#! /bin/bash
kill -9 `ps ax | grep middleman | grep -v grep | awk '{print $1}'`

ps でプロセスIDを取得して、grepawk で必要なIDだけを抜き取り、kill でシグナルを投げるという、原始的な方法だ。これに適当な名前を付けて、別のターミナルウィンドウから実行すれば、期待通りに死んでくれる。

追記

pkill -9 -f middleman だと、名前指定で殺せた。こんなコマンドしらんがや。

LaTeXのエラーが消えたゾ


とある小冊子を翻訳している。最終形態はPDFにすることだ。もともと英語版のPDF出力用のスクリプトは用意されているので、ちょこっと改造して日本語版を出力できるようにした。

ただ、日本語フォントではイタリックが出力できない。嫌いだけれどMeiryoを使えばボールドは出力できる。ぐぐる先生に教えていただいて、なんとか解決策がありそうなことがわかった。

いきなり本番では致命的なことをやらかしそうなので、テストファイルをLaTeXにかけてみた。

documentclass[letter]{jsarticle}
begin{document}

吾輩は猫である。名前はまだ無い。

どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所で
ニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。

end{document}

ところが、

! LaTeX Error: This file needs format `pLaTeX2e'
               but this is `LaTeX2e'.

というエラーが出てどうにもならない。

まる1日ぐぐる先生と格闘して、ようやく解決策がわかった。ヒントとなったのは「babel のセットアップ」という記事だった。これによると現在のLaTeXでは日本語対策が行われているということだが、拾ってきたのが悪いのか、対策されていない。手動でセットアップを行う必要があった。

まず、locate japanese.ins としてセットアップ用のファイルを探す。このマシンでは、/usr/local/texlive/2013/texmf-dist/source/platex/japanese/ にそれがあった。このディレクトリで、

sudo platex japanese.ins

として、ファイルをコンパイルする。japanese.ldfsample.tex というファイルが出力される。

次に、

sudo mkdir -p /usr/local/texlive/texmf-local/tex/generic/babel/

としてディレクトリを作成する。

ここへ japanese.ldf をコピーする。

sudo cp japanese.ldf /usr/local/texlive/texmf-local/tex/generic/babel/

これで pLaTeX2e に関するエラーがでなくなる。

ああ苦労した。

きんちゃんが見つからないゾ

愛用していたLenovoのタブレットが、おそらく満員電車の圧力に負けて、お亡くなりになってしまわれた。

dead_lenovo

あいぽんでは画面が小さすぎるので、持ち歩き用に7インチほどのタブレットが無いと不便でならない。そこでAmazonのKindle Fire HDX 7に白羽の矢を立てた。サイズもちょうどいいし、お値段もお手頃。画面もキレイと、言うことなしだ。惜しむらくは純粋なAndroidではなく、なんちゃってAndroidだということだが、root化すればなんとかなるだろうと、ワンクリックでお買い物してしまった。ついでにORIGAMIカバーもポチってしまった。

とどいたKindle (きんちゃん) は、なんちゃってな部分を除けば、期待通りのものだった。たんにWebブラウズと読書をするには申し分ない。でも、なんちゃってな部分も予想通り、使えなさすぎる。

ぼちぼちroot化かなと、情報を集めた。USB接続して、adbというツールでファイルを転送してごちょごちょするだけ。これならできそうだ。

ところが、きんちゃんが見つからない。macなのがいけないのか? げげ、このUSBケーブルは充電専用じゃないか。付属のケーブルならきちんとUSB転送ツールが使える。でも、adbで認識しない!

そういうときにはマシンを再起動するのが鉄則なので、macを再起動してみた。OK、今度は見つかった。

adb_detected

これまでのまとめ。

  1. Android開発キットの導入(http://developer.android.com/sdk/)
  2. KindleとUSB転送ケーブルで接続
  3. adb devices で確認(認識しない時は再起動)

お楽しみはこれからだ。

アップデートできないぞ

noroomしばらくぶりにお家のサーバにログインしてみると、アップデートがあるゾというお知らせが出ていたので、何も考えずにアップデートを行った。

おや? エラーが出ている。

dpkg: initramfs-tools の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
以下のパッケージの処理中にエラーが発生しました:
 initramfs-tools
E: Sub-process /usr/bin/dpkg returned an error code (1)

initramfs-toolsのエラーということで、ぐぐる先生に教えを請うと、/bootがあふれてapt-get upgradeが失敗したでござる という記事がヒットした。これだ。

まさにこの記事の通りだった。こんなにもたくさん古いイメージを抱え込んでいた。

$ aptitude search linux-image | grep ^i
i   linux-image-2.6.32-42-generic   - Linux kernel image for version 2.6.32 on x
i   linux-image-3.2.0-29-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-3.2.0-31-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-3.2.0-37-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-3.2.0-40-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-3.2.0-45-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-3.2.0-48-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-3.2.0-52-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-3.2.0-57-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-3.2.0-58-generic    - Linux kernel image for version 3.2.0 on 32
i   linux-image-generic             - Generic Linux kernel image                

sudo apt-get purge linux-image-3.2.0-29-generic という具合に指定して、どんどん消していこう。正規表現が使えるからビルド番号を複数指定できる。

ひとつひとつのイメージは わずか 100MB くらいなのだが、塵も積もればなんとやら。/boot にあまり割り当てていなかったものだからすぐになくなってしまう。

そういえば初めて手にしたハードディスクは 大容量 40MB だったっけ。

WordPressのカテゴリとタグを取り出すゾ

logo-v-rgbWordPressにはカテゴリとタグという概念があり、これを使って投稿を分類分けすることができる。編集画面や一覧画面に行けばこれらを確認したり、変更することができるが、今現在表示されているページのそれを知るのはなかなか難しい。

ということでコマンドラインから覗き見する方法を考えた。

curl -s $1 | grep "<article" | grep -e category-[a-z0-9-]* -e tag-[a-z0-9-]* --color

これを例えば gettag という名前で保存し、chmod +x gettag として実行可能にしておく。その上で、知りたいページのURLを与えてやる。

やってることは単純で、curlコマンドを使って指定されたURLのページ内容をダウンロードし、grepでcategoryとかtagのある行を表示しているだけだ。grepを2回使っているのは、タグクラウドが引っかかるのを防止しているためだ。

$ ./gettag http://www.usagi-goten.com/wordpress/blog/2012/04/24/android-tablet%e3%81%a7%e3%82%82%e3%83%8f%e3%83%9e%e3%82%8b/

するとこのように取得できる。

<article id="post-2030" class="post-2030 post type-post status-publish format-standard hentry category-pc tag-android tag-76">

…と思ったら、日本語で作ったタグ(おそらくはカテゴリも)は、tag-76という具合にIDで表示されてしまう。ダメぢゃん。

今のところ必要なのはアルファベットだけのカテゴリおよびタグだから、これでもいいけど。

OmegaTのgit機能が使えないゾ

OmegaT_logo_smお仕事で英文ドキュメントを翻訳しているのだが、出てくる用語を違った訳にしてしまうという、揺れに悩まされている。「翻訳メモリ」というジャンルのツールを使うと、過去に訳した文を参考に表示してくれるので、この悩みが解決するかもしれない。そこで使えそうなものを探してみたところ、Javaで書かれたOmegaTというのがプラットフォーム非依存で、使えそうだということがわかった。

はじめに通常安定版という2.6.3 update 5をインストールしてみたが、何か微妙な動作をするので、最新の開発評価版3.0.6に変えてみた。こちらは調子よく使える。作業中のドキュメントをOmegaT用に編集しなおした(単に作業済みの部分をコピペしただけ)。

もともとGitHubで公開されているドキュメントなので、自分のリポジトリにfolkして、そこに作業結果をpushしていた。ところがOmegaTを使いはじめると、作業内容が消えたり、コンフリクトしているから保存できないと言われたりでどうにもならない。いじっているうちに、どうやらbranchに対応していないのではないかという疑惑がわいた。

オリジナル(master)から、japaneseというbranchを作り、そこで作業を行っている。

$ git branch
* japanese
  master

ここでOmegaTを起動して、保存したプロジェクトを開く。
その瞬間に

$ git branch
  japanese
* master

という状態になってしまう。編集内容をオリジナル(master)に保存しようとしてしまうのだ。そこにはOmegaTのワーキングディレクトリや、日本語作業用のディレクトリは存在しない。プロジェクトを読み込んだ瞬間に、自分の存在しないmasterの並行宇宙に飛んでいってしまう。

結局、OmegaTのディレクトリを .gitignore に記述して管理下から外し、japaneseブランチへ移行後、編集結果は手作業で翻訳済みディレクトリへコピー、PandocでPDFおよびepub生成という原始的な方法で運用してみることにした。