16 Jun 2013, 01:23

BackWPupのbackwpup_db_restore.phpが消えた!それでもリストアする場合の方法メモ

WordPressのバックアップには、BackWPupというプラグインを利用している。リストアが必要になったのに、サイトにアクセスしてみたら、

404 Not Found ….

な・ん・だ・と  (o´・Д・`)ノ

バックアップのツールなのに、リストアできないとは悲惨。色々調べたら、phpMyAdminからリストアする方法があるようだ。以下、方法をメモ

phpMyAdminからのSQLデータインポート方法

phpMyAdminにアクセスして、インポートを選択。

リストアしたいsqlファイルをアップロードする。あとは、デフォルト設定で実行を選択。数分で完了する。

skitch

すごい簡単ラクチン\(^o^)/。
こんなにサクッとデキるならば、backwpup_db_restore.phpはいらないね。

15 Jun 2013, 15:57

ドメイン移行しました

独自ドメインに移行しました。

このブログは、自分がプログラマである限り一生続けていくつもりです。

一生続けるために、独自ドメインを取得しました。

また、futurismoという名がつく独自ドメインで年1000円代のものが、あと1つしかなかったという焦りもありました。

いずれにしろ、今後とも、ごひいきごひきたて、何卒よろしくおねがいします。

RSSの再登録も、よろしくおねがいします。

 

10 Jun 2013, 23:35

ソースコードの全体を俯瞰デキる!Eclipse用minimapプラグイン 「Overview plugin for Eclipse」

Eclipseでminimapの機能が使えたらいいなといろいろ探してていたら、

見つけた\(^o^)/ 

Overview plugin for Eclipse | Eclipse Plugins, Bundles and Products – Eclipse Marketplace

minimapとは

minimapとは、コードの全体姿を俯瞰的に見ることができる、ビューのこと。BirdView/Code Outlineともいうらしい。Emacsにはあるので、Eclipseにもきっとあるはずとおもった。

http://www.emacswiki.org/emacs/MiniMap

また、以下のサイトの記事でminimapプラグインが現る!と紹介されていたけれども、バグっていそうなので、手を出せてなかった。

遂にEclipse用「MiniMap」プラグイン現る! | 情報科学屋さんを目指す人のメモ

Overview plugin for Eclipseの使い方

まずは、EclipseマーケットプレイスからOverview pluginを検索して、インストール。

インストールが完了したら、ツールバーの

  • ウィンドウ -> ビューの表示 -> その他 -> 概要 -> 概要

を選択して、ビューを表示させる。

skitch

ビューを右か左に縦長に配置すれば完成。ソースコードの縮図が画面横に映し出される。

クリックするとズームアップも可能だ。Ctrl + o でアウトラインビューと組み合わせて、より効率的に画面を移動できそうだ。なにより、カッコイイ(・∀・)。

09 Jun 2013, 12:48

CMockでモック関数を自動生成する!なんてピーターパン症候群だった。。。手動生成やっつけダミー地獄に落ちたメモ

以前、こんな記事を書きました。

恐るべきレガシーコードの救世主になるか?!ドロドロ依存なモジュールたちを『CMock』ですっ裸にする | Futurismo

 

どんなコードに対しても、テストが簡単にかけるみたいな、素敵なことを夢想したわけだが、それは空虚な夢幻だった。ピーターパンだった。これを、仕事で実践しようとしたときに、現実は冷酷だった。

自動生成してもコンパイル通らない(´。・ω・。`)

結局ドロドロな手動ダミー関数地獄に落ちていき、忙殺されたのだった。今日は、そんな苦労のなかで見つけたTipsをメモします。

[toc]

 

64bit対応

コンパイルオプションに以下のデファインを追加すればいいっぽい。

UNITY_INCLUDE_64

//を/* */に置き換え

そもそも、//を利用してコメントするとコンパイルエラー。。手強い。/* */に変換した。

UNITY_OUTPUT_CHARで標準出力関数を置き換え

Unityでは標準出力のために、putcharを利用している。

//-------------------------------------------------------
// Output Method
//-------------------------------------------------------

#ifndef UNITY_OUTPUT_CHAR
//Default to using putchar, which is defined in stdio.h above
#define UNITY_OUTPUT_CHAR(a) putchar(a)
#else
//If defined as something else, make sure we declare it here so it's ready for use
extern int UNITY_OUTPUT_CHAR(int);
#endif

 

自分の環境(vxWorks)では、putcharが使えなかった。printfは利用できるようだった。そこで、UNITY_OUTPUT_CHARを自分で定義しななおして、標準出力関数を置き換えた。

//-------------------------------------------------------
// Output Method
//-------------------------------------------------------

#define UNITY_OUTPUT_CHAR(a) printf("%c",(a))

#if 0
#ifndef UNITY_OUTPUT_CHAR
//Default to using putchar, which is defined in stdio.h above
#define UNITY_OUTPUT_CHAR(a) putchar(a)
#else
//If defined as something else, make sure we declare it here so it's ready for use
extern int UNITY_OUTPUT_CHAR(int);
#endif
#endif

インクルードファイルの挿入

OSのファイルを先頭に取り込まないと行けない場合がある。自分の場合は、仕事でvxWorksを利用しているので、”vxWorks.h”。Windowsだと、”Windows.h”みたいな。生成されたモックファイルたちにも、ソースの頭で読みこむ必要かあった。

cmock/lib/cmock_config.hの以下のパラメータにヘッダファイルを入れることで自動生成するものに挿入してくれる。

    :includes_h_pre_orig_header  => nil,

    :includes_h_post_orig_header => nil,

    :includes_c_pre_header       => nil,

    :includes_c_post_header      => nil

たとえば、Cソースの頭にヘッダファイルを挿入したい場合は、

    :includes_c_pre_header  => [‘hogehog_internal.h’] (ここは配列)

とする。すると、以下のように生成される。

#include

#include

#include

#include “unity.h”

#include “cmock.h”

#include “hogehoge.h”

#include “CMock_hogehoge.h”

string.h、stdlib.h、setjmp.h、unity.h、cmock.hのあとに挿入される。自分の場合は、 の前に挿入したかったので、lib/cmock_generater.rbを直接編集をしてしまったorz。

とりあえず、hogehoge_internal.hを先頭に挿入して、あとはコンパイルエラーが出る度に、hogehoge_internal.hに場当たり的にいろいろ定義していった。

extern宣言している関数をモックする

ヘッダファイルにextern宣言されている関数はモックで自動生成されなかった。調べたら、ヘッダファイルにexternを書くことは、なんの意味もないらしい!(グローバル変数は別)

CMockの場合、デフォルトではextern宣言されている関数のモック作成はしないが、オプションを変更することで可能。

lib/cmock_config.rbの:treat_externs のオプションを:excludeら:includeに変更する。

=begin

    :treat_externs            => :exclude,       
=end

    :treat_externs            => :include,      

困るのが、extern宣言されている関数が複数箇所で宣言されている場合。これは妥協して手動でどちらかの関数を#if 0した。

extern宣言しているグローバル変数の扱い

グローバル変数の場合、extern宣言はヘッダファイルに書いて、実体はCソース書くことがルール。テストをするときに、テストをするときに、テストコードに実体を宣言して利用していたが、このグローバル変数の実体を自動生成してくれないかなとおもった。調べると、こんな記事を発見。

CMock / Discussion / CMock Forum:Mocking extern functions

これによると、自分のテストファイルに変数を宣言しなさいとある。はい、そうします。

自動生成されたモックと手動生成したモックの使い分け

とりあえず、接頭語をMock_とCMock_で分ける。

MakefileでどちらのCMock_(自動生成)かMock_(手動生成)のどちらを利用するかを選ぶ。ある関数は自動生成を利用したいけど、別関数は自前の関数を利用したいなんてこともある。

そのときは、callbackオプションを利用する。

    :plugins                  => [‘callback’],

これで、hogehoge()に対して、hogehoge_StubWithCallbackという関数が生成される。この関数に、自前のモック関数をセットすればよい。

例えば、Mock_hogehoge { return 2;}を使って、こんな風に書く。

#include "Mock_hogehoge.h"

TEST(hogehoge,second)
{
  hogehoge_StubWithCallback(Mock_hogehoge());
  TEST_ASSERT_EQUAL( 2, (hogehoge() + 1) );
}

しかし、この宣言をいちいち記述するのも面倒なので、よく呼ばれる関数は、ダミーかフェイクを自前で作ったほうがよいとおもった。(OSの関数はモックするべきでなかったとおもった)

モック関数としてではなくて、フェイク関数として使う場合

Ignore関数を呼ぶとよい。;pluginにignoreオプションを追加でモック関数が生成される。パラメータチェックや何回呼ばれたかのチェックがされなくなる。

    :plugins                  => [‘ignore’],

モードが2種類あり、呼ばれた回数はチェックする場合とそうでない場合。ignoreオプションで選ぶ。(args_and_call / args_only)

staticなし関数をかってにexternでみてる場合

ヘッダファイルに宣言されていないが、static宣言もない、他のファイルの関数を勝手に使ってる。これは、対処の方法がわからなかった。手動生成。

最後に

CMockは痒いところに手が届く、使い勝手がよいツールなので調べればいい手が見つかるかもしれない。Rakeをもう少し使いこなして、このへんの処理をやりたいことろだ。まあ、地獄に落ちつつも後先考えないやっつけ仕事でテスト環境はとりあえずできたので、よいのだけれども。

09 Jun 2013, 09:30

UnityやCMockをEclipseで使うときに役立つ設定まとめ

最近はようやくUnityやCMockの使い方が分かってきた感じだ。今日は、Eclipseでの便利な設定を試してみた。元ネタ、本家公式サイトからの抜粋。

TEST_IGNOREタグの設定

Eclipseは指定したタグを検索して、タスク・ビューに表示させる機能がある。これに、UnityでのTEST_IGNOREを加えることで、これからするテストに対するリマインダを設定できる。以下を選択。

  • ツールバー
    • ウィンドウ -> 設定
      • C/C++ -> タスク・タグ -> 新規

TEST_IGNOREを追加する。その後、プロジェクトを右クリックして、

  • インデックス -> 全てのファイルを更新

することで、再度タグの検索が走り、TEST_IGNOREがタスクビューに表示される。

SunShade Pluginでテストコードとソースコード間をいったりきたり

SunShade プラグインを入れると、テストコードとソースコード間をいったりきたりできる。通常は、2画面で並べて作業しているので、出番は少なめかもしれない。

The Sunshade suite of eclipse plugins

ツールバー -> ヘルプ -> 新規ソフトウェアのインストール -> 追加 でhttp://sunshade.sourceforge.net/updateを追加してインストールする。

起動するとエラーした(´・ω・`)SWTエラーが発生しましただと。

Cannot initialize Drop

pluginsディレクトリのnet.sourceforge.sunshade.filedrag_3.4.0というディレクトリを削除したらエラーしなくなった。こんな対処で大丈夫か?

機能を利用するためには、ツールバー -> ウィンドウ -> 設定 -> Sunshade -> Scripted Actionsを選択。たとえば、src/*\**.cとtest/Test**.cの間を行き来するためには、以下のように書く。

importPackage(java.lang, Packages.org.eclipse.ui);
importPackage(Packages.net.sourceforge.sunshade.util);
var wb = PlatformUI.getWorkbench(); // IWorkbench API
var editor = // IEditorPart API
  wb.getActiveWorkbenchWindow().getActivePage().getActiveEditor(); 
if (editor)
{
  var input = editor.getEditorInput(); // IEditorInput API
  var path = input.getPath(); // IPath API
  var filename = path.toOSString();
  if (filename.indexOf("Test") == -1) // ここを書き換え
    filename = filename.replace("src\\","test\\Test"); // ここを書き換え
  else
    filename = filename.replace("test\\Test","src\\"); // ここを書き換え
  //alert("Filename: " + filename);
  FileUtil.openEclipseEditorForFile(filename);
}

Test拡張子以外に対応する場合でも、例えばMock拡張子でも、すこしコードを書き換えれば利用できる。

このSunshadeにはErrorlinkというツールがあるけれども、こっちはうまく動かない。

コードテンプレートの設定

Eclipseのコードテンプレート機能を利用すれば、Ctrl + Spaceでテストのテンプレートを呼び出すことができる。

レッツ メタプログラミング(^O^)/

ツールバー -> ウィンドウ -> 設定 -> C/C++ -> エディタ- -> テンプレートを選択。

新規を選択して、テスト用のテンプレートを記述する。たとえば、Unityのフィクスチャ機能のテンプレートは以下。

TEST(${test_group_name},${test_case_name})
{
  ${line_selection}${cursor}

  TEST_IGNORE_MESSAGE("${test_case_name} Needs Definition.");
}

RUN_TEST_CASE(${test_group_name}, ${test_case_name});

別にテンプレートを利用しなくても、testまで書いて Ctrl + Spaceである程度の自動補完はできる。

最近はようやくUnityやCMockの使い方が分かってきた感じだ。今日は、Eclipseでの便利な設定を試してみた。元ネタ、本家公式サイトからの抜粋。

Throw The Switch! – White Papers – Using Eclipse IDE

TEST_IGNOREタグの設定

Eclipseは指定したタグを検索して、タスク・ビューに表示させる機能がある。これに、UnityでのTEST_IGNOREを加えることで、これからするテストに対するリマインダを設定できる。以下を選択。

  • ツールバー
    • ウィンドウ -> 設定
      • C/C++ -> タスク・タグ -> 新規

TEST_IGNOREを追加する。その後、プロジェクトを右クリックして、

  • インデックス -> 全てのファイルを更新

することで、再度タグの検索が走り、TEST_IGNOREがタスクビューに表示される。

SunShade Pluginでテストコードとソースコード間をいったりきたり

SunShade プラグインを入れると、テストコードとソースコード間をいったりきたりできる。通常は、2画面で並べて作業しているので、出番は少なめかもしれない。

The Sunshade suite of eclipse plugins

ツールバー -> ヘルプ -> 新規ソフトウェアのインストール -> 追加 でhttp://sunshade.sourceforge.net/updateを追加してインストールする。

起動するとエラーした(´・ω・`)SWTエラーが発生しましただと。

Cannot initialize Drop

pluginsディレクトリのnet.sourceforge.sunshade.filedrag_3.4.0というディレクトリを削除したらエラーしなくなった。こんな対処で大丈夫か?

機能を利用するためには、ツールバー -> ウィンドウ -> 設定 -> Sunshade -> Scripted Actionsを選択。たとえば、src/*\**.cとtest/Test**.cの間を行き来するためには、以下のように書く。

importPackage(java.lang, Packages.org.eclipse.ui);
importPackage(Packages.net.sourceforge.sunshade.util);
var wb = PlatformUI.getWorkbench(); // IWorkbench API
var editor = // IEditorPart API
  wb.getActiveWorkbenchWindow().getActivePage().getActiveEditor(); 
if (editor)
{
  var input = editor.getEditorInput(); // IEditorInput API
  var path = input.getPath(); // IPath API
  var filename = path.toOSString();
  if (filename.indexOf("Test") == -1) // ここを書き換え
    filename = filename.replace("src\\","test\\Test"); // ここを書き換え
  else
    filename = filename.replace("test\\Test","src\\"); // ここを書き換え
  //alert("Filename: " + filename);
  FileUtil.openEclipseEditorForFile(filename);
}

Test拡張子以外に対応する場合でも、例えばMock拡張子でも、すこしコードを書き換えれば利用できる。

このSunshadeにはErrorlinkというツールがあるけれども、こっちはうまく動かない。

コードテンプレートの設定

Eclipseのコードテンプレート機能を利用すれば、Ctrl + Spaceでテストのテンプレートを呼び出すことができる。

レッツ メタプログラミング(^O^)/

ツールバー -> ウィンドウ -> 設定 -> C/C++ -> エディタ- -> テンプレートを選択。

新規を選択して、テスト用のテンプレートを記述する。たとえば、Unityのフィクスチャ機能のテンプレートは以下。

TEST(${test_group_name},${test_case_name})
{
  ${line_selection}${cursor}
  
  TEST_IGNORE_MESSAGE("${test_case_name} Needs Definition.");
}

RUN_TEST_CASE(${test_group_name}, ${test_case_name});

別にテンプレートを利用しなくても、testまで書いて Ctrl + Spaceである程度の自動補完はできる。

09 Jun 2013, 05:22

CentOS上でSAMBAサーバを立ちあげてWindowsからアクセスするためのメモ

前回、VMware上のCentOSからCygwinのディレクトリをマウントすることを記事にしました。

Cygwin(Windows)をCentOSからmountする方法 | Futurismo

今回は、その逆。CentOSのディレクトリをWindowsにマウントします。CentOSにSambaを導入することで、実現しようと思います。

CentOSでのSambaの設定

CentOS側での設定を書きます。ここでは、home配下を共有することを目的とします。

# Sambaのインストール
yum -y install samba

# ユーザの追加。ここでは、tsu-neraユーザを
pdbedit -a tsu-nera

# パスワードを聞かれる
new password:
retype new password:
Unix username:        tsu-nera
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3434940687-3012143288-2006372190-1000
Primary Group SID:    S-1-5-21-3434940687-3012143288-2006372190-513
Full Name:
Home Directory:       \\centos\tsu-nera
HomeDir Drive:
Logon Script:
Profile Path:         \\centos\tsu-nera\profile
Domain:               CENTOS
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    日, 09  6月 2013 04:07:43 JST
Password can change:  日, 09  6月 2013 04:07:43 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF


 

#======================= Global Settings ==================
[global]
   # 文字コード設定 CentOS
   unix charset = UTF-8
  # 文字コード設定 Win
   dos charset = CP932
   display charset = UTF-8

# ----------------------- Network Related Options ----------
       # Widnows グループの設定 コンピュータのプロパティから調べる
        workgroup = WORKGROUP
 
        # Allow within local network
        hosts allow = 192.168.1. 127.

#============================ Share Definitions ==============
[homes]
        comment = Home Directories
        # ホームディレクトリをSAMBAで共有する
        path = %H
        browseable = no
        writable = yes

 

# Samba起動
bash-4.1# /etc/rc.d/init.d/smb start
SMB サービスを起動中:                                      [  OK  ]

# NMB起動
bash-4.1# /etc/rc.d/init.d/nmb start
NMB サービスを起動中:                                      [  OK  ]

# 起動時にサービスを起動するおまじない
chkconfig smb on 
chkconfig nmb on 

ファイアウォールの設定

SAMBAを利用するためには、tcp 139,445, udp 137,138のポートを開ける。 /etc/sysconfig/iptablesを編集する。

# for samba
 -A INPUT -p tcp --dport 139 -j ACCEPT
 -A INPUT -p udp --dport 137 -j ACCEPT
 -A INPUT -p udp --dport 138 -j ACCEPT
 -A INPUT -p tcp --dport 445 -j ACCEPT

 

service iptables restart で再起動する。

SELinuxの設定

ここでスゴイハマった。CentOSにはSELinuxというセキュリティ強化用ソフトがあって、この設定をいじらないと、SAMBAでhomeディレクトリ配下を共有できない。(smb.confの初めにほうにも書いてあった)以下のコマンドを実行

setsebool -P samba_enable_home_dirs on

このコマンド実行は時間がかかる。気長に待つこと。

Windowsでアクセスしてみる

(Windows) + r でファイル名を指定して実行を起動。

\(サーバのIP)(ユーザ名)

を入力する。パスワードが求められたら、パスワードを入力する。アクセス出来れば成功。

接続が確認できたら、ネットワークドライブの割り当てをしとく。

参考

08 Jun 2013, 15:22

CentOSに rbenv 経路で Ruby 2.0.0-p195を入れようとしたら、エラー

CentOSに rbenv 経路で Ruby 2.0.0-p195を入れようとしたら、エラーした。

導入した手順は過去記事参照。

Cygwin上のRuby1.9をrbenvで最新版Ruby2.0にバージョンアップしたの巻 | Futurismo

installing default gems:      /home/tsu-nera/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
                              bigdecimal 1.2.0
                              io-console 0.4.2
                              json 1.7.7
                              minitest 4.3.2
                              psych 2.0.0
                              rake 0.9.6
                              rdoc 4.0.0
                              test-unit 2.0.0.0
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20130517183130.16922
Results logged to /tmp/ruby-build.20130517183130.16922.log

Last 10 log lines:
installing default gems:      /home/tsu-nera/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
                              bigdecimal 1.2.0
                              io-console 0.4.2
                              json 1.7.7
                              minitest 4.3.2
                              psych 2.0.0
                              rake 0.9.6
                              rdoc 4.0.0
                              test-unit 2.0.0.0
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?

openssl がないぞと言われるが、インストールはされている。

OpenSSL 1.0.0-fips 29 Mar 2010

調べてみると、libssl-devなるものが必要なようだ。

Installing Ruby 2.0.0-p0 using Rbenv on Ubuntu 12.04.2 LTS – Ruby Forum

CentOSでは、openssl-develに当たるものがそれっぽいので、インストール。

sudo yum -y install openssl-devel

これでうまく行った(・∀・)

08 Jun 2013, 11:16

Cygwin(Windows)をCentOSからmountする方法

はじめに

Cygwinを今までつかっていたけれども、VMware上のCentOSにtelnetしたほうがよいのではと最近考え始めた。

その理由は、Cygwinをつかっていると、

  • カスタマイズしすぎたzshやemacsの起動が遅い
  • screenのデタッチ後に作業を保存されない

vmware playerならば、作業をそのまま保存してサスペンドするのでこの課題を解決できる。

さて、CygwinからVM上のCentOSにお引越ししようとおもったけれども、またCygwinに戻ってくるかもしれないと思った。なので、CentOSからCygwinのフォルダをマウントしてしまえば良いのだということに気づいた。

というわけで、CentOSからmountコマンドでCygwinをマウントする。

CentOSでmountを使うための設定

Windowsの共有フォルダはSMBプロトコルによって除くことができる。CentOSからSambaを利用するためには、mount.cifsというコマンドを利用するらしい。というわけで、インストールする。

yum -y install samba-client

Windowsでmountされる設定(フォルダの共有設定)

次に、Windows側でCygwinの自分のフォルダを共有ファイルに設定する。

C:\cygwin\home(ユーザ)

のフォルダを右クリックして、

  • プロパティ -> 共有 -> 共有 -> 共有

を選択。これで共有が開始される。次に、

  • 詳細な共有 -> アクセス許可

を選択して、共有を許すユーザを追加する。ログインしているユーザを追加すればよい。

次に追加したユーザにフルコントロール権限を与える。これで読み書きできる。

skitch

CentOSからmountコマンドを実行する

マウントするためには、rootユーザである必要がある。

# mount するディレクトリ作成
mkdir -p /mnt/cygwin

# mount する。
mount -t cifs -o user=TSUNEMICHI,password=********* //192.168.1.101/TSUNEMICHI /mnt/cygwin

mount -t cifsで、内部的に mount.cifsコマンドに置き換えられる。

-oがオプション

  • usr ・・・Windowsのユーザ名
  • password Windowsのパスワード
  • //(WindowsのサーバIP(ipconfigで調べる)/共有フォルダ名
  • /mnt/cygwin ・・・ CentOS側のマウントディレクトリ

アンマウントするには、umount /mnt/cygwinでよい。

終わりに

本当は、別の目的で調べていた。

Jenkinsからビルドサーバにビルドを依頼しようとおもった時に、sshを利用するのではなくて、ビルドサーバのディレクトリをCIサーバにマウントしてしまえばいいんじゃねと思った。

しかし、この方法は一人で使うにはいいけれども、ユーザ管理や運用を考えた時にはJenkinsユーザにCIサーバのディレクトリ構造まで意識させる必要がある気がしたので、やめた。

参考

02 Jun 2013, 23:35

Cygwin上のRuby1.9をrbenvで最新版Ruby2.0にバージョンアップしたの巻

はじめに

タイトル通りです。Rubyをrbenvで最新版にバージョンアップする方法を調べたのでまとめます。

Ruby2.0は、1.9系に比べてrequireする速度が2.5倍!ときいたので、是非移行したくなりました!(・∀・)

[toc]

rbenvのインストール

rbenvとは

rbenvとは、Rubyの版数を管理するためのツール。これを使ってRubyのバージョンアップをします。Rubyの版数管理だと、rvmもあるけれども、rbenvは後発のツールで、Rubyのみに特化した、シンプルなツールらしい。

sstephenson/rbenv ・ GitHub

rbenvのインストール

rbenvはgithubで公開されているツールなので、gitを使って取得します。

# ホームディレクトリに移動
cd 
# githubから rbenv取得。~/.rvenvに置きます。
git clone git://github.com/sstephenson/rbenv.git .rbenv

rbenvの設定

rbenvにパスを通すために、ログインシェルにパスを追記します。自分の場合は、.zshrcに以下を追記した。

# .rvenvディレクトリがあるときだけ設定を追加
if [ -d ${HOME}/.rbenv  ] ; then
    PATH=${HOME}/.rbenv/bin:${PATH}
    export PATH
    eval "$(rbenv init -)"
fi

source .zshrcで読み込み。

ちなみに、この設定をいれたら、.zshrcの読み込みが遅くなった気がするので、普段はこの記述はコメントアウトしておくことにしました。

rbenv-buildとrvenv-gemsetのインストール

rbenvだけだと、Rubyをビルドすることができないため、rbenv-buildもインストールします。

mkdir -p ~/.rbenv/plugins
cd ~/.rbenv/plugins
# rbenv-build
git clone git://github.com/sstephenson/ruby-build.git

rbenvで最新版Ruby2.0をインストールしてみる

まずは、利用できるバージョンを確認する。

% ~/.rbenv/plugins/ruby-build/bin/ruby-build --definitions
2.0.0-dev
2.0.0-p0
2.0.0-p195

最新安定版である Ruby 2.0.0-p195を入れます。Cygwinでコンパイルをすると、想像を絶するほどの時間がかかった。-vをつけると、コンパイルの様子が出力される。

% rbenv install 2.0.0-p195 -v

と、ここでエラーした。。。。(´・ω・`)

compiling process.c
In file included from ./include/ruby/ruby.h:1567:0,
                 from process.c:14:
./include/ruby/intern.h:293:72: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:293:72: warning: its scope is only this definition or declaration, which is probably not what you want
In file included from ./include/ruby/ruby.h:1567:0,
                 from process.c:14:
./include/ruby/intern.h:412:1: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:413:79: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:414:32: warning: 'struct timeval' declared inside parameter list
process.c: In function 'rb_f_sleep':
process.c:4105:2: error: type of formal parameter 1 is incomplete
Makefile:325: recipe for target `process.o' failed
make: *** [process.o] Error 1

回避方法を参考して、ソースをダウンロードしたところで一旦 Ctrl+Zで止めて、/tmp配下にあるrubyソースの中の、include/ruby/intern.hに,「#include 」を追記する。Windows 7,8での不具合っぽい。

Rubyのスナップショットをビルド―2.1.0dev & 2.0.0対応― – わさっき

気を取り直して、再度コンパイルをかけると、opensslのなにかでハング!

止まった。。。(´・ω・`)。。。困った。。。(´・ω・`)

make[1]: ディレクトリ `/tmp/ruby-build.20130602153618.8580/ruby-2.0.0-p195' から出ます
configuring io/nonblock
configuring io/wait
configuring json
configuring json/generator
configuring json/parser
configuring mathn/complex
configuring mathn/rational
configuring nkf
configuring objspace
configuring openssl

これも、ググったら回避方法が載っていた。./cofigureにオプションを設定すればよいようだ。

CONFIGURE_OPTS=-"-with-opt-dir=/usr/local" rbenv install 2.0.0-p195 -v

これでOK.こんなに苦戦するとは。。。最後に、おまじないを叩いて終了。

% rbenv rehash

2.0.0に切り替える。

# インストールされているRubyのバージョンを確認
% rbenv versions
* system
  2.0.0-p195 (set by /home/TSUNEMICHI/.rbenv/version)
# 2.0をいつものバージョンにする
% rbenv global 2.0.0-p195

 

おわりに

rbenvは、いろんなRuby版数を簡単に切り替える機能もあります。なので、試しにRubyを最新版にあげてみて、動かなかったら古い版数に戻したり、特定のディレクトリ配下だけを古い版数で動かしたり、なんていう設定も可能です。

体感的には、2.0にしても速度が向上したようには感じされなかった。(むしろ・・・おそorz)CygwinでRubyが異常に遅いことは有名らしい。Linuxではそんなことはないらしい。(3倍速?)Cygwin上にRubyを動作させることがはかないあやまちのような気がした。

環境

  • Cygwin 1.7
  • Ruby 1.9.3 -> 2.01

参考記事

01 Jun 2013, 13:55

C言語のビルドでほのぼのrakeでmakeするよ

はじめに

C言語/C++でコンパイルするときは、makeするのが当たり前だと思っていた昨今、rakeなるビルドツールがあるとのことで、調査してみた。

まずは、世の中の人気度。。。。makefileの5%にも満たないシェア(2013年現在)

環境

  • Cygwin
  • Ruby 1.9.3
  • Rake version 10.0.4

目次

[toc]

rakeとmakeの比較とメリット

rakeとは、makefileをrubyの文法で記述するためのツール。もう少し正当にいうと、繰り返し使うようなスクリプトを「タスク」にまとめて、必要に応じて実行できるツール。

makeとrakeを比較すると、

  • makeはmakefileを作ってmakeする。
  • rakeはrakefileを作ってrakeする。

なんだか偽物のミッキーマウスみたい(-_-;)しかし、makeに対するrakeのメリットは以下。

  • 記述にRubyが使える

    汎用的なRubyの文法をそのまま使ってビルド手順がかける。なのでmakeのような独特な言語を覚えて(しかも他では使えない)使う必要はない。

  • 美しく記述できる

    Ruby自体が見やすい記法を心がけて開発されているので、記述がわかりやすい。

Let’s インストール!━⊂( ・∀・)彡

> gem install rake

はじめてのrake

まずは、hogehoge.c hogehoge.h uhauha.c uhauha.h をgccでコンパイルして、hogehoge.exeを作成して実行する、というものをやってみる。

ディレクトリ構成

% tree

.

├── include

│ツꀀツꀀ ├── hogehoge.h

│ツꀀツꀀ └── uhauha.h

└── src

├── hogehoge.c

└── uhauha.c

コマンドライン

% gcc -Iinclude src/uhauha.c src/hogehoge.c -o hogehoge.exe && ./hogehoge.exe

makefile

C_COMPILER = gcc
TARGET=hogehoge.exe

#Source FIles
SRCS  =src/hogehoge.c
SRCS +=src/uhauha.c

#Include Files
INC_DIR =-Iinclude

all: target

target:
        $(C_COMPILER) $(INC_DIR) $(SRCS) -o $(TARGET)
        ./$(TARGET)

clean:
        rm $(TARGET)

rakefile

C_COMPILER = "gcc"
TARGET="hogehoge.exe"
INC_DIR ="include"

task :all => ["clean", "run"]
task :default => "run"

task :run => "hogehoge" do
  puts "---- run ----"
  sh "./#{TARGET}"
end

task :clean do
  puts "---- clean ----"
  sh "rm src/*.o *.exe"
end

file "hogehoge" => ["src/hogehoge.o", "src/uhauha.o"] do |t|
  puts "---- link ----"
  sh "#{C_COMPILER} -o #{t.name} #{t.prerequisites.join(' ')}"
end

rule '.o' => '.c' do |t|
  sh "#{C_COMPILER} -I#{INC_DIR} -c #{t.source} -o #{t.name}"
end

rakefileの解説

rakefileについて、順に解説。

ちなみに、一番網羅的でわかりやすいのは、Ruby公式リファレンス。

http://doc.ruby-lang.org/ja/1.9.3/library/rake.html

Rake Tasks

rakefileはタスクからできている。タスクを順次、実行するための手順を書くのがrakefile。ということで、タスクの概念はrakeには必須。

  • rakeではタスクを見つけると、そのタスクを実行させるために処理を芋づる式に探して実行していく。
  • タスクの定義方法は、 「task :(タスク名) 」。
  • タスクに依存関係を記述する場合は、「task :(タスク名) => “(依存するタスク)”」。依存関係は配列で渡すこともできる。
  • タスクに実施させる処理(action)は、ブロック(do …end)で与える。
task :all => ["clean", "run"]
task :default => "run"

task :run => "hogehoge" do
  puts "---- run ----"
  sh "./#{TARGET}"
end

task :clean do
  puts "---- clean ----"
  sh "rm src/*.o *.exe"
end

File Tasks

ファイル作成のためのタスクかファイルタスク。定義の仕方はタスクと同じ。

rakeタスクは必ず実行されるが、ファイルタスクはタイムスタンプをチェックする。ファイルに変更があった場合のみ実行される。これが、makeと同じところ。

file "hogehoge" => ["src/hogehoge.o", "src/uhauha.o"] do |t|
  puts "---- link ----"
  sh "#{C_COMPILER} -o #{t.name} #{t.prerequisites.join(' ')}"
end
  • t.nameは、タスク名(hoehoge)
  • t.prerequisitesは、依存先タスク名の配列 [“src/hogehoge.o”, “src/uhauha.o”]

をそれぞれ指す。詳しくは以下のURL。

class Rake::Task

rule

異なるファイルに対して、同一の処理を実行するためには、ruleを定義する。ruleを満たす場合に実行される処理を書く。

rule '.o' => '.c' do |t|
  sh "#{C_COMPILER} -I#{INC_DIR} -c #{t.source} -o #{t.name}"
end

t.sourceは、依存するファイルパス(src/……c)

Rakeのもう一歩進んだ使い方

コメント

タスクにコメントを記述するには、desc “hogehoge”と書きます。

desc "Clean and Run"
task :all => ["clean", "run"]

desc "Run build"
task :default => "run"

記述は、 rake -Tで見れます。

[tsu-nera]% rake -T
rake all      # Clean and Run
rake clean    # Remove old files
rake default  # Run build
rake run      # Build Main

clean

.oや.exeは普通、rmコマンドで削除するが、rakeにはこれを補助する機能がある。

使い方は、’rake/clean’ を requireで取り込んで、CLEAN、CLOBBERに削除したいファイルを登録する。すると、rake clean/rake clobberタスクが実行できるようになる。

rake clean    # Remove any temporary products.
rake clobber  # Remove any generated file.

cleanコマンドはCLEANに登録されたファイルを削除。clobberはCLEANとCLOBBERに登録されたファイルを削除する。以下の3行を追加。

require 'rake/clean'
CLEAN.include("src/*.o")
CLOBBER.include("*.exe")

実行結果

[tsu-nera]% rake clean
rm -r src/hogehoge.o
rm -r src/uhauha.o
[tsu-nera]% rake clobber
rm -r hogehoge.exe

library rake/clean

ファイルリスト

ディレクトリ配下のファイルに対してまとめて同じ処理を実行するためには、ファイルリストを使うと便利。

こんな感じで宣言する。これは、src配下にあるすべてのソースをSRCSというファイルリストに入れている。考え方はArrayと同じ。

SRCS = FileList[“src/*.c”]

リストの拡張子を変更するために、extメゾッドが用意されている。これで、.cファイルが.oファイルに置き換えられる。

OBJS = SRCS.ext(‘o’)

ファイルリストにファイルを追加するためには、includeメゾッド、除外するためにはexcluleメゾッドを利用する。はじめに、srcs = FileList[“**/*.c”]で全てのファイルをリストに加えてから、srcs.exclude(“src/hogehoge.c”)と書いて除外したりできる。

SRCS = FileList["src/*.c"]
OBJS = SRCS.ext('o')

file "hogehoge" => OBJS do |t|
  puts "---- link ----"
  sh "#{C_COMPILER} -o #{t.name} #{t.prerequisites.join(' ')}"
end

class Rake::FileList

まとめ

今までのをまとめると、こうなった。

C_COMPILER = "gcc"
TARGET = "hogehoge.exe"
INC_DIR ="include"

require 'rake/clean'
CLEAN.include(["src/*.o", "*.exe"])
#CLOBBER.include("*.exe")

desc "Clean and Run"
task :all => ["clean", "run"]

desc "Run build"
task :default => "run"

desc "Build Main"
task :run => "hogehoge" do
  puts "---- run  ----"
  sh "./#{TARGET}"
end

SRCS = FileList["src/*.c"]
OBJS = SRCS.ext('o')

file "hogehoge" => OBJS do |t|
  puts "---- link ----"
  sh "#{C_COMPILER} -o #{t.name} #{t.prerequisites.join(' ')}"
end

rule '.o' => '.c' do |t|
  puts "---- compile ----"
  sh "#{C_COMPILER} -I#{INC_DIR} -c #{t.source} -o #{t.name}"
end

依存関係を美しく記述デキる点がとても気に入った。また、今まさにRubyを勉強中なので、makefileよりもモチベーションが上がる。ということで、もう少しいろいろ調べてみます。

参考

この本には4ページほどしか載ってなくてあまり詳しくはない。この本には4ページほどしか載ってなくてあまり詳しくはない。