2013年7月12日金曜日

ec2-ssh に Public DNS 情報のキャッシュ機能を追加 + 紹介記事書いた

Gist で公開されている migrs さん謹製の GitHub Gist - migrs / ec2-ssh (紹介サイトは Amazon EC2 で SSH するなら ec2-ssh が便利 - m.igrs.jp) を Fork して Public DNS 情報のキャッシュ機能を追加した ec2-ssh を作ってみました (こちらも Gist にて公開 してます)。今のところ CentOS 6.4 と Mac OS X 10.8.4 で動作確認してます。

今回会社のエンジニアブログにこのツールの紹介記事を書いてみました。

ツールの紹介と合わせ、ツールを使うのに必要な以下のやり方についてもまとめてあります。

  • AWS IAM ユーザの作成とアクセスキーの発行
  • ec2-api-tools のセットアップ (CentOS 6.4 と Mac OS X 10.8.4 向け)

ここらへん、知ってる人には当たり前かもしれませんが、(私のような) AWS 初心者の方には参考になるかなと。お役に立てば幸いです。

2013年4月23日火曜日

Dropbox を GoogleDrive に放り込んでみた

Dropbox に保存したファイルの全文検索したくて、いいとこ取りして検索機能だけ GoogleDrive 使っちゃおうというお話です。

数年前から Dropbox 愛用してるのですが、全文検索がサクッとできたらいいなぁと思うこと多いんですよね。昔の作業メモでサラッと書いたやつって「どこやったっけ…。なんか書いたんだけどなぁ (´・ω・`)」になるので。

後発の GoogleDrive は Google によるものだけあって検索には優れてるのですが、個人的にはテキスト形式で書きたい技術メモを編集する際に不便[ 1 ]でメインのクラウドストレージにする気にはならず。Evernote も悪くないのでしょうが、テキストを Emacs で編集したくて、Office 系ソフトも必要に応じて使いたい私には上手くフィットせず。

そんな際、友人から 「GoogleDrive の中に Dropbox 入れたらいんじゃね?」 とのアドバイスがありまして。

誰かしらやってないのかと "Dropbox GoogleDrive" で検索してもこの手のネタはあまり出てこないので、手探りながらちょっと試してみました。こちらの記事で

  • やってみてどうだったか
  • 具体的にどう導入してみたか

を紹介してみます。

目次

システムの概要

具体的には以下のように Dropbox を GoogleDrive に放り込んでみました。

ひねりも何もなく、GoogleDrive フォルダに Dropbox フォルダを突っ込んでみたわけです。

Macbook Air 上でファイルを編集する場合はダイレクトに GoogleDrive に (および Dropbox にも) ファイルがアップロードされます。Android で編集する場合は Dropbox を介して一度 Mac にファイルがダウンロードされ、そこから GoogleDrive にファイルがアップロードされます。結果として Mac および Android の両方で GoogleDrive を介して Dropbox 内のファイルを全文検索可能です。

結論 (やってみてどうだったか)

強引なやり方でしたが、とても良い感じです \(^o^)/。特に実現したかった

  • むかし書いたメモや作業ログを Dropbox 内全体から横断的にテキスト検索

についてはバッチリ実現できるので個人的には大満足です。やはり検索は Google 様々ですね。以下検索画面のスクリーンショットですが、GoogleDrive の検索オプションでファイルの種別を選択することもできますし、Google での検索でよく使う、フレーズ検索 ("" で括る)、OR 演算子、除外検索 (キーワードにハイフンを付与) といったものもそのまま使えます (検索オプションは Google ドライブを検索する で紹介されてます)。

なお、日常使う上で多少気にする点もあるはありますがそれは最後に書きます。

Dropbox を GoogleDrive に突っ込む作業も、いろいろ懸念してた割には大した問題もなくさっくりできちゃいました。

Dropbox を GoogleDrive に放り込んだ際の作業ログ

作業前の環境

私が作業した際の作業ログを貼り付けますが、その前に作業時の私の環境を記しておきます。

  • ハードと OS
    • MacBook Air
    • OS X 10.8.3 (Mountain Lion)
  • Dropbox アプリ
    • インストール済み
    • バージョン: 1.6.18 (この記事を書いてる最中に 2.0.6 に更新しましたが特に問題なし)
    • 同期対象フォルダ: /Users/ユーザ名/Dropbox/
    • 使用/全体容量 (概算): 2.4GB/5.0GB
      • デフォルトの容量 2.0GB からカメラアップロードなどで 5.0GB まで拡張してます。
  • GoogleDrive アプリ
    • インストール済み
    • バージョン: 1.8
    • 同期対象フォルダ: /Users/ユーザ名/GoogleDrive/
    • 使用/全体容量 (概算): 0.4GB/5.0GB

GoogleDrive はスプレッドシートなどを少し使っている程度で Dropbox をまるごと入れる空き容量は十分ありましたんで、特にデータ整理はせずに入れちゃってます。今後増えてきたら中身の整理するか有料プランに移行すればいいかと考えました。

作業後のディレクトリ構成

作業後はこんなディレクトリ構成になります。

/Users/ユーザ名/
|
|-- GoogleDrive/
|   |
|   |-- Dropbox/                        # Dropbox の実体をこちらに移動
|   |                                   #   ※ GoogleDrive 以下に入れはしますが、
|   |                                   #      操作は全て Dropbox から行う前提です
|   |
|   `-- GoogleDrive/                    # 元々 GoogleDrive 内にあったオブジェクトは
|                                       # このサブフォルダに移動
|
`-- Dropbox -> GoogleDrive/Dropbox/     # シンボリックリンクに置き換え

特徴としては以下でしょうか。

  • Dropbox フォルダを GoogleDrive フォルダ以下に移動
    • 放り込むという言葉そのまんまですが、これで Dropbox で管理するファイルが常に GoogleDrive にもアップロードされます。このフォルダ以下は Dropbox アプリと GoogleDrive アプリの両者の管理下に置かれますが、とりあえず問題なしです。
  • ホームフォルダ以下に ~/GoogleDrive/Dropbox のシンボリックリンクを作成
    • これは Dropbox の再リンク (全データのダウンロードやり直し) をしたくないためにとった対策です。まあ使い勝手としても、Dropbox 以下のパスがこれまでと変わらなくなりますし。
  • 元々 GoogleDrive 内にあったオブジェクトをサブフォルダの GoogleDrive に移動
    • 必須ではないのですが、GoogleDrive のトップを見た時に Dropbox が埋もれるのが嫌だったのでこういう形に整理しました。

作業時に気をつけた事

  • Dropbox に保管しているデータが消えちゃうと悲しいので、コピーをとっておく

    • 特に Dropbox と GoogleDrive の双方のアプリが競合動作起こしたりする事を恐れたので (結果的には何の問題もありませんでしたが)
  • Dropbox フォルダの移動時にアプリが動いてややこしいことが起こる事態を回避するため、Dropbox アプリは一度削除 → 移動 → 元の場所にシンボリックリンク作成 → Dropbox アプリ再インストール、という多少念のいる手順をとった

    • アプリは削除しましたが、Dropbox のリンクの解除はしてません (※ リンク解除すると Dropbox のサーバからデータを全部再ダウンロードする必要がありそうなため)

実際の導入作業

  • 事前準備

  • GoogleDrive 内の既存のデータを GoogleDrive 内に もう一つ GoogleDrive フォルダを作成 してそこへ移動

    • https://drive.google.com/ にアクセスし、Google アカウントでログイン
    • [マイ ドライブ] を選択し、GoogleDrive フォルダを新規に作成
    • [マイ ドライブ] (トップフォルダ) ですべてのオブジェクトを選択し、GoogleDrive だけチェックを外す
    • [その他]→[移動先...] を選択し、GoogleDrive を移動先に選択して [移動] をクリック
    • 手元の Mac の ~/GoogleDrive 以下も追随してファイル・フォルダが移動されるはずなので完了まで待ち
      • 上手く追随しないようなら GoogleDrive を停止→起動してみること
  • Dropbox フォルダごと GoogleDrive 内にコピー

    $ cd ~/Dropbox
    $ mkdir ~/GoogleDrive/Dropbox/
    $ rsync --delete -avP ./ ~/GoogleDrive/Dropbox/ | tee /tmp/rsync.log
    

    GoogleDrive 以下に Dropbox フォルダがコピーされると、GoogleDrive アプリの方でアップロードが開始されます。アップロード速度は必ずしも速くないですぐには終わりませんが、しばらくはバックグラウンドで動かしておきます。また、対象ファイル数が多い場合に一部アップロードエラーが生じたりしますがとりあえずこのタイミングではスルーで。

  • Dropbox フォルダ内のファイルのチェックサムを取得しておく

    今後の作業時にファイルの欠損や意図しない変更が行われた際にそれを検知できるよう、チェックサムを取得しておく (結果杞憂でしたが)。

    $ cd ~/GoogleDrive/Dropbox
    $ find ./ -type f -print0 | xargs -0 -J % md5 % | tee /tmp/MD5-Dropbox-01.txt
    
  • Dropbox アプリを削除

    • 以降の作業中に Dropbox アプリが動かないようにするのが目的なので、停止しておけば一応 OK。私が作業した際は念のため削除しました。
    • Dropbox のリンクを解除する必要はありません。というかリンク解除するとあとで面倒なのでしないのが吉です。
  • Dropbox アプリ削除後に Dropboxフォルダ内のデータに変化がないことを確認 (これもあくまで念のため)

    $ cd ~/GoogleDrive/Dropbox
    $ find ./ -type f -print0 | xargs -0 -J % md5 % | tee /tmp/MD5-Dropbox-02.txt
    $ diff /tmp/MD5-Dropbox-0{1,2}.txt ; echo $?
    0
    
  • コピー元の Dropbox フォルダを Dropbox_bk にリネーム。最悪の場合のデータ復帰用です。

    $ cd ~/
    $ mv Dropbox Dropbox_bk
    
  • ホームディレクトリに ~/GoogleDrive/Dropbox へのシンボリックリンク作成

    $ cd ~/
    $ ln -s GoogleDrive/Dropbox
    $ ls -l Dropbox
    lrwxr-xr-x  1 user  staff  19 MM DD hh:mm Dropbox@ -> GoogleDrive/Dropbox
    
  • Dropbox アプリを再度インストール

    • 過去にインストールしたのと同様になります。以前と同じアカウントを設定します。
    • 普通にアプリを削除した場合、アカウント情報や同期対象フォルダ情報はどこかに残っているらしく、インストールが完了すると何事もなかったように既存アカウント・フォルダで同期が実施されます。
      • 同期対象フォルダはシンボリックリンクに置き換わってますが、Dropbox アプリ的には問題ない模様
  • Dropbox アプリ再インストール後に Dropbox フォルダ内で意図しないデータ更新が無いことを改めて確認

    $ cd ~/GoogleDrive/Dropbox
    $ find ./ -type f -print0 | xargs -0 -J % md5 % | tee /tmp/MD5-Dropbox-03.txt
    $ diff /tmp/MD5-Dropbox-0{2,3}.txt ; echo $?
    0
    
  • dropbox.com 上からも念のため確認

  • GoogleDrive へのアップロードエラーについて

    • 作業当時 (2013年4月頃) のことですが、GoogleDrive は Dropbox ほどにはファイル同期の仕組みが優れていないらしく、今回のような作業で 1 万程度のファイルのアップロードを一度に実施しようとすると アップロードエラーが生じます。メニューバーの GoogleDrive アイコンをクリックするとエラーの有無と詳細が分かります。
    • この解決方法ですが、とりあえず楽ちんなのは GoogleDrive アプリの再起動 です。何度かやってれば全部アップロードできます。一度大量のアップロードが済んでしまえばそんなにひどい頻度では起こりません。たまに出ることあるのでその際にまたアプリ再起動してあげれば OK です。
  • GoogleDrive へのアップロード待ち

    • ここまでの作業が終われば導入の作業自体は完了です。GoogleDrive での検索など試したいところですが、アップロードが全部終わらないと検索対象も限定されるため、しばし放置して (ときおり必要そうなら GoogleDrive アプリを再起動したりしつつ) データが全部アップロードされるのを待ちます。

検索してみる

  • https://drive.google.com/ にアクセスし、適当なキーワードで検索してみます。

  • テキストのメモだけ検索したい時は、検索窓の をクリックして テキスト ドキュメント を選択すると、テキストデータだけピックアップできます。".txt" 以外の拡張子も引っかかってくるのでファイルの中身を見てる可能性が高いですが、".md" (個人的に GitHub 内で Markdown 書く際に利用) は直接ファイル名で検索しないと引っかかってこないため、テキストのメモは ".txt" で取っとく方が無難なようです。

アップロード動作や検索インデックスの更新についてテスト

Mac 上でのファイル更新テスト

Mac 上で Dropbox 内 (= GoogleDrive 内) のファイルを更新してみます。Dropbox と GoogleDrive の両アプリのアイコンを見てるとそれぞれ更新後 10 秒以内ぐらいにアップロードを実施してくれてるのが確認できます (Dropbox の方が反応は早いですね)。

Android で作成したファイルのアップロードテスト

Android の Dropbox アプリで何かしらファイルを作成してみます。以下のような動きになることが確認できます。

  1. Android の Dropbox アプリでファイルを作成すると、当該ファイルが Dropbox サイトにアップロードされる
  2. Mac 上の Dropbox アプリが、Dropbox サイトから Dropbox フォルダにファイルをダウンロード
  3. Mac 上の GoogleDrive アプリが当該ファイルを GoogleDrive サイトにアップロード
  4. GoogleDrive 上で当該ファイルについて検索可能に

検索インデックスの更新

気になったので GoogleDrive 側の検索インデックスの更新タイミングを確認してみました。

  • 新規ファイルをアップロードした場合

    • ほぼリアルタイムでファイルの内容を検索可能です
  • 既存ファイルを更新した場合

    • 更新 (GoogleDrive へアップロード) から 10 分程度 (遅くとも 1 時間後には)、更新後のファイルの内容で検索可能

元々の要望が むかーし書いたメモを検索したい なので、更新の場合でもこの程度のタイムラグなら気にならないレベルかなと。

気になる点

強引な手段で Dropbox の内容を Google 検索できるようにしたので少し気になる点はあります。

  • キャッシュファイルも検索インデックスに載ってしまう

    • Android などで Dropbox にファイルをアップロードした場合、Mac に更新ファイルがダウンロードされる際にキャッシュファイルが Dropbox/.dropbox.cache/ 以下に作成されます。なお、Mac 上で直接ファイルを編集する場合は作成されないようです。
    • Dropbox フォルダは GoogleDrive フォルダに入ってますんで、キャッシュファイルも検索インデックスに載っちゃいます。
    • キャッシュファイルを消さないでいると、こういう悲しいことになります…。
    • キャッシュファイルは削除してしまえばすぐに検索インデックスから消えてくれます。直接削除しても良いですが、下記のよいなキャッシュクリーナツールもあるようです。
  • GoogleDrive アプリの同期性能がイマイチ

    • ときたま同期に失敗するようです。アプリを再起動すればちゃんと同期しなおしてくれるんですけどね。

まとめ

長くなってしまいましたが、要するに

  • Dropbox フォルダを GoogleDrive フォルダに放り込んだら、ちゃんと Google で全文検索できるようになりました

でした。まあいろいろ「あー使いたい。こー使いたい」とワガママ言ってるのでこういう工夫しなきゃいけないんですけどね。

クラウドサービスを手掛けてる会社同士の買収なども盛んなようですし、そのうち良い感じのサービスが出てきそうなんですけどね。あんまりガラパゴスなことをしたいわけじゃないので、情報収集とサービス試用は怠らないようにしないとですね。

なにか良さ気なものを見つけたらまたそのうち紹介します。


  1. 「はじめから GoogleDrive 使えばいんじゃね?」というご意見に対しての補足。個人的に一番不便なのは、スマホから GoogleDrive アプリでテキストファイルの編集・保存ができない事です。GoogleDrive アプリの思想的にはテキスト情報いじりたければ Google ドキュメント形式を使って欲しいみたいです。ただしこの Google ドキュメント形式は GoogleDrive アプリをインストールした PC ローカルにはドキュメントの URL 書いた ".gdoc" 拡張子のファイルが置かれるだけで、PC ローカルで Emacs でファイル編集とかできません。スマホの GoogleDrive アプリも Dropbox みたいにテキストファイルの編集・保存を他のアプリとシームレスにやり取りしてくれれば良いんですけどね。そんなわけで GoogleDrive の検索機能だけ使わせてもらいたくなったわけです []

2013年3月27日水曜日

Zabbix Sender に関する記事を書いてみました

前職、現職と統合監視ツールとして Zabbix にお世話になってるのですが、今回会社のエンジニアブログに Zabbix Sender の使い方に関する記事を書いてみましたのでご紹介です。

前置きとして Zabbix Sender と、似たような用途に使える UserParameter との違いをまとめてあり、「どっち使うのが良いのかな?」って時の参考になるかなと。具体例として Zabbix Sender による日次バックアップ処理監視用のテンプレートのサンプルも置いてあります。ご興味あれば是非ご覧ください。

2013年3月10日日曜日

Markdown 記法を他の軽量マークアップ言語と見比べてみた

以前に書いた Markdown の良さについて考えてみた の中で

  • 整形済みテキスト (pre)、リスト (ul,ol,li)、強調表現 (em)、コード (code) などの表現に関して Markdown は少ない文字列でスッキリ書ける ようになっており、RD、Textile、Pukiwiki、Trac Wiki に比べてプレーンテキストとしては読みやすいです。

と述べましたが、せっかく調べたので各種記法の具体例を列挙し、個人的な感想をば。

目次

記法に関して参考にしたサイト

Markdown

# Title

## Subtitle

- list1
    - list2

      リスト内にパラグラフを記載する場合はこんな感じ

    - list3 (行を空けて記載可能)

番号付きリストは以下のように記載

1. numlist1
2. numlist2

*強調表現はこんな感じ* [リンクはこのように](http://moya-notes.blogspot.jp/)

    整形済みテキストは半角空白 4 つ分のインデントで記載します。
    #!/bin/perl
    print ”Hello World!!¥n”;

HTML を使いたい場合は <sup>上付き文字はこんな感じ</sup> で普通に HTML を書いてしまって OK

テーブル書きたい時も普通に HTML で

<table border=1 align="center">
  <tr>
    <th>言語</th><th>特徴</th>
  </tr>
  <tr>
    <td>Markdown</td><td>プレーンテキスト読みやすい他</td>
  </tr>
  <tr>
    <td> : </td><td> : </td>
  </tr>
</table>
  • 感想
    • 強調表現やリンクに関して 少ない文字数 (たいてい1文字) の記号で括って表現 できるようになってることもあり、プレーンテキストとしても見やすいですね。
    • ざざっとメモを書いてるとリスト内にパラグラフ書きたいことが多いのですが、Markdown はそこら辺かなり自由に書いても Syntax Error にならないので楽です。空行を入れて OK なのもプレーンテキストとしての見やすさ向上に寄与してる気がします。
    • メモを元に記事やドキュメントを書く際、フォーマットを直したりするのを結構面倒に感じてた身としては、Markdown を使うと 1) メモの段階では Markdown 記法だけで十分、 2) 記事やドキュメントにする際、必要であれば HTML をそのまま埋め込めば良い、ができるのは良いですね。オーバーヘッド的作業が減るためかなり快適です。

RD (Ruby)

=begin
= Title

== Subtitle

* list1
  * list2

    リスト内にパラグラフを記載する場合はこんな感じ

  * list3 (行を空けて記載可能)

番号付きリストは以下のように記載

(1) numlist1
(2) numlist2

((*強調表現はこんな感じ*)) ((<リンクはこのように|URL:http://moya-notes.blogspot.jp/>))

 整形済みテキストは半角空白 1 つ分のインデントで記載します。
 #!/bin/perl
 print ”Hello World!!¥n”;
=end

=begin html
<p>
HTML を書く場合は begin, end で別途括り直す必要があります。
これで括られた部分は純粋に HTML の表記法が有効になります。
</p>

<table border=1 align="center">
  <tr>
    <th>言語</th><th>特徴</th>
  </tr>
  <tr>
    <td>Markdown</td><td>プレーンテキスト読みやすい他</td>
  </tr>
  <tr>
    <td> : </td><td> : </td>
  </tr>
</table>
=end
  • 感想
    • HTML に比べればかなりシンプルには書けるのですが、強調表現にせよリンクにせよ Markdown に比べると「もさっ」とする印象です。
    • Markdown 同様、リストの項目にパラグラフを書けたり、空行を入れられたりする点は良いですね。
    • HTML を表現できなくはないのですが、 =begin, =end という大枠の部分で再度くくり直す必要があるなど、Markdown に比べるとシームレスさでは劣るかなと。

Textile (Redmine)

h1. Title

h2. Subtitle

* list1
** list2

   リスト以下にパラグラフの記載も可能

   改行も OK
** list3 (続き物のリストにするなら直前の行との間に空行は入れちゃダメ)

番号付きリストは以下のように記載

# numlist1
# numlist2

*強調表現はこんな感じ* "リンクはこのように":http://moya-notes.blogspot.jp/

<pre>
整形済みテキストは pre タグで括ります。
#!/bin/perl
print ”Hello World!!¥n”;
</pre>

HTML の直書きは不可 ("<" や ">" は自動的に "&amp;lt;", "&amp;gt;" に変換され、HTML タグとは認識されない)

テーブル書きたい時は textile 記法で記載。

|_.言語|_.特徴|
|Markdown|プレーンテキストが読みやすい他|
|:|:|
  • 感想
    • 本来は Redmine におけるプロジェクト管理のためのチケットやドキュエント書きが目的のもので、チケット・ドキュメント・Wikiへのリンクが簡単に書ける点が特徴なのですが、ここでは独立したメモやドキュメント書きに使う事を前提にします。
    • Markdown とは異なりますが、多くの表現が 少ない文字数 (たいてい1文字) の記号で括ること で実現できます。スッキリしてて良いです。
    • テーブルに関しても "|" で区切るシンプルな書き方ができます。プレーンテキストとしても見やすいですね。
    • 基本的にシンプルで良いだけに、見出しの表記が hX. だったり整形済みテキストに <pre> を使ったり (原則 HTML タグは使えないのに) という点がメモとして見た際には違和感を感じますね。
    • リスト内のパラグラフの記載時、空行を入れていい場所と悪い場所があるのは気になってます。かなりマイナーなケチですが、以前 Redmine を使ってた際に調整が結構面倒だったので…。

Pukiwiki

*Title

**Subtitle

- list1
-- list2 (リスト内にパラグラフの記載は不可)
-- list3 (続き物のリストにするなら直前の行との間に空行は入れられない)

番号付きリストは以下のように記載

+ numlist1
+ numlist2

''強調表現はこんな感じ'' [[リンクはこのように:http://moya-notes.blogspot.jp/]]

 整形済みテキストは半角空白 1 文字分インデントします。
 #!/bin/perl
 print ”Hello World!!\n”;

HTML の直書きは不可 ("<" や ">" は自動的に "&amp;lt;", "&amp;gt;" に変換され、HTML タグとは認識されない)

テーブル書きたい時は Pukiwiki 記法で記載。

|~言語|~特徴|
|Markdown|プレーンテキストが読みやすい他|
|:|:|
  • 感想
    • Wiki を利用する際のメリットでもある、Wiki Name でのシンプルなリンク記述についてはここでは割愛します。
    • もちろん HTML 書くよりは全然いいのですが、Markdown や Textile と比べると強調表現やリンクの表現で「もさっ」と感がありますかね。
    • テーブルに関しては Textile 同様いいですね。
    • リスト内にパラグラフの記載ができなかったり空行を入れられないのは個人的にはデメリット大きいです。こういうふうに書きたいこと多くて、書けないと結構なストレス…。

Trac Wiki

= Title =

== Subtitle ==

 * list1 (半角空白 1 文字以上のインデントが必要)
   * list2 (リスト内にパラグラフの記載は不可)
   * list3 (続き物のリストにするなら直前の行との間に空行は入れられない)

番号付きリストは以下のように記載

 1. numlist1 (半角空白 1 文字以上のインデントが必要)
 2. numlist2

'''強調表現はこんな感じ''' [http://moya-notes.blogspot.jp/ リンクはこのように]

{{{
整形済みテキストは {{{ と }}} で括ります。
#!/bin/perl
print ”Hello World!!\n”;
}}}

HTML の直書きは不可 ("<" や ">" は自動的に "&amp;lt;", "&amp;gt;" に変換され、HTML タグとは認識されない)

テーブル書きたい時は Trac Wiki 記法で記載。

||言語||特徴||
||Markdown||プレーンテキストが読みやすい他||
||:||:||
  • 感想
    • Trac Wiki を利用する際のメリットである、チケットやレポートへのシンプルなリンク記述などについてはここでは割愛します。
    • Markdown や Textile と比べると強調表現やリンクの表現で「もさっ」と感が強いですね。
      • テーブルに関しても、 | で良さそうなんですが || なんですね…。
    • リスト内にパラグラフの記載ができない点、空行が入れられない点は Pukiwiki 同様に個人的にはデメリット大きいです。
    • リストの記載時に半角空白 1 文字以上インデントが必要といった微妙な縛りがある点も、メモ書きに使う上では嫌かも…。

まとめ

以上 Markdown を中心に据えつつ、いくつかの軽量マークアップ言語の具体例の紹介とその感想でした。メモ書きとしてはやっぱり Markdown は見やすくて/書きやすくて良いな、が私的結論ですね。テーブルの記法ぐらいはあっていいのかもと思う反面、あっても実際に使うかどうかは微妙です(編集が手間なのでリストで書いちゃう気もします)。

なお、そもそも Textile、Pukiwiki、Trac Wiki に関しては個別的なメモをとるためのものじゃないよね、というツッコミはその通りだと思いますし、私の個人的な利用を想定した比較であることと、選抜した言語も私がこれまで触ったことがあるもののみってのは公平さに欠けてます。ですが、実際に具体例を上げて「メモ書きとしてはどの言語が良さ気よ?」って記事って意外に少ないようなので、そういう要望がある方には多少のお役に立てるのかなと書いてみました。

本記事は Markdown の記法にフォーカスを当てたものですが、他に以下の点が気になる方は以前の記事 Markdown の良さについて考えてみた を参照下さい。

  • Markdown って広く利用されてる?
  • HTML への変換ツールはどこで提供されてる?

2013年3月2日土曜日

Markdown の良さについて考えてみた

先日「HTML に変換できる軽量マークアップ言語で良さ気なの知ってる?」的な質問されたので Markdown を勧めようと思ったのだけど、どういった点でオススメすればいいのか頭の中でまとまってなかったのでまとめついでにブログに書いてみようかと。

ちなみに私自身の Markdown 歴は半年ほど。GitHub を使い始めたタイミングで Markdown 記法を覚えました。使ってみると快適だったので、今やテキストはほとんど Markdown で書いてます。

追記: 実際に Markdown 他いくつかの軽量マークアップ言語でメモを書くとどんな感じになるか、別記事 Markdown 記法を他の軽量マークアップ言語と見比べてみた にまとめました。

Markdown ってどんな軽量マークアップ言語?

Markdown についてはググればいろいろ出てくるので詳しい事はそちらに見てもらう事として、個人的な印象をまとめると以下の通り。

  • 結構広く利用されてるっぽい
  • 記法がシンプルでプレーンテキストとしても読みやすい
  • HTML 文書に変換する Perl スクリプトを利用可能

それぞれもうちょっと詳しく説明してみます。

どんなところで使われてる?

結構あちこちで採用されてますし、専用エディタも存在していることから、軽量マークアップ言語としては結構普及しているものなのかなという印象です。

採用例については Markdown - ウィキペディアの利用例の項目 が詳しいです。

記法の特徴と雑感

これまで軽量マークアップ言語としては

を使ってきた経験がありますが、それらと比較して Markdown の良いところは以下かなと思います。ただ「読みやすさ」などは個人の趣味や慣れに依存する部分も大きいため、その点はご留意のほどを。

  • 記法がシンプルでプレーンテキストとしても読みやすい
    • プレーンテキストの状態での読みやすさをかなり意識して作っている印象で、記法もシンプルになってます。
    • 整形済みテキスト (pre)、リスト (ul,ol,li)、強調表現 (em)、コード (code) などの表現に関して Markdown は少ない文字列でスッキリ書けるようになっており、RD、Textile、Pukiwiki、Trac Wiki に比べてプレーンテキストとしては読みやすいです。
    • 別記事 Markdown 記法を他の軽量マークアップ言語と見比べてみた で実際に例を挙げて比較してます。
  • HTML タグ自体をそのまま埋める事ができる
    • Markdown は記法がシンプルな分、table などのタグについては独自に表現する記法を持ちません。その代わり HTML タグを挿入すれば、HTML へ変換した際にそのまま反映されます(例: <b>&lt;b&gt に変換しません)。
      • <b>&lt;b&gt のようにしたい場合は code タグ表現にすればよく、Markdown においてはバックスラッシュで括る事で表現できます。
    • このようなルールとなっている理由は Markdown: Syntax - Inline HTML (日本語訳) で述べられています。以下に一部抜粋します。割り切りが良くて初めて読んだ時は目からウロコでした。
      • MarkdownはHTMLタグの代わりにならないし、HTMLタグで表現できるレベルにも達してない
      • Markdownのルールのコンセプトは原文のままで読みやすく、書きやすく、編集できること
      • HTMLタグルールはホームページを作成するためのルール、Markdownは書きやすくするためのルール
    • どうしたって軽量マークアップ言語で HTML を全部表現するのは無理なので、プレーンテキストとして読みやすくできる範囲では独自の記法を持つけど、複雑な表現について独自記法で無理はせずに「HTML タグをそのまま埋め込めばOK」にしているようです。これにより、Markdown 記法の複雑化を回避しながら、HTML の機能もフル活用できるようになっているわけですね。
    • 上に挙げた他の言語だと、そもそも HTML タグをそのまま使用できないか、もしくはブロック単位で「この範囲内は HTML で書く」と明示的に指定するマーカを記載する必要があります。
  • もちろん一般的な(?)軽量マークアップ言語としての基本的な記法は揃ってる
    • 見出し, 引用, リスト, コード, リンク, 強調, 画像といった基本的な記法はちゃんとあり、個人的には必要十分です。

個人的に不満なところは無いですが、前述の通り tableを表現する独自の記法はない ので、 table を表現したければ直に HTML を書く必要があります。他の軽量マークアップ言語で table を表現する記法を多用している方はちょっとなぁ、かもしれません。また、HTML タグをそのまま埋めれる事をメリットとして挙げましたが、逆から見ると HTML タグについての知識が必要 とも言えます。これも人によってはデメリットになるかもしれませんね。

文法の詳細について知りたい方はこちらをどうぞ。

HTML への変換ツール

HTML への変換ツールは Markdown の本家サイトで配布されています。

1500 行程度の Perl スクリプトで特殊なライブラリに依存してもいないようなので、Perl が動く環境であればスタンドアロンで動くようです。私の手元の環境 (Mac OS X および Windows XP + DWIM Perl) でも簡単に動きました。使い方は以下の通り。

$ perl markdown.pl [Markdown書式のテキスト]

標準出力に HTML に変換されたテキストが表示されます。ただし、<body><head> タグは挿入されないので、そこは利用者の方で適宜用意してねというスタイルのようです。

私は Emacs で Markdown テキストを編集しているのですが、Emacs の markdown-mode を利用することで

  1. Emacs の markdown-mode が提供する markdown-export 関数を利用
  2. markdown-export 関数により、<head><body>タグを挿入した HTML を出力

するようにしています。具体的な設定を知りたい方は 以前の Emacs 記事 を参照下さい。

ちなみにこの記事も元は Markdown のテキストです。上記 Emacs で HTML に変換した後、一部のタグを sed で置換して後、Blogger の編集画面に貼り付けてます。前述の通り Markdown は HTML もそのまま貼り付けられるので、画像関連のタグについても一旦 Blogger 側で生成した後、その部分を元の Markdown のテキストファイルに戻してます。こうすることでブログの文章の管理は手元の Markdown のテキストファイルに一元化できるので助かってます。

まとめ

以上、自分なりに Markdown のオススメなところを簡単にまとめてみました。何かしらの文章を書くことを生業や趣味にしている人にとって、気持よく文章を書き込める/読める環境は大切ですよね。文章の記法も合うものが見つかると結構快適になれるのかなと思ってます。たかがメモ書き、されどメモ書きかなと思いますので、皆さんも是非自分に合う軽量マークアップ言語を探してみてはいかがでしょうか?

2013年2月26日火曜日

Ruby 手抜きレシピ: CSV ファイルの結合

先日 Ruby 2.0 がリリース されましたね。しばらく Ruby はレガシーな使い方しかしてないものの、キーワード引数やデフォルトUTF-8エンコーディングなど便利そうな機能も多く楽しみです。

さて、今回は 2 つの CSV ファイルを結合する手抜きのサンプルスクリプトのご紹介。ある日友人から

  • Windows 環境で
  • 2つの CSV ファイルを横に連結したく
  • たまたまその環境で動くのが Ruby だったので Ruby で処理できるといいな (その友人は数値処理系のプログラムはガシガシ書けるけど Ruby はあまり触ったことない)

という相談を受け、ちょろっと書いてみたスクリプトが以下になります (ダウンロード)。

#!/usr/bin/ruby
########################################
#### Settings
DELIM=","

########################################
#### Main Program

if ARGV.size < 3
  print <<-"EOH"

    USAGE: ruby #{$0} <IN-FILE1> <IN-FILE2> <OUT-FILE>

EOH
  exit 1
end

in1, in2, out = ARGV[0..2]

in1lines = File.open(in1).read.split("\n")
in2lines = File.open(in2).read.split("\n")
out_io   = File.open(out, "w")

in1size = in1lines.size
in2size = in2lines.size

line_num = in1size > in2size ? in1size : in2size

for n in 1..line_num
  in1dat = in1lines[n-1] ||= ""
  in2dat = in2lines[n-1] ||= ""
  out_io.puts in1dat + DELIM + in2dat
end

out_io.close

何をするかというと、以下のような 2 つの CSV ファイルがある時に、

$ cat file1.csv
1,2,3
4,5,6
7,8,9

$ cat file2.csv
A,B,C
D,E,F
G,H,I

こんなふうに連結しますよというもの。

$ ruby join_csv.rb file1.csv file2.csv out.csv
$ cat out.csv

1,2,3,A,B,C
4,5,6,D,E,F
7,8,9,G,H,I

お気づきの方はお気づきの通り 「それ paste(1) コマンドでできますやん」ということで全くその通りですw。paste コマンドだと以下の使い方で OK ですね。

$ paste -d, file1.csv file2.csv > out.csv

まあ、今回はたまたま Windows 上でやりたかったということで無意味ではなかったのかなと… (汗)

上記スクリプトは行数を圧縮したくて Ruby 特有の記法で書いてる部分もありますので、もうちょっと平易に書いたものも載せておきます。(ダウンロード

#!/usr/bin/ruby
########################################
#### Settings
DELIM=","

########################################
#### Main Program

if ARGV.size < 3
  print <<-"EOH"

    USAGE: ruby #{$0} <IN-FILE1> <IN-FILE2> <OUT-FILE>

EOH
  exit 1
end

in1 = ARGV[0]
in2 = ARGV[1]
out = ARGV[2]

in1lines = File.open(in1).read.split("\n")
in2lines = File.open(in2).read.split("\n")
out_io   = File.open(out, "w")

in1size = in1lines.size
in2size = in2lines.size

if in1size > in2size
  line_num = in1size
else
  line_num = in2size
end

for n in 1..line_num
  in1dat = in1lines[n-1]
  unless in1dat 
    in1dat = ""
  end

  in2dat = in2lines[n-1]
  unless in2dat 
    in2dat = ""
  end

  out_io.puts in1dat + DELIM + in2dat
end

out_io.close

"Ruby CSV 結合" でググると CSV クラス の話などは出てくるのですが、意外に今回のような要望にヒットする記事がないもんだなぁと思い、枯れ木も山のなんとやらで書いてみました。

このレベルのスクリプトはちょこちょこ書いてるものの、プログラミングに関する知識やコーディングの考え方など、ニュース追っててもピンと来ないものも多く、まだまだ時代に追いつけてないなぁと実感します。そっち方面ももっと勉強しないといけませんが、まあそのうち…。

2013年2月15日金曜日

デブサミ 2013 Action! に参加してきました

Developers Summit 2013 Action! に行ってきました。平日2日間丸々はちょい厳しかったので、2日目のみ参加。主にインフラなど普段の仕事と多少は関係のある講演を聞いてきました。この手の IT エンジニア系のイベントは、学生の時に (全然情報系の研究室とかではなかったんだけど) Internet Week とかに行って以来だったのでかなり久しぶりでしたね。

会場の様子とかとか

入り口はこんな様子。結構盛況でしたね。写真はまだ空いてる状態の様子。休憩(=移動)時間は通路はかなり混んでました。

5 会場で並行して講演が行われてました。そりゃ混むよねぇ、と。

講演: AmazonのDevOpsを支えるAWSクラウド

一つ目に聞いたのは AWS エバンジェリストの堀内さんの講演。エバンジェリストって「伝道師」な意味だったんですね(いまさら)。ちなみに堀内さんって同い年なのか…(遠い目)。

オートスケールなど AWS の特徴の紹介は、まあそれ自体は結構あちこちで見る話ではあって、「ふむふむ」という感じでした。

お、と思ったのは以下のフレーズでしたね (多少私の脳内で変換されてるかもですが) 。

  • これまではハードウェア単位であったコストが、クラウドの世界では CPU, メモリ, ストレージ, 通信料それぞれがコストの最小単位に (コントローラブル話)
  • 障害を例外として扱わず、最初から組み込む (レジリエント話)
  • どこまでもスケールできる設計を心がける (アダプティブ話)

これまではハードウェアの物理制約もあって考えてもしょうがなかった (途中で思考を止めてよかった or 思考を続けてもあまり意味なかった) 事が意味を持つようになってるんですね。なんでも AWS に乗っければ良いわけではないんでしょうが、サーバ・ネットワークの物理的制約がほぼ無い世界も存在することを頭の片隅には常に入れておかないと、エンジニアとして明後日の方向に行っちゃいそうだなと…。

それと、当日 AWS のアカウント作った人には (既にある人は Amazon Web Services クラウドデザインパターン実装ガイド を購入すると)、堀内さんから $25 のクーポンプレゼントというありがたい特典付きでした。そのうち作っていろいろやってみたいなぁ、と思ってたので渡りに船とばかりにアカウント作ってクーポン頂きました(ありがたや)。

講演: Opsから挑むDevOps

株式会社エクシードの千葉則行さんの講演でした。

聞いてて印象に残ったのは、定例作業を効率化する Chef と非定例作業を効率的に行う Mcollective を組み合わせた cloudrop の紹介と、DevOps のあり方についてでした。

cloudrop ではポータルから RESTful API で指示を出し、裏側では Mcollective と Chef-solo が動作して各サーバのセットアップが行われるようです。

cloudrop については上記サイトの紹介ページでいろいろ紹介されていますが、ちょっと気になった点は講演の後でブースで伺いました。

  • 各サーバに Croudrop Agent を入れる必要がある
  • サーバ上で Ruby が動く必要がある
  • "タスク" にはコマンドでできることであればなんでも実現できるそうなので、テストも組み込むことが可能

普段運用していて、知見やノウハウといったものを上手く組み込めるフレームワークはないかなぁ、などと考えるわけですが、cloudrop の話を聞いてまだピンと来てないのは、何が自動化されるべきなのかまだ私自身の中で整理できてないんでしょうねぇ。一度ちゃんと考えたほうがいいのかも…。

もう一つは DevOps のあり方について。千葉さんの仰ってた「結局のところ、サービスだと思う」は正にその通りなのかなと。部署間や社内でどうこうじゃなくて、利用者に提供するサービスにとってどうなのか、を意識して、すべきことをするようにしていくと、自然と開発者と運用者が協力する体制になっていくんじゃないかなと思いますね。

講演: SSL証明書を正しく理解する - 技術仕様の解説と次世代暗号アルゴリズム

日本ベリサイン株式会社の加藤雅史さんの講演でした。"デブサミ" なので講演も Developer 向けが多いなか「今回の話は浮くかも」と前置きしてましたが、個人的には身近な話題なので面白かったです。

お話は前半はシーザー暗号、共通暗号方式、公開暗号方式、RSA暗号といった暗号化の基礎、後半は暗号化方式の今後について。後半の話を抜粋すると以下の様な感じ。

  • RSA 1024 は 2020 年にはスパコンで一年間計算すれば解読できるようになる
  • 現在は RSA 2048 が主流に
  • 今後はコンピュータの高速化に伴い RSA 4096 などになっていく…、としたいところだが、鍵長を長くするとWeb サーバの負荷も飛躍的に増加し、現実的な処理能力を超えてしまうことが懸念される
  • 今後は鍵長が短く暗号強度が高い楕円曲線暗号 (Elliptic Curve Cryptography: ECC) への移る傾向にある
  • ECC 256 と RSA 2048 (ECC の方が1万倍解読は困難とのこと) でも、ECC の方が負荷が少なく、高いパフォーマンスが出る
  • ただし、ECC に対応できないクライアント端末もまだ多い。ガラケーとか確実に無理な上、PC ブラウザにしても、IE 6 以前は対応してなかったり、XP の Chrome が対応してなかったり
  • 現実的な移行の方策が ECC と RSA のハイブリッド構成で、クライアントの対応状況に応じて ECC と RSA を使い分ける
  • もちろんサーバ側の対応も必要。Apache は対応しているけど IIS は未対応

こんなもんですかね。タイムリーに以下のニュースが流れてましたね。

ECC 256 と RSA 2048 の両暗号アルゴリズムに対応した「マルチアルゴリズムSSLサーバー証明書」として提供するそうで。対応、必要だなぁ…。

その他

聞く講演はあまり詰め込まず、空き時間はラウンジでこの記事を書いたりしてました。電源・ネットワーク・椅子・デスク・ドリンクのある環境のなんとありがたいこと…。混む時は混んでましたが、座れないことはなかったです。ちょうど良い感じの数が用意されてたのかなと。

おまけですが、こんなオライリー缶バッチのガチャが…。面白そうで買おうか迷いましたが止めときました ^^;


おまけその弐。入り口で受付したらこんなものも…。Cloudn て…。

おわりに

以上、久しぶりのイベント参加でしたがいろいろ知ることもあり面白かったです。また時間を作ってこの手のイベントには参加するようにしたいですね。

2013年2月3日日曜日

Emacs 設定いろいろ [Emacs24 (Cocoa Emacs) on Mac OS X]

年が明けたかと思っていたら、気がつけば 1 月が終わってしまいましたね。

久しぶりの投稿ですが、今回は Emacs ネタで。

Emacs に触り始めたのはもう 10 年以上前でしょうか。当時は Emacs20 とか 21 ぐらいでしたかね。古いバージョンのまま 6,7 年ぐらい使っていましたが、学生から社会人になったり環境が変わったりで 1 年ぐらい触る機会なくなってたのが、個人で自宅用に MacBook Air 買ったのキッカケでまたメインのエディタとして使うようになりました。慣れもあるのでしょうがやはり使いやすいですね。

現在使ってるのは Emacs24 (Cocoa Emacs) で最近バージョン 24.2 に更新しました。久しぶりだったこともあって設定を見なおしたり評判のいい機能を探して導入したりしました。ファンも未だに多いせいか、いろいろ進化してますね。ありがたいです。

せっかくなので「あ、これ便利」と思ってる機能など、自分への備忘録も兼ねて設定とともにご紹介でもしてみようかと思った次第です。

Index

環境およびインストールについて

Emacs および周辺環境は以下の通り。

  • Hardware: MacBook Air
  • OS: Mac OS X 1.8.2 (Mountain Lion)
  • Emacs: Cocoa Emacs v24.2
  • IME: Google 日本語入力
  • Browser: Google Chrome

インストール方法はググればあちこちに有用なドキュメントは出てくると思いますのでざっくり書きます。

  • Xcode (+ Command Line Tools) をインストール
  • Homebrew をインストール (https://github.com/mxcl/homebrew/wiki/installation)
  • Emacs 本体は brew install emacs --cocoa でさっくりとインストール
  • 適宜必要なシンボリックリンク張って、/Applications/Emacs.app で Emacs 起動できるようにする

まあこんなとこですかね。

ちなみに以降で説明する設定は全部 ~/.emacs.d/init.el に記載しているものです (むかーしは ~/.emacs に書いてたなぁ…)。

Emacs Lisp パッケージ管理

Emacs 用の各種 Lisp がパッケージ管理されるというありがたい機能。Emacs 24 から利用可能になったものですね。以下の設定は Emacs24 のインストールと新機能 : 紹介マニア で紹介されてたものを丸コピです。

M-x list-packages すると 1000 以上のパッケージリストが取得できます。h でヘルプが表示されますが、基本は i でインストールマーカを付けて x でインストールです。さらにありがたいのは各種 Emacs Lisp バージョンアップに伴うアップデートが楽ちんなところですね。久しぶりに M-x list-packages すると更新可能なパッケージが提案されますので U を押すとそれらのパッケージにインストールマーカが付き、後は x だけ。これで最新版のインストールと旧版のアンインストールをサクッとやってくれます。Emacs Lisp ファイルの更新って手動だとなかなかやらず、せっかくのバージョンアップのご利益を享受しそびれがちだったので助かりますね。

ちなみにこれで管理されてる Lisp ファイルは ~/.emacs.d/elpa/ 以下に置かれてるようです。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [PKG管理] パッケージ取得先追加
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

背景色と透過と設定 (複数フレーム対応)

make-frame-command (ショートカットキー: C-x 5 2) による新規フレーム作成時にも適用される、背景色と透過の設定になります。

Emacs の背景透過の設定とか検索すると色々出てくるのですが、複数フレームに対応したものになかなかヒットせず、"default-frame-alist alpha" あたりで検索してやっとお目当てのサイトが見つかりました。

私の場合 Emacs はメモ・ドキュメント書き・ファイル操作・メール草稿など多用途に使っているため基本起動しっぱなし&常に複数フレームを開いてる状態なので、下記のような複数フレーム対応の設定は重宝してます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [基本] 背景色・透過
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 背景色設定
(custom-set-faces
 '(default ((t (:background "#000022" :foreground "#EEEEEE"))))
 '(cursor (
           (((class color) (background dark )) (:background "#00AA00"))
           (((class color) (background light)) (:background "#999999"))
           (t ())
           )))
;; フレーム透過設定
(add-to-list 'default-frame-alist '(alpha . (0.75 0.75)))

Markdown 編集用・その一 (markdown-mode)

GitHub を使い始めた際に Markdown 記法を知りましたが、その後すっかりハマってしまい、何か事情がない限りテキストは常にこの記法で書くようになってしまいました。マーカとして使うものがシンプルで大抵はそれで用が足りますし、HTML へのコンバータも用意されてますし、いざ表とか必要な場合は HTML で直書きもできるとこが良いですね。

…というわけで Emacs にも markdown-mode がありまして重宝しております。前述しました list-package からパッケージインストールできます。

また Mac だと Homebrew 使って brew install markdown で markdown の HTML へのコンバータ (直接入手するなら こちら から) をさくっとインストールできます。以下の markdown-command はそれ前提の設定です。変換後 CSS で見やすくするために markdown-css-path も設定してます。ラップトップなのでローカルに適当に作った CSS を指定してますが、常時インターネットに接続してる環境であれば、気に入った Web 上の CSS を参照しちゃうのもいいかもしれません。

以下では .md, .txt の拡張子のファイルを開く際に markdown-mode にしてますが、これは人にとってお好みで、ですね。HTML への変換時は以下を使ってます。

  • HTML に変換してからブラウザで開く (markdown-export-and-preview)
    • Ctrl-c Ctrl-c v
  • 単に HTML に変換するだけ (markdown-export)
    • Ctrl-c Ctrl-c e

見出しやリンクを挿入する関数もありますが、ショートカットキー叩くより普通に入力したほうが早いので、あまりそっちは使ってませんw

ちなみにこの記事も Markdown 記法のテキストで作成 → コンバータで HTML に → Blogger 用に少し sed で整形、的なことやってます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [PKG機能利用] markdown-mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(autoload 'markdown-mode "markdown-mode.el" "Major mode for editing Markdown files" t)
(setq auto-mode-alist (cons '("\\.md" . markdown-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("\\.txt" . markdown-mode) auto-mode-alist))
(setq markdown-command "/usr/local/bin/markdown")
;; Markdown2HTML した際 (C-c C-c v や C-c C-c e)、参照する CSS の設定
(setq markdown-css-path "file://localhost/Users/morikawa/.emacs.d/local-lisp/markdown2html_mac.css")

Markdown 編集用・その二 (見出し検索用自作関数)

Markdown ネタをもう一つ。Markdown の見出しを Occur で引っ張ってくる自作関数 markdown-header-list を作って、テキスト内移動に使ってます。

一応、以下の Markdown の見出し記法 には一通り対応してます (まあヒットのさせ方が簡単ですからね…)。

# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6

見出し1
=============

見出し2
-------------

私自身は Ctrl-c Ctrl-s のショートカットを設定してます。文章が長くなってきた時や、「全体構成どうなってたっけ?」という時に使ってます。(require を強引に呼んでて、もう少しスマートな書き方あるような気がする…。動くのでとりあえず良しとしてますが…)。

余談ですが、最近 rubikitch さんが all-ext.el をリリースされましたね (all-ext.el:対象行を絞り込んでからまとめて編集するM-x allを超強化!occurと融合&anything・helmと連携)。下記関数の用途は編集よりも移動なので Occur で OK なのですが、絞り込んだ結果の画面で直接編集できちゃうってのは凄いですね。そのうち活用したいなと。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [編集支援] Markdown 書式の見出し検索
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun markdown-header-list ()
  "Show Markdown Formed Header list through temporary buffer."
  (interactive)
  (occur "^\\(#+\\|.*\n===+\\|.*\n\---+\\)")
  (other-window 1))
(require 'markdown-mode)
(define-key markdown-mode-map "\C-c\C-s" 'markdown-header-list)

ちなみに実際に使うとこんな感じ↓

anything, recentf-ext (+ kill-ring) 設定

とにかく一度使い慣れちゃうと離れられない anything, recentf-ext (あとついでに kill-ring) の設定です (rubiktch さんに感謝感謝)。おそらくこういうのも一つの「革新的」というものなんでしょうね。上手く一言で「こう素晴らしいんだよ」とは説明しづらいんですがとにかく「使ってみなヨ!」という機能ですね。

例のごとく list-packages から anything で始まるパッケージと, recentf-ext をさくっとインストールしてます。

とにかく anything にはすぐに起動して欲しいので "Ctrl-x X" 系のショートカットじゃなくて、Ctrl-o を割り当てちゃってます (多分何がしかのプリセットされてる関数があるんでしょうが上書き)。ファイルを開きたい、バッファを切り替えたいとかの際はとにかく Ctrl-o 押せば良い になってます。

使い始めてしばらくは (global-set-key (kbd "C-o") 'anything) としてたのですが、どうも recentf で保存されてるファイルの新しいものしか呼び出せないようで、最近呼び出す関数を anything-for-files にしたら(たぶん)古いものも呼び出せるようになりました。

あと、anything についてくる anything-show-kill-ring を M-y に設定しており、過去 kill-ring に保存した情報を引っ張り出せます (昔から色々実装がありましたが、今回こちらに乗り換えました)。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [PKG機能利用] anything, recentf-ext, kill-ring
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; C-o で anything-for-files 起動
(global-set-key (kbd "C-o") 'anything-for-files)
;; recentf による保存数を 10000 に
(setq recentf-max-saved-items 10000)
;; 「バッファを替えた時ファイルを開いたとみなす」「Directoryも履歴に保存」する拡張
(require 'recentf-ext)
;; 遅延を短く
(setq anything-idle-delay 0.1)
(setq anything-input-idle-delay 0.1)
;; kill-ring の最大値。デフォルトは 30
(setq kill-ring-max 100)
;; M-y で kill-ring を表示
(global-set-key "\M-y" 'anything-show-kill-ring)

関連のドキュメントはネット上のあちこちにありますので詳しくはそちらをどうぞ。以下は今回私が参照したサイトです。

ちなみに今は anything を fork した helm というものもあるそうですが、ぱっとググった範囲ではわざわざ移行しなくてもな~、という感じなのでそのまま anything を使ってるのが現状です。とはいえ、後方互換で作ってもらってるのはありがたいですね。

popwin 設定

最近 近頃の開発環境 : Mosh、z、tmux、Emacs、Perl について - naoyaのはてなダイアリー から popwin.el を知って、以下のサイトを見ながら設定追加しました。

こちらも list-packages からインストールしてます。上記サイトでも紹介されてますが、ヘルプバッファ(*Help*)とか補完バッファ(*Completions*)とかデバッグバッファ(*Backtrace*)とか出たら出っぱなしでイライラしながらウィンドウを移動したり閉じたり、といったストレスが解消される、という地味で説明しづらいですが確かに快適になる機能です。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [PKG機能利用] popwin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'popwin)
(setq display-buffer-function 'popwin:display-buffer)
(setq popwin:popup-window-height 0.5)
(defvar popwin:special-display-config-backup popwin:special-display-config)
(setq popwin:special-display-config
      (append '(("*Remember*" :stick t)("*Org Agenda*")("*Backtrace*")
                ("*sdic*" :noselect))
              popwin:special-display-config))
(define-key global-map (kbd "C-x p") 'popwin:display-last-buffer)

screen: ミニバッファの保存や各ファイルに開いた際の行数のマークとかとか

anything でだいぶ楽にはなりましたが、screen もまた便利で昔から使ってます (端末多重接続ソフトウェアの GNU screen とは全然別物です。これはこれで個人的には使ってますが)。これも list-packages からインストールしてます。

基本明示的に呼び出して使うというものではなく、以前に Emacs 内でミニバッファに入力した内容や各ファイルの最終変更時の行数の記憶といったことをしてくれる機能で地味にかなり便利です。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [PKG機能利用] session 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'session)
(add-hook 'after-init-hook 'session-initialize)
(setq session-save-print-spec '(t nil nil))

なお、最後の一行は以下サイトで紹介されていたもので、anything-show-kill-ring と screen を同時使用する際に必要な設定です。

Google Chrome のテキストエリアを外部エディタで編集

ブラウザ上でそれなりの量の文章をテキストエリアに直入力するのはちょっと嫌なので (手が滑って画面をリロードして全部消えちゃうとか…)、たいていは Emacs などのエディタ上でひと通り編集を行なってから貼り付けてます。

とはいえ、わざわざ Emacs にコピペするほどじゃないなと思ったんだけど、「あ、ここちょっと矩形切取したいな… or さくっと置換したいな」なんて事があったりもします。

そんなタイミングでサクッとEmacs とブラウザのテキストエリア上のテキストの同期をとれるようにしてくれるのが

になります。

以下の設定は Google Chrome のテキストエリアを外部エディタで編集する Edit with Emacs - 酒日記 はてな支店 をベースにしつつ、edit-server は list-packages でインストール、キーバインドは個人的に直感的なものに置き換えてます。

ブラウザ上のテキストエリア内編集時にもやもやしてる方は導入して損のない機能かなと。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [PKG機能利用] Chrome のテキストエリア編集の為のエディットサーバ起動
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'edit-server)
(edit-server-start)
;; Chrome から呼び出した際のフレームサイズを edit-server.el デフォルトのものより
;; init.el で設定しているものを優先(デフォルトは幅 80, 高さ 25)
(setq edit-server-new-frame-alist nil)
;; 特定の URL から呼び出された場合のモード設定
(setq edit-server-url-major-mode-alist '(("mail\\.google\\.com" . mail-mode)))
;; Edit Server Mode のキー設定変更
;; - デフォルト
;;    - Ctrl-x # or Ctrl-c Ctrl-c: ブラウザのテキストエリアに編集内容貼付 (Emacs のウィンドウ閉)
;;    - Ctrl-x Ctrl-s:             ↑ 後に再度 Emacs を開く (一時保存)
;;    - Ctrl-x Ctrl-c:             編集を破棄
;;
;; - カスタム (普段の自分設定の Emacs に近い操作で)
;;    - Ctrl-x Ctrl-s:             ブラウザのテキストエリアに編集内容貼付 (Emacs のウィンドウ閉)
;;    - Ctrl-q:                    ↑ 後に再度 Emacs を開く (一時保存)
;;    - Ctrl-x k, Ctrl-x Ctrl-k:   編集を破棄
;; 
(define-key edit-server-edit-mode-map "\C-q"     'edit-server-save)
(define-key edit-server-edit-mode-map "\C-x\C-s" 'edit-server-done)
(define-key edit-server-edit-mode-map "\C-xk"    'edit-server-abort)
(define-key edit-server-edit-mode-map "\C-x\C-k" 'edit-server-abort)

Mac 用の特殊キーバインド (¥\ を入力)

ちょいちょい正規表現置換 query-replace-regexp を使うのですが、後方参照させたいのに何度 ¥( .. ¥) で括っても ¥1 に代入されない…。おかしいなぁ、と思っていたら、Mac だと ¥\ は違ったのねというオチ。

上記サイトで紹介されていた以下の設定で万事解決。\( .. \) で括ったものが \1 .. に代入されるようになりました。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [基本] Mac 特殊キーバインド
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-key global-map [?¥] [?\\])

トラックパッドのスワイプで快適にスクロール

デフォルトだと、トラックパッドの上下のスワイプは過度にスクロールされてしまうので全然使えない感じだったのですが、

から設定を丸コピさせてもらって大変快適になりました。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [基本] トラックパッド用のスクロール設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun scroll-down-with-lines ()
  "" (interactive) (scroll-down 3))
(defun scroll-up-with-lines ()
  "" (interactive) (scroll-up 3))
(global-set-key [wheel-up] 'scroll-down-with-lines)
(global-set-key [wheel-down] 'scroll-up-with-lines)
(global-set-key [double-wheel-up] 'scroll-down-with-lines)
(global-set-key [double-wheel-down] 'scroll-up-with-lines)
(global-set-key [triple-wheel-up] 'scroll-down-with-lines)
(global-set-key [triple-wheel-down] 'scroll-up-with-lines)

Dired: ディレクトリエディタ

ちょっとしたファイル操作は Emacs いじってる時はそのまま Emacs 上でやった方が楽だったりするので、古くからある Dired ですが今も使わせてもらってます。

しばらくはデフォルト設定で使ってたので、最近以下の記事を見つけて (記事自体は 5 年以上前のものですが)、設定追加しました。

より快適でいい感じです。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [基本] Dired モードの設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-hook 'dired-load-hook
          '(lambda ()
             ;; ディレクトリを再帰的にコピー可能にする
             (setq dired-recursive-copies 'always)
             ;; lsのオプション 「l」(小文字のエル)は必須
             (setq dired-listing-switches "-FlhtA")
             ;; find-dired/find-grep-diredで、条件に合ったファイルをリストする形式
             (setq find-ls-option '("-print0 | xargs -0 ls -Flhatd"))
             ;; 無効コマンドdired-find-alternate-fileを有効にする
             (put 'dired-find-alternate-file 'disabled nil)))
;; ファイル・ディレクトリ名のリストを編集することで、まとめてリネーム可能にする
(require 'wdired)
;; wdiredモードに入るキー(下の例では「r」)
(define-key dired-mode-map "r" 'wdired-change-to-wdired-mode)
;; 新規バッファを作らずにディレクトリを開く(デフォルトは「a」)
(define-key dired-mode-map (kbd "RET") 'dired-find-alternate-file)
;; 「a」を押したときに新規バッファを作って開くようにする
(define-key dired-mode-map "a" 'dired-advertised-find-file)

外部 IME 使用中でも快適に使えるキーバインド

最近日本語入力には Google 日本語入力使ってますが、外部 IME だと Ctrl-x k みたいなキー入力は日本語入力オフになってないと最後のアルファベット入力ダメなんですよね (挙動としては当たり前ですが)。もう一度入力し直しだったり、先に日本語入力オフになってることを確認する事を心がけたりと結構面倒なので、よく使うやつには Ctrl-x Ctrl-k みたいなキーバインド追加したりしてます。

まっとうな解決策は以下で紹介されてるような IME パッチを適用することなんですけどね…。

ただ、Windows でも Emacs 使ってたり、リモートの Linux で SSH 端末経由で Emacs 立ち上げたりすることもあるので、そこら辺も含めて対応するのが面倒で、ついこういったアドホックな対応とっちゃってます。

「全然元のキーバインドと違うぢゃん」ってものもありますが、まあ結果結構ストレスは減ったのでよかったのかなと。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; [基本] グローバルキーマッピング (外部IMEの日本語オン/オフを切替えず使いたい関数用)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; kill buffer を Ctrl-x Ctrl-k で可能に (デフォルトは Ctrl-x k)
(global-set-key (kbd "C-x C-k") 'kill-buffer)

;; 別ウィンドウへの切り替えを Ctrl-x Ctrl-o で可能に (デフォルトは Ctrl-x o)
(global-set-key (kbd "C-x C-o") 'other-window)

;; 単一ウィンドウに戻すのを Ctrl-x Ctrl-1 で可能に (デフォルトは Ctrl-x 1)
(global-set-key (kbd "C-x C-1") 'delete-other-windows)

;; 縦ウィンドウ分割を Ctrl-x Ctrl-2 で可能に (デフォルトは Ctrl-x 2)
(global-set-key (kbd "C-x C-2") 'split-window-below)

;; 縦ウィンドウ分割を Ctrl-x Ctrl-3 で可能に (デフォルトは Ctrl-x 3)
(global-set-key (kbd "C-x C-3") 'split-window-right)

;; フレームの作成・削除を Ctrl-;, Ctrl-: で可能に (デフォルトは C-x 5 2, C-x 5 0)
(global-set-key (kbd "C-;") 'make-frame-command)
(global-set-key (kbd "C-:") 'delete-frame)

;; Ctrl-x Ctrl-d (デフォルトは Ctrl-x d) でも dired を起動する
(global-set-key (kbd "C-x C-d") 'dired)

まとめ

以上、書き並べてみたら結構な量になってしまいましたが、これら設定のお陰で Emacs Life はさらに快適になりましたね。

また良いなと思う機能など見つけましたらそのうち紹介します。