Windows上でCygwinの環境構築(UTF-8)

基本

この辺がわかりやすい dqn.sakusakutto.jp

そこから見た目を変更するためにこちらを参照した qiita.com windowsのデスクトップもシンボリックリンクで追加した

Nodeのインストール

いろいろ調べたけどソースからのビルドは最新ではCygwin非サポートとなったっぽい ちらのうら - Cygwinにnodejsとnpmをインストールする方法

発生した問題

最新(2016/2/6時点)のrbenvだと、ruby2.1.0-rc1と2.3.0はビルドできないことがわかった。
なので2.1.8をインストール。readlineがないとエラーになるのでlibreadlineをインストールした。 *1

*1:2016/09/22 時点で2.31がインストールできることを確認

シェルで現在のgitブランチを取得する

currentBranch=`git status --branch --porcelain | head -n 1 | sed 's/## //' | sed 's/\(.\+\)\.\.\..\+/\1/'`
echo $currentBranch

Jenkinsでsrc refspec master does not match any

gitプラグインリポジトリとブランチを指定してもブランチはanyのまま。

git checkout -b master origin/master

Shellスクリプトでgit statusを使って変更を確認する方法

JenkinsのJobで自動でリモートリポジトリにPushするとき、
一律git commit -am “comment"するとJobの結果がFailedになってしまう。
調べたらこう書けばよいらしい

変更があることの確認方法

if test -n "`git status --porcelain`"; then
    # 処理
fi

変更がないことの確認方法

if test -z "`git status --porcelain`"; then
    # 処理
fi

JRuby覚え書き(JavaからRubyへのアクセス方法まとめ)

準備

import org.jruby.Ruby;
import org.jruby.RubyClass;
import org.jruby.embed.ScriptingContainer;
import org.jruby.runtime.ThreadContext;

ScriptingContainer container = new ScriptingContainer();
Ruby ruby = container.getProvider().getRuntime();

Rubyスクリプトの評価

文字列でもファイルでも評価が可能
runScriptletは最後に評価されたものが返される - 関数定義なら関数のシンボル - クラス定義ならクラス? - 計算式なら計算結果 が返る。
callMethodに渡すreceiverはインスタンスメソッドを呼ぶ時以外はnullでも良さそう

ret = container.runScriptlet(JRubyTest.class.getResourceAsStream("define_medhod.rb"), "define_medhod.rb");
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:hello class:class org.jruby.RubySymbol
ret = container.runScriptlet(JRubyTest.class.getResourceAsStream("define_class.rb"), "define_class.rb");
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:method class:class org.jruby.RubySymbol
ret = container.runScriptlet("0x1111 + '5'.to_i + 6.8 ");
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:4380.8 class:class java.lang.Double

関数の実行

第一引数のReceiverはインスタンスメソッドでなければnullでよさそう
RequestクラスはObject.classを指定しても適切なクラスにキャストしてくれているぽい
ただしRubyの戻りにLongを設定したのにStringを指定するとキャストエラーになる

ret = container.callMethod(null, "hello", 1, "HelloA", new ArrayList<>()); // => called Method 'hello' arg1:1 arg2:Hello arg3:[]
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:String value class:class java.lang.String
ret = container.runRubyMethod(Object.class, null, "hello", 1, "HelloB", new ArrayList<>()); // => called 'hello' arg1:1 arg2:HelloB arg3:[]
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:String value class:class java.lang.String

変数の設定

container.put("local_val", 1);
printf("ret:%s class:%s \n", container.get("local_val"), container.get("local_val").getClass()); // => ret:1 class:class java.lang.Integer
container.put("$global_val", 2);
printf("ret:%s class:%s \n", container.get("$global_val"), container.get("$global_val").getClass()); // => ret:2 class:class java.lang.Integer
container.put("CONSTANT", 3);
printf("ret:%s class:%s \n", container.get("CONSTANT"), container.get("CONSTANT").getClass()); // => ret:3 class:class java.lang.Integer

クラスの特異関数の呼び方

ret = container.get("こうたの弟子");
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:こうたの弟子 class:class org.jruby.RubyClass
ret = ((RubyClass)ret).callMethod("clsMethod"); // => called clsMethod!!
printf("ret:%s class:%s \n", ret, ret.getClass());

インスタンスの生成

getでクラスオブジェクトを取得し、newInstance関数を実行することでインスタンスが生成できる

ret = container.get("こうたの弟子");
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:こうたの弟子 class:class org.jruby.RubyClass
ret = ((RubyClass)ret).newInstance(ThreadContext.newContext(ruby) , null);
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:#<こうたの弟子:0x3e8b8f0> class:class org.jruby.RubyObject

メンバ変数の操作

ret = container.get("こうたの弟子");
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:こうたの弟子 class:class org.jruby.RubyClass
ret = ((RubyClass)ret).newInstance(ThreadContext.newContext(ruby) , null);
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:#<こうたの弟子:0x3e8b8f0> class:class org.jruby.RubyObject
container.put(ret, "@memb", 99);
printf("ret:%s class:%s \n", ret, container.get(ret, "@memb"), container.get(ret, "@memb").getClass()); // => ret:#<こうたの弟子:0x4b98225c> class:99

インスタンスメソッドの呼び方

ret = container.get("こうたの弟子");
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:こうたの弟子 class:class org.jruby.RubyClass
ret = ((RubyClass)ret).newInstance(ThreadContext.newContext(ruby) , null);
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:#<こうたの弟子:0x3e8b8f0> class:class org.jruby.RubyObject
ret = container.callMethod(ret, "method", Object.class); // => instance method
printf("ret:%s class:%s \n", ret, ret.getClass()); // => ret:called class:class java.lang.String