06 Jul 2013, 13:47

GoogleCLを利用してWindowsのデスクトップからドラッグ&ドロップでpicasaに画像投稿するバッチスクリプト

ブログの画像はPicasaで管理しているので、コマンドラインからサクッと画像をアップロードできないかなと調べていたらいいものを発見した。

GoogleCL

[toc]

環境

  • Windows 7
  • Python 2.7.3

GoogleCLとは

GoogleCLとは、コマンドラインからGoogleのサービスを利用するためのツール。

インストール

以下の3つが必要。

  • python 2.6
  • gdata-python-client(Google Data APIs Python Client Library)
  • googelcl(Command line tools for the Google Data APIs)

pythonのインストールは省略。

gdata python Clientのインストール

サイトから最新版をダウンロードしてきます。

解凍してインストールする。

 $ tar zvxf gdata-2.0.18.tar.gz
 $ cd gdata-2.0.18
 $ python setup.py install

googleclのインストール

サイトから最新版をダウンロードしてきます。

解凍してインストールする。

$ tar zvxf googlecl-0.9.13.tar.gz
$ cd googlecl-0.9.13
$ python setup.py install

とりあえず使ってみる

使い方はここに書いてある。

https://code.google.com/p/googlecl/wiki/Manual

サンプルで、google Calenderを利用してみる。コマンドプロンプトから

>python "C:\Python26\Scripts\google" calendar add "Lunch with Jim at noon tomorrow"

エラーした。無念。。。

Traceback (most recent call last):
  File "C:\Python26\Scripts\google", line 5, in <module>
    pkg_resources.run_script('googlecl==0.9.13', 'google')
  File "C:\Python26\lib\site-packages\setuptools-0.6c11-py2.6.egg\pkg_resources.py", line 489, in run_script
  File "C:\Python26\lib\site-packages\setuptools-0.6c11-py2.6.egg\pkg_resources.py", line 1207, in run_script
  File "c:\python26\lib\site-packages\googlecl-0.9.13-py2.6.egg\EGG-INFO\scripts\google", line 849, in <module>
    main()
  File "c:\python26\lib\site-packages\googlecl-0.9.13-py2.6.egg\EGG-INFO\scripts\google", line 835, in main
    run_once(options, args)
  File "c:\python26\lib\site-packages\googlecl-0.9.13-py2.6.egg\EGG-INFO\scripts\google", line 588, in run_once
    setattr(options, attr_name, safe_decode(attr, googlecl.TERMINAL_ENCODING))
  File "C:\Python26\lib\site-packages\googlecl-0.9.13-py2.6.egg\googlecl\__init__.py", line 261, in safe_decode
    return string.decode(current_encoding, errors)
LookupError: unknown encoding: cp65001

コマンドプロンプトのエンコードをUTF-8からShift-JISにしてみる。

chcp 932

これでうまくいく。

初回時、ブラウザが立ち上がり認証画面がでる。認証して、コマンドプロンプトに戻ってEnter.

Googleカレンダーで見てみると・・・。

おお!

Google Picasa に写真をアップロード

目的のGoogle Picasa に写真をアップロードする。 アップロードするためのコマンドは、”google picasa post”

# Futurismo アルバムに SnapCrab_NoName_2013-7-6_20-0-17_No-00.pngファイルをアップロード
 python "C:\Python26\Scripts\google" picasa post Futurismo SnapCrab_NoName_2013-7-6_20-0-17_No-00.png

やったー!成功だー  \(^o^)/

 batにまとめる

バッチスクリプトにすれば、もっとラクチンになるはず。ディレクトリ配下の画像をドラック&ドロップで送信。

@echo off
chcp 932
python "C:\Python26\Scripts\google" picasa post Futurismo "%*"

投稿したURLを取得するには、以下。

python "C:\Python26\Scripts\google" picasa list --fields=url-direct --query "SnapCrab_NoName_2013-7-6_20-0-17_No-00.png"

これを組み合わせて、投稿した画像をブログ用URLに変換する。

@echo off

chcp 932
set file=%*

rem Picasaに投稿
python "C:\Python26\Scripts\google" picasa post Futurismo "%file%"

rem URL取得
for /f "usebackq tokens=*" %%a in (`python "C:\Python26\Scripts\google" picasa list --fields=url-direct --query "%file:C:\Users\TSUNEMICHI\Desktop\=%"`) do @set x=%%a

rem 変換
echo "<img src="%x%" />"

pause

追記: 画像を投稿してから、しばらく時間が立たないと、URLの取得ができないようだ。正確な時間はまだわからない。

参考

30 Jun 2013, 13:04

サイトデザインを変更しました!WordPress用テンプレート賢威6.0カスタマイズメモ

オシャレしたいお年ごろなので、今日は賢威6.0というテンプレートを使ってブログをカスタマイズしました。

作業メモをつらつらと綴ります。

[toc]

全体

WordPress 賢威の設定

WordPressの管理画面のツールバー ->賢威の設定 から基本的な設定を行う。

  • カラムは2カラムにする。
  • レスポンシブWebデザインを有効にする。これで、iPadやiPhoneで閲覧したとき、1カラムになる。WP touchは無効にしておく。
  • メタキーワード/メタスクリプションを無効にする。。All in one SEO packを利用しているので。
  • グローバルメニューの選択を設定。自分が作成したメニューをトップページに表示。

ソーシャルボタン非表示

ソーシャルボタンは、WordPress Pluginの Social Bookmark lightを利用するので、賢威のは削除。

social-button.phpからソーシャルブックマーク表示用の部分をコメントアウト。

<!--
<ul class="sb m20-b">
<li class="sb-tweet"></li>
<li class="sb-hatebu"></li>
<li class="sb-gplus"></li>
<li class="sb-fb-like"></li>
</ul>
-->

スクロールしてもついてくるソーシャルボタンを設置

スクロールしてもついてくるソーシャルボタンは、ウィジェットのテキストに、以下を入力すればよい。

<div style=”position: fixed; bottom: 5px; left: 3px;”>
ここに任意のタグを入れる
</div>

設置位置は、bottom/top または、left/rightで調節する。pxの他、%でも位置していできる。

フッターはデフォルトだと、わけわからない会社情報が表示されるので、カット。footer.phpを修正。

<!–/アドレスエリア–> で囲まれている部分をコメントアウト。代わりに、カテゴリとアーカイブを表示する。これはイマイチだな。あとで変更予定。

<div class="area01">
<h2>アーカイブ</h2>
<div class="footer-menu">
     <ul>
     <archives/hp wp_get_archives('show_post_count=yes'); ?>
     </ul>
</div>
</div>

<div class="area02">
<h2>カテゴリ</h2>
<div class="footer-menu">
     <ul>
     <archives/hp echo str_replace('<a','<a rel="nofollow"',wp_list_categories('hierarchical=0&title_li=&show_count=1&echo=0')); ?>
     </ul>
</div>
</div>

記事(single.php)

zenback設置・GoogleAdsense設置

single.phpを編集して、  <archives/hp the_content(); ?>の下あたりに設置する。

公開日、最終更新日の表示

それぞれ、wordpressでは以下の関数が用意されている。

  • 公開日取得 :the_time()

  • 最終更新更新日: get_lastpostmodified()

こんな感じで利用する。

<p>公開日:<archives/hp the_time('Y年n月j日') ;?></br>
最終更新日:<archives/hp echo mysql2date('Y年m月d日', get_lastpostmodified(), false); ?></p>

PV数の表示

PV数を表示するためには、「WordPress Popular Posts」 Pluginを利用する。

プラグイン有効化開始から計測される。viewを表示するためには、以下のコードを任意の場所に貼り付ける。

<archives/hp if ( function_exists ( 'wpp_get_views' ) ) { echo '<span class="wpp-views">' . wpp_get_views ( get_the_ID() ) . '</span> views'; } ?>

参考:

WordPress:全記事にPV数を表示する方法メモ | 情報科学屋さんを目指す人のメモ

トップページ(index.php)

最新情報のサムネイル非表示

index.phpの以下の部分を変更

変更前:
<archives/hp newposts_keni(5,1,1,"year"); ?>
変更後:
<archives/hp newposts_keni(5,1,0,"year"); ?>

最新情報のコメントのあたりにある。

<!--最新情報-->
<h2><archives/hp _e('Latest Info','keni') ;?></h2>
<div class="contents">
<dl class="news">
<archives/hp newposts_keni(5,1,0,"year"); ?>
</dl>

スタイルシート(*.css)

githubっぽくする

表示をgithubのReadmeっぽくします。最近は MarkdonwPadの markdownpad-github.cssを利用して記事の下書きを作成しているので、ブログの方もこのスタイルシートに合わせます。

以下からスタイルシート取得。

横幅を可変にする

このブログでは、ソースコードを貼り付けることが多いので、横幅がdefault 950pxだと小さい。なので、これを1200pxまで拡張して広々と使いたかった。

横幅は、賢威テンプレートメーカーからテンプレートをダウンロードする際に設定できる。でも、このデフォルト設定だと、ブラウザの横幅を狭めた時に動的にサイズが小さくなってくれなかった。(´・ω・`)

レイアウトは、layout.cssで定義されている。min-widthでpxを指定するのではなく、%で指定することにした。余白を考慮して、全体の幅をwidth 100%; コンテンツを width 90%;とする。

/*--------------------------------------------------------
2カラムレイアウト
--------------------------------------------------------*/

.col2 #container,
.col2 #top,
.col2 #header,
.col2 #global-nav,
.col2 #main,
.col2 #main-image,
.col2 #footer,
.col2 .copyright,
.col2r #container,
.col2r #top,
.col2r #header,
.col2r #global-nav,
.col2r #main,
.col2r #main-image,
.col2r #footer,
.col2r .copyright{
    width: 100%;
/*
    min-width: 1200px;
*/
}

.col2 #top-in,
.col2 #header-in,
.col2 #global-nav-in,
.col2 #main-in,
.col2 #main-image-in,
.col2 #footer-in,
.col2 .copyright p,
.col2r #top-in,
.col2r #header-in,
.col2r #global-nav-in,
.col2r #main-in,
.col2r #main-image-in,
.col2r #footer-in,
.col2r .copyright p{
    width: 90%;
/*
    width: 1200px;
*/
    margin: auto;
}

今日は、こんなところで。

27 Jun 2013, 13:45

Eclipse年次バージョンアップ時の移行方法について調べた

Eclipse Keplerもリリースもリリースされたことなので、Junoから移行しようと思います。 

Eclipseで異なるバージョンに移行するさいの手順についてメモします。Eclipseは年次アップデートがあるので、一年単位で必要になるはず。

workspaceの移行

workspaceの移行は簡単。Eclipse起動時に、workspaceを選択すればよい。workspaceの中に.metadataというメタデータがあり、ここにプロジェクト固有の設定か保存されてる。

プラグインの移行

プラグインはネットからダウンロードし直す。Eclipseからダウンロードしたプラグインは移行が簡単。

ツールバーから

  • ファイル -> インポート
    • インストール -> 既存イインストールから

を選択。

次に、元のアプリケーションのインストールで旧Eclipseのルートディレクトリを選択。

すると、旧Eclipseにインストールしていたプラグインがズラズラと並ぶ。あとは,インストールするだけ。

ただ、この方法だと手動でインストールしたプラグインは移行できない。手動プラグインは再度手動インストールする。

eclipseには、 plugin と dropinディレクトリがある。手動プラグインをインストールする場合は、dropinディレクトリの方に入れて、自動インストールプラグインとは区別する。

設定の移行

  • 旧Eclipseのツールバーから ファイル -> エクスポート -> 設定 -> 一般 -> 設定 でエクスポート。

  • 新Eclipseのツールバーから ファイル -> インポート -> 設定 -> 一般 -> 設定 でインスポート。

これで、フォーマッタの設定やら、キーバインドやらを移行できる。

eclipse.iniの移行

eclipse起動ファイルに独自の設定をしている場合は、これも新Eclipseにコピーする。

26 Jun 2013, 23:35

Eclipse 4.3 Kepler(ケプラー)がリリース

Eclipseの最新版 Kepler(ケプラー)がリリースされました。

SnapCrab_NoName_2013-6-27_8-20-21_No-00

Marge Doc プロジェクトも早速対応しているようです。日本語版のダウンロードは Pleades All in One ダウンロードが便利。

Pleiades – Eclipse プラグイン日本語化プラグイン | MergeDoc Project

起動画面。緑色で、気持ち悪くなりました。

SnapCrab_NoName_2013-6-27_8-22-22_No-00

起動完了の画面。4.2 Junoと同じですね。

SnapCrab_CC   - testtestssampleTestcpp - Eclipse_2013-6-27_8-23-48_No-00

新機能は、以下のサイトが詳しいです。CDT観点だと、パフォーマンスが向上したくらいか?あとでもうちょっと調べてみる。

追記:CDT8.2の新機能はここにまとまっている。

参考記事

23 Jun 2013, 13:54

美しさは細部のコーディングスタイルに宿る!Eclipseのコード・フォーマッタで自動整形する

if分やfor文でのカッコの場所について、自分のコードが場所によってバラバラだったので、そろえようとおもった。初めは手動で直していたけど、手動で見直すのは不可能なことに100ステップくらいで気づく。

自動でコードのフォーマットを修正するツールはないものかと探して見た所、Eclipseの機能でそのようなものがあったのでメモメモφ(..)

Eclipseでのコードフォーマット設定方法

ショートカットでいける。全選択して、 Ctrl + Shift + F。

これで、一気に統一されたフォーマットに自動整形される。グレイト。

独自フォーマットを設定する

ツールバーから以下を選択。

  • ウィンドウ -> 設定
  • C/C++ -> エディター -> コード・スタイル -> フォーマッタ

デフォルトでテンプレートが用意されているwikipediaが詳しい。

字下げスタイル – Wikipedia

  • K&R(カーニハン・リッチースタイル)
  • BSD(オールマンスタイル)

独自フォーマットは 新規を選択して、テンプレートを元に作成すればよい。Eclipseはグラフィカルに確認しながら設定できるところがよい。

独自フォーマットはエクスポートやインポートもできるので、コーディングスタイルをチーム内で共有できる。自分のチームはみんなEclipse使わないから意味ないけど。

ちなにみ、Eclipse JDTだと保管アクションでフォーマットを適応することができるけれども、CDTではできないようだ。残念。。

Format C/C++ code on save – Stack Overflow

Eclipse以外の方法

これは調べただけでためしていないけれども、以下のコードフォーマッタがオープンソースで使えそう。

参考

23 Jun 2013, 13:05

なかぬなら、なかせてみせようkarotzくん

前回、karotzがなかなか使えない子なことがわかりました。

ぼくらの家にkarotzがやってきた | Futurismo

そこで、調教します!ヽ(`Д´)ノ

karotz API を利用

karotzを操作するためのAPIが提供されています。これを利用すると、

  • 耳を動かす
  • きく
  • はなす
  • 光る
  • 見る(WebCam)

などなど、いろんなことを指示できるみたい。

REST,JavaScriptがAPIとして用意されている。詳しくは以下。

どっちのAPIも使いこなせそうになかったが、APIをrubyでラッパーしたgemを見つけたので、今回はRubyを利用してkarotzを操作することにした。

とりあえず、Hello Worldさせてみた

まず初めの一歩はHello Worldからと決まっているので、こんにちはを喋らせた。

以下の記事を参考に使ってみる。

Karotz + Ruby = Love | ☠ nofail

Interactive Keyの取得方法

karotzを操作するためには、Interactive Keyという番号が必要。これは操作するたびに取得が必要。(15分のみ有効らしい)Ineractive keyの取得のためには、以下の3つの情報が必要。

  • API Key
  • Security Key
  • Install Key

以下のページをサイトに設定する。

Key取得方法

  • サイトにアクセスして右上のLabを選択する。
  • Resister an applicationを選択
  • アプリケーションを登録するための情報を入れてSave。適当に埋めれば良いが、Application Nameだけ、あとから変更ができないため注意すること!

    + API KeyとSecurity Keyが画面に表示されるので、メモする。

  • Update Codeを選択して、zip形式に圧縮したdescriptor.xmlをアップロードする。このdescriptor.xmlがアプリの基本情報のようなもの。メモ帳かなんかに作成して、圧縮すればよい。詳しい意味は、公式Docを。

    <descriptor>
      <version>0.0.1</version>
      <accesses>
        <access>tts</access>
        <access>ears</access>
        <access>led</access>
        <access>multimedia</access>
      </accesses>
      <deployment>external</deployment>
      <parameters>
        <parameter key="showInstallUuid" value="true"/>
      </parameters>
    </descriptor>
    

  • Make Privateを選択して非公開に。
  • Test!を選択。画面が遷移して、InstallIDが表示される。メモする。

Rubyスクリプトの作成

Ruby gemを取得。

gem install karotz

スクリプトはこんな感じ。

require 'karotz'

Karotz::Configuration.configure do |config|
  config.install_id = '**********************'
  config.api_key    = '**********************'
  config.secret     = '**********************'
end

Karotz::Client.session do |karotz|
  karotz.ears
  karotz.led
  karotz.say
end

動作させると、耳を回して、testと話す。

しかし、test!としか喋れないことが発覚!Σ(゚Д゚ )

しかたがないので、githubからソースをcloneしていじることにした。それにしても、ライセンスはビールをおごることらしい(THE BEER-WARE LICENSE)。さすがはドイツ人。

git clone https://github.com/phoet/karotz.git

これで、指定した言葉を喋れるようになった。CygwinでRubyを動作させると、実行速度に難点が。。。

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

23 Jun 2013, 12:11

ぼくらの家にkarotzがやってきた

ぼくらの家にkarotzがやってきた

夏のボーナスでフランス製の電子ぬいぐるみ karotzを買った。

[toc]

karotzってなに?

karotzとは、フランス製のうさぎ型ロボット。

Karotz, smart wifi rabbit, new version of Nabaztag

第三世代のロボットらしく、第二世代まではNabaztagと言われたらしい。ちなみに、第10世代をドラえもんという。サボートが打ち切られたり、売っている会社が倒産したりと、いろいろ苦労しているみたい。過去の黒い歴史はこの記事が面白かった。

Karotzさんといっしょ – ssogabeの日記

amazonで注文して5日で来た。ハヤッ!25000円。ちなみに、本家サイトは在庫切れ。また潰れないよね?

karotzの設定方法

ウェブドキュメントに従って初期設定をします。

http://www.karotz.com/plug/download

サイトからファームをダウンロードして、それを一旦USBメモリに保存する。ダウンロード時にwifiに接続するためのSSIDとパスワードの入力が必要。

その後karotzくんのおしりのあな(にあるUSBメモリ差込口)に、、メモリを差し込んで起動する。

すると、立ち上がり時にインストールがはじまる。数分間立って、インストール完了。その後は、いろいろとガイダンスが音声で流れて、最後に I’m Ready!となってインストール完了。

プラグインで拡張する

karotzの管理はすべてWeb画面から。karotzはいろんなプラグインを入れることで拡張できる。iPhoneみたい。

twittierを読み上げたり、時間や天気予報を教えてくれたり、音楽を流してくれたりできる。

他にもJenkinsのビルドエラーを通知するXDFにも使えるっぽいけど、この子はかわいいので会社に置き去りにするわけにはいかない(というか会社で使えない(T_T))

日本時間の設定

時刻設定をしないと、時間を教えてくれたり目覚まし機能が使えないので設定する。

http://www.karotz.com/my/information/personal

ココにアクセスしてtimezone を 「Asia/Tokyo」に設定する。

操作方法

普段は緑の点灯状態で待機。頭のボタンを押すとおなかがオレンジ色になって、音声認識モードになる。ここでいろいろ指示を出して操作する。

操作を中断する場合は、頭のボタンを3回押す。

購入時に、mini karotzがついてくるが、これは音声以外で操作をするために使う。

ウェブ画面から、minikarotzに対応させるアプリを割り当てる。mini karotzをkarotzのハナのあたりにもっていくと、karotzくんが匂いを嗅いで、割り当てた処理を実行してくれる。

感想

うん、こんな拡張性じゃあ正直物足りないなぁ。期待はずれ。

かわいいだけじゃ、Siriに勝てないぞ!!

20 Jun 2013, 10:32

gdbserverを立ちあげてリモートデバッグする方法メモ

プログラムの勉強をする開発環境は今までCygwinを利用していたが,最近はvmware上のCentOSに乗り換えた。

C言語のコードを編集するときは、Windows上でEclipseを起動してsamba経路でソースを編集してる。コンパイルを実施するときは、ssh接続でリモートシェルを起動している。

今回、gdbをEclipseから利用する方法を調べてみた。利用するのは、

gdbserver

デバッグ対象のプログラムを実行しているマシンとは異なるマシン上で GDB を実行することを可能にするプログラム。

環境

  • ターゲットPC CentOS 6.4
  • ホストPC Windows 7 (Cygwin)

gdbserverをインストールする

なにはともあれ、まずはgdbとgdbServerをターゲットPCにインストールする

yum -y install gdb
yum -y install gdb-gdbserver

Cygwinのgdbからgdbserverに接続してリモートデバッグ

CentOS上でgdbserverを立ちあげて、Windows上のCygwinで動作してているgdbからTCP接続でアクセスします。

gdbserverの起動

gdbserverの起動のための書式は以下。

gdbserer (ターゲットIP):(ポート番号) (プログラム) [引数]

例えば、hogehoge.exeをポート8081で起動する場合、

[tsu-nera]% gdbserver locallhost:8081 hogehoge.exe
Process hogehoge.exe created; pid = 3739
Listening on port 1234

これでホストPCからの接続を待っている状態になる。

ちなにみ、ポートが開いていない場合は開けておく。

sudo emacs  /etc/sysconfig/iptables
# for gdbserver
  -A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT

gdbクライアントからgdbserverに接続

クライアント側でも、gdbを起動。Cygwin上のgdbを利用して、samba経路でhogehoge.exeを起動する。

gdb hogehoge.exe

リモートのターゲットに接続するためには、以下を入力。

(gdb) target remote saru:8081
Remote debugging using saru:8081
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB.  Attempting to continue with the default i386 settings.

接続完了。あとはお好きな様に。

Eclipseからgdbserverに接続してリモートデバッグ

Eclipseには、高機能なGUIインタフェースのgdbが付いている。コレを使用する。

  • プロジェクトを右クリック -> デバッグ -> デバッグの構成
  • C/C++リモート・アプリケーション -> 新規 を選択。
  • C/C++アプリケーションで、sambaから見えている実行ファイルを選択。
  • 同じビューの下のほうにある、GDB(DSF) Manual Remote Debugging ランチャーを選択。
  • デバッガータブを開き、接続タブを選択。
  • 型でTCPを選択。ホスト名とポートも入力。
  • 最後に、デバッグを押して完了。

ソースが見えないときは、ソース・ルックアップパスの設定でパス・マッピングをする。例えば、sambaでZ\ドライブに/home/tsu-neraを割り当てている場合、Z\と/home/tsu-nerを割り当てる。

これで、Eclipseから見えるはず!!!(`・ω・´)ゞ

とおもったが、breakpointをはってもgdbが止まってくれない。。。(T_T)

ステップ実行も変数の値の書き換えもできるが、ブレークポイントでトマラない。。(T_T)

5時間頑張って、今日は挫折した。このくらいで許してよ。orz

追記: gdb traceをみてみると、以下のエラー。どうやら、ソースが見えない??

789,439 26-break-insert --thread-group i1 -f /home/tsu-nera/repo/vxUnit/vxUnit/test/Testhogehoge.c:2\
4
789,510 &"No source file named /home/tsu-nera/repo/vxUnit/vxUnit/test/Testhogehoge.c.\n"
789,513 26^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="<PENDING>",pending=\
"/home/tsu-nera/repo/vxUnit/vxUnit/test/Testhogehoge.c:24",times="0",original-location="/home/tsu-ne\
ra/repo/vxUnit/vxUnit/test/Testhogehoge.c:24"}
789,513 (gdb) 

参考

19 Jun 2013, 23:00

プログラマ必読!「UNIXという考え方―その設計思想と哲学」でUnix哲学の真髄と美徳を学ぶ

「UNIXという考え方―その設計思想と哲学」という本を読んだ感想です。

Unix哲学とはなにか

Unix哲学とはなにか?そんな「Unixらしさ」という暗黙知を言葉で書こうとした本だ。

  1. スモール・イズ・ビューティフル
  2. 一つのプログラムには一つのことをうまくやらせる
  3. できるだけ早く試作を作成する
  4. 効率より移植性
  5. 数値データはASCIIフラットファイルに保存する
  6. ソフトウェアの挺子を有効に活用する
  7. シェルスクリプトを使うことで挺子の効果と移植性を高める
  8. 過度の対話的インタフェースを避ける
  9. すべてのプログラムをフィルタにする

細かい内容については、Web上でいろいろと書かれているので、リンクをまとめておく。

内容は、まずはUnixとはこのようなものだという定理を示し、それに対する体験談や具体例を上げながら説明されていく。エッセイのようだ。

Unixらしさについて

以下、名言だと思ったことに対する抜き出しと、自分の感想を述べる。

Small is beautiful

小さいことは素晴らしいということ。

小さいとわかりやすい、フィルタとして扱いやすい、移植性が高い・・・などなど。プログラムが小さいと、Unixにとっての美徳を十分に発揮できる。だから、美しい?ということ。

自分でシェルスクリプトを書くときも、なるべく小さな、単一の機能を持ち、フィルタとして動作するような、軽量スクリプトにするように心がけたい。

数値データはASCIIフラットファイルに保存する

Unixでは、設定ファイルがテキスト形式。Windowsに慣れ親しんでた自分には、Linuxのこのようなテキスト設定ファイルの編集は驚いた。これは、移植性を考えてのことだったのかと、納得。

独自フォーマットは移植性が低い。テキスト形式は移植性が高い。

そして、テキストデータは扱いやすく、編集しやすい。データをフィルタやパイプを駆使して処理することを美徳とするUnixとしては、動かせないデータは死んだデータだ、とも書いてある。

対話的なシェルは、他のプログラムと結合することが難しいため、否定的に書かれている。対話的にデータを取得するのではなくて、設定ファイルにデータを書き込んで、それを処理することがよいこととされている。自分で書くシェルでもこの点は大いに参考になる。readコマンドはなるべく使わずに、テキストを介するようにしようとおもった。

よいプログラマはよいコードを書く。偉大なプログラマはよいコードを借りてくる。

Unixでは、小さなプログラムを組み合わせて利用すること好む。ソフトウェアの「梃子(てこ)」を利用して、なんでも自動化しようとすることが、Unixプログラマの美徳。

その組み合わせる対象のツールは、なんでも自分で作るのではなくて、すでにある過去の資産を利用しようということだ。むしろ、どのようにツールを組み合わせて目的を実現するか、ということに注力することを礼賛している。

なるほど、UnixやLinuxには、自分の知らないコマンドがまだまだたくさんある。自分で作成るスクリプトやCプログラムなんて、車輪の再発明かもしれない。自分で作成するプログラムはたしかに達成感があるけれども、時間がかかるし他人のプログラムよりも劣るかもれない。過去の資産を利用することを心がけよう。

全てのプログラムはフィルタとして振る舞うようにせよ

パイプ、シェル、そしてフィルタ。Unix哲学を理解するためには、この3つの単語が必須。

フィルタとは、データを変換するもの。すべてのプログラムはデータを処理するためのフィルタといえる。フィルタには、標準入力(stdin)と標準出力(stdout)がある。標準入力から入力されたデータをフィルタを介して変換し、標準出力に出力する。一つの形式から、別の形式に変換する。

パイプとは、標準出力を標準入力に変換するもの。パイプを介して、フィルタとフィルタを連続してつなげることができる。

シェルとは、フィルタやパイブをまとめたもの。シェルもフィルタといえる。

パイプやフィルタをより使いやすくするためには、対話的プログラムは悪だ、ということになる。データはテキスト形式で保存せよ、ということになる。そして、小さいことは美しいということになる。全ては、このパイプとフィルタのためにある。

 

改めて、自分がそのパイプとフィルタを使いこなせているかというと、使いこなせてないと思う。パイプとフィルタの理解が深まれば、いまよりずっと効率よく、物事がこなせるかもしれない。また、そのようにUnixのコマンドたちは設計されているのだ。

さいごに

この本には、今まで使ってたLinuxに対するそれらしさが言葉で書かれている。なので、ああそういうことかという発見が散らばっていた。

また、自分でシェルスクリプトを書くときの小さなヒントも得ることができた。

Linuxをよく使うひとならば必読な本かもしれない。そういってもいいような読後感だ。

19 Jun 2013, 10:09

Rubyで書かれた統合C言語TDD開発環境 「Ceedling」 がけっこう便利そうな件

UnityやCMockについて色々調べて来ましたが、今日はそれらを束ねるツール Ceedlingにつついて調べました。

[toc]

Ceedlingとは

Ceedlingとは、UnityとCMockを使ってテストを実行するためのテスト管理用フレームワーク。テストを助けるための便利なツールがRubyスクリプトで書かれていて、それらを利用してC言語でのTDDをウマクやるためのツール。

Ceedlingのインストール

CeedlingはRuby,Rakeが必要なので、まずはrubyとrakeをインストールしておくこと。また、Rubygemもパッケージ取得のために必要。入れておくこと。

Ceedlingのインストールは以下のコマンドで実施する。

gem install ceedling

Ceedlingプロジェクトの作成する。

ceedling new ceedling_study

Unity・CMockを利用するためのテスト環境が一気に自動生成される。かっこ良い。(・∀・)

デフォルトでいろんなモードが用意されている。これらがテストを実施するためのお助けツール。詳しくは、使い方のドキュメントを参照。

% rake -T
rake clean# Delete all build artifacts and temporary products.
rake clobber  # Delete all generated files (and build artifacts).
rake environment  # List all configured environment variables.
rake files:header # List all collected header files.
rake files:source # List all collected source files.
rake files:test   # List all collected test files.
rake logging  # Enable logging
rake module:create[module_path]   # Generate module (source, header and test files)
rake module:destroy[module_path]  # Destroy module (source, header and test files)
rake paths:source # List all collected source paths.
rake paths:support# List all collected support paths.
rake paths:test   # List all collected test paths.
rake summary  # Execute plugin result summaries (no build triggering).
rake test:*   # Run single test ([*] real test or source file name, no path).
rake test:all # Run all unit tests.
rake test:delta   # Run tests for changed files.
rake test:path[dir]   # Run tests whose test path contains [dir] or [dir] substring.
rake test:pattern[regex]  # Run tests by matching regular expression pattern.
rake verbosity[level] # Set verbose output (silent:[0] - obnoxious:[4]).
rake version  # Display build environment version info.

vendor配下にunityとcmockのディレクトリを持ってくる。

cd vendor
git clone git://github.com/ThrowTheSwitch/Unity.git
git clone git://github.com/ThrowTheSwitch/CMock.git

仕様のドキュメントは vendor/ceedling/docs配下にある。

docs/
├── CExceptionSummary.pdf
├── CMock Summary.pdf
├── CeedlingPacket.pdf
└── Unity Summary.pdf

設定ファイルは project.ymlをいじるけれども、まずはデフォルトでOk.

Unityといっしょに使ってみる

Unityのテストコートを書いてみます。

#include "unity.h"
#include "hogehoge.h"

void setUp(void)
{
}

void tearDown(void)
{
}

void test_hogehogefirst(void)
{
  TEST_IGNORE_MESSAGE("Here");
}

実行結果

[tsu-nera]% rake test:all

Test 'Testhogehoge.c'
---------------------
Generating runner for Testhogehoge.c...
Compiling Testhogehoge_runner.c...
Compiling Testhogehoge.c...
Linking Testhogehoge.out...
Running Testhogehoge.out...

-------------------------
IGNORED UNIT TEST SUMMARY
-------------------------
[Testhogehoge.c]
  Test: test_hogehogefirst
  At line (14): "Here"

-------------------------
OVERALL UNIT TEST SUMMARY
-------------------------
TESTED:  1
PASSED:  0
FAILED:  0
IGNORED: 1

ちなみに、unity fixture形式のテストの書き方だとうまく動作しなかった。ここ3週間、仕事でUnityFixture形式のテストを書きまくったので、どうやって移植しようか。。。ウマクやる方法がわかったら追記する。

CMockといっしょに使ってみる

テストファイルに、モックしたいソースのヘッダファイルを以下の形式で書くと、CeedlingはCMockを利用してモックを自動生成する。

#include "mock_xxxxx.h"

prefixのmock_はproject.ymlの以下のパラメータを変更すれば調整可能。

:cmock:
  :mock_prefix: mock_

CMockサンプル

以下のように、uhauha()の先でhogehogeをコールしている。hogehogeをモックしたい。

uhauha.c

#include "uhauha.h"
#include "hogehoge.h"

void uhauha(void)
{
  hogehoge();
}

テストコードを以下のようにかく。

Testuhauha.c

#include "unity.h"
#include "uhauha.h"
#include "mock_hogehoge.h"

void setUp(void)
{
}

void tearDown(void)
{
}

void test_uhauhafirst(void)
{
  hogehoge_ExpectAndReturn(2);
  uhauha();
}

gcovといっしょに使ってみる

gcovを利用して、gcovデータを生成する。project.ymlにgcovプラグインの記述を追加する。

:tools:のところにgcovを追加。

:plugins:
  :load_paths:
    - vendor/ceedling/plugins
  :enabled:
    - stdout_pretty_tests_report
    - module_generator
    - gcov(ここに追加)

rakeコマンドでgcovを実行。build/gcov/outに gcnoができる。

rake gcov:all

xUnit形式のxmlファイルを生成して、Jenkinsで表示する

もともと、Unityでのテスト結果をxUnit formatのXMLに変換する方法を調べていたらceedlingを見つけたので、これがやりたかったこと。project.ymlに以下を追加する。

:plugins:
  :load_paths:
    - vendor/ceedling/plugins
  :enabled:
    - stdout_pretty_tests_report
    - module_generator
    - xml_tests_report

rakeコマンドでtestを実行。/build/artifacts/testに report.xmlができる。

<?xml version='1.0' encoding='utf-8' ?>
<TestRun>
        <FailedTests/>
        <SuccessfulTests>
                <Test id="1">
                        <Name>test/Testuhauha.c::test_uhauhafirst</Name>
                </Test>
        </SuccessfulTests>
        <IgnoredTests>
                <Test id="2">
                        <Name>test/Testhogehoge.c::test_hogehogefirst</Name>
                </Test>
        </IgnoredTests>
        <Statistics>
                <Tests>2</Tests>
                <Ignores>1</Ignores>
                <FailuresTotal>0</FailuresTotal>
                <Errors>0</Errors>
                <Failures>0</Failures>
        </Statistics>
</TestRun>

このファイルをJenkinsから表示すればよい。表示するためには、xUnit Pluginを入れる。

xUnit Plugin – Jenkins – Jenkins Wiki

xUnit Pluginには、Unity用の選択肢がない。CppUnitと形式が似ているため、xml生成用のRubyスクリプトに手を入れる。

まず、CppUnitには、Ignoreという概念がないので、L38,L100のIgnore関連の記述をコメントアウト。

L38.

=begin
    write_tests( results[:ignores], stream, 'IgnoredTests' )
=end

L100.

=begin
    stream.puts "\t\t<Ignores>#{counts[:ignored]}</Ignores>"
=end

L68行目にもバグがあるので、修正。

      stream.puts "\t\t</FailedTest>"
      # stream.puts "\t\t</Test>"

Ceedling / Discussion / Ceedling Forum:XML report

これで、Jenkinsでも結果が表示されたた。