大学生からの Web 開発

会社の人に見つかってぽよぽよしてきた

Spacemacs をターミナルから起動する

  • ※ Spacemacs に限った内容ではありません。
  • ※ Spacemacs を GUI で使う場合の話です。
  • ※ Spacemacs じゃなくて Emacs の話じゃん、ですが検索のためにこういうタイトルにしています。

先日、Qiita にて Spacemacs というものを知った。これは Vim を使っている人が Emacs に移行をするため、という目的もある Emacs 設定集である。Spacemacs について詳しくは以下の Qiita のエントリか 公式のドキュメントを読んでほしい。

github.com

qiita.com

キーバインドが選べて vi にすると、Evil という Emacs 上で vim をエミュレートするプラグインが有効化されて Vim ユーザでもエディットの面ではほとんど違和感なく扱える。

UI がおしゃれだし、vi のキーバインドだし、Emacs なんかすごそうなので、少し Spacemacs を使おうという気になった。

で、ここで問題。Spacemacs の起動の方法。

Vim は以下のように起動してターミナル上で使う。

$ vim foo.txt

Emacs と同じく GUI エディタである Atom もターミナルから起動できる。

$ atom foo.txt

Emacs はターミナルで起動すると、ターミナル上に展開される。

$ emacs foo.txt

CUI で起動するとせっかくの綺麗さが損なわれるので、GUI で起動したいんだけど、Emacs のアイコンから起動して メニューバーの File から目的のファイル・ディレクトリを開くのめちゃくちゃめんどくさい。

ターミナルで作業しているときにパッと開きたい。

本題

2015/12/16 open コマンドの方法は問題があって、書き換えました

Emacs 起動のためのスクリプトを追加する。

↓↓↓

Start Emacs.app from CLI

↑↑↑

railwaycat さん作の perl スクリプトと ptb さん作のシェルスクリプトがある。perl が動作しない環境の人はシェルスクリプトの方を使うといいです。

これ、何をしているかというと引数で渡されたファイルをテンポラリファイルとして作成してそれを open コマンドを使って Emacs で開く。

system("touch $args") if ($tmpfiles);
 
system("open -a /Applications/Emacs.app $args");

open コマンド

OS X の open コマンドは、ターミナルからファイルやディレクトリを、それを開くデフォルトのアプリケーションで開く、というもの。

-a オプション

-a とは application のオプションで、これをつけると、アプリケーションを開くよーという意味になる。

例えば、アプリケーション名だけを書けば /Applications ディレクトリの中から探して開いてくれる。

-a をつけない場合は以下のように呼び出すということ。

$ open /Applications/emacs.app

また、これでもよい。

$ open -a /Applications/emacs.app

で、-a オプションを使うとアプリケーションに引数を渡せるので、そこでパスを書く。

これなら foo.txt を開くし

$ open -a emacs foo.txt

以下なら、現在のディレクトリを開く。

ただこれだけだと存在しないパスを引数として渡した場合、エラーになる。ので、事前にテンポラリファイルが作られる。

導入

$HOME/bin などにパスを通して、そこにスクリプトを実行可能にして配置する。

$HOME/bin にパスを通す。

.bashrc, .zshrc...

export PATH="$HOME/bin:$PATH"

スクリプトを配置

$ cd ~/bin
$ vi emacs

~/bin/emacs に ↓ をコピペする。

gist.github.com

実行可能にする

$ chmod +x emacs

これで

Emacs.app をターミナルから起動できる。

おまけ

プロジェクトごとに Emacs を起動したい場合がある。いま現在の設定だと、現在 Emacs が開いている対象と違う対象を渡すと、同じプロセスで新たに渡した対象を開く。

新しい対象を渡した場合、Emacs のプロセスも新しく立ち上げてほしい場合、以下のように書き換える。

~/bin/emacs 17行目

system("open -a /Applications/Emacs.app $args -n");

$args の後ろに -n が追加された。

-n オプションは、もし指定したアプリケーションがすでに立ち上がっていた場合、別プロセスで起動させるもの。お好みで。

おわり

べつに Spacemacs, Emacs に関した話じゃないし、Emacs をこれから使っていくわけではないです。

参考

http://macwiki.osdn.jp/wiki/index.php/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/open

日本語の読みがなを返す Gem を作った

日本語の読みがなを返す Gem である rubyfuri(ルビふり) を作った。

Yahoo!デベロッパーネットワークテキスト解析:ルビ振り を利用している。

github.com

使い方

YOUR APP IDデベロッパーネットワークで取得できるアプリケーション ID.

rubyfuri = Rubyfuri::Client.new('YOUR APP ID')

rubyfuri.furu('大きな空')
#=> 'おおきなそら'

rubyfuri.furu(['広い', '日光', '時計'])
#=> ['ひろい', 'にっこう', 'とけい']

作った理由

はてなインターンの前半課題に id:SWIMATH2 さんが ルビふりAPI を利用していたのを思い出して、自分も使ってみた。

この API, ただ読みがなを返してくれるわけじゃなくて以下のように形態素っぽい形にして返してくる(形態素ではない)。

<resultset xmlns="urn:yahoo:jp:jlp:FuriganaService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="urn:yahoo:jp:jlp:FuriganaService http://jlp.yahooapis.jp/FuriganaService/V1/furigana.xsd">
    <result>
        <wordlist>
            <word>
                <surface>
                    青い
                </surface>
                <furigana>
                    あおい
                </furigana>
                <roman>
                    aoi
                </roman>
                <subwordlist>
                    <subword>
                        <surface></surface>
                        <furigana>
                            あお
                        </furigana>
                        <roman>
                            ao
                        </roman>
                    </subword>
                    <subword>
                        <surface></surface>
                        <furigana></furigana>
                        <roman>
                            i
                        </roman>
                    </subword>
                </subwordlist>
            </word>
            <word>
                <surface></surface>
                <furigana>
                    そら
                </furigana>
                <roman>
                    sora
                </roman>
            </word>
        </wordlist>
    </result>
</resultset>

で、パースするのに一手間かかって面倒だったので Gem を作った。

便利なところ

rubyfuri には、実際に API とやり取りするより簡略化されているのともうひとつメリットがある。配列を与えた時、各要素をまとめて一回のリクエストで処理しているため、API 使用回数の節約、また愚直にひとつの文字列につき 1 リクエストを直列に送るよりも高速化される。

学び

ちゃんとテストを書こう、と思って作り始めた Gem なんだけど、このエントリを書いているときにテストあんまり書けてない。

それでも RSpec でいくつかテストを書いての学び。describe 節で対象メソッドを記述して、その下に subject でテストする処理を書く。で、その下に context 節を作ると DRY な感じで良く書ける。

describe '#furu' do
  subject do
    instance.furu(text)
  end
  
  context '文字列が空の場合' do
    let(:text) do
      ''
    end
    
    it '~~~~' do
      # ~~~~
    end
  
  context '配列が与えられた場合' do
    let(:text) do
      ['今日は', '雲が', '青い']
    end

    it '=====' do
      # ============
    end
  end
  end
end

まとめ

API ラッパー作った。

github.com

日記: ペット

夕方の帰り道、自転車で帰っていたら中年女性が独り言を言って散歩していた。しっかり見ると犬と散歩中で、独り言じゃなくてペットに向かって喋っていた。

「あんたすぐちょっかい出すからあっちはダメ」。

向こうからまたペット連れの女性が歩いてくるのが見えた。T字路だったので向かいの女性を避けて方向転換しようとする中年女性。を見たところで僕が自転車で追い抜いた。

そこから 10m ほど漕いだ時、「キャンキャン!!!!」。 犬の大きな声が響いた。

少し笑えたあと、「おばちゃんすげ〜〜〜〜」と思った。ペットの習性を分かってて、人間と接するように外でも言葉でもコミュニケーションする。愛されてる。

ペットは家族、というように本当にそうなんだと思う。翻って自分はそういう接し方を出来ていたかというと、No だった。大学一年生の 6 月に人生で初めてのペットとしてハムスターを飼った。それは手入れが行き届いてなかったせいで、冬の寒さにより亡くなってしまった。それ以来、動物を飼ってない。

亡くなった時の悲しみと、犬や猫などの動物に触るのが苦手な性分から、もうペットはいいかと思っていたけれど、和やかな一件を見て少し気持ちが変わった。