2012年10月28日日曜日

[JavaScript]正規表現のプロパティ

JavaScriptで正規表現のプロパティから取得できる値のまとめ。

サンプルコート

    var p = /([a-z]+)([0-9]+)/i;

    // 現在の正規表現
    document.writeln('source = ' + p.source);
    // 文字列全体に対してマッチングするか
    document.writeln('global = ' + p.global);
    // 大文字小文字の区別
    document.writeln('ignoreCase = ' + p.ignoreCase);
    // 改行を行末と判断するか
    document.writeln('multiline = ' + p.multiline);

    // 静的なプロパティ
    var ret = 'abc123'.match(p);
    // 入力した値(abc123となる)
    document.writeln('RegExp.input = ' + RegExp.input);
    // グループ化した値の参照($ + グループ化の位置をしめす数字を指定する。)
    document.writeln('RegExp.$1 = ' + RegExp.$1);
    document.writeln('RegExp.$2 = ' + RegExp.$2);

結果

source = ([a-z]+)([0-9]+)
global = false
ignoreCase = true
multiline = false
RegExp.input = abc123
RegExp.$1 = abc
RegExp.$2 = 123

2012年10月18日木曜日

[ruby]ディレクトリ配下のファイルリストを取得

Dir. entriesを使う。

ディレクトリ配下の全ファイル一覧を取得

Dir.entries(".").each do |file| puts file end

結果

.
..
test.rb

一部ファイルの除外する場合

entriesの戻りの配列からdelete_ifで必要ないファイル名を削除する。
Dir.entries(".").delete_if do |file| file =~ /^\./ end.each do |file| puts file end

結果

test.rb

2012年10月7日日曜日

PL/SQLの Autonomous Transactions

AUTONOMOUS_TRANSACTIONプラグマを使用すると自律型のトランザクションを定義できます。
このトランザクションは、メイントランザクションと独立しているので、サブプロシージャないの処理を確実にコミットすることができます。
PL/SQLでログテーブルに書き込むときなどに使えるのではないでしょうか。

例

この無名PL/SQLは、innerサブプロシージャが自律型のトランザクションとなっています。
自律型トランザクション部分のtest1へのinsert処理は必ずコミットされます。
メイントランザクションではロールバックされるので、testへのinsertは取り消されます。
declare
  procedure inner
  is
    PRAGMA AUTONOMOUS_TRANSACTION;
  begin
    insert into test1 values ('1');
    commit;
  end;
begin
    insert into test values ('1');
    inner;
    rollback;
end;
/

実行前

test、test1ともテーブルは空です。
10:22:39 SQL> select * from test;

no rows selected

Elapsed: 00:00:00.00
10:27:56 SQL> select * from test1;

no rows selected

実行

10:27:43 SQL> r
  1  declare
  2    procedure inner
  3    is
  4  PRAGMA AUTONOMOUS_TRANSACTION;
  5    begin
  6  insert into test1 values ('1');
  7  commit;
  8    end;
  9  begin
 10  insert into test values ('1');
 11  inner;
 12  rollback;
 13* end;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.04
10:28:07 SQL>

実行後

自律型トランザクションのtest1だけinsertされていることがわかる。
10:28:01 SQL> select * from test;

no rows selected

Elapsed: 00:00:00.00
10:28:21 SQL> select * from test1;

C
-
1

Elapsed: 00:00:00.00
10:28:25 SQL> 

2012年9月30日日曜日

PL/SQLで更新結果の取得

SQL%属性を使用して、更新有無や更新件数を取得できます。

下の例は、update文になっているけどdeleteやmergeなどでも同じように取得できます。
begin
  update account set name = '名前変更' where id = '00001';
  -- sql%foundを使用して更新有無を判断
  -- trueの場合は更新あり
  if (sql%found) then
    dbms_output.put_line('updated');
  else
    dbms_output.put_line('no updated');
  end if;
  -- sql%rowcountで更新件数を取得
  dbms_output.put_line(sql%rowcount);
end;

実行結果

updated
1

PL/SQL procedure successfully completed.

2012年9月22日土曜日

GroovyのInheritConstructorsアノテーション

クラスにInheritConstructorsアノテーションを付加すると、親クラスが実装しているコンストラクタをコンパイル時に追加してくれます。

例

Fugaは、引数を2つうけるコンストラクタを持っていないが「InheritConstructors」を設定しているので、親クラスのHogeが実装しているコンストラクタが追加されていることがわかる。

import groovy.transform.InheritConstructors

class Hoge {

  def hoge1
  def hoge2

  Hoge(hoge1, hoge2) {
    println "Hoge.Hoge"
    this.hoge1 = hoge1
    this.hoge2 = hoge2
  }

  @Override
  public String toString() {
    return "Hoge{" +
            "hoge1=" + hoge1 +
            ", hoge2=" + hoge2 +
            '}';
  }
}

@InheritConstructors
class Fuga extends Hoge {
}

def fuga = new Fuga("hoge1", "hoge2")
println "fuga = ${fuga}"

GroovyのEqualsAndHashCodeアノテーション

equalsとhashCodeを生成してくれるアノテーション

例

EqualsAndHashCodeを付加してクラスを宣言します。

import groovy.transform.EqualsAndHashCode

@EqualsAndHashCode
class Person {

  String name
  String address
  Date birthDay
  String mailAddress

}

2012年9月16日日曜日

GroovyのTupleConstructorアノテーション

TupleConstructorを付加すると、属性(フィールド)値を引数に取るコンストラクタが追加されます。
コンストラクタの引数の順番は、フィールドの宣言の順番となります。

例

TupleConstructorを付加してクラスを宣言します。
import groovy.transform.TupleConstructor

@TupleConstructor
class Person {
  String name
  String address
  String email
  Date birthDay
}

使い方は、フィールドの宣言順に値を設定するだけ。
なお、Groovy2.0の新機能のTypeCheckedアノテーション(コンパイル時に型チェックをしてくれるやつ)を付加すると、ちゃんとコンパイルエラーになります。
class Hoge {

  @TypeChecked
  public static void main(String[] args) {

    def person = new Person('name', 'address', 'mail@mail.com', new Date())
  }
}