2011年12月31日土曜日

[Intellij]InttelijでjQueryを使ってみよう

IntelliJ IDEA Ultimate EditionではjQueryをサポートしているので、関数補完などを使いながら開発を行うことができます。
IDEでごりごり書いた方が、生産性あがるはずなので、IntellijでのjQueryライブラリの使い方を調べてみたと。

jQueryのライブラリを自分でダウンロードする場合

1.jQueryのサイトからjQueryのライブラリをダウンロードして任意のディレクトリに保存する。

2.Project Structure画面を開く

3.左側のメニューからGlobal Librariesを選択する。

4.「+ボタン」→「JavaScript」の順に選択する。(下の画像のように選択していく)

5.1で保存したjQueryのライブラリ(jquery-<バージョン番号>.js)を選択する。

6.左側のメニューからModulesを選択する。

7.jQueryを使用するModuleを選択して、依存ライブラリに5で追加したjQueryのライブラリを登録する。
登録すると下の画像のようにjQueryのライブラリが依存ライブラリにでてきます。
※Dependenciesタブを選択し、左下の「+ボタン」→「Library...」から5で登録したライブラリを選択出来ます。

Intellijの機能でダウンロードする場合

Inttelijには、JavaScriptのライブラリをダウンロードしてくれる機能があるので、
この機能を使うと依存ライブラリの設定まで簡単に行うことが出来ます。

1.Settings画面を開く

2.左側のメニューからJavaScriptLibrariesを選択する。(Project Settingsにあります)

3.Download from...のリンクをクリックしDownload LibraryのWindowでjQueryを選択してダウンロードする。(ちょっと古いバージョンみたいです。)
これで、依存ライブラリとしてjQueryのライブラリが設定されます。簡単ですね。

動作を確認してみよう

補完がちゃんと有効になってるみたい。使いやすいかわからないけど、とりあえずjQueryの勉強しつつ使ってみよう。

2011年12月13日火曜日

[Oracle]テキストリレラルの使用方法

Oracleでシングルクォート(')を文字列中で使う場合、シングルクォートでエスケープ必須だと思ってましたが、
代替引用メカニズムなるものを使用してrubyっぽくエスケープをせずにリテラルが定義できるみたいです。

マニュアルはこちら
http://docs.oracle.com/cd/E16338_01/server.112/b56299/sql_elements003.htm#i42617

従来までのリテラルの使い方
SQL> select 'hoge''s' from dual;

'HOGE''S'
------------
hoge's

大替引用メカニズムなるものを使用するとかんな感じになります。
q(Q)'任意の文字(開始)<文字列>任意の文字(開始文字に対応した終了文字)'

SQL> select Q'{hoge's}' from dual;

Q'{HOGE'S}'
------------
hoge's

任意の文字の部分には、何でも使用できるのでこんな感じでもいけちゃいます。ものすごくわかりづらいですが。
SQL> select Q'ahoge'sa' from dual;

Q'AHOGE'SA'
------------
hoge's

2011年12月9日金曜日

[Intellij]コード補完を使いこなそう

Intellijには、3種類の補完方法が存在します。
Eclipseだと、補完といったらCtrl + Spaceだけ使っていたらいいと思うけど、Intellijだとこの3種類をうまく使いこなせないと、ちょっと残念な感じになってしまう。

ちなみに、3種類の補完は下の画像のように「Code」→「Completion」から使うことが出来ます。(マウス操作で使うことはまずないと思うけど)

それぞれの補完機能の説明

Basic補完

基本的な補完機能。EclipseのCtrl + Spaceで出来る補完機能と同じ感じの補完となる。(Eclipseとは少し違うかもしれませんが、勝手な想像で書いています)
そのスコープ内で使用可能な変数などをもとに補完候補を表示するので、変数やパラメータとして使用出来ないデータ型のものも候補として表示される。

使いどころとしては、変数やパラメータの補完よりかはメソッドの修飾子やthrows節の例外のようにそこで使用する修飾子やクラスや変数が自明な場合に使用します。(と勝手に思っています。)
こんな感じに補完候補が表示されます。

例えばメソッドの引数でBasic補完を使うと、データ型が一致していて代入可能なものがあればその変数を候補として上位に表示してくれます。
下の画像のように、mのパラメータがStringなのでString型の変数が上位に表示されます。

使い方を間違えるとこんな感じに意味のないものが列挙されちゃったりもします。これは間違った使い方だと勝手に思ってますが。

ほかにもpropertyファイルのキー値をこんな感じで補完してくれたりします。ほかにも色々やってくれると思います。(たぶん)


SmartType補完

SmartType補完は、そこで利用可能なもののみにフィルタをかけて候補を表示してくれます。Basic補完のように使用可能な変数やクラスを候補として列挙することはなく、使用可能なものがなければ、ないよと教えてくれます。
この補完にであって、IDEってすげーって思った記憶があります。

使い方としては、変数宣言時の右辺やreturn文などで使います。俺は、補完よりもリファクタリング機能のIntroduce Variable使っちゃうことが多いけど、なれてきたら補完とリファクタリングをうまく使い分けれるようなると思います。

SmartType補完が有効に使える場所
  • 変数宣言時の初期化
  • 初期化で必要なコンストラクタ呼び出しや、メソッド呼び出しなど
  • 変数呼び出しのパラメータ
  • return文
Basic補完との違いは、下の画像を見るとわかると思います。

ClassName補完

補完候補としてクラス名を列挙してくれる機能です。
主に変数宣言時に使いますが、この補完機能を文字列内で使うと選択したクラスの完全修飾名を挿入してくれます。

例えば・・・
java.util.ArrayListを補完候補から選択した場合、文字列には"java.util.ArrayList"が挿入されます。

また、Class Name補完はクラスパス配下にあるファイルも候補として表示してくれます。
なので、クラスパス配下にあるpropertiesやxmlなどのパスを入力する時に、この補完をつかうと入力の手間を減らすことが出来ます。

イメージ的には、こんな感じに補完されます。

補完の俺設定

こだわりがあるのは、Case sensitive completionはFirst letterにしるのと、
ドキュメントとパラメータのポップアップを切ってる部分かな。

2011年11月27日日曜日

[oracle]DBの値をバイナリでダンプする方法

DUMP関数を使用して、
任意の値をバイナリでダンプすることができる。

構文

dump(任意の値(列名), フォーマット, スタートポジション, 長さ)
  • 任意の値(列名)
  • 文字列をリテラルで指定するか、カラム名を指定する。
  • フォーマット(任意)
  • 以下の値を指定する。
    8→8進数でダンプ
    10→10進数でダンプ
    16→16進数でダンプ
    上記の値に1000をプラスすると、ダンプ時にキャラクタセットを表示してくれる。
  • スタートポジション(任意)
  • ダンプの開始位置
  • 長さ(任意)
  • ダンプする長さ

使用例


普通にSQLを実行した場合
SQL> select col1 from test;

COL1
----------
12345

16進数でダンプした場合
SQL> select dump(col1, 16) from test;

DUMP(COL1,16)
--------------------------------------------------------------------------------
Typ=1 Len=5: 31,32,33,34,35

キャラクタセットを表示しつつダンプした場合

SQL> select dump(col1, 1016) from test;

DUMP(COL1,1016)
--------------------------------------------------------------------------------
Typ=1 Len=5 CharacterSet=AL32UTF8: 31,32,33,34,35

macでIntellijのpluginプロジェクトを実行出来なかった場合の対処

macでIntellijのpluginプロジェクトからpluginの実行したら、実行時エラーがでて実行できない・・・
本来であれば、新たにIntellijが起動してそこでpluginの挙動を確認出来るのに。

原因なんだろと思って調べてたら、実行時のvmoptionがとんでもないことに。
下の画像のように、なんかxmlになってるし。

なにが正しいかよくわかんなかったので、Windowsで起動したときのvm option(以下のオプション)をもってきたら、うまいこと起動した。
-Xms128m -Xmx800m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=64m -XX:+UseCompressedOops

Intelijのバグチケットに同じ事象のがあがってて、中の人のコメントによるとworkspase.xml($PROJECT_HOME$/.idea配下にある)を削除してからプロジェクト起動するとよいらしい。
http://youtrack.jetbrains.net/issue/IDEA-76854?projectKey=IDEA&query=plugin+run

2011年11月13日日曜日

[Scala]値の遅延評価

val定義にlazy修飾子をつけることによって、右辺の初期化処理の実行を遅延させることが出来る。

lazyなvalは、初めてその変数にアクセスが行われたときに初期化(右辺の初期化式の実行)が行われる。
2度目にアクセスした時には、既に初期化されているので初期化は行われない。

サンプルコード

object Hoge {
  val hoge = {
    println("init hoge")
    "hoge"
  }
  
  lazy val lazyHoge = {
    println("init lazyHoge")
    "lazyHoge"
  }

  def main(args: Array[String]) {
    println(Hoge)
    println("========== hoge ==========")
    println(Hoge.hoge)
    println("========== lazy hoge ==========")
    println(Hoge.lazyHoge)
    println("========== lazy hoge2 ==========")
    println(Hoge.lazyHoge)
  }
}

実行結果

以下の点を確認出来る。
  • 通常のvalは、クラス参照時に初期化されていることがわかる
  • lazyなvalは、その変数に初回にアクセスしたときに初期化されていることがわかる
init hoge
Hoge
========== hoge ==========
hoge
========== lazy hoge ==========
init lazyHoge
lazyHoge
========== lazy hoge2 ==========
lazyHoge

2011年11月6日日曜日

Excel列名変換

また、こちらのブログを見てチャレンジ。

http://d.hatena.ne.jp/JunichiIto/20111102/1320253815


Scalaで書いてみたけど、Scalaっぽいのかわからない。

object Main {

  val cols = Range('A'.toInt, 'Z'.toInt + 1, 1).map {
    n => n.toChar
  }

  val stringPattern = "[A-Z]+".r

  def toNumber(alpha: String, num: Int): Int = {
    if (alpha.isEmpty) {
      num
    } else {
      toNumber(alpha.drop(1), num * 26 + (cols.indexOf(alpha.head) + 1))
    }
  }

  def toAlpha(num: Int, alpha: String): String = {
    if (num <= 0) {
      alpha
    } else {
      (num % 26) match {
        case 0 => cols(25) + alpha
        case n: Int => toAlpha(num / 26, cols(n - 1) + alpha)
      }
    }
  }

  def main(args: Array[String]) {
    args(0) match {
      case stringPattern() =>
        println(toNumber(args(0), 0))
      case _ =>
        println(toAlpha(args(0).toInt, ""))
    }
  }
}