2013年12月21日土曜日

Rails4で「The provided regular expression is using multiline anchors (^ or $), 」エラー

Rails4を使って「RailsによるアジャイルWebアプリケーション開発」を写経していたら、
7章のバリデーションの実装のところで下のエラーが発生した。

The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?

これは、正規表現で「^」や「$」を使って精査していると複数行とのマッチで精査が完全じゃないよってことで発生するエラーのようです。
マルチラインでも先頭、末尾を判定できる「¥A」、「¥z」を使うと解決します。

変更前

validates :image_url, allow_blank: true, format: {
      with: %r{\.(gif|jpg|png)$}i,
      message: 'はGIF、JPG、PNG画像のURLでなければなりません'
  }

変更後

validates :image_url, allow_blank: true, format: {
      with: %r{\.(gif|jpg|png)\z}i,
      message: 'はGIF、JPG、PNG画像のURLでなければなりません'
  }

stackoverflowに全く同じ本で困っている人がいて、何が問題なのか分かりやすく書かれてる。
http://stackoverflow.com/questions/17759735/regular-expressions-with-validating-in-ror-4

2013年11月19日火曜日

[ruby]正規表現で文の先頭(末尾)と行頭(行末)

Rubyの正規表現の文の先頭(末尾)と行頭(行末)

文の先頭と末尾は、\Aと\zで表現する。
行の先頭と末尾は、^と$で表現する。

lines = "line1\nline2"

# line1とline2を含め文字列全体でマッチする
puts /\A.+1.+2\z/m === lines

# line1だけでマッチする
puts /^.+1$/ === lines

2013年11月17日日曜日

[oracle12c]offsetを指定した上位n件の取得

Oracle12cの変更点のSELECT機能の強化に、下の記述がありました。
この機能を使うと、検索結果から指定した範囲のデータをねらって取得でき非常に便利だと思います。
※昔はROWNUM擬似列と副問い合わせ使って頑張って同じようなことをした記憶があります。

上位N番までの問合せの実行に、オフセットと、戻される行数または行数の割合を指定できます。

使い方

IDでソートして、11レコード目から5レコード取得する場合

開始レコード番号は、offsetに指定した値 + 1なのでoffsetには10を指定する。
select *
 from table1
order by id
offset 10 rows fetch first 5  rows only;

最後のレコードと同一のソートキーのレコードは、リミットを超えても全部取得する場合

最初のレートは異なり最後のキーワードをwith tiesにする
select *
 from table1
order by id
offset 10 rows fetch first 5  rows with ties;

注意点

ソート(order by)とセットで使わないと結果が毎回変わる可能性がある。

2013年11月10日日曜日

[Oracle12c]子表を再帰的に切り捨てできるように

Oracle12Cでは、TRUNCATE文に「CASCADE」句をつけることで、子表(孫も含む)のテーブルも含めて切り捨て出来るようになる。

小表も含めて切り捨てる方法

参照整合性制約を作成する際に「ON DELETE CASCADE」を指定する。

ALTER TABLE ACCOUNT ADD FOREIGN KEY (ADDRESS_CD) REFERENCES ADDRESS (CD) ON DELETE CASCADE;

TRUNCATE文にはCASCADE句を指定する。

TRUNCATE TABLE ADDRESS CASCADE;

2013年11月9日土曜日

[coffeescript]strictモードを使う

coffeescriptでstrictモードを使用するには、関数の先頭で、「use strict」を記述してあげれば良い。

スクリプトの場合

func = ->
  'use strict'
  arguments.callee

変換されたJavaScript

(function() {
  var func;

  func = function() {
    'use strict';    return arguments.callee;
  };

}).call(this);

2013年10月26日土曜日

[coffeescript]coffeescriptをコンパイルしてJavaScriptに変換

coffeeコマンドを使用してコンパイル(JavaScriptへの変換)を行う。

コンパイル方法

-c -> コンパイルを行う。
-w -> -cとセットで使うことでファイルを保存するたびに自動でコンパイルを行うことが出来る

2013年10月14日月曜日

[Oracle12c]auto incrementみたいな新機能

Oracle12cでは、auto incrementっぽいカラムを定義できるようなので試してみた。

auto incrementっぽいカラムを定義するには、下のSQLのように「generated as identity」を指定する。
-- 常に生成した値を設定する(明示的に値を設定しようとするとエラーとなる)
id number generated as identity not null

-- generatedの後にalwaysを指定すると、常に生成した値を使用する
-- デフォルト動作なので、上のオプション無しと同じ動きとなる
id number generated always as identity not null

-- by defaultを指定すると値の設定がない場合のみ、生成した値が設定されます。
-- on nullをby defaultの後に設定すると、挿入(更新)対象の値がnullの場合にも、生成した値が設定されます。
id number generated by default as identity not null

生成する値のルールは、オプションとして指定します。指定する値のルールはシーケンスオブジェクトと同じなので省略します。

初期値が100で、最大値が999でサイクルさせる場合の定義例
id number generated as identity(
  minvalue 100
  maxvalue 999
  cycle
  ) not null,

実行例

-- テーブル定義
create table test_table
(
  id number generated as identity(
  minvalue 100
  maxvalue 999
  cycle
  ) not null,
  name NVARCHAR2 (100) not null,
  primary key (id)
);

-- INSERTの実行結果
SQL> insert into test_table (name) values ('なまえ');

1 row created.

SQL> select id from test_table;

 ID
----------
       100

SQL> insert into test_table (name) values ('なまえ');

1 row created.

SQL> select id from test_table;

 ID
----------
       100
       101

always指定のカラムに対して値を設定しようとすると、以下の例外が発生する。
SQL> insert into test_table (id, name) values (999, 'name');
insert into test_table (id, name) values (999, 'name')
                        *
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column

値ってどうやって生成している?

値の生成自体はテーブル作成時に裏で作成したシーケンスオブジェクトを使用して行っているようです。
このシーケンスオブジェクトは、単純に「drop table テーブル名」でテーブルを削除した場合ゴミとして残ってしまいます。
テーブル削除時に「purge」を指定してセットで削除してあげましょう。

2013年10月13日日曜日

[Oracle12c]defaultに指定できるようになったon null句

Oracle12cからは、default区に「on null」が指定できるようになったようだ。
このon nullは、insert文で挿入しようとしている値がnullの場合に、指定した値を挿入してくれます。

※defaultの場合は、insertで指定されていない場合のみ値を挿入してくれるけど、on nullを使用することで完全にnullを除外出来るようになる。
なお、on nullを指定するとnullが入ることがありえないので、not nullを指定しなくても暗黙的にnot nullになる。

create table文

以下のように、defaultの後にon null句を記述し、null時に代入する値を指定する。
create table on_null_test (
  id number not null,
  char_col char(1) default on null '0',    -- nullの場合は、「0」を代入する
  number_col number default on null 100,      -- nullの場合は、「100」を代入する
  primary key (id)
);

insert文を実行

-- 主キー以外は指定しない
INSERT INTO ON_NULL_TEST (id) values (1);
-- nullを代入
INSERT INTO ON_NULL_TEST (id, char_col, number_col) values (2, null, null);
-- null以外を代入
INSERT INTO ON_NULL_TEST (id, char_col, number_col) values (3, '1', 999);

実行結果

IDが1と2の行は、insertで項目を指定していない、nullを指定しているためデフォルトの値が挿入されている。
ID CHAR_COL NUMBER_COL
1 0                 100
2 0                 100
3 1                 999

2013年9月28日土曜日

[coffeescript]typeofよりinstanceof

クラスの型をチェックする場合には、typeofよりinstanceofを使うほうがよい。

下のコード例&実行結果を見るとわかるけど、typeofを使用した場合その変数の型はobjectとなってしまう。
これだと、その変数のクラス型を正しく判定できないのでinstanceofを使用して判定する。

コード例

class Hoge

class Fuga

hoge = new Hoge()
fuga = new Fuga()

console.log typeof hoge             # object
console.log (hoge instanceof Hoge)  # true
console.log (fuga instanceof Hoge)  # false

実行結果

object
true
false

2013年9月15日日曜日

[coffeescript]soak operator(nullを安全に扱えるやつ)

soak operatorというものを使うとnullを安全に扱えるようになる。

hoge = null

console.log hoge
# 値が代入されているかチェック(nullの場合はfalse)
console.log hoge?
# 値が代入されていない場合の初期値を返す
console.log hoge ? 'nullだよ'

# 初期値を代入(?=で値が未設定時の初期値を代入できる)
hoge ?= '初期値'
console.log hoge

# 値が設定されている場合は変わらない
hoge ?= '値は変わらない'
console.log hoge

JavaScriptへの変換結果

JavaScriptへ変換した結果。if文でうまいことnullが考慮されている。
// Generated by CoffeeScript 1.6.3
(function() {
  var hoge;

  hoge = null;

  console.log(hoge);

  console.log(hoge != null);

  console.log(hoge != null ? hoge : 'nullだよ');

  if (hoge == null) {
    hoge = '初期値';
  }

  console.log(hoge);

  if (hoge == null) {
    hoge = '値は変わらない';
  }

  console.log(hoge);

}).call(this);

2013年9月7日土曜日

[coffeescript]可変長引数

JavaScriptの場合、可変長引数みたいなことを実現しようとした場合、関数内でのみ使える配列っぽいargumentsオブジェクトを利用する必要がある。
このargumentsオブジェクトは、配列じゃないのでびみょーに使い勝手が悪かったりするんだよね。

そこで、coffeescriptを使ってあげると関数の引数名に「...」をつけてあげるだけで、いい感じに可変長引数を扱うことができます。

簡単な例を見てみましょう。

可変長引数を1つ受け取る関数

func = (params...) ->
  console.log params.join
  console.log params.join('-')

func 1, 2, 3

上記プログラムの実行結果。パラメータのparamsにはjoin関数が定義されていて、引数で指定した複数の値が、連結されているのがわかります。
[Function: join]
1-2-3

可変長引数とそれ以外の引数を受け取る関数

func = (params..., param2) ->
  console.log params.length
  console.log params.join('-')
  console.log "param2 = [#{param2}]"

func 1, 2, 3

上記プログラムを実行すると、最後に指定したパラメータが2番めの引数に、最後を除くパラメータが可変長引数に設定されていることがわかります。
2
1-2
param2 = [3]


コンパイルされたJavaScriptを見てみると

可変長引数を、配列のslice関数を使用して配列に変換しているようです。
(function() {
  var func,
    __slice = [].slice;

  func = function() {
    var params;
    params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
    console.log(params.join);
    return console.log(params.join('-'));
  };

}).call(this);

2013年8月31日土曜日

[coffeescript]ビルトインオブジェクトを拡張

coffeescriptでビルトインオブジェクトのDateの拡張に挑戦。

format関数を追加して、Date#formatで年月日フォーマットした値を返すようにしてみた。

[CoffeeScript]prototypeへの簡易アクセスで書いたように、「::」でプロトタイプにアクセスできるので、「::」に対して追加したい関数を定義してあげれば良い

Date::format = ->
  "#{@.getFullYear()}年#{@.getMonth() + 1}月#{@.getDate()}日"

console.log new Date().format()

実行結果
2013年8月31日

2013年8月17日土曜日

[CoffeeScript]prototypeへの簡易アクセス

CoffeeScriptでも、JavaScriptと同じよに「Hoge.prototype」とするとプロトタイプにアクセスすることができます。
CoffeeScriptでは、prototypeへのアクセスを更に簡単に記述出来るように、クラス名::とコロン(:)を2つ連続して書くことでプロトタイプにアクセスできます。

# クラス宣言
class Hoge
  hoge : -> "hoge"

# プロトタイプに関数を追加
Hoge::func = -> "func"

# プロトタイプの内容を出力
console.log Hoge::

# 上記分は、以下の文と同じ
console.log Hoge.prototype

上記分を実行すると、「::」でプロトタイプにアクセスできている事がわかります。
/usr/local/bin/coffee example.coffee
{ hoge: [Function], func: [Function] }
{ hoge: [Function], func: [Function] }

2013年8月3日土曜日

[CoffeeScript]メソッドのオーバライド

継承した親クラスと同名のメソッドを小クラス側に定義することで、親クラスの処理を上書きできる。
親クラスの処理を呼び出したい場合には、superで実現できる。引数がある場合には、superにパラメータとして指定すれば良い。

class Super

  func: ->
    console.log 'Super#func'


class Sub extends Super
  func: ->
    console.log 'sub#func'
    super


sub = new Sub()
sub.func()
上記コードを実行すると、以下のようにsuperキーワードで親クラスの同一メソッドが呼び出せていることが確認できる。
sub#func
Super#func

2013年7月16日火曜日

[mysql]現在時間の取得

curdate()やcurtime()関数などを使用して現在日付や時間を取得できる。

-- 現在日付(current_dateを使用してもcurdate()と同じ結果が得られる)
mysql> select curdate() ;
+------------+
| curdate()  |
+------------+
| 2013-07-16 |
+------------+
1 row in set (0.01 sec)

-- 現在時間(current_timeを使用してもcurtimeと同じ結果が得られる)
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 08:45:46  |
+-----------+
1 row in set (0.00 sec)

-- 現在日時(current_timestampを使用してもnowと同じ結果が得られる)
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2013-07-16 08:47:20 |
+---------------------+
1 row in set (0.00 sec)

2013年6月23日日曜日

[CoffeeScript]コンストラクタ

CoffeeScriptでコンストラクタを定義するには、classにconstructor関数を定義するだけでよい。

例:
class Test
  constructor : ->
    console.log 'コンストラクタが呼び出された'

// JavaScriptに変換されたコード
// 
(function() {
  var Test;

  Test = (function() {

    function Test() {
      console.log('コンストラクタが呼び出された');
    }

    return Test;

  })();

}).call(this);

実行結果:
test = new Test()を実行してみると、以下の結果となりインスタンス作成時にconstructor関数が呼び出されていることが確認出来ます。
/usr/local/bin/coffee hoge.coffee
コンストラクタが呼び出された

2013年6月22日土曜日

railsでlabelに表示する名前をmodelの属性名から変更する方法

railsでmodelを使ってlabelを出力するとmodelの属性名になる。
任意の値をlabelに出力したい場合には、以下のコードのようにlabelの2番めの引数に指定する。

<%= f.label :name, "名前" %>

2013年6月7日金曜日

PL/SQLが依存しているオブジェクトを確認する方法

PL/SQLプログラムの依存しているオブジェクトを確認する方法。

依存オブジェクトの確認は、USER_DEPENDENCIES(ALL_DEPENDENCIESやDBA_DEPENDENCIES)ビューで行える。

主なカラム
NAME オブジェクトの名前
TYPE オブジェクトのタイプ
TYPE オブジェクトのタイプ
REFERENCED_NAME 参照されるオブジェクトの名前
REFERENCED_TYPE 参照されるオブジェクトの型

create or replace procedure p_hoge
is
begin
  for c in (select * from table1)
  loop
      dbms_output.put_line(c.column_1);
  end loop;
end;
/

実行結果

  1  select NAME, TYPE, REFERENCED_NAME, REFERENCED_TYPE
  2  from user_dependencies
  3* where name = 'P_HOGE'

NAME                           TYPE                           REFERENCED_NAME                          REFERENCED_TYPE
------------------------------ ------------------------------ ---------------------------------------- ------------------------------
P_HOGE                         PROCEDURE                      STANDARD                                 PACKAGE
P_HOGE                         PROCEDURE                      DBMS_OUTPUT                              SYNONYM
P_HOGE                         PROCEDURE                      TABLE1                                   TABLE
P_HOGE                         PROCEDURE                      SYS_STUB_FOR_PURITY_ANALYSIS             PACKAGE

2013年6月2日日曜日

[CoffeeScript]クラスの継承

クラスの継承はJavaと同じようにextendsを使用して行える。

# 親クラス
class Parent
  constructor : (@param1, @param2) ->

  toString : ->
    "param1:#{@param1}, param2:#{@param2}"

# Parentを継承したChildクラス
class Child extends Parent
  param1Length : ->
    @param1.length

  toString : ->
    "param1->#{@param1}, param2->#{@param2}"

2013年6月1日土曜日

[CoffeeScript]インスタンスメソッドとインスタンス変数

  • インスタンス変数
    コンストラクタやメソッド内で「@」で始まる変数を作るとインスタンス変数となる
  • インスタンスメソッド
    コンストラクタ内で「@」から始まるメソッドを定義するとインスタンス(インスタンス毎に異なる)メソッドとなる。
    クラス直下にメソッドを定義すると全てのインスタンスで共有されるインスタンスメソッドとなる。(prototypeに追加されるメソッド)

# class宣言
class Book

  # コンストラクタ
  constructor : (title, author) ->
    # インスタンス変数に値を設定
    @title = title
    @author = author

    @getTitle = -> title
    @getAuthor = -> author

  # インスタンスメソッド(すべてのインスタンスで同一のメソッド)
  toString : ->
    "title->#{@title}:author->#{@author}"


book = new Book("タイトル", "ほげ")
console.log book.toString()

JavaScriptに変換した結果

インスタンス変数やインスタンスごとのメソッドは「this」に追加されている。
インスタンスで共有されるインスタンスのメソッドはBookクラスの「prototype」に追加されている。
// Generated by CoffeeScript 1.6.2
var Book, book;

Book = (function() {
  function Book(title, author) {
    this.title = title;
    this.author = author;
    this.getTitle = function() {
      return title;
    };
    this.getAuthor = function() {
      return author;
    };
  }

  Book.prototype.toString = function() {
    return "title->" + this.title + ":author->" + this.author;
  };

  return Book;

})();

book = new Book("タイトル", "ほげ");

console.log(book.toString());

2013年5月26日日曜日

[CoffeeScript]クラスメソッドとクラス変数

CoffeeScriptでは、クラス内の変数に「@」をつけて宣言するとクラスメソッドになる。

class Hoge
  #クラスメソッド
  @classMethod = (param) ->
    "param is #{param}."

  #クラス変数
  @count = 0

  constructor: ->
    # コンストラクタ内で、クラス変数の値をインクリメント
    Hoge.count += 1;

console.log Hoge.classMethod "パラメータ"

new Hoge();
console.log Hoge.count
new Hoge();
console.log Hoge.count

実行結果

param is パラメータ.
1
2

JavaScriptへの変換結果

クラスメソッドや変数は、CoffeeScriptで定義したクラスに対応するfunctionのプロパティとして宣言される。
var Hoge;

Hoge = (function() {

  Hoge.classMethod = function(param) {
    return "param is " + param + ".";
  };

  Hoge.count = 0;

  function Hoge() {
    Hoge.count += 1;
  }

  return Hoge;

})();

console.log(Hoge.classMethod("パラメータ"));

new Hoge();

console.log(Hoge.count);

new Hoge();

console.log(Hoge.count);

2013年5月18日土曜日

railsのルーティング設定をリスト表示する

rakeコマンドの引数に「routes」を指定して実行することでルーティング設定をリスト表示することができる。

%rails_project%/bin/rake routes

実行結果例

Prefix Verb   URI Pattern               Controller#Action
   users_new GET    /users/new(.:format)      users#new
       users GET    /users(.:format)          users#index
             POST   /users(.:format)          users#create

2013年5月12日日曜日

[Oracle]DATE型の計算

日付の加算/減算

NUMBER値を加算(減算)しての日付計算。
-- 現在日時の1日後
select sysdate + 1 from dual;

-- 2013/05/11の1日前
select to_date('2013-05-11') - 1 from dual;

-- 閏年も問題なし(3/1になります)
select to_date('2012-02-28') + 2 from dual;

期間値(INTERVAL)を使って日付の加算(減算)を行うこともできます。
-- 現在日時の1日後
select sysdate + to_dsinterval('P1D') from dual
select sysdate + interval '1' day from dual;

月の加算/減算

期間値(INTERVAL)を使って計算します。
-- 1ヶ月後を計算
select to_date('2012-02-28') + interval '1' month from dual;

このようにINTERVALを使うと、日付の計算を非常に簡単に行うことができます。
INTERVALのリテラル定義の方法は、以下のOracleのドキュメントを見ると良いでしょう。
http://docs.oracle.com/cd/E16338_01/server.112/b56299/sql_elements003.htm#i38598

2013年5月6日月曜日

CSSでテーブルの行の背景色を交互に変更する方法

CSSの定義のみで、テーブルの行の背景色を交互に変更する方法

IE8ではこの方法を使えないので、IE8をサポートする場合にはjQueryなどを使って回避する必要があります。
[jQuery]テーブルの行の背景色を交互に変更する方法

CSSのみでの背景色の変更は、nth-child擬似クラスを使用して行います。
下の例のように、trの何番目の子要素に対して背景色を適用するかみたいな使い方をします。
テーブルの場合、タイトル行をthで定義したりするので、tdのみに背景色を適用するようにセレクタを定義しています。
    /* 偶数行の背景色を変更 */
    tr:nth-child(even) td {
      background-color: #eee;
    }

    /* 奇数行の背景色を変更 */
    tr:nth-child(odd) td {
      background-color: #eee;
    }

    /* 任意の行数毎に背景色を変更(この例だと4nと指定しているので4行ごと) */
    tr:nth-child(4n) td {
      background-color: #eee;
    }

2013年4月21日日曜日

[CoffeeScript]戻り値のないメソッドを作る方法

CoffeeScriptでメソッドを作ると、必ず最後の文の結果が戻り値として返されてしまいます。

例えば、下のメソッドの場合「2 * 5」がメソッドの最後の文なので、このメソッドは必ず「10」を結果として戻します。
method = ->
  2 * 5

このように、常に最後の文の結果が返されてしまうので、基本戻り値のあるメソッドになります。
もし、どうしても戻り値のないメソッドを作りたい場合、下のメソッドのように明示的に「undefined」を返すと戻り値のないメソッドを作れます。
method = ->
  return undefined

2013年4月11日木曜日

[Oracle]V$SESSIONに接続元を識別する情報を格納する方法

JDBCでOracleデータベースに接続した場合に、セッション情報を確認するビュー(V$SESSION)のPROGRAM列に任意の値を設定する方法。

OracleDataSourceの接続プロパティに対して、キー:v$session.program、値:接続元を示す値を設定することで、任意の値をV$SESSIONのPROGRAM列に表示出来る。
※デフォルト(thin接続の場合)の場合、'JDBC Thin Client'と表示される。

実装例

この例の場合、PROGRAM列には「任意の値」が表示される。
dataSource.setURL("jdbc:oracle:thin:@localhost:1521:hoge");
dataSource.setPassword("hoge");
dataSource.setUser("hoge");
Properties properties = new Properties();
// v$session.programをキーにして、クライアントを識別する値を設定する。
properties.setProperty("v$session.program", "任意の値");
dataSource.setConnectionProperties(properties);

2013年4月7日日曜日

[CoffeeScript]ヒアドキュメント

coffeescriptでのヒアドキュメントのまとめ。

コメント

ブロックコメントなだけなので、ヒアドキュメントではないかもしれませんが。
1 ###
2   console.logにメッセージを出力する。
3 ###

JavaScriptに変換されると
1 /*
2   console.logにメッセージを出力する。
3 */

文字列

例を見るとわかりますが、変数を展開することもできます。
1 str = "さしすせそ"
2 here = """
3 あいうえお
4 かきくけこ
5 #{str}
6 """

JavaScriptに変換されると
1 str = "さしすせそ";
2 
3 here = "あいうえお\nかきくけこ\n" + str;

正規表現

文字列と同じように変数の展開ができます。複雑な正規表現を定義するときに便利な気がします。
1 str = "い"
2 pattern = ///
3 # コメントも書ける
4 #{str} # 変数の展開もできる。
5 6 7 8 ///

JavaScriptに変換されると
1 str = "い";
2 
3 pattern = RegExp("あ" + str + "うえお");

2013年4月6日土曜日

[CoffeeScript]配列のプロパティやメソッド

CoffeeScriptの配列のプロパティやメソッドの使い方。

 1 array = [1..10]
 2 
 3 #### 配列の長さ
 4 array.length
 5 
 6 #### 要素を連結
 7 # 引数なしは、「,」で連結
 8 array.join()
 9 # 引数を指定するとその文字で連結
10 array.join('-')
11 
12 #### 指定した範囲の新しい配列を生成
13 # 開始インデックスはその値を含む(0始まり)
14 # 終了インデックスはその値を含まない
15 array.slice(2, 4)
16 
17 #### 配列同士の連結
18 array.concat [11..20]
19 
20 #### 配列の各要素の値を変更
21 # 配列の各要素を2倍
22 num * 2 for num in array
23 # 大文字に変換
24 c.toUpperCase for c in ['a', 'b', 'c']
25 
26 # 上の例と同じ事をmapメソッドで
27 array.map (n) -> n + 1
28 
29 #### フィルタをかけて新しい配列を生成
30 # 5以下の値だけを持つ配列を生成
31 num for num in array when (num <= 5)

2013年3月31日日曜日

[CoffeeScript]配列内に値が存在しているかチェック

変数 in 配列を使用して、変数の値が配列に存在しているかのチェックが出来る。


1 # strは、["str", "str2"]に含まれているのでtrue
2 "str" in ["str", "str2"]
3 
4 # strは、["str1", "str2"]に含まれていないのでfalse
5 "str" in ["str1", "str2"]

2013年3月26日火曜日

SQL Serverでダミー表へのアクセス

SQLServerでOracleのdual表のようなダミー表へアクセする方法。
ダミー表は、SQL関数の確認等で簡単に使うことができるので非常に便利です。

SQLServerの場合は、select句だけを定義しfrom句以降を省略することでダミー表へアクセスすることができます。

固定値を取得する場合は、select句に固定値を設定します。
1 select 1

select句に関数を列挙すると関数の呼出結果を確認することができます。
1 select sysdatetime();
2 select len('12345');

2013年3月24日日曜日

[CoffeeScript]switch文

coffeescriptでのswitch文の書き方。

基本的な書き方

 1 month_name = switch month
 2   when 1
 3     'January'
 4   when 2
 5     'February'
 6   when 3
 7     'March'
 8   when 4
 9     'April'
10   else
11     'other'

コンパイルされたJavaScriptはswitch文が即時関数でラップされています。
 1 month_name = (function() {
 2   switch (month) {
 3     case 1:
 4       return 'January';
 5     case 2:
 6       return 'February';
 7     case 3:
 8       return 'March';
 9     case 4:
10       return 'April';
11     default:
12       return 'other';
13   }
14 })();

いずれかにマッチしているかをswitch文で実現する

カンマ区切りで複数の条件を指定すると、switchで指定した値がリスト内に含まれていた場合、そのcase文が実行されます。
 1 season = switch month
 2   when 12, 1, 2
 3     "冬"
 4   when 3, 4, 5
 5     "春"
 6   when 6, 7, 8
 7     "夏"
 8   when 9, 10, 11
 9     "秋"
10   else
11     "不明"
12 console.log(season)

JavaScriptになると、それぞれの条件がcase文に展開されていることがわかります。
 1 season = (function() {
 2   switch (month) {
 3     case 12:
 4     case 1:
 5     case 2:
 6       return "冬";
 7     case 3:
 8     case 4:
 9     case 5:
10       return "春";
11     case 6:
12     case 7:
13     case 8:
14       return "夏";
15     case 9:
16     case 10:
17     case 11:
18       return "秋";
19     default:
20       return "不明";
21   }
22 })();

2013年2月28日木曜日

[CoffeeScript]booleanリテラル

CoffeeScriptでは、下の値をbooleanリテラルとして使うことができます。
  • trueとなるリテラル
    • true
    • on
    • yes
  • falseとなるリテラル
    • false
    • off
    • no

// CoffeeScript
true1 = true
true2 = on
true3 = yes

false1 = false
false2 = off
false3 = yes

// コンパイルされたJavaScript
true1 = true;
true2 = true;
true3 = true;
false1 = false;
false2 = false;
false3 = true;

onやoffを見たりしても、悩んでしまう気がするので積極的に使う必要がない気がしています。

2013年2月23日土曜日

[CoffeeScript]式展開

CoffeeScriptでもRubyと同じように、#{}を使用した式展開ができます。

式展開の例

Rubyと同じように、展開したい式を#{}の中に入れてます。
str = "文字列"
console.log("str = #{str}")
console.log("計算 = #{3 + 4}")
console.log("比較 = #{str == '文字列'}")

上のコードを実行すると、コンソールには以下の結果が出力されます。それぞれ、式の結果が出力されているのがわかります。
str = 文字列
計算 = 7
比較 = true

compileした結果のJavaScriptは下のようになります。
#{}で式展開された箇所は、「+」で文字列連結されているのがわかります。
// Generated by CoffeeScript 1.4.0
(function() {
  var str;

  str = "文字列";

  console.log("str = " + str);

  console.log("計算 = " + (3 + 4));

  console.log("比較 = " + (str === '文字列'));

}).call(this);

2013年2月11日月曜日

play2でhtml5の数値テキスト

input type=numberな入力エリアは以下のコードで生成できる。

@helper.input(bookForm("count")) { (id, name, value, args) =>
  
}

inputNumberとかhelperにあってもよさそうなんだけど。

2013年2月3日日曜日

css3のinvalidとvalid

invalid、validを使用すると、入力要素の形式が無効か有効かによってスタイルを簡単に切り替えることができる。

// 入力要素が不正な場合は背景色を変える。
:invalid {
  background-color: #FFD4D4;
  border: 1px solid maroon;
}

// 入力要素が有効な場合は、スタイルを適用しない
:valid {
}

必須項目で値が入力されていない場合・・・




必須項目で値が入力されている場合・・・

2013年2月2日土曜日

[Oracle]multi insert

multi insertをつかうと、1つのSQL文で複数テーブルに一括でデータ登録ができるようになります。
これにより、各テーブルに対してinsertする時と比べてトラフィックが削減できパフォーマンス向上が見込めるのではないかと思います。

例1

各テーブルに対して値を指定して挿入
  1  insert all
  2  into test1 (id, name) values (1, 'name1')
  3  into test2 (id, name) values (1, 'name2')
  4* select * from dual

2 rows created.

JDBCを使用した場合は、バインド変数を使用して挿入する値を埋め込んであげると良い。
        PreparedStatement statement = connection.prepareStatement("INSERT ALL"
                + " INTO test1 VALUES (?, ?)"
                + " INTO test2 VALUES (?, ?)"
                + " SELECT * FROM dual");
        statement.setInt(1, 1);
        statement.setString(2, "あいうえお");
        statement.setInt(3, 1);
        statement.setString(4, "かきくけこ");
        int count = statement.executeUpdate();

例2

副問い合わせの結果に応じてinsert先テーブルを切り替えるにはwhen句と組み合わせると良い。
  1  insert all
  2  when mod(id, 2) = 0 then
  3    into test1
  4  else
  5    into test2
  6* select id, name from test3

5 rows created.

2013年1月22日火曜日

sqlplusのプロンプト文字列(SQL>)を変更する方法

sqlplusコマンドのsqlpromptを使用してプロンプトに表示される文字列を変更することができる。
例えばどのユーザでどのDBにつないでいるかを表示しておけば、接続先の誤りなどを気づけるようになる。

プロンプトにユーザ名&DBを表示する場合には、sqlpromptに以下のように設定すると良い。
set sqlprompt '&_user@&_connect_identifier>'

これで、sqlplusに表示される値は以下のようになる。
TEST_USER@TEST_DB>
TEST_USER@TEST_DB>
TEST_USER@TEST_DB>

sqlpromptに設定できるのは以下の値など。
  • _date
    日付
  • _connect_identifier
    接続文字列
  • _user
    接続ユーザ
  • _editor
    editで開くエディタ

2013年1月21日月曜日

[Oracle]PL/SQLのUSINGを使用した条件のバインド変数化

SQL文をリテラルで定義する必要がある場合(例えばテーブル名を変数の内容によって変わる場合など)に、USING句を使用して条件値をバインド変数化することができる。

例えば、以下のようにIDで絞込みを行う場合、IDの条件値を「:id」のようにしバインド変数化する。実際にSQL実行時に条件として指定する値はusing句を使用して条件に埋め込みます。

declare
  id account.id%type;
  type accounts_cur is ref cursor;
  accounts accounts_cur;
  account_rec account%rowtype;
begin
  id := 1;
  open accounts for 'select * from account where id = :id' using id;
  loop
    fetch accounts into account_rec;
    exit when accounts%notfound;
    dbms_output.put_line(account_rec.id);
    dbms_output.put_line(account_rec.name);
  end loop;
  close accounts;
end;