OmniAICreator/Qiita-1.07M huggingface dataset:
Bitbucket  - SSH接続、Jenkins連携、Slack連携


![](https://rtfm.co.ua/wp-content/uploads/2015/06/bitbucket-logo.png)![](http://i0.wp.com/blog.a4works.co.jp/wp-content/uploads/2014/12/jenkins_logo.png?resize=128%2C128)![](https://a.slack-edge.com/66f9/img/slack_hash_128.png)

## Jenkins連携
1. `Bitbucket Plugin`pluginインストール
2. Jenkins > project > settings
    3. source code management
        * repo URL: `https~`
        * auth info: `add account`
    4. build/trigger
        * `Build when a change is pushed to BitBucket`
3. Bitbucket > repo > settings > Hooks
    4. Bitbucket Server Webhook to Jenkins
        * Jenkins URL: http://host:8080/safeRestart
        * Repo Clone URL: `HTTP`

## Jenkins再起動方法
Jenkins URL: http://host:8080/safeRestartにアクセスする

## Slack連携
1. `Slack Notification Plugin`pluginインストール
2. Jenkins > Jenkins management
    3. Global Slack Notifier Settings
        * Team Subdomain
        * Integration Token
3. Jenkins > Project > settings
    4. ビルド後の処理
        * 必要なものにチェック
4. Slack > Apps & integrations
    5. Jenkins CI
        * Add Configuration
        * Select channel

# git

## Git Shortcut Key

```bash
git config --system alias.st status
git config --system alias.co checkout
git config --system alias.br branch
git config --system alias.cm commit
git config --global --list
alias g='git'
# Powershellの場合
# Set-Alias g git
```

## [Bitbucket SSH setting](https://confluence.atlassian.com/bitbucket/set-up-ssh-for-git-728138079.html)

```bash
# ~/.ssh/id_rsa.pubと~/.ssh/id_rsaを作成
ssh-keygen

# id_rsa.pubの中身をbitbucketマイページの ssh settingsにコピペ
cat ~/.ssh/id_rsa.pub
```

~/.bashrc

```bash
SSH_ENV=$HOME/.ssh/environment
  
# start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."
    # spawn ssh-agent
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add
}
  
if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
	 ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
	    start_agent;
	}
else
    start_agent;
fi
``` 

```bash
bash -l
git clone <repo>
```

SourceTreeを使用する場合
PuTTY Key Generatorを使用し、~/.ssh/id_rsa.ppkを作成
SSH Agentを起動し、~/.ssh/id_rsa.ppkを追加する
Ruby Tricks



![](https://ruby.tw/logo.gif)

## `**`で引数でHashを受け取る

```rb
def my_method(a, *b, **c)
  return a, b, c
end

my_method(1)
# => [1, [], {}]

my_method(1, 2, 3, 4)
# => [1, [2, 3, 4], {}]

my_method(1, 2, 3, 4, a: 1, b: 2)
# => [1, [2, 3, 4], {:a=>1, :b=>2}]
```

## Single ObjectとArrayを同じように扱う

```rb
stuff = 1
stuff_arr = [1, 2, 3]

[stuff].map { |s| s + 1 }    
# = Array(stuff).map { |s| s + 1 }

[*stuff_arr].map { |s| s + 1 }    
# = stuff_arr.map { |s| s + 1 }    
# = Array(stuff_arr).map { |s| s + 1 }
```

## ||= (@totalが空だったら実行する)
1回目は時間かかるけど2回目は時間がかからない

```rb
require 'benchmark'

def total(val)
  @total ||= (1..val).to_a.inject(:+)
end

result = Benchmark.realtime do
    total(100000000)
end
puts "1: #{result.round(2)}s"

result = Benchmark.realtime do
    total(100000000)
end
puts "2: #{result.round(2)}s"
```

## アルファベット、数字の配列を作る

```rb
('a'..'z').to_a # [*'a'..'z']
# => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

(1..10).to_a # [*1..10]
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

## Tap

```rb
class User
  attr_accessor :a, :b, :c
end

def my_method
  o = User.new
  o.a = 1
  o.b = 2
  o.c = 3
  o
end

# より読みやすくする
def my_method_readble
  User.new.tap do |o|
    o.a = 1
    o.b = 2
    o.c = 3
  end
end
```

## オブジェクトをコピーする

```ruby
base = [1, 2, 3]
copy = base
copy.reverse!
p "--- = ---"
p copy
p base
p copy.equal?(base)

base = [1, 2, 3]
copy = base.dup
copy.reverse!
p "--- dup ---"
p copy
p base
p copy.equal?(base)
```

## `def xxx(&yyy)`ブロック引数
#### yield
ブロックを呼び出すもの

```ruby
def block
  yield
end

block do
  p "This is block!"
end
# "This is block!"
```
#### Proc
ブロックをオブジェクト化したもの、callで呼び出すことが出来る
Proc.newとlambdaはほぼ同義

* 引数の取り扱い(数があっていない場合)
Proc: 実行される
lambda: ArgumentError

* return, break したときの挙動
Proc: callしたコンテキストでreturn(トップレベルで call した場合、LocalJumpError)
lambda: ブロック内の処理を抜ける

```ruby
proc = Proc.new do
  p "This is proc!"
end
proc.call
# "This is proc!"

lambda = lambda {p "This is lambda!"}
# lambda = -> {p "This is lambda!"}
lambda.call
# "This is lambda!"
```
#### ブロック引数
&でブロック引数を受け取ることを明示
&を付けることで引数が渡ってきた時にProcオブジェクトに変換

```ruby
def test1(&block)
    yield
end
test1 do
  p "This is block1!"
end
# "This is block1!"

def test2
    yield
end
test2 do
  p "This is block2!"
end
# "This is block2!"
```
VSCodeのキーバインド設定、Extensionの簡易説明

![](https://chocolatey.org/content/packageimages/vscode.portable.1.10.1.png)

[Windows](http://qiita.com/TakahiRoyte/items/cdab6fca64da386a690b)
[Mac](http://qiita.com/naru0504/items/99495c4482cd158ddca8)

## キーバインド設定
* code画面とterminalを行き来する
* 複数のterminalを移動する

```json:keybindings.json
json
[
    {
        "key": "ctrl+;",            "command": "workbench.action.terminal.focus",
                                    "when": "editorTextFocus"
    },
    {
        "key": "ctrl+;",            "command": "workbench.action.focusFirstEditorGroup",
                                    "when": "terminalFocus"
    },
    {
        "key": "ctrl+n",            "command": "workbench.action.terminal.focusNext",
                                    "when": "terminalFocus"
    },
    {
        "key": "ctrl+p",            "command": "workbench.action.terminal.focusPrevious",
                                    "when": "terminalFocus"
    }      
]
```

# Extension
## CodeRunner
Ctrl + Alt + N start
Ctrl + Alt + M stop
## Color Highlight
CSS Color
## HTML Snippets
Code snippets
## Git History
View Git History
Ctrl + Shift + P > view his
## Simple Ruby ERB
Ctrl + Shift + `

`<%= %>, <% %>, <%# %>`
## vscode-icons
icon
## PowerShell
Code snippets etc
## Javascript Snipet Pack
Code snippets

```
cl console.log('')
fn function methodName (arguments) {}
afn function(arguments) {}
fe array.forEach(function(item) {});
jp JSON.parse(${1:obj});
DOM
```
nginx source build と openssl にゃ

## 結論

macOS の時は openssl のソースDLして build しろってことぽい

## 話

ネットの情報に流される 👉 ビルドできない 👉 MLから察するにソース持ってきてぽい 👉 できた

`configure` でこれでたら、ソースをダウンロードして ビルドする

```
checking for PCRE library ... found
checking for PCRE JIT support ... not found
checking for OpenSSL library ... not found
checking for OpenSSL library in /usr/local/ ... not found
checking for OpenSSL library in /usr/pkg/ ... not found
checking for OpenSSL library in /opt/local/ ... not found

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.
```

コマンドのまとめ

```
$ wget -O nginx.tar.gz http://nginx.org/download/<version>.tar.gz
$ wget -O ssl.zip https://github.com/openssl/openssl/archive/master.zip

$ tar -zxf nginx.tar.gz
$ unzip ssl.zip

$ cd nginx-<version>

$ ./configure --with-openssl=../opnessl-master   # <- これ
$ make
$ make install 
```


## やらなくてよかったこと

* `brew link openssl --force`  👉 macOS が許可しなくなった
* `export PATH=/usr/local/opt/openssl/bin:$PATH` 👉 openssl コマンド不要
* `--with-openssl=/usr/local/opt/openssl` 🤛 ソースが必要ですからぁー
* `KERNEL_BITS=64` 👉 不要かも

## 余談

`brew info openssl` すると 優しさに触れれる

```
If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include
For pkg-config to find this software you may need to set:
    PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig
```


## Reference

* [Re: building nginx with non-system openssl ?](https://forum.nginx.org/read.php?2,70767,70934#msg-70934)
* [MacでOpenSSLを静的リンクしたnginxのビルドが失敗するときの対処法](http://qiita.com/cubicdaiya/items/d17bbf4fb1013d175103)
     * [Fixed a build failure when OpenSSL is static-linked on Mac.](https://github.com/cubicdaiya/nginx-build/commit/632a1c61c5bab1a77640a49b4cd9f501e310aea1)
     * [Compilation and Installation](https://wiki.openssl.org/index.php/Compilation_and_Installation)
* [brew link openssl --forceができない問題](http://qiita.com/dasisyouyu/items/c9621c29b0fe79d2b7c4)
angularのDirectiveにおけるHostデコレーターについて

formを作るときに何気なく使っているformControlNameですが、ふと本家のソースを読んでみたら、普段使わないような記法が出てきたので調べてみました。

今回はHostデコレーターに注目します。

# 環境

- angular 2.3.1
- angular/material 2.0.0-beta.2

# シンプルなフォーム

とりあえずinputが一つあるだけの簡単なフォームを作成します

## コード例

```simple-form.component.ts
@Component({...})
export class SimpleFormComponent {
  form: FormGroup;

  constructor(
    private fb: FormBuilder
  ) {
    this.form = this.fb.group({
      user: ['default user name'],
    });
  }

  onSubmit() {
    console.log(this.form.value);
  }
}
```

```simple-form.component.html
<md-card>
  <md-card-title>SimpleForm</md-card-title>
  <md-card-content>
    <form [formGroup]="form" novalidate (ngSubmit)="onSubmit()">
      <md-input-container>
        <input mdInput formControlName="user">
      </md-input-container>
      <p>{{ form.get('user').value }}</p>
      <div>
        <button md-button>Submit</button>
      </div>
    </form>
  </md-card-content>
</md-card>
```
material使っちゃったので見づらいですが、formGroupを作り、userプロパティにformControlがセットされただけのシンプルなフォームです。

# formControlNameのソースを見る

執筆時点 https://github.com/angular/angular/blob/bebedfed24d6fbfa492e97f071e1d1b41e411280/packages/forms/src/directives/reactive_directives/form_control_name.ts

```
constructor(
      @Optional() @Host() @SkipSelf() parent: ControlContainer,
```

ソースを眺めると、なんとなくformGroupを参照してそうな雰囲気です。

# Hostデコレーター

- [公式のドキュメント](http://a2.hubwiz.com/docs/ts/latest/api/core/DirectiveMetadata-class.html)

```
any directive that matches the type between the current element and the Shadow DOM root.
```
DOMを辿って宣言した型に該当する要素を参照できると。
すごい。なんでもやれそうな気がしてきますね。

# formGroupから、特定のformControlを取得するDirectiveを書いてみる

Hostアノテーションを用いることによって、formGroupが取得出来そうなので、formGroupの取得および、指定されたプロパティの値をログに出すようなDirectiveを書いてみます。

## コード例

```fake-form-control-name.directive.ts
@Directive({
  selector: '[appFakeFormControlName]'
})
export class FakeFormControlNameDirective implements AfterContentInit {
  @Input('appFakeFormControlName') appFakeFormControlName: string;
  private parent: FormGroupDirective;

  constructor(
    @Host() parent: FormGroupDirective
  ) {
    this.parent = parent;
  }

  ngAfterContentInit() {
    console.log(
      this.parent.form.get(this.appFakeFormControlName).value
    );
  }
}
```

この状態で動かすと、コンソールに 'default user name' が流れるのが確認できました :raised_hand:
CloudFunctionsでDatabaseの値を使ってHTMLをレスポンスする[BitScheduler開発日誌]

BitScheduler開発日誌、３回目の投稿です。

今回はBitSchedulerのシステム構成を検討し、かねてより興味のあった「Firebaseをガッツリ使ってWebアプリを作ってみる」にチャレンジしてみようと思います。

Firebaseは「アプリ開発のプラットフォーム」という認知が一般的です。ランディングページのコピーでも "App success made simple" と書かれていますしね。
ところがギッチョンチョン、Webのライブラリ(JavaScript)も充実しており、Webアプリでの利用も十分想定されています。

# SPAでの課題

FirebaseでWebアプリを作成する際のアーキテクチャーはSPA(Single Page Application)の採用が想定されています。なぜならHostingでは静的なファイルしかホストできませんし、サーバーサイドのモジュールはAuthenticationやCloudMessagingなど、SPAと連携する上で必要な一部の処理においてしか提供されていません。

今回作成するBitSchedulerではJavaScriptが動作しないガラケーにも対応させたいのでSPAは採用できません。
そこで、最近リリースされた新機能"CloudFunctions"を使って解決します。

# CloudFunctions とは

まずはCloudFunctionsを使ってhttpリクエストに対してHTMLを返すコードです。
以下のコードでRealtimeDatabaseから値を取得してHTMLとしてレスポンスを返せます。

```js:index.js

// adminモジュールのロードと初期化
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

// function定義
exports.sample = functions.https.onRequest((req, res) => {

    // databaseより値を取得    
    admin.database().ref('/foo/bar').once('value').then(function(dataSnapshot) {
        var value = dataSnapshot.val();
        // HTMLをレスポンス
        res.status(200).send('<html><body>' + value + ' is your saved data.</body></html>');
    });
});

```

## 解説

CloudFunctionsでは以下のイベントをトリガにfunctionを起動できます。

- Realtime Database Triggers
- Firebase Authentication Triggers
- Firebase Analytics Triggers
- Cloud Storage Triggers
- Cloud Pub/Sub Triggers
- HTTP Triggers

HTTP Triggers を使うことでガラケーからのGET, POSTリクエストに対しての処理を記述でき、かつFirebaseのモジュールを使うことでRealtimeDatabaseの値を参照できるので、databaseの値を使って動的ページをレスポンスすることができます。

今までは、これと同じことやろうと思ったらアプリケーションサーバを別途立てて、かつサーバ側でREST API経由でRealtimeDatabaseにアクセスしてレスポンスしなければならず、とても非効率でした。

CloudFunctions 最高っす。

---

よろしけれ「いいね」してBitSchedulerの開発を応援してください！
みなさんの「いいね」がモチベーションになり開発を加速させます！

[BitSchedulerティザーページ](https://bitscheduler-fb66d.firebaseapp.com/)
Jupyter NotebookのドキュメントをWordpressに貼り込む

Jupyter NotebookはPythonプログラム(最近はRなど他の言語でも使えるようです)の実行環境で、プログラムとその実行結果、ドキュメントを一つにまとめることができます。特にmatplotlibを使ってデーターをグラフ化した場合、プログラムとその実行結果のグラフ、それらに対するコメントをまとめて管理できて、非常に便利です。Jupyter Notebookについては次のページなどに詳しい解説がありますので、合わせてご覧ください。

* [データサイエンティストに向けたコーディング環境Jupyter Notebookの勧め](http://qiita.com/y__sama/items/17aedf0c05187edd61c3)
* [Jupyter Notebook を使ってみよう](http://pythondatascience.plavox.info/python%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/jupyter-notebook%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/)

Jupyter NotebookのドキュメントはGistで公開もできますが、やはり自分のブログや自社サイトに貼り込みたい場合があります。ブログやサイトがWordpressで管理されている場合に、Jupyter Notebookのドキュメントを貼り込む方法を調べたので、まとめておきます。

# Jupyter NotebookのドキュメントをWordpressに貼り込む方法

Webで調べたところ、いくつかの方法があるようです。

方法1. .ipynbファイルをnbconvertでhtmlファイルにしてWordpressに入力する
方法2. Gistに公開したものをWordpressに貼り込む
方法3. Jupyter Notebookでhtmlファイルを出力し、iframeで貼り込む

簡単なのは方法2のGistに公開したものを貼り込む方法です。フレームの中に貼り込まれるので、短いプログラムなどは問題ないのですが、Jupyter Notebookで書いた、ある程度長さのあるドキュメントを貼り込むと窮屈な感じがします。方法3もフレームの中に貼り込まれるので、同様です。

方法1は例えば[「WordPress Blogging with Jupyter Notebook in Five Simple Steps」](http://www.mianchen.com/wordpress-blogging-with-jupyter-notebook-in-five-simple-steps/)で紹介されています。一手間かかりますが、Jupyter Notebookを貼り込んだページと直接Wordpressで作ったページを同じスタイルで表示することができ、いい感じです。

具体的な方法です。

1.Jupyter Notebookでコンテンツを作り、Saveする
.ipynbファイルができます。

2.nbconvertでhtmlファイルに変換する

```
$ jupyter nbconvert --to html --template basic 出来たファイル.ipynb
```

3.出来たhtmlファイルをWordpressのテキスト画面に貼り込む

4.WordpressのCSSファイルに最後に示したCSSを追加する

このCSSは前述の[「WordPress Blogging with Jupyter Notebook in Five Simple Steps」](http://www.mianchen.com/wordpress-blogging-with-jupyter-notebook-in-five-simple-steps/)にあったものです。オリジナルでは.sと.s1に色指定をしていましたが、.s1は私の環境では別のところで使っていたので、ここでは指定しないようにしました。

# サンプル

ここで紹介した方法で作ったページの一つが次のページです。

* [「AmbientのデーターをPythonで扱う」](https://ambidata.io/examples/pythonpandas/)


Jupyter NotebookでPythonプログラムとmatplotlibのグラフ、解説ドキュメントを書き、Wordpressに貼り込んでいますが、それ以外のドキュメントページと同じスタイルで書くことができました。


# 追加するCSS

```css
/************** Jupyter Notebook CSS ************************/
.input_prompt {
    color: #0066cc;
}
.output_prompt{
    color:#cc0000;
}
.prompt{
    font-family: monospace;
    font-size: 14px;
}
.c, c1 {
    color: #408080;
    font-style: italic;
}
.k {
    color: #338822;
    font-weight: bold;
}
.kn {
    color: #338822;
    font-weight: bold;
}
.mi {
    color: #008800;
}
.mf {
    color: #008800;
}
.o {
    color: #9966ff;
}
.ow {
    color: #BA22FF;
    font-weight: bold;
}
.nb {
    color: #338822;
}
.n {
    color: #000000;
}
.s {
    color: #cc2222;
}
.se {
    color: #cc2222;
    font-weight: bold;
}
.si {
    color: #C06688;
    font-weight: bold;
}
.nn {
    color: #4D00FF;
    font-weight: bold;
}
.output_area pre {
    background-color: #FFFFFF;
    padding-left: 5%;
}
.code_cell {
    padding-left: 1%;
}
.cell {
    margin-top: 10px;
    margin-bottom: 10px;
}
br {
    line-height: 2;
}
.cell h1, h2, h3, h4 {
    margin-top: 30px;
    margin-bottom: 10px;
}
/************** Jupyter Notebook CSS ************************/
```
ffmpegコマンドメモ

### フレームレートを変更する

```:オプション
-r (fps)
```

```:サンプル
$ ffmpeg -i input.mp4 -r 30 -c copy output.mp4
```

### 動画をクリッピングする

```:オプション
-filter:v "crop=(幅):(高さ):(左からの距離):(上からの距離)"
```

```:サンプル
$ ffmpeg -i input.mp4 -filter:v "crop=200:360:220:0" -c:a copy output.mp4
```
FunctionalInterfaceがスッキリできたサンプル

Labmda式とFunctionalInterfaceが
私の中でモヤッとしてたのですが、
この実装を見てスッキリしたので、サンプルをメモしておきます。

```
public class FunctinalInterfaceSmaple {

    // FunctionalInterfaceを宣言 
    @FunctionalInterface
    interface sampleInterface {
        public String joinString(String a, String b);
    }

    // 実際のメイン処理
    public static void main(String[] args) {

        // lambda式を返すMap
        Map<String, sampleInterface> sampleMap = new HashMap<>();
        sampleMap.put("join", (a, b) -> a + b);
        sampleMap.put("join2", (a, b) -> a + b + a + b);

        String firstString = "aaaa";
        String secondString = "bbbb";

        sampleInterface mySampleInterface = sampleMap.get("join");
        sampleInterface mySampleInterface2 = sampleMap.get("join2");

        System.out.println(mySampleInterface.joinString(firstString, secondString));
        System.out.println(mySampleInterface2.joinString(firstString, secondString));

    }
}
```
技術英語 > bridge the gap / say to oneself

現在進めているTensorFlowを使った多次元関数の近似処理。
自分が実際に使いたいものと、現在実装可能なものには大きなギャップがある。

思い出したのは
bridge the gap

http://eow.alc.co.jp/search?q=bridge+the+gap
> bridge the gap between a dream and the reality
夢と現実のギャップを埋める

どのようにして、ギャップを埋めるか。
それを考えるのも楽しみの一つではある。

@ Associe 2011/01/04 
Toyoshi Nagataさん

> そもそも人に何かを提案するのは、前提として好ましくない現実があるから。それをどう変えるか、将来たどりつくべき理想とのギャップを埋めるために提案があるわけです。

propose to myself
max週10時間の間はプロトタイプ作成に関して「これはどうだ。あれはどうだ」とひたすらpropose to myselfをしている。

<hr>
関連して思い出した

http://ejje.weblio.jp/content/say+to+oneself
> say to oneself
> 心の中で考える、自分に言い聞かせる、ひとりごとを言う

@ 放浪の天才数学者エルデシュ by ポール　ホフマン
> アン・ダヴェンポート: [Harold](https://en.wikipedia.org/wiki/Harold_Davenport)の妻
> 「トリニティ・カレッジでこんなことがあったわ。たしか１９３０年代だったわね。夫のハロルドとエルデシュが公共の場所で、ひとことも話さずに一時間以上も座って考えに耽っていたの。長い沈黙を、ようやくハロルドがこう言って破った。「０じゃない。１だ」みんなほっとして喜んだわ。周りに居た人たちはふたりがどうかしてしまったんじゃないかと気味悪がっていたから。もちろん、ふたりともどうかしてたけど。」
Ansible+Vagrantで開発環境とAnsibleで本番環境の構築 Ruby + MySQL ②

# 開発環境の構築

- hostsにローカル環境を追加
デフォルトでは、すべてコメントになっているため、動かなった。。
ハマったわあ。

```
$ sudo vi /etc/ansible/hosts
127.0.0.1 ansible_connection=local
```

- 環境PATH追加

```
export PATH="$HOME/.rbenv/bin:$PATH"
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
source ~/.bash_profile
```

- RUBYのplayBook

```
- hosts: all
  connection: local
  become: yes
  tasks:
  - yum: name={{item}} state=latest
    with_items:
      - tree
      - httpd
      - gcc
      - zlib-devel
      - openssl-devel
      - sqlite
      - sqlite-devel
      - libffi-devel
      - readline-devel
  - yum: name=git state=latest
  - git: >
      repo=https://github.com/sstephenson/rbenv.git
      dest=/home/vagrant/.rbenv/
  - git: >
      repo=https://github.com/sstephenson/ruby-build.git
      dest=/home/vagrant/.rbenv/plugins/ruby-build/
  - file: path=/home/vagrant/.rbenv owner=vagrant state=directory recurse=yes
  - shell: rbenv install -v 2.1.5
    sudo: no
  - shell: rbenv rehash
    sudo: no
  - shell: rbenv global 2.1.5
    sudo: no
  - yum: name={{item}} state=latest
    with_items:
      - ruby-devel
      - rubygems

```


- 実行例

```
ansible-playbook play_book.yml
#リフレッシュして完了
source ~/.bash_profile
```


- SELINUXの無効化

```
cp /etc/sysconfig/selinux /etc/sysconfig/selinux.org

```



# エラーメモ
- ansibleはインデントがおかしかったらエラーになるみたい。。。

ruby インストール時にエラー、
```
sudo yum install readline-devel
```

# おまけ

- mysqlインストール

```
- hosts: all
  become: yes
  tasks:
    - name: add repo
      command: rpm -ih http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm creates=/etc/yum.repos.d/mysql-community.repo

    - name: install mysql-community-server
      yum: name=mysql-community-server state=installed

    - name: install MySQL-python for ansible mysql_user module
      yum: name=MySQL-python state=installed
```
Pyenvの使い方

# Pyenvとは？
- 複数バージョンのPythonを簡単に切り替えられる。
- 色々なバージョンのPythonを~/.pyenv以下に配置している。

# Pyenvの場所
[pyenv/pyenv](https://github.com/pyenv/pyenv)

# 今回の作業環境
- Ubuntu 16.04

# インストール
## [pyenv-installer](https://github.com/pyenv/pyenv-installer)でインストールしてみる。

```
$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
```

## .bashrcに設定を書き込む

```
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ pyenv -v
pyenv 1.0.10-2-geef042a
```
# Pyenvのコマンド
- コマンドについて[ここ](https://github.com/pyenv/pyenv/blob/master/COMMANDS.md)に詳しく書いてある。
- インストールに失敗する場合は、[ここ](https://github.com/pyenv/pyenv/wiki/Common-build-problems)に色々注意点が書いてある。
- `pyenv install --list`でインストールできるpythonのバージョンが一覧表示される。
- `pyenv install 3.6.1`などとやると、3.6.1がインストールされる。
- `pyenv versions`で、インストール済み一覧が表示され、現在アクティブなバージョンがどれか教えてくれる。

```
$ pyenv install --list
$ apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils
$ pyenv install 3.6.1
$ pyenv install anaconda3-4.3.1
$ pyenv versions
* system (set by /root/.pyenv/version)
  3.6.1
  anaconda3-4.3.1
```
# バージョンを切り替えてみる

## 現在のバージョンを確認

```
$ python --version
Python 2.7.12
```

## globalコマンドを使ってバージョンを切り替える。

```
$ pyenv global 3.6.1
$ pyenv versions
  system
* 3.6.1 (set by /root/.pyenv/version)
  anaconda3-4.3.1
$ python --version
Python 3.6.1
```

## localコマンドを使ってバージョンを切り替える。
- 特定のディレクトリ内のみバージョンを切り替えたいときに使える。
- pyenv localが実行されると、実行されたカレントディレクトリに`.python-version`というファイルが作成される。これはglobal設定よりも優先される。

```
$ cd hoge
$ pyenv local anaconda3-4.3.1
$ python --version
Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
$ cd ..
$ python --version
Python 3.6.1
```

ちなみに、`.python-version`の中身を見てみたら、バージョン名のみ書いてあった。

```
$ cat .python-version
anaconda3-4.3.1
```

# Pythonの場所（フルパス）の確認

```
$ pyenv which python3.6
/root/.pyenv/versions/3.6.1/bin/python3.6
```

ちなみに、普通のwhichも試してみる。

```
$ which python3.6
/root/.pyenv/shims/python3.6
$ which python
/root/.pyenv/shims/python
```
Django decorator まとめ

# Django でよく使う・覚えておきたい decorator 一覧

DjangoというよりはPythonの動作。
機能によってはClass定義したくなる物も多いので
そういう意味でDjangoという分類にした。

|項目|概要|Class利用|備考|
|---|--:|---|---|
| @login_required |要・認証  | LoginRequiredMixin |   |
| @property  | property()  |   |  |
| @has_permission('xxx')  |権限確認|   |  |
| @staff_member_required  |ユーザのみ|   |  |

# Example

## decorator 利用
```
@login_required
def example(self):
    some doing

```

class 利用
```
class login_require_class(LoginRequiredMixin):
    some doing

```

#
echoでCORS

CORSミドルウェアで楽チン

``` Go
func main() {
	e := echo.New()
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	// CORS default
	// Allows requests from any origin wth GET, HEAD, PUT, POST or DELETE method.
	// e.Use(middleware.CORS())

	// CORS restricted
	// Allows requests from any `https://labstack.com` or `https://labstack.net` origin
	// wth GET, PUT, POST or DELETE method.
	e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
		AllowOrigins: []string{"https://labstack.com", "https://labstack.net"},
		AllowMethods: []string{echo.GET, echo.PUT, echo.POST, echo.DELETE},
	}))

	e.GET("/api/users", getUsers)

	e.Logger.Fatal(e.Start(":1323"))
}
```

許可ヘッダを追加したいときは、AllowHeadersとExposeHeadersでOK

``` Go
	e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
		AllowOrigins: []string{"https://labstack.com", "https://labstack.net"},
		AllowMethods: []string{echo.GET, echo.PUT, echo.POST, echo.DELETE},
                AllowHeaders:  []string{"Authorization", "Content-Type"},
                ExposeHeaders: []string{"Count"},
	}))

```

https://echo.labstack.com/cookbook/cors
githubのCHANGELOG.md を自動生成するスクリプト

ちょうどいいのが探しても見つからなかったので、自作しました。
こういう処理だとawkが楽でいいですね。

https://gist.github.com/kanryu/f4db8e0460310309063d2cf56379b3b3

## 出力例

https://github.com/kanryu/quickviewer/blob/master/CHANGELOG.md

## 使い方

HOMEディレクトリに隠しフォルダを切るなりなんなりして、どこかに置いてください。

```
$ cat ~/.genchangelog/genchangelog.awk
```

で、git config でエイリアスを作ります。

```
$ git config --global --add alias.changelog "!git log --decorate | awk -f $HOME/.genchangelog/genchangelog.awk"
```

そしたら github リポジトリのローカルコピー上で下記コマンドを実行

```
$ git changelog > CHANGELOG.md
```

出力が気に入らなかったら適当にいじっちゃってください。

## 前提条件

```
$ git commit
summary of commit

- detail 1
- detail 2
- detail 3
$
```

という形式かそれに類似した形でコミットしており、時おり **git tag** でタグを付けてそのリビジョンでリリースしていることを前提としています。

出力はタグごとにセクションが作られ、タグの付いていないコミットはより直近のタグ付きリビジョンの付属品として扱われます。

リビジョンごとのリンクを作る関係上、github または http(s)でアクセス可能な位置に本体のリポジトリがあることを推奨します。

歴史がある、あるいは規模の大きい巨大なリポジトリは想定していません。そういうのは専用のツールを使ってください。ある程度の規模までならこのスクリプトでまかなえるでしょう。
Value Objectパターンの本当に重要なポイントは「不変オブジェクト」ではなく「普通ならプリミティブ型を使ってしまうような場面でもあえてユーザー定義クラスを使う」という点にあるのではないか？

DDD(ドメイン駆動設計)のValue Objectパターンは「不変オブジェクト」であるということが強調されているが、ドメインモデリングの観点からみたら、むしろ**プリミティブ型を使いたくなる場面であえてユーザー定義クラスを使う**ということこそが本当に重要な部分なのではないか、と思ったので、そのことを書いてみる。

#例題
100円の商品を三つと200円の商品を一つ買った場合の「税込みの合計金額」を計算するコードを、Value Objectパターンを使った場合と使わなかった場合で両方Javaで書いて見比べてみる。

##Value Objectパターンを使わなかった場合
```java
class Main {

    public static final double TAX_RATE = 0.08;

    public static double withTax(double price) {
        return price * (1.0 + TAX_RATE);
    }

    public static void main(String[] args) {
        double price1 = 100.0;

        int count1 = 3;

        double price2 = 200.0;

        double totalPrice = price1 * count1 + price2;

        double priceWithTax = withTax(totalPrice);

        System.out.println(priceWithTax);
    }
}
```

##Value Objectパターンを使った場合
```java
class Count {
    private final int rawCount;

    Count(int rawCount) {
        this.rawCount = rawCount;
    }

    public int getRawCount() {
        return this.rawCount;
    }
}

class Price {
    private final double rawPrice;

    Price(double rawPrice) {
        this.rawPrice = rawPrice;
    }

    Price plus(Price price) {
        return new Price(this.rawPrice + price.rawPrice);
    }

    Price mult(Count count) {
        return new Price(this.rawPrice * count.getRawCount());
    }

    PriceWithTax withTax() {
        return new PriceWithTax(this.rawPrice);
    }
}

class PriceWithTax {
    private static final double TAX_RATE = 0.08;

    private final double rawPriceWithTax;

    PriceWithTax(double rawPrice) {
        this.rawPriceWithTax = rawPrice * (1 + TAX_RATE);
    }

    public double getRawPriceWithTax() {
        return this.rawPriceWithTax;
    }
}


class Main {
    public static void main(String[] args) {
        Price price1 = new Price(100.0);

        Count count1 = new Count(3);

        Price price2 = new Price(200.0);

        Price totalPrice = price1.mult(count1).plus(price2);

        PriceWithTax priceWithTax = totalPrice.withTax();

        System.out.println(priceWithTax.getRawPriceWithTax());
    }
}
```

##Value Objectパターンを使うことで、どう変わるか？
Value Objectを使っている場合、価格同士は足し合わせることしか出来ない。これが単なるdouble型であれば価格同士で引くことも割ることも掛けることも出来てしまう。
PriceからPriceWithTaxへの変換はあるが、逆の変換は無いため、価格に消費税を加えることは1回しか出来ない。
このような形で、**ドメインの中で「価格」という数値に対して許される操作が、型として顕在化される。**単なるdouble型では、ドメイン内でその値に対してどういう操作が意味を持つ（許されている）のかはわからない（例えば、価格の値(double型)から価格の値(double型)を引く、という操作は許されるのか？）。しかしユーザー定義クラスであれば「価格」という型に対して許される操作がメソッドとして明示的に全て記述されているのでコードの可読性が高まる。
もちろん、不変オブジェクトであるという性質もコードの可読性の向上に貢献するのだろうが、ドメインモデリングにとって本当に重要なのは**普通ならdouble型のような「プリミティブ型」を使ってしまうような場面でもあえて「ユーザー定義クラス」を使うようにする（そのことによって、ドメイン内でその型に対して許される操作がメソッドとして明示的に全て記述されることになる）**という部分なのではなかろうか。
まぁ、DDDのValue Objectパターンの利点は、もう色んな本やサイトで散々議論され尽くしている話題かもしれないけれど、私は最近になってようやく重い腰を上げてDDDを勉強し始めたので(笑)、とりあえず理解出来たところをコード化してみました。
ただしコードを見比べてもらえれば解るように、Value Objectパターンを使ったバージョンのほうが明らかに長い。これは一つ一つユーザー定義クラスを定義する手間がかかるため仕方がない。なので**いちいち「ユーザー定義クラスを定義する」というコストに見合うほどにコードの可読性やメンテナンス性が重要視されるような局面に使用するのが良い**のだと思う。
JavaScriptのNumber、parseIntの落とし穴（基数を与えないと想定外の数値に変換される）

## 疑問
`parseInt` を使ってると、たまーに想定外の数値を返してくるのはなに？

## 仕様
[parseIntの仕様](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)
> - 第1引数のstringが「0」で始まるときは、第2引数のradixは8(8進法)または10(10進法)とされます。厳密には、基数がどちらになるかは実装によります。ECMAScript 5 の仕様では10(10進法)です。ただし、まだすべてのブラウザがサポートしている訳ではありません。したがって、parseInt()関数を使うとき基数は必ず与えてください。

`0` から始まる文字列を与えると8進数で返してくる！！
さらに `0x` から始まる文字列を与えると16進数で返してくる！！

## 検証
```javascript
  console.log(parseInt('020'));  // 16
  console.log(parseInt('0x20')); // 32
```
えーひどい

## 対策
parseIntの場合、必ず基数をつけましょう


```javascript
  console.log(parseInt('020', 10)); // 20
```

`Number` の回避策は知らん、 `parseInt` 使え
vagrantでボックス名が重複してた時にバージョン指定して削除する方法

```zsh
# vagrant box list
laravel/homestead (virtualbox, 0.4.4)
laravel/homestead (virtualbox, 2.0.0)
```
古い方を消したかったがボックス名が重複してる、、、

```zsh
# vagrant box remove laravel/homestead --box-version 0.4.4
```
`--box-version`オプションを指定すると

```zsh
# vagrant box list
laravel/homestead (virtualbox, 2.0.0)
```

無事消えた
SubstancePainterでペイント範囲をグループ化する

Qiitaみたいな仕組みのサイトでDCCツールやデザインツールのtipsを投稿できるところないですかねー。Qiitaはエンジニア向きなのであれなんですが、とても使いやすいのでここに書くのがやりやすいんですよねえ。
と言う事で、SubstancePainterでペイント範囲をグループ化する際のメモ書きです。エンジニア向けじゃないかもですが、ご容赦ください。

#１.やってはいけない事

グループを作る目的で、マテリアル分けしたファイルを取り込む事。
これで確かにテクスチャセットが別の状態となり、グループが別れた状態でペイントができる。

では、何がいけないのか？

このままテクスチャをエクスポートした場合、テクスチャセットの個数だけ掛け算でファイル数が増殖してしまう。
例えば、ベースカラー（Albedo）と法線とMetallicSmoothnessを書き出したい場合、３種x２セット＝６枚のテクスチャが書き出されてしまう。
これはレンダリングソフトやゲームエンジンに取り込んだ時に設定が面倒になるし、テクスチャ枚数が多いので動作も重くなる。

テクスチャセットはそもそもシェーダープログラムが切り替わる場合や、テクスチャを意図的に別途にしたい場合に分けるべきで、ペイント時の利便性のために分けて使うものではない。

#２.推奨される方法

モデルの形状が複雑でないなら、手作業でうまくマスクを切ればいい。正確にはグループ化ではないが、範囲を区切ってのペイント作業はできる。さらに、IDマップ画像が用意できるならそれを元にマスクを切ることができる。

<img width="431" alt=" 2017-03-30 0.49.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/fb6261ad-c21f-411f-f8a8-40458dae0aca.png">
_レイヤー選択 -> add mask with color selection で、IDマップを元にしたマスクが切れる_ 

<img width="821" alt=" 2017-03-30 0.37.17_.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/b080a7b4-5f59-ea55-9fb3-330ab30ba436.png">
_Pickカラーを押すと3DビューがIDマップ表示に変わるので、マスクを作りたい箇所を選択する_


ZBrushなら...ポリグループ別に単色でポリペイントしてフラットなシェーダーでテクスチャ書き出ししてIDマップとする例をみたことがある。今度やってみて投稿する。
MAYAなら...知らないがきっといとも簡単にできる。今度やってみるかも。

#３.IDマップをサブスタンスペインター上で作る方法

IDマップが書き出せないソフトの場合どうするか？
SubstancePainter上でも、Baking処理でメッシュ(メッシュID)を基にしてIDマップを作ることができる。

<img width="640" alt=" 2017-03-30 0.52.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/c8b25fbc-6f97-2910-7789-dfad1ca1c355.png">
メタセコイアならオブジェクトを別にしてobjを書き出せば、メッシュIDがそれぞれ別となったobjを書き出すことができた。（ここでマテリアルは同一のものを割り当てる事。）

これをSubstancePainterに取り込んで、

<img width="642" alt=" 2017-03-30 0.37.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/5eb5dd94-3d9f-be3b-dae0-a7c84f3b942a.png">
メッシュIDを元にIDマップをベイクすれば良い。あとは上記2の方法でマスクを作る。

![image](https://qiita-image-store.s3.amazonaws.com/0/8302/0d1edf05-d1e6-deec-3f36-41dce84c1ce9.png)
_出来上がったIDマップ_

#まとめ

テクスチャセットが少ない方が（全部画面にパーツを表示する前提なら）動作が軽いので、マスクで頑張った方が気持ちよくペイントできる。とはいえ、テクスチャセットを分ける意味はもちろんある。安易にグループ化の目的でテクスチャセットを使うのはやめた方がいいですよ、というのが今回のコンクルージョンです。

なお、SubstancePainterでIDマップを作る際のソースはメッシュID以外にも色々あります。
![image](https://qiita-image-store.s3.amazonaws.com/0/8302/73a43a11-9222-17e3-b431-0036aac9daf2.png)

モデリングソフトによっては別の方法の方が楽かも。
ZBrushだと頂点カラーが具合が良さそうだ。これは、そのうち。

以上です！
リアルタイムWebアプリで使用される技術の簡易説明



![](http://findicons.com/files/icons/1607/ruby_on_rails/128/ror_logo.png)![](http://javascript-html5-tutorial.com/wp-content/uploads/2015/02/nodejs-logo.png)


## ポーリング
* サーバー側に変更等のイベントがあったか、AjaxによるHTTPリクエストを繰り返し行って確認する方法
* ネットワーク帯域とサーバリソースを無駄に消費

## Comet

### ロングポーリング
* クライアントからのリクエストに対して、サーバーはレスポンスを保留して、コネクションを維持
* コネクションを維持することによるメモリ使用量の増加


### ストリーミング
* サーバー側からクライアントへレスポンスを返し続ける
* クライアント側でレスポンスを受信しながら内容を解析して適切に処理する必要

## Web Socket
* JavaScriptからサーバーとの双方向通信を行う」ためのプロトコル

## Socket.io
[Socket.io](https://socket.io/)

* node.js用サーバー側ライブラリとブラウザ用JavaScriptライブラリのセット
* 同じSocket.io APIからポーリング、Comet、Web Socketを利用可能

## ActionCable
[ActionCable](https://railsguides.jp/action_cable_overview.html)

* WebSocketとRailsのその他の部分をシームレスに統合するためのもの
domaindoc デザインリニューアル

[domaindoc](https://npm.im/domaindoc) はマークダウンで記述したドメインモデルのドキュメントを、一覧しやすいドキュメントサイトにビルドしてくれるコマンドラインツールです。(ドメインモデルのドキュメント専用の静的サイトジェネレータ)

今まで [tacit](http://yegor256.github.io/tacit/) ベースだった domaindoc を今回 [bulma](http://bulma.io/) ベースに書き換えました。

# デモサイト

- [デモドキュメント](http://kt3k.github.io/moneybit/) ([moneybit](https://github.com/kt3k/moneybit) (会計アプリ) のドメインモデルドキュメント)
    - [ドキュメントソース](https://github.com/kt3k/moneybit/tree/master/packages/moneybit-domain) (拡張子 .md のファイルがドメインドキュメントのソース
    - [domaindocfile](https://github.com/kt3k/moneybit/blob/master/domaindocfile.js)


スクリーンショット

<img width="1201" alt="demo-page.png" src="https://qiita-image-store.s3.amazonaws.com/0/13825/2b0dbba8-56c7-665c-4dba-922605782884.png">

<img width="1238" alt="demo-index.png" src="https://qiita-image-store.s3.amazonaws.com/0/13825/3387b6e8-f07b-0a83-41b8-f5abf9bac4ce.png">

# 変更点

- モデル1個をカードコンポーネントで表現することで、モデルが意味の単位であることをより明確に表現されるようになりました
- モデル間のクロスリンク機能を強化
    - あるモデルのプロパティが別なモデルになっている場合は、自動的にリンクが張られるようになりました。
    - ドメインモデルの派生型 `Model[]`, `Array<Model>` などにもある程度対応
- ソースコードへのリンク機能を追加
Amazon Linux の Docker イメージで yum install を高速化

fastestmirror を入れたら速くなるってだけなので知ってる人はスルーしてください。

```
FROM amazonlinux:2016.09
RUN yum -y install yum-plugin-fastestmirror
RUN yum -y update
```

fastestmirror 入れる前に `yum repolist -v` を叩くと下記のように us-east-1 が最優先になっている。

```
Repo-baseurl : http://packages.us-east-1.amazonaws.com/2016.09/main/201609e29881/x86_64/ (9 more)
```

入れたあとだとこの通り

```
Repo-baseurl : http://packages.ap-northeast-1.amazonaws.com/2016.09/main/201609e29881/x86_64/ (9 more)
```
Google Cloud ML EngineをJupyterから簡単に使えるMagic

Cloud ML Engineへ学習JobをJupyterから簡単に投げたいなぁと思い、そんなJupyter用 Magic Command Extensionを作りました。
Jupyterで書いたモデルを、Runすればクラウド上で実行することができます。

![download.png](https://qiita-image-store.s3.amazonaws.com/0/162369/80cddaa7-067f-142d-432a-74baf984e90a.png)
こんな感じ。

# Cloud ML Engineとは
簡単に言えばTensorFlowの学習や予測JobをCloud上で実行できるマネージドな環境です。一般的にはDistributed TensorFlowで大規模に学習をさせるケースが多いかと思いますが、私のようにメインマシンがMacBookでGPUも使えない環境の場合は、GPUを気軽に使えるリモートの環境として重宝しています。
また、GCEとは違ってJobが終われば自動で立ち下がるため、インスタンス落とし忘れで課金が大変な事になる心配もありません。

# 準備
[Google Cloud SDK](https://cloud.google.com/sdk/)の設定は終わっている前提で進めます。
また、`gsutil`やAPIをApplication Default Credentialsで使用しているため、以下のコマンドで設定をしておく必要があります。

```
gcloud auth application-default login
```

## Jupyter用のExtensionをインストール
pipでインストールできます。

```bash
$ pip install cloudmlmagic
```
他にCloud ML Client Libraryをインストールする必要がありますが、上記pipでインストールされるはずです。

ソースから`python setup.py install`でもインストール可能です。
https://github.com/hayatoy/cloudml-magic

# 使い方
examples内に[Notebook](https://github.com/hayatoy/cloudml-magic/blob/master/examples/Cloud%20ML%20Example.ipynb)があるのでそれを見るとわかりやすいです。

## ExtensionをNotebookにロード
次のMagicをコードブロックに挿入し、実行するとロードされます。
`%load_ext cloudmlmagic`


## Projectの設定
次のMagicを実行します。ここは適宜自分のプロジェクトに書き換えてください。

```
%ml_init -projectId PROJECTID -bucket BUCKET -scaleTier BASIC
```
*GCSのBucketはあらかじめ作成しておく必要があります。scaleTierは以下から選べます。

| Scale Tier | ML Unit |
|:-:|:-:|
| BASIC  |  1 |
| STANDARD_1  |  10 |
| PREMIUM_1  |  75 |
| BASIC_GPU  | 3  |

## Cloud MLにアップロードするコードブロックを指定

```
%%ml_code
```
このMagicが入っているブロックのコードを全てアップロードします。逆にこのMagicのないブロックはローカルのみ実行となるので、学習部分だけCloud ML Engineに投げ、結果の表示などはローカルで実行するなど使い分けができます。

**注意**

- このMagicが含まれるブロックは、Cloud ML Engineへのアップロードの有無に関わらずローカルでも実行されます
- このMagicが含まれていないブロックの変数やパッケージを参照しないでください    
*その場合、ローカルでは動いてもCloud ML Engine上でエラーになります*

## Jobの開始

```
%ml_run cloud
```
`cloud`を付けるとCloud ML Engineで実行、付けなければローカルで実行されます。このMagicが含まれるブロックのコードもアップロードされるコードに含まれます。

# 実行結果の確認
[Console](https://console.cloud.google.com/mlengine/jobs)から確認できます。
<img width="624" alt="Job_Details" src="https://qiita-image-store.s3.amazonaws.com/0/162369/7a3cf3a2-84c2-a1be-d188-a09f6ab57855.png">
Jobは`mlmagic__**`の名前でdeployされます。

# 最後に
JupyterからCloud ML Engineを簡単に利用できるようになりました。
まだpackageの追加指定ができなかったり、細かい設定ができませんが徐々に追加していきます。（プルリクしてくれてもいいよ！）
Cloud ML Engineの利用者が増えるといいですね！
Rubyの正規表現まとめ

![](https://ruby.tw/logo.gif)

https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html

### 略
```
\w 単語構成文字 [a-zA-Z0-9_]
\W 非単語構成文字 [^a-zA-Z0-9_]
\s 空白文字 [ \t\r\n\f\v]
\S 非空白文字 [^ \t\r\n\f\v]
\d 10進数字 [0-9]
\D 非10進数字 [^0-9]
\h 16進数字 [0-9a-fA-F]
\H 非16進数字 [^0-9a-fA-F]
```

### 回数
```
* 0回以上
+ 1回以上
? 0回もしくは1回
{n} ちょうどn回(nは数字)
{n,} n回以上(nは数字)
{,m} m回以下(mは数字)
{n,m} n回以上m回以下(n,mは数字)
```

### 位置
```
^ 行頭(文字列の先頭もしくは改行の次)
$ 行末(文字列の末尾もしくは改行の手前)
\A 文字列の先頭
\Z 文字列の末尾
\z 文字列の末尾
\b 単語を成す文字と単語を成さない文字の間
\B 非単語境界
```

### method
`match`
MatchDataオブジェクトを返しマッチしなかったときはnilを返します

`sub,gsub`
マッチした部分を置換
Bash Tricks

![](http://cdn-img.easyicon.net/png/10971/1097179.gif)

## テンプレートが書かれたファイルを複数作成する

```bash
initial="
require 'test/unit'\n\n
def methodName\n\n
end\n\n
class TestClassName < Test::Unit::TestCase\n\n
\tdef TestMethodName\n\n
\tend\n\n
end
"

for ((i=1; i < 31; i++)); do
    echo -e $initial > test_$i.rb
done
```

このようなファイルが30個作成される

```rb:test_1.rb
require 'test/unit'

def methodName

end

class TestClassName < Test::Unit::TestCase

	def TestMethodName
	
	end
	
end
```

## bash commandエイリアス作成

```bash
alias dcm='docker-compose'
```

## .bashrc再読み込み

```bash
bash -l
```

## bashプロンプト変更

```bash
# 一時的変更
export PS1="\[\e[3;34m\]\w/ \[\e[0m\]$ "

# bash起動時に反映させる
echo "export PS1='\[\e[3;34m\]\w/ \[\e[0m\]$ '" > ~/.bash_rc
echo "export PS1='\[\e[3;34m\]\w/ \[\e[0m\]$ '" > ~/.bash_profile
```
Python de TreasureData vol.1

#Python(Jupyter)からTreasureDataに接続する方法

いつもQiitaで調べお世話になっているので、少しずつ自分で調べたことは書いていきます。
TreasureDataの快適さに現を抜かしつつ。

##0.事前準備
エースパイソニスたさんが作ってくれたTDclientを入れます
https://github.com/treasure-data/td-client-python
```terminal
$ pip install td-client
```
あとTreasureDataとpandasを繋ぐpythonライブラリpandas-tdも入れておきます。
https://github.com/treasure-data/pandas-td
```terminal
$ pip install pandas-td
```
## 1.TreasureDataのAPIキーの取得
コンソールから[users]→[API Keys]と進みパスワードを入力して[view]。
　APIキーを確認します。

<img width="503" alt="スクリーンショット 2017-03-29 23.33.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/143512/9270defb-8c3d-bca1-6bde-a3427cb4ebec.png">

##２.ソースに書くのはあれなので環境変数にAPIキーを設定します。（別にソースに書いてもいいけど）
###1.Windows
[コンピューターの詳細設定]→[環境変数の設定]→[ユーザー環境変数]→[新規]追加→
変数名：TD_API_KEY
変数値：(取得したAPIキー)
### 2.OSX
Terminalで以下実行
```terminal
 $ export TD_API_KEY=(取得したAPIキー)
```
##3.コード
```TD.py
import os
import pandas as pd
import pandas_td as td

#コネクションの作成
con = td.connect(apikey=os.environ["TD_API_KEY"], endpoint='https://api.treasuredata.com/')

#Presto用エンジンの作成クエリ
engine = con.query_engine(database='(Database名)', type='presto')

# tdのキーであるtimeをindexにしてdfに入れます。試しに3行
df = td.read_td_table('(テーブル名)', engine , limit=3, index_col='time', parse_dates={'time: 's'})
```

取得できたでしょうか。データ載せられなくてすいません。
Windows で Angular の開発環境を構築して IIS にデプロイするところまで

# はじめに

Windows 10 で Angular の開発環境を構築します。Angular CLI を使ってアプリケーションを作成し、ビルドした生成物を Windows 10 の IIS Express にデプロイするところまでやってみます。作業は PowerShell から実施します。

# 事前準備
まずは必要なツールをインストールしていきます。

## node.js インストール

node.js をダウンロードしてインストールします。記事執筆時点の推奨版である v6.10.1 をダウンロードしています。最新は nodejs.org から確認してください。

```ps1
> Invoke-WebRequest -Uri https://nodejs.org/dist/v6.10.1/node-v6.10.1-x64.msi -OutFile ~\Downloads\node-v6.10.1-x64.msi
> cd ~\Downloads\
> .\node-v6.10.1-x64.msi /passive
```

node および npm コマンドを使ってバージョン確認します。環境変数 Path の再読み込みのため、PowerShell を再起動してから実行します。

```
> node --version
v6.10.1
> npm --version
3.10.10
```

## Git for Windows インストール

Git for Windows をダウンロードしてインストールします。記事執筆時点の最新版である v2.12.2 をダウンロードしています。最新は git-for-windows.github.io から確認してください。

```
> Invoke-WebRequest -Uri https://github.com/git-for-windows/git/releases/download/v2.12.2.windows.1/Git-2.12.2-64-bit.exe -OutFile ~\Donwloads\Git-2.12.2-64-bit.exe
> cd ~\Downloads\
> .\Git-2.12.2-64-bit.exe /SILENT
```

git コマンドを使ってバージョン確認します。環境変数 Path の再読み込みのため、PowerShell を再起動してから実行します。

```
> git --version
git version 2.12.2.windows.1
```

既定では改行コードが自動変換されますが、挙動がいまいちなので無効にしておきます。

```
> git config --global core.autocrlf false
> git config --global core.autocrlf
false
```

## Angular CLI インストール

Angular CLI は npm を使ってインストールします。公式サイトそのままです。

```
> npm install -g @angular/cli
```

```:バージョン確認
> ng --version
    _                      _                 ____ _     ___
   / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
  / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
 / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
/_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
               |___/
@angular/cli: 1.0.0
node: 6.10.1
os: win32 x64
```

## IIS Express 有効化

IIS Express を有効化します。PowerShell を管理者として実行する必要があります。

```
> Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole
Path          :
Online        : True
RestartNeeded : False
```

事前準備はここまで。

# アプリケーションの作成

Angular CLI を使ってアプリケーションを作成します。アプリケーション用のフォルダーとして C:\AngularApps を作成します。アプリケーション名は apptest とします。

```
> mkdir C:\AngularApps
> cd C:\AngularApps
> ng new apptest
```

テスト実行してみます。

```
> cd apptest
> ng serve
```

初回はファイアウォールの警告が出るのでアクセス許可します。

![nodejs.png](https://qiita-image-store.s3.amazonaws.com/0/168283/5a5c73e2-9bc7-9053-cd6d-efdc36da9563.png)


ブラウザから http://localhost:4200 にアクセス。「app works!」と表示されれば OK です。確認できたら Ctrl+C で停止します。

# アプリケーションのビルド

ng build でビルド成果物を生成します。-prod をつけて（デバッグ用ではなく）本番環境用成果物を生成します。

```
> ng build -prod
```

成果物は dist フォルダー配下に生成されます。IIS Express で動作確認するため dist フォルダーの中身をデプロイします。（管理者として実行）

```
> Remove-Item -Path  C:\inetpub\wwwroot\* #既存のファイルを削除
> Copy-Item -Path C:\AngularApps\apptest\dist\* -Destination C:\inetpub\wwwroot\
```

ブラウザから http://localhost にアクセス。「app works!」と表示されれば OK です。

#蛇足
node.js, Git for Windows のインストールには chocolatey を使うべきな気もしますが、MS公式じゃないのがどうしても気になっちゃう。OneGet 用の公式リポジトリは出ないのかなー。
Ubuntu16.04(17.04)へのdockerのインストール

既存のdockerをアンインストールする(ことが公式で勧められている）。
公開鍵の登録に必要なプログラムをインストールする。
公開鍵を使ってレポジトリを追加して、インストールする。

```
sudo apt-get remove docker docker-engine
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

公開鍵のフィンガープリントを確認

```
sudo apt-key fingerprint 0EBFCD88
```

Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88 ならOK。レポジトリを追加して、インストール

```
sudo add-apt-repository "deb [arch=amd64] <DOCKER-EE-URL> $(lsb_release -cs) stable-17.03"

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce
sudo groupadd docker
sudo usermod -aG docker $USER
```

一旦ログアウトして、sudoなしで下記が実行できることを確かめる。

```
docker run hello-world
```

Ubuntu 17.04にインストールする場合、まだ公式サポートがないので、16.04のレポジトリからインストールする。上記のようにすると、/etc/apt/souces.listの最下行の最後の項目がzestyになっているはず。これをxenialに戻し、apt-get update、apt-get installとする

```:/etc/apt/souces
deb [arch=amd64] https://download.docker.com/linux/ubuntu zesty stable
```

```:/etc/apt/souces
deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable
```
Ansible の authorized_key で複数の鍵を設置するときに exclusive を指定したい

Ansible の `authorized_key` で複数の SSH 公開鍵を設置するとき、削除にも対応するために `exclusive` を指定したいですが、下記のようにすると `with_file` の１回ごとに `exclusive` になるので、最終的に最後の１個だけが残ります。

```yaml
- name: Set authorized key took from files
  authorized_key:
    user: oreore
    exclusive: yes
    key: '{{ item }}'
  with_file: '{{ key_files }}'
```

下記のように `key` で `for` するのが良さそうです。

```yaml
- name: Set authorized key took from files
  authorized_key:
    user: oreore
    exclusive: yes
    key: |
      {% for item in key_files %}
      {{ lookup('file', item) }}
      {% endfor %}
```

がしかし、なぜか `file` ではなく `url` にすると、１つの URL に改行区切りで複数の鍵が含まれているときに、改行がカンマに置換されてしまい、正しく設定できません。

```yaml
- name: Set authorized key took from urls
  authorized_key:
    user: oreore
    exclusive: yes
    key: |
      {% for item in key_urls %}
      {{ lookup('url', item) }}
      {% endfor %}
```

`lookup('url', item)` で改行が `,` に置換されるっぽい（`with_url` が行ごとにループすることに関係が？）。

```yaml
- debug:
    msg: |
      {{ lookup('url', 'http://example.com') }}
```

１回 `with_url` で回しておいて、その結果を `authorized_key` に使えば良い？

```yaml
- name: Fetch authorized key took from urls
  debug:
  with_url: '{{ key_urls }}'
  register: res

- name: Set authorized key took from urls
  authorized_key:
    user: oreore
    exclusive: yes
    key: "{{ res.results|map(attribute='item')|join('\n') + '\n' }}"
```

そもそも `url` だとチェックモードでも鍵がダウンロードされて遅いので、あからじめダウンロードしておいて `file` にするほうが良いかも。
RailsでCSVを出力する

## 環境
* ruby 2.4.0
* Rails 5.0.1

## 実装

* ViewにCSVダウンロードのボタンを追加する

```index.html.haml
=link_to('CSV Download', sample_path(@sample,format:csv)) 
```

* 呼び出されたcontrollerの処理を記述

```sample_controller.rb
class SampleController < ApplicationController
  before_action :set_sample, only: [:show]

  def show
    respond_to do |format|
      format.html
      format.csv do
        filename = 'sample'
        headers['Content-Disposition'] = "attachment; filename=\"#{filename}.csv\""
      end
    end
  end
  private
  def set_sample
    @sample = Sample.find(params[:id])
  end
```

* csvを整形するための処理を記述
  * ファイル名を`show.csv.haml`とする

```show.csv.haml
require 'kconv'
res = ''
res << @sample.id
res << ','
res << @sample.name
...中略
res << "\r"
res << "\r"
```

画面から `CSV Download`のリンクをクリックすると、csvがダウンロードされる。

なぜか最後に`"\r"`を２回書かないとエラーになった。。。
住所情報を持つcsvで一括ジオコーディングを行う方法

###CSVアドレスマッチングが一番手っ取り早い
ExcelのWEBSERVICE関数の利用や、APIへのリクエストを作るのでも良いけど
サクっと出すなら以下のサービスで秒速で完了。
http://newspat.csis.u-tokyo.ac.jp/geocode-cgi/geocode.cgi?action=start

####ステップ①住所カラムを持ったCSVファイルを用意
ラーメン屋の住所情報を一括でジオコーディングします。

####ステップ②画面に従ってフォーマットに沿ったCSVファイルをアップロード
アイテム名 / 電話番号 / 郵便番号 / 住所 のカラムを持ったCSVファイル用意
<img width="572" alt="キャFADSプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/56466/768d71ac-9e46-8a83-22ca-af03a46d444d.png">

住所を含むカラム番号を指定、文字コードを合わせて送信
<img width="303" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/56466/2c3d336f-0fe1-6cb1-cb08-350c73a76186.png">


####ステップ③以上
無事に緯度と経度が返されました。
<img width="326" alt="キャプチSADャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/56466/0c74ea1a-9e13-4c7a-f13d-df1fffb1f45b.png">

サービスやアプリ内で使用する際は、GoogleのGeocodingAPI等を使う事になりますがアドホックでデータを出す分には非常に便利なツールでしたｌ
Pythonの開発環境について

TensorFlowを利用するにあたりpythonの環境を作ろうとしていた所、`pyenv` `virtualenv` `pyenv-virtualenv` があって混乱したのでまとめました。

# pyenv
下記のように globalで利用するversionとlocal（ディレクトリごとに）で利用するversionを指定できます。

```shell-session
% cd python3.6.0
% pyenv local 3.6.0
% pyenv version
3.6.0 (set by /Users/hogehoge/work/python3.6.0/.python-version)
% cd ../
% pyenv version
2.7.13 (set by /Users/hogehoge/.pyenv/version)
```

# virtualenv 
virtualenv では 仮想環境を作ることができます
`source django/bin/activate`することで利用できます
下記は例えば django の仮想環境を作るとき

```shell-session

% mkdir virtualenv-sandbox
% cd virtualenv-sandbox
% virtualenv django
% source django/bin/activate
(django) [hoge@moge-no-MacBook-Air] ~/work/virtualenv-sandbox
% pip list
appdirs (1.4.3)
packaging (16.8)
pip (9.0.1)
pyparsing (2.2.0)
setuptools (34.3.3)
six (1.10.0)
wheel (0.29.0)
% pip install django
Collecting django
  Downloading Django-1.10.6-py2.py3-none-any.whl (6.8MB)
    100% |████████████████████████████████| 6.8MB 175kB/s
Installing collected packages: django
Successfully installed django-1.10.6
% pip list
appdirs (1.4.3)
Django (1.10.6)
packaging (16.8)
pip (9.0.1)
pyparsing (2.2.0)
setuptools (34.3.3)
six (1.10.0)
wheel (0.29.0)
```

deactivateする事で開発環境から抜け出せます。
deactivateした後は`pip list` をするとDjangoが無いことが確認できました。

```shell-session
% deactivate
% pip list
pip (9.0.1)
setuptools (28.8.0)
virtualenv (15.1.0)
```

# pyenv-virtualenv
上記の virtualenv とは別の仕組みで仮想環境を作れます
pyenvの拡張
`pyenv activate` で利用できるようになります

改めて記載します

# まとめ
TensorFlowのインストールを見るとvirtualenvを利用しているので、こちらを利用しようと思います。
https://www.tensorflow.org/install/install_mac

# 参考
http://dackdive.hateblo.jp/entry/2015/12/12/163400
http://qiita.com/bohemian916/items/4f0736dcea932a162d9e
そうだ TestRail を使ってみよう。

## はじめに
Excel でテストケースを管理していてこんなことで悩んでいませんか？

- 過去のテストケースを探すのに時間がかかる
- 〇〇の修正をした時はこのテストしてね！っていうのを管理したい
- テストにどれくらい時間がかかったか把握したい
- とにかくExcel でテストケースを作成するのが面倒

これらの悩みを「TestRail」を使用することによって解決できたので共有したいと思います。

## 目次
1. TestRailとは
2. どんな機能があるの？
3. セットアップ
4. テストケースの作成
5. テストラン生成
6. テストの実行
7. ユーザーの追加
8. 詳細設定
9. カスタマイズ

## 1. TestRailとは
簡単に言うと「ブラウザベースでテスト管理できる有償ツール」です。

使い方はいたってシンプルです。
テストランを生成し、どのテストケースを実施するのかを選択します。
あとは、テストを実施し結果を入力していくだけです。

## 2. どんな機能があるの？
- テストケースに優先度や、見積もり時間、JIRA連携
- エビデンスファイルの添付
- テスト時間の計測
- 階層構造（マイルストーン、セクション等）を持ってる
- テストケースの検索・ソート機能
- フレキシブルなユーザの権限設定
- カスタマイズ機能

## 3. セットアップ
TestRailを始めるには2つの方法がありますが、今回は TestRail Cloud で進めていきたいと思います。
<img width="500px" alt="セットアップ1" src="https://qiita-image-store.s3.amazonaws.com/0/172744/bb19d5e6-0d99-1ea2-78d1-1a70555ea7dc.png">

登録完了後はプロジェクトを作成します。
現時点では3種類の中からプロジェクトの種類を選択できます。
<img width="750px" alt="セットアップ2" src="https://qiita-image-store.s3.amazonaws.com/0/172744/5f2e1749-9e6c-baff-73c2-de9690bdc83a.png">

## 4. テストケースの作成
まずは、テストケースをグループ化する為に「セクション」を作成します。

## 5. テストラン生成
近々公開予定

## 6. テストの実行
近々公開予定

## 7. ユーザーの追加
ユーザーを追加することで、**3. セットアップ**で作成したURLにアクセスできる様になります。
ROLEの列で権限等の変更も行えます。
<img width="650px" alt="ユーザーの追加1" src="https://qiita-image-store.s3.amazonaws.com/0/172744/60a37327-7d6a-34fe-4786-a52d56fa4f2a.png">

## 8. 詳細設定
パスワードポリシーの設定や、アクセスできるIPアドレスも制御できます。
<img width="600px" alt="詳細設定1" src="https://qiita-image-store.s3.amazonaws.com/0/172744/1088abbb-7c46-f9fa-b9f2-4c6bc068a1f7.png">

## 9. カスタマイズ
近々公開予定