December 21, 2009

Enjoy Scala! #3 : 配列を扱う

こんばんは!
正月が待ち遠しい jugyo です!
みなさんは何歳くらいまでお年玉をもらっていましたか?

さて、Enjoy Scala! の第3回目です。
今日は Scala で配列を扱ってみたいと思います。

ではさっそくコードを見てみましょう。

// Array を new
val strings = new Array[String](4)
// 配列に値をセット
strings(0) = "A"
strings(1) = "B"
strings(2) = "C"
strings(3) = "D"
// 出力
strings.foreach(i => println(i))

この例では、長さが 4 の配列を定義しています。
strings(3) = "D"」のように「()」を使って配列に値をセットしていますね。
こう書いたとき、コンパイラが「strings.update(3, "D")」というふうに update メソッドを呼び出すかたちに変換してくれるらしいです。

次に、配列の 0 〜 2 番目までを出力したいとしましょう。
そういう場合は以下のようにします。

for (i <- 0 to 2)
  println(strings(i))

ちなみに、上記の「0 to 2」という部分は実際には「(0).to(2)」というメソッド呼び出しに変換されるらしいです。
なので、以下のように書きかえることもできます。

for (i <- 0.to(2))
  println(strings(i))

さらに、 foreach メソッドを使って以下のように書きかえることもできます。

0.to(2).foreach(i => println(strings(i)))

で、さっきの「0 to 2」が「(0).to(2)」となる件ですけど、 Scala ではメソッド呼び出しの際、レシーバが明示的に指定されていると「.」と「()」を省略できるらしいです。
なので例えば、「(1).+(1)」というメソッド呼び出しを「1 + 1」というふうに書けるんです!

面白いですね!

初めての Scala #2 : foreach と for

こんばんは!
クリスマスが待ち遠しい jugyo です!
ずいぶん寒くなってきましたね!

さて、今日は Scala の foreachfor についてのお話です。

foeach と for と

scala コマンドでスクリプトを起動した際、 args という変数にプログラムの引数が入ってきます。
配列の foreach メソッドを使って引数のリストを出力してみます。

args.foreach(arg => println(arg))

上記の例では foreach メソッドに arg => println(arg) という関数を渡しています。
arg => println(arg) というのが Scala における関数リテラルみたいです。
引数を一個しかとらない関数リテラルの場合は引数を省略できるらしく、上記の例だと以下のように書くこともできます。

args.foreach(println)

関数リテラルで明示的に型を指定することもできて、その場合は以下のようになります。

args.foreach((arg :String) => println(arg))

Scala では型は基本的に変数等の後ろに書くみたいです。

ちなみに for 文(式?)もあって、それを使うと上記のコードを以下のように書き換えることができます。

for (arg <- args)
  println(arg)

僕は foreach のほうが好きですね。

December 19, 2009

Scala はじめました

Home

Scala にとても興味が湧いてきたので本を買って勉強を始めました。
そのうち勉強会とかやりたいです。

とりあえず今日は Scala をインストールしてインタープリターを少しだけ使ってみました。

Mac での Scala のインストール

MacPorts を使えば簡単にインストールできる。

sudo port install scala

Scala インタープリターの起動

scala とだけ入力して実行すると Scala インタープリターが起動する。
僕の環境だと以下のような感じになる。

% scala
Welcome to Scala version 2.7.5.final (Java HotSpot(TM) Client VM, Java 1.5.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 

インタープリター中で日本語を使いたい場合は -Xnojline オプションを付ける。

Hello World!

とりあえず「Hello World!」を出力してみる。

scala> println("Hello World!")
Hello World!

変数の定義

Scala には var と val の二種類の変数がある。
var は Ruby にもあるようないわゆる普通の変数。
val は Java の final に似ていて、初期化後に別の値を代入することができない。

var の場合:

scala> var foo = "foo"
foo: java.lang.String = foo

scala> foo = "FOO"
foo: java.lang.String = FOO

val の場合:

scala> val foo = "foo"
foo: java.lang.String = foo

scala> foo = "FOO"
<console>:5: error: reassignment to val
       foo = "FOO"
           ^

val に値を再代入しようとすると怒られる。

参考

今この本を読んでいます。
わかりやすくかつおもしろいです。

December 18, 2009

GAE で Sinatra を使って “foo” を表示する最速の方法

appengine_lowres

あなたは急に、 Google App Engine で Sinatra を使って “foo” を表示したくなりました。

以下は、現時点で僕が知ってるその最速の方法です。
参考にしてください。
ちなみに環境は Mac OSX です。

google-appengine というライブラリを gem でインストールします。

% gem install google-appengine

プロジェクトのディレクトリを作成します。

% mkdir foo
% cd foo

config.ru というファイルを作成します。
以下を記述します。

require 'appengine-rack'
AppEngine::Rack.configure_app(
  :application => "application_id",
  :version => 1
)
require 'foo.rb'
run Sinatra::Application

Gemfile というファイルを作成します。

# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"
# List gems to bundle here:
gem "appengine-rack"
gem "sinatra"

foo.rb というファイルを作成します。

require 'sinatra'

get '/' do
  'foo'
end

試しにローカルで起動してみます。

% dev_appserver.rb .

(僕の環境だと一回目はなぜか起動に失敗します)

そしていよいよデプロイです。

% appcfg.rb update .

デプロイが完了したら http://<application_id>.appspot.com/ にアクセスしてみましょう。
立ち上がりはお世辞にも早いとは言えませんが、そのうち foo が表示されるはずです。

Picture 13

enjoy foo!

See also: http://code.google.com/p/appengine-jruby/

December 15, 2009

sinatra_debug_console

Description

http://github.com/jugyo/sinatra_debug_console

Debug console for sinatra

Debug console for sinatra

Installation

gem install sinatra_debug_console

Usage

require 'sinatra_debug_console'
Sinatra::DebugConsole.config(USERNAME, PASSWORD)

Example

# % ruby app.rb
# see http://localhost:4567/debug_console

require 'sinatra'
require 'sinatra_debug_console'
Sinatra::DebugConsole.config('admin', 'password')
December 5, 2009

Growl で開発の効率をUP!

Picture 4

(この記事は Ruby Advent Calendar jp: 2009 : ATND の5日目です。前日は authorNari さんでした)

こんばんは!
g こと jugyo です!
今日は Growl を使って開発の効率をUP!させる方法について紹介したいと思います。
しばしお付き合いください。
Mac ユーザーでない方もしばしお付き合いください。
Growl については以下のページが参考になるかと思います。
Growl | Macの手書き説明書

g

まず g について。
g はデバッグ用のツールで、 p で出力されるような文字列を Growl を使って表示します。
標準出力に出すよりも目立っていい感じです。

g

インストール方法:

gem install g

Growl の設定で以下の項目にチェックが着いていることを確認してください。

growl_config

使い方:

require 'g'
g "Ruby Advent Calendar jp: 2009!"

簡単ですね♪

growl-logger

次は growl-logger について紹介したいと思います。
みなさんは Logger って使ったことありますよね?
logger.debug("foo bar") とかやるアレです。
growl-logger はそんな Logger の一種で、 Growl を使ってログを出力します。
Growl 側の設定を変えることで、以下のようにログレベルに応じて色を変えることが可能となっています。

3384656890_446c1cd6e2_o

これを思いついたときは「すごい発明だ!」と思ったのですが、現状あまり使われていないようです。
私も使っていません。

インストール方法:

gem install growl-logger

growl_sql

最後に growl_sql の紹介をしたいと思います。
growl_sql は Rails のプラグインです。
Rails アプリが発行する SQL を Growl を使って画面に表示します。

使用例:

以下のようなフォームをポストすると…

Picture 5

実行された SQL 文が表示される!

Picture 8

growl_sql が出力する SQL 文は INSERT と UPDATE と DELETE の3種類です。

はじめ、 SELECT 文を含むすべての SQL を出力するようにしていたら画面が SQL で埋め尽くされて大変なことになりました。
Growl の使いすぎに気をつけましょう。

インストール方法:

./script/plugin install git://github.com/jugyo/growl_sql.git

結論

Growl って楽しいですね!

(明日、6日目は takkanm さんです!お楽しみに!(そういえば takkanm さんにはお会いしたことないなぁ))