読者です 読者をやめる 読者になる 読者になる

【メモ】ついつい忘れてしまう gitコマンド

特定のコミットまで戻す

  • コミットの履歴を確認する

$ git log #ハッシュ値が出て来る

  • 戻す

$ git reset –hard ハッシュ値

linux 容量順ファイルのソート

コマンド

du -ma | sort -rn | head -10

du -m | sort -rn | head -100

1.du

  • du  ディレクトリ内のファイル容量を表示する
  • -m は単位をmバイトにする
  • -a ファイルも表示する(aはallの略)

2.sort

  • sort 行を並び替える
  • -n 先頭の文字(+.-など)を数字とみなしてソート
  • -r 逆順にソートする

3.head

  • head ファイルの先頭部分を表示する
  • -n(数字) ファイルの先頭からn行を表示する

1-3 つなげると

du -ma | sort -rn | head -10 なら

ディレクトリ内のファイル容量を表示| 数字順で行を並び替える | 先頭の10行表示

気になったコマンド

sort -d アルファベット・数字・空白だけを使用してソートする

include VS extend [ruby]

include

定義

moduleで定義されたメソッドを追加

rubyは多重継承は出来ないため、includeで必要な機能を追加 通常、moduleはインスタンスメソッドを使用出来ない。 includeしたクラスのスーパークラスとして継承されるため、 moduleに定義されたインスタンスメソッドが使用出来る。

extend

定義

モジュールで定義されたメソッドをselfの特異メソッドとして追加。

例えば、class内でextendした場合はmodule内で定義したmethodは クラスメソッドとして追加される。

module ModuleTest
  def module_test
    puts "test"
  end
end

Class IncludeTest
  include ModuleTest
end

Class ExtendTest
  extend ModuleTest
end

IncludeTest.new.module_test #test
ExtendTest.module_test #test

python、ruby文字列変数展開、バッククオート

python文字列変数展開、バッククオート

pythonを使いはじめてます。 簡単ですが、自分のメモ代わりに最近調べた事 を書いておきます。(対比としてrubyのケースも書いておきます)

文字列の変数展開

# ruby
hoge = "hoge"
puts "hoge#{hoge}"  #hogehoge
#python
hoge = "hoge{}" #変数で置き換えは{}
print(hoge.format("hoge")) #hogehoge

バッククオート

#ruby
`touch hoge.txt`
#python
 import os
 cmd = "touch hoge.txt"
 os.system( cmd )

メタプログラミングRuby第五章 特異メソッド

特異メソッド

特異メソッドとは・・・特定のオブジェクトにメソッドを追加することです。

以下にコード例を示します。

hoge = "hoge"

def hoge.upcase?
    hoge.upcase #HOGE
end

モンキーバッチと違うことは?

モンキーバッチとはクラスにメソッドを追加及び修正が行えることです。

特異メソッドと同じようなコードを作成するには以下のような コードを記述することになります。

class String
  def upcase?
    if self == "monkey"
      self.upcase
    else
      self
    end
  end
end

p "monkey".upcase? #MONKEY
p "hoge".upcase? #hoge

しかし、このようなコードを記述すると 現在あるStringクラスに追加するので 間違いがあった際、String全域で間違ったコードが記述される可能性があります。

ダックタイピング

最初のコードに示した特異メソッドの対象となった hoge はStringクラスに属していますが オブジェクトとクラスは結びついていないため、 upcase? をいれたとしても元のStringクラスに 属しているメソッドを汚すことはない、

このようにRubyが用いることが出来るメソッドはその「オブジェクト」が決定します。

このような事象を 「ダックタイピング」と言います。

今回のケースで言えば、あるオブジェクトが Stringクラスのインスタンスかは気にする必要はないことです。 実際メソッドを使う際にはそのオブジェクトに紐付いているメソッドだけを着目すれば良いんです。

メタプログラミング ruby ローカル変数スコープ

ローカル変数のスコープ切り替え

ローカル変数を使う時にいつも気になるのがスコープの存在です。

一旦、スコープの切り替えタイミングは クラス定義 モジュール定義 メソッド定義 の3つです。 上記3つのことを「スコープゲート」と呼びます。

v1 = 1 #→v1

class MyClass
  v2 = 2 #→ v2
  p local_variables
  def my_method
    v3 = 3 #→ v3
    p local_variables
  end
  p local_variables #→ v2
end

obj = MyClass.new
obj.my_method.local_variables

スコープゲートを抜けるには?

クラス定義やメソッドを乗り越えて、ローカル変数を使いたい時があると思います。

クラス定義の場合

class.newを用いてインスタンスを作成して、クラス定義のスコープゲートを回避します。

v1 = 1

MyClass = Class.new do
  puts "クラス定義の中#{v1}"
end

メソッド

メソッドの際は動的メソッドを用います。

v1 = 1

MyClass = Class.new do
  puts "クラス定義の中#{v1}"
  define_method :my_method do
    "クラス定義の中#{v1}"
  end
end

フラットスコープ

スコープゲート(クラス定義・モジュール定義・メソッド)をメソッド呼び出しに変更すると スコープ変更せず、他の変数が見えることが出来ます。

これを スコープのフラット化 または フラットスコープ と呼びます。

メタプログラミング 第四章 ブロック

ブロック

ブロックは {} もしくは do endキーワードで定義出来ます。 具体例を説明します。

["1","2","3"].each do |i|
    puts i
end

# => ["1", "2", "3"]

文法書でよくある記述ですが、ブロックの前(do endキーワード) の前には 配列オブジェクト そして メソッド(eachメソッド) を用いて配列を標準出力しています。

処理の流れとしてはブロックをメソッドに渡してオブジェクトとメソッドで処理を行っています。

ここで注意したいのはブロックは単体では存在できず、メソッドの引数となることです。

またメソッドの引数を理解するには以下の例も参考になると思います。

def block_test
    yield
end

block_test do
    p  "block_test"
end
# "block_test"

これはblock_test でメソッドを定義して、 yieldキーワードで書かれたメソッドにブロックを実行した例です。

クロージャ

クロージャの定義はある関数が作られた時に状態(ローカル変数、インスタンス変数) が関数内で保持されることです。

そしてブロックはクロージャです。

次のコードを見て下さい。

def test_method
    x =  "hoge"
    yield
end

x = "hogehoge"

test_method do
    p x
end      #hogehoge

上記の例を見ると、出力されるのは “hoge"という気がしますが、 実行すると、"hogehoge"が出力されます。

これはどういうことかというと ブロックはメソッドの引数となり、 ブロックが定義された段階では xはローカル変数(hogehoge)と認識しているためです。