OmniAICreator/Qiita-1.07M huggingface dataset:
組込みC > A + B*n > A:unsigned long, Bとn:unsigned intの時のwrap around > 対策:掛け算の１つをキャストする

```txt:動作環境
とある組込みC (16bit MCU, C99 dialect, stdint.h不使用)
```

```c
#include <stdio.h>

void wrapAroundTest(void)
{
	unsigned long val;
	unsigned int coef_a = 36000;
	unsigned int num = 5;
	
	val = 300L + coef_a * num;
	printf("%ld\n", val);
}

int main(void) {
	wrapAroundTest();
	return 0;
}
```

上記の正解は180,300。

16bit MCUでunsigned intが16ビットの場合、coef_a * numの掛け算が65536でwrap aroundすることがある (IDEに依存?)。その場合は(36000 * 5) % 65536 + 300 = 48928 + 300になる。

### 対応

掛け算の１つだけを結果変数の型(unsigned long)にキャストする。

```c
#include <stdio.h>

void wrapAroundTest(void)
{
	unsigned long val;
	unsigned int coef_a = 36000;
	unsigned int num = 5;
	
	val = 300L + (unsigned long)coef_a * num;
	printf("%ld\n", val);
}

int main(void) {
	wrapAroundTest();
	return 0;
}
```

掛け算の全項目キャストが必要な状況があるかどうか?

### 関連

[INT18-C. より大きいサイズの整数との比較や代入を行う前に、整数式をそのサイズで評価する](http://www.jpcert.or.jp/sc-rules/c-int18-c.html)
> 次の解決法では、length オペランドを unsigned long long にキャストし、このサイズで加算を行っている。
App Engineのローカル開発サーバーdev_appserver.pyの使い方

App Engineのローカル開発サーバー`dev_appserver.py`でよく使うオプション。

#普通に起動。

`$ dev_appserver.py app.yaml`

`http://localhost:8080`で確認。管理コンソールは`http://localhost:8000`。

#datastoreの保存ディレクトリを指定して起動。

複数のプロジェクトを切り替えながら開発するときなどに混ざらないように。

`$ dev_appserver.py --datastore_path=.datastore app.yaml`

.（ドット）で始まるディレクトリ名にしておくとデプロイ時にスキップされます。
app.yamlのskip_files:で明示的に指定してもOK。

#ローカルホストのポート番号を指定して起動。

複数のプロジェクトを並行して開発するときなどdev_appserver.pyを複数起動したい場合。

`$ dev_appserver.py --port=8081 --admin_port=8001 --datastore_path=.datastore app.yaml`
# Dockerコンテナで起動。

公式のイメージを取得。いちばん軽量なAlpine linuxでの場合。

`$ docker pull google/cloud-sdk:alpine`

Dockerfileです。

```Dockerfile
FROM google/cloud-sdk:alpine

MAINTAINER syousei

RUN gcloud components install app-engine-python

RUN mkdir /app_source
VOLUME /app_source

EXPOSE 8000:8000 8080:8080
```

ビルドします。

`$ docker build -t syousei/appengine-python:alpine .`

Dockerコンテナ内からgcloudコマンドを使えるようにしたい場合は認証を通します。
このコマンドを打つと表示されるURLをブラウザで開いて認証トークンが表示されたらそれを打ち込むと認証されます。

`$ docker run -ti --name [DOCKER CONTAINER NAME] syousei/appengine-python:alpine gcloud auth login`

ランします。

`$ docker run -it -v C:\Projects\[PROJECT NAME]\app_source:/app_source -p 8080:8080 -p 8000:8000 --name=[DOCKER CONTAINER NAME] syousei/appengine-python:alpine`

dev_appserver.pyを起動します。

`$ docker exec -itd [DOCKER CONTAINER NAME] dev_appserver.py --host 0.0.0.0 --admin_host 0.0.0.0 --datastore_path=/tmp/datastore /app_source/app_dev.yaml`



以上です。
Laravel5 $validatorとエラー

### 自分用にメモ

``` :controller
      $validator = $this->validator($request->all(), $validationArray);
      if ($validator->fails()) {
        dd(
          '1)$validator:',$validator
        , '2)$validator->errors():',$validator->errors() //よく使う。
        , '3)$validator->errors()->all():',$validator->errors()->all() //配列になる。あんまり使えない？
        , '4)$validator->errors()->first("number"):',$validator->errors()->first('number') //viewにエラーメッセージ出す用
        , '5)$validator->messages():',$validator->messages() 
        );
      }
```
      


### 結果
```
"1)$validator:"
Validator {#294 ▼
  #translator: Translator {#298 ▶}
  #presenceVerifier: DatabasePresenceVerifier {#297 ▶}
  #container: Application {#3 ▶}
  #failedRules: array:2 [▶]
  #messages: MessageBag {#300 ▶}
  #data: array:13 [▶]
  #files: []
  #rules: array:3 [▶]
  #after: []
  #customMessages: []
  #fallbackMessages: []
  #customAttributes: []
  #customValues: []
  #extensions: []
  #replacers: []
  #sizeRules: array:4 [▶]
  #numericRules: array:2 [▶]
  #implicitRules: array:8 [▶]
}


"2)$validator->errors():"
MessageBag {#300 ▼
  #messages: array:2 [▼
    "number" => array:1 [▼
      0 => "「電話番号」は必須です"
    ]
    "email" => array:1 [▼
      0 => "「Email」は必須です"
    ]
  ]
  #format: ":message"
}


"3)$validator->errors()->all():"
array:2 [▼
  0 => "「電話番号」は必須です"
  1 => "「Email」は必須です"
]


"4)$validator->errors()->first("number"):"
"「電話番号」は必須です"


"5)$validator->messages():"
MessageBag {#300 ▼
  #messages: array:2 [▼
    "number" => array:1 [▼
      0 => "「電話番号」は必須です"
    ]
    "email" => array:1 [▼
      0 => "「Email」は必須です"
    ]
  ]
  #format: ":message"
}
```
ちょっとずつ読むドメイン駆動設計 MartinFowlerによる序文1

# 人が作る　人が使う
>
人間の行う入り組んだ仕事を何らかのかたちで自動化しようとすれば、ソフトウェアはそこにある複雑さを避けて通ることができない。できるのは、コントロールすることだけだ
(序文より)
>

人間の複雑な仕事をソフトウェアにするのだから、それは複雑になるよね。という話。
それを人が作り、人が使うのだから、なおさら。
その複雑さをどうコントロールするかというのがドメイン駆動設計のテーマ。

この点はXPとかアジャイルとかDevOpsとか、モダンな開発手法が解決するべき問題とも共通するテーマだと思う。

実際、本書に寄せられた賛辞にてRalphJohnsonも
>
この本はXPと相性がいい
>

と述べています。

設計と開発手法は切っても切り離せない。
zshでC-pしたときfgが履歴に出ないようにする

# TLDR

下記を`~/.zshrc`に書いておくと、`C-p`したとき`fg`と`bg`が履歴に出なくなる。

```zsh
# fgとbgを完全に無視したC-p
_up-line-or-history-ignoring() {
    zle up-line-or-history
    case "$BUFFER" in
        fg|bg)
            zle up-line-or-history
            ;;  
    esac
}
zle -N _up-line-or-history-ignoring
bindkey '^P' _up-line-or-history-ignoring
```

以下のように`hist_ignore_space`を設定する方法はよく紹介されているが、

```
setopt hist_ignore_space    # スペースで始まるコマンドを履歴に残さない
alias fg=' fg'
```

これだと`fg`の直後に`C-p`した場合`fg`が現れてしまう。先述の設定では現れない。

# 背景など

こちらの記事を参照：
[edit-compile-runサイクルを快適にする方法](http://qiita.com/aosho235/private/624bca4d7f983593d410)


# 代替案：zshのソースを修正する方法

次のように修正すれば一応希望通りになった（簡単な動作確認しかしていない）。

```c
--- zsh-5.3.1/Src/hist.c        2016-11-30 04:52:09.000000000 +0900
+++ zsh-5.3.1.changed/Src/hist.c        2017-08-08 21:14:52.596666658 +0900
@@ -1449,7 +1449,7 @@
        if (chwordpos <= 2)
            save = 0;
        else if (should_ignore_line(prog))
-           save = -1;
+           save = 0;
        else if (hookret == 2)
            save = -2;
        else if (hookret)
```

しかしzshをコンパイルするのはさすがに面倒。

ちなみにこのソース、`hend()`という関数がいつ呼ばれるのか、グローバル変数`chwords`の意味などよく分からなかった。
gdbでもデバッグしてみようと思ったのだが、zshは端末を操作するためかうまくいかないところがあった。
Nuclide の File Tree でファイルの追加・削除のショートカットキーを設定する

Nuclide の File Tree で `a` (ファイル追加)、`shift-a` (フォルダ追加)、`m` (リネーム)、`d` (削除) のショートカットが使えないのがすごく不便だったので、設定したときのメモ。あと、`j` (上)、`k` (下)、`h` (左)、`l` (右) も設定。Nuclide の File Tree では、全部入力した文字でファイルを絞って行く `go-to-letter-` に割り当てられてる。

`~/.atom/keymap.cson` に、以下を追加。

```
'.nuclide-file-tree':
  'ctrl-cmd-a': 'nuclide-file-tree:add-file'
  'ctrl-shift-cmd-a': 'nuclide-file-tree:add-folder'
  'ctrl-cmd-m': 'nuclide-file-tree:rename-selection'
  'cmd-d': 'nuclide-file-tree:remove'
  'ctrl-cmd-j': 'core:move-down'
  'ctrl-cmd-k': 'core:move-up'
  'ctrl-cmd-h': 'core:move-left'
  'ctrl-cmd-l': 'core:move-right'
```

`cmd + .` で key binding のデバッグができるので、それを見ながら、他と重複しないように設定すれば OK。

アクションは、`nuclide-file-tree/lib/FileTreeController.js` が参考になる。
POSTでリダイレクトしたい

POSTでリダイレクトしたかったので調べてみた。
結論としてはリダイレクトというよりも、別関数呼び出し的な感じ

## はじまり
#### ①LaravelのvalidationエラーはGETでリダイレクトするらしい

```php:Controller
          $this->throwValidationException(
              $request, $validator
          );
```
#### ②そんなgetURL無いよエラー
やりたいのはGETじゃなくてPOSTなんだよ！

## やり方
呼び出したいビューに繋がる関数を呼ぶ。
ただし、そのままではビューを呼び出せないのでview(関数の戻り値)をreturnする

```
    //【①呼び出したい関数】
    public function postDetail(Request $request)
    {
      $req = $request->all();

      //(途中省略)

      return view('after.detail')->with('question_title' , $ank->title)
    }

    //【②リダイレクトが発生する関数】
    public function postAfter(Request $request)
    {
      $req = $request->all();
      $validator = $this->validator($request->all(), $validationArray);
      if ($validator->fails()) {
        $test1 = $this->postDetail($request);
        return $test1;
      }

      //(以降、正常時の処理)

    }
```

``` 参考:$test
View {#303 ▼
  #factory: Factory {#203 ▶}
  #engine: CompilerEngine {#302 ▶}
  #view: "after.detail"
  #data: array:7 [▶]
  #path: "/xxxx/resources/views/after/detail.blade.php"
}
```
tracepathの経路非対称判定

# 概要

Linuxのtracepathコマンドが経路非対称をどのように判定しているのか説明する。

# tracepathの経路非対称判定とは

tracepathは指定したアドレスに宛ててパケットを送信し、その経路上でパケットを中継するホストのアドレスを列挙する。つまり、自ホストから投げた測定パケットの経路(往路)が出力される。

tracepathは更に、パケットを中継するホストから自ホストへ戻ってくる応答パケットの経路(復路)が、往路と異なっていることを検知して出力できる。

実はこれはちょっとすごいことで、コマンド一つで分かってしまうのはいい感じだよな、と思うわけ。

### 実行例

以下はとあるホストからとあるホストへ向けてtracepathを計測した時の例。IPアドレスは伏せてある。TTL6で投げたパケットに対して、`asymm  7`という出力が出ておりこれが経路非対称、つまりパケットの往路と復路が異なっていることを示している。TTL8以降も同様だ。

ちなみに`asymm 7`は、その機器からの応答パケットがTTL7相当だったという意味。

```
$ tracepath -n ???.???.???.???
1?: [LOCALHOST]     pmtu 1500
 1:  ???.???.???.???   0.893ms
 1:  ???.???.???.???   0.912ms
 2:  ???.???.???.???   0.793ms
 3:  ???.???.???.???   0.295ms
 4:  ???.???.???.???   0.402ms
 5:  ???.???.???.???   0.528ms
 6:  ???.???.???.???   1.244ms asymm  7
 7:  ???.???.???.???   0.733ms
 8:  ???.???.???.???   3.181ms asymm 13
 9:  ???.???.???.???   3.458ms asymm 12
10:  ???.???.???.???  10.047ms asymm 13
11:  ???.???.???.???   8.276ms asymm 12
12:  ???.???.???.???   9.553ms asymm 13
13:  ???.???.???.???  11.716ms asymm 14
14:  ???.???.???.???  11.943ms asymm 15
15:  ???.???.???.???  13.631ms asymm 16
16:  ???.???.???.???  11.050ms pmtu 1454
16:  no reply
17:  no reply
^[^C
```

# tracepathはどのように経路測定しているか

tracepathが経路非対称を検出している方法を理解するためには、前提としてtracepathがどのように(往路を)経路測定しているかを理解する必要がある。

tracepathは以下の様にして経路を測定する。

1.　測定対象に宛ててTTL1のUDPパケット(宛先ポート番号はランダム)を送出する。
2.　TTL1のパケットは直上のルータにてTTLが切れる。ルータはそれをtracepathに通知する応答(ICMP time exceeded)を返す
3.　返ってきた応答の送信元を見ることで直上のルータのIPアドレスを取得する
4.　測定対象に宛ててTTL2のUDPパケットを送出する(*1)
5.　同様にして応答が得られ、経路上の次のルータのIPアドレスを得る
6.　以後同様にしてTTLを1ずつ増やしながら測定対象に到達するまで繰り返す

(*1)この時宛先ポート番号は変更しておく。応答のICMP time exceededには送出したUDPパケットのSRCおよびDSTのポート番号が記載されるため、以前に送信したパケット(のDuplicate)に対する応答パケットと区別ができるようになる。CentOS7で確認したところポート番号は+1していた。

ICMP time exceeded以外にも別の応答を得る場合があるのだけれどもここでは省略。

# 経路非対称の判定方法

さて、ここまでで往路は測定することができた。次に復路に関する情報をどこから得るかといえば、当然tracepathに返される応答パケットである。

我々がアクセスしているのは太古の昔のインターネットではないので、応答パケットに経路を書き込んで返せというやり方は使用できない。ではどうしているのかというと、応答パケットのTTLを見て判断している。

応答パケットのTTLは、応答の送信元ルータで値を設定され、経路上のルータで1ずつ減らされてからtracepathへ届く。だから応答の送信時のTTLが分かれば、受信した応答パケットのTTLと引き算をすることで復路のホップ数を得られることになる。ところがTTLは応答の送信元ルータが自由に値を設定するので、送信時のTTL値はtracepathには分からないのだ。

そこで、IMCP time exceededがTTLは64、128、255のいずれかで送出される事(が多いの)を利用して、tracepathは経験上うまくいくやり方で推測して復路のホップ数を推測している。

往路と復路とでホップ数が異なれば、それは当然経路が非対称である、ということは判断できる。この場合に`asymm NUM`という出力が行われるわけだ。

# 経路非対称の誤判定と機器の推測

応答パケットのTTLを見て判断する方法は、当然ながら誤判定の可能性がある。応答パケットの送出時にTTLが予期しない値に設定されていた場合には正しく判定できないからだ。

実際、[ここ](http://kb.pert.geant.net/PERTKB/TracePath)によれば、 Juniper M/TシリーズのルータはTTL255ではなくTTL254で送出するので、tracepathは経路非対称であると誤判定するとのこと。

逆にインターネットのバックボーンに近い部分で往路と復路のTTLが1だけ異なるasymmが出力された時には、そこにJuniperがいる、と推測できそうだ。

上記の実行例でもTTL6の行など複数の箇所で1だけTTLとasymmの値が異なる出力があるので、Juniper M/Tシリーズが使われているのかもしれない。
火星12号

#概要
火星12号、グアムの軌道をシュミレーションしてみた。
ライブラリーは、PyRockSim。

#写真
![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/2ca61dc0-ba4f-5f14-8cbf-0178522dec85.jpeg)


#成果物
http://jsdo.it/ohisama1/qLz3
Linuxでキャッシュを追い出す方法

Linuxでキャッシュをクリアしたい時に使える。
root権限が必要。

```
# sync
# echo 3 > /proc/sys/vm/drop_caches
```
echoする数字は1～3があり、

1． ページキャッシュ
~~2．ダーティーキャッシュとinode
3．ページキャッシュ、ダーティーキャッシュ、inode~~
~~「1」が読み込みに、「2」が書き込みに関連してそう。~~
※8/23追記※
間違えた理解をしていたので修正しました。
dentriesをdirtyと読み間違えるとか恥ずかしいですが指摘してくれた方に感謝です。
[kernel.org](https://www.kernel.org/doc/Documentation/sysctl/vm.txt
)内のドキュメントを見ると「2」はslab領域()の開放とのこと。

```
To free pagecache:
	echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
	echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
	echo 3 > /proc/sys/vm/drop_caches
```
slab・・・・kernelがdentry等をキャッシュするために使うメモリ領域。
※slabについては[こちら](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s2-proc-meminfo.html)を参照しました。

dentryは「ファイル名やディレクトリ階層構造を管理するデータ構造」ということぐらいしか理解できず。別の機会に調べるということで。[こちら](http://monoist.atmarkit.co.jp/mn/articles/1010/06/news107.html)を参照。

※追記ここまで※




とりあえず「3」を指定しておけば良さそう。
※これが使用できるのはkernel2.6.6以降とのこと。
rootでスクリプト作成しておいて、SUID付けておけば便利そう。


rootが使えない環境はmemhogコマンドなどで対応。

マシンのメモリ搭載量よりも大きくmemhogしてしまうとoom(out of memory)キラーが発動してOSが落ちる可能性があるので注意。

以下は500MBのメモリ領域をクリアした例。ギガの時は「g」とか指定。

```
$ memhog 500m
..................................................

```
レゴブロックでエレベーター作った

日本Androidの会秋葉原支部ロボット部　熊秀創吉

[]( scale=0.3 )![LegoELV正面](https://qiita-image-store.s3.amazonaws.com/0/195351/a74cdbc3-4f78-968d-22ad-4a514beba11a.jpeg)

レゴブロックで作った、4階建てのエレベーターです。

[]( scale=0.1 )![LegoELV側面]("https://qiita-image-store.s3.amazonaws.com/0/195351/d1e63287-7028-3f67-b18d-b68d0227f502.jpeg")

昇降用、扉開閉用の2つのモータで動作します。Scratchなどをつかって動作のプログラムができます。

[]( scale=0.1 )![LegoELV後方]("https://qiita-image-store.s3.amazonaws.com/0/195351/af233eeb-c7b1-fcda-8f27-b32e3d531871.jpeg")

ウラ面です。単3電池が見えますが、これは電源ではなくカウンターウェイトとして設置しています。

# 構成

概略図（仮)です

[]( scale=0.5 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/58699b4f-8d20-a2dc-9627-80e7888a3ee1.jpeg)


2つのモーターは、ちっちゃいものくらぶのArduino互換ボード「なのボードAG」に定番のモータードライバIC,東芝ＴＡ７２９１Ｐを使っています。

モータドライバとなのボードAG

[]( scale=0.2 )![モータドライバとなのボードAG](https://qiita-image-store.s3.amazonaws.com/0/195351/6dcdcf56-26db-408c-0c36-638f9e7bb261.jpeg)


# エレベータ扉の開閉


[]( scale=0.6 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/1d17c0a7-6142-71df-6ac9-726b8ef3156e.jpeg)

カゴの扉開閉は回転ボリュームを用い、アナログポートに接続しています。

カゴ扉開閉用モーターとVRセンサー

[]( scale=0.1 )![カゴ扉開閉用モーターとVRセンサー](https://qiita-image-store.s3.amazonaws.com/0/195351/c46a57f2-2418-4800-0b5e-d46c13aabbc1.jpeg)

カゴ扉開閉歯車

[]( scale=0.1 )![カゴ扉開閉歯車](https://qiita-image-store.s3.amazonaws.com/0/195351/036d9eff-7256-67a3-f641-b2f38be55d4c.jpeg)


## 扉センサ配線
LEGOエレベータ―ですが扉センサーのNanoBoardAGへの配線ですがA7pinですが
NanoBoardAGの回路図見るとスライダセンサーはA6となってました。

[]( scale=0.5 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/fcc4ddc0-0fae-74a2-9098-a2b378002c6b.png)

回路図がまちがってるのかな？よくわかりません

扉開閉センサーをAnalog7pinに接続した基盤とセンサーの接続ボリュームの位置によってはでショートすることが判明しました。




[]( scale=0.1 )![カゴ扉各階扉連動爪ー開]("https://qiita-image-store.s3.amazonaws.com/0/195351/370a9d0f-139b-b952-3807-2972c04a218c.jpeg")


[]( scale=0.1 )![カゴ扉各階扉連動爪ー閉]("https://qiita-image-store.s3.amazonaws.com/0/195351/f84319a4-9e32-f827-0f9e-1c070c2c228d.jpeg")



[]( scale=0.1 )![カゴ側面](https://qiita-image-store.s3.amazonaws.com/0/195351/024633ec-6b6e-43c0-876b-5182fda4a0cd.jpeg)

# 昇降メカ


[]( scale=0.1 )![昇降用モーターと圧着タイヤ](https://qiita-image-store.s3.amazonaws.com/0/195351/76d438d2-a505-1907-4981-97b8edabfc83.jpeg)


[]( scale=0.1 )![カウンタウエイトと階検出マイクロスイッチ]("https://qiita-image-store.s3.amazonaws.com/0/195351/7146ea75-b16f-dbad-dc7f-f28d8dbc19cc.jpeg")


[]( scale=0.1 )![ロープ長さ調整ドラム](https://qiita-image-store.s3.amazonaws.com/0/195351/5254e4db-04ad-3e77-53bc-2f1a62494736.jpeg)


# カウンターウェイト

カウンターウェイト

[]( scale=0.1 )![カウンタウエイト]("https://qiita-image-store.s3.amazonaws.com/0/195351/bd0b6d0a-6aa2-5e2c-2b0e-05e7ed9f548f.jpeg")


カゴ配線ケーブル用滑車

[]( scale=0.1 )![カゴ配線ケーブル用滑車](https://qiita-image-store.s3.amazonaws.com/0/195351/39b5a28a-a373-cdbb-268a-1eee5f3b919d.jpeg)
Chromeアプリを自分で日本語化してみよう

#はじめに
Chromeウェブストアで配信されている拡張機能は、使いたいアプリが英語であることが少なくありません。
そのため、英語が分からず利用を断念しがちです。
でも、言語ファイルを操作すれば、英語で困ることもなくなります。
#自分が英語を知らなくても翻訳できる？
できます。自然語は期待できませんが、Google翻訳などを通せば簡単に日本語化できます。
#翻訳の準備
通常は、C:\Users\<ユーザー名>\AppData\Local\Google\Chrome\User Data\Default\Extensions\<拡張機能ID>\ に拡張機能があります。
そして、_localesフォルダに、en-usフォルダや、ja-jpフォルダに言語ファイルがあります。
![chrome-ext-dir.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/b4ea3bf1-55d6-3b45-f21c-09c8a80c976a.png)←これが拡張機能たちのフォルダ



しかし、こんなランダムな文字列なのに、どうやって特定の拡張機能だとわかるようになるのでしょうか。
そのときは、chrome://extensionsにアクセスして、IDを確認しましょう。
![chrome-ext-url.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/8edee740-449d-3611-5edd-185eaab94a2c.png)←URLを入力
![chromeExtID.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/9d47d45f-b8a7-365f-ee5c-e8fc596b12fc.png)
青で囲んだ部分がアプリのIDです。例えば、Googleドキュメントの場合は、aohghmighlieiainnegkcijnfilokakeだとわかります。
そこから先ほどのフォルダにアクセスします。すると、バージョン番号の名前のフォルダがでてきます。
![chrome-ext-folder.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/4d871d51-1944-7834-571a-e6b13fb39d96.png)
↑がバージョン番号のフォルダです。これを開きます。
![chrome-extMainDir.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/d3545520-bdc5-d6e7-e1f0-8a9e372780bc.png)

すると、ようやく拡張機能のファイルが出てきます。上に「_locales」というフォルダがあります。それを開きます。
![chrome-ext-localeDir.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/0b7fc42d-c409-9287-b963-0b79aff5606e.png)

すると、またまた、「bg」とか「en_US」とかいっぱいでてきます。
よくあるのは、「en_US」フォルダだけあるということです。
ここではen_USフォルダを開きます。
![chrome-ext-localeJSONdir.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/3618a886-ffe7-c239-0f60-316081885d6a.png)

すると、フォルダ内に「messages.json」があります。それを編集して日本語化します。
messages.jsonをAtomなどで開いてください。
![chrome-messagesJSON.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/5e5cb448-a2ce-1695-07c5-e064fc3f3cc2.png)

これがmessages.jsonです。データ形式はJSONです。例としてはこうです。

```json:messages.json
 {
  "メッセージ名":{
   "description":"どんなメッセージなのかの説明",
   "message":"メッセージ本文"
  }
 }
```
あとはGoogle翻訳などを通してmessageキーの内容を翻訳します。
そして、翻訳できたら、保存するまえに、_localesフォルダに「ja」フォルダを新規作成します。
![chrome-locales-ja.PNG](https://qiita-image-store.s3.amazonaws.com/0/196404/67220f6b-fa91-ba31-2de2-03a7c54785af.png)

そこにmessages.jsonを保存してください。これで翻訳は完了です。
Chromeを開いている場合は一旦終了し、再度起動してください。すると、日本語化されているはずです。
PICAXE で Lチカ


日本Androidの会秋葉原支部ロボット部 関　昌充（Ｐ酒）



# ＰＩＣＡＸＥとは？

　簡単に言うと、ＢＡＳＩＣでプログラムできるＰＩＣなんですが、開発環境（ＰＩＣＡＸＥ　Ｅｄｉｔｏｒ）を使うと、ブロックプログラミングやフォローチャートでプログラムできます。


[]( scale=0.5 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/c2b6ee78-a01d-de5d-969e-d5c6928bf033.png)


ＰＩＣＡＸＥでＬチカ



# 簡単なプロトタイピング環境

[]( scale=1.0 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/a8e82ddd-9b5b-b380-9590-5d6aec5b89ab.png)



　これは５月７日（日）の「オープンハードカンファレンス 2017 Tokyo/Spring」で展示したものです。「ＰＩＣＡＸＥ－０８　プロトボード」のユニバーサルエリアにピンヘッダと小さなブレッドボードを付けただけなのですが、簡単な回路を作るには使えます。
　
（ＰＩＣＡＸＥ－０８　プロトボード）
　http://akizukidenshi.com/catalog/g/gK-06614/

　こんな感じです。

[]( scale=1.0 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/2ac36863-8025-9d3f-1175-0a68e1d5501c.png)

　ブレッドボードはピンヘッダに当たったので、耳？の部分を削っています。
　良く見るとブレッドボードが若干はみ出していますが、このくらいは許容範囲で(^_^;)

　これはアナログ入力に応じてＬＥＤの点滅速度が変化する作例で。冒頭のプログラム［ブロック］で動かしています。点滅速度が速いので３つのＬＥＤが光っていますが、遅くすると、１つずつ点灯します。


# 余談
　推奨は単三×３本なんですが、単三×２本でも動きます。
（プログラム時には確認していません。）


[]( scale=1.0 )![](https://qiita-image-store.s3.amazonaws.com/0/195351/4417ed08-c2e3-2e7e-7053-5d3de10ca592.png)
プレイヤーの頭を作りたいっていうメモ

# 内容
プレイヤーの頭を生成します。
使用例: GUIでのプレイヤー指定

# コード
```java
ItemStack item = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
SkullMeta meta = (SkullMeta)item.getItemMeta();
meta.setDisplayName(ChatColor.RESET + playername + " の頭");
meta.setOwner(playername);
item.setItemMeta(meta);
```

# 動作環境
Minecraft 1.11.2の環境で動作を確認しています。

# 解説
```java
ItemStack item = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
```
`ItemStack`を`頭`で生成します。
引数1: `Material.SKULL_ITEM`は頭のことです。
引数2: 個数です。
引数3: ダメージ値です。short型しか受け付けないのでキャストさせています。

```java
SkullMeta meta = (SkullMeta)item.getItemMeta();
```
`item`の`ItemMeta`をキャストさせて`SkullMeta`として`meta`に格納しています。

```java
meta.setDisplayName(ChatColor.RESET + playername + " の頭");
```
名前を指定します。
そのままだと斜体になってしまうので§rの代わりとなる`ChatColor.RESET`をつけています。

```java
meta.setOwner(playername);
```
**重要です。**
頭のスキンを指定します。
プレイヤー名が使用できます。

# おわりに
ここに記したコードではアイテムの生成のみで、プレイヤーに配布することは一切していません。
このあとにfor文を使って全体に配布したり、インベントリを生成して配置していくといった処理を入れていきましょう。
Google Mapsの現在地ボタンみたいなボタンを作ってみた

## こんなボタンを自力で作ってみました
上のボタンを作りました。下のボタンはgoogle mapsで提供されているやつです。比較のために置きました。
![floatingButton.gif](https://qiita-image-store.s3.amazonaws.com/0/158705/bf9fd0bf-401d-b192-830c-d67904ee53c4.gif)


## A. 画像を自分で作ったver

### 1. 影なしで丸白ボタンを作って、UIButtonのimageに配置しました
![Screen Shot 2017-08-10 at 3.12.50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/d091865b-8dcf-447d-4988-16e97996726c.png)

### 2. @IBActionを作る

クリックではなく、ボタンをホールドしているときは、
actionに　touch downを選んでください。
ボタンを離すときのアクションはtouch up insideです。
![Screen Shot 2017-08-10 at 3.18.05 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/c7869925-859b-8d36-d3ed-a0845a537390.png)

### 3.影をアニメーションで動かす

最初の影設定をviewDidLoadで設定しておきます。

```.swift
listButton.layer.shadowColor = UIColor.black.cgColor
listButton.layer.shadowOffset = CGSize(width: 2, height: 2)
listButton.layer.shadowRadius = 2
listButton.layer.shadowOpacity = 0.3
```

あとはアニメーションさせて影を調整しました。

```.swift
// Touch Down
    @IBAction func listBtnPressed(_ sender: Any) {
        
        UIView.animate(withDuration: 0.4, delay: 0, options: [],animations: {
         
            self.listButton.layer.shadowOffset = CGSize(width: 5, height: 5)
            self.listButton.layer.shadowRadius = 4
        },completion: nil)
        
    }

  // Touch up Inside
    @IBAction func listBtnRelease(_ sender: Any) {
        
        UIView.animate(withDuration: 0.4, delay: 0, options: [],animations: {
            self.listButton.layer.shadowOffset = CGSize(width: 2, height: 2)
            self.listButton.layer.shadowRadius = 2
        },completion: nil)
```


## B. ボタンの中のアイコンだけ画像にする場合

storyboardでボタンを作ってconstraintを作ったら、以下をviewDidLoadに追加すれば良い

```.swift
button.layer.cornerRadius = 0.5 * button.bounds.size.width
button.clipsToBounds = true
button.setImage(UIImage(named:"addList.png"), for: .normal)
```

画像を貼り付けているのと、角丸を作っています。
インベントリを編集できなくするためのメモ

# 内容
マイクラでインベントリ編集させたくない！って時に使えるものです。
例: 実績一覧などの編集すると不都合のある物など

# コード
```java
@EventHandler(priority = EventPriority.HIGHEST)
public void onInvClick(InventoryClickEvent e){
    Player p = (Player)e.getWhoClicked();
    e.setCancelled(true);
    p.updateInventory();
}
```

# 動作環境
Minecraft 1.11.2の環境で動作を確認しています。

# 解説
ここでは以下の部分だけ書くことにします。

```java
Player p = (Player)e.getWhoClicked();
e.setCancelled(true);
p.updateInventory();
```

```java
Player p = (Player)e.getWhoClicked();
```
`e.getWhoClicked()`で取得できるものは型`HumanEntity`なので、
型`Player`にキャストして格納しています。

```java
e.setCancelled(true);
```
イベントをキャンセルします。

```java
p.updateInventory();
```
**重要です。**
イベントを発生させた(インベントリをクリックした)プレイヤーのインベントリを強制的に更新します。
これを忘れると言葉では解説しにくい現象が発生します。

# おわりに
ここに記したコードではGUI上での一切の操作を受け付けません。
キャンセルをif文で囲んで条件をつけるのがモテる使い方ですよ(多分)
ubuntu16.04にnodeをインストール

#ubuntuのバージョンとか環境とか
ubuntu16.04
[linode](https://www.linode.com/)で契約したサーバー

#流れ
nodejsとnpmをインストール
npmからn　packageを導入する
nパッケージかkらnodejsとnpmをアプデート

```
sudo apt-get install -y nodejs npm

sudo npm cache clean
sudo npm install n -g

sudo n stable
sudo ln -sf /usr/local/bin/node /usr/bin/node
```

#確認
最後にインストールできたか確認
バージョンの確認ができればOK

```
node -v
```

実際にプログラムを書いて確認

```
echo "console.log('Hello World')" >~/test.js
node test.js
```

ちなみにtest.jsの中身は

```node:test.js
console.log('Hello world')
```
iTermでSSHの接続先によって背景色を変える

# 色を変える理由？

非常に簡単で、SSH先の本番サーバでやらかさないようにするため

ググって出てくるの(`iTerm SSH 接続先 背景色 変更`)、確かに色は変わるが元の色に戻すのが面倒だったり、微妙に違う色になるのでイライラする

-------

# で

![YIX8w4.png](https://qiita-image-store.s3.amazonaws.com/0/52439/3261bd65-12db-4a2a-9820-ddddddbf1ea8.png)

結論から言うとプロファイルスイッチを利用する

まず、 `iTerm2` -> `Preference` で設定画面を開く。

`Profile` タブをクリックし、現在使っているプロファイルを複製する。(プロファイルを選択し、下の歯車アイコンをクリックして `Duplicate Profile`)

名前をDefault含め、わかりやすい名前にする。(僕は `zsh`, `zsh_red`, `zsh_blue` のようにしている)

プロファイルのコピー・名前の変更が出来たら `Colors` タブを選び、好みのバックグラウンドカラーを選ぶ。

# おわったら

`.zshrc` を編集する。 bashは知らん。

```bash
function ssh_color() {
 case $1 in
   # product- から始まるところは背景を赤くする
   # staging- から始まるところは背景を青くする
   product-* ) echo -e "\033]50;SetProfile=zsh_red\a" ;;
   staging-* ) echo -e "\033]50;SetProfile=zsh_blue\a" ;;
   *) echo -e "\033]50;SetProfile=zsh\a" ;;
 esac
  ssh $@
  echo -e "\033]50;SetProfile=zsh\a"
}

alias ssh='ssh_color'
compdef _ssh ssh_color=ssh
```

ミソは `compdef _ssh ssh_color=ssh` で、これをしないとコマンド補完が効かなくてmacを破壊したくなる(したくなった)

編集し終わったら `$ source .zshrc` する。

これでマッチしたホスト名に対応するプロファイルが読み込まれ、終わったらデフォルトプロファイルに戻るので幸せになる。

# さいごに

ちなみに 対象ホストSSHで接続しながらプロファイルの色を触りながらでも色のプレビューが効く。

------

[iTerm2で快適な環境作り | エディタ | DoRuby](https://doruby.jp/users/kisuzuki/entries/iTerm2で快適な環境作り) が割と内容同じということに今更気づいたが、補完効かなさそうと思ったので投稿する

ブログに書いたのをそのまま持ってきた https://my.iesaba.com/posts/iterm-ssh-color
【Mac】〜環境構築〜Ruby編


 [前提編](http://qiita.com/kanikani2929/items/eb43ef297594e57ef972 "前提編")が終わっていることが条件です。
 Homebrewのインストールが終わってない方は、 [前提編](http://qiita.com/kanikani2929/items/eb43ef297594e57ef972 "前提編")を参考にインストールしてください。

##1. Homebrewをアップデートする。
```
$ brew update
```

##2. rbenvをインストールする。
```
$ brew install rbenv ruby-build
```

##3. rbenvがインストールできているのか確認する。
```
$ rbenv --version
```
バージョンが出てきたらOK。

##4. PATHを指定
```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> .bash_profile
$ echo 'eval "$(rbenv init -)"' >> .bash_profile
$ source .bash_profile
```

##5. インストール可能なRubyを確認する。
```
$ rbenv install -l
```

##6. Rubyをインストールする。 
```
$ rbenv install ◯.○.◯
```
◯.○.◯には、工程4で確認したリストで表示されたバージョンを記入してください。

##7. 使用するRubyのバージョンを指定する

グローバルでバージョン指定する場合。

```
$ rbenv global ◯.○.◯
```
ローカルでバージョン指定する場合

```
$ rbenv local ◯.○.◯
```
◯.○.◯には、工程5でインストールしたバージョンを記入してください。

##8. Bundlerをインストール
```
$ gem install bundler
```
ローカル環境を汚さないためにもgemはBundlerで管理してください！
linuxのsarコマンド

sarコマンドについて少し調べたのでメモ。

###sarコマンドとは?
Linuxでシステムの負荷状況などをモニタリングするコマンド。
主に以下の情報が取得できる。

- CPU使用率(user,system,iowait,idle)
　CPUが何に時間を使っていたか
　アプリ、カーネル、ディスクへの書き込み
- メモリ使用率(空き容量、使用率、キャッシュ使用率など)
- Disk負荷状況(read,write)
- NW負荷状況(パケット送受信)

sysstatのバージョンによりけりでCPU温度、CPUクロック周波数なんかも見れるらしい。


###sarコマンド実行

基本的には以下のようにコマンド実行。
```
sar <オプション> <情報取得間隔(秒)> <情報取得回数>
```
情報取得回数は省略可。その場合はctrl + Cとかで止めるまで情報取得し続ける。

主なオプションは以下。　
特にこだわりがなければ「-A」で取得しておけば間違いない。

|　オプション　|　内容　|
|:----------:|:----------:|
|-A|全ての情報を取得|
|-P ALL |CPUの情報|
|-r|メモリの情報|
|-n DEV|ネットワークの情報|
|-d|ディスクの情報|
|-o <ファイル名>|アウトプットファイルを指定|

 
コマンド最後の数字は"1秒間隔"で"5回取得する"という意味。
最後の数字はなくても大丈夫。その場合はずっと情報取得し続ける。


###CPUの情報を取得

```
$ sar -P ALL -o sardata 1 5

Linux 4.9.32-15.41.amzn1.x86_64        07/04/2017      _x86_64_        (1 CPU)

01:22:52 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:22:53 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:22:53 PM       0      0.00      0.00      0.00      0.00      0.00    100.00

01:22:53 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:22:54 PM     all      0.00      0.00      1.00      0.00      0.00     99.00
01:22:54 PM       0      0.00      0.00      1.00      0.00      0.00     99.00

01:22:54 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:22:55 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:22:55 PM       0      0.00      0.00      0.00      0.00      0.00    100.00

01:22:55 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:22:56 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:22:56 PM       0      0.00      0.00      0.00      0.00      0.00    100.00

01:22:56 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:22:57 PM     all      0.00      0.00      0.99      0.00      0.00     99.01
01:22:57 PM       0      0.00      0.00      0.99      0.00      0.00     99.01

Average:        CPU     %user     %nice   %system   %iowait    %steal     %idle
Average:        all      0.00      0.00      0.40      0.00      0.00     99.60
Average:          0      0.00      0.00      0.40      0.00      0.00     99.60
```



###取得した情報を後から確認したい場合

 -fオプションでsarファイルを指定　※-oオプションで保存したファイル

```
sar -P ALL -f sartest

Linux 4.9.32-15.41.amzn1.x86_64       07/05/2017      _x86_64_        (1 CPU)

04:28:30 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
04:28:31 PM     all      0.00      0.00      0.00      2.00      0.00     98.00
04:28:31 PM       0      0.00      0.00      0.00      2.00      0.00     98.00

04:28:31 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
04:28:32 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
04:28:32 PM       0      0.00      0.00      0.00      0.00      0.00    100.00

```
bashで配列の数だけfor文を回す

bashで変数の要素数の分だけfor文を回したい時があったのでメモ。

```
$ export a=("kawakamasu1" "kawakamasu2" "kawakamasu3" "kawakamasu4" "kawakamas
u5")
#要素番号部分に"@"をつける
$ for i in ${a[@]};do echo $i;done
kawakamasu1
kawakamasu2
kawakamasu3
kawakamasu4
kawakamasu5
```
Pythonで逆ポーランド記法のプログラムを作りたかった(文字列を数値に変えられるかの判定)

# はじめに
今回，この記事を書いた理由なのですが，大学のテストにて
#### 「逆ポーランド記法で計算をするプログラムを作成しなさい」
という問題に対し．一つの部分でめちゃくちゃ手間取ったので，自分のメモ用にということで作成しています．

```RPN.py
def isnum():
  if int(hoge) == True:
    return 1

  else:
    return 0

def cal(operand,a,b):
  if operand == "+":
    return int(a)+int(b)

  elif operand == "-":
    return int(a)-int(b)

  elif operand == "*":
    return int(a)*int(b)

por=[]
por = list(input().split())

stk=[]

for i in por:
  if isnum(i) == int:
  #ここで手間取っていた
    stk.append(int(i))

  else:
    b=stk.pop()
    a=stk.pop()
    stk.append(cal(i,a,b))

print(stk[0])
```

```入力例.txt
1 2 * 3 +

1 2 3 4 - * 5 - +
```

テスト中，上手くメソッドを考えることが出来なかったので，調べることが出来ず．上のコメントの部分で手詰まりになっていました．

## どこが出来なかったのか
逆ポーランド記法は，オペランドと数字が入ってきます．つまり，「文字なのか」「オペランドなのか」という判別が必要になります．
上の `isnum` の関数の中で,入ってきた文字が int型の数字なのか，それとも文字型のオペランドなのかを判別する必要があります．

僕はここで，文字列が数字にキャストできるかどうか，という部分を実装できず，結局プログラムを組むことが出来ませんでした．

## 解決方法
`isdigit()`を使えばすべてが解決してくれるっぽい．isdigit()を使うと，それがint型に変換できるかどうかを返してくれます．

```isdigittest.py
word=["1","hato","1.0",""]

for w in word:
    print(w + " -> ",end="")
    print(w.isdigit())
```

出力
```out.txt
1 -> True
hato -> False
1.0 -> True
 -> False
```

こんな感じで文字列を，整数型にキャストできるかどうかを判別してくれます．これを使用すればなんでもできます．

実際にこれを使用して上のコードを書き直すとこうなります．

```RPN2.py
def cal(operand,a,b):
  if operand == "+":
    return int(a)+int(b)

  elif operand == "-":
    return int(a)-int(b)

  elif operand == "*":
    return int(a)*int(b)

por=[]

por = list(input().split())

stk=[]

for i in por:
  if i.isdigit() == True:
    stk.append(int(i))

  else:
    b=stk.pop()
    a=stk.pop()
    stk.append(cal(i,a,b))

print(stk[0])
```
### 変更点


```isnum.py
def isnum():
  if int(hoge) == True:
    return 1

  else:
    return 0
```

そもそもここの部分がいらない．isdigit() を使用すれば，この関数がいらなくなる．結局ワンライナーになれた．上のプログラムを実行すると，正しい答えを導くことが出来た．

```こたえ.txt
5

-6
```
Flask-WTF で FieldList, FormField を利用してフォームを複製する

Flaskでのフォーム作成にはFlask-WTFを利用するとWTFormのバリデーションの利用に加えてCSRFトークンを生成・検証してくれます。

- [Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/)
- [WTForm](https://wtforms.readthedocs.io/en/latest/)


フォームを表などで用意するときは行単位で複製できると便利なのですが、Flask-WTFでこれを行う場合は少し注意が必要です。
複製する子フォームではCSRFトークンを生成しないようにする必要があります。
<img width="455" alt="Screen Shot 2017-08-11 at 2.12.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/163756/93ff262e-0fb1-def7-84db-050c5d6d6bdc.png">

```app.py
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import FormField, FieldList, IntegerField, StringField, SubmitField
from wtforms.validators import Required

app = Flask(__name__)
app.secret_key = 'HardToGuess'

class MemberForm(FlaskForm):
    def __init__(self, *args, **kwargs):
        kwargs['csrf_enabled'] = False  # 子フォームではCSRFトークンが生成されないように設定
        super(MemberForm, self).__init__(*args, **kwargs)

    m_name = StringField('name', validators=[Required()])
    score = IntegerField('id', validators=[Required()])


class TeamForm(FlaskForm):
    members = FieldList(FormField(MemberForm, 'Member'), min_entries=2, max_entries=10)
    """
    FieldlistとFormFieldを用いて子フォーム複製
    """
    submit = SubmitField('送信')


@app.route('/', methods=['POST','GET'])
def index():
    form = TeamForm()
    print(request.form)  # チェック用
    if form.validate_on_submit():
        print('Validated')
        print(form.members.data)
    else:
        print('NOT Validated')
    return render_template('index.html', form=form)


if __name__ == '__main__':
    app.run(debug=True)
```

```index.html
<form action="" method="post">
    {{ form.csrf_token() }}
    <h1>Flask-WTF Fieldlistサンプル</h1>
    <table>
        <tr>
            <td>ID</td>
            <td>名前</td>
            <td>点数</td>
    {% for member in form.members %}
        <tr>
            <td>{{ loop.index }}</td>
            <td>{{ member.m_name() }}</td>
            <td>{{ member.score() }}</td>
        </tr>
    {% endfor %}
    </table>
    {{ form.submit() }}
</form>
```

`flask_wtf.FlaskForm` からではなく、 `wtf.Form`を継承して作成しても同じことができそうです。
ファイル読み込みの際に文字コード関係の例外が発生する場合(File#openの引数にはString#encodeのオプションが利用できる)


```rb
File.open("sample.rb", "r", :encoding => Encoding::CP932) do |file|
  file.each_line do |line|
    do_something(line)
  end
end
```

ファイル読み込み処理を行うと、頻繁に出くわすのがエンコード関係の例外。`Encoding::InvalidByteSequenceError `など、その名もずばりな例外はもちろんのこと、たとえば読み込んだ行に対して`line.split(",")`を実行したとたん、`ArgumentError`が発生するということもあります。

このような例外はたいていファイルに含まれる不正なバイトやや変換できない文字が原因です。ではそのようなバイトや文字を読み込んだ場合でも、例外を発生させるのではなく、あたかも正しいバイトや文字を読み込んだかのようにふるまわせるにはどうすればよいでしょうか? あけすけにいってしまうと――__ファイルの読み込み時に文字コード関係の例外を抑制するにはどうすればよいでしょうか?__

__実は`File#open`の引数として、`String#encode`のオプションを指定することができます。__これを利用しましょう。たとえば「読み込んだファイルに不正なバイトや変換不可能文字が含まれていた場合でも例外を発生させるのではなく、無視して処理を実行したい」というときには次のように書きます。

```rb
File.open("sample.rb", "r", :encoding => Encoding::CP932, :invalid => :replace, :undef => :replace) do |file|
  file.each_line do |line|
    do_something(line)
  end
end
```

この例では「不正な文字」は置換されるため、例外の発生が抑制されるのですが、一方で__情報が失われる可能性があることにも注意する必要があります。__ただし「ファイル処理のたびに`begin/rescue/retry`を書く面倒さ」「巨大ファイルの処理中に例外が起きたために最初からやり直さねばならない絶望感」そして「困難なデバックの結果、その例外が本質的ではないところで起きたことが分かった時のやるせなさ」などなどを勘案すると、情報を失うことを覚悟で「不正な文字」を捨ててしまうのがもっとも現実的だとは思います。

なお「`File#open`の引数に`String#encode`と同じオプションが指定できる」ことですが、`File#open`の「るりま」には明記されていません。「るりま」では`IO#open`にその旨が少し書かれているだけで、やや不親切なような気もしなくはない(´・ω・｀)

また__`csv`ライブラリにもファイルをCSV形式として開く`CSV#open`が用意されていますが、こちらのメソッドは`String#encode`と同じオプションを指定することはできません。__同じ名前なのにややこしい(´・ω・｀) したがって`CSV#open`を何も考えずに使っていると、文字コードがらみの例外が頻発することになります。

```rb
# この書き方だと「不正な文字」に出くわすと例外が発生する。
require "csv"
CSV.open("sample.csv", "r", :encoding => Encoding::CP932) do |csv|
  csv.each do |row|
    do_something(row)
  end
end
```

この対処法は実は簡単です。上述の例では`CSV#open`の引数にパス文字列を与えていますが、これを`File`オブジェクトに変更します。そしてこの`File`オブジェクトを生成する`File#open`メソッドの引数として、`String#encode`のオプションを指定すればよいというわけです。

```rb
# 2017-10-24: サンプルコードに誤りがあったため修正
# require "csv"
# File.open("sample.csv", "r", :encoding => Encoding::CP932, :invalid => :replace, :undef => :replace) do |file|
#   CSV.open(file) do |csv|
#     csv.each do |row|
#       do_something(row)
#     end
#   end
# end

require "csv"
File.open("sample.csv", "r", :encoding => Encoding::CP932, :invalid => :replace, :undef => :replace) do |file|
  CSV.parse(file) do |row|
    do_something(row)
  end
end
```

__★参考★__
- `File#open`: https://docs.ruby-lang.org/ja/latest/method/File/s/new.html
- `String#encode`: https://docs.ruby-lang.org/ja/latest/method/String/i/encode.html
- `IO#open`: https://docs.ruby-lang.org/ja/latest/method/IO/s/open.html
-  `CSV`: https://docs.ruby-lang.org/ja/latest/class/CSV.html
[クイズ]javascriptと仲良くなるための一歩　第２６話「eval」

#問題

このevalはA,Bどちらと同じになるでしょう？

```js
eval('{x:1}') //=> 1
```

・A

```js
x:1           //=> ?
```

・B

```js
{x:1}         //=> ?
```


:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

このevalはA,Bどちらと同じになるでしょう？

```js
eval('{x:1}') //=> 1
```

・A

```js
x:1           //=> 1
```

・B

```js
{x:1}         //=> {x: 1}
```

答えはA。
Ubuntu16.04で異常に不安定な無線ネットワークを改善する

「Ubuntuではネットワーク設定の「IPｖ６」という項目が、デフォルトで「自動」になっているが、そこを「無視する」に変更するだけで、安定する」らしい。

1. 右上のネットワークアイコンをクリック
2. 「Edit Connection」 をクリック
3. つなげている無線ネットワークを選択して、「Edit」をクリック
4. IPv6タブを選択
5. Methodを 「Automatic」 から 「Ignore」 に変更


Xubuntuでも大きな改善が見られた。


参考： http://lifeisbeatfull.com/3271.html
HTML5+CSS3でサイトを作ってみる

IE8とそれ以前はHTML5に対応していません。

html5でサイトを作ってみる。とどちらに載せようか迷いましたが、CSS3に関する記事もあるので IEに関する情報はこちらにまとめて掲載することにします。 HTML5やCSS3に適用させる方法は、日々新しいやり方が出ている気がしています。ここに掲載されている内容も、すぐに古くなるかもしれません。

ここではいくつかの方法をご紹介していますが、いくつかを併用したり、サイトの用途によって使い分けてもいいでしょう。

html5shiv

上記URLからファイルをダウンロードし、jsファイルを任意のディレクトリに置き、headに組み込むだけ。
旧バージョンのブラウザでもHTML5を認識しブロック要素として認識される。 この場合、IE9はhtml5対応なので、IE9未満に向けて設定する。

<!--[if lt IE 9]> 
<script src="js/html5shiv.js"></script>
<![endif]-->
[if lt IE 9] → IE9未満(IE9含まず)に対応
[If lte IE 9] → IE9以下(IE9含む)に対応
Normalize.css

上記からソースコードを入手して任意のディレクトリに設置。
ブラウザのスタイル初期値を設定する。 従来のリセットCSSと違い、ブラウザの初期値を維持しながらブラウザごとに起こりうるバグを回避するスタイルが組み込まれている。

Modernizr

下位バージョンを含むブラウザの機能実装差異を吸収したり、表示上の互換性を維持する。

html5.js

IE6-9でのCSS3表現を有効にする。
IE9.jsというものもあり、詳しくはこちらのサイトに解説がありました。

IEのバージョンごとにマークアップする

IE6-9でのCSS3表現を有効にする。

サンプルhtml
--[ HTML head内記述 ]------------------------
<!--[if lt IE 7 ]> <html class="ie6" lang="ja"><![endif]-->
<!--[if IE 7 ]> <html class="ie7" lang="ja"><![endif]-->
<!--[if IE 8 ]> <html class="ie8" lang="ja"><![endif]-->
<!--[if IE 9 ]> <html class="ie9" lang="ja"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!-->
<html class="" lang="ja"><!--<![endif]-->

--[ CSS ]------------------------
#main{
　/* 通常のスタイル */
}
.ie7 #main{
　/* たとえば、IE7用のスタイル */
}
meta要素の追加

以下を記述することで、IEの最新のレンダリングが適用されるようになるそうです。

<meta http-equiv="X-UA-Compatible" content="IE=edge">

from:https://socialtwi.me/infoeproduction/
設計の一貫性を重視しよう

ソフトウェアを設計するときには一貫性を重視しよう。

### **理由：一貫性のある設計は理解しやすい**
 STLが使われるようになって、独自実装のデータ形式よりもはるかに理解しやすくなります。独自仕様のリングバッファよりは、既存の枠組みを使って実装してくれている方が理解するのが楽になります。

　独自データ形式をC言語の配列で定義して、メソッドに相当するものを全て自力で実装した時代がありました。
この状況だと、自分でも理解しにくいものになりますし、ましてや他の人にとっては、理解不能なものになってしまいます。

 

### **理由：一貫性のある設計はインタフェースがそろいやすい**
 古くからあるライブラリでも、そのインタフェースを少しずつそろえていこうとする流れがあります。
　また、画像認識技術のモジュールを標準化しようとする動きOpenVXがあります。

### **理由：一貫性のある設計は利用しやすい**

### **理由：一貫性のある設計は無駄なデータ変換を生じない**

- [mm]と[cm], [m]の混在は避けるべきです。どの単位を用いているのかわかりにくくなるし、ドキュメンテーションコメントに書いてあったとしても、読まれるとは限りませんし、いつの間にかドキュメンテーションコメントと実装とが乖離していることだっておこります。それよりは、最初から一貫性のある実装をすることです。


### **理由：一貫性のある設計は矛盾を生じにくい**

経験則：一貫性を損なうモジュールを追加したときに、バグを生じやすい。


極力、最近の標準的なライブラリにしたがった流儀にしましょう。


### **理由：一貫性のある設計は、実装のしかたを間違えたときでも、何が間違いかを気づきやすい。**
　森で迷ったときに、森の外に出るためには、一貫性のあるやり方で外へ出ようとすることが大事で、「あっちがよかったんじゃないか、いやこっちだ」と右往左往するのは、外に抜け出す目的には適さないように思えます。

**物理が好きな人向けの説明**
　熱力学の第2法則、「ただ一つの熱源から正の熱を受け取って働き続ける熱機関（第二種永久機関）は実現不可能である。」であるという結論に達するためには、それが出来ると信じて試みた死屍累々とした数多くの努力が必要でした。「全ての熱エネルギーを仕事に変換できる」と信じて一貫性のある努力をすることによってのみ、「全ての熱エネルギーを仕事に変換できる」ことが無理なのではないかと気づきえるわけです。
　ですから、その手法が無理であると最後には結論付けなければならない場合でも、一貫性をもって設計すべきです。
　中途半端な考えでは、「全ての熱エネルギーを仕事に変換できる」のは可能なのか無理なのかいつまでたってもたどりつけないものだったでしょう。
Team AI 医療データハッカソンを開催しました(20170811)

Team AI 医療データハッカソンを開催しました。

![20645505_10211944733086729_4698184270593377094_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/76304/8d7ae70e-6c90-3b0f-fdb5-93c8786a5f4a.jpeg)

オーストラリア人、元製薬会社、医学部生、理工学部生、生命保険会社、IT会社、メーカー、商社、起業家、エンジニアの方交え、Kaggle上の医療データを分類・予測するAIモデルを一緒に構築しました。

トピック；

1)脳波のCSVデータ
波形の数値データから数学を解いている時とリラックスしている時それぞれの脳波トレンドを分類
SupportVectorMachineを使ったアプローチのKernel
整形前78%だったデータが、scikit-learnのPre-Processingを使って整形すると精度が89%に
フーリエ変換した後SVMにかけるとさらに精度が良くなる
https://www.kaggle.com/berke…/synchronized-brainwave-dataset

2)乳がんのCSVデータ
レントゲン画像からサイズ・面積・濃淡を分析し悪性か良性か分類
https://www.kaggle.com/uciml/breast-cancer-wisconsin-data

3)地域病院のCSVデータ
クラスタリングにかけて分析
https://www.kaggle.com/cms/hospital-general-information

多人数のデータ分析も良いが、1人の患者のデータを時系列で分析する事にも意味がある。石井にIoTを装着してバイオリズム等のデータを取ろうか検討中。

病院の支払い履歴など経済データとクロス分析したいという声も。

現場の医療データでは、500テラバイトのビッグデータをエンタープライズ用GPU20台回して分析にかけたりしている。通信キャリアのデータはペタバイトのものも。

土曜日は14:00より機械学習・深層学習の論文を読む会ですです。
まだ空席あります。お気軽に遊びに来てください。
https://www.meetup.com/Machine-Learning-Meetup-by-team-ai/

Team AIのスローガン；
100万人の機械学習コミュニティを東京に創る
DataHackathonEveryday
OpenInnovationMovement
Skillup Career
サーバーレスって何？

# はじめに

クラウド上にアプリケーションを構築する際の設計手法として、「サーバーレスアーキテクチャー」の注目度が上がっています。
Netflixをはじめ、先進的なサービスを短いサイクルでローンチしている会社で続々と採用され、注目を集めています。

また、ガートナー社の発表でも、『企業が注視すべき、プラットフォームを実現する主要なテクノロジ』として紹介され、今後２〜５年以内にメインストリームになると予測されています。
[ガートナー、「先進テクノロジのハイプ・サイクル：2017年」を発表](https://www.gartner.co.jp/press/html/pr20170823-01.html)

サーバーレスアーキテクチャーの概念、実現方法、メリット・デメリットをまとめてみました。

＜ご注意＞
本稿は2017年8月時点の情報に基づいており、現在の情報と異なっている可能性があります。
本稿の内容は執筆者独自の見解であり、所属企業における立場、戦略、意見を代表するものではありません。

# サーバーレスアーキテクチャーの概念

- サーバーを常時起動しない
- 何らかのトリガー＝イベントの発生により動的にリソースが割り当てられ、事前に登録しておいたコードが実行される

# 実現方法

サーバーレスアーキテクチャーを実現するには、クラウドベンダー各社のイベント駆動型コード実行サービスを利用します。

イベント発生時に粒度の細かい関数（Function）を実行する、ということで、IaaS、PaaS等と対比して「Function as a Service(FaaS)」と呼ばれます。

**クラウドのシェア上位3社 [^1] が提供しているFaaS**

| ベンダー | サービス |
|:--|:--|
| AWS | AWS Lambda |
| Microsoft | Azure Functions |
| IBM | IBM OpenWhisk |

課金は使用した個々のリソース量に基づいて従量的に行われます。

**（2017年9月1日追記）**
本稿執筆後、IBM OpenWhiskから**[IBM Cloud Functionsに名称変更](https://www.ibm.com/blogs/bluemix/2017/08/four-reasons-serverless-faas-ibm-cloud-better-ever/)**となりました。

# メリット

| IaaS / PaaS | | FaaS |
|:--|:--|:--|
| MAXを想定して性能を見積もり、設定する必要がある | → | Functionの実行時に自動的に必要なリソースが割り当てられるため、性能の見積もりも設定も不要 | → |
| 常時サーバーを起動させているため、未利用の時間帯の料金が無駄である | → | 実際に使用したリソース量に基づいて従量的に課金されるため無駄がない |
| サーバーの運用監視が必要 | → | サーバーの存在を意識せず、コードだけを管理すればOK |

さらに、Functionごとの粒度による分割統治と、また、ステートレスな設計（そうせざるを得ない）により、必然的に機能間の依存関係が極少化されます。

したがって、上手く設計できれば、変更に対して非常に柔軟な構造になります。

# デメリット

## 制限・制約

ベンダーによって数値はまちまちのようですが、どれも以下のような制限・制約があります。

- 同時実行数
- 秒当たりの実行上限数
- デプロイ可能なコードの最大サイズ
- 割り当て可能なメモリの最大サイズ
- 一回の実行にかかる時間（タイムアウト制限）

すなわち、あらゆるFunctionの確実な実行が保証されているわけではない、ということになります。

## レスポンスの即時性に難がある

イベント発生のたび動的にリソースが割り当てられる、という特性上、イベント発生の間隔が短い場合はプーリング処理されますが、間隔が長い場合は初回の実行に時間がかかる傾向があります。

## 設計の難易度が高くなる

メリットの項で書いたことの裏返しです。
コード実行後はインスタンスが消滅するため、ステートレスで機能間の依存性がない設計が必要となります。

# まとめ

サーバーレスは、サーバー運用の手間やコストについて大いにメリットがあり、注目を集めています。

一方で、以下のような機能・サービスに対してサーバーレスを適用することは難しいでしょう。

- 一回のイベントに処理時間が掛かる
- レスポンスに即時性が求められる
- イベント発生時にFunctionが実行されないと致命的なトラブルとなる

# 補足：マイクロサービスとの違い

マイクロサービスとサーバーレスは異なる概念です。
マイクロサービスアーキテクチャーとは、大規模なアプリケーションを小さく機能分割して統治する設計手法です。

サーバーレスは、サーバーの存在を意識しないことで、サーバー運用監視の手間が軽減されることを期待できます。
一方、マイクロサービスにはそのような概念は含まれません。
むしろ、分割した機能すべてのサーバー運用を意識しなければならないため、運用の手間が増える可能性もあります。

このことから、マイクロサービスの一部にサーバーレスを適用するという事例が多いようです。

# 参考リンク

[サーバーレスの実力 - ITpro](http://itpro.nikkeibp.co.jp/atcl/column/17/062000249/)
[サーバーレスの実践といくつかの罠、そしてこれから - Qiita](http://qiita.com/aggre/items/a51035586978c2bc327d)

[^1]: [The Leading Cloud Providers Continue to Run Away with the Market - Synergy Research Group](https://www.srgresearch.com/articles/leading-cloud-providers-continue-run-away-market)
[IntelliJ] IntelliJの初期設定手順

環境を初期化した際などに困りそうなので設定のメモです。
スペック次第ですがメモリは増やしといたほうが快適かと思います。

# エディタのメモリサイズを設定する
ヒープサイズの最大値の初期値は750MBだけれども、スペックに余裕があるのなら増やしておく。

上部メニューから Help -> Edit Custom VM Options... を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/4c7b0965-88f7-ca61-caea-3015a132c2e7.png)

初回は設定ファイルの作成をするか聞かれるので Yes を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/bfc30298-2c44-db33-3f74-a9b1eea9e78c.png)

初期値は以下のようになっているので適当なサイズに変更する。

```text:idea64.exe.vmoptions
# custom IntelliJ IDEA VM options

-Xms128m
-Xmx750m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
```

とりあえず以下のようにする。

```text:idea64.exe.vmoptions
# custom IntelliJ IDEA VM options

-Xms1024m
-Xmx4096m
-XX:-UseCodeCacheFlushing
-XX:+UseCompressedOops
-XX:ReservedCodeCacheSize=512m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Dgroovy.source.encoding=UTF-8
-Dfile.encoding=UTF-8
```

以下などを参考にしましたが、最適かどうかは微妙です・・・
[[Android Studio] 起動時のメモリ割り当てサイズを変更する / コンパイラのエンコーディングを変更する ｜ Developers.IO](http://dev.classmethod.jp/smartphone/android/android-studio-vm-options/)
[IntelliJ IDEAのヒープサイズを増やす - Qiita](http://qiita.com/kazuki43zoo/items/49c90e5f05397c694d26)
[Javaの謎のパフォーマンス劣化現象との戦い - Cybozu Inside Out | サイボウズエンジニアのブログ](http://blog.cybozu.io/entry/2016/04/13/080000)
[Java8のHotSpotVMからPermanent領域が消えた理由とその影響 | ギークを目指して](http://equj65.net/tech/java8hotspot/)


# メモリインジケータを有効化する
Eclipseなどにもある使用メモリ量を表示するものを有効化する。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/d61afe18-e05a-18dc-8546-768f40ecfa2a.png)

File -> Settings -> Appearance & Behavior -> Appearance -> Window Options -> Show memory indicator でチェックを入れる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/df5268c1-22cb-c9f9-804d-d5b38b9baefb.png)

# Maven の import に使用できるメモリを増やす

Settings で Maven で検索して出て来る箇所の、Importing の設定画面を表示する。
VM options for importer のメモリ設定を増やす。

```
-Xmx768m
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/1d57a339-8883-2dfc-e777-9ba321a845c2.png)

# カーソルを当てるとJavaDocを表示するようにする

Settings -> Editor -> General -> Other -> Show quick documentation on mouse move にチェックを入れる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37721/b5187d83-4845-ef2d-2faa-e551608eb2f8.png)

# 参考
[[Android Studio] 起動時のメモリ割り当てサイズを変更する / コンパイラのエンコーディングを変更する ｜ Developers.IO](http://dev.classmethod.jp/smartphone/android/android-studio-vm-options/)
[IntelliJ IDEAのヒープサイズを増やす - Qiita](http://qiita.com/kazuki43zoo/items/49c90e5f05397c694d26)
[Javaの謎のパフォーマンス劣化現象との戦い - Cybozu Inside Out | サイボウズエンジニアのブログ](http://blog.cybozu.io/entry/2016/04/13/080000)
[Java8のHotSpotVMからPermanent領域が消えた理由とその影響 | ギークを目指して](http://equj65.net/tech/java8hotspot/)
Lambda+API Gatewayで画像を返す時に気をつけるべきx個のこと


画像をランダムに返したいだけのシンプルなAPIを作ろうと思ったけど、とてつもなくハマったのでメモ。

ソースは下記においてあります。
https://github.com/celeron1ghz/apigateway-random-image


## lambdaからの値の返し方に作法がある
これはlambdaのコードの中身の話。

以前の `API Gateway` は統合レスポンスでマッピングテンプレートを色々と作らなくてはいけなかったのですが、 `Lambdaプロキシ` が追加され、チェックを入れるだけで共通的な処理はいろいろ設定しなくて良くなりました。

その代わりフォーマットに則ったデータの返し方をしないと自動で処理してくれないので下記のルールに従います。


### lambdaからの画像データはbase64にして返す
lambdaプロキシがうまい具合にbase64からバイナリに戻してくれるので、ここではbase64で返します。`var.toString('base64')` とすればbase64にできるので大したことないですね。 


### lambdaで戻すべきキーがある
下記のキーを含まないといけません。
  * statusCode
  * headers
  * body
  * isBase64Encoded = true

`body`には画像ファイルの内容をbase64にしたもの、`isBase64Encoded = true` は設定しないと変換対象として見てくれないっぽいので忘れずに。


だいたいこんな感じになると思います。

```
callback(null, {
    statusCode: 200,
    headers: { 'Content-Type': 'image/jpeg' },
    body: data.Body.toString('base64'),
    isBase64Encoded: true,
}); 
```


## 統合リクエストでLambdaプロキシ統合をチェックする
これはAPI Gatewayの設定の話。

上記で設定した内容をいい感じで処理してくれるようにするためにチェックを入れます。


## バイナリサポートにMIMEを設定する
これもAPI Gatewayの設定の話。

上記ではうまい具合にバイナリに戻してくれると書きましたが、実際はリクエストの`Accept`ヘッダに指定されたMIMEが、この`バイナリサポート`で設定したMIMEの中に存在するとバイナリ変換が動きます。

自分はJPGしか使わなかったので `image/jpeg` しか指定しませんでしたが、そのほかのフォーマットの画像を使うときは適宜増やしましょう。


## cloudfrontを使う
ここまででAPI Gatewayで自動で振られるアドレスにブラウザでアクセスすれば画像が落ちてくる！

と思いきや落ちてこないんだなこれが。

上記に書いた通り、リクエストの `Accept` ヘッダにMIMEを指定してあげないといけませんが、ブラウザの普通のアクセスでそんなことはできないですね。

なお、下記のようにcurlとかで `Accept` を指定してあげるとちゃんとファイルが落ちてきます。

```
curl -H "Accept: image/jpeg" "https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/image" > moge.jpg
```

どうすんだよ、っていう解決案がCloudfrontです。

Cloudfrontがファイルを取りに行く時のヘッダを指定できるので、そこで `Accept` ヘッダを指定するとAPI Gatewayから画像が取れるので、cloudfrontのアドレスにアクセスすれば画像が取れます。

```
curl "https://xxxxxxxxxxxxxx.cloudfront.net" > moge.jpg
```

めでたしめでたし。


## まとめ
 * Lambda + API Gatewayで画像を扱おうとすると（最初は）だいぶめんどくさい
 * なぜ画像を扱おうとするだけでCloudfrontが出てくるのか（従量課金だからそんなに気にしなくていいけど大げさすぎる感がある）
Go言語のGORMを使ってみた①

# **はじめ**
仕事でGORMを使うことになったので、学習目的で記事を書いていくので、
アドバイスがあると大変助かりますm(_ _)m

# **GORMについて**
GO言語用のORMフレームワーク。
DB周りの処理を実装する時にこのフレームワークを使うと便利。

・**公式サイト**
http://jinzhu.me/gorm/

・**ORMについて**
[こちらの記事](http://qiita.com/yk-nakamura/items/acd071f16cda844579b9)わかりやすいので、
わからない方は軽く覗いてみて下さい〜

# **必要なもの**
1.必要最低限のSQLをかける（SELECT,CREATE,INSERT,UPDATE,DELETE,DROP）
2.Go言語を公式ドキュメントを読みながら実装できる（ポインタ、複数戻り値、型宣言など）
3.気合と根性（いらないかも）

# **準備**
```go:sample.go
import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

```

importでGORMと使用するDBのドライバをインポート。

# **テーブル定義**
```go:sample.go
type User struct {
	gorm.Model
	Name string `gorm:"size:255"`
	Password string `gorm:"size:255"`
	Email string `gorm:"size:255"`
}
```

ここで、一つ注意点として,
構造体でカラムを定義する時、変数名は先頭が大文字でなければ行けない。（じゃないとカラムが作成されない）
ここ躓いたので、要注意！！！！

# **DB接続**
```go
db, err := gorm.Open("mysql", "root@/sample?charset=utf8&parseTime=True&loc=Local")
if err != nil {
    panic("failed to connect database")
}

// 実行完了後DB接続を閉じる
defer db.Close() 

// ログ出力を有効にする
db.LogMode(true) 

```

# **テーブル生成**
マイグレーションを実行すると
テーブルが無い時は自動生成
あるときはなにもしない

```go:sample.go
// DBエンジンを「InnoDB」に設定
db.Set("gorm:table_options", "ENGINE=InnoDB")

// マイグレーション
db.AutoMigrate(&User{})
```
}

自動生成されるテーブルは以下

<pre>
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
| deleted_at | timestamp        | YES  | MUL | NULL    |                |
| name       | varchar(255)     | YES  |     | NULL    |                |
| password   | varchar(255)     | YES  |     | NULL    |                |
| email      | varchar(255)     | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
</pre>

# **insert**
```go
// 実データを定義
user := User{Name: "sknaehira", Password: "skanehira", Email:"skanehira@sample.com"}

// insert処理
db.NewRecord(&user);
db.Create(&user);
```

# **select**
```go
db.Find(&user) // 1レコード
db.Find([]&user) // 全レコード
```

# **where句**
```go
db.Where("name = ?", "skanehira").First(&user)
```
めんどくさくなってきたので、
あとは[公式サイト](http://jinzhu.me/gorm/crud.html)を参照してくだいさいー