2013年7月1日月曜日

Tiny Tiny RSS+fever plugin+Mr. reader または Reederが最強な件

巷では7月1日でGoogle Readerのサービスが終了すると言うことで、移行先は何処にすれば良いのか話題で賑わっていました。自分のそのなかの一人であったのですが、今回の事で他人のサービスを当てにしているとろくな事は無いなと思った訳です。

と言うことで、私が選んだのはTiny Tiny RSSでした。Tiny Tiny Rssは他人のサービスを使用するものでは無く、自サーバーなどを用意しインストールして自らサービスを立ち上げるタイプのRSSです。これをさくらのVPSにインストールすれば、他人の都合に左右されずにサービスを享受することが出来ます。最高!!

Tiny Tiny RSSをサクッとインストールしてみたのですが、一つ問題がありました。Google Readerの時は使いやすいクライアントソフトが多く存在していました。自分はiPadでMr.Readerを愛用していました。もう手放せない、Mr.Readerじゃないと読む気が起きないというぐらい気に入っていました。

しかし、Tiny Tiny RSSをサポートしているクライアントソフトはお世辞にも良いとはいえないものばかりです。しばらくはwebインターファースで読むしか無いかなと思っていました。

Tiny Tiny RSS プラグイン

Tiny Tiny RSSにはプラグインが組み込める仕組みがあって、デフォルトで有用なプラグインが組み込まれていて、それ以外にも有志によって作成されたプラグインも公開されています。

何か便利なプラグインは無いかと物色していた所、Reeder (iOS) integration with TT-RSS (via Fever API)と言うプラグインが目にとまりました。どうやらFever APIをエミュレートしてReederでTiny Tiny RSSの記事を参照出来るようにするプラグインらしいです。そして、Mr.Readerの最新版もFeverをサポートしています。

そして、Fever API pluginのreadme.mdを見ると Supported/Tested Clients の所に Mr.Readerの文字が… これは入れるしか無いとインストールしてみました。

TinyTinyRSS Fever API pluginのインストール

  1. 最初にhttps://github.com/dasmurphy/tinytinyrss-fever-pluginからmaster.zipをダウンロードしてきます。

  2. 次に、適当な場所で解凍します。

  3. 解凍すると、feverディレクトリが出来ますので、それをTiny Tiny RSSのpluginsディレクトリ(自分の環境では/var/www/htdocs/ttrss/plugins)に入れます。
    # mv tinytinyrss-fever-plugin-master/fever /var/www/htdocs/ttrss/plugins

  4. 次にTiny Tiny RSSをブラウザで開いて「操作」→「Preference」→「plugin」を選択するとfeverのチェックボックスが現れるのでこれをチェックし、Enable seleced pluginsボタンを押下して有効にします。plugin設定画面

  5. fever pluginを有効にしてリロードすると「Preference」ページに「Fever Emulation」タブが追加されますのでこれを開いて、パスワード入力エリアにログイン時のパスワードを入力します。パスワード入力

  6. Mr.ReaderのAdd Accountからfeverを選びます。Mr.Reader Add Account

  7. Server URLはプラグインを入れたディレクトリを指定し、CredentialsにログインIDとパスワードを入力しログインします。Mr.Reader Login

  8. ログインすると同期が始まります。Mr.Reader 同期

  9. 記事の一覧Mr.Reader 記事の一覧

  10. 記事もGoogle Readerの時と同じように読むことが出来ました。Mr.Reader 同期

これで、Google Readerが無くなっても、快適なReader環境を整えることが出来ました。Reeder for iPhoneでも同様にログインして読むことが出来ることを確認しています。

2013年6月3日月曜日

html5でも正しくインデントしてくれるweb-modeを導入してみた

以前にhtml5を書くためにnxml-modeを導入したが、これはどちらかというとxhtml5を書くためのものでinputタグ等は最後にスラッシュを書いてタグを閉じておかないとインデントが残念なことになってしまっていた。

残念なインデント

最近はhtml5で書いた(しかも、微妙にxhtmlの記述が混ざっていたりする)ファイルを扱う事が多くなってくると、インデントがうまく処理できないnxml-modeだと使いにくいので、web-modeをインストールして使用してみた。

インストール

web-mode.elのページからweb-mode.eをダウンロードして適当なディレクトリに置く。

.emacsの設定

.emacsに下記の記述を追加

(setq auto-mode-alist
      (append '(
                ("\\.\\(html\\|xhtml\\|shtml\\|tpl\\)\\'" . web-mode)
                ("\\.php\\'" . php-mode)
                )
              auto-mode-alist))

;;==========================================================
;;         web-modeの設定
;;==========================================================
(require 'web-mode)
(defun web-mode-hook ()
  "Hooks for Web mode."
  ;; 変更日時の自動修正
  (setq time-stamp-line-limit -200)
  (if (not (memq 'time-stamp write-file-hooks))
      (setq write-file-hooks
            (cons 'time-stamp write-file-hooks)))
  (setq time-stamp-format " %3a %3b %02d %02H:%02M:%02S %:y %Z")
  (setq time-stamp-start "Last modified:")
  (setq time-stamp-end "$")
  ;; web-modeの設定
  (setq web-mode-markup-indent-offset 2) ;; html indent
  (setq web-mode-css-indent-offset 2)    ;; css indent
  (setq web-mode-code-indent-offset 2)   ;; script indent(js,php,etc..)
  ;; htmlの内容をインデント
  ;; TEXTAREA等の中身をインデントすると副作用が起こったりするので
  ;; デフォルトではインデントしない
  ;;(setq web-mode-indent-style 2)
  ;; コメントのスタイル
  ;;   1:htmlのコメントスタイル(default)
  ;;   2:テンプレートエンジンのコメントスタイル
  ;;      (Ex. {# django comment #},{* smarty comment *},{{-- blade comment --}})
  (setq web-mode-comment-style 2)
  ;; 終了タグの自動補完をしない
  ;;(setq web-mode-disable-auto-pairing t)
  ;; color:#ff0000;等とした場合に指定した色をbgに表示しない
  ;;(setq web-mode-disable-css-colorization t)
  ;;css,js,php,etc..の範囲をbg色で表示
  ;; (setq web-mode-enable-block-faces t)
  ;; (custom-set-faces
  ;;  '(web-mode-server-face
  ;;    ((t (:background "grey"))))                  ; template Blockの背景色
  ;;  '(web-mode-css-face
  ;;    ((t (:background "grey18"))))                ; CSS Blockの背景色
  ;;  '(web-mode-javascript-face
  ;;    ((t (:background "grey36"))))                ; javascript Blockの背景色
  ;;  )
  ;;(setq web-mode-enable-heredoc-fontification t)
)
(add-hook 'web-mode-hook  'web-mode-hook)
;; 色の設定
(custom-set-faces
 '(web-mode-doctype-face
   ((t (:foreground "#82AE46"))))                          ; doctype
 '(web-mode-html-tag-face
   ((t (:foreground "#E6B422" :weight bold))))             ; 要素名
 '(web-mode-html-attr-name-face
   ((t (:foreground "#C97586"))))                          ; 属性名など
 '(web-mode-html-attr-value-face
   ((t (:foreground "#82AE46"))))                          ; 属性値
 '(web-mode-comment-face
   ((t (:foreground "#D9333F"))))                          ; コメント
 '(web-mode-server-comment-face
   ((t (:foreground "#D9333F"))))                          ; コメント
 '(web-mode-css-rule-face
   ((t (:foreground "#A0D8EF"))))                          ; cssのタグ
 '(web-mode-css-pseudo-class-face
   ((t (:foreground "#FF7F00"))))                          ; css 疑似クラス
 '(web-mode-css-at-rule-face
   ((t (:foreground "#FF7F00"))))                          ; cssのタグ
)

主なキーアサイン

個人的には、C-c C-fでタグブロックを開閉できるので、複雑なHTMLを編集するときは便利だと思う。

Generalなキーアサイン
キー機能
C-c C-;コメント/アンコメント
C-c C-e閉じていないタグを見つける
C-c C-f指定したタグのブロックを開閉する
C-c C-i現在開いているバッファをインデントする
C-c C-mマークする(マークする場所によって選択範囲が変わります)
C-c C-n開始・終了タグまでジャンプ
C-c C-rHTML entitiesをリプレースする
C-c C-sスニペットを挿入
C-c C-wスペースを表示・非表示
HTML element系のキーアサイン
キー機能
C-c /閉じタグを挿入(エレメントを閉じる)
C-c ebエレメントの最初へ移動
C-c edエレメントを削除
C-c eeエレメントの最後へ移動
C-c eeエレメントを複製
C-c en次のエレメントへ移動
C-c ep前のエレメントへ移動
C-c eu親エレメントへ移動
C-c erエレメントをリネーム
C-c esエレメント全体を選択
C-c eiエレメントのコンテンツを選択
HTML tag系のキーアサイン
キー機能
C-c tbタグの先頭へ移動(エレメントの先頭では無くタグの先頭です。
</div>で実行した場合は</div>タグの先頭(<)に移動します)
C-c teタグの後尾へ移動
C-c tmマッチするタグへ移動
C-c tsタグを選択
C-c tp前のタグに移動
C-c tn次のタグに移動

インデント

C-c C-iでhtml5でソースをインデントさせてみたところ、インデントの崩れは起きませんでした。

coolなインデント

2013年5月29日水曜日

散財2品目

欲しかった品がお手頃価格で売っているのを見つけてしまったので散財してしまった。

soda stream

一品目はsoda stream。暑くなって来ると炭酸水が飲みたくなる。毎回ボトルを買うのが馬鹿らしいのでsoda streamで自分で作った方が手軽だよなと思っていたが、アメリカに比べて2倍近い価格差があって躊躇していた。

先日、近くのスパーに行くと、展示品現品限りのJet スターターキットが8,980円で売っていたので買ってしまった。おまけに試供品ソーダ12種類と500mlボトルがついてきたので、結構お得な買い物だったかも。

soda stream

買った途端に梅雨入りで涼しくなったしまった為、梅雨明けまでお預けになっている…

無印良品アロマディフューザーセット

新築マンションに引っ越して油断していたら、早々にゴキブリが出現した。

試しにアロマで虫除けしてみようと思い、Amazonで安いアロマディフューザーを探していたが、安いものだとすぐ壊れるという評価が多いので迷っていた所、無印良品で30% offになっているアロマディフューザーセットを発見したので買ってしまった。

5,900円の30% offで4,130円。なんか単体で買うより安くなっているのですけど…
無印アロマディフューザーは、すぐに動かなくなったいう話は聞かないので、多少価格が高くても安かろう悪かろうな商品を買うよりは良いでしょう。

無印良品アロマディフューザーセット

2013年5月2日木曜日

OpenBSDからPPPoEでフレッツ光に接続する設定

昨年の12月に引っ越してから約5ヶ月。新築物件だったので、光使えますよねと念を押して確認したのに入居してフレッツ光を申し込んだら対応していませんと言われ、不動産屋と工事依頼のやり取りしてやっと開通しました。

それまでは、WiMAXでがんばっていたけれど、ホビーベースで使用するならば十分な速度が出ていました。なんといっても帯域制限が無いのがとてもよかった。

それはともかく、フレッツ光が開通したので、自宅サーバーのOpenBSDからGMOのとくとくBBにPPPoEで接続するための設定を行った。

最初にインターフェースの設定をhostname.pppoe0と言うファイルを作成して下記のようにする。mtu 1454と入れておくのがミソ。

inet 0.0.0.0 255.255.255.255 NONE \
pppoedev em1 authproto chap \
authname 'xxxxIDxxxx' authkey 'xxxxpasswordxxxx' up mtu 1454
dest 0.0.0.1
!/sbin/route add default -ifp pppoe0 0.0.0.1

次にhostname.em1に下記の設定をする

up

pf.confに下記の行を追加。

match on pppoe0 scrub (max-mss 1414)

最初、上記の設定を忘れていたので、ロードが完了しないサイトが多発して、原因を特定するに少しはまりました。

やはり、光は速くて良いですね。

2013年4月30日火曜日

VALUE DOMAINのDDNS用Shell Scriptを作った

今まで固定IPな環境だったのが、非固定IPな環境に移ってしまったので、VALUE DOMAINのDDNSを使用して自宅サーバーのホスト名を管理すべくShell Scriptを作成してみた。

こんなこともあろうと、DDNSが使用出来るVALUE DOMAINで契約しておいて良かったよ。

#!/bin/sh

HOST='foo'                         # ホスト名('*'も可)
DOMAIN='example.jp'                # ドメイン
PASSWORD='*******'                 # DDNSのパスワード
DNS_SERVER='ns1.value-domain.com'  # VALUE DOMAINのネームサーバー

wget=`/usr/bin/which wget`
host=`/usr/bin/which host`
grep=`/usr/bin/which grep`
mail=`/usr/bin/which mail`

# 現在のIPアドレスを取得
CURRENT_IP=`$wget -q http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip -O -`

# DNSに登録されているIPをCURRENT_IPでgrepする。
if [ "${HOST}" = "*" ]; then
    CHANGE=$($host $DOMAIN $DNS_SERVER | $grep -F $CURRENT_IP)
else
    CHANGE=$($host $HOST.$DOMAIN $DNS_SERVER | $grep -F $CURRENT_IP)
fi
# IPが変更になった場合はCHANGEは空が入ってくるので、登録処理に入る
if [ -z "${CHANGE}" ]; then
    # DNSへ登録
    RESULT=$($wget -q "http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=$DOMAIN&p=$PASSWORD&h=$HOST" -O - )
    STATUS=$(echo $RESULT | $grep -F 'status=0')
    if [ -z "${STATUS}" ]; then
	    # 登録失敗の場合は、root@localhostへメールを送信
        echo "Dynamic DNS Updating was NG.\nresult:$RESULT" | $mail -s "DDNS updating failed" root@localhost
    fi
fi

自宅サーバーはルータにもなっているので、boot時にプロバイダーとの接続が確立されてIPアドレスの取得後に一回実行させれば良いと思われるので、rc.localに下記のように記述を追加。

if[ -f /usr/local/sbin/ddns.sh ]; then
        /usr/local/sbin/ddns.sh
fi

2013年4月23日火曜日

phpで深いオブジェクトのメンバ変数を動的にアクセスする方法

phpでは変数に値を代入してオブジェクトのメンバ変数を動的アクセスすることが出来ます。

<?php
$foo->bar0 = "hoge0";
$foo->bar1 = "hoge1";
$foo->bar2 = "hoge2";
for($i=0;$i<3;$i++){
    $idx = "bar".$i;
    echo $foo->$idx."\n";
}
?>

これの結果は次のようになります。

$ php test.php
hoge0
hoge1
hoge2
$

しかし、オブジェクトが深くなるとこの方式ではアクセス出来なくなります。

<?php
$foo->bar->hoge0 = "moge0";
$foo->bar->hoge1 = "moge1";
$foo->bar->hoge2 = "moge2";
for($i=0;$i<3;$i++){
    $idx = "bar->hoge".$i;
    echo $foo->$idx."\n";
}
?>

これだとUndefined propertyと言われてしまい、アクセス出来ませんでした。

$ php test.php
PHP Notice:  Undefined property: stdClass::$bar->hoge0 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge0 in /Users/yanagimoto/public_html/test.php on line 8

PHP Notice:  Undefined property: stdClass::$bar->hoge1 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge1 in /Users/yanagimoto/public_html/test.php on line 8

PHP Notice:  Undefined property: stdClass::$bar->hoge2 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge2 in /Users/yanagimoto/public_html/test.php on line 8

$

あまり、良い方法ではありませんがeval関数を使うとアクセス出来ます。

<?php
$foo->bar->hoge0 = "moge0";
$foo->bar->hoge1 = "moge1";
$foo->bar->hoge2 = "moge2";
for($i=0;$i<3;$i++){
    $idx = '$foo->bar->hoge'.$i;
    echo eval("return {$idx};")."\n";
}
?>

結果は下記のようになりました。

$ php test.php
moge0
moge1
moge2
$

しかし、マニュアルにも書いてある通り、任意のPHPコードを実行できてしまう危険な関数なので用法はお間違えの無いように。

2013年4月15日月曜日

MarsEditでMarkdown表記で書いた記事をbloggerに投稿するためのAppleScriptを作った

なんかすごく長い記事になってしまったが、bloggerはMarkdown表記の記事をサポートしていないので、投稿するときの少し便利にするMarsEdit用のAppleScriptを作ってみました。

目次

MarsEditでMarkdownを変換したときの不満点

Markdown 記法でブログを書くで紹介されているように、MarsEditは最初からMarkdown記法をサポートしていて、MarkdownからHTMLに変換することも可能なのですが、不満点がいくつかあります。

変換したHTMLに一部不具合が出る。

例えば、下記のようなCode Blocksを含んだ文章をMarkdownで書いたとします。

Markdown sample

これを変換するには ⌘ + ⇧ shift + Tで一度リッチテキストに変換します。すると下記のようにCode Blocksにあった改行が無くなって一行になってしまいます。

Rich Text

さらに⌘ + ⇧ shift + TをしてHTMLに変換しても下記のように無くなった改行はそのままです。

Rich TextからHTMLに変換

プレビューでみると下記のようになり、ソースコードが一行で表示されすごく見づらくなっています。ソースコードをたくさん貼り付けたい場合、修正の作業量が多くなってしまいかえって不便になってしまいます。

HTMLの変換結果をプレビュー

HTMLにいったん変換するとMarkdownに戻せない。

Markdown → リッチテキスト → HTMLと変換した状態で、もう一度 ⌘ + ⇧ shift + TをしてもMarkdownに戻る事はなく、リッチテキストになってしまいます。

記事を投稿した後で、修正したいと思ってもHTMLを直接修正するか、どこかにMarkdown形式の記事を保存しておいて、それをコピーして使うと言うことになると思います。しかし、それではMarkdown記法をMarsEditで書いている意味が無くなってしまいます。

Markdown Scripts for MarsEdit

同じような不満を抱いている人がいないかと思い、ググってみるとMarkdown Scripts for MarsEditと言う、MarsEdit用のAppleScripts1を見つけました。

インストール

softpediaからMarsEditMarkdownScripts.zipをダウンロードして展開します。そして展開したファイルを~/Library/Application\ Support/MarsEdit/Scripts/にコピーします。

$ cd ~/Desktop/MarsEditMarkdownScripts/
$ cp *.scpt ~/Library/Application\ Support/MarsEdit/Scripts/
$ cp html2text.py ~/Library/Application\ Support/MarsEdit/TextFilters/Markdown_1.0/
$

インストールが終了すると、MarsEditのメニューバーにあるスクリプトメニューにTranslate Markdown to HTMLとTranslate HTML to Markdownが増えていると思います。MarsEditのスクリプトメニュー

Translate Markdown to HTML の不満点

早速、さきほどのMarkdownを変換してみます。変換の仕方は、エディタ画面上でスクリプトメニューのTranslate Markdown to HTMLを選択するだけでHTMLに変換してくれます。

メニューからTranslate Markdown to HTMLを実行

下記のようにCode Blocksの改行も保たれたまま変換されています。

Translate Markdown to HTMLの実行結果

プレビューでの表示も問題ありません。Translate Markdown to HTMLの実行結果をプレビュー

しかし、変換エンジンがオリジナルのMarkdown.plを使用しているため、Markdownの拡張シンタックスが使えないので表現力が落ちます。 但し、Translate Markdown to HTML.scpt変更すれば、別の変換エンジンを使用することが可能です。

Translate HTML to Markdown の不満点

Translate Markdown to HTMLで変換したHTMLをMarkdownに戻してみます。

メニューからTranslate HTML to Markdownを実行

微妙に変換後のインデントが変わってしまいます。

Translate HTML to Markdownの実行結果

このため何回かHTML ↔ Markdownの変換をすると、下記のように結果的に表示が崩れてしまいます。

Translate HTML to Markdownの実行結果をプレビュー

これでは、編集作業には向きません。

Toggle Markdown

AppleScriptを使用してMarkdownをHTMLにするという発想は良いアイディアだと思うので、その考えを少し転換して下記のような動きをするAppleScriptを作成してみました。

  1. MarkdownからHTMLを変換する。
  2. 変換は拡張シンタクスも変換出来るようにする。
  3. 変換時にオリジナルのMarkdownはHTML内にコメントとして挿入しておく。
  4. HTMLからMarkdownに戻すときは、コメントにしておいたMarkdownから復元する。

Toggle Markdownのインストール

kramdownのインストール(optional)

最初にkramdownをインストールします。拡張されたMarkdown記法を使用しない場合はスキップしてもかまいません。

$ sudo gem install kramdown
Password:
Successfully installed kramdown-0.14.2
1 gem installed
Installing ri documentation for kramdown-0.14.2...
Installing RDoc documentation for kramdown-0.14.2...
$

MarsEditの設定(optional)

こちらも、拡張されたMarkdown記法を使用しない場合はスキップしてもかまいません。

MarsEditはデフォルトでmarkdown表記のプレビューが可能ですが、これはMarkdown.plを使用してプレビューを行っています。このため、kramdownの拡張シンタックスを使うとうまく表示できません。そこで、markdownのプレビューにkramdownを使うように設定します。

{$HOME}/Library/Application Support/MarsEdit/TextFilters/kramdownにkramdownディレクトリを作成し、そこにShell Script ファイルkramdown.shを作成します。

$ midir  ~/Library/Application\ Support/MarsEdit/TextFilters/kramdown/
$ cd ~/Library/Application\ Support/MarsEdit/TextFilters/kramdown/
$ vi kramdown.sh

kramdown.shの内容は下記のようにします。

#! /bin/sh
CMD=/usr/bin/kramdown
CMDARGS=&quot;--auto-ids&quot;
$CMD $CMDARGS $1

CMDARGSに設定するオプションはコマンドラインでkramdown –helpとすると出てきますので、お好みで指定します。

ToggleMarkdown.scptをScripts Folderにコピー

ToggleMarkdown.scptをダウンロードし、MarsEditのScripts Folderにコピーします。

$ cp ToggleMarkdown.scpt ~/Library/Application\ Support/MarsEdit/Scripts/
$

MarsEditのメニューバーにあるスクリプトメニューにToggleMarkdownが出たら完了です。

MarsEditのスクリプトメニューにToggleMarkdown

使い方

ToggleMarkdownを実行する度にMarkdown→HTML→Markdown→HTML→… と変換していきます。

ToggleMarkdownはMarkDownエンジンを次のような優先順位で探しに行きます。

  1. ~/Library/Application Support/MarsEdit/TextFilters/kramdown/kramdown.sh
  2. パスが通った場所にあるkramdownコマンド
  3. ~/Library/Application\ Support/MarsEdit/TextFilters/Markdown_1.0/Markdown.pl

次のようなMarkdownで書かれた文書を変換してみます。変換サンプル

スクリプトメニューのToggleMarkdownを実行します。MarsEditのスクリプトメニュー

すると、MarkdownがHTMLに変換されます。オリジナルのMarkdownは上部にコメントとして保存されます。MarkdownからHTMLの変換結果

上記の状態で、再度スクリプトメニューのToggleMarkdownを実行すると、コメントにしてあったMarkdownを元に戻します。この処理は、HTMLをMarkdownに変換している訳では無いのでHTMLを直接編集した場合は編集内容は消えてしまうので注意してください。HTMLからMarkdownに戻した結果

再度、ToggleMarkdownを実行するとHTMLに変換されます。MarkdownからHTMLの変換結果

欠点

ToggleMarkdownはHTMLのコメントとして、変換元のMarkdownを残すので投稿する記事のバイト数が増えてしまいます。これをなるべく避けるためHTML部分の余分なスペースと改行を削除して出力します。

その方がHTMLが難読化されるので、HTMLをうっかり修正してしまうと言うミスも防げると言う利点も…

おまけ

スペースと改行を削除しないほうが良い場合もあるので、削除しないスクリプトをToggleMarkdownNoCompress.scptとして置いておきます。

今まで、AppleScriptで作った事が無かったので、これが初めてのスクリプトです。言語の仕様をwebで調べて2日程度で作ったので動きがおかしな所もあるかも知れません。これを使用したことにより、今までのブログが消えたとしても一切関知しないと言うことで…

  1. download先がリンク切れになっているようですが、softpediaからダウンロード可能なようです。