2012年2月29日水曜日

継続的デリバリー本を予約

リリースの仕組みとかってどんなプロジェクトでも悩まされたりするからポチッてみた。
内容は全くわからいけど、かなり期待して発売を待ってみる。



2012年2月25日土曜日

IntelliJでruby on rails

IntelliJでruby on railsのプロジェクト作る方法。
前提として、IntelliJはUltimate Editionを入れておかないとrubyプラグインが入れられないのでrailsの開発はできません。

rubyプラグインの入れ方は、http://se-bikou.blogspot.com/2011/03/intellijruby.htmlを参照

また、gemでrailsなどの必要なモジュールを事前にinstallしておかないとrailsのプロジェクト作れないので入れておきましょう。

1.プロジェクトを作成する
メニューから「New Project」を選択して、表示された「New Project」で「Create project from scratch」を選択して次へ。

「project files location」を入力して、「select type」でrubyを選択して次へ。
※project files locationを入力すると、Project名などは自動で入ってくれます。なので、任意のディレクトリを「project files location」に入力してあげればよいです。

Specify the Ruby SDKの画面が出てくるので、railsプロジェクトで使いたいrubyのバージョンのSDKを選択します。
RubyのSDKの設定がされていない場合は、ConfigureボタンからSDKの設定をしてあげます。

rubyのSDKは、下の画像の順に行っていきます。最後の「Ruby SDK」を選択するとファイルを選択するダイアログが開くのでrubyの実行モジュールを選択してあげます。

次の画面では、Ruby on Railsを選択してバージョンを選択してあげます。また、railsアプリケーションを作る必要があるので「Generate new Rails application」にチェックを入れます。


これでプロジェクトの作成は完了です。プロジェクトの作成が完了するとProject Viewがこんな感じになります。

2.コントローラを作って画面を表示してみよう
rails generateコマンドはguiで作業できるので、簡単にコントローラを作ることが出来ます。
まずは、「tool」メニューから「rails generate」を選択します。

「generator」メニューで「controller」を選択します。

Controller名を入力して、Actionを定義してあげます。今回はController名は「Test」、Actionは「index」のみにしています。

「Project view」の表示を「Rails」に変えてあげると、こんな感じに見やすくなります。Controllerもちゃんと出来てますね。

「Run」から開発用設定でWEBRickを起動してみましょう。

最後に画面が表示されることを確認しましょう。



[jQuery]fadeOutとfadeIn

fadeOutは対象の要素を隠してくれて、fadeInは表示してくれる。


fadeOutとfadeInの引数

1.speed
  速度を指定する。数値(ミリ秒)を指定した場合は、そのスピードで表示、非表示になります。
  文字列を指定した場合は、以下のどうさになります。ざっくり指定するにはこれですね。

  slow:ゆっくりと
  normal:普通
  fast:早く

  *この値を省略した場合は、「normal」な動作となります。
2.callback
  表示、非表示が完了したタイミングでコールバックされる関数。任意指定だから特に指定しなくても大丈夫。

下の例は、表示、非表示はゆっくりな動作を指定して、非表示にした場合にはボタンのラベルを「表示」にし、表示した場合には「閉じる」にしています。
<script type="text/javascript">
    $(function () {
        var button$ = $('input[type=button]');
        button$.toggle(
                function () {
                    $('div#hoge').fadeOut("slow", function() {
                        button$.val("表示");
                    });
                },
                function() {
                    $('div#hoge').fadeIn("slow", function() {
                        button$.val("閉じる");
                    });
                }
        )
    })
</script>

2012年2月23日木曜日

Kotlinの配列を色々触ってみた

Kotlinの配列を色々試してみた。

繰り返し処理

Scalaなどでもお馴染みのforcachforEachでぐるぐるまわします。
foreachforEachに指定する関数では、要素を「it」で参照できるみたいです。groovyちっくですね。
rubyのように、each_widh_indexみたいなので添字付きでぐるぐるまわすことはできないのかな。

var arr1 = array(1, 2, 3, 4)
arr1.forEach {println(it)}

配列の各要素を連結

おなじみのjoin関数を使って連結出来る。
// カンマで連結
arr.join(",")    // -> 1,2,3,4

// プレフィックス、サフィックスを指定して連結
arr.join(",", "<", ">")    // -> <1,2,3,4>

要素の中身全てが指定した条件を満たすかチェック

all関数を使用する。条件は、all関数の引数として指定してあげる。
// 全ての要素で条件をみたすことができない場合
var arr1 = array(1, 1, 1, 0)
arr1.all {it == 1}    // -> false

// 全ての要素で条件をみたすことが出来る場合
var arr2 = array(1, 1, 1, 1)
arr2.all {it == 1}    // -> true

// 文字列の場合
var str = array("1", "2", "3")
str.all {it <= "3"}    // -> true
str.all {it <= "2"}    // -> false

要素の中のどれか1つが指定した条件を満たすかチェック

any関数を使用するる。条件は、any関数の引数として指定してあげる。
// 要素ないに1つでも条件を満たす値がある場合
var arr1 = array(1, 0, 2, 0)
arr1.any {it == 1}    // -> true

// 要素ないの値が全て条件を満たさない場合
var arr2 = array("1", "2", "3")
arr2.any{it > "3"}    // -> false

要素の中で条件を満たす最初の値を取得する

他の言語でもお馴染みのfind関数を使います。使い方も他の言語と同じですね。
var arr1 = array(1, 0, 2, 0)
// 要素が見つかる場合
arr1.find {it == 0}    // -> 0
arr1.find {it == 2}    // -> 2

// 要素が見つからない場合
arr1.find {it == -1}    // -> null

要素の中で条件に一致したものを新しい配列で取得する

他の言語(Scala)でもお馴染みのfilter関数を使います。使い方も他の言語と同じですね。
var arr1 = array(1, 0, 2, 0)
arr1.filter {it % 2 == 0}    // -> [0, 2, 0]

var arr2 = array("1", "2", "3")
arr2.filter {it.length() == 1}    // -> ["1", "2", "3"]
// 条件に一致する要素が存在しない場合は、空の配列が戻ってきます。
arr2.filter {it.length() != 1}    // -> []

要素の中で条件に一致しないものを新しい配列で習得する

filterの逆ですね。これも他の言語(Scala)でもお馴染みのfilterNot関数を使います。使い方も他の言語と同じですね。
var arr1 = array(1, 0, 2, 0)
arr1.filterNot {it % 2 == 0}    // -> [1]

var arr2 = array("1", "2", "3")
arr2.filterNot {it.length() != 1}    // -> ["1", "2", "3"]
arr2.filterNot {it.length() == 1}    // -> []

各要素の値を変換して新しいCollectionを取得する。

ScalaにもあるflatMapを使ってあげるといけます。
引数の型パラメータと戻りの型パラメータが異なるから、flatMapに型パラメータ指定してあげないと動かなかった。
なんか間違ってるのかな?
ちなみに、arrayListやlinkedList関数は、「std.utilパッケージ」にあるのでimportしてあげないと使えないです。
// 各要素の値を2倍にする。
var arr1 = array(1, 2, 3)
arr1.flatMap<Int, Int> {(n) -> arrayList(n * 2)}    // -> [2, 4, 6]

// 各要素先頭にstr =を加える。
var arr2 = array("1", "2", "3")
arr2.flatMap<String, String>{(s) -> linkedList("str = ${s}")}    // -> [str = 1, str = 2, str = 3]

2012年2月19日日曜日

[jQuery]イベントに応じて要素の表示、非表示を切り替える(アコーディオン)

jQueryを使用して、要素の表示と非表示を切り替えるには、toggleやslideToggle関数を使うと簡単に実現出来ます。

toggle関数は、引数を指定しないで呼び出してあげるとその要素の表示(show)と非表示(hide)を繰り返してくれます。
slideToggle関数を使うと、非表示にするときには徐々に消えていき、表示するときにはにょきにょきでてきます。

引数なしでtoggleとslideToggleを使ってみる

以下のhtmlをdiv部分をボタンクリックイベントで表示、表示を切り替えてみましょう。
<input type="button" value="表示・非表示切り替え" id="btn">

<div id="view">
この部分の表示、非表示を切り替えます。
</div>

toggle関数を使用すると、非常に簡単に表示、非表示を切り替えられますね。
$(function () {
    $('input#btn').click(function () {
        $('div#view').toggle();
    });
})

slideToggleもtoggleと使い方は基本的に同じ。
$(function () {
    $('input#btn').click(function () {
        $('div#view').slideToggle();
    });
})

表示、非表示の速度を変えてみる

toggleとslideToggleの引数には、ミリ秒と速度を示す文字列を指定出来ます。

ミリ秒を指定した場合は、その時間をかけて非表示になったり表示したりしてくれます。
文字列は、「Slow」、「Normal」、「Fast」の3種類が指定できまる。
以下のように、文字列通の動作をします。ミリ秒指定と比べるとかなりおおざっぱな感じですね。
* Slow:ゆっくりした動作
* Normal:普通の動作
* Fast:早い動作

使い方の例。この例だと2秒間かけて表示と非表示されます。
$(function () {
    $('input#btn').click(function () {
        $('div#view').slideToggle(2000);
    });
})

文字列指定の場合は、こんな感じです。
$(function () {
    $('input#btn').click(function () {
        $('div#view').toggle('fast');
    });
})

2012年2月18日土曜日

[Kotlin]安全なnull参照

Kotlinではxnull参照が型システムでコントロールされているので、NullPointerExceptionが発生することがないようです。

実際にサンプルコードで動作を確認してみよ。

例1:nullを許可しない変数

通常の変数宣言は、nullを許容しない変数となります。つまり、nullを代入することが出来ない変数なので、
Javaの実装でよくあるnullだったらどうしよう・・・という分岐が必要なくなります。

例えば、以下のコードはnullを許容しない変数にたいするnull代入となるためコンパイルエラーとなります。
var s:String
s = null

例2:nullを許可する変数

nullを許容する変数は、型の末尾に「?」を付加する必要があります。これにより、nullを変数に代入可能となります。
また、その変数を参照する際には、変数の末尾に「?」を付加して参照しないとコンパイルエラーになります。

このnull許可変数は、参照した際にnullの場合はnullが返却されるようになっています。JavaのようにNullPointerExceptionが発生することはないわけですね。

// 型の末尾に「?」を付加する。
var s:String? = "hoge"
val length = s?.length() // -> 4

// 変数がnullの場合に、参照を行うと戻り値もnullとなります。
s = null
val length2 = s?.length() // -> null

例3:Javaと同じようにNullPointerExceptionを送出したい場合

sure関数を使用すると、nullの場合にNullPointerExceptionが送出されます。
var s:String? = "1"
var length = s.sure().length()      // nullでは無いので、「1」が返却されます。

s = null;
length = s.sure().length()          // nullなのでNullPointerExceptionが送出されます。

実際に送出された例外のStackTraceです。
Exception in thread "main" jet.runtime.Intrinsics$JetNullPointerException
 at nullCheck.namespace.main(hoge.kt:21)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:601)
 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

例4:Elvis operator(null値の判定で使用する)

nullの場合に、何か別の値を返す場合に使用するらしいです。

例えば、Javaで文字列の長さを返す際にその値がnullの場合は、-1を返すとする場合は、
以下のように三項演算子を使うと思います。
s != null ? s.length() : -1
これを、KotlinのElvis operatorで書くとこんな感じになります。
null意外の場合は、「:」の左側の式の結果(この場合だとlengthの結果)が返却され、nullの場合は「:」の右側の結果が返却されるようです。
b?.length() ?: -1

例5:安全なキャスト

安全にキャストを行うためには、「as?」を使用する必要があります。
「as?」を使用した場合、その型にキャストができない方の場合にはnullが返却されます。
「as」を使用した場合には、TypeCastExceptionが送出されます。

val s = "123";
var i1:Int = s as Int    // これは、TypeCastExceptionが送出されます。
var i2:Int? = s as? Int  // これは、nullが返却されます。


Collection系のオブジェクトから値を代入したときにその値がnullだった場合どんな動きをするんだ?
これは、コンパイル時にチェックするのは不可能だし、どんな動きをするんだろう?と思って調べてみました。

調べたときにつかったコード
val arr:Array<String?> = array(null)   // nullを許容するArray
val s:String = arr[0]                  // nullが代入出来る。
s.length()                             // ぬるぽではなく、TypeCastExceptionが発生

nullが代入されたnull不可変数を参照したら、まさかのTypeCastExceptionが発生しました。
これだったらNullPointerExceptionのが分かりやすいんじゃね?TypeCastExceptionじゃ原因特定出来る気がしない・・・。
この辺はこれから改善されていくかもしれませんが。

ScalaのOptionなるものがあったからこんどScalaのほうもちゃんと勉強してみよう。

2012年2月15日水曜日

[Kotlin]IntellijでKotlinしてみた。

Intellij用のKotlin pluginがでたので、Intellijに導入してみた。

現時点では、Intellij11.1のEAPにしか対応していないので、Intellij11.02ではなく11.1のEAPを導入しておく必要があります。

プロジェクトの作成手順などは、Kotlinのサイト(下のリンク先)の動画を参考にしたら割と簡単に出来ると思います。
http://confluence.jetbrains.net/display/Kotlin/Welcome

では、上の動画を参考にプロジェクトを作成して、Hello Worldを動かしてみましょう。

Kotlinプラグインと、ライブラリのダウンロード

プラグインとライブラリは、github(https://github.com/JetBrains/kotlin/downloads)からダウンロード出来ます。

ダウンロードしたプラグイン(解凍して出来たKotlinディレクトリ)は、Intellijのプラグインディレクトリにコピーします。

macの場合:~/Library/Application\ Support/IntelliJIdea11
Windowsの場合:USER_HOME/.IntelliJIdea11/config/plugins

ライブラリは、任意のディレクトリに解凍しておきます。

Javaプロジェクトの作成

new projectから新しいプロジェクトを作成します。Javaのプロジェクトとして作成してあげたらいいので、特に迷うことはないと思います。

Kotlinのソースコードファイルの生成

ソースコードディレクトリで右クリック→Newとすると、下の画像のようにKotlin Fileが選択出来るようになっています。
これが出てこないときは、プラグインがうまく適用出来ていないので、Settingsからpluginが適用出来ているか確認してみた方がよいでしょう。


Kotlin Fileを選択すると、下の画像のようにファイル名を入力するダイアログが表示されるので、
ファイル名を入力してOKとしてあげましょう。なお、ファイル名には拡張子を入力する必要はありません。


Kotlinライブラリの設定

初めてKotlinのソースファイルを作成すると、Kotlin Runtimeをセットアップしてねとのバーが表示されます。
下の画像のように、ライブラリパスを設定するダイアログに一番最初にダウンロードして解凍したKotlinライブラリのlibディレクトリのパスを設定してあげます。


Hello Worldを出力するコードの作成

http://confluence.jetbrains.net/display/Kotlin/Welcomeを参考にして作成します。

作成したソースはこんな感じですね。
fun main(args : Array<string>) {
    println("Hello World")
}

実行してみよう

右クリックで表示されるメニューからrun namespaceを選択して実行してみよう。
なお、packageを定義しているとrun パッケージ名とメニューに表示されます。

実行した結果、下の画像のようにコンソールにHello Worldが出力されたら実行成功です。