OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby 「エラトステネスの篩」を通してアルゴリズムの威力を体感する

「[Ruby で実装するエラトステネスのふるい](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCkQFjAA&url=http%3A%2F%2Fjp.rubyist.net%2F%3Fc%3Dplugin%3Bplugin%3Dattach_download%3Bp%3DKansaiWorkshop28%3Bfile_name%3Deratosthenes.pdf&ei=ijxiU7XnGcH28QWp8oHwDQ&usg=AFQjCNHbaGxLZ5TFLlInXIopOWd-Mq_Xsg&sig2=-wAq3FsvIBE2sAWyFo-ahA&bvm=bv.65636070,d.dGc) 小波秀雄(pdf)
」の良質な記事を参照している

エラトステネスの篩とは素数を見つけ出すためのアルゴリズムである。
まず最初の素数である２の倍数を削除していく、次に残った数の最初に来る数、３の倍数を削除していく。次にくる数、５の倍数を削除していく。
同じような動作を延々と続けて素数を見つける。

この記事はエラトステネスの篩を通してアルゴリズムの威力を体感する事が目的

```rb
require 'benchmark'
def erato_1(n)
  numbers = (2..n).to_a # 2 ～ n の配列を用意
  primes = [] # 素数を放り込むための配列
  loop do
    d = numbers.shift # 配列の先頭要素を取り出して
  break if d == nil # nil なら終了
    primes << d # 素数の配列に追加。
    to_delete = [] # 取り除く候補を入れる配列
    numbers.each do |x|
      to_delete << x if x % d == 0 # d の倍数を取り除く候補に入れる
    end
    numbers -= to_delete # d の倍数がそっくり引かれる
  end
  return primes
end

puts Benchmark.measure{ erato_1(10000) }

=>  0.120000   0.000000   0.120000 (  0.120805)
```

rubyのプロファイラでチェックする、ファイルの先頭に
\#!/usr/local/bin/ruby # -r profileを加えてコードを実行する.

```rb

time   seconds   seconds    calls  ms/call  ms/call  name
 57.31    26.15     26.15   777862     0.03     0.16  Object#erato_1
 25.68    37.87     11.72     1230     9.53    36.90  Array#each
  8.99    41.97      4.10   777860     0.01     0.01  Fixnum#==
  7.69    45.48      3.51   776631     0.00     0.00  Fixnum#%
  0.15    45.55      0.07     9999     0.01     0.01  Array#<<
  0.11    45.60      0.05     1229     0.04     0.04  Array#-
....下記省略
```

if x % d == 0の条件判断に時間がかかっている、
またprime = [ ]のところがnumbersにデータが入っているので不要である

```rb
require 'benchmark'
def erato_2(n)
  numbers = (2..n).to_a
  i = 0
  loop do
  break unless d = numbers[i]
    to_delete = []
    (2*d..n).step(d){|e| to_delete << e}
    numbers -= to_delete
    i += 1
  end
  return numbers
end

puts Benchmark.measure{
  erato_2(10000) }
=> 0.090000   0.010000   0.100000 (  0.097825)
```

少しだけはやくなった
ただ\#erato_2にはまだ無駄がある、例えば１００までの素数を調べたいとして、2,3,5,7の倍数を削除した時点で１００までの素数はすべてそろっている状態であるがそのあとの１１、１３、、以降の倍数を削除している処理が無駄である


```rb
def erato_3(n)
  sqrt = Math.sqrt(n).floor
  numbers = (2...n).to_a
  i = 0
  loop do
    break if i >= sqrt
    d = numbers[i]
    to_delete = []
    (2*d..n).step(d){|e| to_delete << e}
    numbers -= to_delete
    i += 1
  end
  return numbers
end

puts Benchmark.measure{ erato_3(10000) }
=> 0.020000   0.000000   0.020000 (  0.026519)
```

３倍近く早くなった、だがまだ早くする余地がある
numbers -= to_deleteの箇所で処理量が増えているのでここの箇所をなくす

```rb
def erato_4(n)
  numbers = (0..n).to_a
  numbers[0],numbers[1] = nil
  numbers.each do |d|
    next if d == nil
    break if (Math.sqrt(n) < d)
    (2*d..n).step(d){|e| numbers[e] = nil}
  end
  numbers.compact!
  return numbers
end
puts Benchmark.measure{ erato_4(10000) }
=> 0.010000   0.000000   0.010000 (  0.003047)
```

８倍ぐらい早くなった、アルゴリズムは深い、、、、
onBeforePasteのタイミング

onBeforePasteというイベントがある。
文字列をコピーした後、テキストボックスを選択してCtrl + v または、右クリックして出るコンテキストメニューで「貼り付け」を選択した時、ペースト前に起こるイベントということになっている。

イメージはこう。
![理想.png](https://qiita-image-store.s3.amazonaws.com/0/1627/8b57d7e6-7545-c260-23aa-0adf2da6d51c.png)

ところが、実際はこうなってる。
![現実.png](https://qiita-image-store.s3.amazonaws.com/0/1627/637759ba-2043-ae25-c2e6-195f14463ebd.png)

これはコンテキストメニューからペーストを実行する際に起きる現象で、Ctrl + v では起きてない、はず。
onBeforePasteに書いた処理は想定外のタイミングでしかも２度呼ばれる。
回避策として上げられていたのは、コンテキストメニューを自分で定義しろ、というものだった。右クリックを封じたほうが楽だ。
Hashのmergeを便利に

```rb
a = {foo: {first: 1}, bar: {first: 2}}
b = {foo: {second: 3}, bar: {second: 4}}
```

を `a.merge b`すると

```rb
{foo: {first: 1, second: 3}, bar: {first: 2, second: 4}}
```
が欲しかったのに返ってくるのはこんなんです。悲しい。

```rb
{:foo=>{:second=>3}, :bar=>{:second=>4}}
```


## 対策

```rb
a = {foo: {first: 1}, bar: {first: 2}}
b = {foo: {second: 3}, bar: {second: 4}}
a.each_with_object(b) { |(k,v),x| x[k].merge!(v) }
# => {:foo=>{:second=>3, :first=>1}, :bar=>{:second=>4, :first=>2}}
```

ステキ！

## ActiveSupportを使う

```rb
require 'active_support/core_ext/hash'
a = {foo: {first: 1}, bar: {first: 2}}
b = {foo: {second: 3}, bar: {second: 4}}
a.deep_merge
# => {:foo=>{:second=>3, :first=>1}, :bar=>{:second=>4, :first=>2}}
```

とてもステキ！

## 参考

http://stackoverflow.com/questions/23464093/how-to-merge-two-hashes-without-losing-values/23464170?noredirect=1#23464170
競技プログラミングにおけるScalaの標準入力を楽にする

AtCoderなどの競技プログラミングにおいて、Scalaの入力部分を非常に簡潔に書く方法をまとめました。
##Scannerを使う
空白区切りで数字の並びを一行入力させてそれぞれ変数に代入する時を考えます。

```
1 2 3
```
Scalaっぽいコードを書くとしたら以下のようになるかと思います。

```scala

object Main {
  def main(args:Array[String]) = {
    /* 文字列を読み込み、空白で分割して配列にし、Int型にする */
    val in = readLine.split(" ").map(_.toInt) 
    val a = in(0)
    val b = in(1)
    val c = in(2)
  }
}
```

このような時に **java.util.Scanner** が使えます。
Scannerを使うと必要なだけ文字列を読み込み、パースして順に数字や単語を代入することが出来ます。

```scala
object Main {
  def main(args:Array[String]) = {
    val sc = new java.util.Scanner(System.in)
    val a = sc.nextInt //最初の整数が読み込まれる
    val b = sc.nextInt //2番目に出てきた整数が読み込まれる
    val c = sc.nextInt //3番目に出てきた整数が読み込まれる
    println(a)
    println(b)
    println(c)
  }
}
```

**出力例：**

```
1
2
3
```

また、Scannerは **改行を挟んでいても有効** です。
必要なだけ文字列を読み込みます。
この場合であれば、数字を三回入力するまで読み込みます。
**入力例：**

```
4
5
6
```

**出力例：**

```
4
5
6
```
入力が空白区切りでも改行区切りでも同じコードで動くのでわざわざ考えなくて済むのも利点です。
nextIntの他にはnextDoubleやnextLine(行読み込み: String)、next(空白で区切られた単語: String)などがあります。

##変数初期化はまとめられる
Javaなどでは複数の変数を一行で宣言すると、最後の変数だけに対して右辺式が評価されます。
それに対してScalaは右辺の式を **左辺の変数すべてに対して評価** していきます。
なので、上で書いたようなScannerを使って連続して変数を初期化したい時は、以下のように簡単にまとめられます。

```scala
object Main {
  def main(args:Array[String]) = {
    val sc = new java.util.Scanner(System.in)
    val a,b,c = sc.nextInt //a,b,cと順番にnextIntで代入されていく
  }
}
```

##コレクションに対してはScannerとfillを使う
最初にnを入力させ、次にn個の整数をListやArrayに入力するにはこう書きます。

```scala
object Main {
  def main(args:Array[String]) = {
    val sc = new java.util.Scanner(System.in)
    val n = sc.nextInt // 最初の数字を読み取る
    val list = List.fill(n)(sc.nextInt) // nextIntがn回呼ばれる
    println(list)
  }
}
```
**入力例：**

```
3
1
2
3
```
**出力例：**

```
List(1,2,3)
```
Arrayを使いたい場合はList.fillではなくArray.fillに変えるだけです。

##多次元のコレクションを扱う
[ARC021 A - DEAD END](http://arc021.contest.atcoder.jp/tasks/arc021_1)のような多次元を扱う場合  
実はfillの一つ目の括弧の引数は可変長です。　　
**n個実引数を書くとn次元** になります。
m行n列の二次元コレクションを作りたい場合は以下のように書きます。

```scala
object Main {
  def main(args:Array[String]) = {
    val sc = new java.util.Scanner(System.in)
    val m,n = sc.nextInt
    val list = List.fill(m,n)(sc.nextInt)  //mとnの二つ書いてあるため二次元となる
    println(list)
  }
}
```

**入力例：**

```
2 3
1 2 3
4 5 6
```
**出力例：**

```
List(List(1, 2, 3), List(4, 5, 6))
```

##(おまけ)標準出力についてのTips
Scalaのprintやprintlnは、 Javaと少し違います。
**Any型を引数に取る**ので見た目上複数の引数を渡すことができ、出力することが可能です。
(追記: 可変長引数ではなくAny型でした。@xuwei_k さん訂正ありがとうございます)
表示はタプルと同じになり括弧が付くので、実際の出力には使えませんが、
デバッグで変数のチェックをしたい時には調べたい変数を並べるだけで済むので非常に楽になります。

```scala
object Main {
  def main(args:Array[String]) = {
    println(1,2) // => (1,2)と表示される
  }
}
```

##結論
ScalaのコレクションをJavaのScannerクラスと組み合わせると非常に便利です！
「for文」で繰り返しの命令をする


## for文の構造

```php
for (ループカウントを制御) {
	繰り返す処理
}

```

## for文のループカウンタ

```php
for (初期値; 終了条件; 増分値)
```



## 1から5まで表示するfor文

```PHP

<?php

for ($i=1; $i <= 5; $i++) { 
	echo $i;
}

?>  /// 12345


```

## 連続した5日分の日付を表示する

```php

<?php

for ($i=1; $i <= 5; $i++) { 
	echo "3月{$i}日<br />";
}

?>

```
実行結果
![php_007.png](https://qiita-image-store.s3.amazonaws.com/0/35975/2d798f7d-cf51-f95f-0440-9a1a2dea9d4b.png "php_007.png")


## break文でループを抜ける

下の例では、$iが２より大きくなった時点でbreak文が実行されるので「123」と表示されます。

```PHP

<?php

for ($i=1; $i <= 5; $i++) { 
	echo $i;
	if ($i > 2){
		break;
	}
}

?> /// 123

```

## 今日から5日分の日付を表示する
pry-byebugのコマンドをエンターで再実行する

.pryrcに設定を追加することで、最後に入力したコマンドを再実行できます。

```rb
# ~/.pryrcやプロジェクト下の.prycに以下を定義する

# Hit Enter to repeat last command
Pry::Commands.command /^$/, "repeat last command" do
  _pry_.run_command Pry.history.to_a.last
end

```

実行例

```bash
pry> s # ステップ実行
pry> (改行) #エンターが入力されたら、ステップ実行を繰り返す
pry> (改行) #エンターが入力されたら、ステップ実行を繰り返す
```

----
参考

[deivid-rodriguez/pry-byebug](https://github.com/deivid-rodriguez/pry-byebug)

------
# 旧記事

以下は、.pryrcを設定する方法ではなく、pry-byebugをムリヤリ書き換える例です。

pry-byebugでは、gdbのようにエンターだけで直前のコマンドを繰り返せないようなので、無理矢理pryをいじって、sncfを繰り返せるようにしてみた。(そもそもpryにそういうオプションがあるのかも？）

## やれるようになったこと

```bash
pry> s # ステップ実行
pry> (改行) #エンターが入力されたら、ステップ実行を繰り返す
pry> (改行) #エンターが入力されたら、ステップ実行を繰り返す

## これがs n c fに適用される。
```

## 変更箇所
[pry/lib/pry_instance.rb]((https://github.com/hmuronaka/pry/blob/improve_handle_line/lib/pry/pry_instance.rb)
)

```rb
## 属性を２つ追加
attr_accessor :last_line
attr_accessor :repeat_command_names
```

```rb
def initialize
  ...
  @repeat_command_names = "s n c f".split(/\s+/) # オプションにするべき箇所.
end
```

```rb
def handle_line(line, options)
  if line.nil?
    config.control_d_handler.call(@eval_string, self)
    return
  end
 
  # ここにコマンドが改行のときに、直前のコマンドが
  # 繰り返し対象なら繰り返す処理を追加.
  # process_commandに処理を追加するかはちょっと悩んだ...
  if line.chomp.empty?
    if @repeat_command_names.include?(@last_line)
      line = @last_line
    end
  end
  @last_line = line.chomp
  # 追加はここまで

  ensure_correct_encoding!(line)
  Pry.history << line unless options[:generated]

  @suppress_output = false
  inject_sticky_locals!
  begin
    if !process_command_safely(line.lstrip)
```

[pry_instance.rbはgithubから取得できます.](https://github.com/hmuronaka/pry/blob/improve_handle_line/lib/pry/pry_instance.rb)

## 反省点...
githubの更新の仕方をよく調べもせずに更新してしまったけど(さすがにmasterではないけど)、良くなかったのではないかと...。他人のリポジトリの変更方法をちゃんと確認すれば良かった。反省。
カレントディレクトリ以下の全てのGitリポジトリをTowerに追加するワンライナー

SourceTree のセットアップウィザードみたいなことをコマンドラインでやりたかったので。

```zsh
find . -type d -name .git -not -path "*/vendor/bundle/*" -print0 | xargs -0 -n 1 dirname | xargs gittower -a
```

このワンライナーは、カレントディレクトリ以下のGitリポジトリ（但し、bundler管理下のものは除く）を探し、`gittower -a`で Tower に一括で追加している。
[備忘録]OpenCvSharpで複数のShowImageする際のウィンドウ名を簡単に設定する方法

OpenCVではShowImageメソッドという画像表示用のメソッドがありとても便利なのですが、引数にウィンドウ名(string)を設定しなければなりません。
しかし、ウィンドウ名を同じにすると画像が上書きされてしまい、複数の画像を一気に表示することができません。
そこで、カウンタなどを使ってウィンドウ名を設定すればよいのですが、変数の宣言などが面倒くさいです。
簡単な解決方法として、新しいGuidを生成してウィンドウ名にする方法があります。

```csharp
foreach(var iplImg in iplImages){
    // Guidでユニークなウィンドウ名を生成する
    Cv.ShowImage(Guid.NewGuid().ToString(), iplImg);
}
Cv.WaitKey();
Cv.DestroyAllWindows();
```
Railsのリレーションで紐づくカラム名を代替する

Tealeaf AcademyにてRails再勉強はじめた。
内容はまだエントリーレベルだけど結構いろいろ発見があります。

1:mのリレーションを張るとき下記のように書くと外部キーのカラム名を使わず、
任意の名前で呼び出せる。

`class Post < ActiveRecord::Base
  belongs_to :creator, foreign_key: 'user_id', class_name: 'User'
end
`

これで下記のように投稿ユーザを呼び出せる↓

`post = Post.first
post.creator
`
[SystemVerilog]UVMことはじめ

あまりやる気の無かったメソドロジに手を出すことにしました。
これはそのおぼえがきです。
##なぜUVMか
* 資料が充実してきた。
* VMMとかAVMとかOVMとかのように、これ以上メソドロジの名前が変わることは無かろう。
* Verification IPがUVMを前提にインスタンスさせることが多い。
* 仕事の案件、政治的関係。

以上により、今、UVMに少し力を入れることは時間の無駄では無かろうと判断しました。

##UVMに必要な知識と感じるもの
OOPですかねー。継承とオーバーライドは不可避っぽい。
C++とかの知識があるといいと思いますが、個人的にはPythonとかやっているといいかもしれません。
ここでは、SystemVerilogに関する知識があるという前提で書いていきます。

##UVMの特徴
* Layeredなテストコード構造により、効率的にテストを流すことができる。
* テスト実行手順が決められているので、それに従えば無理なくテスト環境を構築できる。
* 上記により決められた手順に沿ってお決まりの宣言をする（いわゆる、おまじない）だけで、テストは一応完成する。
* コードが汚くなる。

実際のところ、資料をただ読むだけでなく、自分でコードを書いてシミュレータで動かさないと個人的には理解できないですね。
ということで、コードを書いていくことにしました。

##UVMの資料
Verification AcademyのBasic UVMの各コースに日本語のPDF資料があるので参考になります。
https://verificationacademy.com/courses/basic-uvm

##まずはHello Worldから

検証対象(DUT)はまず置いておいて、UVMのテストで完結するコードを書いてみます。

```sv:hello_world.sv
`include "uvm_macros.svh"
import uvm_pkg::*;

module tb();

  class base_test extends uvm_test;
    `uvm_component_utils(base_test)

    function new(string name, uvm_component parent);
      super.new(name, parent);
    endfunction

    task run_phase(uvm_phase phase);
      phase.raise_objection(this);
      `uvm_info("TEST", "Hello, Wold.", UVM_MEDIUM);
      phase.drop_objection(this);
    endtask

  endclass

  class ext_test extends base_test;
    `uvm_component_utils(ext_test)

    function new(string name, uvm_component parent);
      super.new(name, parent);
    endfunction

    task run_phase(uvm_phase phase);
      phase.raise_objection(this);
      `uvm_info("TEST", "Extended Hello, Wold.", UVM_MEDIUM);
      phase.drop_objection(this);
    endtask

  endclass

  initial
    run_test();

endmodule
```

まずはUVMのベースクラスであるuvm_testを継承して簡単なテストクラス(base_test)を作ります。
次にuvm_component_utilsにそのテストクラス名を入れ、テストを登録します（ **;が入らないことに注意** ）。

コンストラクターとして、function newがあり、引数はあのまま（おなじない）、super.new()でベースクラスもインスタンスします。

次に、run_phaseというtask(おまじない)を作成し、uvm_info($displayみたいなもの)でメッセージを出力します。
`uvminfoの前後に「phase...(this)」がありますが、実はこのコードでは不要です。これは、検証モジュールが増えて並列に走っているときにsmaphore的にリソースをゲットするためのステートメントです（  **たぶん** ）

ext_baseクラスはbase_testクラスを継承しています。run_phaseはオーバーライドされます。

テスト実行にはrun_test()を宣言します（おなじない）。

##動かし方
動作確認してませんが、各資料を読みあさる限り、こんなオプションでイケルと思います。バージョンによってはオプションをさらに盛る必要があるかもしれません。

###VCSの場合

```bash:vcs.sh
vcs \
    -R \
    -full64 \
    -sverilog \
    -ntb_opts uvm  \
    hello_world.sv \
    +UVM_TESTNAME=base_test
```

###Incisiveの場合

```bash:irun.sh
irun \
     -64 \
     -uvm \
     hello_world.sv \
     +UVM_TESTNAME=base_test
```

###QuestaSimの場合

```bash:que.sh
vlib work
vlog hello_world.sv
vsim -64 -c tb -do "run -all" +UVM_TESTNAME=base_test 
```

##実行結果
UVM_INFOから始まって、「Hello, Wold.」が表示され、シミュレーション実行号のサマリーでFATALやERRORがカウントされなければオッケーです。

+UVM_TESTNAMEオプションもおまじないで、+UVM_TESTNAME=ext_testと変更すると、ext_testクラスで記述されたテストが実行、つまり「Extended Hello, Wold.」と表示されます。

##おわりに。
メソドロジをやって感じるのは、ピン接続で簡単にできることもわざわざ面倒な手順でやらなくてはいけないことですね。小規模な回路でテストするのだったら不要と思います。
大規模な回路をチーム開発でたくさんのテストシナリオを流す時に、初めてその生産性の高さがわかるのかもしれません。そこまで気力が保つかどうかですね。
 ~~そもそも日本でSystemVerilogが要るかどうかはさておき、~~ 気が向いたら継続して残していこうと思います。
mac / mac bookのトラックパッドでマウスジェスチャーする方法

macの **Magic Trackpad** は直感的に使えてとても可愛いアイテムなのですが、ブラウザでwebを徘徊してる時にマウスジェスチャーを使えないのが難点でした。
これを解決する方法をご紹介します。

#方法１
 
システム環境設定 - トラックパッド -副ボタンのクリック - 右下隅をクリック（左下隅でも可）
あとは設定した所が右クリックになるので、そこを押しながらジェスチャーできるようになります。
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/4784/aa56cda4-4e73-e33d-25e6-7311141ce02d.png)



# 方法２

上記の方法はイマイチ使いにくいので **KeyRemap4MacBook** を使う方法もあります。
キーボードの使わないキーを右クリックにアサインすればOKです。
私は右のoptionキーを使わないのでここに設定しました。

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/4784/4cd525f4-c4ed-e0a4-70d8-a91cc82b1bbd.png)

**Option_R to RightClick** という所にチェックを入れるだけで、右オプションキーで右クリックできるようになります。
あとはここを押しながらトラックパッドをなぞるとマウスジェスチャーできます。

[KeyRemap4MacBook - ダウンロード](https://pqrs.org/macosx/keyremap4macbook/)
[KeyRemap4MacBook - マニュアル](https://pqrs.org/macosx/keyremap4macbook/document.html.ja)
配列とハッシュとシンボルは紛らわしいので整理！！


どうも千葉です。GWはいかがお過ごしですか。
実家に帰ったりしてると、以外に忙しくて時間なかったりしますよね。。。
今日は、railsやってて紛らわしい配列とハッシュについてです。
整理！！

## 配列
まずは、配列です。

```rb
    a = ["a", "b", "c"]
    puts a[0] #aを表示
    puts a[1] #bを表示
    puts a[2] #cを表示
```
## ハッシュ
配列と違って、a[0]をa["first"]のようにkeyを使って扱えます。
[]の中は文字列を指定

```rb
    a = {} #aをハッシュとして定義
    a["first"] = 1
    pusts a["first"] #1と表示
```
または、以下のようにも書けます。

```rb
    a = { "first" => 1, "second" => 2 }
    puts a["first"] #1と表示
    puts a["second"] #2と表示
```
## ハッシュとシンボル
シンボルとは、文字列みたいなものと思って大丈夫です。
ハッシュと組み合わせることが多いです。

```rb
    h1 = { :first => 1, :second => 2 }
    puts h1[:first] #1と表示
    puts h1[:second] #2と表示
```

ここから、紛らわしくなってきます。
別の書き方もできます。

```rb
    h2 = { first: 1, second: 2}
    puts h2[:first] #1と表示
    puts h2[:second] #2と表示

    h1 == h2 #trueになる
```

書き方が簡素化できます。（紛らわしいポイント）
h1とh2の結果は同じになります。
h1をh2で書ける。「=>」使わなくてよいので楽チンです。
:が色んな位置に出て来ますね。。。あくまでシンボルは「:」が文字列の前にきます。

### :first、:secondはシンボルなので文字列の前に「:」
### 代入する時は、簡素化のためシンボルが文字列の後ろ「:」

## さらに紛らわしい、混在パターン
```Rb
    stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true
```
stylesheet_link_tagは関数です。
引数として、色々持ってますが実は引数は2つ。この例で、分解して行きます。

## 関数は（）を省略できる
（）を追加してみます

```Rb
    stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true
    stylesheet_link_tag ("application", media: "all", "data-turbolinks-track" => true)
```
そして、「:media」はハッシュのようだが{}がない。
なんと、引数の最後がハッシュの場合、{}を省略できます。
省略しないとこうなります。

```rb
    stylesheet_link_tag ("application", media: "all", "data-turbolinks-track" => true)
    stylesheet_link_tag ("application", { media: "all", "data-turbolinks-track" => true} )
```
そしてなぜか、「data-turbolinks-track」はシンボルを使ってない。
紛らわしくて混乱します。。
実は、シンボルは「-」が使えません。なので、シンボルを使えないのでこうなってます。
Conoha VPS CentOS6.5 SSH経由シリアルコンソール接続設定

Conoha VPSに、ISOイメージアップロードを用いて、CetOS6.5をインストールし、
SSH経由シリアルコンソール接続を利用したい場合、grub.confに設定を追加します。

``` /boot/grub/grub.conf
default=0
timeout=5
serial --unit=0 --speed=115200 #追加
terminal --timeout=5 serial console #追加

kernel /vmlinuz-2.6.xx-xxx.xx.x.el6.x86_64 ro ...省略
console=tty0 console=ttyS0,115200n8r #追加
initrd /initramfs-2.6.32-358.11.1.el6.x86_64.img

```

追加後再起動で利用できます。
Rails.vim 移動元のファイルに戻るには

rails.vimというかvimでのファイル移動した際の戻り方

```vim
:bp 前のバッファ（ファイル）に戻る.
:bn 次のバッファ（ファイル）に進む.
:ls バッファリストの表示.
```

ショートカットキーを割り当てると楽に戻れます。

```vim
"gfと相性が良い.
nnoremap <silent> gp :bprevious<CR>
nnoremap <silent> gn :bnext<CR>

"元のコマンドに近いイメージ.
nnoremap <silent> bp :bprevious<CR>
nnoremap <silent> bn :bnext<CR>
```
Rails(v4)チュートリアル6章メモ


## データベース周りの操作

レコード作成時やマイグレーションに付けられるタイムスタンプの時間が正しくない。
以下のURLを参考に正しいTimeZoneをセットする。

http://transitive.info/2013/04/14/rails4-beta1-on-ruby2-part3/

---

下記コマンドは、単に開発データベースのデータモデルdb/development.sqlite3がテストデータベースdb/test.sqlite3に反映されるようにするもの。(development.sqlite3とtest.sqlite3に同期)

```
$ bundle exec rake test:prepare
```
Release Notes for 自分開発 v1.0


> 50日間毎朝座り続けた
> 単純に座るということを行い
> 自分を開発してみた
> そのリリースノート

## Bug fixes
* ニキビ
* 便秘
* 不眠症

## Upgrading
* 生きるモチベーション
* 健康
* 姿勢
* 学習意欲

## New Features
* ゴミ捨てをする
* 家事をする
* 仕事をする
* 体調チェック
* 風感じる

## Degrading
* 夜が弱くなり付き合いがわるくなる

## Solution
* 妻が結構喜ぶ
* 家庭が平和になる
* ご飯が美味しくなる

## The Next Milestone v2.0
* 100日間毎朝座る
LPC1768でTCP Echo

TCP　Echoを試してみました。

http://nora66.com/mbed/lan.html

どうも開発環境というかツールというか、なんやかやと細かい問題が出てて、SH+HEW+PalmICEのようにはスッキリと開発できない。
ARMにはARMのなにかコツがあるのかなぁ･･･慣れるまで仕方ないか。
マルチタブのコンソールConEmuでnyaosを使う

こんな感じにできます。

![201405051.jpg](https://qiita-image-store.s3.amazonaws.com/0/19475/0759cf78-6285-8d15-8950-fe53aa605add.jpeg)


## nyaosをタスクに登録

ConEmuは複数のシェルを`task`として登録しておくことでタブごとに使うシェルを変更することができます。

サンプル画像だと通常起動の`nyaos`を2個と、標準の`cmd.exe`、それに管理者権限で実行してる`nyaos`が立ち上がってる状態です。

`task`の登録は緑の`+`ボタンの右の`▼`から`Setup tasks`で設定画面を開いて、

`+`ボタンで`task`を追加してこんな感じで設定します。

![201405052.jpg](https://qiita-image-store.s3.amazonaws.com/0/19475/3e082e89-ea9a-260c-d75c-2a4ddf134cc3.jpeg)

## 標準のシェルをnyaosにする

![201405053.jpg](https://qiita-image-store.s3.amazonaws.com/0/19475/c28430f2-de95-1705-b9b0-e3e13a963896.jpeg)

次に`Startup` で`nyaos`タスクが起動するように設定する。

## ショートカットも決めとこう

んで `Keys & Macro`で `Ctrl+T`で新しいタブを開く設定を`Shell("new_console:I")`で行って、`Ctrl+O`には`Switch previous console`とかやっておくと幸せになれるんじゃないでしょうか？ 確か`Ctrl+T`はデフォルトで何か別のキーバインドがあった気がするので削除が必要かもしれません。

![201405054.jpg](https://qiita-image-store.s3.amazonaws.com/0/19475/cbb6fcac-2f71-3c56-15eb-94a8addefbab.jpeg)

何故かConEmuは日本語圏だとあまり紹介されてないようなので快適なWindows上のターミナル環境が広まれば良いなとの願いを込めて記事を書いてみました。とりあえずWindowsさんは全部utf8に統一してほしい。そして`sudo`が欲しい。とても欲しい。
LPC1114をMDK-ARMで使う

MDK-ARM＋ULINK2を使ってLPC1114（mbedではなく素のCPU）のフラッシュに書き込んでステップ実行してみました。

プログラムはmbed.orgでBlinkyを生成し、プロジェクトをExport、これをMDK-ARMに取り込んでビルドし、フラッシュに転送、ステップ実行が出来るところまで確認。

http://nora66.com/mbed/lpc1114.html#2014/05/01

参照させて頂いたサイトはこちらです。
http://mbed.org/users/ytsuboi/notebook/getting-started-with-mbed-lpc1114-ja/

今の時点でのmbedのメモ書きはこちらです（ARMのCPUを触り始めて日が浅いので間違いやら勘違いやら有ると思うので眉唾での参照をお願いします）。
http://nora66.com/mbed/
条件分岐「PHP」、、if文とswitch文

ここでは条件分岐の方法として「if文」と「switch文」をまとめてみたいと思います。

## if文、、、「もしも〜なら」

「if文」の様な条件分岐を言葉で説明すると分かりづらくなりそうなので、簡単なパターンを書いてみます↓

````php
if (条件1) {
	条件1をみたした時の処理;
} elseif (条件2) {
	条件1は満たさなかったけど条件2は満たした時の処理
} else {
	それ以外(条件１も条件２も満たさない)ときの処理
}

```

###　例、、、「今の時刻は18時以降？」の条件式の場合

```php

<?php
$hour = date("G");

if ($hour >= 18) {
	echo "こんばんは";;
} else {
	echo "こんにちは";
}  ///こんにちは
?>


```

最初の部分の
`$hour = date(G);`はdate関数の最初のパラメーターに「G」を指定して、0から23までの「時」を返します。この数値を変数`$hour`に格納して、それより下の「if」文の判断に利用しています。

ちなみに今が18時かどうか(18時に一致するか)を調べる時は比較演算子「==」を使って調べてみました。

```php

<?php
$hour = date("G");

if ($hour == 18) {
	echo "18時です";
} else {
	echo "18ではありません";
}
?>  ///18ではありません

```

比較に使う演算子は「=」では無く「==」を使います。「=」は変数に値を代入する「代入演算子」です。

### 「!=」で一致しない事をチェックする

以下一致しない事を調べる条件

```PHP

<?php
$hour = date("G");

if ($hour != 12) {
	echo "今はお昼ではありませんよ";
}

?> ///今はお昼ではありませんよ

```

## switch文、、、「選択肢から１つを選ぶ」方法

曜日ごとに、違うメッセージを表示したい場合どうするか？、、if文を使っても出来るが、
switch文を使って「曜日という選択肢」からそれぞれの場合(ケース)の命令を作ってみる。

最初に↓
`$a = date(w);`
「date関数」で曜日番号を取得
これで「変数`$a`が`・・・`のときは」という意味になり、曜日に応じて処理が分岐する。

例を下に作ってみます(月曜日に作りました)↓

```php

<?php
$a = date("w");

switch ($a) {
	
	case '0':
		echo "今日は日曜日です";
		break;
	
	case '3':
		echo "今日は水曜日です";
		break;
	
	default:
		echo "今日は「日、水」以外の曜日です";
		break;
}

?>  // 今日は「日、水」以外の曜日です

```

### switch文でおみくじを作ってみる



最初に実行してる「mt_rand関数」は指定した範囲の数値をランダムに作成します。
`mt_rand(1,3)`
の場合、実行するたびに1〜3までの数値がランダムに作成されます。


```php

<?php

$a = mt_rand(1, 3);
switch ($a) {
	case '1':
		echo "大吉";
		break;

	case '2':
		echo "吉";
		break;
	
	default:
		echo "凶";
		break;
}


?>  // 「大吉」or「吉」or「凶」

```
xyzzyのタブをホイールクリックで閉じる

デフォルトでは`xyzzy`のタブはホイールクリック(センタークリック)で閉じる事はできませんが、拡張を入れると可能になります。

むしろこれはデフォルトで入っててくれると嬉しいんですが、なんでないんだろう。

## やり方

[tips/バッファタブを拡張 - XyzzyWiki](http://xyzzy.s53.xrea.com/wiki/index.php?tips%2F%A5%D0%A5%C3%A5%D5%A5%A1%A5%BF%A5%D6%A4%F2%B3%C8%C4%A5)

から 

[buffer-bar-click-to-delete-060610.zip](http://xyzzy.s53.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=buffer-bar-click-to-delete-060610.zip&refer=tips%2F%A5%D0%A5%C3%A5%D5%A5%A1%A5%BF%A5%D6%A4%F2%B3%C8%C4%A5)

をダウンロードしてきて、ファイルを展開して、
`buffer-bar-mc-hook.dll`を`xyzzy.exe`と同じフォルダに入れて、`buffer-bar-click-to-delete.l`は`site-lisp`ディレクトリに保存する。

んで、`.xyzzy`に `(require "buffer-bar-click-to-delete")`を追加すればOK.

## おまけ

ちなみに自分の場合は`.xyzzy`がでかすぎて何がどこに書いてあるかわからなくなってきたので

`.xyzzy`に`(mapcar 'mc-load-file (directory "~/.xyzzy.d" :absolute t :wild "*.l"))`

と書いといて`~/.xyzzy.d/20-tab.l`で`require`してます。

`mc-load-file`だと設定ファイルを`utf8`で書けるのがとても良い。
正規表現による入力値検証


入力値をチェックする関数は、2つ（mb_eregとpreg_match）あるみたいです。

```php:mb_ereg
mb_regex_encoding('UTF-8');
if (mb_ereg('\A[a-zA-Z0-9]{1,5}\z', $string) === false) {
	// マッチしない.
}
```

```php:preg_match
if (preg_match('/\A[a-z0-9]{1,5}\z/ui', $string) == 0) {
	// マッチしない.
}
```

```php:2014/11/14追記
// 半角英数のみ.
if (preg_match("/^[a-zA-Z0-9]+$/", $id) == 0) {
	// 不正な入力.
}

// Eメールアドレス.
if (preg_match('|^[0-9a-z_./?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$|', $email) == 0) {
	// 不正な入力.
}
```
認証Proxy環境やBasic認証ページにopen-uriでアクセスする


Nokogiriでスクレイピングする時、open-uriを使ってアクセスすることが多い？みたいだけど、例によって閉鎖環境だと一工夫いるのでメモ。

環境変数にhttp_proxyがセットされていれば見に行くっぽいんだけど、自分の環境では見に行ってくれなかった。

## Proxyを通す場合
```ruby
proxy = ["http://hoge.jp:8888", "user", "password"]
open(url, {:proxy_http_basic_authentication => proxy}).read
```

## Basic認証を通す
```ruby
certs = ["user", "password"]
open(url, {:http_basic_authentication => certs}).read
```

## 両方通す
```ruby
certs = ["user", "password"]
proxy = ["http://hoge.jp:8888", "user", "password"]
open(url, {:http_basic_authentication => certs,
			:proxy_http_basic_authentication => proxy}).read

```
Go の Enum

iota で Stringer な Enum はこんな感じだろうか。

```go
package main

import (
	"log"
)

func init() {
	log.SetFlags(log.Lshortfile)
}

type Indexing int

func (i Indexing) String() string {
	switch i {
	case WITH:
		return "WITH"
	case WITHOUT:
		return "WITHOUT"
	case NEVER:
		return "NEVER"
	}
	log.Fatal("can't be here")
	return ""
}

const (
	WITH Indexing = iota
	WITHOUT
	NEVER
)

func main() {
	log.Println(WITH, WITHOUT, NEVER)
}
```
C++11で処理速度を精度よく計測してみる？

# forとwhileのループ処理に速度差があるのかを知りたくてちょっと書いてみました。

###ウンコードの可能性もあるのでもしより良い方法あれば指摘して頂けると助かります。

####while ループによる計測

```cpp
#include <iostream>
#include <chrono>
int main()
{
auto t = 0;
auto n = 0;
while ( 100 > n ){
auto time_point = std::chrono::high_resolution_clock::now() ;
//計測する処理を入れる
auto i = 0;
        while ( i < 10000000 ){
        i = ++i ;
        }
//ここまで
auto duration = std::chrono::high_resolution_clock::now() - time_point;

auto count = std::chrono::duration_cast<std::chrono::microseconds>(duration).count();

std::cout << "処理時間:" << std::chrono::duration_cast<std::chrono::microseconds>(duration).count() << "[μs]" << std::endl;
n = ++n;
t = count + t;
}
t = t / 100;
std::cout << "100回処理平均時間:" << t << "[μs]" << std::endl;
return 0;
}
```
####for ループによる計測

```cpp

#include <iostream>
#include <chrono>
int main()
{
auto t = 0;
auto n = 0;
while ( 100 > n ){
auto time_point = std::chrono::high_resolution_clock::now() ;
//計測する処理を入れる
auto i = 0;
        for ( ; i < 10000000 ;){
        i = ++i ;
        }
//ここまで
auto duration = std::chrono::high_resolution_clock::now() - time_point;

auto count = std::chrono::duration_cast<std::chrono::microseconds>(duration).count();

std::cout << "処理時間:" << std::chrono::duration_cast<std::chrono::microseconds>(duration).count() << "[μs]" << std::endl;
n = ++n;
t = count + t;
}
t = t / 100;
std::cout << "100回処理平均時間:" << t << "[μs]" << std::endl;
return 0;
}

```

どちらもインクリメントを10,000,000(1千万）まで行い、それを100回繰り返すコードになってます。その平均値を最後に出力しています。
WineBotterでSSPを起動する with さくら

最高の通知ツールの[伺か](http://usada.sakura.vg/)をMacでも動かしたい！！
という訳で[WineBotter](http://winebottler.kronenberg.org/)を使って伺かを動かします。

# 必要なもの

* Wine Botter - [http://winebottler.kronenberg.org/](http://winebottler.kronenberg.org/)
* SSP - [http://ssp.shillest.net/](http://ssp.shillest.net/)
* 伺か - [http://usada.sakura.vg/](http://usada.sakura.vg/)

伺か自体は開発が止まってしまっているので、代わりにSSPを使用します。
Wine BotterのインストールとSSP、伺かの解凍を済ませてください。

# SSPにさくらさんをインストール

SSPに入っているゴーストはエミリさんなので、伺かからゴーストを引っこ抜きます。<del>（申し訳ないけど合いたいのはさくらさんなんだ）</del>

````
materia583
|-- balloon
|   |-- default
|   |-- default_dot
|   `-- twin\ tail
|-- data
|-- ghost
|   `-- first
|-- headline
`-- language
````

伺かの最新版を解答すると上記のようなディレクトリができるので、balloonの中のtwin tailと、ghostの中のfirstをSSPの同じディレクトリ内にコピーしてください。
これでSSP側の準備は完了です。

# WineBotterでSSPをMacで起動できるようにする

WineBotterを起動したらAdvanceタブを開いて以下の2箇所を変更します。

1. Program to installで解答したSSPのssp.exeを選択
2. This is the actual program, copy it and all files that are in the same folder. を選択

他の設定はお好みで。
設定が完了したらinstallボタンを押して完了です。

# 日本語フォントをWineBotterにインストールする

このまま起動しても日本語が文字化けして豆腐になってしまいます。
先ほど作成したappファイルの中の````Contents/Resources/wineprefix/drive_c/windows/Fonts/````に日本語ファイルをインストールしてください。

と思ったけど、普通にMacにインストールされているヒラギノとか使えるので、特にやらなくても問題ありません。
Macにフォントを入れたくないけど、SSPではMSゴシックで表示したいとかだったらインストールしてください。

# SSPを起動してさくらさんをお迎えする

ここまで作業が完了したら作成したappファイルを起動してください。
恐らく大多数の方は無事にエミリさんに出会えるので、右クリックして表示されるメニューからさくらさんと変わってもらってください。

おめでとうございます！これで楽しい伺かライフを堪能できます！！

# 日本語環境以外のMacを使っている場合

残念ながら無事に出会えなかった方というか、エミリさんが豆腐しか喋ってくれない方はもう一工夫が必要になります。
エミリさんで構わない方は右クリックして表示されるメニューから設定 > 本体設定で日本語フォントを設定すると無事に日本語を喋ってくれるようになります。
ただ、これではさくらさんは謎言語を喋るので、さくらさんに会いたい方はもう一工夫頑張ってください。

Wineは起動時に````LC_ALL````または````LANG````環境変数を見て、起動する言語を設定します。
そのため、起動するときに````export````を使用して強制的に日本語にしてあげる必要があります。

先ほど作成したappファイルの中の````Contents/MacOS/startwine````をエディタで開いてください。
33行目に

````
# exports
export PATH="$WINEUSRPATH/bin":$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"$WINEUSRPATH/lib"
export DYLD_FALLBACK_LIBRARY_PATH="/usr/lib:$WINEUSRPATH/lib"
export FONTCONFIG_FILE="$WINEUSRPATH/etc/fonts/fonts.conf"
export WINEPATH="$WINEUSRPATH/bin"
````

とあるので

````
export LC_ALL=ja_JP.UTF-8
````

を追記します。
これでもう一度、先ほど作成したappファイルを起動してゴーストを切り替えると、さくらさんが日本語を喋ってくれるようになります。
やった！！！

# 堪能する

telnetで9801、9821ポートが開いていることがわかるので、これで思う存分通知を遅れますね。

![うにゅう_and_うにゅう_and_さくら_and_さくら.png](https://qiita-image-store.s3.amazonaws.com/0/5522/6f85483b-b3d7-3de9-a587-f440f9251c31.png)


---

手前味噌ですが、PHPからさくらさんを操作するSSTPライブラリを作ってたりします。
[https://github.com/k-kinzal/SSTP](https://github.com/k-kinzal/SSTP)
[http://blog.kinzal.net/post/68517415973/create-php-sstp-library](http://blog.kinzal.net/post/68517415973/create-php-sstp-library)

Webhookの受け口を作ると伺かが一気に便利になりので、良かったらどうぞ。
Google App Engineで外部モジュールを使う

##Google App Engineで外部モジュールを使う

ふぁぼを爆撃するTwitterBotを作ることになったのですが、私はサーバーをレンタルしていないためGoogle App Engine（以下、GAE）を使ってみることにしました。

* * *

###結論
*「site-packages以下にあるインストール済みのモジュールを今作成しているアプリケーションフォルダにコピー」* 

* * *

###ダラダラ考察
TwitterAPIを利用するためにTwtyhonというモジュールを使いたかったのですが、GAEはデフォルトでTwythonに対応しているわけではありません。

Twythonに限らず、デフォルトで入っているモジュールは少ないので、何かしらのモジュールを自分で追加することになると思います。

 *「使いたいモジュールを今作成しているアプリケーションフォルダに突っ込む」* 
ただそれだけなのですが、ダウンロードしてコピペしただけじゃダメでした。

各モジュールには依存関係があります。例えば、
Twythonはrequestsやrequests_oauthlibといったモジュールを使用します。すると、Twythonのなかにこれらを置いてやる必要が出てきます。
めんどいです。

そこで、site-packages以下にあるものをコピーして置いてやるとできました！インストールした時に何かやってくれてるんですかね？

とりあえず、このトラブルだけで１時間くらいかかりました( ◞‸◟)
HTMLとCSSクラスでよく使う命名について

# HTMLとCSSクラスの命名について

命名で使用する単語に迷います。どうしたらいいですか。

基本単語のみをつかって命名すればいいんだ！！

# ブロックなど親要素で使えそうなclass名
* container : コンテナ
* main : メイン
* global : グローバル
* home : ホーム
* hero : でかいブロック。bootstrapのサンプルにある
* inner : 中味。
* outer : 囲っているもの。親。wrapperと同じ。
* wrapper : 囲っているもの。親。

例えば、facebookのidだとおおまかに
`home > globalContainer > content > mainContainer`

# ブロックや子要素で使えそうなclass名
* article : articleタグがあるのであまり使いたくない。
* block : 囲っているもの。
* card : カード
* cell : セル
* content : 中味。blockと同じかも。
* grid : グリッド
* item : 子要素。使いやすい。
* module : モジュール。ブログのウィジェットや新着コメント領域などへ。

恐らくgridのほうがcellよりでかいです。うろおぼえですがTwitterがそんな感じでした。
`grid > cell`

# ◯◯の一覧系で使えそうなclass名
* articles : 記事の一覧
* comments : コメント一覧
* contents : contentを複数囲むなら
* users : ユーザーの一覧

一覧系の上位は複数系にして、子要素は単数形にするという方法があります。

# 画像要素で使えそうなclass名
* avatar : ユーザーのアイコン画像に。
* image : 画像。あまりつかわないほうがいいかな。
* img : 画像。つかわないほうがいいかな。
* icon : アイコンに使用する。web fontアイコンなど。
* thumb : 写真のサムネイルなど。


# リンクやボタン要素で使えそうなclass名
* btn : ボタン。Bootstrapがこれなので合わせたほうが無難？
* button : SemanticUIのクラスはbtnではなくこちらになっています。どっちがいいのか。

# テキスト要素で使えそうなclass名
* description : 単語が長いのであまり使いたくない。
* summary : 要約を入れるときに使う。
* text : テキストを入れるときに使う。あまり使いたくない。

# レイアウト要素で使えそうなclass名
* layout : レイアウト。hogehogeLayoutみたいな命名にします。

# ヘッダー要素で使えそうなclass名
* header : ヘッダー。ページ内にheaderを含むクラスが複数存在する時代です。

# フッター要素で使えそうなclass名
* footer : ヘッダー。ページ内にfooterを含むクラスが複数存在する時代です。

# フォーム要素で使えそうなclass名
* form form要素関連
* field input要素関連
* radio　radiobox要素関連
* checkbox checkbox要素関連
* submit 送信

## フォームの状態で使えそうなclass名
* success　成功の場合
* error　エラーの場合
* required　必須
* loading　ローディング中

# タイムライン要素で使えそうなclass名
* stream : ストリーム
* timeline : タイムライン

# 時間・日付要素で使えそうなclass名
* time
* timestamp
* created
* date

# ユーザ要素で使えそうなclass名
* profile : プロフィール
* signin : ログイン
* signout : ログアウト
* signup : ユーザー登録
* user : ユーザー

# 管理画面要素で使えそうなclass名
* dashboard : 管理画面系などリンクのmoduleなどが多い場合

# ナビゲーションやメニュー要素で使えそうなclass名
* menu : メニュー。navのほうがmenuよりも大きい印象
* nav : ナビゲーション
* navbar : navと何がちがうのかな？
* tab : タブ

# エレメントレベルで意味を持っているclass名
* heading : 見出し
* headline : 見出し
* link : リンク
* list : リスト、liやiOSのUITableViewみたいもの
* title : タイトル

# 使いたくないclass名
* div : どういう役割なのかわからない
* rightside : レスポンシブな昨今、デスクトップの右サイドバーは、モバイルでも右サイドバーか？という疑問が生じる
* span : どういう役割なのかわからない
 
# 更に迷ったら？
スキーマの単語を使うと便利です。
http://schema.org/Thing

# 感想
ブロックなどの命名要素はたくさんあるので、実際に使いながら絞るといいです。練習していけば慣れるのでしょうか。

# 関連
以下の様なBEMなクラス命名をする際に、当記事を見ながら命名しています
http://qiita.com/pugiemonn/items/964203782e1fcb3d02c3
RubyGemのインストール時間を短縮する


よく忘れるので自分用にメモ

ホームディレクトリに`.gemrc `を作成して以下を記述する。

```
gem: --no-ri --no-rdoc
```

これでgemのインストール時間が短縮される。

以下を参考にさせていただきました。

[参考](http://blog.ruedap.com/2011/05/14/ruby-gem-install-no-ri-no-rdoc-gemrc)
「fluent-plugin-mysql-load」をリリースしました


MySQLにLOAD DATA INFILEを利用してデータを挿入するためのFluentdのプラグイン「fluent-plugin-mysql-load」を公開しました。

※[LOAD DATA INFIEに関してはこちら](http://dev.mysql.com/doc/refman/5.1/ja/load-data.html)

# 公開情報
* RubyGems
https://rubygems.org/gems/fluent-plugin-mysql-load

* GitHub
https://github.com/fukuiretu/fluent-plugin-mysql-load


# 概要
* BufferedOutputプラグインです。フラッシュのタイミングでチャンクの内容をファイルにし、LOAD DATA INFILEでデータを挿入します
* JSONのkey名がcolumn名に紐付きます(任意のカラムのみを対象としたい場合、columnsというパラメータを指定することで制御できます)


# 使い方
使い方に関してはGitHubのREADME（拙い英語ですが。。。）を読めば大体わかるかと思います


# その他
* ~~プロダクションでは試してないですが、手元のローカル環境では問題なく動作しています~~ プロダクションで問題なく動作しています
* 何かご要望等あればpull requestをお願いします
* insertまたはbulk insertを利用したい方は、既にプラグインが公開されておりますので、下記を利用するとよいと思います
 * https://github.com/tagomoris/fluent-plugin-mysql (by @tagomorisさん)
 * https://github.com/toyama0919/fluent-plugin-mysql-bulk (by @toyama0919さん)
* 高まれ、Fluentd力 & Ruby力
【アジャイルソフトウェア　開発の奥義】単一責任の原則

#単一責任の原則

アジャイルソフトウェア　開発の奥義を読んで、単一責任の原則を学んだのでメモします。

##定義
クラスを変更する理由は1つ以上存在してはならない

##理由
クラスを変更する理由が複数ある場合は、役割が複数あると考えられる。
この役割が複数ある場合は1つ目の役割のみを修正した時に、
2つ目の役割に影響する可能性があり、これがバグとなる。
余計なところにも注意する必要があるので、保守性が悪くなる。
MySQLのバックアップスクリプトで Warning: Using a password on the command line interface can be insecure って出るようになった


MySQLの5.6くらいからコマンドラインでパスワードを直書きするとWarningが出るようになった。
こんな感じ

```
$ mysqldump -u root -ppassword -A -x > /tmp/dump.db
Warning: Using a password on the command line interface can be insecure.

```

-pの後に直接パスワード指定したら危険だというWarningかな。
psで見ても

```
mysqldump -u root -px xxxx -A -x
```

みたくxxxになってたのでそれなりに安全だと思ってて気にしなかったのだけど、バックアップスクリプトとしてcronで回してたので定期的にメールがきて困ったから対策。

結論として以下のようにするとOKでした。

```
$ mysqldump --defaults-extra-file=<(printf '[mysqldump]\npassword=%s\n' password) -u root --single-transaction --master-data=2 -A > dump.db
```

というわけで以下のようなスクリプトをcronで回すようにしました。(/bin/shだと多分エラーになるのでbashで。)

```bash:mysqldump.sh
#!/bin/bash
USER=root
PASS=password

mysqldump --defaults-extra-file=<(printf '[mysqldump]\npassword=%s\n' $PASS) -u $USER --single-transaction --master-data=2 -A > /path/to/my_dumpall_`date +%Y%m%d`.db
mysqladmin --defaults-extra-file=<(printf '[mysqladmin]\npassword=%s\n' $PASS) -u $USER flush-hosts

OLDDATE=`date "-d2 days ago" +%Y%m%d`
rmfile=/path/to/my_dumpall_$OLDDATE.db
if [ -e $rmfile ]; then
    sleep 5m
    rm -f $rmfile
fi
```

##はまりポイント

defaults-extra-file のオプションの位置は一番初めでないとエラーになります。
例えば、こんな感じで ユーザーオプションの後ろにもってきちゃうと・・・

```
mysqldump -u $USER --defaults-extra-file=<(printf '[mysqldump]\npassword=%s\n' $PASS) --single-transaction --master-data=2 -A > /path/to/my_dumpall_`date +%Y%m%d`.db
```

こんなエラーになります。

```
mysqldump: unknown variable 'defaults-extra-file=/dev/fd/xx'
```

特にmysqlのエイリアス設定で

```
alias mysql='mysql --skip-secure-auth'
alias mysqldump='mysql --skip-secure-auth'
```

とか設定されてた場合は同様の原因で動かなくて原因も気づきにくいので注意です。

##参考
[MySQLのコマンドラインで-pオプションを使わずにパスワードを指定する方法 - インフラエンジニアway - Powered by HEARTBEATS](http://heartbeats.jp/hbblog/2010/03/mysql-p.html)

[Problem with mysqldump: “--defaults-extra-file” option is not working as expected - Stack Overflow]
(http://stackoverflow.com/questions/3836214/problem-with-mysqldump-defaults-extra-file-option-is-not-working-as-expecte)
oh-my-zshチートシート


<https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet>をかなり適当に日本語訳。
内容がかなり偏ってる気がする。

---

GitHubからcloneした場合、ホームディレクトリで以下を実行することでoh-my-zshがインストールされる。

* `source ~/.oh-my-zsh/templates/zshrc.zsh-template`

# コマンド

* `tab` - カレントディレクトリで新しいターミナルタブを作成 (OSXの場合、システム環境設定で補助デバイスのアクセスを有効化する必要あり)
* `take` - 新しいディレクトリを作成して移動 (必要なら階層的にディレクトリを作成)
* `x`/`extract` - アーカイブを展開 (対応: tar.{bz2,gz,xz,lzma}, bz2, rar, gz, tar, tbz2, tgz, zip, Z, 7z).
* `zsh_stats` - よく使うコマンドTop20とその使用回数のリストを出力
* `uninstall_oh_my_zsh` - oh-my-zshをアンインストール
* `upgrade_oh_my_zsh` - oh-my-zshをアップグレード 

## ディレクトリ操作

* `alias` - 全てのエイリアスを出力
* `..` - `cd ..`
* `cd..` - `cd ..`
* `cd...` - `cd ../..`
* `cd....` - `cd ../../..`
* `cd.....` - `cd ../../../..`
* `cd/` - `cd /`
* `cd +n` - n回前のディレクトリに移動
* `1` - `cd -`
* `2` - `cd +2`
* `3` - `cd +3`
* `4` - `cd +4`
* `5` - `cd +5`
* `6` - `cd +6`
* `7` - `cd +7`
* `8` - `cd +8`
* `9` - `cd +9`
* `md` - `mkdir -p`
* `rd` - `rmdir`
* `d` - `dirs -v` (直近に居たディレクトリの一覧を出力)

# タブ補完

* `ls -(tab)` - オプションと動作の説明
* `cap (tab)`
* `rake (tab)`
* `ssh (tab)`
* `sudo umount (tab)`
* `kill (tab)`
* `unrar (tab)`

# Git

## カレントブランチ名を自動的に挿入

* `git pull origin $(current_branch)`
* `grb publish $(current_branch) origin`

## よく使うGitコマンドへのエイリアス

* `g` - `git`
* `gst` - `git status`
* `gl` - `git pull`
* `gup` - `git pull --rebase`
* `gp` - `git push`
* `gd` - `git diff`
* `gdc` - `git diff --cached`
* `gdv` - `git diff -w "$@" | view`
* `gc` - `git commit -v`
* `gc!` - `git commit -v --amend`
* `gca` - `git commit -v -a`
* `gca!` - `git commit -v -a --amend`
* `gcmsg` - `git commit -m`
* `gco` - `git checkout`
* `gcm` - `git checkout master`
* `gr` - `git remote`
* `grv` - `git remote -v`
* `grmv` - `git remote rename`
* `grrm` - `git remote remove`
* `gsetr` - `git remote set-url`
* `grup` - `git remote update`
* `grbi` - `git rebase -i`
* `grbc` - `git rebase --continue`
* `grba` - `git rebase --abort`
* `gb` - `git branch`
* `gba` - `git branch -a`
* `gcount` - `git shortlog -sn`
* `gcl` - `git config --list`
* `gcp` - `git cherry-pick`
* `glg` - `git log --stat --max-count=10`
* `glgg` - `git log --graph --max-count=10`
* `glgga` - `git log --graph --decorate --all`
* `glo` - `git log --oneline --decorate --color`
* `glog` - `git log --oneline --decorate --color --graph`
* `gss` - `git status -s`
* `ga` - `git add`
* `gm` - `git merge`
* `grh` - `git reset HEAD`
* `grhh` - `git reset HEAD --hard`
* `gclean` - `git reset --hard && git clean -dfx`
* `gwc` - `git whatchanged -p --abbrev-commit --pretty=medium`
* `gsts` - `git stash show --text`
* `gsta` - `git stash`
* `gstp` - `git stash pop`
* `gstd` - `git stash drop`
* `ggpull` - `git pull origin $(current_branch)`
* `ggpur` - `git pull --rebase origin $(current_branch)`
* `ggpush` - `git push origin $(current_branch)`
* `ggpnp` - `git pull origin $(current_branch) && git push origin $(current_branch)`
* `glp` - `_git_log_prettily`

## エディタ

* `stt` - カレントディレクトリをSublime Text 2で開く

## Symfony2

* `sf` - `php app/console`
* `sfcl` - `php app/console cache:clear`
* `sfroute` - `php app/console router:debug`
* `sfgb` - `php app/console generate:bundle`
Windowsでファイルアクセスのログ

ここらへんがよさげ？


・APIフック (Cライブラリ関数やWindowsAPIの書き換え) と、その応用例
http://qiita.com/kobake@github/items/8d3d3637c7af0b270098

・Windows Sever のファイルログを取る方法 (WDK; Windows Driver Kit)
http://tech.exceedone.co.jp/windowsdriverkit/how-to-get-windows-sever-file-log/

・Minispy File System Minifilter Driver
http://code.msdn.microsoft.com/windowshardware/Minispy-File-System-97844844

…Windows7 x64, Windows8.1 x64上で上記を試してみるもうまくいかず（ハードルが多い）
・ファイル操作関係のAPIフックはx64では仕様が変わった
・WDK8.1を使うにはVS2013を入れなきゃいけない

↓

Windowsに限ってよいなら、監査の機能を使えばよい？

・wmicコマンドでイベント・ログを表示する
http://www.atmarkit.co.jp/fwin2k/win2ktips/1014wmicevent/wmicevent.html

・追加コストなし、標準機能だけでファイルサーバーのアクセスログ取る方法
http://yagioyagio.blog103.fc2.com/blog-entry-95.html
【アジャイルソフトウェア　開発の奥義】設計の悪臭

#設計の悪臭

アジャイルソフトウェア　開発の奥義を読んで、設計の悪臭を学んだのでメモします。
下記の7点を気をつけながらコードを書きたい。

##1. 硬さ
1箇所変更すると他の所も変える必要があって、変更する事が難しい事

##2. もろさ
1箇所変更した事で、他の所も影響し、壊れる事

##3. 移植性のなさ
再利用ができにくい事

##4. 扱いにくさ
設計構造を保持したままでは変更が難しい事
コンパイルに長時間かかる事

##5. 不必要な複雑さ
仕様変更があったときに対応しようとして、この変更を加味してコードを書き、複雑にすること
想定した変更ではない可能性が高いので、この処理が不必要になる場合が多々

##6. 不必要な繰り返し
コピペが多々ある
Don't repeat yourself (DRY)が守られていない

##7. 不透明さ
わかりにくいコード
PrologCafe: Java言語でProlog言語のゴール列をパースしてコールするの巻


今回はこれまでの応用です。

これまでに作成した以下のクラスを使って、Javaの`String`で記述されたPrologのゴール列をコールしてみます。

- `PrologContext`: [PrologCafeでProlog実行エンジンをシングルスレッドで動かすの巻](http://qiita.com/61503891/items/ce883118325a4fe73c68)
- `PrologUtil`: [PrologCafeを使ってJava言語でProlog言語で書かれた項の文字列をパースするの巻](http://qiita.com/61503891/items/42899c6aa97c8298a941)

```Example4.java
package maglog;

import maglog.prolog.PrologContext;
import maglog.prolog.PrologUtil;
import jp.ac.kobe_u.cs.prolog.lang.Term;

public class Example4 {

	public static void exec(Term term) throws Exception {
		PrologContext context = new PrologContext();
		context.init();
		context.setPredicate(term);
		while (!context.isStopped())
			context.execute();
	}

	public static void main(String[] args) throws Exception {
		exec(PrologUtil.read("write('hello, world'), nl."));
		exec(PrologUtil.read("assert(neko(tama)), assert(neko(tora)), findall(X, neko(X), L), write(L), nl."));
	}

}
```

```bash:出力
hello, world
[tama,tora]
```

かなりPrologエンジンの取り扱いが楽になってきました。
date_selectの日付フィールドを有効・無効化するサンプルスクリプト

date_selectの年月日フィールドを有効・無効化するサンプルスクリプト

もっと1行で書けるような簡単な方法があるはず！！と思うけど、たどり着けなかったので・・・（そもそもdate_selectのようなダサいものは使われていない。ということ？）

スクリプト作成にあたり、ブラウザのソースからidを取得したけど、それもダサい気が...

```coffeescript
# 指定したidのdate_selectを有効・無効化する.
date_disable=(date_id, disabled) ->
  # 年月日のみ対象.
  for i in [1..3]
    $("##{date_id}_#{i}i").attr('disabled', disabled)   

# checkboxのチェック状態で、date_idのdate_selectを有効無効にする
clicked_date_disable_checkbox=(date_id) ->
  check_box_id = "#options_#{date_id}_is_nil"
    $(check_box_id).click ->
      date_disable "model_#{date_id}", $(@).prop('checked')
 
$ ->
  date_ids = ['distribute_begin_date', 'distribute_end_date']
    clicked_date_disable_checkbox(date_id) for date_id in date_ids
```

```rb
# model/_form.html.slim
.field
  = f.label :distribute_begin_date
  = f.date_select :distribute_begin_date
  = f.label 'distribute_begin_date_is_nil'
  = check_box 'options', 'distribute_begin_date_is_nil', {}, true, false
.field
  = f.label :distribute_end_date
  = f.date_select :distribute_end_date
  = f.label 'distribute_end_date_is_nil'
  = check_box 'options', 'distribute_end_date_is_nil', {}, true, false
```
日本語対応prettyprintメモ(python2.7＆3.5 windows7も )

辞書型の中が日本語でもちゃんと出力してくれる。かなりありがたい。
複雑な構造の辞書型にも対応してる。

例えば以下な感じで使う。

```
dic={} #中身は適当に作る
pp(dic) # 単なる出力
a=pp_str(dic) # 結果を変数に受け取る時

```
下のgithubから入手する。
windowsだとeasy_installで上手く入らなかった。
（エラーはなかったが... 何か作法を忘れたかな？）

prettyprintフォルダの中身２つのファイル
https://github.com/taichino/prettyprint/tree/master/prettyprint
を適当に配置すれば動く。

ubuntuでも動作確認した。
print(pp())とかする筋のよりも楽だと思う。
いろんなppがあって詳しくはないけど...

**python3で使う場合**
print文を括弧に直して、
pp_str()関数の戻り値のeval以下を単純にorigだけにすると機能した。

が、uコードが入ってると今度は文字化けだった＞＜

追記：
> return orig.encode('utf-8').decode('unicode_escape')
> で日本語の表示も通りました！
> 参考：この例だとエンコード・デコードが逆になる。
>http://kwatch.houkagoteatime.net/blog/2013/12/07/python-tips/

しらべたら、python3はすでにpprintモジュールが存在してた。
元のpretyprint.pyにインポートして、元のpp関数をpp_などにして、
下記の記述でとりあえず動作するｗ
>だけど、こいつの返り値のtypeは独自クラスなので
>調べないと中身が取り出せるのかわからない

```
import pprint

def pp(obj):
  pprint.pprint(obj)
```
参考
Pythonで日本語を含んだリストと辞書をpretty printしたい件
http://taichino.com/programming/1599

taichino/prettyprint
https://github.com/taichino/prettyprint
.htaccessを使ってサイトをメンテナンス画面にする


.htaccessとhtmlファイルでサイトをメンテナンスモードにする。
プログラム等でメンテナンスモードが用意されてない時や即席でユーザーのアクセスを遮断したい時に使える。


##htaccessでリダイレクトする

```.htaccess
ErrorDocument 503 /mente.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=/mente.html
  RewriteRule ^.*$ - [R=503,L]
</IfModule>
```

この.htaccessをドキュメントルートに置くと /mente.html以外のアクセスはすべて/mente.htmlにリダイレクトされる。正確にはmente.htmlへのアクセス以外は503エラーとなり、503エラーの内容を/mente.htmlにしている。

特定のIPのみ閲覧可能としたい場合は以下のように。

```.htaccess
ErrorDocument 503 /mente.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=/mente.html
  RewriteCond %{REMOTE_ADDR} !=xxx.xxx.xxx.xxx
  RewriteRule ^.*$ - [R=503,L]
</IfModule>
```

##メンテナンス画面の装飾（data URI scheme）

メンテナンス中である事を告知できればよいので、派手なデザインは必要ないけど、それでも多少の装飾は欲しい所。
でも画像を使いたい場合、上記の.htaccessでmente.html以外のファイルへのアクセスは503リダイレクトされてしまうので、ループになってしまう。
そのためbase64エンコードしてdata URI schemeとしてhtml内に記述してしまう。
「base64 画像　変換」とかでググって、変換サービスを利用してもいいけどシェルから以下のコマンドで画像のbase64化できる。

```
base64 test.png
```

実行するとbase64化された文字列が標準出力される

```
iVBORw0KGgoAAAANSUhEUgAAAHIAAAB4CAYAA...(略)
```

この文字列をmente.htmlのimg src内に記述したらOK

```
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAAB4CAYAA...(略)" />
```

CSSはhtmlファイル内に書けばOK。

##サンプルhtml
普段からメンテナンス用のhtmlファイルを用意してるといいかも。

```html:mente.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>メンテナンス中です</title>
    </head>

<body>
    <div style="width:950px; margin:0 auto; background-color:#FFF; padding:50px 0;">
	    <h1 style="text-align:center; color:#727171;">
            <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAAB4CAYAA...(略)" />
        </h1>
        <p style="text-align:center; font-size:14px; color:#00A0E7;">
            メンテナンス中です
        </p>
        <p style="text-align:center; padding:25px 0;">
            申し訳ございません。只今メンテナンス中です。<br />
            メンテナンスの終了は午前00:00を予定しております。
        </p>
        <address style="font-style:normal; color:#666; font-size:12px; text-align:center;">
        Copyright c hoge Inc. All Rights Reserved.
        </address>
    </div>
</body>
</html>
```
Coffeescript 基礎メモ

主に自分向けのメモ。

やりたいことはrailsの[date_selectの各selectをチェックボックスのON/OFF時に有効無効にしたいだけ](http://qiita.com/hmu29/items/afc239eae611f4eab8c9)だったのに、いつのまにかCoffeeScriptの勉強に変わってた...

# 関数定義

```coffeescript
# 引数有り
function_name=(val1, val2) ->
  something.

# 引数無し
function_name= ->
  something.
```

# n回繰り返し
(もっと楽な方法がある.と思う)

```coffeescript
date_select_disable=(date_id, disabled) ->
  for i in [1..3]
    $("##{date_id}_#{i}i").attr('disabled', disabled)
```

# 繰り返し
繰り返し処理が1行なら次のようにも書ける

```coffeescript
date_ids = ['date1', 'date2']
regist(date_id) for date_id in date_ids
```
  
# 文字列内での変数展開
"(ダブルクォーテーション）中のみ有効

```coffeescript
for i in [1..3]
  $("#date_#{i}i").attr('disabled', disabled)
```

# thisの参照
@マーク
@マークについてはこちらも役だつかも。
[CoffeeScriptの@について再び](http://higelog.brassworks.jp/?p=1238)

```coffeescript
$(checkbox_id).click ->
  $(@).prop('checked')
```
ツナでもわかるmruby [4回目：バイナリデータフォーマットの実装]


##バイナリデータフォマットを実装する

組込み分野はセンサーとPCがやりとりするプロトコルはもちろん、PCとサーバーとの間でやりとりするデータもバイナリフォーマットである事が多いと思うのでドキュメント化されたフォーマットに従って数値からバイナリフォーマットされたデータを作ってみます。今回は内容的に普通のRubyとなんら変わらないですが、多分こういうこと(バイナリフォーマットとかの実装)をやるのは 組込み=mruby では多いだろうという勝手な想像で...

###MQTTプロトコル
ざっくりとしたMQTTの概念については以下を参照。簡単に言うと、機器同士が通信する為のPubSubプロトコルです。3G回線など場合によっては繋がりにくいような回線を想定したプロトコル設計になっています。

[HTTPからMQTTへ - IBMが提唱するモノとモノがつながる時代に最適化したプロトコル&アプライアンス](http://it.impressbm.co.jp/articles/-/10773)

###MQTTプロトコルフォーマット
[MQTT v3.1プロトコル仕様](http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html#msg-format)にMQTTの固定ヘッダのフォーマットが記載されています。MQTT全部やるのはさすがにmrubyの勉強の範囲を超えるので、この固定ヘッダを実装してみます。

>上記プロトコル仕様の日本語版PDFが以下リンク先に有ります。
> http://public.dhe.ibm.com/software/dw/jp/websphere/wmq/mqtt31_spec/mqtt-v3r1_ja.pdf

固定ヘッダのフォーマットは以下のようになっています。

![スクリーンショット 2014-05-04 17.24.08.png](https://qiita-image-store.s3.amazonaws.com/0/13835/e99f4efd-78d5-4a1a-f833-da5d7cc43543.png "スクリーンショット 2014-05-04 17.24.08.png")

あまりプロトコルの詳細に深入りすると延々と続いてしまいますのでここでは固定長ヘッダに話を限定し、以下のようなデータを送信したいとします。

####1バイトめ
1バイトめは各種フラグ等で、1ビット、2ビット、4ビットの設定値からなる8ビットのデータです。

|データ名称     |格納する値|長さ(ビット数)|
:-------------|---------|-----------|
|メッセージタイプ|1        |          4|
|DUPフラグ     |0        |          1|
|QoSレベル     |1        |          2|
|RETAIN       |1        |          1|

4+1+2+1 で 8ビット=1バイト となります。

####2バイトめ
これから送信するデータの固定長ヘッダを除く部分のサイズを格納します。

|データ名称               |格納する値|長さ(ビット数)|
:-----------------------|---------|-----------|
|残りのデータの長さ(バイト数)|20       |          8|

ここでは残りのデータの長さはわからないので適当に20バイトとしました。

####固定長ヘッダをmrubyで作る
じゃあmrubyで作ってみます。

```ruby:mirb
data_1 = 0b00010011  # 0b 0001(メッセージタイプ) 00(DUP) 1(QoS) 1(RETAIN)
data_2 = 20          # 残り部分の長さは20バイトとする
binary = data_1.chr + data_2.chr   #=> "\023\024"
```

<code>chr</code>メソッドを使うと数値からバイナリを生成できるので、<code>chr</code>で生成したバイナリ(Stringクラスのインスタンス)を<code>+</code>で連結しました。
最終的に出来上がった<code>"\023\024"</code>が送信するデータになりますので、これをソケットに<code>write</code>すればサーバー（MQTT的に言うとブローカー）に送信されます。

####メソッド化してみる
実際にはこんな固定値のコードではなくてメッセージタイプやDUPフラグ等を引数で受け取ってその都度生成するはずなので以下のようになると思われます。
>一応各値にはデフォルト値を設定します。

```ruby:mirb
def fixed_header(message_type = 1, dup = 0, qos = 0, 
                   retain = 0, remaining_size = 0)
  data_1 = (message_type << 4) | (dup << 3) | (qos << 1) | retain
  data_2 = remaining_size
  data_1.chr + data_2.chr
end

fixed_header(1, 0, 1, 1, 20) #=> "\023\024"
```

あ、というかmrubyでラベル付きの引数つかえるんだっけ

```ruby:mirb
def fixed_header(params)
  message_type   = params[:message_type] || 1
  dup            = params[:dup] || 0
  qos            = params[:qos] || 0
  retain         = params[:retain] || 0
  remaining_size = params[:remaining_size] || 0

  data_1 = (message_type << 4) | (dup << 3) | (qos << 1) | retain
  data_2 = remaining_size
  data_1.chr + data_2.chr
end

fixed_header(message_type:1, dup:0, qos:1, retain:1, remaining_size:20) #=> "\023\024"
```

おー。こっちのほうが解り易いですね。引数で受け取った値のチェックとかは必要ですけど大体こんな感じになるかなと。

とりあえず固定ヘッダだけですが<code><< >> (ビットシフト)</code>と<code>| (or)</code>、そして<code>chr</code>と<code>+</code>を使ってバイナリフォーマットの実装できました。