CSS flexbox【日常 個人サービス製作日誌】

flexboxアイテム テキストが長いとはみ出てしまう

例)

<div class = "flex">
  <div class="problem">hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge</div>
  <div class="normal">hoge </div>
</div>
.flex {
    display: flexbox;
    width: 100px
}
.problem {
  flex-grow: 1;
}
.normal {
  flex-grow: 4;
}

フレックボックス幅が100pxとして、2つのフレックスアイテムがある場合を想定します。 それぞれのアイテムの長さ比率は1:4の幅で分割しています(flex-growプロパティ使用)。 テキストが長い場合、はみ出て表示されてしまう。(今回のケースだと .problemは20px幅)

ぐぐっていたら解決方法があった。 こちら

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 アルファベット・数字・空白だけを使用してソートする

【ruby】include VS extend

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

フラットスコープ

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

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