2016年04月17日

SeesaaBlogに投稿するためのモード作ってみてる

お久しぶりです。麦汁です。

技術系のブログって位置付けでやってるけど 普段何も作ってないから何も更新してないひどい有様でござる。

まあ、投稿してない理由というか言い訳はもう1つあって それは投稿しやすい環境を整えてないということ。

いや、その、一応なんかのスクリプトを用意してた気がするけど、 それだと使い勝手がイマイチ良くなくて、 それでまあ放置しているということになっているので、 その言い訳ができなくなるように より使い勝手のいい投稿方法をですね。

というわけで作ってみている。 まだ作ってる途中で、 今回のこれが初運用になる、予定。

そういうことなので、 ソースとかそういうのはまあ当然まだ出て来ないわけだけど、 とりあえずどんな作りかだけ。

元々 org-mode で記事を書いてて それを org-ruby で HTML にしてて そいつを投げるスクリプトを用意してたけど、 ruby 実行しないといけないのがだるくなってしまった。

というわけで基本的には同じ仕組みの minor mode を用意している。

ただ、 C-c C-c したら org-mode の機能でブログ用の HTML を吐き出して emacs-w3m でpreview して C-c C-p したら投稿する感じで。

さて。投稿してみよっと。 ソースはまた今度。

posted by 麦汁 at 02:45 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする

2015年11月28日

Emacs でも位置情報が欲しい……位置情報欲しくない?

例えばですよ。

もし貴方が新幹線に乗っていて プログラムを書くのに夢中になってしまったとするじゃないですか。

そして、ふと我に帰った時に、 今いる場所がどこだかわからないって状況が起こるかもしれないじゃないですか。

そんな時に、プログラムを書く時に使っていた目の前にある Emacs で 位置情報を取得できたら便利くない?

というわけで、取得できるようにしました。

https://github.com/mugijiru/emacs-geolocation

ただし Mac OS X 限定。

インストール

Github から clone してきて

(add-to-list 'load-path "/path/to/emacs-geolocation")
(require 'geolocation)

するか

el-get を使うなら

(:name emacs-geolocation
       :description "Get geolocation use Google Maps Geolocation API."
       :type github
       :features "geolocation"
       :depends (request)
       :pkgname "mugijiru/emacs-geolocation")

のようなレシピを emacs-geolocation.rcp とかいう名前で保存して

M-x el-get-install RET emacs-geolocation

したら入るはず。

設定

Google API KEY の設定が必要です。 適当に https://code.google.com/apis/console から取得してください。

それと Google Maps Geolocation API を有効にしてください。

上記で取得した Google Maps Geolocation API を使える API Key を 以下のようなコードで設定します。

(setq geolocation-google-api-key "YOUR-API-KEY")

使い方

(geolocation-get-geolocation) ;; ((longitude . 127.65) (latitude . 26.17))

こんな感じ。

位置情報を取得してそのまんま Google Maps を デフォルトのWebブラウザで開く場合には以下の感じ。

(let* ((location-data (geolocation-get-geolocation))
       (latitude (number-to-string (assoc-default 'latitude location-data)))
       (longitude (number-to-string (assoc-default 'longitude location-data)))
       (url (concat "http://maps.google.com/?q=" latitude "," longitude)))
  (call-process "open" nil nil nil url))

仕組み

周囲で拾える Wi-Fi の情報を収集して それをGoogle Maps Geolocation API にブン投げてるだけ。

Mac OS X だと以下のコマンドで 周囲の Wi-Fi の情報を拾える。

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s

Linux とかだと環境がなくてわからないから非対応。

周囲のWi-Fi情報を拾って その中からMacアドレスと電波強度とチャンネル情報を抽出して Google Maps Geolocation API に それらの情報をJSON形式でPOSTしたら位置情報が得られると。

最後に

これで Mac と Emacs さえあればどこにいても現在位置がわかる! Happy!

posted by 麦汁 at 01:19 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする

2015年07月27日

Emacsのauto-completeでRubyのドキュメントを引っ張れるrobeに手を入れてみる

どうもこんばんは。随分長いことblogを更新してない麦汁です。 ようやく気が向いたので更新。

で、最近またRoRに返り咲きしてまして、 そのついでにEmacsのRuby環境を整えたりしている。

その際に導入したのが robe という Rubyのコードアシスタンス機能を持つやつ。 Emacs LispだけではなくRubyも動かすちょっと贅沢なやつ。 auto-complete と組み合わせると幸せになれそうなやつ。

と思うじゃん? これ見てよ

http://mugijiru.up.seesaa.net/image/robe-to_s.png

わあい! to_s がいっぱい! 何だよこれこんなにいらねえぞどれがどれだよ泣くぞ。

http://mugijiru.up.seesaa.net/image/robe-to_s2.png

http://mugijiru.up.seesaa.net/image/robe-to_s3.png

っていうか全部同じドキュメント出しているじゃないかギャン泣きするぞ。

というわけで俺好みに修正する。

auto-complete の候補を引っ張ってくる関数が robe-complete-thing というやつになるんだけど まずこいつが “Kernel.to_s” なども “to_s” だけ拾って帰ってくるようになっているので もにゃもにゃと修正。

(defun robe-complete-thing (thing)
  (robe-start)
  (if (robe-const-p thing)
      (progn
        (robe-complete-exit)
        (robe-request "complete_const" thing (car (robe-context))))
    (destructuring-bind (target module instance _) (robe-call-context)
      (setq robe-specs-cache (make-hash-table :test 'equal))
      (mapcar (lambda (spec)
                (let* ((method (robe-spec-method spec))
                       (value (gethash method robe-specs-cache))
                       (prop-value (caar value))
                       result-string
                       result-value
                       klass
                       case-fold-search)
                  (puthash method (cons spec value) robe-specs-cache)
                  (if robe-highlight-capf-candidates
                      (propertize method 'face
                                  (if (string-match "\\`[A-Z]" method)
                                      'font-lock-type-facen
                                    'font-lock-function-name-face))
                    (setq klass (if (and value (stringp (caar value)))
                                    (caar value)
                                  ""))
                    (setq result-string method)
                    (setq result-value (if value
                                           (concat (caar value) "#" method )
                                         method))
                    (popup-make-item (propertize result-string 'value result-value)
                                     :summary (if (stringp klass)
                                                  klass
                                                "")))))
              (reverse
               (robe-request "complete_method" thing target module instance))))))

元々は method だけ返していた物を その text-property の value に “Class#method” という形の文字列を埋め込んだり popup の item の summary にクラス名を埋め込んだりしている。

次に、auto-completeのメニューを選んだ時に 右側に出て来るドキュメントを出す関数を修正

(defun ac-robe-doc (symbol)
  "Return popup documentation for `auto-complete'."
  (when robe-running
    (let* ((candidate (ac-selected-candidate))
           (dummy-spec (list (get-text-property 0 'summary candidate)
                             t
                             (substring-no-properties candidate)
                             nil))
           (document (robe-doc-for dummy-spec)))
        (concat symbol
                "\n\n"
                (cdr (assoc 'docstring document))))))

元々はsymbolを使ってrobe-specs-cacheから適当に最初の1個を引っ張り出して来ていたのを 修正したrobe-complete-thingの情報を無理矢理引っ張り出して robe-doc-for に送り込んでる。

ちなみに robe-doc-for は なんか robe の http なプロセスにGETでドキュメントを取りに行く関数

というわけで〜、これでauto-completeを実行すると〜

http://mugijiru.up.seesaa.net/image/robe-to_s4s.png

http://mugijiru.up.seesaa.net/image/robe-to_s5s.png

http://mugijiru.up.seesaa.net/image/robe-to_s6s.png

やったね! ちゃんと何のto_sかわかるし ちゃんとしたドキュメントも表示されるぞ! いえい!

というわけで幸せになれました。

本当はコンテキストに合わせて補完候補絞って欲しいけど今回はこれで勘弁してやる。

posted by 麦汁 at 00:37 | Comment(0) | TrackBack(0) | emacs | このブログの読者になる | 更新情報をチェックする