OmniAICreator/Qiita-1.07M huggingface dataset:
サーバ・インフラ構築を効率化するためのツール一覧（目的別）

### ローカルにお試し環境をつくりたい
- Docker
  - Dockerfile
  - docker-compose

### ローカルの仮想マシンを手軽に構築・管理したい
- Vagrant

### クラウド上に本格環境を作りたい（従量課金可）
- AWS (Amazon Web Service)
  - 仮想サーバー : Amazon EC2
  - 静的コンテンツ置き場：Amazon S3
  - RDB(リレーショナルデータベース) : Amazon RDS
  - NoSQLデータベース : Amazon DynamoDB

### モバイルアプリ用のバックエンドサービスが欲しい
- Firebase
  - プッシュ通知 : Cloud Messaging, Notifications
  - 認証機能 : Authentication
  - リアルタイムDB : Realtime Database

### Webアプリケーションの実行環境が欲しい
- Heroku

### WebAPI用の環境が欲しい
- AWS (Amazon Web Service)
  - Amazon API Gateway
  - AWS Lambda

### サーバーの設定を管理したい
- Ansible
- Chef
- Puppet

### Webアプリケーションのデプロイを効率化したい
- Capistrano
- Fabric (モバイルアプリ向けサービスの方が検索上位なので、Fabric Pythonとかで検索)

### あとがき
目的にあったツールを選ぶことが大切らしいので、
個人的なイメージで棚卸ししてみました。
おすすめなツール・サービスがありましたら、コメントしていただけると助かります。
StoryBoardでIBActionと簡単に紐付ける方法

#背景
XcodeのStoryBoardで１つのボタンに作成したボタンを他の複数のボタンにも簡単に紐付ける方法が見つかったので記録

#参考にした記事
他サイトの記事を見ていると、対象のボタンを右クリックしてViewControllerと紐付ける手法が書かれていたが自分のXcodeでは実現できなかった。

**ViewControllerとMain.storyboardの連動**
[ピアノアプリ（SwiftPiano）を作ろう！追記：より短いコードで書くと。]
(http://bick.xyz/archives/157)

#実現方法
下記の図のようにView Controller側のConnection Inspectorを開くと、Received Actionのところに作成済みのActionが表示されている。（１つは作成時に紐付け済み）
新しく設定したボタンに対して○のところからコネクタをつなぎにいくと図のように対象のボタンが青く選択される。

![スクリーンショット 2017-01-27 23.03.42.png](https://qiita-image-store.s3.amazonaws.com/0/108367/27494c76-368e-2ae1-4eeb-c0de5ccb914e.png)

選択状態でマウスを離すと下図のように紐付けたいイベントを選択するように促されるので
任意のものを選択すれば紐付け完了
![スクリーンショット 2017-01-27 23.06.41.png](https://qiita-image-store.s3.amazonaws.com/0/108367/10a8636b-f70f-1ea8-de61-5a86c91e8f24.png)

このように紐付けられていることをConnection Inspectorで確認できました。
めでたしめでたし。
![スクリーンショット 2017-01-27 23.09.08.png](https://qiita-image-store.s3.amazonaws.com/0/108367/e40db1ae-9e36-2b54-8157-4fcd0906609e.png)
Homebrew の tmux に文字幅問題を修正するパッチをあてる

こんにちは！こんにちは！

tmux 上で日本語の文字列を入力していると、たまに表示が崩れることがあります。特定の記号とかの文字を表示するとダメンな感じなんですね。

そんなこんなでいい加減なんとかしたいなと思って調べてみたら、version 2.3 環境用のパッチがあるんでないかい。てかこれ、本家では問題になってないんだろうか。そこまでは調べてないッス手抜きですんません…。

- [tmux 2.3 において East Asian Ambiguous Character を全角文字の幅で表示する](https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34)

で homebrew を使ってるんでパッチを当てる方法のメモ。

```shell-session
$ brew update
$ brew edit tmux
```

で、以下を追加する。

```ruby
def patches
   [
      "https://gist.githubusercontent.com/waltarix/1399751/raw/6c8f54ec8e55823fb99b644a8a5603847cb60882/tmux-pane-border-ascii.patch",
      "https://gist.githubusercontent.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34/raw/382c4794710940605681b490a534a616633eba55/tmux-2.3-fix.diff"
   ]
end
```

そしてインストール！

```shell-session
$ brew reinstall --build-from-source tmux
```
VSCode でＤ言語のデバッグ環境を整える(Windows)

# VSCode でＤ言語のデバッグ環境を整える(Windows)

Clang でデバッグしていてＤ言語もこんな簡単にデバッグできたら...と、試したところ簡単にデバッグできました。
よく考えると ６４ビット環境はＭＳのツールで作成しているので使えて当たり前？なのかもしれません。


## 必要なツールとデバッグ出来る環境

- VSCode(Visual Studio Code) 本体
- MS-CppTools(MS-vscode-CppTools)
- Native-debug(webfreak.debug)
- D Programing Language code-d (webfreak.code-d) 


### デバッグ可な環境
- windows 64bit(dmd -g -m64)
- windows 32bit mscoff (dmd -g -m32mscoff) 


### デバッグできなかった
- windows 32bit omf (dmd -g -m32) でデバッグをスタートすると、すぐに Exception で落ちてしまいます。


## インストール手順
code-d 以外は特に問題なくインストールできるので拡張機能の画像を張っておきます、code-d のインストールは[こちらを参照してくだい](http://qiita.com/sfujita/items/24c47b68f15d24f0c03e)

- MS-CppTools(MS-vscode-CppTools)

![ms-cpptools.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/ms-cpptools.png)


- Native-debug(webfreak.debug)

![native-debug.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/native-debug.png)


- D Programing Language code-d (webfreak.code-d) 

![code-d.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/code-d.png)


## デバッグの手順

1  インストールが出来たら早速デバッグが開始できます。まずはデバッグするプログラムを用意します(画像は code-d: Create new project -> Basic Console App)、ステータスバーをクリックしてアーキテクチャを X64_86 ビルドタイプ debug に変更しビルド(code-d : Build project)します

![debug-step1.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/debug-step1.png)


2  デバッグの設定ファイル(launch.json)を作るために、コマンドパレットを開き Debug: Open launch.json -> C++(Windows) を選択すると launch.json が作成されます

![debug-step2.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/debug-step2.png)

![debug-step3.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/debug-step3.png)


3  launch.json の "Program" : "${workspaceRoot}/debug-test.exe" をデバッグするプログラムに書き換えます

![debug-step4.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/debug-step4.png)


4 VSCodeのデバッグ(Ctrl+Shift+D)画面を開きます、ソースコードを表示してブレークポイント(赤丸)をマウスで設定します

![debug-step5.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/debug-step5.png)


5 ファンクションキーの F5 でデバッグをスタートさせます。

![debug-step6.png](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_05/pics/debug-step6.png)


6 以上 / nice debug!

## 訂正

- デバック->デバッグ に訂正しました、kotet ありがとう!

## 関連リンク

- code-d wiki https://github.com/Pure-D/code-d/wiki
- Ｄ言語のエディタ対応状況 http://wiki.dlang.org/Editors


----

- location https://github.com/SeijiFujita/quiita_works/tree/master/using_vscode_05


tag: dlang,VSCode,Visual Studio Code
filename: using_vscode_05.md
last update: 2017/01/29
【Python入門】for文でのin演算子の使い方とは?

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】for文でのin演算子の使い方とは?](http://programming-study.com/technology/python-in/)


#【Python入門】for文でのin演算子の使い方とは?


pythonにはいろんな構文や演算子があり、他の言語よりも短く楽にコーディングをすることができます。今回は、数あるPythonの演算子の中から、さまざまなところで使われるinについて説明します。


in演算子は、特定の値を持つ要素がリストやタプルの中に存在するかどうかを確かめるための演算子です。in演算子の基本的な構文は以下の通りです。

```
指定の要素　in リスト
```

リストの部分はタプルや辞書型でも同じです。in演算子は、指定の要素がリストやタプルの中に存在するかどうかを調べ、もし存在する場合はTrueを返し、存在しない場合はFalseを返します。

```
list1 = ['tanaka', 'satou', 'suzuki', 'kimura']

print('tanaka' in list1)
print('takenaka' in list1)
```

実行結果
>
True
False

この例では名前のリストの中から指定した名前の人がいるかどうかを調べています。「tanaka」はリストの中にあるのでTrueが返り、「takenaka」はリストの中にないので、Falseが返ります。

また、in演算子はタプルや辞書にも使うことができます。

```
tuple1 = ('tanaka', 'satou', 'suzuki', 'kimura')
dict1  = {'tanaka':21, 'satou':45, 'suzuki':19, 'kimura':67}

print('tanaka' in tuple1)
print('takenaka' in tuple1)

print('suzuki' in dict1)
print('suzumura' in dict1)
```

実行結果
>
True
False
True
False

タプルや辞書型の場合でも、リストの時と同じように使えます。ただし、辞書型の場合は指定したキーが存在するかどうかの確認になります。指定した要素が値にあったとしても、キーになかった場合はFalseが返されるので注意してください。

```
dict2  = {'tanaka':'tarou', 'suzuki':'zirou'}

print('tarou' in dict2)
```

実行結果
>
False

##for文におけるin演算子

Pythonではfor文でもin演算子を使います。for文におけるinはリストやタプルから要素をひとつずつ取り出す働きをします。

```
list1  = ['tanaka', 'satou', 'suzuki', 'kimura']

for name in list1:
    print(name)
```

実行結果
>
tanaka
satou
suzuki
kimura

この例ではリストの中から要素を一ずつ取り出しています。タプルでも同様の結果になります。ただし、辞書の場合は通常はキーが取り出されます。

```
dict1  = {'tanaka':21, 'satou':45, 'suzuki':19, 'kimura':67}

for name in dict1:
    print('{0}:{1}'.format(name, dict1[name]))  #取り出したキーを使って値も表示
```

実行結果
>
tanaka:21
suzuki:19
satou:45
kimura:67

for文で辞書の値やキーと値の両方を取り出す場合は辞書型のvalues()およびitems()を使います。

```
dict1  = {'tanaka':21, 'satou':45, 'suzuki':19, 'kimura':67}

#値だけ取り出す
for age in dict1.values():
    print(age)
    
#キーと値を取り出す
for item in dict1.items():
    print(item)
```

実行結果
>
19
45
21
67
(‘suzuki’, 19)
(‘satou’, 45)
(‘tanaka’, 21)
(‘kimura’, 67)

##not in演算子

in演算子によく似た演算子で、not in演算子があります。in演算子は探したい要素がリストやタプルに存在する場合にはTrue、存在しない場合にはFalseを返していました。not in演算子は名前の通りその逆で、存在しない場合にはTrue、存在する場合にはFalseを返します。

```
list1  = ['tanaka', 'satou', 'suzuki', 'kimura']

print('tanaka' not in list1)
print('takenaka' not in list1)
```

実行結果
>
False
True

リスト1には「tanaka」という名前があるので、not in演算子はFalseを返し、「takenaka」という名前はないので、not in演算子はTrueを返しています。inもnot inも似たような動きをしますが、「存在すること」を確認するときはin演算子、「存在しないこと」を確認するときはnot in演算子をつかうようにしましょう。

##indexで指定した要素のインデックスを取得する

in演算子を使うことで、リストやタプルにその要素が存在するかどうかを確認することができました。しかし、これでは存在が分かってもリストのどこに存在するかが分かりません。そんなときはindex関数を使います。index関数の基本的な構文は以下の通りです。

```
リスト.index(探したい要素)
```

index関数を使えば、探したい要素がリストの何番目に存在するかを知ることができます。index関数はもし要素が見つからない場合はValueErrorが発生してしまうので、in演算子を使って存在することを確かめたうえでindex関数を使えば安心ですね。

```
list1 = ['tanaka', 'satou', 'suzuki', 'kimura']

name_index = 0
name = 'suzuki'

if(name in list1):
    name_index = list1.index(name)
    print('{0}は{1}番目に存在しています'.format(name, name_index))
```

実行結果
>
suzukiは2番目に存在しています

この例では、指定した要素（name）が存在する場合のみ、その要素のインデックスを取り出すようにしています。こうすることで、index関数がValueErrorを発生させることを防ぐことができます。

もちろん、例外処理をしたうえでindex関数単体を使っても良いですが、例外処理をするよりもこちらの方が簡単に済みますね。
【Python入門】モジュールを扱う際に重要な「if __name__ == ‘__main__’:」とは？

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】モジュールを扱う際に重要な「if __name__ == ‘__main__’:」とは？](http://programming-study.com/technology/python-if-main/)


#【Python入門】モジュールを扱う際に重要な「if __name__ == ‘__main__’:」とは？


Pythonの勉強をしていてサンプルのプログラムなどを見ていると、「if __name__ == ‘__main__’:」という1文をよく目にすることがあります。mainというとC言語やJavaといった他のプログラミング言語ではプログラムを書く上で欠かせないものですが、Pythonの場合は普段コーディングをする際にはmainは使いません。

しかし、この一文はPythonでモジュールを扱う上で重要な役割を果たします。今回は、この「if __name__ == ‘__main__’:」というものが何を意味するのかについて説明します。


##モジュールとは

Pythonのコードはスクリプトファイルとして保存し、他のプログラムから再利用することができます。そのファイルのことをモジュールといいます。Pythonで標準ライブラリを読み込む際に「import」を使いますが、自作したモジュールもimportを使って読み込むことで、そのモジュールで定義した関数やクラスを他のプログラムでも使うことができます。

##if __name__ == ‘__main__’:の意味

###name__とは？

モジュールの意味がわかったところで、次は「__name__」という変数について説明します。例として、以下のようなプログラムtest.pyがあるとします。

```
test.py
def test():
    print('Hello World!')
    
if __name__ == '__main__':
    test()
```

このプログラムを実行した結果は以下の通りになります。

>Hello World!

この例では「Hello World!」と表示するtestという関数を定義しただけです。どこにも「__name__」という変数は宣言していません。にもかかわらず、test()が実行されているということは、if文がTrueを返しているということになります。いったい、どういうことでしょうか？

最初にこの「__name__」という変数について見ていきましょう。実はこの__name__という変数はPythonプリンタでPythonスクリプトを読み込むと自動的に作成されます。さらに、この中には実行しているスクリプトのモジュール名が自動的に代入されるようになっています。

###if __name__ == ‘__main__’: の意味

__name__という変数が自動で作られ、さらに実行しているスクリプトのモジュール名が自動的に代入されることが分かりました。しかし、__main__というモジュールを作った覚えもありません。この__main__はどこからきているのでしょうか？

実は、Pythonスクリプトを直接実行した時には、そのスクリプトファイルは「__main__」という名前のモジュールとして認識されます。そのため、スクリプトファイルを直接実行すると__name__変数の中に自動で__main__という値が代入されるのです。

つまり、「if __name__ == ‘__main__’:」の意味は、「直接実行された場合のみ実行し、それ以外の場合は実行しない」という意味だったのです。さきほどの例では、test.pyを直接実行したので、if文がTrueを返し、test()が実行されたのです。

試しに、test.pyの中に実行したモジュール名を表示する処理を加えました。

```
def test():
    print('Hello World!')
    
if __name__ == '__main__':
    test()
    
print('モジュール名：{}'.format(__name__))  #実行したモジュール名を表示する
```

これを実行すると、以下のような結果になります。

>Hello World!
モジュール名：__main__

スクリプトファイルを直接実行した際にはモジュール名が「__main__」になっているのが分かりますね。

では、「直接実行された場合以外」とはどういった時のことでしょうか？それは、このスクリプトファイルをモジュールとして他のプログラムから読み込んだときです。test.pyをモジュールとしてimportするtest2.pyを作成しました。

```
test2.py
import test  #test.pyをインポート
```

実行結果
>
モジュール名：test

test.pyをインポートして実行すると、モジュール名が「test」になっているのが分かります。つまり、test.pyがtestモジュールとして実行されているので、__name__には「test」が代入されています。そのため、「if __name__ == ‘__main__’:」はFalseを返すので、test()が実行されなかったのです。

「if __name__ == ‘__main__’:」はモジュールを作成中のテストや、現在はモジュール化するつもりはないが、モジュール化したときに無駄な処理を行わないようにしたい場合などに使われます。個人でプログラムを作っているうちはあまりモジュール化や再利用といったことは考えないかもしれませんが、大規模なプログラムを作る場合には必須の考え方です。ぜひ、覚えておきましょう。
[Swift3] Intをカンマ編集するextension＆その逆

今更ながらのネタですが…
もっとエレガントな手法をコメントいただけるかも？と期待して書きます。

※いただいたコメントを参考にブラッシュアップしてみました。（2017/1/28）

# 環境

| Items | Version |
|:--    |:--      |
| Xcode | 8.2     |
| Swift | 3.0.2   |

# 定義

```swift
/// Int拡張
extension Int {
    /// カンマ付け
    var withComma: String {
        let decimalFormatter = DecimalFormatter()
        guard let s = decimalFormatter.string(from: self as NSNumber) else {
            fatalError()
        }
        return s
    }
}

/// String拡張
extension String {
    /// カンマ区切り数字のカンマどり
    var noComma: Int {
        if self.characters.count == 0 {
            return 0
        }
        let decimalFormatter = DecimalFormatter()
        guard let i = decimalFormatter.number(from: self) else {
            preconditionFailure("NumberFormatter.number method failure!")
        }
        return Int(i)
    }
}

/// カンマ編集制御用NumberFormatter拡張クラス
class DecimalFormatter: NumberFormatter {
    override init() {
        super.init()
        self.locale = Locale(identifier: "ja_JP")
        self.numberStyle = .decimal
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}
```

# 呼び出し

```swift
let s: String = (1234567).withComma         //"1,234,567"
let i: Int = s.noComma                      //1234567
let i2: Int = "123,456x".noComma            //Error
```

# （参考）ブラッシュアップ前

```swift
/// Int拡張
extension Int {
    /// カンマ付け
    var commmaDecStr: String {
        let decimalFormatter = NumberFormatter()
        decimalFormatter.numberStyle = NumberFormatter.Style.decimal
        decimalFormatter.groupingSeparator = ","
        decimalFormatter.groupingSize = 3
        
        return decimalFormatter.string(from: self as NSNumber)!
    }
}

/// String拡張
extension String {
    /// カンマ区切り数字のカンマどり
    var delCommmaFromDecStr: String {
        if self.characters.count > 0 {
            return self.replacingOccurrences(of: ",", with: "")
        } else {
            return "0"
        }
    }
}
```

I Love Swift!!:heart_eyes:
Sketch Pluginの開発(開発編)

[こちら](http://qiita.com/nerd0geek1/items/8c7192a6c962e9ac9611)の記事の続きです。
Sketch Pluginの前提知識が十分でない方はそちらを先に参照ください。

今回は、

- 環境構築
- 開発
- 配布方法

を解説します。

# 環境構築
## お手軽セットアップ
`Menu->Plugins->Custom Plugin...`を選択すると、
![plugin.png](https://qiita-image-store.s3.amazonaws.com/0/33395/8fe8474f-c0e3-1823-bcc1-52970f32675d.png)
以下の画面が表示され、Javascript編集画面と、その実行結果をその下のconsoleで確認できるようになります。
<img width="692" alt="Screen Shot 2017-01-15 at 07.27.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/33395/8cd40b2f-9c57-ccd8-2634-163c54fdd2ed.png">

## Editor連携
Sketch Pluginを軽く書いてみたい場合は、上記の方法で良いかと思いますが、ガッツリと書く場合、自分の使い慣れたEditorを使いたくなるかと思います。
その場合、以下のコマンドでEditorを切り替えることができます。
(以下はatomの例)
`defaults write ~/Library/Preferences/com.bohemiancoding.sketch3.plist "Plugin Editor" "/usr/local/bin/atom"`

Sketch Pluginでは`print`や`log`でログを取ることができますが、
外部Editor連携を行っている場合、その結果はconsole.appから確認することができます。
(※注：以下はJavascriptの例。CocoaScriptの場合、`log/print`を`NSLog`に変更し、
console.appでも`system.log`から`Devices`に表示される自分をPCを選択するように変更)

```js:hello-world.js
function onRun(context) {
  log("onRun method started");
  ...
  print("onRun method finished");
}
```

<img width="884" alt="Screen Shot 2017-01-22 at 15.43.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/33395/b78e2aa9-1814-fc7a-1162-a6ab034da0e5.png">
(system.logを選択し、`Sketch`でフィルタリング)

# 開発
javascript or CocoaScriptで実装することができますが、どちらもそれほど資料がまとめられてはいませんので、
既存のPluginのコードを読む形になると思います。

今回は、[Sketch Color Palette](https://github.com/nerd0geek1/SketchColorPalette)という、
選択されたShapeのbackgroundとnameから.clrファイルを生成するSketch Pluginを作成したのですが、
NSColorやNSColorListにアクセスする都合上、CocoaScriptで記述しました。

開発した感じとしては、Sketch内でおさまるのであればJavaScriptで書いたほうがやりやすいなー、という感想です。
CocoaScriptはAppKitにアクセスできる点はいいのですが、IDEの補完が弱かったり、そこまで書きやすくはないという点でJavaScriptに軍配があがる感じではありました。

# 配布方法
開発元に確認したところ、
GitHub上に[sketchplugins/plugin-directory](https://github.com/sketchplugins/plugin-directory)というリポジトリがあり、
そのリポジトリ上で以下のいずれかの方法で知らせてくれれば良い、とのことでした。

- READMEに自分の開発したPluginを含めてPR投げる
- 自分の開発したPluginのURLを貼付したissueを起票する

![plugin-directory.png](https://qiita-image-store.s3.amazonaws.com/0/33395/a7bef018-6ae7-0f22-7711-3cae4c539627.png)

# まとめ
実際作ってみると、色々とハマりはしましたが、既に多くのPluginが開発・公開されているので、そのコードを読み、既存の実装を組み合わせていけば、実装自体はそこまで難しくないかと思います。
なので、デザイナーとのワークフローを開発したいと思っているのであれば、Sketch Pluginはかなりオススメです。

# 参考
- [Plugins, Scripts, and Commands - Sketch公式](http://developer.sketchapp.com/introduction/plugin-scripts/)
- [Scripting Preferences](http://developer.sketchapp.com/introduction/preferences/)
Sketch Pluginの開発(前提知識編)

最近、徐々にAdobe製品よりSketchを使う機会が増えてきたと思います。
[Sketchプラグインまとめ（2016年版）](http://qiita.com/htmlmogmog/items/11cd1ee7c548723cb3e3)のように既存のプラグインを紹介する記事が出回っていたりしますが、そういった[既存のプラグイン](https://www.sketchapp.com/extensions/plugins/)で満足できなくなってきた人のために、

Sketch Pluginの前提知識として

- 概要
- インストール先
- ディレクトリ構成
- 構成要素

あたりをシェアしたいと思います。
実際の開発に必要な内容は[こちら](http://qiita.com/nerd0geek1/items/e1153acdab3e3e8f3d20)に記載してあります。

# 概要
こんなタイトルの記事を開いているくらいなので、解説はあまり必要ないかと思いますが、Sketch Pluginは

- [AEIconizer(iOSで利用する各サイズのアイコン生成)](https://github.com/tadija/AEIconizer)
- [Copy Swift Code(Sketch上の色をUIColorを含むSwiftファイルとしてexport)](https://github.com/ngs/sketchplugin-swift-color)

のような、サードパーティ製の拡張機能のことです。
これらのようなPluginは、JavaScript、もしくはCocoaScriptというJavascriptとCocoa frameworksを足して2で割ったような言語で書くことができます。
公式な資料を見つけることはできませんでしたが、次バージョンのSketch4からは、Swiftでも書くことができるようになるみたいです。

# インストール先
Sketch Pluginは[Plugin Locations](http://developer.sketchapp.com/introduction/installing-plugins/)に記載があるように、以下のディレクトリ内に`hoge.sketchplugin`というパッケージ形式でインストールされます。
`~/Library/Application Support/com.bohemiancoding.sketch3/Plugins`


# ディレクトリ構成
Sketch Pluginは、以下のようなディレクトリ構成になっています。
(以下の例では最小限の構成要素のみを記載しています)

```
hoge.sketchplugin
  Contents/
    Sketch/
      manifest.json
      hoge.js
```

`.sketchplugin`という拡張子のパッケージの中に`Contents/Sketch/`ディレクトリがあり、
その中に、npmにおけるpackage.jsonのように、プラグインの仕様を記載した`manifest.json`と、実際の処理を行うコードを記述したhoge.jsが配置されます。
より詳しい情報については、[Plugin Bundles](http://developer.sketchapp.com/introduction/plugin-bundles/)に記載があります。

# 構成要素
プラグインの構成要素は以下の通り。
[Plugin Basics](http://developer.sketchapp.com/introduction/)のTerminology(専門用語)の内容そのままです。

- Plugin：  
  プラグインそのもの。
- Plugin Bundle  
  プラグインを構成するパッケージ。`.sketchplugin`がそれに当たる。
- Action  
  トリガーとなるユーザー行動。具体的にはメニューの選択やショートカットキーなど。
- Command  
  Actionによって実行される、ひとまとまりの処理。
- Handler  
  コマンドを構成する、1つないし複数のCocoaScriptの関数を指す。
- Script  
  Commandを実行するためのHandlerを含むjs(or CocoaScript)ファイルを指す。

なので、これらの用語を利用してPluginの動作を説明すると、

```
Pluginをインストールすると、Plugin Bundleが所定の位置に配置され、
ユーザーが何らかのActionを行うことで、Commandが実行され、
実際にScriptに含まれる１つないし複数のHandlerが呼び出される
```

という感じですね。
実際の開発については、[こちら](http://qiita.com/nerd0geek1/items/e1153acdab3e3e8f3d20)で解説します。


## 参考
### Sketch Plugin開発
- [Plugin Basics(公式)](http://developer.sketchapp.com/introduction/)
- [Sketch Plugin についての要約とメモ。あるいは Sketch Plugin の始め方。 - Qiita](http://qiita.com/damele0n/items/01ef0d4820585bcf7b8d)

### プラグイン関係
- [Sketchプラグインまとめ（2016年版）](http://qiita.com/htmlmogmog/items/11cd1ee7c548723cb3e3)
- [Sketchに入れたい、便利なプラグインまとめ - creive](http://creive.me/archives/9893/)
- [Sketch Plugins(公式)](https://www.sketchapp.com/extensions/plugins/)
pymc3のインストール

pymc（バージョン3.0以降）のインストール方法．（本家のドキュメントは[こちら](http://pymc-devs.github.io/pymc3/)）

初めての人は「Anacondaを使っている場合」を推奨します．

（なおpymc2（バージョン2.3.6）のインストール方法は，[ここ](http://qiita.com/tttamaki/items/9ba3ba475f0dee1f0366)を参考にしてください）

# Anacondaを使っている場合

```:
conda install -c conda-forge pymc3
```

# pipを使う場合

```:
pip install pymc3
```


# 注意

pipでgitを使う場合には，最新の開発バージョンがインストールされます．動作が安定していない可能性がありますので気をつけてください．

```:
pip install git+https://github.com/pymc-devs/pymc3
```

# 注意２

もし ["Illegal Instruction: 4" というエラー] (https://github.com/Theano/Theano/issues/4320#issuecomment-215627341) がでたら，theanoを最新にアップデートしましょう．

```:pipでアップデート
pip install Theano=0.9.0b1
```
CentOS7 を Lenovo X240 へ インストール & タッチパッドをX250へ交換【覚書】

今まで使用していたノートPC(asus U24E)が筐体がボロボロになったので、
lenovo X240をオークションにて購入

取り敢えずCentOSをインストール

しかしタッチパッドがパコパコパッドで、使いにくかったので、
調べてみるとX250のパッドが使えるらしいので、アマゾンにて購入(3400円)
(参考：http://amzn.to/2jbs4mt)

交換方法は"X240 タッチパッド 交換"とググるといろいろな人が交換しているので、
そちらを確認してください。

・注意点の覚書
1.タッチパッドの交換すると、画面からポインターが無くなり、新タッチパッドのドライバーが無く使えないのかと少し焦る。
→コネクターをぐりぐり揺らしてみると直る可能性がある

2.タッチパッドのセンタークリックを使ってスクロールが出きない
→vi /etc/X11/xorg.conf.d/20-thinkpad.conf
をコマンドを打って以下を記入し再起動

```ruby:以下を記入
Section "InputClass"
	Identifier	"Trackpoint Wheel Emulation"
	MatchProduct	"TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device|Composite TouchPad / TrackPoint"
	MatchDevicePath	"/dev/input/event*"
	Option		"EmulateWheel"		"true"
	Option		"EmulateWheelButton"	"2"
	Option		"Emulate3Buttons"	"false"
	Option		"XAxisMapping"		"6 7"
	Option		"YAxisMapping"		"4 5"
EndSection
```

(参考URL：http://www.thinkwiki.org/wiki/How_to_configure_the_TrackPoint#xorg.conf.d)
【サクラエディタ】プレインテキスト小説をHTML文書化したい人の為のタグ付けマクロ

Tumblerやpixivなどのサービスが充実し、二次創作屋の人間が自作HPを持つのをやめ、HTMLタグなど触りもしなくなってきた昨今。あえてこの時代の潮流をクロールで逆走し、pixivに投げてきたWeb小説をマイHPに取りまとめたくなりまして、プレインテキスト状態で保持している小説を簡単にHTML文書化できるサクラエディタ用キーボードマクロをいくつか作ってみました。

## 改行タグ\<BR>自動挿入

```mac:addBRtag.mac
// HTML文書用改行タグ追加マクロ
S_ReplaceAll('\r\n', '<br>\r\n'); // すべて置換
S_ReDraw(0); // 再描画

```
### 使用例
![text1.png](https://qiita-image-store.s3.amazonaws.com/0/161888/5e4a4d1d-b92e-ce7d-f91b-5e1dac6407b6.png)
　　　　　　↓
![text2.png](https://qiita-image-store.s3.amazonaws.com/0/161888/122c4de3-900e-5e33-2704-ababcc7a0ce5.png)

引用元：田中芳樹『銀河英雄伝説１　黎明篇』（らいとすたっふ文庫、2014）

## pixiv → HTML ルビ変換

```mac:replaceRuby.mac
// pixiv形式ルビをHTMLルビに変換するマクロ
S_ReplaceAll('\\[\\[rb:(.+) > (.+)\\]\\]', '<ruby><rb>$1</rb><rp>（</rp><rt>$2</rt><rp>）</rp></ruby>', 36); // すべて置換
S_ReDraw(0); // 再描画

```
### 使用例
![text3.png](https://qiita-image-store.s3.amazonaws.com/0/161888/a5cde886-df03-9db8-32f0-2af498d80165.png)
　　　　　　↓
![text4.png](https://qiita-image-store.s3.amazonaws.com/0/161888/963191af-5b0d-a8f9-c745-21255ce993f0.png)

## 選択範囲にルビタグを付加
注：クリップボード領域とコピー＆ペーストを使用します。ルビをふりたい範囲をあらかじめ選択してからマクロを使用してください。

```mac:addRuby.mac
// HTML文書用ルビふりマクロ
// 先にルビをふりたい文字列が選択されていることを想定
S_Cut(0); // 切り取り
S_InsText('<ruby><rb>'); // テキストを貼り付け
S_Paste(0); // 貼り付け
S_InsText('</rb><rp>（</rp><rt>ふりがな</rt><rp>）</rp></ruby>'); // テキストを貼り付け

```

マクロ起動後、テキスト上で「ふりがな」と書かれた部分をお好みのルビに書き換えてください。

### 使用例
![text5.png](https://qiita-image-store.s3.amazonaws.com/0/161888/5f80e1f1-4507-5896-8708-af6b58bd86b7.png)
　　　　　　↓
（マクロ起動）
![text6.png](https://qiita-image-store.s3.amazonaws.com/0/161888/82fd9ff4-f3c0-e96e-d6b7-3e9df73691b4.png)
　　　　　　↓
（手入力）
![text6.png](https://qiita-image-store.s3.amazonaws.com/0/161888/00745c2b-5ed5-063d-f563-55b1f1d31ff6.png)

## 使い方
1. お使いになるマクロをメモ帳か何かにコピーして保存し、拡張子「.mac」に変更する
2. サクラエディタのマクロフォルダにマクロファイルを移動する（デフォルトでは多分"C:\Users\【ユーザー名】\AppData\Roaming\sakura"）
3. サクラエディタの[ツール(T)]>[キーマクロの読み込み(A)]を選択
4. 先ほど保存したマクロファイルを選ぶ
5. Shift+Ctrl+Lでマクロ実行

サクラエディタの共通設定からマクロ登録すれば、[ツール(T)]>[登録済みマクロ(B)]からいつでも呼び出せるようになります。

## おわりに
マクロ初心者が趣味のついでに作ったものなので、もっと良い方法があるかもしれません。その際は、ご教授頂ければ幸いです。

銀英はいいぞ。最高だ。
gunicorn(>=19.2)ではmax_requestsと一緒にmax_requests_jitterも使おう

## max_requestsとは何か？
gunicornの[max_requests](http://docs.gunicorn.org/en/stable/settings.html#max-requests)パラメータを指定すると、各ワーカープロセスが `max_requests` 回数分リクエストを捌くとプロセスを自動再起動してくれるようになります。
これによってメモリリークを回避し、サーバーのリソース逼迫を防ぐことができます。

## max_requestsだけだとどんな問題があるか？
gunicornでは各ワーカープロセスにほぼ均等にリクエストが割り振られるため、全ワーカープロセスが一斉に`max_requests`に達して再起動してしまうケースが発生します。
そうなるとリクエストを捌けるワーカーがいない状態が一瞬できるので、ユーザー側から見ると「あれっ、このサイト突然激重になった？」ということがありえます。

## バージョン19.2からの新機能max_requests_jitter
そこで、バージョン19.2から[max_requests_jitter](http://docs.gunicorn.org/en/stable/settings.html#max-requests-jitter)パラメータが追加されました。
`Worker`クラスのコードを読むと、`__init__`の中で`max_requests`は以下のように設定されています。[^1]

[^1]: https://github.com/benoitc/gunicorn/blob/19.2/gunicorn/workers/base.py#L48-L49

```py
        jitter = randint(0, cfg.max_requests_jitter)
        self.max_requests = cfg.max_requests + jitter or MAXSIZE
```

つまり、`max_requests_jitter`に0を超える整数を設定すると、各ワーカープロセスの`max_requests`に0から`max_requests_jitter`までのランダムな値が加算されます。これで各ワーカープロセスの`max_requests`が違う値になり、再起動のタイミングがバラけて前述の問題を回避できます。

この機能を提案したのは元Redditのエンジニア[alienth](https://github.com/alienth)さんです。元々Redditで採用していたコードらしいです。
https://github.com/benoitc/gunicorn/pull/862

[alienthさんのコメント](https://github.com/benoitc/gunicorn/pull/862#issuecomment-53175919)によると、「Right now we're using a max_requests of 500, and a max_requests_jitter of 200 so that restarts are highly randomized.」とのことなので、`max_requests = 500` `max_requests_jitter = 200`ぐらいにしておくと、いい感じのバラけ具合になるでしょう。
python3 簡単なタイピングテストプログラム

# python3 簡単なタイピングテストプログラム

## 構成
1. ソースコード　
2. 説明

## ソースコード
``` python
import sys
import random

list1 = ["りんご","きうい","めろん","れもん","すいか","ぶどう","にんじん","たまねぎ","じゃがいも","しお"]

random.shuffle(list1)

input_text = ""
for word in list1:
    while not(word == input_text):
        if input_text == "//stop":
            sys.exit()
        print("======== {} ========".format(word))
        input_text = input()
``` 

## 説明
まず初めに、この説明は

- 変数の代入
- for文
- while文
- import文
- print関数

ぐらいがわかる人を対象としているのでご了承ください。それでは説明していきます。
まず、import文でsysとrandomをインポートして来ています。
そして、list1に問題のリストを代入して、shuffle関数でシャッフルしています。
この関数はリストなどの値の並びをランダムに変えるので、ランダムに順番が変わります。
それから、input_textに空文字を代入しています。これはのちに使うために用意している形です。
ここからfor文で1つ1つの問題を処理していきます。
while文は1度目はinput_textが空文字なのでTrueとなり、input関数によってinput_textにユーザーからの値が代入されます。
2度目以降は、問題と一致するまで繰り返すようになっています。
ちなみに、 //stop と打つと、問題に関係なくプログラムが終了するようになっています。

説明は以上です。
質問や改善したほうがいい点などがあれば、是非お書きください。
Groovyでちょっと困った話

# 最初
先日、[ここ](http://stackoverflow.com/questions/9577929/cleanest-way-in-gradle-to-get-the-path-to-a-jar-file-in-the-gradle-dependency-ca)を見てました。
依存関係のJARを全部集め、自動的に一個のJARにまとめる為に、JARのリストが必要だったからです。
ここのコードを見て思いました。

```groovy:prologue.groovy
project.configurations.compile*.each{...}
```

とすれば、反復処理でJARのパスを取得できるのではないか、と。
では、以下のコードを、Moduleの`build.gradle`にコピペして実行してみましょう。

```groovy:prologue2.groovy
project.configurations.compile*.each{
    println it
}
```

パスの一覧が見れると思いますか?
    
   
**いいえ**
   
   
なんとJARファイルの中身(全JARを`cat`したかのような)を標準出力に出力してしまうんですね。
コンソール(`Terminal`)が大荒れして大変でした。
# 解決と結論
ではどうすれば良かったのでしょうか

```groovy:correct.groovy
project.configurations.compile*.toURI().each {
    File file=new File(it)
    println file//Fileオブジェクトを使う処理に置き換えて下さい。
}
```

こうです。一旦`URI`にしてから`File`に戻します。
こうすると、確実に`File`を反復処理で扱えます。
では、なぜJARファイルの中身を標準出力に出力してしまったのか    
これはあくまでも推測でしかないのですが、
1. `File`オブジェクトが入った`List`(多分)が来る
2. その`File`の**全行**を読み込み(`File.readLines()`)、`ArrayList`にする。<br>上では書きませんでしたが、そのような結果だったと思います。
3. 全行を蓄えた`ArrayList`を展開し、`each`する。
これ全部`println`したらそりゃあ荒れますね...
プロキシ環境下でElectron開発環境の初期セットアップをするときに困ったこと

Electronと戯れようと、[サルでもわかるElectron入門](https://ics.media/entry/7298/2)を参考にインストールを始めました。

しかしProxy環境下で作業してしまったおかげで、いくつかはまりどころがあったので記事書きます。  

# `electron-prebuilt`のinstallでエラー

## 現象①

```bash
npm install electron-prebuilt -g
```

でインストールできるはずでしたがエラーとなりました。
私の環境では、

```
Error: connect ETIMEDOUT 192.30.252.131:443
```

というようなエラーが出ました:pensive:

## 解決策①
下記を参考にしました。
[npm config -g でプロキシの設定をしているのに electron-quick-start や electron-prebuilt でコケる](http://aquasoftware.net/blog/?p=927)

npmのグローバル設定だとダメとのことでしたので以下を実行します。  

```bash
npm config set https-proxy http://proxy.hogehoge.com:XXXX
```

ここから先は私の環境だけの問題かもしれませんが、
再度インストールしようとすると別のエラーが出ました。  

## 現象②
```
Error: unable to verify the first certificate
```

というようなエラーが出ました:persevere:

## 解決策②

下記を参考にしました。
http://stackoverflow.com/questions/37567148/nodejs-unable-to-verify-the-first-certificate

`NODE_TLS_REJECT_UNAUTHORIZED`に`0`を設定するといいようです。  

私の環境はWindowsなので どーん

```bash
set NODE_TLS_REJECT_UNAUTHORIZED=0
```

しかしまた別のエラー。。。

## 現象③
```
Error - 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
```

というようなエラーが出ました:tired_face:


## 解決策②

下記を参考にしました。
[ATOMエディタのproxy設定#proxyがSSL証明書を置き換える場合の追加設定](http://qiita.com/tsukamoto/items/cef0f2d7e2b33a26a9e5#proxy%E3%81%8Cssl%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E8%BF%BD%E5%8A%A0%E8%A8%AD%E5%AE%9A)

ATOMの話ですがnpmにもあるようですね。
先に設定した`NODE_TLS_REJECT_UNAUTHORIZED`でも解決出来るとありますが、僕の環境はなぜかダメでした。なんで？

とりあえず「えい」

```bash
npm config set strict-ssl false
```

このあと再度インストールしたらインストールできました :raised_hands:
（もしかすると`NODE_TLS_REJECT_UNAUTHORIZED`の設定は必要なかったかもしれませんね。）


ということで設定を戻しておきましょう。

```bash
npm config delete https-proxy
npm config delete strict-ssl
```


# `electron-packager`実行でエラー

何かダウンロードするようで、ここでも同じことが起きました。

再度設定して実行したらできました。

electron-packagerが一度実行できればその後はダウンロード走らないようなので、
設定を戻しても大丈夫なようです。
OpenStackエンジニアを育てるにはどうすればよいの？

# 背景
> OpenStackデリバリーできるひといないの？困ってるんだけど。

なかなかいませんよね。分かります。

> OpenStackの要件定義できる人、どこかにいないの？

...


# 目的
まじめな話、上記の様なやりとりは非常に多いです。

Linuxや仮想化技術、サーバーやストレージを主戦場とするインフラエンジニアが OpenStack を引き出しに入れるまでのハードルはぶっちゃけ高い。そこでOpenStackベースのプライベートクラウドの設計や構築をナリワイにできるエンジニアを育てるにはどうすればいいのか？というのを検討する機会としたく入口をまとめてみたいと思います。


# 雇う
一番簡単そうに思えて、実は一番むずかしいのでは？
ここでは触れないでおきます :)

# 習う
教育サービスというのは高コストですがてっとり早いし、リアクティブな人を巻き込むには良い手段だと思います。体系だって学べるのも魅力ですかね。参考までにHPEの教育サービスのコースをいくつか紹介しておきます。

[OpenStack® ファンダメンタルズ＜含認定試験＞](http://h50146.www5.hp.com/services/education/teiki/seihin/H6C68S.html)

[OpenStack® まとめて習得(OpenStack®の基礎+Neutron)](
http://h50146.www5.hpe.com/services/education/teiki/seihin/H0LT1S.html)

[OpenStack®まとめて習得(OpenStack®の基礎+Cinder)](http://h50146.www5.hpe.com/services/education/teiki/seihin/H0LT2S.html)

もちろんHPE以外でも OpenStack 関連の教育サービスはありますので一部ご紹介しておきます。
http://www.school.ctc-g.co.jp/openstack/ 
https://www.neclearning.jp/training/openstack.html 
http://www.aseanlabs.com/opcel-c16x4 
https://www.mirantis.co.jp/training/ 

# まねぶ
達人の業績に依るのは賢いやりかたです。

[OpenStackの情報をどこから得ているのか](http://www.slideshare.net/ishikawa84g/openstack-3632030)


# 読む
オープンソースなんだし読もうよ。ですね。英語も慣れだと思います。
http://docs.openstack.org

目的に応じて情報をとればよいと思うのですが、とっかかりとして読むと良いだろう内容を幾つかピックアップしておきます。

[Newton Installation Tutorials and Guides](http://docs.openstack.org/project-install-guide/newton/)
>インストールについてなのですが、OpenStackの構造や機能を把握するのに良い内容です。

[OpenStack End User Guide](http://docs.openstack.org/user-guide/)
> OpenStackのテナントユーザとしての利用法を把握できます。インスタンスを作ったり、ネットワークを構成したり。馴染みのない方には良いですね。`

[OpenStack Command-Line Interface Reference](http://docs.openstack.org/cli-reference/)
> APIに思いを馳せつつ、まずはnovaあたりからコマンドライン使ってみましょう。GUIよりは仕組みを理解しやすいはずなのでエンジニアリングの観点ではCLI中心で触ってみることをオススメします。

[OpenStack Administrator Guide](http://docs.openstack.org/admin-guide/)
> 管理者ガイドですね。システム構造やトラブルシュートなどの情報がザクザク。

[OpenStack Operations Guide](http://docs.openstack.org/ops-guide/)
> こちらは運用ガイド。運用、といいつつ基盤構築のガイドラインという感じです。CPUどうすんだとか、ストレージどうすんだとか。

[HPE Helion OpenStack 4.0](https://docs.hpcloud.com/hos-4.x/)
> HPEのディストリビューションのdocsです。使う予定がなくてもOverviewくらい斜め読み頂ければと思います。distroのいいところは色々ありますが、OpenStack知らなくてもOpenStack作れちゃうとこだったりします。HelionはHelionで特徴あるので努力が必要な訳ですが…

[Product Documentation for Red Hat OpenStack Platform](https://access.redhat.com/documentation/en/red-hat-openstack-platform/)
> Red Hat OpenStack Platform のドキュメントです。非常に充実していて勉強になります。

# 読む（日本語）
ユーザー会の皆様のご尽力でいくつかのドキュメントは日本語化されています。

[OpenStack インストールガイド Ubuntu 版](http://docs.openstack.org/mitaka/ja/install-guide-ubuntu/)
[エンドユーザガイド(Python SDK付)](http://docs.openstack.org/ja/user-guide/)

# 触る
[DevStack](http://docs.openstack.org/developer/devstack/) や [TryStack](http://trystack.org/) など OpenStack にトライするための方法は色々あります（が、私もそんな詳しくないので割愛）

# 働く
実践の場が一番学習効率高いですよね。OJTでも実際の案件でもどんどんトライするのが吉です。

# 楽しむ
楽しいですよ。つら楽しい。
rakeタスクに可変長の引数を渡す

##よくある引数ありのrakeタスク
`% rails g task task_name`でタスク生成

```ruby
namespace :task_name do
  desc "実行処理の説明"
  task :create, ['hoge', 'fuga'] => :environment do |task, args|
    p task
    p args
  end
end
```

###実行

```ruby
% rake 'task_name:create[foo, bar]'

#　実行結果

<Rake::Task task_name:create => [environment]>
{:hoge=>"foo", :fuga=>"bar"}
```

この受け取り方だとargsは予め指定した形のHashになるので、可変長は渡しづらい

## 対策
ARGVから引数を受け取る

```ruby
namespace :task_name do
  desc "実行処理の説明"
  task create: :environment do |task|
    p ARGV
    p task.name
    # sliceしたいけどARGVはfrozenなのでdup
    copy = ARGV.first.dup
    copy.slice!(task.name)

    #配列っぽい文字列("[foo,bar]")が出来るので配列にする
    args = YAML.load(copy)
    p args
  end
end
```

### 実行
```ruby
% bundle exec rake 'task_name:create[foo,bar]'

# 実行結果

["task_name:create[foo,bar]"]
"task_name:create"
["foo", "bar"] #=>Array
```

ひとまず満足
S3シミュレーターをDockerで動かす

## 概要

s3rverはS3のシミュレーターです。
以下のことが可能です。

**Buckets**

- Create bucket
- Delete bucket
- List buckets
- List content of buckets (prefix, delimiter, marker and max keys, common prefixes)

**Objects** 

- Put object (support for metadata, including ContentEncoding (gzipped files)
- Delete object(s)
- Get object (including using the HEAD method)
- Get dummy ACLs for an object
- Copy object (including updating of metadata)

## 手順

s3rverをDockerで動かし、バケット作成、およびファイルのアップロードやダウンロードをするための手順を以下に示します。

1. Dockerfileの作成

```
FROM node

RUN npm install -g s3-proxy
RUN npm install -g s3rver

RUN mkdir -p /data

EXPOSE 4567

CMD ["s3rver", "-d", "/data", "-p", "4567", "-h", "0.0.0.0"]
```

2. イメージの作成

```
docker build -t hryshtk/s3rver .
```

3. コンテナの起動

```
docker run -d -p 4567:4567 hryshtk/s3rver
```

4. バケットの作成

```
curl -XPUT localhost:4567/hoge
```

5. ファイルのアップロード

```
curl -XPUT -T hello.txt localhost:4567/hoge/
```

6. ファイルのダウンロード

```
curl -XGET localhost:4567/hoge/hello.txt
```

参考URL
https://www.npmjs.com/package/s3rver
Java の URLConnection で基本認証を行う際のハマりどころ

基本認証はサーバ側が対応していれば、以下のような URL でアクセス可能です（以下 URL は記事用のダミーです）。

```
http://username:password@example.com
```

以下のように curl で叩くと期待した結果が帰ってきます。

```bash
$ curl http://username:password@example.com
```

これを Java の URLConnection で行うと失敗します。

```java
URL url = new URL("http://username:password@example.com");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();  // ここで失敗する
```

Android では以下のような例外が出ます。

```
java.io.FileNotFoundException: http://username:password@example.com
     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:250)
     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)
     at com.example.ogata.Test$1.run(Test.java:53)
```

Java では以下のような例外が出ます。

```
java.io.IOException: Server returned HTTP response code: 401 for URL: http://username:password@example.com
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
	at Test$1.run(Test.java:31)
```

Java では URLConnection を用いた基本認証は以下のように行います。

```java
URL url = new URL("http://example.com");
URLConnection conn = url.openConnection();
conn.setRequestProperty("Authorization", "Basic " + Base64.encodeToString("username:password".getBytes(), Base64.NO_WRAP));
// conn.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString("username:password".getBytes()));
InputStream is = conn.getInputStream();
```

Base64 の API は Android と Java 8 で若干異なります。上記のコメントアウトされている行は Java 8 です。
Burp Suiteの設定と使いかた手順!

ローカルプロキシツールBurpについて説明します。

<h4>Burpとは</h4>
Webアプリケーション開発時の検証において、Webサーバとブラウザ間の通信内容を確認するケースがあると思いますが、このような時にローカルプロキシツールはとても役に立ちます。
Burp Suiteは様々な機能を持っており、その中で私が最も使う機能は「Proxy」です。 
診断やデバッグに必須の機能で、通信処理を確認できるので
APIからレスポンスは返ってきているのか？
無駄な通信処理は行ってないか？
通信処理を行うアプリケーションには必須のデバッグツールとなっております。
ローカルプロキシツールは、クライアントマシン上で動作します。これによりブラウザからのリクエストを一旦キャプチャして、内容を変更した上でWebサーバへリクエストすることができるようになります。
これによりブラウザからのリクエストを一旦キャプチャして、内容を変更した上でWebサーバへリクエストすることができるようになります。




Burpの設定では大きくPC側の設定(プロキシサーバの構築)と端末側の設定で分かれます。
プロキシサーバーを構築後、端末設定を行う必要があるため手順に注意して下さい。

<h2>PC側の設定(プロキシサーバ構築)を行う</h2>
<h4>Proxy(プロキシサーバ)とは</h4>
プロキシ（代理）という言葉が示す通り、インターネット上の目的のコンテンツ（Webページやファイル等）をユーザのコンピュータの代わりに取って来てくれる機能を提供するサーバです。
中継しているため、通信処理の取得が可能となっております。

<p>1.Burp SuiteのFreeEditionをダウンロードし起動する</p>

https://portswigger.net/burp/download.html

<img width="500" alt="スクリーンショット 2017-01-27 19.06.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/95254/50d88ae9-13bc-fa9a-89e1-b7b099c972a0.png">

<p>2.Proxyを選択してIntercept offにする</p>
<img width="500" alt="スクリーンショット 2017-01-27 19.07.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/95254/fe67a1b9-ea7d-9c31-585d-9a5c2d5063f2.png">

<p>3.wifi環境を設定</p>

<img width="67" alt="スクリーンショット 2017-01-27 19.07.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/95254/aed52232-a889-039e-97b2-06f2a211a37f.png">

<p>4.Addを選択しネットワークを選択する</p>
<img width="757" alt="スクリーンショット 2017-01-27 19.26.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/95254/8356e36f-b527-c84a-4301-230c6fecf52e.png">

<p>5.Specific addressを選択してBurpに加える</p>
<img width="704" alt="スクリーンショット 2017-01-27 19.24.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/95254/0e48d270-8af8-c713-72be-84e616f578c9.png">
これでPC側の設定(Proxyサーバー)の出来上がりです。

<h2>端末の設定を行う。</h2>
<p>6.iPnone/Androdと繋げるため証明書を取得する</p>
端末のブラウザを開き端末(スマートフォン)とPCが接続しているネットワークのIPアドレスを入力する。
CA certificateを選択して証明書をインストールする。
証明書をインストールデフォルトだと拡張子は　.derでダウンロードできる。
(Androidの場合拡張子は.cerに変更してインストールする必要がある)
<img width="300" alt="[Screenshot_20170227-140313.png]" src="https://qiita-image-store.s3.amazonaws.com/0/95254/4b171237-8603-9955-1fd1-658299f87307.png">

<p>7.インストールしたらProxyをPCのburpで設定したものと揃える</p>

<p>8.burpを起動してHTTP　historyを選択する</p>

通信が見れます！

<img width="629" alt="スクリーンショット 2017-03-10 20.26.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/95254/8295ead9-ac8a-f55d-80e0-0824e6909e89.png">

これを使えば
通信処理のリクエストが送れているか？
レスポンスが返ってきているか？
どんな値なのか？
可視化できます。
以上、Burpの説明でした。
Browsable Intentのセキュリティ観点について

JSSECが公開している『Androidアプリのセキュア設計・セキュアコーディングガイド』の2016-09-01版を共有用にまとめているもののうち、「4.7. Browsable Intentを利用する」のものとなります。
詳細やサンプルコードについては原著の方を参考ください。

## チェックポイント
- [ ] Webページ側は対応するURIスキーマのリンクにセンシティブな情報を含めてはいけない
- [ ] URLのパラメータを利用する前に値の安全性を確認する

## Tips
### Browsable Intentの動作保証について
Browsable IntentはURIスキーマを押せば、アプリが起動する仕組みですが、アプリ側とWebページ側での、意図した動作が保証出来るものではありません
Web側でリンクを押した場合、URLが入った暗黙的Intentと同じ動作をします。そのため、ユーザーがこちらの意図したアプリを起動する保証が出来ません
また、URIスキーマは誰でも作成可能なため、正規のWebページからアプリにURIが送られてくるとは限りません
 
## 参考
『Android アプリのセキュア設計・セキュアコーディングガイド』【2016年9月1日版】
https://www.jssec.org/dl/android_securecoding.pdf
unityRemote5が動かない問題


iosで動かしたかったが動かない。
具体的には`edit->projectSetting->editor->Device`欄にIOSが出てこない。


## 結論
`buildsetting`を`ios`に
`switchPlatform`を押す

恐らくここで`no module loaded.`と出てたらそれが原因

モジュールをインストールすれば出てくると思います。
MySQLのテーブルキャッシュについて

MySQLのテーブルキャッシュに関して、まとめました。
ちなみに全てInnDBを想定しています。

https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_table_open_cache 
https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_table_definition_cache 

まず、MySQLのテーブルキャッシュは2種類存在する。

### 1. 通常のテーブルキャッシュ（table_open_cache）

・table_open_cache 変数で設定する
・同時に「オープン」できるテーブル数を設定できる
・キャッシュする対象は、テーブルのファイルディスクリプタ
・「テーブルキャッシュ」＝「mysqldプロセスがメモリ上に保持するファイルディスクリプタの数」

・「table_open_cacheの引き上げ」＝「同時に開けるテーブル数増加」 
　　＝「mysqldプロセスが要求するファイルディスクリプタの上限値引き上げ」
・ただし、OS側がmysqldプロセスに対して許可するファイルディスクリプタ上限は、「open_files_limit」変数で規定する必要がある
→ table_open_cache をかなり大きな値にする場合は、open_files_limit の設定にも注意

### 2. テーブル定義キャッシュ（table_definition_cache）

・table_definition_cache 変数で設定する
・テーブル定義（.frmファイル）をキャッシュする
・テーブル定義をキャッシュすることでテーブルを開くとき高速化できる

### 2つのテーブルキャッシュの違い

・テーブル定義キャッシュは、標準のテーブルキャッシュと異なり、占有スペースが少なくファイルディスクリプタを使用しない
・ただし、テーブルキャッシュもファイルディスクリプタしかキャッシュしていないので、そもそもメモリを余り消費しない
・テーブルのデータサイズの影響も受けない（キャッシュ対象がファイルディスクリプタ or テーブル定義だから）
→ データ/インデックスのキャッシュはバッファプール
線画着色webサービスPaintsChainerを公開した

http://paintschainer.preferred.tech
こちらに先月記事にした線画の着色のデモを公開しました！！
反響の大きかった皆さんに試していただけます！！（ちょっと期待値が上がり過ぎてないといいですがｗ）


http://qiita.com/taizan/items/cf77fd37ec3a0bef5d9d
以前の記事『初心者がchainerで線画着色してみた。わりとできた。』はこちら。
⇓そしてこちらがもじゃくっきーさんの使用例になっております。
<img width="611" alt="スクリーンショット 2017-07-28 16.01.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/61566/06ef88cc-5d04-5a77-ff10-01a009a400de.png">



GPUを使っている関係上アクセスが集中したりすると遅くなったりサーバーが落ちたりする可能性もありますが、生暖かく見守っていただければと思います。←たくさんの方に広まったこともあって、めっちゃ重くなっています。ぐぬぬぬ

<img width="1203" alt="スクリーンショット 2017-01-27 14.38.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/61566/349e4366-f504-2e86-9468-9c146eeb5f57.png">

画面はこんな感じっす。
線画ファイルを選択するととりあえず自動で塗ってくれます。
※ただし、現状ではgifや透過pngは対応してません。 jpgか普通のpngでお願いします

ファイル選択してしばらくすると↓みたいな感じで、線画と着色結果１段目と着色結果２段目が表示されます。1段目が大体128px 2段目が大体512pxです。

<img width="1435" alt="スクリーンショット 2017-01-27 17.31.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/61566/fca62335-818e-b99e-3236-bb5474bea6af.png">

次にカラーパレットから着色したい色を選んでヒントをつけていきます。
あまり彩度の高い色より、淡い色をつけたほうがなんとなくうまくいくケースが多いです。


<img width="583" alt="スクリーンショット 2017-01-27 17.36.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/61566/3078b134-883d-c63b-756b-e9f286f18764.png">

ヒントをつけたらcolorizeボタンを押せばヒントを参考に着色してくれます。
雑なヒントでうまくいく場合もありますが、細かくヒントを与えないといい感じにならないケースもあります。
コツがわかるとニューラルネットの気持ちがわかるようになってきます。

<img width="1303" alt="スクリーンショット 2017-01-27 17.41.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/61566/1395bbc5-ce42-ccf4-1ae2-2f3d820e885a.png">


画像ごとに色んなパラーメータを手動で調節すると更に上手くケースもあるのですが、今回は割愛してます。

前回はモデルだけでしたが、トレーニング、UIも含んだソースコードをgithubに上げました。
https://github.com/taizan/PaintsChainer
学習済みのモデルデータもこちらからダウンロード出来ます。
http://paintschainer.preferred.tech/downloads/

なので、GPUがあれば手軽にクローン環境を作れます。
まだまだ調教不足なところもあるので、ファインチューニングしてもっといい感じにしてやってください。
そのうち使わなかったモデル群も供養がてらにうｐしようかと思います。

あと、仕事中に結構な工数を使ったので、chainerのPRという言い訳をするために、chainerにぜひスターつけたりプルリクしてコントリビュータになったりしてください。chainerをよろしくお願いします。

今回のシステムを作るにあたり、協力していただいたmattyaさんrezoolabさんに感謝！！
LLDBについて

#LLDBを使おう
サーバーサイドの人と分担がきっちり分かれているような現場でDBもろくに見れなかった時の話です。

APIからの全エラーコードチェックテスト時😅に
いちいちサーバサイドの人にやってもらうのは大変だなと思い

自分「それぞれのエラーコードはどうやったら切り分けたり位ですかね？」

とチームの人に相談したら

チームの人「デバッグ時にLLDBで書き換えちゃえばいいよね！」

と言われて、完全に（ ゜Д゜）ﾎﾟｶｰﾝ

  チームの人「エンジニアなら知ってるよね？」
       自分「ははは。もちろんですよ！いやーうっかりしてたなー」

と言うことがありましたので忘れないようにメモ書き。

・・・ええ、もちろん知っていましたとも

##簡単なコードを準備
```objective-c:objective-c-viewDidload
- (void)viewDidLoad {
    [super viewDidLoad];
 
    // 対象の変数
    int count = 0;

    // ここでブレークを貼ってLLDBの入力する
    if (count == 0)
    {
        NSLog(@"count %d",count);
    }
    else if(count == 1)
    {
        NSLog(@"count %d",count);
    }
    
    // 表示を確認できるようにラベルをセット
    UILabel *countLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    countLabel.backgroundColor = [UIColor yellowColor];
    countLabel.textAlignment = NSTextAlignmentCenter;
    countLabel.text = [NSString stringWithFormat:@"count %d",count];
　　// ここでもブレークを貼って
    [self.view addSubview:countLabel];
}
```

表示はこんな感じ
![スクリーンショット 2017-01-27 18.20.28.png](https://qiita-image-store.s3.amazonaws.com/0/8109/3ed204cb-627a-a964-5fc6-c15da8786d06.png)


## 変数の中身を確認する
１、Runさせます

２、ブレークを貼ります（上記参照）
![スクリーンショット 2017-01-27 18.08.24.png](https://qiita-image-store.s3.amazonaws.com/0/8109/75f135a0-1aa0-195f-25ba-7aeba4bb84da.png)

３、デバック・エリアを選択
![スクリーンショット 2017-01-27 17.57.09.png](https://qiita-image-store.s3.amazonaws.com/0/8109/f18d6aeb-27d1-527e-212f-3f71015a95ba.png)

４、```po count```と入力します

５、```0``` と表示されます。これが変数の中身です。
![スクリーンショット 2017-01-27 18.08.52.png](https://qiita-image-store.s3.amazonaws.com/0/8109/659be200-649e-82a6-c0ca-51c1b06fae6d.png)

６、見えるのは変数だけではありません。次のブレークに進みましょう
![スクリーンショット 2017-01-27 18.10.52.png](https://qiita-image-store.s3.amazonaws.com/0/8109/a5cb2ca9-a1bf-430a-d656-7f9dbb4311cb.png)

７、今度は```po countLabel```と入力します

８、するとlabelの設定が表示されます。便利
![スクリーンショット 2017-01-27 18.12.21.png](https://qiita-image-store.s3.amazonaws.com/0/8109/1950ae19-8e5a-10ca-9d18-3058c2f57567.png)

## 変数の中身を書き換える
１、[変数の中身を確認する]の１、２、３、まで一緒。
２、```po count = 1```と入力する
３、すると1と表示されます。これで中身が書き換わりました。
![スクリーンショット 2017-01-27 18.18.59.png](https://qiita-image-store.s3.amazonaws.com/0/8109/97fc9170-74fc-d2b9-03dc-b55abac51604.png)
４、ラベルを見て確認してみると
![スクリーンショット 2017-01-27 18.21.50.png](https://qiita-image-store.s3.amazonaws.com/0/8109/25eead69-f3bd-eccf-aab6-f5cbc475ffe0.png)
と変わっています。

## 終わり
非常に簡単なところだけ、他にも色々機能があるのでてどんどん効率を高めたい。

test code：
https://github.com/kentarokentaro/Test
ホームディレクトリにいつの間にかmissfont.logができてしまう対策

### **前置き**

私は仕様書等の技術ドキュメントはLaTeXで書いています。
Word系はなぜか書いていくにつれて体裁がどんどん腐っていくから嫌いで，
Markdownは悪くはないのですが，最終的に目次とページ番号付きで印刷できる状態にしたくて，
SphinxとかpandocとかGitBookとかも調べたのですが，
イマイチかゆいところに手が届かない感じだったのでLaTeXでいいやとなっています。

そしてそれを布教しようと，LaTeXビルド環境が一発で入るDockerイメージを作り，
Dogfoodingを兼ねて，それを使って文書作成をしていました。
ホスト側（Ubuntu MATE）でtexファイルがあるディレクトリをDockerコンテナにマウントし，
ホスト側で書き進めたら，コンテナ内のbashが動いているコンソールでmakeするとpdfになり，
そのままホスト側のPDFビューアーで確認できる，という具合です。
使い勝手的には特に不満もなく（Texlipseとかは使えなくなりましたが，Visual Studio CodeにTeX用のプラグインを入れたら全く十分）使っていたのですが…

### **現象**

ふと見ると，**ホスト側**のホームディレクトリに missfont.log というファイルが出来ています。

missfont.logの中身を見ると，

```
mktextfm cmtt10
mktextfm cmr10
mktexpk --mfmode / --bdpi 600 --mag 1+0/600 --dpi 600 cmtt10
mktexpk --mfmode / --bdpi 600 --mag 1+0/600 --dpi 600 cmr10
```
こんな内容が延々と繰り返し書かれています。
明らかにTeX関係っぽいログですが，問題はTeXの環境はDocker内にあり，
ホスト側には環境がないのです。
でもtailしながらtexファイルをビルドすると，やはりビルドしたタイミングでログが増えます。

不気味になりいろいろ調べたのですが，そこは割愛。

### **原因**

原因は，ホスト側で，ファイルマネージャーのCaja（NautilusのUbuntu MATE版）で，
texからまず変換される.dviファイルが生成されるディレクトリを開いていて，
.dviファイルが更新される度に，そいつがおそらくサムネイルを作ろうとか何かの動きをとることによって，
missfont.logが書き出される…という話でした。
ファイルマネージャのウィンドウを閉じたら，ビルドしてもログが出ない事が確認できました。

### **解決策**

最初はCajaの設定を変える，とここに書いたのですが，再度よく確認してみましたがダメでした。
次に，dconf-editorでthumbnailerのキーにmime-typeでdisableを指定する，という方法も
試しましたが全く効かず。

最終的には少しパッケージをホスト側に追加して，なんとか黙らせました。

```
sudo apt-get install texlive-binaries
sudo apt-get install fonts-ipafont
```
しょぼい結論。
Vagrant起動時にマウントできない

# vagrant up でマウントできない

vagrant up のコマンドを実行したとき、「おっ、うまくいってるぞ」と思っていたのに、
最後のフォルダをマウントするところでコケる。


エラーは下記のようなもの。

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

原因はカーネルがバージョンアップしてしまい、buildディレクトリのリンクが切れてしまっているのかなぁ。
以下のコマンドで解決。


```
$ vagrant ssh
$ uname -r 
$ ls -ltr /lib/modules/
$ sudo yum install ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/6.7/x86_64/updates/security/kernel-devel-2.6.32-573.12.1.el6.x86_64.rpm
```

ここまでで、カーネルがインストールされる。
このあと、リンク切れを確認する。

```
$ cd /lib/modules/2.6.32-358.23.2.el6.x86_64/
$ ls -ltr
```

のちに、下記のような表示で、リンク元が点滅しているのがわかる。

```
lrwxrwxrwx.  1 root root     51 Jan 17  2014 build -> ../../../usr/src/kernels/2.6.32-358.23.2.el6.x86_64
```

このリンクを張り替えてあげればおけ。


```
$ mv build build.org
$ ln -s /usr/src/kernels/2.6.32-573.12.1.el6.x86_64 build
```


張り替え完了。


これでvagrantの再起動を行えば解決。


※ ディレクトリ階層がひとによって違うようでしたら申し訳ないです。


以上！！！！
Mackerelの監視モニタリングをコード管理しよう

# 概要
* Mackerelの監視項目を手動でポチポチ追加削除めんどくさい
* コード管理したいよね
* それmkrコマンドで出来るよ！ https://mackerel.io/ja/docs/entry/advanced/cli

# 今回は下記グラフの監視設定を追加してみます
* メトリック名：custom.rds.Deadlocks
* label名：Deadlocks
* 閾値： 5 warning, 10 critical, 3回計測
* `hoge.com:db`, `fuga.com:db`が対象
![スクリーンショット 2017-01-27 17.55.09.png](https://qiita-image-store.s3.amazonaws.com/0/29405/555ed61a-32c9-08b2-bdf9-c0541c4fc489.png)



# 内容
## ①mkrでwrite可能なMackerel API_Keyを読み込んでおく
```bash
$ vim ~/.bashrc
export MACKEREL_APIKEY="xxxxxx"

### 読み込む
$ source ~/.bashrc
```

## ②mkrインストール
```bash
### 参照：https://mackerel.io/ja/docs/entry/advanced/cli
$ brew install mkr
```

## ③今回はdeadlockというのを監視してみます
```bash
### ディレクトリ作成
$ mkdir /path/to/mackerel

### ディレクトリ移動
$ cd /path/to/mackerel

### 最新のデータを持ってくる
$ mkr monitors pull
# monitors.jsonが出来る

### 編集してdiff
$ vim monitors.json
# diffで出力されるのであえて書かない

$ mkr monitors diff
+ {
+   "name": "custom.rds.Deadlocks",
+   "type": "host",
+   "metric": "custom.rds.Deadlocks.Deadlocks",
+   "operator": ">",
+   "warning": 5,
+   "critical": 10,
+   "duration": 3,
+   "scopes": [
+     "hoge.com: db",
+     "fuga.com: db"
+   ]
+ },

### 反映
$ mkr monitors push --dry-run
$ mkr monitors push
# 403 Forbiddenが出る人はAPI_KEYがReadOnlyかもしれないです

### 反映後、idが付与されるので、pullしてください。
$ mkr monitors pull
```

## ④確認
* Monitorsに追加されてる
![スクリーンショット 2017-01-27 17.59.41.png](https://qiita-image-store.s3.amazonaws.com/0/29405/136103ab-a943-8eb1-21ac-51ee6f10afbf.png)

* 対象のホストの右側にも追加されてる（時間差で反映されます）
![スクリーンショット 2017-01-27 18.00.41.png](https://qiita-image-store.s3.amazonaws.com/0/29405/d0c7c261-16ad-b830-b007-4dc67114aca1.png)

# 最後に
* mkrでの監視モニタリングのコード管理すごい便利！
* コード化出来たので、そのままGit管理していきましょう
gitでyarn.lockを常にバイナリとして扱う

`git add -p` で yarn.lock に突入するのを抑止したかった

## やり方1: プロジェクト単位の設定

プロジェクトルートに以下のファイルを置く

```:.gitattributes
yarn.lock binary
```

## やり方2: プロジェクトにコミットせず個人的に設定

```:.git/info/attributes
yarn.lock binary
```


## やり方3: 個人のグローバルな設定

```:~/.gitconfig
[core]
attributesfile = ~/.gitattributes
```

```:~/.gitattributes
yarn.lock binary
```

Ruby の Gemfile.lock や Unity の Asset.yml に応用できる

## 参考

- http://www.callcc.net/diary/20120505.html#p02
- https://git-scm.com/book/ja/v1/Git-のカスタマイズ-Git-の属性