ruby,javaの言語間の違い、同機能の別名とか、混乱した事につて。

■破壊的メソッド、mutable,immutable
rubyには破壊的メソッドという者がある。例えばStringオブジェクトの場合、メソッド名に!をつけると破壊的メソッド。破壊的メソッドの場合、Stringオブジェクトの中身が変わる。mutableね。

ただ、Object#freezeを呼び出せば、破壊的メソッドを使用不可のfreeze状態にできる。freeze状態かどうかは#frozen?で確認できる。

■インスタンス変数、attr_accessor: hoge , setter,getter
rubyのインスタンス変数は、外から参照、更新する事はできない。必ずあくせさが必要。javaのpublicフィールドとは違う。
attr_accessorにインスタンス変数の値を渡せば、アクセサ(setter,getter)が自動的に定義される。hogeの場合、hoge=がセッタ、hogeがゲッタ。attr_reader,attr_writerで片方だけの定義もできる。attr_accessor:hoge1, hoge2のように複数インスタンス変数を指定できる。

■インスタンス変数、@、クラス変数、@@
rubyのインスタンス変数は@、暮らす変数は@@を前につける

■クラスメソッド、staticメソッド、self
rubyでクラスメソッドを定義する場合、メソッドの定義でメソッド名に前にself.をつける。また、クラスメソッドを複数定義したい場合、class << self ~ endの~にまとめてかける。

■メソッド呼び出し、変数、定数アクセス
rubyは.(ドット)だけじゃなく、::でもおっけ。

■コンストラクタ,initialize

■呼びだし制限、private,protected,public
rubyの呼び出し制限の書き方は、private :method_name  public:method_name2
method_name,method_name2は省略してまとめてかく事もできる。
呼び出し制限を書かない場合、defで定義したメソッドはpublicになる。
javaと比べてprotectedだけ意味が異なる。rubyのprotectedは、そのメソッドが定義された同じ暮らす、またはそのサブクラスしかから呼び出せない。
initialize,トップレベルで定義したメソッドはprivate。

■特異メソッド
rubyにはクラスでメソッドを定義できるだけじゃなくて、特定のオブジェクトにメソッドが定義できる。これを特異メソッドという。特異メソッドは、クラスで定義したメソッドをオーバーライドできる。

■モジュール
javaは完全なオブジェクト指向言語だけど、rubyは違い。rubyにはクラスだけじゃなく、モジュールというものがある。モジュールはnewしてオブジェクトを作成できない。トップレベルやクラス内でモジュールをincludeし、オブジェクト名.メソッド名で呼び出す。cのライブラリみたいなもの。ちなみにクラスからincludeする事をmix-inと言うらしい。
あと継承はできない。名前空間を作れる。名前空間が作れるってことで、モジュール内でモジュールやクラスの定義はできる。
あとextendを使って、オブジェクトの特異メソッドに取り込む事も出来る。クラス内でincludeでmoduleをmix-inせず、moduleをextendsするとモジュールのメソッドをクラスメソッドとして取り込む事ができる。このあたりはjavaと比べて自由すね・・・

■import,require,autoload
javaのimportに対する物は、rubyのrequireやatuoload。

■継承ツリー,Object
irb(main):027:0* class MyClass
irb(main):028:1> end
irb(main):035:0> MyClass.ancestors
=> [MyClass, Object, Math, Kernel, BasicObject]
irb(main):036:0> MyClass.superclass
=> Object

irb(main):039:0* String.superclass
=> Object
irb(main):040:0> String.ancestors
=> [String, Comparable, Object, Math, Kernel, BasicObject]

■オブジェクトのコピー
Object#dup,Object#cloneは浅いコピー(shallow copy)
psコマンドとkillコマンドについて

$ps aux
a:自分以外のユーザプロセスを表示する
u:ユーザ名などの詳細を表示する
x:デーモンなどのプロセスを表示する

work $ ps aux
USER              PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
hogeuser             1551  15.4  4.4  1607400 368596   ??  S    金03AM  68:38.48 /Applications/Google
_coreaudiod       284   3.1  0.1  2522888   9340   ??  Ss   木12AM  32:38.11 /usr/sbin/coreaudiod
hogeuser              538   1.9  1.3  3088532 105128   ??  S    木02AM  99:58.00 /Applications/Firefox
hogeuser             1537   1.5  2.5  1669584 208284   ??  S    金03AM  32:08.64 /Applications/Google
hogeuser             2766   1.1  2.6  1119788 220360   ??  S     2:22PM   2:42.90 /Applications/Google
hogeuser             1553   1.0  0.7   969092  62888   ??  S    金03AM   9:14.19 /Applications/Google
hogeuser              276   0.7  9.7  5241788 811384   ??  S    木12AM  77:13.25 /Applications/Firefox
hogeuser              275   0.2  1.0  2819844  85276   ??  R    木12AM   2:05.99 /Applications/Utiliti
hogeuser             1546   0.1  2.9  1247364 240532   ??  S    金03AM  11:10.63 /Applications/Google
hogeuser              320   0.1  0.8  3855552  69608   ??  S    木12AM   1:23.96 /System/Library/Input
hogeuser             2918   0.0  0.5   954624  44968   ??  S     3:23PM   0:01.39 /Applications/Google
_www             2917   0.0  0.0  2463684    740   ??  S     3:23PM   0:00.00 /usr/sbin/httpd -D FO
_www             2916   0.0  0.0  2473924    736   ??  S     3:23PM   0:00.00 /usr/sbin/httpd -D FO
_www             2915   0.0  0.0  2463684    924   ??  S     3:23PM   0:00.00 /usr/sbin/httpd -D FO


USER:実行しているユーザ名
PIDプロセス番号
STAT:プロセスの状態
COMMAND:コマンドの名前

・STATについて
S:スリープ
D:I/Oまち
R:CPUまち
T:停止中
Z:終了中

STATや%CPU,%MEMあたりを観察して、常にSTATがRの状態だったり、CPUの利用率が99%になっていた、メモリ使用率が増大している場合、プロセスが暴走している可能性がある。そんなプロセスを強制終了したい場合、PID欄にあるプロセス番号を指定して「kill プロセス番号」のようにkillコマンドを実行する。それで終了しない場合、「kill -KILL プロセス番号」で強制終了する。「kill -1 プロセス番号」でもおっけ?-1は1番のシグナル番号。シグナル番号は「kill -l」「man kill」でわかる。
使っているノートPCの容量が残り10Gを切った。du -hs *でディレクトリ毎の容量を調べたところ、cドライブ直下にhiberfil.sysが6G、pagefile.sysが8G・・・なんだこのファイルは。ちなみにexplorerでは標示されてない。隠しファイル、ディレクトリを表示に設定したのに。で、調べた見たら、コンパネ⇒フォルダオプション⇒表示タブ⇒保護されたオペレーティングシステムファイルを表示しない(推奨)のチェックも外さなければ見れないことを初めて知った・・・windows・・・

refs:windows7tips:hiberfil.sysとpagefile.sysを削除する

で、上の参考サイトを見て、hiberfil.sysだけ削除。
powercfg /hibernate off

行思考プログラミング

refs:dotinstall

■テストファイル
test_awk $ cat sales.dat
dotinstall item-5 100 2013/03/15 17:26:55
dotinstall item-2 250 2013/03/16 04:45:14
dotinstall item-2 250 2013/03/16 04:45:14
fkoji item-4 10 2013/03/07 16:40:24
fkoji item-4 10 2013/03/07 16:40:24
fkoji item-4 10 2013/03/07 16:40:24
hoge item-2 200 2013/03/09 07:38:57
fkoji item-4 10 2013/03/07 16:40:24
fkoji item-4 10 2013/03/07 16:40:24
fkoji item-4 10 2013/03/07 16:40:24
ta item-2 200 2013/03/09 07:38:57

■3列目を抜き出し表示、外だしのawkプログラムを実行
test_awk $ cat ex1.awk
{ print $3 }

test_awk $ awk -f ex1.awk sales.dat
100
250
250
10
10
10
200
10
10
10
200

■awk構文
test_awk $ cat ex1.awk
{
    # comment
    print $3
    print $4;
 }

文の区切りは改行か; コメントは#以降

■一行プログラム
test_awk $ awk '{print $2}' sales.dat
シングルクォーテで囲む

■特殊変数、レコード、フィールド
$2:2列目
$0:レコード全体
$NF:レコードの最後の項目
NR:行カウント
FS:フィールドセパレータの指定。デフォルトはスペース、タブ?

test_awk $ awk '{print $NF; print NR ":" $0}' sales.dat

■パターン
パターンを指定しない場合、すべてのレコードが対象。ある行だけを対象にしたい場合、パターンを使う。awk1はパターンと処理の組み合わせになる。
BEGINは処理の最初に一回だけ実行、ENDは処理の最後に一回だけ実行。

さんぷる
test_awk $ cat ex1.awk
BEGIN {
    print "----- start -----"
    FS = "-"
}
# 一つ目のハイフン"-"の前
{
    print NR ":" $1
}
# 5行目より前
NR < 5 {
    print NR ":" $0
}
# 7行目より前
NR  > 7 {
    print NR ":" $0
}

END {
    print "----- end -----"
}

その他のパターン
NR == 5, NR == 10 {print $0}
パターンをカンマで区切るとここからここまでという意味。上は5行目から10行目

# < > <= >= == !=
論理演算子
# && || !

# (NR == 5) || (NR > 10)

正規表現
# ~ !~

$2 ~ /item-[23]/  {
    print NR ":" $0
}
2つ目のフィールドがitem2かitem3

■フォーマット printf
test_awk $ cat ex2.awk
#printf
{
    # nameが20桁、salesが10桁
    printf("name : %20s sales : %10d\n", $1, $3)
}

{
    # -をつけて左寄せにする
    printf("name : %-20s sales : %-10d\n", $1, $3)
}

■変数、演算子
演算子は+=, ++インクリメント,--1がある。

さんぷる
全レコードの3列目の数値の合計を表示する
$ cat ex3.awk
# 変数 演算子
# += ++ --
# スペースで文字列連結
BEGIN {
    sum = 0
}
{
    sum = sum + $3
}
END {
    printf sum
}

■組み込み関数
rand():0~1の乱数発生
int():整数部分の抽出
length():長さ
substr():1部分文字列の取得

length($1) > 7:1列目の項目の長さが7より大きいとき
length($1) > 4:z1列目の項目の長さがzz74より大きいとき,刑務所ですっきりして:

■構文
if,while,for

■配列
test_awk $ cat ex_ary.awk
BEGIN {
    sales[1] = 200
    sales[2] = 120
    sales[3] = 50
    print sales[3]

    color = "yellow red blue"
    split(color, colors)
    print colors[3]

    for(i in colors){
        print colors[i]
    }
}

test_awk $ cat ex_ary2.awk
{
    sales[$1] += $3
}

END{
    for(name in sales){
        print name ":" sales[name]
    }
}

■関数

一行ずつ適応される

$ cat ex_func.awk
# function

function getRate(n){
    return int(n / 100) * 0.1
}

{
    printf("%-12s %5d rate:%0.1f\n", $1, $3, getRate($3))
}