Ruby 文字化け(ダメ文字を回避せよ)

Windows 上で SJIS を使用している場合、ruby -Ksを、
UNIX 系 OS 上で EUC を使用している場合、ruby -Keを
UTF-8N を使用している場合、ruby -Kuを指定する必要があります。

だそうです。

#! ruby -Ks

Ruby アクセスレベル

initializeメソッドを除き、クラス内のメソッド等はpublicである。
通常、宣言は省略されているが、明示的に宣言することもできる。

class A
def hoge
puts "public Aクラスのhoge"
end
public :hoge
end

AA = A.new
AA.hoge

# 結果
# Aクラスのhoge(public)


privateなアクセスレベルを与えたい時は明示的に宣言する。

class A
def hoge
puts "Aクラスのhoge(public)"
end
public :hoge

def hoge2
puts "Aクラスのhoge2(private)"
end
private :hoge2

end

AA = A.new
AA.hoge

AA.hoge2

# 結果
# Aクラスのhoge(public)
# hoge2へはアクセスできない(private method `hoge2' called)

Ruby 特異メソッド

Ruby特有の挙動として、特異メソッドというものがあるらしい。

# 特異メソッドの例

foo = "ミスターFOO"

def foo.say(name)
puts self + "「こんにちは#{name}」"
end

foo.say("子猫ちゃん")

# 結果
# ミスターFOO「こんにちは子猫ちゃん」


上記の例では、"foo"というオブジェクトに対してメソッドを定義している。
通常、あるメソッドを追加したいという場合にはクラスに新しくメソッドを追加するのだが、この特異メソッドを使用することで、特定のオブジェクトだけのメソッドを作ることができる。


クラスのインスタンスから特異メソッドを作る

# 通常のクラス定義
class A
def hoge
puts "ほげほげ"
end
end

AA = A.new
AA.hoge

# クラスのインスタンスから特異メソッドを追加
def AA.voice(name)
puts "#{name}「ポウ!」"
end

AA.voice("ミスターHOGE")

# 結果
# ほげほげ
# ミスターHOGE「ポウ!」


クラスのインスタンスに対しての特異メソッドは、
使いどころによっては便利なこともあるかもしれない。

Ruby 変数とスコープ

グローバル変数
$をつけたもの。
どこからでも参照できる、なんでもアリな変数。
一見便利であるが、多用するとどこで値が変わっているかわからないコードになってしまう。

$var = "グローバルhoge"

class A
def hoge
puts $var
end
end

cls = A.new
cls.hoge

# 結果
# グローバルhoge



クラス変数
クラス、およびそのクラスのインスタンスすべてで参照できる変数。

class A
@@ClassHoge = "クラス変数hoge"
def hoge
puts "Aクラスのhoge"
end
end
class B < A
def hoge
puts @@ClassHoge
end
end

cls = B.new
cls.hoge

# 結果
# クラス変数hoge


上記の例では、Aを継承したBクラスからAのクラス変数を参照している。
これも多用するとソースの見通しが悪くなりそうな感じで、
使用はベースクラスのみにとどめておいたほうが良さそうな感じ。


インスタンス変数
インスタンス毎に別の値を持つ変数。
インスタンスを生成した時点では nil となる。

class A
@InstanceHoge = "クラス変数hoge"
def hoge
puts "Aクラスのhoge"
end
end
class B < A
def hoge
puts @InstanceHoge
end
end
class C < A
def hoge
@InstanceHoge = "書き換えたhoge!"
puts @InstanceHoge
end
end

BB = B.new
BB.hoge

CC = C.new
CC.hoge

# 結果
# nil
# 書き換えたhoge!



ローカル変数
メソッド内で使用される通常の変数。

class A
def hoge

foo = "ローカル変数"
puts foo


end
end

cls = A.new
cls.hoge

# 結果
# ローカル変数
# 上記の例で、変数名のみ表記した場合はエラーとなる



その他に参照専用であるが、擬似変数、というものもある。
とりあえず省略。

Ruby クラスの継承とオーバーライド

Rubyはオブジェクト指向言語であるから、当然のことながらクラスの継承ができる。また、継承した子クラスから親クラスのメソッドをオーバーライドすることもできる。

class A
def hoge
puts "Aクラスのhoge"
end
end

class B < A
def hoge
puts "Bクラスのhoge"
end
end

cls = B.new
cls.hoge

# 結果
# Bクラスのhoge


ここまでは通常の継承とオーバーライドである。
しかし、Rubyではオーバーライドするメソッドに super を入れると、オーバーライド元のメソッドを実行することができる。これは面白い挙動だ。

class A
def hoge
puts "Aクラスのhoge"
end
end

class B < A
def hoge
super
puts "Bクラスのhoge"
end
end

cls = B.new
cls.hoge

# 結果
# Aクラスのhoge
# Bクラスのhoge


super は、いつでも呼び出すことができるうえ、何度も呼び出すことができる。

ちなみに、オーバーロードはないらしい。

Rubyの破壊的メソッド

Rubyには"破壊的メソッド"というものがある。
調べてみると、「オブジェクトそのものを書き換えてしまうもの」らしい。

例) 文字列の空白を除去

s = " もじれつ"
puts s # もじれつ

#通常のメソッド
s = " もじれつ"
s = s.strip
puts s #もじれつ

# 破壊的メソッド
s = " もじれつ"
s.strip!

puts s #もじれつ

破壊的メソッドの場合は「s = s.strip!」と表記しなくても、
そのままオブジェクトが書き換えられてしまう。
s.strip!だけでオブジェクトの中身が入れ替わってしまうので、
他の言語と比べると不思議な感覚がある。

数値のカスタム書式変更


int i = 1234;

// 01234 (0でPadLeftと同じ)
Console.WriteLine(i.ToString("00000"));
// 1234
Console.WriteLine(i.ToString("#####"));
// 1,234
Console.WriteLine(i.ToString("##,###"));

// 12234: プラス1234
// -1234: マイナス1234
// 0: ゼロ
Console.WriteLine(i.ToString("プラス#;マイナス#;ゼロ"));
// 12234: +1234
// -1234: -1234
// 0: 0
Console.WriteLine(i.ToString("+#;-#;0"));

// 数値1234
Console.WriteLine(i.ToString("数値: #"));

リテラル

VB.NETにおいても明示的に型を指定する際には必須。
特に忘れそうなもの。

Decimal : 0.1D, 0.1M
Char : "a"c, 'a'

VB6 Formatでオーバーフロー

特定のフォーマットの日付に変換する処理は頻繁に行われる。
ただ、VB6の場合には注意が必要な部分がある。

Format("20090911", "GGGE年M月D日")
' オーバーフローしました
Format("2009/09/11", "GGGE年M月D日")
' OK

これはVB6の仕様により、区切り記号(/)がないとそのまますべてが年として認識されてしまうらしい。

Firefox 起動時のタブ設定

browser.startup.page
0:空白ページ
1:指定されたホームページ
2:最後に 表示 していたページ

firefox3で3がある?

Oracle 日付の書式

日付型の書式

'RR/MM/DD HH24:MI:SS'
RRは2000年問題で登場した書式。50~99年 は 1950~1999年に変換される。

Date関数の戻り値と「地域と言語のオプション」の関係

あまり触ったことがなかったので今さら気づいたが……。



Date関数の戻り値は――。



「地域と言語のオプション」によって変化する。



通常、このオプションを変更しているケースはあまりないのかもしれないが、
例えば年を取得する時に「左から何文字目」という考え方をしていると間違いなくバグの温床となる。日付は日付として、常にチェックして作っていかなければならない。


というよりも、なんだこのVBの動き……。

ORA-01013

[Oracle][ODBC][Ora]ORA-01013:ユーザーによって現行の操作の取消が要求されました。(#1013)

ODBCタイムアウト

accessの場合
クエリのオプションでタイムアウト時間を変更する。

[Firefox2]画像の自動縮小

about:config の設定から

browser.enable_automatic_image_resizing を flaseに。

[Access2003]DAO3.6のレジストリ再登録


Microsoft Data Access Objects (DAO) 3.6 Object Library

Office2003を使用していて、参照設定に「DAO3.6」が見あたらない!
ということがあった。

どうもこういうことらしい

regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Dao\dao360.dll"

[Office]質問を入力してください



1. [ツール]-[ユーザー設定]
2. 質問を入力してください」を右クリック。
3. 表示/非表示を切り替える。

上記操作で抹殺。

ORA-01013

[Oracle][ODBC][Ora]ORA-01013:ユーザーによって現行の操作の取り消しが要求されました。(#1013)

Access + Oracle
データ量が多いテーブルを参照する際にタイムアウト。

[クエリ]-[デザインビュー]-[クエリプロパティ]
ODBCタイムアウトを変更する。
0 = タイムアウトなし

[Access] .Topプロパティ

プログラム中でコントロールの位置を調整したいことがある。
その際、.Topや.Leftで位置を指定するのだが、数値は twip という単位で設定するらしい。

1cm = 567 twip

融通を利かせてわかりやすい単位にしてくれたっていいじゃないの。

[Excel2007]フィルハンドル

Excelで同じ値をコピーしたり、連番をつくったりするのに便利な操作。
セルの右下でマウスカーソルが 「+」 十字の形に変わるこれ。
フィルハンドルという機能だとか。

Excel2007になって、これがデフォルトではできなくなって(たぶん)、なんじゃこりゃ! と、思っていたら、どうもオプションで設定するらしい。

SQLServerの予約語

テーブルや列名にエイリアスを与えることはよくあるが、この名前も当然好き勝手つけていいわけではないわけで。文法的にはOKなはずだけどエラーが出ている時には、予約語を使っていないかチェックしてみる。

SQLServer予約語
SQL Server Compact Edition の予約語は、SQL Server 2005 の対応する予約語とは機能が異なる場合があります。次の表は、SQL Server Compact Edition の予約語の一覧です。

[SQL] スペース除去

右側の空白を除去... RTRIM
左側の空白を除去... LTRIM

左と右を両方除去したい場合、こんな使い方もできる

DECLARE @aaaa CHAR
SET
@aaaa = LTRIM(RTRIM(@aaaa))




0除算の罠

たとえばこんなん...

SET @hoge = ROUND(@aaa * 100 / @bbb, 1)

カーソルでドバーっと演算させていたら、エラーが出る。
ん? と思っていたら、
"0"を演算させると爆死する模様。

仕様書にご丁寧に「0除算注意」なんて書いてあった……バカなおれ。

Office2007 フォントの変更

ボロクソ言われているOffice2007(以下2007)を使う羽目に陥った。
確かにかなりダメな感じではあるが、そのあたりのことさんざん言われているので、あえて好感触な部分を書いてみる。


今回は「フォントの変更」について。

悪名高き「リボン」から、今まで通りコンボボックスのフォントを選択するわけだが、今までのOfficeではしばらく激重になったあと(インストールされているフォントが多いと特に)、フォント名が展開される。

2007では、その動作がわりと早くなり、しかもフォント名にフォーカスを当てたときに、本文のフォントがそのフォントに代わってプレビューできる。

これは便利になった部分ではないかと思う。

VB6におけるIndexOf

InStr( 対象文字列 , 該当文字列)

前に比較したい文字列
後に比較する文字列
一応その後ろにも、比較させる位置を指定できる

ISNULLとLEFとAS

ISNULL(LEFT(XXコード, 2), '''') AS コード別名

先にNULLを変換してからASで変更する。

フォームロード直後にフォーカスを当てる

フォームがロードされた直後のフォーカスを制御するため、Loadイベントハンドラに
this.button1.Focus();
と書く。
しかし、これは失敗して、フォーカスを当てることができない。

実際には、
this.button2.Focus();
と、記述するようだ。

文字列で埋める

Stringクラスのメソッドを使用する。

先頭を埋める: PadLeft
末尾を埋める: PadRight