OmniAICreator/Qiita-1.07M huggingface dataset:
選択範囲のセルにあるシート追加するマクロ

# ソースコード

```vbnet
Option Explicit

Function checkExistSheet(sheetName As String)
    Dim workSheet As workSheet
    Dim existFlag As Boolean
    
    For Each workSheet In worksheets
        If workSheet.Name = sheetName Then existFlag = True
    Next workSheet
    
    
'    If flag = True Then
'        MsgBox "[合計]シートがあります", vbInformation
'    Else
'        MsgBox "[合計]シートはありません", vbInformation
'    End If

    checkExistSheet = existFlag
    
End Function

Sub addSheet(sheetName As String)

    If sheetName <> "" Then
        worksheets.Add(After:=worksheets(worksheets.count)) _
             .Name = sheetName
    End If
         
End Sub

' 引数で指定した範囲の最終行を取得
Function getLastRowRejectSplace(targetRange As Range) As Long
    getLastRowRejectSplace = Cells(Rows.count, targetRange.Column).End(xlUp).Row
End Function

Sub main()
    
    Dim selectionRange As Range
    Dim selectionCell As Range
    Dim lastRow As Long
    
    lastRow = getLastRowRejectSplace(Selection)
    
    For Each selectionCell In Selection
    
       If checkExistSheet(selectionCell.Value) = False Then
           Call addSheet(selectionCell.Value)
       End If

       If selectionCell.Row = lastRow Then
            Exit For
       End If
       
    Next selectionCell

End Sub
```
Excelの表からMarkdown形式の表を作成するマクロ

# ソースコード

Excelの選択した範囲のセルを、Markdown形式でクリップボードにコピーする。

<Font color="red">※利用にはMicrosoft Forms 2.0 Object Libraryへの参照設定が必要
</font>

http://www.relief.jp/itnote/archives/017881.php
http://answers.microsoft.com/ja-jp/office/forum/office_2010-excel/excel2010%E3%81%AEvba%E3%81%AE%E5%8F%82%E7%85%A7/360f7066-27d3-4c91-b8b3-79131ab4ba28

```vbnet
Option Explicit

Const MARKDOWN_TYPE As String = "Normal"

' Markdownの表形式に変換
Function convertMarkdownTableFormat(element As String)
    convertMarkdownTableFormat = "|" & element
End Function

' 各Markdownの種類に基いて、表形式フォーマットを作成
Function makeMarkdownTableFormatFromType(markdownType As String, number As Long)
    Dim count As Long
    Dim buffer As String

    buffer = ""
    If markdownType <> "" Then
        For count = 1 To number Step 1
            buffer = buffer & markdownType
        Next
        buffer = buffer & "|" & vbCrLf
    End If
    
    makeMarkdownTableFormatFromType = buffer
End Function

' Clipboardに値を設定
Sub setClipBoard(data As String)
    Dim ClipBoard As New DataObject
    
    With ClipBoard
        .SetText data       ''変数のデータをDataObjectに格納する
        .PutInClipboard     ''DataObjectのデータをクリップボードに格納する
    End With
    
End Sub

Sub main()
    Dim markdownType As Object
    Set markdownType = CreateObject("Scripting.Dictionary")
    markdownType.Add "Normal", "|:-:"
    markdownType.Add "Redmine", ""

    Dim selectionRange As Range
    Dim selectionCell As Range
    
    Dim leftEdgeColumn As Long
    Dim leftEdgeRow As Long
    Dim rightEdgeColumn As Long
    Dim rightEdgeRow As Long
    Dim currentColumn As Long
    Dim currentRow As Long
    
    Dim element As String
    Dim buffer As String
    Dim markdownTableFormat As String
    
    leftEdgeColumn = Selection.Column
    leftEdgeRow = Selection.Row
    rightEdgeColumn = Selection(Selection.count).Column
    rightEdgeRow = Selection(Selection.count).Row
    
    ' 表の1行目を読みこむ
    buffer = ""
    For currentColumn = leftEdgeColumn To rightEdgeColumn Step 1
        element = Cells(leftEdgeRow, currentColumn)
        buffer = buffer & convertMarkdownTableFormat(element)
    Next
    buffer = buffer & "|" & vbCrLf
    
    ' 各Markdownの種類に基いて、表形式フォーマットを作成
    markdownTableFormat = markdownType.Item(MARKDOWN_TYPE)
    buffer = buffer & makeMarkdownTableFormatFromType(markdownTableFormat, rightEdgeColumn - leftEdgeColumn + 1)
    
    ' 表の2行目以降を読み込む
    For currentRow = leftEdgeRow + 1 To rightEdgeRow Step 1
        For currentColumn = leftEdgeColumn To rightEdgeColumn Step 1
            element = Cells(currentRow, currentColumn)
            buffer = buffer & convertMarkdownTableFormat(element)
        Next
        buffer = buffer & "|" & vbCrLf
    Next
    
    ' Clipboardに値をコピー
    Call setClipBoard(buffer)
    
End Sub
```


下記アドインにより洗練された機能が付いている模様↓

https://love-guava.com/excel-relaxtools/

# ■ 参考
* http://qiita.com/taruhachi/items/5bd18d7de4c3fa40dd23
* http://qiita.com/QUENCH/items/d77d0983d4a6d9d7de8e
* http://officetanaka.net/excel/vba/tips/tips20.htm
[Sublime Text, LaTeXtools] SublimeとSkimでforward, inverse searchのキーバインドを統一する

sublime + LaTeXtools + Skimでforward search, inverse searchのキーバインドを統一してみました．

---
Skimのinverse searchのデフォルトコマンドはMacでは___command+shift+ダブルクリック___なので割と感覚的に扱えますが，LaTeXtoolsのforward searchのデフォルトコマンドは___command+l___の後に___j___を押すというものでなかなか覚えておくことができません（ぼくは）．

そこで，両サーチキーバインドを___command+shift+ダブルクリック___に統一を試みたのでメモしておきます．
これはSkimに限らず，SumatraPDF,Evinceなどでも同様な処理をすることで扱えます．
以下，手順となります．

```Preference > Browse Packages``` で設定ファイルが入っているディレクトリファイルを開いてその中のUserディレクトリの中に

``` Default (OSX).sublime-mousemap```というファイルを作成します．()内にはそれぞれOS(OSX, Linux, Windows)が入ります．
ファイル内に以下を記述します．

```
[
{
    "button": "button1",
    "modifiers": ["super","shift"],
    "count": 2,
        "context":  [
            {"key": "selector", "operator": "equal", "operand": "text.tex.latex"}],
        "command": "jump_to_pdf", "args": {"from_keybinding": true}}
]
```
この内容はLaTeXtoolsのデフォルトのキーマップからcommandとcontextを引っ張ってきて，キーとボタンを加えただけのものです．

これでSublime, Skim双方同じコマンドでforward, inverse searchが行えます．
Cで色文字列#ffffffからRGBへ変換

strtol で long に変換してから rgb 値をとればよい。

```c
uint32_t rgb = (uint32_t) strtol((const char *) &str[1], NULL, 16);

uint8_t red = (rgb >> 16) & 0xFF;
uint8_t green = (rgb >> 8) & 0xFF;
uint8_t blue = (rgb >> 0) & 0xFF;

```
Gin(Golang)におけるHTMLテンプレート記述方法

# はじめに
Go言語で使えるウェブフレームワークGin
HTMLレンダリング、テンプレートの書き方が分かり辛かったので少し解説

# 環境など
goはインストールされている前提で紹介

```bash
$ go version
go version go1.5.3 linux/amd64

$ mkdir templates
# 以下のテンプレートを編集
$ emacs templates/index.tmpl
# 下記のソースコード編集
$ emacs sample.go
# Ginをインストール
$ go get github.com/gin-gonic/gin
$ go run sample.go
```

# ソースコード
```go:sample.go
package main

import (
  "github.com/gin-gonic/gin"
  "net/http"
)

type C struct {
  Id int
  Name string
}

func main() {
  router := gin.Default()
  router.LoadHTMLGlob("templates/*.tmpl")
  router.GET("/index", func(c *gin.Context) {
    c.HTML(http.StatusOK, "index.tmpl", gin.H{
      "a": "a",
      "b": []string{"b_todo1","b_todo2"},
      "c": []C{{1,"c_mika"},{2,"c_risa"}},
      "d": C{3,"d_mayu"},
      "e": true,
      "f": false,
      "h": true,
    })
  })
  router.Run(":8080")
}
```

# 
```html:index.tmpl
<html>

  {{/* コメント*/}}

  {{/* ドット名前でgoから受け取れる */}}
  <h1>{{.a}}</h1>

  {{/* ループはrange, ドットで要素にアクセス, endで終了 */}}
  <ul>
    {{range .b}}
    <li>{{.}}</li>
    {{end}}
  </ul>
  
  {{/* 構造体は、ドットにメンバ名でアクセス */}}
  {{range .c}}
  <p>{{.Id}}<b>{{.Name}}</b></p>
  {{end}}

  {{/* 構造体、ループなしなら, ドット変数ドットメンバ */}}
  <p>{{.d.Id}}<b>{{.d.Name}}</b></p>

  {{/* if文 */}}
  {{if .e}}
  <p> e true </p>
  {{else}}
  <p> e false </p>
  {{end}}

  {{if .f}}
  <p> f true </p>
  {{else}}
  <p> f false </p>
  {{end}}
  
  {{/* goソースでgは指定されていない */}}
  {{if .g}}
  <p> g true </p>
  {{else}}
  <p> g false </p>
  {{end}}

  {{/* withはifが真の場合、ドットに情報が設定される */}}
  {{with .h}}
  <p> h1 {{.}} </p>
  {{end}}

  {{/* withでなくif使うと、ドットアクセスで特定要素が出力されず */}}
  {{if .h}}
  <p> h2 {{.}} </p>
  {{end}}

  {{/* 変数宣言できる */}}
  {{/* printf など関数使用可能。fmt.Printfのエイリアス */}}
  {{$i := "ii"}}
  <p>{{$i}}</p>
  <p>{{printf "%s-%s" $i "iii"}}</p>

  {{/* defineで定義することも可 */}}
  {{define "J"}}
  <p>jjj</p>
  {{end}}
  
  <hr>
  
  {{/* defineで定義された呼び出しはtemplate */}}
  {{template "J"}}
  
  {{/* 不等号比較など、小なりはlt */}} 
  {{$k := 8}}
  {{if lt 5 $k}}
  <p> 8 large </p>
  {{else}}
  <p> 5 large </p>
  {{end}}
  
</html>
```

# ブラウザでの表示確認

![スクリーンショット 2016-05-29 14.56.34.png](https://qiita-image-store.s3.amazonaws.com/0/31596/fee42983-a628-7f70-e45c-08b7f575bae8.png)


# 参考リンク
こちらを読めばより深く理解できると思われる

- [gin - HTML rendering](https://github.com/gin-gonic/gin#html-rendering)
- [golang - text/template ドキュメント](http://golang-jp.org/pkg/text/template/)
- [Go Web プログラミング　- 7.4 テンプレートの処理](https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/07.4.html)
- [Hugo - Go Template Primer](https://gohugo.io/templates/go-templates/)
ROS_12:基本 roslaunch

#roslaunch
robotを動かす時には複数のノードが必要です。それをまとめて動かすみたいです。

```
$ roslaunch [package] [filename.launch]
```
##作り方
[ROS Wiki](http://wiki.ros.org/ja/ROS/Tutorials/UsingRqtconsoleRoslaunch)の例を参考に

rosのパッケージのフォルダに移動

```
$ roscd beginner_tutorials
```
`launch`というフォルダを作成して移動

```
$ mkdir launch
$ cd launch
```

turtlemimic.launch というファイルを作成

```
<launch>

  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
        
  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>

</launch>
```

で、他の端末からturlesim1にTopicを送る

```
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
```
とturtlesimに送ったにも関わらず、両方のカメが動きます。

`<group>`タグは、グループを作る。
`<node>`タグは、ノードを動かす。 pkg属性でパッケージを指定。name属性で名前を指定(\_\_name:=と同じ？）。type属性がノード名
`<remap>`タグはリマップですね。。
バックグラウンドで動いているみたいだからrosrun turtlesim turtle_teleop_keyは無理かなあ
`<turtle1>`と同じグループでよいと思うので、

```
  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
```
を

```
  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
    <node pkg="turtlesim" name="key" type="turtle_teleop_key"/>
  </group>
```
にしてみる。。カメが1匹表示されないし動かない。。。やっぱり駄目っぽい。

ちなみに別で動かす時は、名前空間が追加されているのでリマップでPubliserの名前を変更する必要があるので、

```
$ rosrun turtlesim turtle_teleop_key /turtule/cmd_vel:=/turtlesim1/turtle1/cmd_vel
```
とする。
[C#] How to store a list of method?

#問題
C#について、普通な`List`は`Objects`などを集める。
例えば：`List<int>、List<object>`、。。。
この記事は「どうやって`List`に`Method`を含めるか」を話したいと思います。


```csharp
 private void Map1Wave1(){
   Console.WriteLine("Wave1");
 }

 private void Map1Wave2(){
   Console.WriteLine("Wave2");
 }
 /*more methods*/
 Dictionary<int, Action> Spawners = new Dictionary<int, Action>(){};
 Spawners = new Dictionary<int, Action>()
   {
    {1,()=>Map1Wave1()},
    {2,()=>Map1Wave2()},
    {3,()=>Map1Wave3()},
    {4,()=>Map1Wave4()},
    {5,()=>Map1Wave5()},
    {6,()=>Map1Wave6()},
    {7,()=>Map1Wave7()},
    {8,()=>Map1Wave8()},
    {9,()=>Map1Wave9()},
    {10,()=>Map1Wave10()}
   };
```

`delegate`で  `Dictionary`を定義したあとで、簡単でメソッドを実行できます。

```csharp
 int waveNumber = 1;   //1 -> 10
 Spawners[waveNumber]();  // result: Wave1
```
#まとめ
##メリット：
- コードが少なくになりました。 
- メンテナンスするのは簡単！

##デメリット:

`switch`ステートメントに比べて、スピードが遅いです。
Emacs系メモ

まずは移動系を覚えておく
ここらへん
[http://uguisu.skr.jp/Windows/emacs.html](http://uguisu.skr.jp/Windows/emacs.html)

| コマンド | 移動方向 |
:-------|:--------|
| Ctrl + n|下
|Ctrl + p | 上 |
|Ctrl + b | 戻る（左）|
|Ctrl + f | 進む（右）|
ChromebookでCrouton+Emacs+Mozcで快適日本語入力

テキストエディタは長年Vim派でしたが、最近はEmacsを学んでいます。

# なぜ今更Emacsを学びだしたのか

Emacsで日本語入力ができるという話を聞いたからです。

私は日本人なので、どうしても日本語を書かなくてはいけない機会が多いです。

MacやLinuxを使っている人であれば、Gvimや素のEmacsで十分なのですが、
私の場合、メインのPCとしてChromebookを使っているので、一筋縄ではいきません。
Chromebookのターミナルでは日本語入力ができないためです。

また仕事ではWindows＋Ubuntu(リモート)+Teraterm＋Vimという環境なのですが、Vimだと日本語入力時には不便です。
Esc押下時に自動でIMEをOFFにするVimScriptも書いたのですが、当然ながらSSH越しには機能しません。

Emacsであれば、CUIコンソール上でも日本語を打つことができます。
更にEmacsはVim同様に拡張性が高いので、自分の好きなキーでIMEの切り替えができます。

しかもMozcであればGoogle日本語入力並みの精度が期待できます。

# 動作環境

- ASUS Chromebook C300MA
- Ubuntu 14.04 in Crouton
- Emacs 24.5.1

私は、開発者はほぼ全員が持っているであろうMacBookを持っていません。
学生時代に金が無く、どうにかして安価で快適な開発環境を作ろうとしてひたすらLinuxを弄っていたので、未だに買っていません。

開発もできる格安PCとして、Chromebookに行き着きました。
C300MAはなんと27000円でした。Croutonを使ってUbuntuを動作させています。

最初はXfceを動作させるのに必死だったのですが、ChromebookのChromeの方が使いやすいので
最近ではターミナルからしかUbuntuを使っていません。

# 構築手順

これらは全てCrouton上に入れたUbuntuで行います。

まずは必要なパッケージをインストールします。

```sh
# Install Emacs
# 面倒であれば、aptから入れても良い
#sudo apt-get install emacs
cd /usr/local/src
sudo wget http://ftp.jaist.ac.jp/pub/GNU/emacs/emacs-24.5.tar.gz
sudo tar xzvf emacs-24.5.tar.gz && sudo rm emacs-24.5.tar.gz
cd emacs-24.5
./configure --with-x-toolkit=no --with-xpm=no --with-jpeg=no --with-gif=no --with-tiff=no
make
sudo make install

# Mozc本体のインストール
sudo apt-get install emacs-mozc

# mozc.elのインストール
# ここは環境に応じて、Package.elやCaskを使えば良い
mkdir -p ~/.emacs.d/lisp
curl https://raw.githubusercontent.com/google/mozc/master/src/unix/emacs/mozc.el > ~/.emacs.d/lisp/mozc.el

```

次にEmacsでMozcを使えるようにします。
`bind-key` を入れている前提ですので、適当に読み替えてください。

参考: http://emacs.rubikitch.com/bind-key/

`vim ~/.emacs.d/init.el`

```lisp
; Add path
(add-to-list 'load-path "~/.emacs.d/lisp")

; Mozc settings
(require 'mozc)
(set-language-environment "Japanese")
(setq default-input-method "japanese-mozc")
(setq mozc-candidate-style 'overlay)

(defun mozc-start()
    (interactive)
    (message "Mozc start")
    (mozc-mode 1))

(defun mozc-end()
    (interactive)
    (message "Mozc end")
    (mozc-mode -1))

; C-j -> Mozc ON
; C-g -> Mozc OFF
(bind-key* ("C-j") 'mozc-start)
(bind-keys :map mozc-mode-map
           ("C-g" . mozc-end)
           ("C-x h" . mark-whole-buffer)
           ("M-b" . backward-word)
           ("M-f" . forward-word)
           ("C-x C-s" . save-buffer))
```

（後半の大量のマッピングは、`mozc`が奪ってしまうキーバインドを取り返しています）

これで、Emacsを再起動すれば、下記のような操作で日本語入力できます。

- C-jで日本語入力ON
- C-gで日本語入力OFF
- Spaceで変換
- C-nで変換候補（次）
- C-pで変換候補（前）

本当はMacBookのようにかなでIME有効化、英数でIME無効化したかったのですが、Chromebookでどうやるか分からなかったので妥協しました。

試行錯誤の末、このキーマップに落ち着きました。

C-jは、Japaneseのjを取ったつもりです。
EmacsではC-gがキャンセルになっているので、日本語入力OFFにするのに丁度よかったです。

# 感想

これで快適な日本語入力環境ができました。
ターミナルと日本語は相性が悪いと思っていたのですが、Emacsだと普通にできますね。

これでまた一つ、ターミナル生活がはかどりそうです。

また、[Edit with Emacs](https://chrome.google.com/webstore/detail/edit-with-emacs/ljobjlafonikaiipfkggjbhkghgicgoh)を使い、ChromeOS上で動作しているGoogleChromeのテキストエリアをCrouton上のEmacsで編集できるようにしました。
こちらはまた別の記事で書こうかと思います。

# 参考にしたサイト

- http://compress.hatenadiary.com/entry/2014/02/25/113759
- http://d.hatena.ne.jp/kitokitoki/20120925/p2
git系メモ

## gitconfig

* systemを開くとき

```bash
$ git config --system -e
```

* globalを開くとき

```bash
$ git config --global -e
```

### 中身
```vim:/usr/local/etc/gitconfig
[alias]
  st = status
  ch = checkout
  co = commit
  gr = log --graph --oneline
  br = branch
  ad = add
  ps = push
  pl = pull
```
* bash_profileにもこんな設定

```bash:~/.bash_profile
alias gc='git branch | peco | xargs git checkout'
```
これで`gc`と打てばブランチ名をインクリメンタルサーチしてチェックアウトできる


## コマンド達
* `git reset`: `add`の取り消し
* `git commit --amend`: `commit`した後に`add`して`commit`をやり直す
* `git checkout ファイル名`: そのファイルの変更を戻す
* `git checkout .`: 全てのファイルの変更を戻す
Vim系メモ

## .vimrcの中身

```vim
syntax enable # シンタックスハイライトがつく
set number # 行番号がつく
set cursorline # 現在の行に下線がつく
```

だいたいここの移動系を覚えておく
[http://qiita.com/merrill/items/9c800030333ab4c9408f](http://qiita.com/merrill/items/9c800030333ab4c9408f)
Emacsとコマンドライン編集

EmacsはUnixを始めてからずっと(20年くらい)使っている。
自分が特に便利と思うのは、コマンドライン編集との親和性が高いこと。

以下、コマンドライン編集とEmacsのキーバインドについてまとめてみた。
"C-v"と書いた時はコントロールキー(Ctrl)を押しながらvキーを押す
ことを意味するとする。
説明はコマンドライン編集の挙動を書いている。

1) C-a	カーソルを行頭に移動
2) C-b	カーソルを一文字戻す
3) C-e	カーソルを行末に移動
4) C-f	カーソルを一文字進める(既に行末にある場合は何もしない)
5) C-h	カーソル左の一文字を削除
6) C-k	カーソルから行末まで(カーソル位置を含む)を削除
7) C-m	リターンキー
8) C-n	コマンドヒストリを戻る(最近のヒストリであれば何もしない)
9) C-p	コマンドヒストリを遡る
10) C-@,C-w　C-@とC-wで指定した文字範囲を切り取る
11) C-y 6)や10)で切り取った範囲をペーストする

どうだろう。殆どEmacsのキーバインドとクリソツではないか。
なのでEmacsに習熟するとことは即ちコマンドライン編集に
習熟していることと同義であることがお分かり頂けると思う。

ちょっとしたワンライナーなコマンドの編集などで役に立つと思う。

というわけでEmacsサイコーである。(これが言いたかった)
Perl関係のメモ

## Mouseの使い方
子モデルと親モデル
親モデル-->子モデルを読み込む  
親モデル名が`HOGEHOGE`、
子モデル名が`fugafuga`とした場合

親->子

```pl
use Mouse;

my @CHILD_MODELS = qw(fugafuga)
for my $child (@CHILD_MODELS) {
    my $class = Plack::Util::load_class($class, "HOGEHOGE");
    $child =~ s/::/_/g;

    has decamelize($child) => (
        is      => "ro",
        isa     => $class,
        default => sub {
            my ($self) = @_;
            $class->new(foo => $self);
        },
        lazy    => 1,
    );
}

no Mouse;

...

# 子モデルをnewするとき
my $fuwafuwa = HOGEHOHE::FUGAFUGA->( foo => $self );
# 子供の子供をnewするとき
my $hogehoge = Model::Hogehoge->new;
my $child = $hogehoge->child
```

子->親

```pl
use Mouse;
has hogehoge => (
    is       => 'ro',
    isa      => "HOGEHOGE",
    required => 1,
    weak_ref => 1,
);
no Mouse;
```

## 関数からハッシュや配列を返り値にしたいとき

* 同一モデル内のみならばそのままでも大丈夫
* 他モデルからの呼び出しがあるならリファレンスにしたほうが事故りにくい
* というかハッシュはほぼほぼリファレンスで使う

```pl
sub hogehoge {
    ...
    my @result;
    ...
    return \@result;
}
 ```

こうするぐらいなら↓

```pl
my %result = (
    hogehoge => 'fugafuga',
    );
return \%result;
```

こうしたほうがいい↓

```pl
my $result = {
    hogehoge => 'fugafuga',
};
return $result;
```

ハッシュをそのまま使う例

```pl
my hoge = (
    name  => "name",
    date  => dddd,
);

...->new(
    id => hurihuri,
    %hoge, # 中身がそのまま展開される
);
# ↑のは↓のと同じ
...->new(
    id    => hurihuri,
    name  => "name",
    date  => dddd,
);
```
## データを表示するいろいろ
* `use Data::Dumper;`: リファレンスとかも全部展開して見れる。ただ、全部展開するので、モジュール全体が展開されると訳がわからなくなるので注意
* `use DBIx::QueryLog;`: 実際に投げられたクエリを見れる。ただ全部見れてしまうので、見たいところの近くに`print "-------------------------\n"`をいれておくと見やすい

### Data::Dumperの使い方
* `Data::Dumper`で日本語を表示する

 ```pl
 use Data::Dumper;
 {
     package Data::Dumper;
     sub qquote { return shift; }
 }
 $Data::Dumper::Useperl = 1;
 ```

### DBIx::QueryLogの使い方
* `use DBIx::QueryLog;`と書くと発行されたクエリが出力される
* 一部のクエリのみ見たいときは

 ```pl
 use DBIx::QueryLog();
 DBIx::QueryLog->enable;
 # 該当の範囲
 DBIx::QueryLog->disable;
 ```
GoogleCloudVisionに利用する写真の向きと認識対象

何やらStackOverFlowを見ていて、「同じ環境で同じデータなのに結果が変わる」とか「数日後解析したら結果が変わってた」等々、まだベータ版らしさを見せてくれているのでこの投稿も時間が経ったらあっさり直ってるかもしれませんが、気づいたTIPSをば。

# 向きに注意
普通にデジカメで撮った写真をbase64変換して読ませてたんですが、どう見ても「６」なのに、「９」って認識するケースがありました。
縦写真だったので、「ああ、これはEXIFのorientationが悪さしてるな」とすぐ気づけたので、対処としては画像をEXIF情報なしでも正常にOS上で表示されるように書き換え。

画像情報としては横向きなのに、OSのビューワーがEXIFを使ってうまいこと縦向きに修正して表示してくれるので、普段気付きにくいんですよね。

この辺も自動的にやってくれたら楽なんですが、リクエストパラメータにLatLngがあるのを見ても、多分EXIF解析までは今後もやる気がないと推測。
正式リリース時にどうなってるかな〜

# 認識対象に注意
TEXT_DETECTIONにて、ある写真で文字列A、B、Cが写っているのにAしか認識されなかった時。
解像度的にはBもCもはっきりしているのに何で認識してくれないのか？

ということでB、Cを同じ解像度で別写真として切り出すと、きちんと認識してくれました。

どうやら解像度で認識可能かどうかを判別しているというより、写真全体の中での比として目立つサイズの文字しか認識してくれないようです。

ということは、矩形で文字が写っているところを切り出してリクエストに送るような真似をしないと、「全部認識したい」というニーズには答えてくれないんですかね。

一枚の写真サイズが４MB制限なので、その中の認識可能なもの全て分析してたらパフォーマンス的に厳しい、とか、「そんな目立たない文字、認識しなくてもいいでしょ？」という思想があるとか、色々ありそう。
これも正式リリース時にどうなってるか期待！
ていうかその時には自分でTesseract的にトレーニングデータ登録できる機能があったら嬉しいんだけどなぁ。
覚えたいコマンド類メモ

## コマンド類のメモ

```bash
$ lsof -n -P -i :{portnumber}  
$ lsof -n -P -i :5000
COMMAND     PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
perl5.18. 20051 xxxxxx    4u  IPv4 0xc066d6eb152d987f      0t0  TCP *:5000 (LISTEN)
```
* killするなら

```bash
$ kill PID
$ kill 20051
```

* 過去のコマンドの履歴を参照したいなら

```bash
Ctrl + r
```

* カレントディレクトリ以下のcsvファイルのエンコードを調べる

```bash
$ find . -name "*.csv" | xargs nkf --guess
```
 - `xargs: unterminated quote`とでる場合
 
```bash
$ find . -name "*.csv" -print0 | xargs -0 nkf --guess
```

* カレントディレクトリ以下のcsvファイルのエンコードをUTF-8に変換する

```bash
$ find . -name "*.csv" | xargs nkf -w --overwrite
```

## bash_profileのメモ

```vim:~/.bash_profile
alias grep='grep --color=auto' # grepつけた結果に色がつく
alias ll='ls -la'
alias la='ls -a'
alias listen='lsof -n -P -i` # listen :5000みたいに使う
alias gc='git branch | peco | xargs git checkout'　 # ブランチ名をインクリメンタルサーチしてチェックアウトできる
# peco内でのカーソル移動はemacs（Ctrl+n,Ctrl+pで動く）
```

## Atomのコマンド達
* `cmd + R`: そのファイル内の関数検索
* `cmd + Shift + R`: プロジェクト内の関数検索
* `cmd + T`: ファイル名検索
petalinux > Link > BSP for ZedBoard

ZedBoard用のPetaLinux BSP

http://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2014-4.html

> PetaLinux 2014.4 Board Support Package for the Avent/Digilent ZedBoard 

取得したBSPからの作業は以下 (下記リンクはZedBoardでなくmicroZedの例)
http://qiita.com/7of9/items/49f705c5b51c7c7c91a2
フロントエンドの設計から実装まで〜設計編〜

フロントエンドの設計から実装までした時に考えたことやコードをまとめていく。

今回は設計思想について

デザインパターンは`Flux`を使っていますが、基本的な思想部分はどのデザインパターンでも変わらないと思います。

GitHub→[angular_flux_study](https://github.com/takeokunn/angular_flux_study)(まだ研究中)

前提知識として読んでおいて欲しい記事→[エンジニア視点から見るWebサービスの全体像](http://qiita.com/takeokunnn/items/9b0bcdde411b94775a5f)

## 設計したものを誰が使うのか

以前書いた記事
[WebAPIの設計から実装まで〜設計編〜](http://qiita.com/takeokunnn/items/5442bb266fee6ee07799)
[WebAPIの設計から実装まで〜実装編〜](http://qiita.com/takeokunnn/items/c119e576a6c04d37e098)
では、設計したものを使う人は「サーバーサイドエンジニア」のみだったのでただただ拡張性や安全性を意識すればいいだけだったのだが、フロントエンドにおいては様々な人が開発に携わるので話が違ってくる。誰がどんな目的で開発に携わるのかを以下にまとめてみた（筆者の想像だが）。

- デザイナー、マークアップエンジニア

`HTML`,`CSS`などブラウザに表示される部分(`View`)のコードを書く。動きをつけるために`jQuery`など`javascript`のライブラリを少々使う。

- フロントエンドエンジニア

`javascript`などでロジック部分を書く。具体的には、`Ajax`などを用いて`WebAPI`を叩いたり、`Routing`を制御したり、キーボード制御をしたり、`View`にデータを渡したりする。パフォーマンスのチューニングもフロントエンドエンジニアの仕事だろう。

- 企画マーケティングなどの非エンジニア

「ここの文字を大きくしたい」や「この画像を少し小さくしたい」といった細かいデザインの修正をデザイナーに頼まずに自分で修正したい人

ここで何が言いたかったかというと、「全員が全員プログラミングに対しての知識があるわけではない」ということだ。

### 非エンジニアでもなるべく楽に環境構築できるように努力する

「`WebAPI`を構築して、`フロントエンド`を構築してようやく開発環境が整う」といった状態だとエンジニアならサクサクできるのでいいのだが、非エンジニアにとっては非常に難易度の高い問題になってくるだろう。そのようなつまらないことで貴重な時間を奪うのはもったいない。擬似`WebAPI`を構築して`WebAPI`の構築時間を減らしたり、一通りのパッケージを自動でインストールできるようにスクリプトを書いたりして、全体の労力を最小限にする努力をするべきだ。

### ファイル分割をきちんとする

ファイル分割することは非常に大事だ。その理由はたくさんあるが、以下の理由が挙げられるだろう

* 見通しが良くなるため、ソースコードのデバッグが楽になる
* 機能拡張がしやすい
* どこに何があるか把握しやすくなる
* 非エンジニアが自分がどのファイルをいじればよいかわかりやすくなる
* コンフリクトが起こりにくくなる

コンフリクトが起こりにくくなるという点について説明すると、ファイル分割をやらないと複数人で同じファイルを弄るケースが多くなってしまうからだ。ソースは`Git`で管理することが予想されるが、いちいち`fetch`して`merge`してコマンド叩いて・・・・という作業をしなければならない。これは非エンジニアには非常に負担になるだろう。

## フロントエンドのデータフロー

下図のように設計した
![スクリーンショット 2016-05-29 12.21.07.png](https://qiita-image-store.s3.amazonaws.com/0/125325/7cd6eae2-4aed-80bb-342b-2298643f752b.png)

フローを説明すると、
1. `View`で`User`からの動作を受けるとその動作に対しての`Action`が呼ばれる
2. `Action`は`Dispatcher`に`event`とパラメータを渡す
3. `Dispatcher`にはあらかじめ`event`とその`callback`の`Store`の処理を保存しておく
4. `Store`では`WebAPI`との通信を主にし、その結果を`View`に投げる

具体的なことは実装編で書きます。

`FLUX`についてもっと知りたかったら以下のサイトを見ると理解が深まると思う。
[GitHub(facebook/flux)](https://github.com/facebook/flux)
[Hacker Way: Rethinking Web App Development at Facebook(youtube)](https://www.youtube.com/watch?v=nYkdrAPrdcw)

### FLUXを選んだ理由

フロントエンドはサーバーサイドより遥かにテストしにくいという欠点がある中で、どうやったらデバッグが楽になるかということを考えたときに、それぞれの処理を単純明快にすることが一番の近道だと思う。`FLUX`は「データが一方向に流れる」と言ったデザインパターンだ。`FLUX`を使うことによってどの処理でどのようにバグが出たのかということを特定するのが簡単になる。

また、`View`とロジックを切り分けることができるので非プログラマとの連携が取りやすくなると思う。

## 最後に

試行錯誤して学んだ知識なので間違いがあるかもしれないし、さらに良い設計方法もあるかもしれません。
コメントで批判していただけると嬉しいです。
LESS CSS の スマホ/ PC分岐メディアクエリを簡潔に書く (Bootstrap ブレイクポイント対応)

私がよくやる例です。

Bootstrap で、 sm サイズでブレイクさせる想定です。

HTMLファイルが読みやすいと、非エンジニアが扱う時も理解しやすいかなと。


共通定義

```less:common.less
@-screen-sm: 768px;

@sp-only-max: (@-screen-sm - 1);
@pc-only-min: @-screen-sm;

@sp: ~"(max-width: @{sp-only-max})";
@pc: ~"(min-width: @{pc-only-min})";

.visible-pc {
  @media @sp {
    display: none;
  }
  @media @pc {
    display: auto;
  }
}

.visible-sp {
  @media @sp {
    display: auto;
  }
  @media @pc {
    display: none;
  }
}
```

インポートして使う側

```less:site.less
@import "common.less";

h1 {
  font-size: 20px;
  @media @pc {  // ←読みやすい
    // PCで見た時は文字を大きく
    font-size: 50px;
    padding: 20px 0;
  }
}

```

HTMLで使う

```html:index.html

<h1>タイトル</h1>

<h2>The quick brown fox <br class="visible-pc" />jumps over the lazy dog.</h2>

<p class="visible-sp">
  こんにちは。
</p>
```
MacでPepper SDK for AndroidStudioを試してみる＆ハマったこと

# はじめに

## Pepper SDK for Android Studio (Beta)

https://developer.softbankrobotics.com/jp-ja/downloads/pepper
2016/05/19に発表された `Pepper SDK for Android Studio` ですが、
Linux版とWindows版のリンクはあるのにMac版がなく、どこかにも以下のような記述がありました。

```
※Pepper SDK for Android Studio は現在WindowsとLinuxのみ対応しています。Mac版はありません。
```

しかし、以下の記事にもあるように、どうやらMacでも動かせるようです。
[Macでも動いた　Pepper SDK for Android Studio](http://qiita.com/h2m_kinoko/items/d87f9169461526578781)

更に以下の記事も参考にして、Hello World を試しました。
[Pepper SDK for Android Studioを使ってみた](http://qiita.com/Enta/items/a6217bb07d56421a3a03)

お二方ともすんなり動いていたようですが、私はちょっとだけ上手くいかなかった・・・

# 開発環境

(投稿時点のほぼ最新のはず)

- OS X El Capitan
    - 10.11.5
- Android Studio 2.1.1
    - Android SDK Tools: 25.1.6
    - Android SDK Platform-tools: 23.1
    - Android SDK Build-tools: 23.0.3

# セットアップ

Pepper SDKのプラグイン等のセットアップ方法は、
既に記事にしてくださっている方がいらっしゃいますのでそちらをご参照ください

# ハマり点

## その1 (プロジェクト作成)

いつものminSDKである `Android 4.4(API Level 19)` で作ったところ以下のエラー
![20160529122010.png](https://qiita-image-store.s3.amazonaws.com/0/53393/fae000d1-184e-d0ed-d3c8-c9017b41383f.png)
[Get Android SDK and Build-Tools](https://android.aldebaran.com/doc/installation.html#get-android-sdk-and-build-tools) にも、
`API 22` をインストールする手順になっていたのでこうなる気はしていました。minSDKを変更して解決

## その2 (Sayが使えない)

`import com.aldebaran.qi.sdk.object.interaction.Say;` がimportできない

[declaring-qisdk-dependency](https://android.aldebaran.com/doc/api.html#declaring-qisdk-dependency) を参考に以下を追加して解決

```groovy:build.gradle
maven {
    url 'http://android.aldebaran.com/sdk/maven'
}
```

```groovy:app/build.gradle
compile 'com.aldebaran:qisdk:0.7'
```

# これで動いた！

```java:MainActivity.java
import com.aldebaran.qi.sdk.object.interaction.Say;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Say say = new Say(MainActivity.this);
        say.run("Hello ChibiPepperoid!");
    }
}
```
django-filter: DateField のレンジ検索


- [alex/django-filter](https://github.com/alex/django-filter) ([doc](https://django-filter.readthedocs.org/en/latest/))
- YYYY-MM も受け付ける。Fromはその月の初日、 To はその月の最終日。

## フォームフィールド

- django_filters.widgets.RangeWidget をそのまま使って From , To の入力フィールドを出す
- フィールドはforms.CharField

~~~python
from django import forms
from django_filters.widgets import RangeWidget
from datetime import date, timedelta
import re


class DateRangeField(forms.MultiValueField):
    widget = RangeWidget

    def __init__(self, *args, **kwargs):
        fields = (
            forms.CharField(),
            forms.CharField(),
        )
        super(DateRangeField, self).__init__(fields, *args, **kwargs)

    def find_date(self, datestr, find_last=False):
        if not datestr:
            return None
        year, month, day = [
            i and int(i) for i in
            (re.split(r'\D+', datestr) + [None, None, None])[:3]]
        if not year or not month:
            return None
        month = min(12, max(1, month))
        year = min(9999, max(1, year))
        any_day = date(year, month, day or 1)
        if find_last and not day:
            # dayが指定されていなくて最終日を探す
            any_day = (
                any_day.replace(day=1) + timedelta(days=32)
            ).replace(day=1) - timedelta(days=1)
        return any_day

    def compress(self, data_list):
        ''' 必須: slice(start_date, stop_date)を返す
        '''
        if data_list:
            start = self.find_date(data_list[0])
            if data_list[1]:
                stop = self.find_date(data_list[1], True)
            else:
                stop = None
            return slice(start, stop)
        return None
~~~        


## フィールドフィルター

~~~python
import django_filters
from . import fields

class DateRangeFilter(django_filters.RangeFilter):
    field_class = fields.DateRangeField
~~~


## モデル & モデルフィルター

~~~python
class Bulletin(BaseModel):
    issued_at = models.DateField(
        null=True, default=None, blank=True)
    ....
~~~

~~~python
class BulletinFilter(django_filters.FilterSet):
    issued_at = DateRangeFilter()

    class Meta:
        model = models.Bulletin
~~~
javaでズンドコゲッター

#概要
javaでズンドコゲッターやってみた。
#実際
https://paiza.io/projects/dD2c-v2-W5UlxA2nInvAjQ
#サンプルコード
```
import java.io.*;
import java.net.*;

public class Main {
    public static void main(String[] args) throws Exception {
        int zunCount = 0;
        while (true) 
        {
            String word = zundoko();
            System.out.print(word);
            System.out.print(" ");
            if (word.equals("ズン")) 
            {
                zunCount++;
            }
            else if (zunCount == 4)
            {
                System.out.print("キ・ヨ・シ！");
                break;
            } 
            else
            {
                zunCount = 0;
            }
        }
    }
    private static String zundoko() throws Exception {
        URL url = new URL("http://ohijs0.paas.jp-e1.cloudn-service.com/zundoko");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStream stream = connection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "utf8"));
        StringBuilder builder = new StringBuilder();
        String line = "";
        while ((line = reader.readLine()) != null) 
        {
            builder.append(line);
        }
        return builder.toString();   
    }        
}
```
MSYS2でdein.vimがうまく働かない問題

msys2上にvim環境を構築しようと奮闘していたところ、なかなかうまくいかなかったので、解決方法をココに記します。

#問題発生
vimのプラグインマネージャーとして最近流行りのdein.vimを選んだ私ですが、公式のドキュメントに従って各種プラグインをインストールしようとすると、どうもうまく行きません。  
プラグインのインストールディレクトリ(~/.cache/dein/repos/github.com/ など)にはちゃんとプラグインの実体がcloneされているのに、vimのコマンドとして登録されていない。
これはどうしたことかと、２日間ほど頭を悩ませていました。

#解決
結局、原因はdeinのプラグインのインストールに必要なrsyncがmsys2には初期状態ではインストールされていないということでした。
この場合はpacmanでrsyncを入れてやればいいだけのことなので簡単です。

```
pacman -S rsync
```
このあと、各種プラグインをもう一回インストールすると無事使えるようになりました。
再インストールするには、deinのインストールされているディレクトリ(~/.cache/dein等)自体を削除して、deinのインストールからやり直したほうが手っ取り早いです。
【PowerShell】全角⇔半角相互変換

```ps1:半角→全角
Add-Type -AssemblyName Microsoft.VisualBasic
using namespace Microsoft.VisualBasic

$narrow = "wide_case"
$wide = [Strings]::StrConv($narrow, [VbStrConv]::Wide)

$wide #=> ｗｉｄｅ＿ｃａｓｅ
```

```ps1:全角→半角
Add-Type -AssemblyName Microsoft.VisualBasic
using namespace Microsoft.VisualBasic

$wide = "ｎａｒｒｏｗ＿ｃａｓｅ"
$narrow = [Strings]::StrConv($wide, [VbStrConv]::Narrow)

$narrow #=> narrow_case
```

* PowerShell 5.0から`using namespace`が使えるようになった。それより前のバージョンでは、クラスを使用するときは完全装飾名でなければならない。
* `Add-Type`コマンドレットは、PowerShellで使用できるクラスを増やすコマンドレット。アセンブリ名を指定すれば、そのアセンブリ内のクラスが使えるようになる。他にもC#やVisualBasicのコード（メソッドだけでも可）からクラスを生成したり、DLLファイルのパスを指定してクラスを追加することができる。多機能。

上記コードのコマンドレット版

```ps1
Add-Type -AssemblyName Microsoft.VisualBasic

function ConvertTo-Wide
{
    param
    (
        [Parameter(ValueFromPipeline=$true)]
        [string]
        $String
    )

    process
    {
        [Microsoft.VisualBasic.Strings]::StrConv($String, [Microsoft.VisualBasic.VbStrConv]::Wide)
    }
}

function ConvertTo-Narrow
{
    param
    (
        [Parameter(ValueFromPipeline=$true)]
        [string]
        $String
    )

    process
    {
        [Microsoft.VisualBasic.Strings]::StrConv($String, [Microsoft.VisualBasic.VbStrConv]::Narrow)
    }
}
```
300-400円ぐらいで、Arduino UNOのChina cloneを購入してみた。


# 購入サイト

Facebookで紹介されているのを見て、試しに購入。利用したのは[AliExpress](http://ja.aliexpress.com/item/Free-shipping-high-quality-UNO-R3-MEGA328P-CH340G-for-Arduino-Compatible-NO-USB-CABLE/1967735193.html)、今回初めて利用。Alibabaグループなので大丈夫だろうって感じ。

![arduino_aliexpress.png](https://qiita-image-store.s3.amazonaws.com/0/4779/8b0ef063-7f18-93c3-5915-ff049db1ab6e.png "arduino_aliexpress.png")


# 価格

2個までは送料無料。1個$2.47(1$=110円として、272円)
今回、5個購入したので、送料込みで$19.82。1個$3.96。(同じく436円)

```
5個  $12.35($2.47 * 5)
送料	 $7.47
合計 $19.82
```

# 無事届いた

5月初旬に発注して、約20日で届きました。
1個ずつ包装してあり、見た目問題なし。

![IMG_6021 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/db967eb0-e653-c5bb-6f96-7107da4c0abc.jpeg "IMG_6021 (1).jpg")



Arduino UNO正規品だと、[スイッチサイエンス](https://www.switch-science.com/catalog/789/)で3240円+送料なので、正規品に比べるとかなり安い。
後で、気づいたが、Amazon.co.jpで[同じ製品と思われるもの](http://www.amazon.co.jp/dp/B018VYJIEU)が送料無料で1個520円。配送期間が7-15日かかると記載があるので、これはそんなに変わらない。
なので、急ぎでない人は、今回のサイトで、送料無料の範囲内で1個$2.47で予め購入しておくとよい。

以前、[8pinoやATTinyを紹介した](http://qiita.com/snumano/items/540b4b13fe2d922e8842)が、300円前後で、Arduino UNO cloneが使えるのは魅力。実験用には最適。

# ハマりポイント

ハマった所は1点。
購入したUNO cloneを、MacBook AirでUSB接続したが、Arduino IDEで認識せず。

![arduino_china.png](https://qiita-image-store.s3.amazonaws.com/0/4779/4ce0c02d-a2a5-a388-818d-27496ba51d93.png "arduino_china.png")

調べると、今回のcloneのUSB-Serial変換ジュールが正規品と異なるため、専用のdriverをinstallする必要があるとのこと。
たしかに手元のcloneもCH340という型番がみえる。
(CH340用は見つからなかったので)CH341用のdriverをMBAにinstallして、MBAを再起動し、Arduino IDEでUSBが認識された事を確認

![arduino_china2.png](https://qiita-image-store.s3.amazonaws.com/0/4779/3c08cc9d-8f0b-f5b8-8c4e-999679b6e2c1.png "arduino_china2.png")


そして、sampleのBlinkにて、無事コンパイル・cloneへの書き込みができる事を確認できました。

# まとめ

* 下記のような方にはおすすめです。
	* Arduinoでいろいろ遊びたいけど。1個3000円はまだ高いなと感じている方。
	* いろいろ試したいので、複数台必要な方。
	* 壊す可能性が高いので、手元に数台置いておきたい方。
* 私は、servo接続端子付きのArduino UNOの安価なものを引き続き探します。[sainsmart](http://www.amazon.co.jp/dp/B00BPISRWE)で約2000円。


# 参考

http://www.instructables.com/id/How-to-fix-bad-Chinese-Arduino-clones/
http://0xcf.com/2015/03/13/chinese-arduinos-with-ch340-ch341-serial-usb-chip-on-os-x-yosemite/
bundle install で lib8 や therubyracer のインストールでエラーが出る場合、libv8 をアップデートする

# TL;DR

`bundle install` で lib8 や therubyracer のインストールでエラーが出る場合、以下のコマンドを実行する。

```sh
$ bundle update libv8
```

# 困ったこと

`bundle install` でエラーがでるわでるわ。

```sh
An error occurred while installing libv8 (3.16.14.13), and Bundler cannot continue.
Make sure that `gem install libv8 -v '3.16.14.13'` succeeds before bundling.
```

```sh
An error occurred while installing therubyracer (0.12.2), and Bundler cannot continue.
Make sure that `gem install therubyracer -v '0.12.2'` succeeds before bundling.
```

エラーメッセージでググっても、試行錯誤したログがノイズになっている現状が在る。

# 解決策

自分の環境では、libv8 をアップデートしたら直った。

```sh
$ bundle update libv8
```

# おまけ

その後...。
Gemfile.lockに差分が発生している。この変更を元に戻しても、もう `bundle install` で失敗することは無い。

```sh
$ git diff Gemfile.lock
diff --git a/Gemfile.lock b/Gemfile.lock
index 194ea2a..641c049 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -306,7 +306,7 @@ GEM
     json (1.8.3)
     jwt (1.5.1)
     kgio (2.10.0)
-    libv8 (3.16.14.13)
+    libv8 (3.16.14.15)
     listen (3.0.6)
       rb-fsevent (>= 0.9.3)
       rb-inotify (>= 0.9.7)
```
SwiftアプリにFirebaseを入れてみた


先日リリースした下記のiPadアプリに Google I/O 2016で発表されたFirebaseのAnalyticsを導入したので、その手順を書きます。手順というほど難しくないけど。。。

Webページに自由に書き込めるBrowser Pencilを作った | aguuu
http://www.aguuu.com/archives/2016/05/browser-pencil/

Firebase用のconfigファイルを作ります。
Firebaseのコンソール画面（ https://console.firebase.google.com/ ）を開きます。
「新規プロジェクトを作成」で新しいプロジェクトを作成します。

![console.firebase.google.com-.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/72b1573a-c430-7319-cb3f-7d6e9ef70fb2.jpeg "console.firebase.google.com-.jpg")

プロジェクト名と国／地域を入力して、プロジェクトを作成します。

![console.firebase.google.com-.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/7637f77c-eeae-b64a-0fda-cf8705cf0cf0.jpeg "console.firebase.google.com-.jpg")

作成されたプロジェクトのAnalyticsを選択します。
今回はiOSアプリなので「iOSアプリにFirebaseを追加」を選択します。

![overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/4f7a28ed-182f-15ec-41e9-c5c432048138.jpeg "overview.jpg")

iOSバンドルIDはアプリに設定しているバンドルIDを入力します。
App Store IDはiTunesConnectにログインして該当のアプリ画面に記載されている、Apple IDを入力します。

![overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/5fc21327-c148-4e07-0652-a4840c200371.jpeg "overview.jpg")

これでConfigファイルが作成されるので、GoogleService-Info.plistをダウンロードして、アプリのプロジェクトに追加します。

![overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/0d8e2ce8-cdb3-5452-5462-6f2711709d94.jpeg "overview.jpg")

FirebaseはCocoapodに対応しているので画面の手順に従って `pod install` しておきます。

![overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/cddd6c24-7d62-d0eb-f8e9-d1a176c39f41.jpeg "overview.jpg")

最後に、手順どおりに AppDelegateファイルに追加して完了です。

![overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/8d4447dc-188b-5e98-d356-5fb8a9ffe93a.jpeg "overview.jpg")

これだけの設定で、Firebase Analyticsでは、アクティブユーザー、維持率のコホート分析

![スクリーンショット 2016-05-29 11.05.32.png](https://qiita-image-store.s3.amazonaws.com/0/4529/1b25695f-38cc-a137-0958-e505d1ca8ae4.png "スクリーンショット 2016-05-29 11.05.32.png")

アプリのバージョン比率、デバイス分析

![スクリーンショット 2016-05-29 11.06.12.png](https://qiita-image-store.s3.amazonaws.com/0/4529/02dc3ef6-59a5-399e-dff2-a2ba4685604a.png "スクリーンショット 2016-05-29 11.06.12.png")

初回起動、アプリ内課金数、OSアップデート、アプリアップデートなどの情報が取得できるようになります。

![events%2Foverview-dateRange=last30Days.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/542f926a-9abd-75e8-8cda-a234c3d5ee07.jpeg "events%2Foverview-dateRange=last30Days.jpg")

他にもFirebaseでは、Facebook、github、Twitterなどによるユーザー認証、プッシュ通知、データ保存、クラッシュレポートなどParse.comの代替となりうる機能が使えるようです。

導入は簡単なので是非使ってみてください。
MongoDBの環境もたった5分で構築できるCompose.io、試してみた

久々にComposeを再開。MongoDB気になったから試してみました。
http://qiita.com/azzeten/items/e9e09c3586c153916332
http://qiita.com/azzeten/items/29d27af282d9eb185f4a

MongoDB、あまり使ったことがなく、シャードしたりconfig立てたり、グーグル画像検索とかで構成図みると結構うげっってなるくらい複雑（なようにみえる）構成だったりもするわけですが、
Composeで数回クリックして５分程度で構築できました。
サーバ調達して、、インストール作業して、、というふうにやればたぶん数週間とか掛かるのかしら・・・それが5分で作れるってのはやっぱり便利。時間をお金で買ってる気分。

PostgreSQLと同じくらい手軽でした。
http://qiita.com/azzeten/items/a7a786701cf25ef1a087

## Compose.ioにアクセス
アカウント持ってる人はSingIn、持ってない人はfree trialのアカウントを作ってみます
https://app.compose.io/

## MongoDB作ってみる！
サイジングは自動で決めて、デプロイ！WhiteTigerとかも選べた。
![スクリーンショット 2016-05-29 11.07.06.png](https://qiita-image-store.s3.amazonaws.com/0/119378/82892314-8e77-8213-35f7-2da5f05259f1.png)


## 作られたのはこんな構成
**・configサーバは３台構成**
**・replica set内もarbiter交えてフェールオーバー可能になっている**
**・ユーザからのリクエストを受け付けるところもロードバランスするしかけ**
**・backupも自動でとってくれる**
といったような具合に、いい感じで作られているっぽいです。
Hướng dẫn copy dữ liệu từ docker container ra localhost


## Copy dữ liệu từ docker data volume ra localhost

**Show tất cả các container**

![Screen Shot 2016-05-29 at 10.59.25.png](https://qiita-image-store.s3.amazonaws.com/0/103998/1d5fb454-373d-4d58-2651-0407e3e14acd.png "Screen Shot 2016-05-29 at 10.59.25.png")

**Copy dữ liệu từ docker data volume ra localhost**

```
$ docker cp magento2_appdata_1:/srv/www ./code
```

## Sync dữ liệu giữa local và container

**mở file docker-compose.yml**

```bash
$ vim docker-compose.yml
```

**Sửa dữ liệu như bên dưới (thêm cái dòng ./code/vendor:/srv/www/vendor):**

```
appdata:
  image: tianon/true
  volumes:
    - /srv/www
#    - ~/.composer:/var/www/.composer
    - ./code/vendor:/srv/www/vendor
```

**Khởi động lại container để mount dữ liệu**

```bash
$ docker-compose up -d app
```

Khi đó thì dữ liệu đã được mount giữa thư mục /srv/www/vendor ở trong docker container và thư mục ./code/vendor ở localhost
【iOS】App Storeの審査で「メタデータ却下済み」を食らった

# 概要
iOSアプリを審査に出した際に、「メタデータ却下済み」という見たことのないリジェクトを食らったので、その際のやりとりや内容を残しておきます。

# 内容
時系列的には、
`In Review`になってから約10時間後に下記のようなメッセージが「問題解決センター（Resolution Center）」に届きstatusが`In Review`から**`Metadata Rejected`**に変更されました。

## Appleからのリジェクトメッセージ

```
2016年5月27日 11:01
差出人: Apple
Information Needed

Your iTunes Connect settings indicate that your app serves third-party advertisements. However, we were unable to locate ads in your app. 

Please reply to this message to provide the steps for locating third-party ads in your app along with the attached screenshots.

Next Steps

Since your iTunes Connect Application State is Metadata Rejected, we do NOT require a new binary at this time. Once you reply to this message in Resolution Center with the requested information, we can proceed with the review.
```

内容的には、

- **サードパーティ製の広告が提供されているようだけど、見つからないよ**
- **広告が見つけられる手順をスクショと一緒にこのメッセージに返信してね**
- **新しいバイナリは送らなくても、上記の情報を返信してくれれば審査続行するよ**

という感じですかね（英語は得意じゃないので、ニュアンスだけ、、）

とりあえず、クラッシュや規約違反によるリジェクトではないようなので、コードを修正して新しくアーカイブを作って、、という作業は必要なさそうです。

## Appleへの返信１

ということで広告が表示されている画面のスクショを撮って、下記のように返信を行いました。

この時点で、Appleからのメッセージの中の`the steps for locating third-party ads in your app`という言葉を拾っておらず、「とりあえず、広告が表示されてる画面のスクショを送ればいいか！」と思って、スクショと「スクショ貼ったから確認してください」という文言を添えて返信をしました。

```
2016年5月27日 20:49
差出人: taji-taji
Thank you for the review.

I've attached screenshots of when the app is to display the ad.

Please comfirm.
[IMG_7280.JPG]←添付ファイル
[IMG_7281.JPG]←添付ファイル
```

## Appleへの返信２

上記の返信後、「これでいいのかな？」と不安になり、もう一度Appleからのメッセージを読んでみたところ、何やら「広告が出る手順を教えて欲しい」というようなことが書いてあるのを発見しました。

そこで、アプリ起動から広告が表示される画面までの画面遷移をスクリーンショットに撮って、下記のようなメッセージを作成・送信しました。

この時点で、Appleからは返信は来ておらず、一方的に２通の返信を送った形になります。

```
2016年5月27日 22:18
差出人: taji-taji
I'm sorry. Steps were missing in my previous reply.
1. Tap the camera button on top-right.
2. Take photo to tap the button on bottom-center.
3. Wait a little before moving on to the next screen.
4. In The screen to edit attributes of taken photo, you can locate the ads on the bottom.
[screenshots of steps.zip]←添付ファイル
```

## Appleからの返信

```
2016年5月28日 9:48
差出人: Apple
Information Needed
Hello,

Thank you for providing this information. We will continue the review, and will notify you if there are any further issues.

Best regards,
App Store Review
```

２通目の返信を送ってから約半日後、上記のような返信が来て、無事審査へと戻りました。

その後の流れを時系列で表すと、

- *2016年5月28日 9:48* ：上記メッセージが届く
- *2016年5月28日 9:49* ：statusが`In Review`に戻る
- *2016年5月28日 9:54* ：statusが`Pending Developer Release`になる

という感じで返信が来てからはサクサク進んでいます。

また、審査に出した時点では、リリースの設定は自動リリースにしていたはずなので、`Pending Developer Release`のstatusに変わったのは、今回のメタデータ却下があったからなのかな？と思っていますが、正確にはわかっていません。


以上、初めての経験で、かつ拙い英語だったので少し不安でしたが、その後は特に問題もなく審査通過できたのでよかったです。

# 最後に疑問点

普通にアプリを触ってくれれば広告は出るはずなんですが、なぜ見つけられなかったのか？？
お手軽DeepLearning実施ツール　DIGITSのインストール手順 　実施メモ&翻訳

Ubuntu 14.04へのNvidia DIGITSインストール手順
githubの手順を実行した結果と翻訳
NvidiaのGPUを使っていてCUDAドライバーが入れば簡単です。

NVIDIA driver version 346 以降の
ダウンロードを下記のページから実施します。
使用しているGPUに合わせてドライバーをダウンロードして下さい。

http://www.nvidia.com/Download/index.aspx

下記コマンド実行しリポジトリの登録

```
CUDA_REPO_PKG=cuda-repo-ubuntu1404_7.5-18_amd64.deb &&
    wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/$CUDA_REPO_PKG &&
    sudo dpkg -i $CUDA_REPO_PKG
```

```
ML_REPO_PKG=nvidia-machine-learning-repo_4.0-2_amd64.deb &&
    wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1404/x86_64/$ML_REPO_PKG &&
    sudo dpkg -i $ML_REPO_PKG
CUDA repository
```




#DIGITSインストール

```
$ sudo apt-get update
$ sudo apt-get install digits
```

ローカルホストで起動しているので
アクセスすればDIGITSの起動がウェブで確認出来ます
http://localhost/. 

port 80 が既に使われている場合は
再設定する

```
% sudo dpkg-reconfigure digits
% cd /usr/share/digits

##コンフィグの再設定
% sudo python -m digits.config.edit -v

## サーバー再起動
% sudo stop nvidia-digits-server
% sudo start nvidia-digits-server
```

#driverインストール
新しいドライバー導入時はDIGITS実行中に入れると
CUDA関連エラーが発生するのでサーバーを停止した上で
ドライバーインストールしDIGITSを再起動する



参照ページ
github:
https://github.com/NVIDIA/DIGITS/blob/master/docs/UbuntuInstall.md
エンジニアはなぜ機能追加を拒むのか

運用中のプロダクトに新機能を追加するとき、エンジニアはまず相談を受けるはずです。

モダンなチームなら *リーンスタートアップ* や *スクラム* を駆使することで効率的にハックできますが、すべてのエンジニアがそんな環境にいるわけではありません。

これはエンジニア発想でチームをより健全にする、非エンジニア向けのテキストです。

# 悪魔との取引

エンジニアが拒んだ機能を強制的に実装したり、十分な相談もなく理解のない人だけで機能を決定することは、まさに悪魔との取引です。

その悪魔はあなたにとって甘い蜜をもたらします。しかし組織を疲弊させ、取引を忘れたころに重い足枷で束縛してきます。

モダンなチームならそんな危険な取引はしないと信じていますが、なぜ危険なのかは知っておくべきです。

では始めます。

# プログラムの作り方は 1 つではない

プログラムをよく知らないとしたら、あることを実現するためのプログラムは 1 つのパターンしかないと思うかもしれません。

そんなことはありません。

世界中のエンジニアが今でも、もっと良い、もっと正しい作り方を模索しています。

# プログラムとその他の製品との違い

ハンバーガーやワイシャツ、歯ブラシやヘッドフォンとの大きな違いは分かりますか？

形があるかないか、それも確かな違いです。

しかしチームにとっての明らかな違いは **作って終わりではなく変更し続けるもの** ということです。

# いいプログラムとは変更しやすいプログラム

ある機能を変更したいとします。

するとエンジニアが「その変更はできない」と言います。

でも大抵の場合、その変更は *技術的には* できます。

もしくは、*あなたの考えている 2 ~ 3 倍の工数でもよければ* できます。

だからこそその変更が無駄に終わらないように *リーンスタートアップ* を実践すべきですが、ここではその話はやめておきます。

もしもこのような不毛なやりとりが続いているとしたら、そのプロジェクトは次の課題を抱えているかも知れません。

## 変化に耐久できないコード

レガシーなコードや突貫で書いたコードによくあるのが **変化に耐久できない状態** です。

どんなプログラムが変化に耐久できないかというと、こんなプログラムがよくあります。

- 単機能が密に絡み合っていて、全体が奇跡のバランスでなんとか動いている。
- 似通った機能をコピーアンドペーストで複製し続けていて、変更箇所が無数に増えている。
- テストコード( テストを自動化するコード )が書かれていないので、正しい仕様が誰にも分からない。

このような状態のことを **技術的負債が貯まった状態** などと言います。

## 技術的負債は会社の負債

プログラムによって利益を得ているすべての企業にとって、技術的負債は実際に **負債** です。

なぜならば、プログラムを更新して利益向上を図るプロジェクトが、次第に長期化し、ことごとく遅延し、バグを生み、事業機会を逃す可能性を限りなく高め続けるからです。

エンジニアにとっても、技術的負債を放置し続けたプログラムを改変するという行為は、大きな精神的苦痛と体力的苦痛を伴います。そんな行為を強制されるとしたら、優秀なエンジニアは集まりません。

だから、技術的負債を減らして( =返済して )、変更しやすい *いいプログラム* を作る必要があります。

エンジニアが技術的負債の話を持ち出したら、それを聞き入れてください。

技術的負債から目を逸らすことは、**会社に無断で会社名義の借金をしていることと同じです**。

# 変更しやすいプログラムとは

端的に言えば、**抽象化** されたプログラムです。

# 抽象化とは

ある1つの機能のことだけを考えるのではなく、その機能の上位概念を考えるということです。

その上位概念の下位にあたるものとして、当初考えていた機能を当てはめます。

なぜそのような面倒くさい工程を踏むのか、それは当然、こうすることが **技術的負債を増やさないプログラムの作り方として強力** だからです。( 他にも様々な手法があり、エンジニアはそれらを組み合わせて使います )

## シチュエーションの例示

例えば、会員制のコミュニティサイトを運営しているとします。

会員のプロフィールは今までハンドルネームと写真、自己紹介だけでしたが、新たに「友だちを募集中かどうか」を表す機能を追加することになりました。

単純に考えれば、プロフィール情報に「友だちを募集している」というフラグを追加するだけで終わるでしょう。

しかしこの機能は次のように抽象化できます。

```
{ what } を { do } している
```

つまり、「仕事を募集している」という使い方や、「テーブルを探している」という使い方にも応用できます。

これはごく単純な抽象化ですが、非常に強力な抽象化でもあります。これだけで応用の幅が一気に広がることに気づくはずです。

もう少し簡単に、次のようにも抽象化できそうです。

```
{ want }
```

いま求めているものは何か、という機能になります。「友だち」や「仕事」はその中の 1 つになるでしょう。

応用の幅が広がるということは、将来の変更もしやすいことになります。

実際に変更する予定がないとしても、変更しやすい状態になっていることが重要です。[^attention__overspec]

[^attention__overspec]: オーバースペックなほど抽象化して複雑になったプログラムや、抽象化の方法を誤った場合も技術的負債となることに注意してください。

# 抽象化できない機能は将来の障害

例示したように抽象化ができれば良いですが、逆に抽象化できない機能というのは **将来の変更の障害** になります。

それこそがエンジニアが機能追加を拒む理由です。

理論上は抽象化できない機能はありませんが、**どう考えても 1 つの目的しかない機能** は事実上、抽象化できない機能と言えます。

不幸なことにそれは **根本的な問題を隠蔽するための機能** だったりします。本当にそれを優先すべきですか？

これらは技術的負債となり得る機能であり、会社の借金と同義ということを思い出しましょう。

# プログラムだけの話ではない

例示を見て、当初は「友だち募集中」を表示するだけの機能が、いろいろな使い方のできる機能へと昇華したことが分かりました。

この発想をエンジニアだけのものにするのは勿体無いはずです。

提案をブラッシュアップする過程にも使えるかも知れません。

# 悪魔を断ち切る

先述したようにプログラムは *変更し続けるもの* です。

そのことを理解すれば、技術的負債から目を逸らすことがいかに邪悪な行為か、分かるはずです。

今まで悪魔と取引していたことに気づいていなかったなら、今日はそれを断ち切る第一歩としてください。
Raspberry Piでプランターの水やりを自動化してみた

#概要
GROVEの土中水分センサーとADコンバータ(MCP3002)で土中に含まれる水分量を５分おきに計測し、水分量が閾値を下回ったら灯油ポンプを作動させ、水タンクから水を汲み上げてプランターに水をやるというのを作ってみました。

#回路図
![water_system_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/123845/cff29939-d958-8211-6ca2-bdd77ea3e5b0.png)

![IMG_3902.jpg](https://qiita-image-store.s3.amazonaws.com/0/123845/4e710e29-09ff-461f-64e6-93066c94ba99.jpeg)

#土中水分センサーの値を読み取る
水分センサーは水分量に応じた電圧（アナログ値）が出力されます。
Raspberry Piはデジタル入力しかできないので、ADコンバータでデジタルデータに変換して読み取る必要があります。今回はADコンバータにはMCP3002を使用しました。
Raspberry PiとMCP3002の接続は以下の記事を参考にさせていただきました。
[Raspberry PiにA/DコンバータMCP3002をつなぐ](http://qiita.com/f_nishio/items/4b9723c4e622a51aaeb5)

土中水分センサは以下の物を使用しました。
https://www.switch-science.com/catalog/814/
センサーはプランターに穴をあけて差し込んでいます。
![IMG_4033.jpg](https://qiita-image-store.s3.amazonaws.com/0/123845/18c20e45-c693-9280-37ad-8d131237282f.jpeg)


#灯油ポンプを作動させて水をやる

![IMG_4032.jpg](https://qiita-image-store.s3.amazonaws.com/0/123845/bed926fa-b2b1-4bcd-49b9-61ab5eb2c89e.jpeg)

水やりの部分は電動式灯油ポンプとGPIOを接続してGPIOをONにすることで灯油ポンプが作動するようにしています。
ただ、ポンプはモータが作動するのですが、Raspberry PiのGPIOでモータを動かそうとすると、電力不足に陥ってしまうので、灯油ポンプは最初からついている灯油ポンプの電池ボックスの電源で作動させるようにし、Raspberry Piからはリレースイッチの制御を行います。
Raspberry PiのGPIOをPythonで制御できるようにするには、以下の記事を参考にさせていただきました。
[GPIOでLEDの点滅(Python)](http://make.bcde.jp/raspberry-pi/gpio%E3%81%A7led%E3%81%AE%E7%82%B9%E6%BB%85python/)

#Pythonコード

５分おきに土中水分量を計測し、閾値を下回ったら灯油ポンプを30秒動かします。
水タンクが空になってしまっていた場合は、灯油ポンプを作動させても水分量が回復せず、また5分後に水をやろうとしてしまい、灯油ポンプの電池の無駄遣いになってしまうので、一度水をやったらその後しばらくは水やりをしないようにしています。

```water.py
import spidev
import time
import datetime
import subprocess
import RPi.GPIO as GPIO

wet_low = 450
water_check_enable = True
water_wait_count = 0
check_reset = 10


def write_log(log_text):
	f = open("/var/log/water","a")
	d = datetime.datetime.today()
	f.write (d.strftime("%Y-%m-%d %H:%M:%S" + "," + log_text + "\n" ))
	#print log_text
	f.close()

def read_wet_level():
	spi=spidev.SpiDev()
	spi.open(0,0)
        resp=spi.xfer2([0x68,0x00])
        value=(resp[0] * 256 + resp[1]) & 0x3ff
        write_log("wet_level:" + str(value))
        spi.close()
        return value

def water():
	write_log("***** water start *****")

	GPIO.setmode(GPIO.BOARD)
	GPIO.setup(16,GPIO.OUT)
	GPIO.output(16,True)
	time.sleep(30)
	GPIO.output(16,False)
	GPIO.cleanup()

	write_log("***** water end *****")

while True:
	wet_level =read_wet_level()

	if water_check_enable == False:
		water_wait_count += 1
		if water_wait_count > check_reset:
			water_check_enable = True
			water_wait_count = 0

	if wet_level < wet_low and water_check_enable == True:
		water_check_enable = False
  		water()
	time.sleep(300)
	
```