OmniAICreator/Qiita-1.07M huggingface dataset:
【ev3dev】LCD(画面)制御の仕組みを理解しよう

## はじめに

この記事は、EV3にev3devをインストールし、SSH接続できている状態であることを前提にしています。環境構築ができていない方はこちらの記事を参考にしてください。
>
[mindstorm-EV3をLinuxで制御しよう! ev3dev OSのインストールとSSH接続](http://qiita.com/murotani/items/46f905bec33b1673c41a)


## 概要

ev3devではEV3のLCDをどのように制御できるのか、サンプルコードを図を用いて解説します。
python製ライブラリの[ev3dev-lang-python](https://github.com/rhempel/ev3dev-lang-python)にはLCDを簡単に制御できるAPIが提供されていますが、今回はそれらのライブラリを使わずにLCD制御の仕組みを理解することが目的です


## LCDの仕組み
EV3のLCDは178 x 128ピクセルのモノクロ画面になっています。
ビデオドライバーはLinuxのframebufferインターフェースによって提供されていて、デバイスファイル/dev/fb0にデータを書き込むことでLCDを制御できます。
framebufferの情報を```fbset -i```コマンドを実行して確かめてみましょう。

```
robot@ev3dev:~$ fbset -i

mode "178x128"
    geometry 178 128 178 128 1
    timings 0 0 0 0 0 0 0
    rgba 1/0,1/0,1/0,0/0
endmode

Frame buffer device information:
    Name        : ST7586
    Address     : 0xc39f9000
    Size        : 3072
    Type        : PACKED PIXELS
    Visual      : MONO01
    XPanStep    : 0
    YPanStep    : 0
    YWrapStep   : 0
    LineLength  : 24
    Accelerator : No
```

LCDが178 x 128ピクセルで構成されること、水平方向一列のピクセル情報が24byteで表させることが分かります。
(下図)

![スクリーンショット 2017-02-18 17.20.36.png](https://qiita-image-store.s3.amazonaws.com/0/149019/7fc65d3b-49f9-dcc0-f713-621a6116579f.png)

LCDはモノクロ（カラーではない）なので、それぞれの最小ピクセルは0か1のバイナリーデータとなります。
1byte=8bitなので、178pxを表現するには178/8=22.25(byte)あれば足ります。しかし実際には、水平方向一列のピクセル情報は24byteで表現されます。つまり24byteのデータ全てが画面上に表示されるわけではないということです。

## サンプルコード
LCDを制御するには24byte x 128(rows) = 3072byteのデータをデバイスファイルに書き込む必要があります。
以下の図形を表示させるサンプルコードは以下のようになります。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/149019/e5acdeae-6a05-e160-35ec-41c542e0e7e9.png)

```py
#!/usr/bin/env python

# Hard coding these values is not a good idea because the values could
# change. But, since this is an example, we want to keep it short.
SCREEN_WIDTH = 178 # pixels
SCREEN_HEIGHT = 128 # pixels
LINE_LENGTH = 24 # bytes
SIZE = 3072 # bytes

import os
import array


def main():
    # 要素数3072の配列を定義
    buf = [0] * SIZE

    # 100カラム目に縦線を引く
    for row in range(0, SCREEN_HEIGHT):
        buf[row * LINE_LENGTH + int(100 / 8)] = 1 << (100 % 8)

    # 64列目に水平線を引く
    for col in range(0, LINE_LENGTH):
        buf[64 * LINE_LENGTH + col] = 0xff


    import math
    # 中心点 (40,40), 半径 20の円を描く
    for x in range(0, 20):
        y = math.sqrt(20 * 20 - x * x)
        buf[(40 + int(y)) * LINE_LENGTH + int((40 + x) / 8)] = 1 << ((40 + x) % 8)
        buf[(40 - int(y)) * LINE_LENGTH + int((40 + x) / 8)] = 1 << ((40 + x) % 8)
        buf[(40 + int(y)) * LINE_LENGTH + int((40 - x) / 8)] = 1 << ((40 - x) % 8)
        buf[(40 - int(y)) * LINE_LENGTH + int((40 - x) / 8)] = 1 << ((40 - x) % 8)

    # デバイスファイルへの書き込み
    f = os.open('/dev/fb0', os.O_RDWR)
    s = array.array('B', buf).tostring()
    os.write(f, s)
    os.close(f)

if __name__ == '__main__':
    main()
```
 
コードを保存させ実行するとLCD画面に図形が表示されます。
ライブラリに定義されていないような複雑なLCD制御をしたい場合、参考になると思います。

## 参考
>
[Using the EV3 LCD ](http://www.ev3dev.org/docs/tutorials/using-ev3-lcd/)

> 
画面キャプチャ
[【ev3dev】pythonを使ってLCD(画面)をキャプチャーするプログラムを作る](http://qiita.com/murotani/items/8f301c57d3e5741ea8f7)
ファイルサイズのログスクリプト

# ファイルサイズのログスクリプト
```ruby
require 'shellwords'

class DirectorySizeLog
  def initialize(directory_path)
    @directory_path = directory_path
  end
  def label
    @directory_path
  end
  def calculate_value
    `du -sb #{Shellwords.escape(@directory_path)} | awk '{print $1}'`.strip
  end
end

logs = [
  DirectorySizeLog.new('/data/app'),
  DirectorySizeLog.new('/data/backup'),
  DirectorySizeLog.new('/data/postgresql'),
  DirectorySizeLog.new('/data/redis'),
]

line = logs.map { |log|
  [log.label, log.calculate_value]
}.flatten
  
puts [Time.now, line].flatten.join(',')
```

### crontab
```bash
* * * * * /usr/bin/ruby /root/bin/disk.rb 1>>/var/log/disk_log.csv 2>/dev/null
```
C#メモ　JSON読み書き

# <i class="fa fa-file-text-o" style="font-size:1em;"></i> コード

```CSharp
// "System" と "System.Collections.Generic" をusing
// "System.Web.Extensions" を参照設定
var js = new System.Web.Script.Serialization.JavaScriptSerializer();

// シリアライズ
var p = new Person();
p.Age = 80;
p.Name = "太郎";
string jsonString1 = js.Serialize(p);
Console.WriteLine($"シリアライズ結果1:{jsonString1}");

// デシリアライズ
Person p2 = js.Deserialize<Person>(jsonString1);

// シリアライズ（複数）
var persons = new List<Person>();
persons.Add(new Person { Name = "次郎", Age = 75 });
persons.Add(new Person { Name = "三郎", Age = 60 });
string jsonString2 = js.Serialize(persons);
Console.WriteLine($"シリアライズ結果2:{jsonString2}");

// デシリアライズ（複数）
List<Person> persons2 = js.Deserialize<List<Person>>(jsonString2);
```

```CSharp
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
```

# <i class="fa fa-terminal" style="font-size:1em;"></i> 実行結果

```Text
シリアライズ結果1:{"Name":"太郎","Age":80}
シリアライズ結果2:[{"Name":"次郎","Age":75},{"Name":"三郎","Age":60}]
```

# <i class="fa fa-book" style="font-size:1em;"></i> 参考サイト
* [JavaScriptSerializer クラス - MSDN](https://msdn.microsoft.com/ja-jp/library/system.web.script.serialization.javascriptserializer.aspx)
git diff で、リリース間のコード差分量だけを確認する

`git diff --shortstat` を使用すると、コードの具体的な差分を表示せず、

1. 変更があったファイルの総数
1. 追加された行数
1. 削除された行数

のみを表示することができます。
(出力例: `1 file changed, 1 insertion(+), 1 deletion(-)`)

例えば prev_release としてタグ付けされたバージョンから、今までの差分を確認する場合は、以下のようにできます。

```
git diff --shortstat prev_release
```
[iOS][Swift]Swiftのmap, filter, reduceって超便利

iOSエンジニアに転職して１月半。
Swiftにもmap,reduce,filterがあることを知った。まぁモダンな言語なら当然だよね。

```swift
import UIKit

let arr: [Int] = [1,2,3,4,5,6,7,8,9,10]

// mapで文字列に変換
let strArr: [String] = arr.map{String($0)}
print(strArr)

// filterで奇数を抽出
let odds: [Int] = arr.filter{$0 % 2 != 0}
print(odds)

// reduceで全て足し合わせる！
let total: Int = arr.reduce(0) {$0 + $1}
print(total)

// map,filter,reduceをつなげる
let result: Int = arr.map{$0 * $0}.filter{$0 % 2 != 0}.reduce(0) {$0 + $1}
print(result)

// flatMapでStringの数字をInt型に変換する
let nums: [String] = ["1","2","three","4","5","six","7","8"]
let numsAsInt: [Int] = nums.flatMap{Int($0)} //変換できないものは弾かれる
print(numsAsInt)
```

Swiftのmap,reduce,filterってもっと書きにくいイメージがあったけど、
それは多分、Trailing Closures（$0とか）を使う書き方を知らんかったからかな。
これからバンバン使っていこうと思う。
２つの配列を比較して、重複している値を取り出す(回答)


It is answer1

```:ruby
arr1 = [2, 4, 5, 6, 7]
arr2 = [7, 8, 9, 7, 4, 3, 2]

def extract_value(arr1, arr2)
  arr3 = arr1.uniq + arr2.uniq
  arr4 = arr3.inject(Hash.new(0)){| init, v | init[v]+=1; init;}
  answer = arr4.map{|k, v|  k if v >= 2}.compact
end

extract_value(arr1, arr2)
```


It is answer2

```:ruby
arr1 = [2, 4, 5, 6, 7]
arr2 = [7, 8, 9, 7, 4, 3, 2]

require 'set'
def extract_value(arr1, arr2)
  set_val, set_val2 = Set.new, Set.new
  arr1.map{|v| set_val << v}
  arr2.each {|v| set_val2 << v if set_val.include?(v) }
  set_val2.to_a
end

extract_value(arr1, arr2)
```

It is answer3

```:ruby
arr1 & arr2
```

###Which is a better algorithm?

Let me check

```:ruby
arr1, arr2 = [], []
1.upto(100000000).each {|v| arr1 << rand(1..500)}
1.upto(100000000).each {|v| arr2 << rand(1..1000)}
```
embed time

```:ruby
def extract_value1(arr1, arr2)
  puts Time.now
  arr3 = arr1.uniq + arr2.uniq
  arr4 = arr3.inject(Hash.new(0)){| init, v | init[v]+=1; init;}
  answer = arr4.map{|k, v|  k if v >= 2}.compact
  puts Time.now
  answer
end
```

It takes 8 seconds

```:text
2017-02-18 15:55:40 +0900
2017-02-18 15:55:48 +0900
```

embed time

```:ruby
require 'set'
def extract_value2(arr1, arr2)
  puts Time.now
  set_val, set_val2 = Set.new, Set.new
  arr1.map{|v| set_val << v}
  arr2.each {|v| set_val2 << v if set_val.include?(v) }
  puts Time.now
  set_val2.to_a
end
```

It takes 44 seconds

```:text
2017-02-18 15:54:49 +0900
2017-02-18 15:55:33 +0900
```

It looks that first algorithm is better.
I think it is because of uniq function.

###I will change value of arr and function also

```:ruby
arr1, arr2 = [], []
1.upto(100000000).each {|v| arr1 << rand(1..5000000)}
1.upto(100000000).each {|v| arr2 << rand(1..10000000)}
```

I will use uniq function in second one and name extract_value3

```:ruby
require 'set'
def extract_value3(arr1, arr2)
  puts Time.now
  set_val, set_val2 = Set.new, Set.new
  arr1 = arr1.uniq
  arr2 = arr2.uniq
  arr1.map{|v| set_val << v}
  arr2.each {|v| set_val2 << v if set_val.include?(v) }
  puts Time.now
  set_val2.to_a
end
```

This is the result of extract_value1

```
2017-02-18 16:26:37 +0900
2017-02-18 16:29:22 +0900
```

This is the result of extract_value2

```
2017-02-18 16:45:04 +0900
2017-02-18 16:48:12 +0900
```


This is the result of extract_value3

```
2017-02-18 16:39:18 +0900
2017-02-18 16:41:20 +0900
```

###Conclusion

3 is a best algorithm.
Capistranoで自動デプロイするとアセットがコンパイルされない(仮解決)

 
##自動デプロイ後にレイアウトが崩れる

### 環境
1. AWSの`EC2`でRailsファイルを動かす。
2. `nginx` + `unicorn`を使用している。
3. 手動でデプロイしていたが、`capistrano`を用いて自動でデプロイを試みる。 

### capコマンドでデプロイ

以下のコマンドをローカルマシンで実行し自動デプロイする。
デプロイは完了するが本番用URLにアクセスするとレイアウトが崩れている。

```
bundle exec cap production deploy
```


## レイアウトが崩れる原因

`config/assets/~` が`404`となっているためレイアウトが崩れてしまう。

### なぜ404なのか？
以下の`config/enviroments/production.rb`に書かれている条件式がfalseになっているため。

```config/enviroments/production.rb
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
```

### そもそも上記の設定は何か？

>静的ファイルを /public ディレクトリから読むかどうか、

これが`false`になると。ファイルは存在しても`public`以下からコンパイルされたassetsファイルを読み込んでくれない。ただしWEBサーバー（nginx,apache）はこの設定に関係なくassetsファイルをpublicから読み込める。

### unicornがassetsファイルを読み込んでいない
レシーバーである環境変数の値が空のため、presentメソッドの実行結果が`false`になり、アプリケーションサーバー(ここではunicorn)が上記の設定を処理してくれていない。

つまりこういう事。

```config/enviroments/production.rb
config.public_file_server.enabled = false
```

***nginxがassets以下をプロキシしても、unicornの方で処理できていない***

##手動デプロイ時はassetsがコンパイルされ読み込まれていた

### なぜ読み込みが成功していたのか
unicornを起動する際に、環境変数に値を代入していたため。

```
RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production
```



## なぜCapistrano導入後に読み込みが失敗したのか

`capistrano`で自動デプロイを実行する際に変数を設定していないため。

capistranoでunicornをリスタートさせる際は明示的に`RAILS_SERVE_STATIC_FILES=1`という設定をしていない。
そのため環境変数に値が入ってなければunicornは読み込み処理をしない。

```capistranoのリスタート処理
old_pid = "#{server.config[:pid]}.oldbin"
if File.exist?(old_pid) && server.pid != old_pid
  begin
    sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
    Process.kill(sig, File.read(old_pid).to_i)
  rescue Errno::ENOENT, Errno::ESRCH => e
    logger.error e
  end
end
```

### unicornでassetsを処理させるべきか？

そもそもunicornにassetsファイルの読み込み処理をさせるとunicornの負担が増すため宜しくない（らしい）。
なので以下の設定は最初からfalseに設定してしまうと良いらしい。


```config/enviroments/production.rb
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
```


そしてnginxをリバースプロキシにして、静的なコンテンツは直接nginxから取りにいかせる。
テンプレートなど動的な部分はunicornに問い合わせるという流れが良いらしい。

## 一旦trueにして解決
とは言え今回はちょっとリバースプロキシ的な設定ができているか分からない。
とりあえず以下のようなサイトを参考にして設定ファイルを更新してみたが記述後の検証はまだしていない。

### 応急処置で対応
```config/enviroments/production.rb
config.public_file_server.enabled = true
```

取り急ぎ非推奨のようだが上記のように値をtrueにして仮解決。

そもそもunicornに処理させるのが間違いなのであれば、
環境変数に値を渡して空かどうか確認して、Trueであれば読み込み...という過程すらも間違いな訳で...。

`production.rb`だし他の環境に影響する訳でもなさそうなので一旦ture直書きで。

### また続きを書きます。


##お世話になったサイト

[Rails(Apache+Unicorn)で、public以下のディレクトリの中身が404になる場合の解決策](http://qiita.com/y_minowa/items/5954907bb30c2ecb43f5)
[AWSで、unicorn + nginx + sinatra を動かしてみる](http://qiita.com/konpyu/items/3ba3774bcde226d7d07d)
[NginxとUnicornの連携設定](http://yuuxxxx.hatenablog.com/entry/2014/01/15/213245)
Swiftエンジニアが学ぶ高階関数「カリー化関数」

# はじめに

純粋関数型プログラミング言語である`Haskell`を参考に、以下の3つの構成で高階関数についてまとめていく予定です。

- カリー化関数
- <a href="http://qiita.com/shoheiyokoyama/items/04416501389c69544c5a">高階関数の実践</a>
- ラムダ式

本投稿はカリー化関数の概念についてまとめていきます。(別記事は随時更新予定)

# 高階関数

`Haskell`の関数は、引数として関数を取ったり返り値として関数を返したりすることが可能で、このような関数は***高階関数***と呼ばれます。


## カリー化関数

`Haskell`のすべての関数は、複数の引数を取る関数が定義されているように見えますが、***公式には引数は一つだけ取る***ようになっています。
これは関数がカリー化されることによって、複数の引数を取るような関数が定義できているということです。

まずは例を見るのがわかりやすいと思うので、max関数を用いて説明したいと思います。

```sh
Prelude> max 4 5
5
Prelude> (max 4) 5
5
```

###### ※`Prelude>`: Haskellの対話モード

`max`は二つの関数を引数にとって、大きい方の数を返す関数に見えます。上記の例では、`4`と`5`を引数に取り、大きい数字である`5`を返しています。
これは正確には二つの引数を取って結果を返しているのではなく、以下の挙動になっています

1. `max`が最初に`4`を適用し、別の関数を返り値として返す
2. 次に返り値である関数が`5`を適用し、最終的な数値である`5`を返す

これが上記の例の`max 4 5`と`(max 4) 5`が等価である理由です。

このように、カリー化関数とは、常に一つの引数を受け取り、次の引数を受け取るための関数を返す関数のことになります。
次は、自作関数を用いて説明します。

```hs
multTree :: Int -> Int -> Int -> Int
multTree x y z = x * y * z
```

これは、3つの引数を受け取り、3つの数を掛けた数を返します。
正確に言うと、3つの引数を受け取り、3つの数を掛けた数を返すように見える関数です。
この関数を実行してみます

```sh
Prelude> multTree 3 5 9
135
```

挙動は以下のようになります。

1. 最初に`multTree`が`3`を適応し、`Int -> Int -> Int`型の関数を返す
2. 次に`Int -> Int -> Int`型の関数が5を適応し、3と5を掛けた数を返す関数`Int -> Int`を返す
3. 最後に`9`を受け取り、`3`と`5`と`9`を掛けた`139`を返す

```sh
Prelude> let multTwo = multTree 9
Prelude> :t multTwo
multiTwo :: Int -> Int -> Int
Prelude> let muitOne = multTwo 3
Prelude> :t muitOne
muitOne :: Int -> Int
```

###### ※`:t`: 型を調べるコマンド

## `Swift`から見るカリー化関数

`Swift`は様々なプログラミングパラダイムを備えており、関数型プログラミングのアプローチが可能となっています。
`Swift`からカリー化関数を見ていきます。

まずは、二つの引数の積を返す関数を定義したいと思います。
通常なら以下の定義をすることが多いと思います。

```swift
func multiple(_ x: Int, _ y: Int) -> Int {
    return x * y
}
multiple(3, 5)//15
```

この関数をカリー化した関数が以下になります。

```swift
func multiple(_ x: Int) -> (Int) -> Int {
    return { y in x * y }
}

multiple(3)(5)//15
```

一つの引数を取る関数の連続になっています。
カリー化してない場合と比較すると、一度に1つの引数に関数を適用するか、2つに適用するかを選択できますね。引数を一つにした場合は以下のように使い回すことができます。

```swift
let multClosure = multiple(3)

multClosure(5)//15
multClosure(4)//12
```

同様に`Haskell`においても、異なる関数を簡単に扱うことができます。

```sh
Prelude> multTwo 3 2
162
Prelude> muitOne 5
135
```

このようにカリー化された関数は抽象度が高く、異なる機能を持つ関数を簡単に作り出せます。
これがカリー化することのメリットと言えますね。

カリー化関数をこのように部分適応することで、関数を簡単に合成することができるので複雑なコードを、関数を使って再構築可能な小さなパーツに分解することができます。
今回は簡単な数式で紹介したので、実践的なイメージがしにくいと思いますが、次回はより実践的な例を用いて高階関数の理解を深めていきたいと思います。



# 参考文献

- <a href="https://www.amazon.co.jp/Functional-Swift-Updated-3/dp/3000480056" target="_blank">Functional Swift: Updated for Swift 3</a>
- <a href="https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854" target="_blank">すごいHaskellたのしく学ぼう!</a>
Scala+PlayFramework 環境選定(Scala,Playのバージョン設定、開発環境やエディタの整備)

(おことわり)
この記事は、弊社のOrganization を利用して、社内サービス開発にScala+PlayFrameworkを導入するにあたっての作業内容や試行錯誤を記録した連続投稿になります。
基本的には内容が正しく、かつ読み手に有益な情報になるように配慮しておりますが、どちらかと言えば 社内での情報共有 を主目的としているため、

- まとまりのない情報の羅列
- 正確に検証されていない情報
などを記載することもあります。予めご了承ください。

# これまでのあらすじ

- [第1回] [社内開発にScala+PlayFrameworkを導入したい](http://qiita.com/zaramme/items/e4f1b6b873a9978d46b0)
- [第2回]←いまここ

今回は、環境構築に当たっての事前情報の選定を行いました。
まだ**実際に環境構築を実施していないため、*内容に不備がある可能性もある事** をあらかじめご了承ください！

# 【1】Play Frameworkのバージョン選定

下手に最新バージョンを選ぶと怖い・・・というRailsの例があるので、現行の最新である2.5.x系でで本当に良いのかチェック。

## 参考にした記事

[【JavaでPlayFramwork2.4.6】プロジェクト作成　前編 | 株式会社ジェニシス
技術開発事業部blog](http://genesis-tdsg.blogspot.jp/2016/05/javaplayframwork246_30.html)

[playframework2.5の変更点の雑な要約と感想](http://d.hatena.ne.jp/xuwei/20160305/1457174406)

## 結論：2.5.x系の最新版を使う
  - そもそも公式サイトの仕組み上、過去バージョンを使用するのが困難な仕組みになっている
  - 2.4->2.5はそこまでドラスティックな変更ではないっぽい
  - と言いつつ、結構変更は出ているので、2.4の技術記事を読むときには注意する。[差分](https://playframework.com/documentation/2.5.x/Migration25)を熟読＆ブックマーク。

### [トピック]Dependency Injectionn(DI, 依存性の注入)

あんまり知らなかったのでちゃんと調べておく。

- 主にテストコードの書きやすさを意識した実装のデザインパターンの事。
- ScalaがDI推進の流れにあるらしく、Playの内部実装がDIパターンで書き直される*braking-change*なリリースが頻発しているらしい。

# 【2】Scalaのバージョン選定

## 結論：結論：2.11を使用

- [Play 2.5 Migration Guide](https://playframework.com/documentation/2.5.x/Migration25)

> Play 2.3 and 2.4 supported both Scala 2.10 and 2.11. Play 2.5 has dropped support for Scala 2.10 and now only supports Scala 2.11. There are a couple of reasons for this:

とあるように、2.11に正式対応しているため。2.12は[2016年11月リリース](http://scala-lang.org/news/2.12.0)なので時期尚早と判断。

# 【3】開発環境・デモ環境構築
- デモ環境・・・他の人に動作を見てもらうための環境の意です

- **結論として、AWS EC2でdev環境を作成して、個人開発とデモ用を兼ねることに。**
  - まだ1人開発なので、下手に開発用とデモ用を分けていちいちデプロイするよりもこっちの方がスピーディ
  - 最初は多少環境構築がdirtyになっても気にせず突っ走る。ある程度慣れてきた時点で、ちゃんとサーバー構築手順を考えてステージングとか正式な環境を作る。
  - vagrantでのローカル環境も最終的には必要だと思うが、最初からvagrantを使うと、amazon linuxとCentOSの違いを吸収するために、最終的にサーバー構築手順を二つ作ることになり、かなり面倒なので、AWS環境が安定するまでは見送り。
     - 本当はぼちぼちDockerに移行したいけど、さすがにいっぺんにあれこれ導入するのは厳しい :sweat_drops: 
  - ビルドを行う場所とか、実際のデプロイ手順についてはおいおい考えていきます（実はあんまりJava系のビルド運用に詳しくありません・・・。Play自体はコンパイル不要を謳っていたはずので、そこまでネックにならないと信じていますが、使ってみないとなんとも言えません）

# 【4】エディタ

- **Atomを使用する。**
  - いろいろな人やサイトに、IntelliJ IDEAをお勧めされるけど、他言語の開発と並行する可能性が高いのと、そもそも個人的にIDEっぽい機能をあまり使わないので。
    - 同じ静的型付けのGoとかもAtomでやってましたが、ゆるーい補完機能でなんとかなってしまいました
  - ちなみに[remote-sync](https://atom.io/packages/remote-sync)をつかって、SSH接続したサーバーと直接ソースコードを同期して、ビルドはサーバー上で行います。この辺りは他のプロジェクトでも実績があるので問題ないはず。
- Scalaのためのプラグインとかはあんまり考えない
  - 必要だったら入れていくイメージで、プラグイン選定に時間はかけない

もし詳しい人がいたらアドバイスいただけますと幸いです・・・。
次回はいよいよ環境構築の実務へ・・・。

次回→ [amazon EC2(amazon linux)でScala+Play framework の初期画面表示まで](http://qiita.com/zaramme/items/af3c92075f1259410c25)
UUID

###uniqid

- 「uniqid」は、13桁のIDが生成。
- 100万分の1の単位で、同じIDが生成されてしまう可能性がある。

```php

<?php
echo uniqid() .'<br>';
```
```
57973297df893
57973297df962
```

- リロードするたびに上記のように生成される
- 13文字

####uniqidで第2引数にtrueを指定

```php

<?php
echo uniqid('',true) .'<br>';
```
```
57973a133a4078.27426087
```

- 第2引数にtrueを指定するとより推測の難しいユニークな文字列を生成する
- 23文字

###md5()

- md5ハッシュ値を計算

```php

$text = 'abcde12345';
$text2 = 'abcde12345';

echo '<p>'. md5($text).'</p>';
echo '<p>'. md5($text2).'</p>';
```
df6f58808ebfd3e609c234cf2283a989
df6f58808ebfd3e609c234cf2283a989

- リロードしても同じ値が生成される


#md5ハッシュとuniqidとを組み合わせる(32桁のユニークIDを生成)

```php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>ユニークなIDを作成したい</title>
</head>
<body>
<div>
<?php
echo md5(uniqid(mt_rand(), true)) .'<br>';
?>
</div>
</body>
</html>
```

- 32桁

3c9aa5b706cfc18e231d9f455cdf6e27
1954a51a41a54a2845dceecf6ded1f88


#UUID as id with laravel

https://laracasts.com/discuss/channels/general-discussion/guid-uuid-as-id-with-laravel
[OpenCV] 顔写真で個人識別

## 基本方針

- Haar like特徴量(haarcascade_frontalface_default)で顔認識
- リサイズ + グレースケース化して次元削減
- LBPHで個人の顔を学習

~~~python
#!/usr/bin/python
# -*- coding: utf-8 -*-

import cv2, os
import numpy as np
from PIL import Image

# 学習画像
train_path = './training_data'
# テスト画像
test_path = './test_data'

# Haar-like特徴分類器
cascadePath = "./haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)

# LBPH
recognizer = cv2.createLBPHFaceRecognizer()

def get_images_and_labels(path):
    # 画像を格納する配列
    images = []
    # ラベルを格納する配列
    labels = []
    # ファイル名を格納する配列
    files = []
    for f in os.listdir(path):
        # 画像のパス
        image_path = os.path.join(path, f)
        # グレースケールで画像を読み込む
        image_pil = Image.open(image_path).convert('L')
        # NumPyの配列に格納
        image = np.array(image_pil, 'uint8')
        # Haar-like特徴分類器で顔を検知 (パラメータは適当)
        faces = faceCascade.detectMultiScale(image,1.1,9,0)

        # 検出した顔画像の処理
        for (x, y, w, h) in faces:
            # 顔を 200x200 サイズにリサイズ
            roi = cv2.resize(image[y: y + h, x: x + w], (200, 200), interpolation=cv2.INTER_LINEAR)
            # 画像を配列に格納
            images.append(roi)
            # ファイル名からラベルを取得 "0_xxxxx.jpg みたいなファイル名を想定している"
            labels.append(int(f[0]))
            # ファイル名を配列に格納
            files.append(f)

    return images, labels, files

# トレーニング画像を取得
images, labels, files = get_images_and_labels(train_path)
# トレーニング実施
recognizer.train(images, np.array(labels))
# テスト画像を取得
test_images, test_labels, test_files = get_images_and_labels(test_path)

i = 0
while i < len(test_labels):
    # テスト画像に対して予測実施
    label, confidence = recognizer.predict(test_images[i])
    # 予測結果をコンソール出力
    print("Test Image: {}, Predicted Label: {}, Confidence: {}".format(test_files[i], label, confidence))
    # テスト画像を表示
    cv2.imshow("test image", test_images[i])
    cv2.waitKey(1000)

    i += 1


cv2.destroyAllWindows()
~~~
Vimで複数のファイルのインデントを非対話に修正する

# Vimと非対話
Vimは対話型のテキストエディタですが、非対話による操作が可能です。この記事では、複数のファイルをインデント整形する例を紹介します。

# まとめ
以下のコマンドで、カレントディレクトリにある`*.cpp`ファイルをVimの自動インデントを使って整形できます。長いコマンドですので、便利コマンドとしてシェルスクリプトに登録しておくのがいいでしょう。

`xargs -o`を利用している理由は[コマンドから出力したファイル名をvimで開く方法](http://qiita.com/deton/items/a26be28f4d10774194d4)を参照してください。

```autoindent.sh
find . -name '*.cpp' | xargs -o vim -N -i NONE -u NONE -c 'normal! gg=G' -c 'wq!'
```
## 別解
@h_east さんからWindowsでも動作するコマンドを教えていただきました。以下のコマンドでは、あらかじめ`*.cpp`に該当するファイルをVimに読み込んでいます。読み込み済みバッファの全てに対して、`norm gg=G`を適用し、インデントを修正します。
```
vim -Nu NONE -i NONE *.cpp +"argdo exec 'norm gg=G' | up" +q
```

# 解説
簡単な解説を載せます。より詳しく知りたい人は、`vim -h`や[help - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/)、以下の参考リンクを見ると良いでしょう。

## Vimの起動オプション
`-N`でVi非互換にし、`-i NONE`で[viminfo](http://vim-jp.org/vimdoc-ja/usr_21.html#21.3)を汚さないようにします。また、`-u NONE`を利用することで`.vimrc`を読み込みません。素のVimで操作が処理されます。

## Vim上で使えるコマンドを実行する(`vim -c`)
`vim -c`によって、vimのコマンドが実行できます。`normal! <command>`でノーマルモードで続く`<command>`を受け付けます。

`gg`はカーソルをバッファの先頭に移動します。

`=G`は`=`がインデント調整、`G`がモーションです。`=G`によって、カーソル位置から、バッファの末尾までインデントが行われます。

最後に`wq!`を実行し、保存してVimを終了します。

# 参考資料
* [Hack #140: Vimでバッチ処理を行なう](http://vim-jp.org/vim-users-jp/2010/04/18/Hack-140.html)
* [コマンドから出力したファイル名をvimで開く方法](http://qiita.com/deton/items/a26be28f4d10774194d4)
iRuby Notebookでグラフをインラインで描画する方法の調査（gnuplot編）

# はじめに

Jupyter Notebookはインタラクティブにスクリプトの開発ができる素晴らしい開発環境なのですが、iRubyとして動作させると少し機能に見劣りするところが無きにしも非ず。

とりわけ、グラフを描画する部分について、幾つかライブラリがあるもののエクスポートを行う場合には、受け取り側でも同じライブラリがないと閲覧することができないという状況で、少し不便。

[参考ライブラリ]
https://github.com/domitry/nyaplot
https://github.com/rdp/ruby_gnuplot

ということで、Pythonでmatplotlibを使った時のようにNotebookに保存できるグラフ環境が準備できないか調査してみましたので、その結果をまとめます。

ちなみに、昨日はchunky_png編を公開しています。
http://qiita.com/mix_dvd/items/2248798e914e997b650c

# gnuplot

X11を使ったオープンソースソフトウェアにgnuplotがありますので、それを試してみます。

Macでgnuplotをインストールするには、XQuartzをインストールする必要がありますので、以下のURLからダウンロードします。
https://www.xquartz.org

次にgnuplotの公式サイトからダウンロードしてインストールします。
http://www.gnuplot.info

ちなみにMacであれば、XQuartzのインストール後に以下のコマンドを実行するとインストールできる...はずです。

```sh:
$ cd Downloads
$ curl -OL https://downloads.sourceforge.net/project/gnuplot/gnuplot/5.0.5/gnuplot-5.0.5.tar.gz
$ tar xzf gnuplot-5.0.5.tar.gz
$ cd gnuplot-5.0.5
$ ./configure
$ make
$ sudo make install 
```

# サンプル表示

以下のコードを実行してみます。

```rb:
require 'gnuplot'

Gnuplot.open do |gp|
  Gnuplot::Plot.new(gp) do |plot|
    
    plot.xlabel   "x"
    plot.ylabel   "y=x^3-2x+2"
    plot.grid
    
    x = (-20..20).collect { |v| v.to_f / 10.0 }
    y = x.collect { |v| v ** 3 - 2 * v + 2}

    plot.data << Gnuplot::DataSet.new([x, y]) do |ds|
      ds.with      = "linespoints"
      ds.linewidth = 2
      ds.linecolor = 3
      ds.notitle
    end
    
  end
end
```
![スクリーンショット 2017-02-18 15.28.50.png](https://qiita-image-store.s3.amazonaws.com/0/114240/f326561f-9622-0765-2e18-7657a96cebf5.png)

別ウィンドウが表示されてグラフが描画されました。

...インラインじゃない(-_-;)

# インラインで表示してみる

前述のコードを変更して、SVGファイルを出力するよう設定してみます。

```sh:
require 'gnuplot'

Gnuplot.open do |gp|
  Gnuplot::Plot.new(gp) do |plot|
    
    plot.terminal "svg"
    plot.output   "gnuplot.svg"
    plot.title    "作成例"
    plot.xlabel   "x"
    plot.ylabel   "y=x^3-2x+2"
    plot.grid

    x = (-20..20).collect { |v| v.to_f / 10.0 }
    y = x.collect { |v| v ** 3 - 2 * v + 2}

    plot.data << Gnuplot::DataSet.new([x, y]) do |ds|
      ds.with      = "linespoints"
      ds.linewidth = 2
      ds.linecolor = 3
      ds.notitle
    end
  end
end

open("gnuplot.svg")
```
![スクリーンショット 2017-02-18 15.43.38.png](https://qiita-image-store.s3.amazonaws.com/0/114240/7de3fbc5-b9ab-4de6-8001-f4a43e7fae35.png)

来たっ！

# Notebookをエクスポートして確認してみる

「File」メニューから「Download as」でHTML形式をダウンロードします。

そして、そのファイルをブラウザで表示してみると...

![スクリーンショット 2017-02-18 15.47.29.png](https://qiita-image-store.s3.amazonaws.com/0/114240/c779e45f-7029-79bd-060b-9a851d06b409.png)

来たっ！

しかも日本語も正しく表示されてる！！

これでiRubyを使ってグラフ作成して、自由にインラインで表示することができそうです。

よし、次は何しよう(^_^;)

# フォントの指定

```rb:
plot.terminal "svg"
```

の部分を

```rb:
plot.set 'terminal svg font "ヒラギノ丸ゴ ProN W4, 12'
```

と変更したら、フォントの指定もできるようになりました(^-^)/
画像クローラー

# 方針

Google画像検索結果をスクレ一ピングして画像だけ取り出して保存

~~~python
# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
import requests
import re
import urllib2
import os
import cookielib
import json

def get_soup(url,header):
    return BeautifulSoup(urllib2.urlopen(urllib2.Request(url,headers=header)),'html.parser')

query = "Yokoyama yui"# 横山由依の画像を検索
label="0"
print query
query= query.split()
query='+'.join(query)
url="https://www.google.co.in/search?q="+query+"&source=lnms&tbm=isch"
print url
#add the directory for your image here
DIR="Pictures"
header={'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"
}
soup = get_soup(url,header)


ActualImages=[]# contains the link for Large original images, type of  image
for a in soup.find_all("div",{"class":"rg_meta"}):
    link , Type =json.loads(a.text)["ou"]  ,json.loads(a.text)["ity"]
    ActualImages.append((link,Type))

print  "there are total" , len(ActualImages),"images"

if not os.path.exists(DIR):
            os.mkdir(DIR)
DIR = os.path.join(DIR, query.split()[0])

if not os.path.exists(DIR):
            os.mkdir(DIR)
###print images
for i , (img , Type) in enumerate( ActualImages):
    try:
        req = urllib2.Request(img, headers={'User-Agent' : header})
        raw_img = urllib2.urlopen(req).read()

        cntr = len([i for i in os.listdir(DIR) if label in i]) + 1
        print cntr
        if len(Type)==0:
            f = open(os.path.join(DIR , label + "_"+ str(cntr)+".jpg"), 'wb')
        else :
            f = open(os.path.join(DIR , label + "_"+ str(cntr)+"."+Type), 'wb')


        f.write(raw_img)
        f.close()
    except Exception as e:
        print "could not load : "+img
        print e
~~~
【Unity5】ゲームパッドが接続されているかどうかをスクリプトで確認する

##概要
Unity5でゲームパッドが接続されているかをスクリプトで確認したかったので、
その方法をまとめておきます。

##スクリプト
まず、以下が結果となるサンプルのスクリプトです。

```csharp:sample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		// 接続されているコントローラの名前を調べる
		var controllerNames = Input.GetJoystickNames();

		// 一台もコントローラが接続されていなければエラー
		if( controllerNames[0] == "" ) Debug.Log("Error");
	}

}
```

##手法
直接「ゲームパッドが接続されているか」を確認できる関数やプロパティは見つけられなかったので、
代わりに `Input.GetJoystickNames()` という現在接続されているゲームパッドの名前を取得できるメソッドを利用しました。
`Input.GetJoystickNames()` で接続されているゲームパッドの名前を取得し、
配列の先頭の文字列が空であれば「一台も接続されていない」と判断しています。

ちなみに、 `Input.GetJoystickNames()` で取得した配列の大きさを取得すれば、接続されているゲームパッドの数も求められますね。
（:warning:ただしゲームパッドがゼロ台でも、配列は１の大きさを持つのでご注意を。）
２つの配列を比較して、重複している値を取り出す(問題)


Compare with 2 arrays and extract duplication values

```:ruby
#examples
arr1 = [2, 4, 5, 6, 7]
arr2 = [7, 8, 9, 7, 4, 3, 2]

answer:[2, 4, 7]

arr1 = [2,4,5,6,7]
arr2 = [8,9,3]

answer:[]

arr1 = [2, 4, 5, 6, 7]
arr2 = [8, 9, 3, 2, 3]

answer:[2]
```

[回答](http://qiita.com/joji/items/3d11bede9ee384bae990)
GoogleAppsScriptで特定のDriveフォルダにあるファイル更新情報をSlackで通知する

前回の投稿から1年以上が開いてしまいました。
今年はアウトプットを頑張る年にしたい、ということで何か手元で書いたら投稿する習慣をつけたいと思います。（本業は人事ですが。）

さて、基本的に業務で利用するのはGoogleAppsScriptしか書かないので、最近書いたものを投稿します。

弊社ではG Suite（旧 Google Apps for Work）を利用していますが、結構Spreadsheetが増えてきています。
組織の成長過渡期ということもあり、これから専用のシステムが色々と導入されていくことになると思いますが、しばらくはSpreadsheetで管理するものはある程度残りそう。

数が少なければよいのですが、増えてくると都度更新されているか見に行くと大変なので、特定のDriveフォルダの週次で更新されたSpreadsheetをチェックしにいくSlackbotを作りました。

今更ながら初めてSlackのbot作りましたが、とても手軽で色々利用の幅が広げられそうだなーと思いました。

# Google Apps Script
## Slackへの投稿メソッド

Webhookの利用方法とかはこちらの記事とかに書いてあります。
http://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

```js
function sendToSlack(body, channel) {
  var url = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXX";
  var data = { "channel" : channel, "username" : "hogehoge-name", "text" : body, "icon_emoji" : ":exclamation:" };
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };
  var response = UrlFetchApp.fetch(url, options);
}
```

## 特定のDriveフォルダをチェックして直近一週間の更新情報を取得するメソッド

```js
function updateMissionSheetList() {
  var folder = DriveApp.getFolderById('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
  var files = folder.getFiles()
  var array = new Array{};
  //一週間前のの日付取得
  var compDate = new Date();
  compDate.setDate(compDate.getDate() - 7);
  while (files.hasNext()) {
    var file = files.next();
    //日付をキーにして、直近タスクを配列へセットする
    var lastUpdateDate = file.getLastUpdated();
    if(lastUpdateDate > compDate) {
      array.push("【"+ file.getName() +"】" + "最終更新：" + Utilities.formatDate(lastUpdateDate, "Asia/Tokyo", "yyyy/MM/dd HH:mm"));
      array.push("URL：" + file.getUrl());
    }
  }
  sendToSlack("ここ1週間で更新があったSpreadsheetをお知らせします。\n" + array.join("\n"), "#hogehoge-channel")
}
```

あとはこれらをトリガー登録して週次実行させればこんな感じでSlackに通知されます。

![SnapCrab_NoName_2017-2-18_14-49-19_No-01.png](https://qiita-image-store.s3.amazonaws.com/0/34716/74acf37f-0558-d106-dddb-37d3c8533c78.png)


今年は頑張って定期的に書いてみようと思います。ではまたー。

# エンジニアの方にお会いしたいです

弊社では、フロントエンドからバックエンド、インフラまで全域でアドテクやりたいエンジニアの方を募集しています！
ちょっと話聞かせろやくらい感じで遊びに来てくれたら嬉しいです！
【株式会社ジーニー】
https://www.wantedly.com/companies/geniee-co
「Re:dash」を「Docker for Mac」で動かそうとしたらエラーになった

# 結論

「v0.11.1.b2095 」を使っている人は「v0.12.0.b2449」以上のバージョンを使おう

# 現象

下記を参考にRe:dashの導入を試みた

[「Re:dash」を「Docker for Mac」で動かしてみた \- Qiita](http://qiita.com/tbuchi888/items/275bb2ed341c2936c9c3)

環境も上記の記事に合わせて

```
v0.11.1.b2095
```

を使用した

そうすると

```
$ ./setup/docker/create_database.sh
```

実行時に下記のエラーが発生してしまった

```
usage: manage.py [-h]
                 {status,shell,users,database,send_test_mail,runserver,version,groups,org,ds,runworkers,check_settings}
                 ...
manage.py: error: unrecognized arguments: -n -t pg -o {"user": "redash_reader", "password": "redash_reader", "host": "postgres", "dbname": "postgres"}
```

使用には特に問題はないようだけど気持ちが悪かったので調べたところ
下記プルリクで修正されているようだった

https://github.com/getredash/redash/pull/1170

「v0.12.0.b2449」以上を使用することで解決した
pythonのバージョンが切り替わらない

プリインストールされている2.Xのpythonを、3.xにバージョンアップしようと思ったところ、少し引っかかったのでメモ。

### バージョンを変更してみる
新しいバージョンをインストール、確認
<pre>
$ pyenv install 3.6.0
$ pyenv versions
system
* 3.6.0 (set by ・・・・
</pre>
新しくディレクトリを作成後、そこでlocalオプションでバージョン切り替え。
のつもりがうまくいかず。。
<pre>
$ pyenv local 3.6.0
$ python -V
Python 2.7.10
</pre>

### 対処法
~/.bash_profileに以下を追記
<pre>
export PATH="$HOME/.pyenv/shims:$PATH"
</pre>
.bash_profileを適用
<pre>
source ~/.bash_profile
</pre>
これでPathが通ったので無事バージョンが切り替えられました！
<pre>
$ python -V
Python 3.6.0
</pre>
社内開発にScala+PlayFrameworkを導入したい

(おことわり)
この記事は、[弊社のOrganization](http://qiita.com/organizations/itpropartners) を利用して、社内サービス開発にScala+PlayFrameworkを導入するにあたっての作業内容や試行錯誤を記録した連続投稿になります。
基本的には内容が正しく、かつ読み手に有益な情報になるように配慮しておりますが、どちらかと言えば **社内での情報共有** を主目的としているため、

- まとまりのない情報の羅列
- 正確に検証されていない情報

などを記載することもあります。予めご了承ください。

# なぜScalaなのか(社内方針)

[弊社](https://itpropartners.jp/)ですが、エンジニアチームは普段はPHP、Rubyなどを使って開発をしています。
ぼちぼちエンジニアの採用も本格化し、受託も自社サービスも拡大する中で、PHP,Rubyに次ぐ「第三の開発言語」を増やそうということになりました。主な理由を整理するとこんな感じです。

- 社外向けに、会社の技術的な取り組みのアピール
  - フリーランスのエンジニアの方との関わりが多いので、Scalaで開発してます :tada: という事がコミュニケーションの良いきっかけになることも期待。
- 受託開発向けに、クライアントにとっての言語選択肢を増やす
  - 特にWebサービスのスタートアップに関わる場合、開発言語の選択は将来の採用に大きく関わると考えています。
- 社内の技術意識の向上、最新技術へのキャッチアップ
  - Scalaでの開発経験/興味があるような向上心の高いエンジニアが入社したい！と思ってもらえるようなエンジニアチーム作り。

# Scala+PlayFrameworkに期待したいこと（技術面)

平たく言えば、「**静的言語と、Rails系フレームワークのWeb開発効率のいいとこ取り**」ができれば良いなと思っています。

  - 型付き＋関数型言語による、安全・堅牢、かつ可読性の高くメンテもしやすいコーディング
  - それでいて、Ruby on Railsに近い、スピーディで効率的なWeb開発
  - テストコードも書けそうならできるだけ書きたい

# 開発内容

実際に稼働している自社サービス(PHP5.4+CakePHP2)のリプレース。
とは言ってもフルリプレースをいきなり始めると絶対に終わらないので、管理者向けの新機能など、現行サイトと並行稼働させられるところから始めて、じわじわと移行していくようなイメージです。

# 社内のScala経験

**一切無し。**
冗談抜きに経験者ゼロの状態から、無謀にもスタートしました。 :upside_down: 
技術選定にあたってScalaの言語仕様とかPlayFlameworkの特徴や評判についてはある程度調べていますが、
この記事を書いている時点で、メイン開発担当(@zaramme)は  **まだ一行もScalaコードを書いたことがありません。**

しかもあまり社内リソースが割けないこともあり、実質[スカンクワーク](http://www.weblio.jp/content/%E3%82%B9%E3%82%AB%E3%83%B3%E3%82%AF%E3%83%AF%E3%83%BC%E3%82%AF)での開発になります。

どうなることやら。

（次回）
[Scala+PlayFramework 環境選定(Scala,Playのバージョン設定、開発環境やエディタの整備)](http://qiita.com/zaramme/items/d25d74921932a381f825)
俺の「package.json(gulp用)」

俺の「gulpfile.js」に対応。備忘録的な感じで作成。都度変更していく。

npm i でインストール。

##json

```package.json

{
  "name": "project-name",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "browser-sync": "^2.18.8",
    "gulp": "^3.9.1",
    "gulp-autoprefixer": "^3.1.1",
    "gulp-data": "^1.2.1",
    "gulp-debug": "^3.1.0",
    "gulp-ejs": "^3.0.1",
    "gulp-imagemin": "^3.2.0",
    "gulp-minify-css": "^1.2.4",
    "gulp-minify-ejs": "^1.0.3",
    "gulp-notify": "^3.0.0",
    "gulp-plumber": "^1.1.0",
    "gulp-postcss": "^6.3.0",
    "gulp-pug": "^3.3.0",
    "gulp-rename": "^1.2.2",
    "gulp-sass": "^3.1.0",
    "gulp-uglify": "^2.0.1",
    "postcss-cssnext": "^2.9.0"
  }
}


```
スニペット：CSSだけで実現するランキグングバナー表記



サイトで見つけたのでコピーしながら作ってみた。

##CSSだけで実現するランキングバナー表記

こんな感じの
キャラクタランキングを作るためのコードを作ってみた。


<img width="523" alt="スクリーンショット 2017-02-18 14.21.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/1088/8159b86f-4fba-199d-f11f-925fc3fc5f7d.png">


### html
```html
<html>
  <body>

      <a class='sss'>
        <img src="2399.png" width="90px" height="90px" alt="">
      </a>
      <a class='sss'>
        <img src="" width="90px" height="90px" alt="">
      </a>
      <a class='sss'>
        <img src="" width="90px" height="90px" alt="">
      </a>
      <a class='sss'>
        <img src="" width="90px" height="90px" alt="">
      </a>
      <a class='sss'>
        <img src="" width="90px" height="90px" alt="">
      </a>
  </body>
</html>
```

### CSS

```css

    <style>
      .sss{
        counter-increment:rankingnumber;
      }
      .sss:before{
        position: absolute;
        color:#fff;
        font-size:10px;
        width:30px;
        height:30px;
        text-align:left;
        border:1px solid #777;
        background-color:#777;
        content:counter(rankingnumber) "位";
        box-shadow:10px 0 0 12px #666;
        -webkit-mask-image: url(svg.svg#top);
        -webkit-mask-size: cover;
      }

      .sss :after{
        position: absolute;
        content: '';
        margin-left: -36px;
        margin-top: -30px;
        display: block;
        border-radius:15px;
        width: 30px;
        height: 30px;
        border: 1px solid #777;
        mask-image: url(svg.svg#top);
        mask-size: cover;
      }
    </style>

```


### SVG
```svg.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="none">
  <defs>
    <style>
      g {
        display: none;
      }
      g:target {
        display: inline;
      }
    </style>
  </defs>

  <g id="top">
    <polygon fill="black" points="0 100 0 0 100 0"/>
  </g>

  <g id="bottom">
    <polygon fill="black" points="100 0 100 100 0 100"/>
  </g>

  <g id="top-reverse">
    <polygon fill="black" points="0 0 100 0 100 100"/>
  </g>

  <g id="bottom-reverse">
    <polygon fill="black" points="0 0 0 100 100 100"/>
  </g>
</svg>

```
Ruby Compositeパターン


##はじめに
構造がきれいな設計のために、デザインパターンを再学習しています。
今回はCompositeパターンを扱います。


##環境
Ruby 2.3.0


##概要
構造に関するパターンのひとつです。
Compositeパターンは、木構造、階層構造、ツリー構造のオブジェクトを作りたいときに
上位のオブジェクトとか単一のオブジェクトかを考えさえせたくないときに利用できます。

例えば、ディレクトリ（上位オブジェクト）とファイル（単一オブジェクト）の構造の場合に、ディレクトリもファイルも同一視できます。

GoFいわく「全体が部分のように振る舞う」テクニックとのこと。
また、Compositeとは英語で「複合的」という意味です。


###コード
Componentを継承して、ファイルとディレクトリを作成しています。


```ruby:Strategy.rb
class Component
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end

class FileComponent < Component
  def initialize(name)
    super(name)
  end
end

class DirectoryComponent < Component
  def initialize(name)
    super(name)
    @components = []
  end

  def add(component)
    @components << component
  end

  def remove(component)
    @components.delete(component)
  end

end

picture = DirectoryComponent.new("PICTURE")
picture.add(FileComponent.new("child.jpg"))
picture.add(FileComponent.new("car.jpg"))
picture.add(FileComponent.new("landscape.jpe"))

usb = DirectoryComponent.new("UsbDevice")
usb.add(picture)

```


##参考
- [Rubyによるデザインパターン](https://www.amazon.co.jp/exec/obidos/ASIN/4894712857/orangain-22/)
- [増補改訂版Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?ie=UTF8&qid=1487168180&sr=8-1&keywords=java+%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
Dockerでうまく動作しなかった時に確認すること

# 破壊的仕様変更と機能廃止

Qiitaのdockerの記事をみて、その通りやってみたのにうまく動かないとか、技術系のメディアの記事のとおりにDockerを使ったのにうまく動かないとか、Dockerを使っているアプリケーションでマニュアル通り進めたがうまく動かないということが多々あります。というのも、Dockerの開発は進歩が速いというのもありますが、破壊的仕様変更が頻繁に行われています。

* [破壊的変更と非互換性](http://docs.docker.jp/engine/breaking_changes.html)
* [廃止機能](http://docs.docker.jp/engine/deprecated.html)

ですので、何か動作しなかった場合には、Docker公式サイトの上記ページを確認しましょう。
また、Docker関連の検索をgoogleで行う際には直近3か月以内で検索することをおすすめします。

# Dockerのバージョンを固定する

トラブルの元になるのは、記事中で、デフォルトの最新バージョンのDockerを取ってくるようになっていること。
これは、記事を書いた時点では、正常に動作するが、その後Dockerのバージョンが上がり、破壊的仕様変更が行われたときに動作しない可能性が出てくる。これは、サーバー構築ログ、ansibleなどのインフラ構築ツールの設定ファイルにも言えることで、Dockerのバージョンを固定しておかないと次回サーバー構築時には正常に動作するかは保証されない。
素人の言語処理100本ノック:75


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第8章: 機械学習
>本章では，Bo Pang氏とLillian Lee氏が公開しているMovie Review Dataのsentence polarity dataset v1.0を用い，文を肯定的（ポジティブ）もしくは否定的（ネガティブ）に分類するタスク（極性分析）に取り組む．

###75. 素性の重み
>73で学習したロジスティック回帰モデルの中で，重みの高い素性トップ10と，重みの低い素性トップ10を確認せよ．

####出来上がったコード：

```python:main.py
# coding: utf-8
import codecs
import numpy as np

fname_features = 'features.txt'
fname_theta = 'theta.npy'
fencoding = 'cp1252'		# Windows-1252らしい

# 素性読み込み
with codecs.open(fname_features, 'r', fencoding) as file_in:
	features = list(file_in)

# 学習結果の読み込み
theta = np.load(fname_theta)

# 重みでソートしてインデックス配列作成
index_sorted = np.argsort(theta)

# 上位、下位10件表示
print('top 10')
for index in index_sorted[:-11:-1]:
	print('\t{}\t{}'.format(theta[index],
			features[index - 1].strip() if index > 0 else '(none)'))

print('worst 10')
for index in index_sorted[0:10:]:
	print('\t{}\t{}'.format(theta[index],
			features[index - 1].strip() if index > 0 else '(none)'))
```

####実行結果：

```console:実行結果
top 10
	2.5513381450571875	refresh
	2.3661550679971954	engross
	2.1686400756091198	unexpect
	1.9558595013013638	examin
	1.921611726928927	remark
	1.8642762301453122	glorious
	1.6736177761639448	quiet
	1.6361584092330672	delight
	1.6264395695012035	confid
	1.6207851665872708	beauti
worst 10
	-2.6661835195544206	bore
	-2.381809993645082	dull
	-2.264732545707236	wast
	-2.0944221636736557	fail
	-2.043315628825945	flat
	-1.9875250134818985	mediocr
	-1.921981567258377	worst
	-1.9199082235005225	suppos
	-1.9103686908457609	routin
	-1.8511208689897838	appar
```

###素性の重み
素性の重みは$ \theta $の値そのものです。値が大きければその語が出現した際に仮説関数の値が肯定側へと大きくなりますし、値がマイナスなら否定側へと小さくなります。
ステミングした結果なので単語が途中で切れているものもありますが、トップ10は肯定的な単語、ワースト10は否定的な単語が並んでいるようですので、思った通りに素性の重みが学習できているようです。

###ソートした結果のインデックス取得

素性の重みでソートするのは簡単なのですが、少し工夫が必要です。

コード上では素性の重み$ \theta $は行列`theta`に格納されていて、対応する素性の文字列配列は`features`に格納されています。ここで単純に`theta`の値でソートすると`theta`だけが並び変わってしまい、トップ10やワースト10の重みの値はわかるものの、対応する素性がわかりません。そのため`features`も連動して並び替えないといけません。これはちょっと面倒です。

ここで便利なのが[`Numpy.argsort()`](https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.argsort.html#numpy.argsort)です。これは対象配列をソートするのですが、その結果として返してくれるのは並び替えた値の配列ではなく、並び替えた結果のインデックスの配列になっています。

例えば今回のように普通に昇順でソートすると、戻り値は [最少値の要素のインデックス, 2番目の要素のインデックス, ... 最大値の要素のインデックス] という形になります。そのため、返ってきたインデックスを使って、素性の配列`features`の該当要素を見れば対応する素性がわかります。これは便利！

なお、1つだけ注意しないといけないのは、`theta`は3,228要素からなる行列なのに対して`features`は3,227要素である点です。[問題73のベクトル化](http://qiita.com/segavvy/items/5ad0d5742a674bdf56cc#ベクトル化)で説明したように`theta`の先頭要素は「素性なし」に対応する重みなので、1つずれています。そのため、`features`の該当要素を調べる時はインデックスを-1してください。インデックスが0なら「素性なし」に対応する重みです。

　
76本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。*
ビッグエンディアン・リトルエンディアンって何なのか

# はじまり
floatデータをバイト配列から復元する必要があり、Arduinoのエンディアンはどっちなのだろうといつものgoogleにお世話になる。AVRのデータシート見ろは無しで。

参考：[ビッグエンディアンとリトルエンディアンの狭](http://shimobayashi.hatenablog.com/entry/2012/12/15/%E3%83%93%E3%83%83%E3%82%B0%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3%E3%81%A8%E3%83%AA%E3%83%88%E3%83%AB%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3%E3%81%AE%E7%8B%AD) 

記事が古いがちょっと面白かった。分かってない人が見るとちんぷんかんぷんだ。**Arduinoはリトルエンディアン**と書かれているし、これ以上深入りしなくてもいいが。

# 深入りした結果
int ⇒ char 変換を考えると 4バイト ⇒ 1バイト。

ビッグエンディアンで 1000 番地から 0x12345678 を格納してみる。
1000 0x12 ⇒ 1000 0x12 (アドレス参照 の動き)
1001 0x34
1002 0x56
1003 0x78 ⇒ 1003 0x78 (キャスト の動き)

リトルエンディアンで 1000番地から 0x12345678 を格納してみる。
1000 0x78 ⇒ 1000 0x78 (アドレス参照・キャスト の動き)
1001 0x56
1002 0x34
1003 0x12

アドレス変化の無いリトルエンディアンが機械に優しい。また、TCP/IPなんかで使われるネットワークバイトオーダーは人間に優しいビッグエンディアン。ぱっと思いつくソースコードは下記。

```c
#include <stdio.h>
int main(void) {
	unsigned long u32 = 0x12345678UL;
	printf(" char : %x\n", (char)u32);
	printf("*char*: %x\n", *(char*)&u32);
	return 0;
}
```

しまった。Arduino は printf が使えない。リトルエンディアンってことにしておこう。

# 余談
正直jsonやら何やら文字列表現してしまう環境の中、必要になる状況はあまりない。しかしQiitaにも多数投稿がある。プログラミング界の蟻地獄。
BeautifulSoupでクロールの練習

## こんな感じです

ー　python2.7

~~~python
#-*- encoding: utf-8 -*-

import logging, sys, urllib
import bs4

url = 'http://www.bus-sagasu.com/searches/{}-{}/{}-{}-{}/sort:1/'.format(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
soup = bs4.BeautifulSoup(urllib.urlopen(url).read(),"lxml")

for result in soup.select("div.resultContent"):
  for title in result.select("div.title"):
    print title.text.strip(),
  for seat in result.select("td.seats"):
    print seat.text,
  for price in result.select("td.price"):
    print price.text,
  print ""
~~~
GitHubのPRにチェックアウトするコマンド

OSSの開発をしている時など、外から来たPRを手元で再現するためにシェル関数を作りました。repo_nameは開発中のリポジトリ名にしてください。

```sh
# arg style: asmsuechan:myrepository
function checkout-another-remote-branch() {
  IFS=':'
  read -r NAME BRANCH <<< $1
  git remote add $NAME https://github.com/$NAME/repo_name.git
  git fetch $NAME
  git checkout $BRANCH
}
```

使い方は

```sh
$ checkout-another-remote-branch asmsuechan:myrepository
```

です。これでチェックアウトされます。

## 参考
http://qiita.com/hnw/items/d23d0b63db70ba2073eb
Homebrewで最新のRubyとgitを導入

標準搭載されてるRubyとGitを，homebrew使って最新版にした時のメモ
[Rubyのバージョン切り替え](https://h2ham.net/ruby-rbenv)ができるものもあるけど，最新版しか使わないからスルー

# 動作環境
- MacOS X El Capitan
- [homebrew](https://brew.sh/index_ja.html)導入済
- ruby 2.0.0p648 (2015-12-16 revision 53162)　←**Apple標準搭載**
- git version 2.10.1 (Apple Git-78)　←**Apple標準搭載**


（参考）以下をターミナルで入力してenterすると，バージョンが確認出来る
$は入力不要

```
$ ruby -v
$ git --version
```


# インストール

```
$ brew install ruby
$ brew install git
```
上のコマンドを実行しただけだと，まだバージョンは変わらなかった


# パスの設定ファイルを編集
rubyを呼んだら，今homebrewで導入したrubyが呼び出されるようにする（gitも同じ）
本当は，homebrewを導入した時点でするべきだったらしい<br><br>


以下のコマンドを実行して，パスの設定ファイルを編集できるようにする

```
$ emacs ~/.bash_profile
```
emacsエディタが開くので，一番最初に以下を書き加える

```
export PATH="/usr/local/bin:${PATH}"
```

そしてファイルを保存
（「ctrl」押しながら，「x」「c」の順に押す．保存するか聞かれるから「y」を入力）

その後，
以下のコマンドを実行して，設定ファイル（~/.bash_profile）の内容を反映させる

```
$ source ~/.bash_profile
```

# 最新版に更新できたか確認
```
$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164)

$ git --version
git version 2.11.1
```

# 参考
- http://we.fnshr.info/2016/03/13/homebrew-git/
[Python] Pythonからバッチファイルを起動、変数を渡す。

# バッチファイルとは
**Windowsで実行される一連のコマンド群を記述したファイル**です。
バッチファイルには「.bat」と「.cmd」の拡張子の二種類がありますが、動作は基本的に同じです。この違いについて詳しく知りたい方は以下の記事を参照ください。
[.cmd(拡張子)とは](http://wa3.i-3-i.info/word12947.html)

# なぜこの機能が必要？
単純にバッチコマンドを学習するのがめんどくさかったからです。
Python側で処理してしまって、その結果をバッチファイルの引数として渡すほうが楽でした。
いろんなライブラリ使えますし...(言い訳)

# Python側の用意
os.system()関数の引数に、.cmdファイルのパスとコマンドライン引数を記述するだけで、指定した.cmdファイルへ処理を受け渡すことができます。

sys.argvで引数のリストを受け取ることができますが、起動したPythonファイル名がリストの一番初めに含まれるため、これを除外してインデックス1からforループをまわします。

```py:fuga.py
import os
import sys

cmd_file = "hoge.cmd"   # .cmdファイルへのパス
argvs = sys.argv        # 複数の引数を持つ場合
argc = len(argvs)

command = cmd_file

for i in range(1, argc):
    command += " " + argvs[i]

os.system(command)
```


# cmdファイル側の用意
コマンドライン引数をすべて出力するコマンドを記述し、正しい値が取得できているか確認します。

```bat:hoge.cmd
@echo off

echo ".cmd Executed"

for %%f in (%*) do (
  echo %%f
)

echo "Completed"
```

# 結果
コマンドプロンプトで、先程作成したPythonファイルを引数つきで呼び出します。
![2017-02-18_123748.jpg](https://qiita-image-store.s3.amazonaws.com/0/127402/fec3bfb3-b1c5-f086-9c8a-83dc8d1cc4bd.jpeg)
Python側に指定した引数が、.cmdの引数として使用できました。
LINEBOTとメッセージ機能があればEC-Cubeでも今起きている売り上げ状況を把握することができる！！通知BOTを作った。　


#LINEBotへの売り上げ通知
EC-Cubeで運用しているサービスの売り上げをいろんな方法で知ることができる状態にしてきました。過去にSlack、Wowtalk（なぜw）、FBメッセンジャーに対応してきていたので、今度はLineに対応してみました。　

## できることは単純です。
会話の中で　「売り上げ　」という言葉が出てきた時に反応し、その時点から24時間の売り上げを横から喋ります。定期的に売り上げと過去の変遷などをプッシュすることもできますが、今のアカウントではここまでが限度。楽しいけれど、大したことはできない。という状況です。


## どういう仕組みかというと、
あらかじめ、'beacon' == $event->type　でユーザIDを取得できている状態下で
$event->getText();　で取得した文字列が目的の文字を含んでいた場合をそれなりに判断することで、想定場所にいる人からの通信のみを判定して応答するという、　何だか勤怠システムのようなものが組み込まれた通知の仕組みです。

###botの使い道はロケーションの把握でしか使えませんでした。　

売り上げをすぐ知れることは便利なのですが、どこの誰でも話しかけることで喋ってしまっては、こんなに少ない売り上げを露見してしまいます。　このため、特定の場所にいる時しか喋らなくなっています。　全員が特定の場所にいる時・・・とはいきませんので、グループなら誰かがいればよく、見知らぬ人に見せることも可能ですが、そこはは人を信じるだけになっています。　　この点はもっと開発じかんがあれば、勤怠システムとしてかなり進化させられると考えています。


#### 呼び出すとこんな感じになります。
<img width="427" alt="IMG_2364_PNG.png" src="https://qiita-image-store.s3.amazonaws.com/0/1088/37967166-c43d-9884-1e19-d847bf1a16be.png">



#LineBotの使い道には難という印象。
LINEはとても面白くて、お金を払うと一挙にできることが拡大しますが、そこそこの費用がかかります。また、当初はエロ業界や広告業界に対する商材を作ってみようとして始めたプロジェクトでしたが、このどちらも規約でNOがかかります。
【ラズパイ・Lチカ】gpiozeroを使おうとしたらエラー。日本製ラズパイの場合ひと手間必要だった話

ラズパイマガジン２０１６年１２月号に載っていたチュートリアル通りにLチカをしようとしたらハマった。

Lチカの配線をして
```
from gpiozero import LED
led = LED(17)
led.on()
```
というコードを走らせるだけなんだけど、

>PinUnknownPi: unable to parse new-style revision "a32082"

というエラーが出てコードが動かない。


調べていたらこんな記事（githubのissue）に遭遇。
[Failed to parse pi revision](https://github.com/RPi-Distro/python-gpiozero/issues/527)

どうやらgpiozeroというライブラリが日本製のラズパイに対応するには、

```
sudo wget http://rpf.io/datapy -O /usr/lib/python3/dist-packages/gpiozero/pins/data.py
```

というコマンドをターミナルで入力して、gpiozeroのdata.pyというプログラムを更新する必要があったらしい。

やってみたらうまくいった。Lチカ成功！

投稿された方も9日前にうまくいったようだ。

めでたしめでたし。
フォーム動作確認の繰り返しに、自動入力をブラウザコンソールに1コピペするだけで簡単にすませる方法

フォーム周りの修正は、コード変えて入力動作テストの繰り返しにイライラ💢
Seleniumも修正ごとに対応面倒で、基本はfirefoxのみだし😵 
テストコード修正するのは、もう少し実装イメージが固まってからって時の

簡単にフォーム自動入力ができるjs関数を作ってみました。

1回、ブラウザのコンソールで実行すれば
入力履歴で呼び出すだけで、自動入力が再現できて幸せになりました✨

即席だからまだ改善必要なコードですが^^;
今の状態でも幸せになったので、qiitaにいったんあげてみました。



## 前提
- jquery を使っているサイト

## 動作確認

- chrome
- Mac X
- Rails form
- jQuery


## 1.1コピペで、フォーム値を保存

フォームに入力した状態で、ブラウザコンソール上で下記をコピペ実行。
ブラウザのローカルストレージに指定したキーで保存されます。
複数フォームがある場合を想定して、対象のフォームのセレクタを必由に応じて指定。
キー名をパターン別に保存して使い分けたり。

※TODOメモ：ラジオボタンは、ちょっと工夫が必要みたいなのでまた追って

```js

// フォーム値を取得してlocalStorage に保存
// ※フォーム入力画面で入力後に実行 ※TODO:radio対応
function getFormValSet(storage_key, form) {
  var active_form, params, targets;
  params = {};
  active_form = $(form);
  targets = 'input[type=text], textarea, input[type=hidden], input[type=url], input[type=checkbox]:checked, select';
  
  $(targets, active_form).each(function() {
  	// key:name属性 val:フォーム値
    params[$(this).attr('name')] = $(this).val();
  });

  
  delete params['utf8'];
  delete params['authenticity_token'];
  
  localStorage.setItem(storage_key, JSON.stringify(params));
};


getFormValSet('valid_form', 'form');

```



## 2.1コピペで、過去の入力値を呼び出して利用(自動入力)

1.を実行したフォームで、リロード後、再度入力送信したい時、下記をコピペ実行。
すると、1.で保存したフォーム値が入ります。

```js
// 過去の入力値を呼び出して利用
// ※新しいフォーム画面で実行
function setFormVal(storage_key){
  params = JSON.parse(localStorage.getItem(storage_key));
  
  for(var key in params){
    if("hidden" != $("[name='"+key+"']").attr("type")){
      $("[name='"+key+"']").val(params[key]);
    }
  }
}


setFormVal('valid_form');
```

## 3.履歴で呼び出して何度も自動入力

ブラウザコンソール上で「↑」ボタンで履歴で、2. を呼び出せばok


## 4.不要になったら削除

下記をコピペ実行

```js
//要らなくなったフォームデータを削除
localStorage.removeItem(storage_key)
```

## 最後に(ゆくゆくは)

上にあげた方法は、ブラウザコンソールを開いて貼り付けて実行する必要があるので
ブックマークレットでポチポチっとできるところまで改修できたりしたらいいなぁなんて。

探していたら 近しいことをされているものがありました↓

- [フォームの自動入力に便利なBookmarkletを作った | ブックマークレット | Horic Design](http://horicdesign.com/bookmarklet/entry-195.html)

ただ、自分が今、作成しているフォームでは使えなかったので、
いったん、今は、フォーム値取得してストレージに保存しておいて
呼び出すみたいなものをコンソールで実行するようなもので対応しました
これだけでも何回も動作確認で入力するよりは幸せ＾＾