12 May 2013, 07:02

org2blogをインストールしてWordPressにEmacsから記事を投稿する

はじめに

emacsなら、なんでもできると信じている今日このごろなので、WordPressにもEmacsから記事の投稿ができたらいいなと思います。そんななかリサーチしてみたら、選択肢としては、以下のようなものがありました。

こんな感じなので、org2blogをつかってみます。

環境

  • cygwin               1.7.18-1
  • emacs                24.3-1

org2blogのインストール

org2blogとは、Emacsのorg-modeでかかれたドキュメントをWordPress用に変換して投稿するEmac Lispです。

以下の3つが必要。

  • org2blog
  • metaweblog.el
  • xml-rcp.el

githubからorg2blogとmetaweblogをまずは取得。

$ git clone git://github.com/punchagan/org2blog.git
$ git clone git://github.com/punchagan/metaweblog.el.git

org2blogディレクトリをload-pathの通った場所に配置します。例えば .emacsに以下を追記。metaweblog.elも同様にロードパスの通ったところへ。(or2blog配下でよい)

(setq load-path (cons "~/.emacs.d/org2blog/" load-path)) 
(require 'org2blog-autoloads)

xml-rcp.elも以下から取得。ロードパスの通った場所に配置します。

http://launchpadlibrarian.net/40270196/xml-rpc.el

ブログの設定も.emacsに書きます。以下を参考に適当に編集。

(setq org2blog/wp-blog-alist 
       '(("wordpress" 
          :url "http://username.wordpress.com/xmlrpc.php"  ;;xmlrcp.phpのURL
          :username "username"  
          :password "password" 
          :default-title "Hello World" ;; デフォルトタイトル
          :default-categories ("daily") ;;カテゴリを指定 
          :tags-as-categories nil))) ;; タグを指定

設定が終わったら、emacsを再起動。

org2blogの使い方

接続確認をします。ミニバッファで以下を入力し、サーバにログインできます。

M-x org2blog/wp-login

新しい記事を作成するには、以下を入力。

M-x org2blog-new-entry

テンプレートが呼び出さます。

[C-c d]で下書き保存され、[C-c p]で公開されます。

詳しくは、README参照。これは便利だー(^O^)

https://github.com/punchagan/org2blog

[http://www.youtube.com/embed/5cBghog4hn0?rel=0]

 追記

パスワード入力を省略する方法があるようだ。まずは、~/.netrcに以下を追記。

echo "machine myblog login username password yourpassword" > ~/.netrc 

init.elにも以下を追加。

(require 'netrc) ;; or nothing if already in the load-path
(setq blog (netrc-machine (netrc-parse "~/.netrc") "myblog" t))
(setq org2blog/wp-blog-alist
      '(("my-blog"
         :url "http://username.server.com/xmlrpc.php"
         :username (netrc-get blog "login")
         :password (netrc-get blog "password"))))

参考

12 May 2013, 06:03

Emacsの自動インストールを助けるツール 【auto-install】

はじめに

EmacsはElispをインストールすることによって、どんどんパワーアップできるのが魅力だ。Elipsをつかうためには、ロードパスの通ったディレクトリで以下を実行すればよい。

$ curl -O [Elipsが置いてあるURL]

emacswikiなんかをURLに指定すると、そこからElispをダウンロードして使えるようになる。お手軽!

しかし、拡張機能のインストールをもっと手軽に実行できるツールがある。それが、

  • auto-install

だ。

auto-install

auto-installのインストールと設定

以下のコマンドでまずは、auto-installをインストール。-O は大文字のオーだ。

$ curl -O http://www.emacswiki.org/emacs/download/auto-install.el

次に、設定を.emacsに記入する。

; ------------------------------------------------------------------------
; auto-install
; http://www.emacswiki.org/emacs/download/auto-install.el
; ------------------------------------------------------------------------
(when(require 'auto-install nil t)
  ;;インストールディレクトリを設定。.emacs.d/elispに入れる。
  (setq auto-install-directory "~/.emacs.d/elisp/")
  ;;EmacsWikiに登録されているelispの名前を取得する
  (auto-install-update-emacswiki-package-name t)
  ;;必要であればプロキシの設定を行う
  ;;(setq url-proxy-services '(("http" . "hogehoge")))
  ;;install-elispの関数を利用可能にする
  (auto-install-compatibility-setup))

Emacs再起動して設定を反映する。

auto-installの使い方

以下のコマンドがある。

  • M-x install-elisp RET  URLから取得
  • M-x install-elisp-from-emacswiki EmacsWikiから取得
  • M-x install-elisp-from-gist → gistIDから取得

ここでは、xml-rpc.elを取得する。M-x install-elisp RETして、URLを入力。

http://launchpadlibrarian.net/40270196/xml-rpc.el

ダウンロードしたら、C-c, C-c でバイトコンパイルする。そうすることで、速くElispを読み込むことができるようになる。Emacsを再起動することなく、Elispが使用可能になっている。

ダウンロードからバイトコンパイルまでが、スムーズにこなせるのがいいですね~。

[http://www.youtube.com/embed/bYRAOaQYCWQ?rel=0]

12 May 2013, 03:11

minttyとemacsで、黒背景で青が見にくい場合の対策

minttyやemacsで黒背景を使ってると、

青文字が非常に見づらいヽ(`Д´)ノフ

たとえば、alias ls=’ls -F –show-control-chars –color=aut’なんて設定したって、lsコマンド結果はこんな感じである。

SnapCrab_NoName_2013-5-12_11-35-44_No-00.png

 

Emacsで関数を見たら青くて、目がショボショボしてしまう。

SnapCrab_NoName_2013-5-12_11-38-34_No-00.png

こんなときの、目を守るための優しい対策を調べてみた。

minttyの場合

minttyの場合は、.minttyrcという設定ファイルに色の設定を追記する。

このサイトの色設定を参考にして、.minttyrcに色設定を追加。

http://nishikawasasaki.hatenablog.com/entry/20120227/1330313691

Black=0,0,0
Red=255,100,0
Green=183,234,17
Yellow=234,206,28
Blue=65,105,225
Magenta=237,157,185
Cyan=0,191,191
White=255,255,255
BoldBlack=64,64,64
BoldRed=255,100,0
BoldGreen=183,234,17
BoldYellow=234,206,28
BoldBlue=107,155,219
BoldMagenta=237,157,185
BoldCyan=64,255,255
BoldWhite=255,255,25
BackgroundColour=0,0,0

 

こんな感じに改善されました。

SnapCrab_NoName_2013-5-12_11-47-39_No-00.png

emacsの場合

ターミナルの設定をしても、emacs表示は別口なので、別設定が必要。emacsを開いて、以下のコマンドを実行。

M-x list-faces-display

 

すると、色の設定画面が開きます。見にくい色を見つけてEnter。ここではminibuffer-prompt が非常に見にくいので選択。

list-faces-display1.png

 

【Choose】という枠をEnterすると、色を選択することができます。見やすいいろを選びなおして、決めたら[Apply and Save]で保存します。

list-faces-display2.png

 

すると、.emacsに自動で以下のようなものが追記されます。

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(minibuffer-prompt ((t (:foreground "brightblue")))))

 

あとは、片端から見にくい色を変更していくのみです。こんな感じになりました。でめたしでめたし。

SnapCrab_NoName_2013-5-12_12-7-16_No-00.png

参考

11 May 2013, 11:47

黒背景のEclipseでめちゃガチャクールな男前に!目にも優しいEclipse-Juno-DarkプラグインとEclipse Color Themeの[Dark Juno]の設定方法
SnapCrab_NoName_2013-5-11_20-45-46_No-00.png

 

Eclipseの背景を黒画面にしたいとおもった。『Eclipse Color Theme』はエディタの色を変えてくれるが、枠組みまでは変えてくれない。そんななか、いろいろ調べてたらこんなものを発見!

Eclipse-Juno-Dark

おお!(∩´∀`)∩

なんだか名前からしてよさそうな感じなので、これを試す。Eclipse Color Themeプラグインの設定はここでは省略。

Eclipse-Juno-Darkインストール

まずは、githubからEclipse-Juno-Dark.zip を落とす。これは、プラグインとEclipse Color Themeのテーマの2点セットだ。

解凍して、plugins配下のEclipse_Juno_Dark_1.0.0.201208050344.jarをEclipseフォルダ配下にコピーして、Eclipseを起動。

色を黒にしよう

  • エディタの設定(Eclipse Color Themes theme-9645)
    • [ウィンドウ] > [設定] > [一般] > [外観] > [色テーマ] を選択。
    • [テーマのインポート]を選択。

これで、色テーマにDark Juno が追加されるので、DarkJunoを選択する。

  • 枠組みの設定(Eclipse-Juno-Dark)
    • [ウィンドウ] > [設定] > [一般] > [外観]

[テーマ] のところで [Eclipse Juno Dark]を選択。

  • コンソールの背景の設定
    • [ウィンドウ] > [設定] > [C/C++] > [ビルド] > [コンソール]

以下の用に、白黒逆転させる。ちなみに、黒は純粋な黒ではなくて、明るさを50にした黒がよい。

image

導入結果

どうだ!これであなたも、めちゃガチャ男前。

SnapCrab_NoName_2013-5-12_6-36-7_No-00.png

参考

追記 2014/1/15: これもオススメ

11 May 2013, 10:56

いつ変えるの?今でしょ!Windowsプログラマーのための『Ricty』『MacType』で最上級に美しいフォントに耽美しよう

最近、ターミナルの改造にハマっています。 最も美しいプログラミング言語用のフォントといわれている『INCONSOLATA』と、それを日本語用に最適化された『Ricty』をWindowsに導入してみました。 さらに、Windowsの表示をくっきりはっきりさせる『MacType』を導入をしました。

SnapCrab_NoName_2013-5-11_19-45-56_No-00.png

InconsolataとRictyの紹介

最も人気のあるプログラミングフォントの調査が2009年に行われ、1位になったのがこのInconsolataです。 Inconsolata

SnapCrab_NoName_2013-5-11_11-6-47_No-00.png

作者( Raph Levien)はConsolasという、Windowsに標準でついているフォントに感銘をうけて、このInconsolataを作ったそうです。

RictyはInconsolataを日本語表示のために最適化したものです。Inconsolataは日本語表示には適応されないため、『Migu 1M』というフォントと組み合わせることで、実現しているようです。 プログラミング用フォント Ricty 『Ricty』をWindowsに導入してみます。インストール方法は、Rictyの公式HPの手順にそって説明。

環境

  • Windows 7 x64

FontForgeのインストール

FontForgeとは、フォントのためのエディタです。Linux用のソフトなためめ、Windowsでつかうためにはみんな大好きCygwinを使います。Cygwinを使わない方法は、このサイトとかに方法が書いてある。(なとちゃんねる – Rictyフォントのインストール(windows7) ) 以下のサイトから最新版をダウンロードします。

解凍してCygwinにインストールします。

$ bunzip2 fontforge_cygwin-20090914.tar.bz2
$ tar xvf ffontforge_cygwin-20090914.tar
$ cd fontforge
$ ./doinstall

Ricty生成スクリプトのインストール

githubからRicty生成スクリプトの最新版を落としてきます。 $ git clone git://github.com/yascentur/Ricty.git

  • ricty_generator.sh

Inconsolataのインストール

Inconsolataをダウンロードします。OpenTypeファイルを選択します。 Inconsolata.otf ダウンロードしたら、Rictyスクリプトと同じディレクトリに移動。

Migu 1M のインストール

Migu 1M をダウンロードします。ココからダウンロード。

SnapCrab_NoName_2013-5-11_17-12-5_No-00.png

ダウンロードできたら、以下のの2つをRictyスクリプトと同じディレクトリに移動。

  • migu-1m-regular.ttf
  • migu-1m-bold.ttf

Rictyの生成

Rictyスクリプトディレクトリでスクリプトを実行します。

$ ./ricty_generator.sh Inconsolata.otf migu-1m-regular.ttf migu-1m-bold.ttf

まつこと数分で、以下のフォントファイルが生成されます。 (追記、Windows 7ならばこれでいけたけれども、XPだとこの方法でうまくいかなかった。なんだろう。Cygwinを利用しない方法ならばうまくいった)

  • Ricty-Regular.ttf
  • Ricty-Bold.ttf
  • RictyDiscord-Regular.ttf
  • RictyDiscord-Bold.ttf

開いてインストールを選択すれば、インストール完了です。

SnapCrab_NoName_2013-5-11_18-7-37_No-00.png

メモ帳にも『Ricty』『Ricty Discord』の2つが追加されました。 これがRicty。(´゚∀゚`)

SnapCrab_NoName_2013-5-11_18-24-38_No-00.png

MSPゴシックと比較。これは一目瞭然だ。(∩´∀`)

SnapCrab_NoName_2013-5-11_18-27-37_No-00.png

gdippを入れてさらに美しさパワーアップ

さまざまなWindowsソフト上でのテキスト描画を美しく滑らかにするソフト『gdipp』を入れます。これを入れることで、よりはっきりと文字が表示されるようになります。

インストールするだけで利用可能。ダウンロードは以下から。自分にあったインストーラを選んで、インストールします。

gdippはWindowsサービスとして起動するため、初回はサービスとして起動します。コントロールパネルから 管理ツール -> サービスを選択。gdipp service を選択して、[開始]を選択する。

gdipp導入前

SnapCrab_NoName_2013-5-11_18-24-38_No-00.png

gdipp導入後

SnapCrab_NoName_2013-5-11_18-38-40_No-00.png

よりはっきりして、うん、心なしか美しくなった気がする!!(゚∀゚ ;)

MacTypeを入れる

gdippの対抗馬として、MacTypeがあるらしい。比較のために入れてみる!!

インストールは、これもインストーラを入れるだけ。

起動モードがレジストリ・サービス・MacTrayとあるが、MacTrayを選択。これで、タスクトレイにMacTrayが常駐する。続いてプロファイルはiOSを選択。このプロファイルは、タスクトレイから変更可能。こうなった。

gdipp

SnapCrab_NoName_2013-5-11_18-38-40_No-00.png

MacType

SnapCrab_NoName_2013-5-11_19-8-9_No-00.png

gdippよりもはっきり!(・∀・) 個人的美的感覚を信じると、MacTypeの勝利。タスクトレイからいろいろと設定を変えられるのが便利だ。gdippはアンインストールします。さよなら。(^_^)/~。

開発環境への設定

mintty

Windowsでのターミナルとしては、minttyが最も美しいでしょう。(Cygtermはどうもゴツゴツしている)minttyで表示させてみました。 設定はOption -> Text -> Font から。また、[Looks]を選択して[Transparency]を[High]にすると、いい感じにスケスケになってエロいです。 こんな感じ。

SnapCrab_NoName_2013-5-11_19-50-37_No-00.png

Eclipse

つづいて、Eclipseにも設定。[ウィンドウ] > [設定] > [外観] > [色とフォント]を選択。

SnapCrab_NoName_2013-5-11_19-45-56_No-00.png

結論としては、RictyとMacTypeが最強だ。素晴らしい。美しいものは、素晴らしい。

参考

 

03 May 2013, 07:40

ShellExecuteをWindows7で実行したけど動かない時は”L”をつけてUniCode対応する

C++からShellExecuteを利用して、Windowsプログラムを起動しようとしたが、起動しない。

環境

  • Windows 7 64bit.
  • Visual Studio  Expess  2012
int main(int argc, char* argv[])
{
   ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOWNORMAL);
   return 0;
}

ShellExecuteの定義であるShellExecute 関数を見て,LPCTSTR型でキャストしても動かない。困ったときのネットにも、助けになるような情報がない。

それでも頑張って調べてみると、文字列にはプレフィックスとして”L”を追加する必要があるらしい。これを、ワイド文字列いう。Unicodeを示すための型らしい。以下のページが詳しい。

文字セットとTCHARと

というわけで、こんなふうに変更すればよい。

int main(int argc, char* argv[])
{
    ShellExecute(NULL, L"open", L"notepad.exe",NULL,NULL,SW_SHOWNORMAL);
    return 0;
}

これで、動作するになった。めでたしめでたし。

UniCode対応しなければよいとうい手もある

そしてこれは、Windowsプログラミングの常識らしい。常識だからネットで調べてもないわけだ。

これを意識しない方法もある。Visual Studioのプロジェクトの

  • プロパティ -> 全般 -> 文字セット
  • マルチ バイト文字セットを使用する

を選択すると、OK.これで、以下のようなコードでも動作する。

int main(int argc, char* argv[])
{
    ShellExecute(NULL, (LPCSTR)"open", (LPCSTR)"notepad.exe",NULL,NULL,SW_SHOWNORMAL);
    return 0;
}

わけがわからない、winodwsプログラミング。。。。

追記 130819

すでに変数に格納した文字を変換するためには、mbstowcs_sを使います。これで、ピンポイントで文字列を変換できる。

02 May 2013, 17:47

わずか8行でつぶやける!!Rubyのtwitterライブラリを使って、コンソールからつぶやくRubyスクリプトがお手軽すぎた

Rubyスクリプトで、twitterにつぶやきたいとおもった。コンソールから

$ twitter.rb ” Hello Twitter !!”

みたいな感じでつぶやきたい。Rubyならば絶対にそんな便利ライブラリがあるだろうと思って探してみたらあった。

Ruby Twitter Gem

あった! Ruby Twitter Gemというもの。

さすが、Ruby (*’∀’人)

早速インストール

$ gem install twitter

詳しいマニュアルはここが詳しい。

Route 477 – Ruby Twitter Gem簡易リファレンス

さっそく作ってみる!!

このサイトを参考にして、早速作ってみる。

Twitter Ruby Gem の非スレッドセーフ API は使うべきではない #Ruby #twitter – Qiita [キータ]

デスクトップからつぶやくためには4つの認証キーが必要。

  • ConsumerKey
  • ConsumerSecuret
  • AuthAccessTokenKey
  • AuthAccessTokenSecret

以前作成したものをそのまま流用する。

twitcurlでWindowsのデスクトップからホットキーでtwitterにtweetする | Futurismo

いろいろとやること数分・・・

完成!(・∀・)  わずか8行!

twitterでつぶやくには、updateを使う。他にも豊富すぎる機能があるけれども、つぶやくだけならコレで十分。

使い方は、twitter.rbをパスが通ったところに置いて、実行権限を与える。

$ chmod u+ x twitter.rb

$ mv twitter.rb ~/bin/

コマンドラインからこんな感じで使う。

$ twitter.rb “Hello Twitter!!”

これはお手軽だ。Rubyスゲー。

難点は、実行時間がけっこうかかること。環境のせいだろろうか(・・?10秒以上は応答が帰ってこない。&をつけて、バックグラウンド起動すれば、問題ないかな。。

$ twitter.rb “さすがにそろそろ寝よう” &

02 May 2013, 16:41

Visual Studio 2012に GoogleMockを導入したメモ

Visual StudioにGoogleMockを導入する手順も忘れないようにメモしながら入れてみようと思います。GoogleTestはGoogleMockの中に含まれるので、GoogleMockを入れれば、GoogleTestもついてくる。一石二鳥、早起きは三文の得、結構毛だらけ猫灰だらけだ。

導入環境

  • Windows 7
  • Visual Studio Express 2012  for Windows Desktop
  • GoogleMock 1.6.0

GoogleMockをダウンロード

GoogleMockをダウンロードしてきて、適当な場所に置きます。

https://code.google.com/p/googlemock/

Visual StudioでGoogleMockをビルド

Visual StudioでGoogleMockをビルドします。

まずは、msvc/2010配下に移動してフォルダの読み取り専用属性を外します。右クリックから[プロパティ] > [読み取り専用]のチェックを外す。

次に、gmock.slnをVisual Studioで起動します。Visual Studioの変換ウィザードが立ち上がり2010が2012用のプロジェクトに変換されるはず。

上のツールバーから[ビルド] > [ソリューションのビルド]でビルドまたは、F7で。そうすると、エラーが出まくるはず(´・ω・`)

以下のサイトに、解説方法が載っている。感謝しながらヘッダファイルを修正しよう。gmockだけど、gtestのファイルを修正する。

ブログズミ: Visual Studio 11 Beta で Google Test を使う

gmock\gtest\include\gtest\internal\gtest-port.h

ただし、GoogleTestならばこれでうまく行くけれども、GoogleMockは軽薄な奴なので、そうはいかない。追加で修正。

ソリューションエクスプローラに並んでいるプロジェクト(gmock,gmock_main,gmock_test)のプロパティを右クリックで開き、[構成プロパティ] > [C/C++] > [プリプロセッサ] >[プリプロセッサの定義]を選択して、以下のdefineを追加する。

_VARIADIC_MAX=10

image

gmock\msvc\2010\Debug\gmock_test.exeができるので、とりあえず動かしてみて、テストが走ればコンパイル成功。以下のライブラリが作成されます。

  • gmock.lib
  • gmock_main.lib

GoogleMockを使いたいプロジェクトの設定

GoogleMockを使いたいプロジェクトをVisual Studioで起動します。プロジェクトのプロパティを以下のように修正。gtestはgmockに含まれるので、ライブラリは必要ないことに注意。

  • gmockとgtestのインクルードディレクトリを設定 
    • C/C++ -> 全般 -> 追加のインクルードディレクトリ
      • \gmock-1.6.0\include
      • \gmock-1.6.0\gtest\include
  • gmock ライブラリを追加(gtestライブラリの代わり)
    • リンカー -> 全般 -> 追加のライブラリディレクトリ
      • \gmock-1.6.0\msvc\2010\Debug
    • リンカー-> 入力 -> 追加のライブラリ
      • gmock.lib
      • gmock_main.lib
  • ランタイムライブラリの修正
  • C/C++ -> コード生成-> ランタイムライブラリ
  • マルチスレッド デバッグ (/MTd)

また、_VARIADIC_MAX=10もプリプロセッサに追加する。

Debug用のメイン関数に をインクルードする。また、main関数に、    ::testing::InitGoogleMock(&argc, argv);を追加。

#include "stdafx.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>

 
int _tmain(int argc, _TCHAR* argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
 ::testing::InitGoogleMock(&argc, argv);
    return RUN_ALL_TESTS();
}

サンプルコードまで書こうとおもったけど、疲れたので今日は終わり。参考リンクを下にいろいろ貼っておきます。

参考

02 May 2013, 12:26

Visual Studioプロジェクトでの版数管理で無視する.gitignoreメモ

Visual Studioをいじりはじめた。いろいろと不明な拡張子がある。gitで版数管理をするためには、.gitignoreを作成する必要があるのだけれども、なにがなんだかわからないので、ちょっと整理。

*.snoについて

プロジェクトディレクトリに*.snoができる。これは、各開発者が IDE に行ったカスタマイズか入っている。不要。

*.userについて

プロジェクトのディレクトリ配下に、.csproj.userや*.vbproj.userができる。

これは、開発者固有のプロジェクト オプション、および参照されるアセンブリを設定するために IDE が使用する任意の参照パスが含まれている。不要。

ipchとsdfについて

これは VS2010からデキるようになった、キャッシュデータベースらしい。けっこう容量を食う。検索やインデックスなどなど、さまざまな情報をあらかじめ蓄えておく役割があるみたい。不要。

その他、ビルドしたときに作成される DebugとReleaseもいらないな。(その中に含まれるexeファイルも)

というわけで、30分くらい調査した結果はこうなった。ベースは、github上のC++の.gitignore。

https://github.com/github/gitignore/blob/master/C%2B%2B.gitignore

もう少し変更するかも。

 

参考

02 May 2013, 05:26

Rubyのpty,expectで同一wordをwaitすると出力が止まる

Rubyからexpect & ptyを組み合わせてtelnetをする方法を記事にした。多段telnetをすると、出力に処理結果が表示されないことに気づいた。pyt.getptyでも、pty.spawnでも同じ。多段sshも同じ。

Ruby から サーバ上にパスワードなしでtelnetログイン(expect,pty) | Futurismo

正確にいうと、初めはちょろっと出力されるが、途中から表示されなくなる。echoコマンドだと6コまで表示されて、pwdコマンドを実行すると、2つまでされた。この違いはなんだろう(・・?

表示されてないだけで、処理自体は動いているようだ。バックグラウンド処理(&)として起動すると、ちゃんと出力される。

また、多段telnetでない場合は問題なくexpectが動作する。多段にすると、失敗する。

いろいろと実験して、解決方法を探ってみたが、結論はわからなかった。

原因

expectで同一wordをwaitしていると、初めのwordをexpectした時点で、後ろのexpectも動作する。一気に動作するために、表示に間に合わに終了するため、動作していないように見えた。(echo と pwdで差がでたのも実行時間のせい)

これだとダメ。同一の”tsunera-virtual-machine”

r.expect(“tsunera-virtual-machine”){ w.puts “echo  ‘hello’” }
r.expect(“tsunera-virtual-machine”){ w.puts “echo  ‘hello’” }
r.expect(“tsunera-virtual-machine”){ w.puts “echo  ‘hello’” }
r.expect(“tsunera-virtual-machine”){ w.puts “echo  ‘hello’” }
r.expect(“tsunera-virtual-machine”){ w.puts “echo  ‘hello’” }
r.expect(“tsunera-virtual-machine”){ w.puts “echo  ‘hello’” }

これだとOK.期待文字列がかぶってないので。

r.expect(“hello”){ w.puts “echo  ‘hello1’” }
    r.expect(“hello1”){ w.puts “echo  ‘hello2’” }
    r.expect(“hello2”){ w.puts “echo  ‘hello3’” }
    r.expect(“hello3”){ w.puts “echo  ‘hello4’” }
    r.expect(“hello4”){ w.puts “echo  ‘hello5’” }
    r.expect(“hello5”){ w.puts “echo  ‘hello6’” }
    r.expect(“hello6”){ w.puts “echo  ‘hello7’” }

不思議なのは、前回記事にした Smart-Compileを経由したスクリプト実行だとうまくいく。

EmacsでRubyの開発環境をめちゃガチャパワーアップしたまとめ | Futurismo

このへんに解決の糸口がありそうだが、お腹がすいたので今日はここまで。

追記 解決 13/08/11

いろいろ試行錯誤して、うまくいく方法を見つけました。

waitで止まったように見えていたが、実はウラで動いていたよう。標準出力に出力されていないだけだっだ。

{|c| print c}

telnetした結果を表示するためには、waitforを以下の形式で書けば良い。

telnet.waitfor(/*****/){ |c| print c }

{|c| print c}で標準出力を出力する。

telnet.cmdてはなくて、telnet.puts

多段telnetをするとき、telnet.cmd(“hogehoge”)で実行すると、”hogehoge”コマンドの出力を待ち続けるために、エラーする。telnet.cmdではなくtelnet.putsを利用することで、出力を待つことがなくなる。

STDOUT.sync = true

STDOUT.flushを実行すると、バッファにたまっている出力が吐出されるので、よりリアルタイムに画面出力させることができる。

コマンドを実行するたびに、これを打つのは面倒なので、常時リアルタイムで出力するよう、おまじないを書く。

STDOUT.sync = true