OmniAICreator/Qiita-1.07M huggingface dataset:
AMIMOTO AMIを使ってAWSにWordPressをインストールする

**2016年の春頃に書いてた下書きが出てきたのでとりあえず投稿する。**

* AMIMOTO HHVM AMIを選んでインスタンスを起動
* 10分ぐらい待つ
* Elastic IPを紐付ける
* Elastic IPのアドレスにアクセス
* インスタンスIDを入力してWordPressをインストール
* Route 53から独自ドメインのAアドレスをElastic IPに設定　[参考](https://ja.amimoto-ami.com/2013/11/29/elastic-ip-and-route-53/)
* SSHでインスタンスに接続`$ ssh -i ec2.pem ec2-user@[Elastic IP]`
* `$ sudo yum update`
* SFTPで接続してファイルを操作できるように`$ curl -L https://raw.githubusercontent.com/amimoto-ami/run-httpd-as-ec2-user/master/run-httpd-as-ec2-user.sh | sudo bash`を実行
* TransmitでSFTPを設定。サーバ：Elastic IP、ユーザ名：ec2-user、パスワード：ec2.pem、リモートパス：/var/www/vhosts/[インスタンスID]/


# SSLを設定

* `$ sudo openssl genrsa -des3 -out ./ssl.newpeace.vision.key 2048`で鍵を生成
* `$ sudo openssl rsa -in /etc/nginx/ssl.newpeace.vision.key -out /etc/nginx/ssl.newpeace.vision.key`でパスフレーズを解除
* `$ sudo openssl req -new -key ./ssl.newpeace.vision.key -out ./ssl.newpeace.vision.csr`で鍵を生成
* [参考](https://jp.globalsign.com/support/csr/532.html)
* `ssl.globalsign.com.csr`の内容を申請フォームに入力
* SSL証明書を取得
* SSL証明書をインストール
* `$ sudo vi /etc/nginx/ssl.newpeace.vision.crt`で「証明書 SHA256」の内容をコピー
* `$ sudo vi /etc/nginx/dvcacert.cer`で「中間CA証明書」の内容をコピー
* `$ sudo cat ssl.newpeace.vision.crt dvcacert.cer > ssl.newpeace.vision.pem`で「証明書 SHA256」と「中間CA証明書」を結合（これできない。。）
* `$ sudo chmod -R 777 /etc/nginx/conf.d/`でNGINXの設定ファイルに書き込み権限を付与
* `/etc/nginx/conf.d/ssl.default.conf`を作成して、

```nginx:/etc/nginx/conf.d/ssl.default.conf
server {
    listen      443 default spdy ssl;
    server_name _;
    root        /var/www/vhosts/i-c3880266;
    index       index.html index.htm;
    charset     utf-8;

    ssl                       on;
    ssl_certificate           /etc/nginx/ssl.newpeace.vision.pem;
    ssl_certificate_key       /etc/nginx/ssl.newpeace.vision.key;
    ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers               HIGH:!aNULL:!MD5;
```

を書く。

* `$ service nginx restart`でNGINXを再起動
* https://robottaxi.newpeace.vision/ にアクセスできることを確認！


`default.conf`の`charset utf-8;`の下に`return 301 https://$host$request_uri;`を追記
VBScriptからnpmを実行するときの注意点

## ハマったところ
VBScriptを使い、ExcelVBAのソースをエクスポートして、nodejsのコマンドラインツールで解析してやろうと思い、こんなソースを書いていた。

```vbnet:これでいんだよな.vbs
Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec("npm root -g")

If Not objExec.StdOut.AtEndOfStream Then
  WScript.Echo objExec.StdOut.ReadLine
End If

set objShell = Nothing
set objExec = Nothing
```

しかし、これだと「80070002：指定されたファイルが見つかりません。」と表示される。
なんのこっちゃらと思っていたら、拡張子が必要なことに気づいた。
npmの場合は、「npm.cmd」として呼び出せばよいのだった。


```vbnet:こうすりゃよかったのか.vbs
Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec("npm.cmd root -g")

If Not objExec.StdOut.AtEndOfStream Then
  WScript.Echo objExec.StdOut.ReadLine
End If

set objShell = Nothing
set objExec = Nothing
```
Emacsのよく使うコマンド

Emacsを使い始めたのでよく使うコマンドをまとめてみました。
※WindowsであればC=Ctrl,M=Altが対応しています。

# コマンド操作
`C-x`であれば`Ctrl`を押しながら`x`を押す。
`C-x C-c`であれば`C-x`を押した後に`C-c`を押す。

# テキスト編集

|動作|キー入力|
|:--|:--|
|コピー|M-w|
|切り取り|C-w|
|貼り付け（ヤンク）|C-y (M-y...)|
|１行削除|C-k|
|アンドゥ（１つ戻る）|C-/ , C-_ , C-x u|
※ヤンクではC-yのあとにM-yを押すとその数だけコピーする内容をさかのぼることができます。

# ファイル、バッファ操作
C-gはコマンドを間違えた時などによく使うので覚えておくと便利です。

|動作|キー入力|
|:--|:--|
|ファイル表示|C-x C-f|
|ファイル保存|C-x C-s|
|別名で保存|C-x C-w|
|バッファ一覧表示|C-x C-b|
|バッファを開く|C-x b|
|バッファを削除|C-x k|
|別ファイルを挿入|C-x i|
|コマンド中断|C-g|
|Emacs終了|C-x C-c|

# カーソル移動

|動作|キー入力|
|:--|:--|
|行頭|C-a|
|行末|C-e|
|1文字戻る|C-b|
|1文字進む|C-f|
|1行戻る|C-p|
|1行進む|C-n|
|ファイル先頭に移動|ESC-<|
|ファイル末尾に移動|ESC->|
|１ページ戻る|C-x [|
|１ページ進む|C-x ]|

# ウインドウ操作

|動作|キー入力|
|:--|:--|
|縦に並べる|C-x 2|
|横に並べる|C-x 3|
|現在の位置だけ残す|C-x 1|
|現在の位置だけ閉じる|C-x 0|
|ウインドウの移動|C-x o|

# 検索、置換

|動作|キー入力|
|:--|:--|
|検索|C-s , C-r, C-M-s, C-M-r|
|置換|M-% , C-M-%|
※C-sがカーソルの後ろを検索していき、C-rがカーソルの前を検索していきます。
C-M-*は正規表現に対応した検索、置換になります。
# ヘルプ
コマンドを忘れた時でもヘルプは開けるように覚えておくと良いと思います。

|動作|キー入力|
|:--|:--|
|ヘルプ|C-h m|

また、M-xのコマンドついて調べてみるといろいろできて便利です。
PostmanでOAuthの設定をしてGoogle APIを実行する手順

いつのまにか[Postｍan](https://www.getpostman.com/)でOAuthの設定が簡単にできるようになってた（筆者が気づかなかっただけで昔からあったのかもしれない）のでその手順について解説する。
※PostmanはHTTPリクエストを生成してくれるツールでAPIの実行確認等で使われている。

筆者はGoogle APIの検証用に使っているのでその際の手順を記載します。
Google APIでなくてもOAuthに対応したサービスなら使えるはずなので、似たような感じでやっていただければと思います。


# Google側の設定
まずGoogle側で認証情報を作成する。


## 認証情報の作成
[Google Developer Console](https://console.developers.google.com)でOAuth クライアントIDを作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/d78ad383-ce16-a896-d112-5b0802eea121.png)

--- 

1. ウェブ アプリケーションを選択
2. 名前は適当に
3. リダイレクト URIに`https://www.getpostman.com/oauth2/callback`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/ed74efd1-36e7-5ae9-244f-4c749b1004ae.png)

---

`作成`をクリックしたらクライアントIDとシークレットが記載されているのでメモっておく。


# Postman
インストールしてない人はインストールしておく
https://www.getpostman.com/

※筆者はChromeのやつを使っている。


## 認証情報の設定画面を表示する
1. Authorizationタブを選択
2. TypeにOAuth2.0を選択
3. Get New Access Tokenをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/c8a4d4fa-6e1e-f598-f880-e35dee819d02.png)

## 認証情報を入力する
1. Token Nameは適当に
2. Auth URLに `https://accounts.google.com/o/oauth2/v2/auth`
3. Access Token URLに `https://www.googleapis.com/oauth2/v4/token`
4. Client IDはさきほどメモっといたやつ
5. Client Secretも同様
6. Scopeは使いたいAPIに対応するScope（今回はユーザー情報をとるための`email`を設定）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/57e2961c-be32-aea5-b77f-828c9ff9fbd0.png)

## Request Tokenボタンをクリック
クリックするとGoogleのログイン画面が表示されるので認可するユーザーでログインする。

ログインが完了すると以下のようにTokenが作られるので作られたやつを選択すると右側にアクセストークンの情報が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/864bcff3-4971-03df-44d1-33205fee22e6.png)





# APIの実行

## アクセストークンを設定する
先程アクセストークンを作ったが、これだけではダメでリクエストに付加する必要がある。

1. Use TokenをクリックだけでOK

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/977c9f6b-6f30-0c95-d763-e3cdfe8c3a00.png)


Headersタブ内を見るとアクセストークンがセットされていることがわかる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/5e0c4f74-9dc1-159e-c5e8-b3bd7d42a97f.png)



## APIの実行

今回はユーザー情報をとるためのリクエストを実行する。

1. URLに `https://www.googleapis.com/plus/v1/people/me/openIdConnect`
2. Sendボタンをクリックする

アクセストークンを付与したHTTPリクエストが送信され、画面下部にレスポンスが表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/8142f366-a9d6-fef5-70cf-3daa95cb231e.png)


# あとがき
本記事では省略するが、右上のSaveボタンからリクエスト情報を保存しておくことができる。
一度作っておけば、次からアクセストークンを取得する手順だけやれば良いのでとても便利。
rvm+UnityのPostProcessBuildにてcocoapodsが上手く動かない問題の解決法

Unityにて広告SDKを利用する際などに、
iOSのPostProcessBuild内でcocoapodsを利用する場合がある。

その際ビルド端末にcocoapodsをインストールしていないと以下のエラーがでるが、
内容にしたがってコマンド叩いても変化がないケースがある。

```
Error running cocoapods. Please ensure you have at least version 1.0.0.  You can install cocoapods with the Ruby gem package manager:
 > sudo gem install -n /usr/local/bin cocoapods
 > pod setup
```

このとき、rvmが原因の可能性がある。
以下の通りsystemのrubyに切り替えてcocoapodsのインストールを行えばよい。

```
$ rvm use system
$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup
```

cocoapodsに限らず、
PostProcessBuildにてrubyのgemを利用している場合は同様のことが言える。
nvALT + GitHub theme


### Features

- Github theme
- Github markdown support
- Font Awesome icons [fa-github]
- simple checkbox support
- code highlighting
- User Story detection (As a user, I expect ...)

![screenshot](https://cloud.githubusercontent.com/assets/7358/2734135/1856cee4-c650-11e3-85ca-198179647c8e.png "Screenshot")

### Requirements

[nvalt](http://brettterpstra.com/projects/nvalt/) - nvALT is a fork of the original [Notational Velocity](http://notational.net) with some additional features and some interface modifications.

## Installation

In a terminal:

```bash
cd ~/Library/Application\ Support/
rm -rfi nvALT/
git clone https://github.com/bawigga/nvalt-prime.git nvALT
```

> No need to restart nvALT. The changes will be picked up the next time you switch notes. You can also right click on the preview window and click refresh.


#### Reverting

You can always restore the default just by deleting the files in `~/Library/Application Support/nvALT/`.

```bash
rm -rfi ~/Library/Application\ Support/nvALT
```

#### Updating

In a terminal:

```bash
cd ~/Library/Application\ Support/nvALT/
git pull
```

#### Hacking

Just point `~/Library/Application Support/nvALT` to your local git repository.

```bash
cd [your project path]
git clone git@github.com:bawigga/nvalt-prime.git
rm -rfi ~/Library/Application\ Support/nvALT
ln -s /path/to/nvalt-prime/ ~/Library/Application\ Support/nvALT
```

> No need to restart nvALT. The changes will be picked up the next time you switch notes. You can also right click on the preview window and click refresh.

## Usage

> Please share how/why you use nvALT! Submit a quick comment on [issue #14](https://github.com/bawigga/nvalt-prime/issues/14)

### Checkboxes

There are two types of checkboxes you can use:

    [ ] - unchecked
    [/] - checked
    [ ] - checked @done

### Code Highlighting

    class SomeClass
        def someMethod
        end
    end

### Font Awesome Icons

    [fa-github]

### Github Markdown Theme

    strikethrough: wrap text with ~~
【Docker】「none」なイメージを一括で削除する

# やりたいこと

`docker build`していると以下のようにタグのついていないイメージがたまっていることがよくある。

```
$ docker image ls
REPOSITORY                                                 TAG                 IMAGE ID            CREATED             SIZE
...
<none>                                                     <none>              be2f82f92782        11 hours ago        1.26 GB
<none>                                                     <none>              3275a6a76654        5 weeks ago         1.2 GB
<none>                                                     <none>              a3cab9acbb9b        5 weeks ago         1.31 GB
<none>                                                     <none>              964fc4ae2a47        5 weeks ago         971 MB
<none>                                                     <none>              6141e382df94        5 weeks ago         770 MB
<none>                                                     <none>              2b1a557587cf        5 weeks ago         770 MB
<none>                                                     <none>              52c094d1e8f2        5 weeks ago         767 MB
<none>                                                     <none>              ca80162d555f        5 weeks ago         767 MB
...
```

# 「none」なイメージをフィルタして一覧する

フィルターの`dangling`フラグを使うことでタグがnoneのイメージを一覧することができる。

```
$ docker image ls  --filter "dangling=true"
```

# 「none」なイメージを削除する

以下のようにすることでタグが「none」なイメージを一掃することができる。

```
$ docker image rm $(docker image ls  --filter "dangling=true" -aq)
```

# 参考

https://docs.docker.com/engine/reference/commandline/images/#filtering
Goでのアルゴリズムクイックリファレンス第2版(バケツソート)

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。[アルゴリズムクイックリファレンス 第2版](https://www.amazon.co.jp/gp/product/4873117852/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117852&linkCode=as2&tag=amesho-22&linkId=b7688201ae37a6234596fa96dfd3ccdd)を読んで各種アルゴリズムをGoで実装して行きます。

前回: [Goでのアルゴリズムクイックリファレンス第2版(4.4 クイックソート)](http://qiita.com/amesho/items/d77cfb9d5b470bfff78a)

今回は[バケツソート](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%82%BD%E3%83%BC%E3%83%88)

+ 整列したいデータの取り得る値がm種類であるとき
+ m個のバケツを用意しておき
+ 値毎に1個のバケツを対応づける
+ 元のデータ列を捜査して
+ 各データに対応するバケツに入れておく
+ この処理が終わった後
+ 整列したい順序にしたがってバケツから値を取り出せば
+ データをソートすることができる

+ 成立する性質
    + 一様分布
    + 順序のついたハッシュ関数

https://play.golang.org/p/p9bUgeGQ2g

```go
package main

import "fmt"

const BUCKETS = 10

func bucketSort(a *[]int, size int) {
	var i, j, k int
	buckets := make([]int, BUCKETS)
	for j = 0; j < BUCKETS; j++ {
		buckets[j] = 0
	}
	for i = 0; i < size; i++ {
		buckets[(*a)[i]]++
	}
	i = 0
	for j = 0; j < BUCKETS; j++ {
		for k = buckets[j]; k > 0; k-- {
			(*a)[i] = j
			i++
		}
	}
}

func main() {
	ary := []int{3, 2, 1, 9, 5, 7}
	fmt.Println(ary)
	bucketSort(&ary, len(ary))
	fmt.Println(ary)
}
```

実装しつつ、改めて考えてなるほど確かにこれは最初の条件に従う時にしかできないソートですね。なんか、クイックリファレンスが次のアルゴリズムを決めるベースになってしまっている。今回は入門データ構造とアルゴリズムのやり方がコンパクトだったのでそちらでやってしまった。hash関数を作る方法であとでもう一度tryしたい。

次回はマージソートの予定です。
Docker for Windowsの使い方メモ

Toolboxじゃなくて、Windows 10から使えるようになったDocker for Windowsの使い方メモ

# 大前提

* コマンドプロンプトではなく、PowerShellを使うこと

もしかしたらパイプをうまく使えばコマンドプロンプトでもいけるかもだけど、 `$()`とかが使えないのでPowerShellでやる。
基本的にはLinuxのdockerコマンドの ` を $()に書き換えればよさそう。

# 停止したコンテナをまとめて削除する

```
docker rm $(docker ps -qa)
``` 
# standard_init_linux.go: 178: exec user process caused "no such file or directory"
LinuxベースのコンテナのDockerfile作った時にシェルのどこかで改行コードがCRLFになってしまっている。LFに置換する。

ちょこちょこ追記する予定
自分でビルドした OpenCV モジュールの wheel を作る

株式会社 ALBERT でアルバイト中の grafi です。なんかこれまで Qiita に投稿することはなかったんですけど、初投稿してみます。

# 動機
データ分析などをしていると、Python で画像を読み込んだり簡単な加工を施したりということが多いですので、OpenCVが欲しいところです。だいたいの人は Anaconda で済ましているのでしょうが、Python のエコシステムから離れてしまうのは個人的に嫌であり、またリンクするライブラリも好きに指定したいです。

そういうわけでOpenCVをビルドすることになります。ビルド方法はあちこちに説明があると思うので割愛します。そうすると Python のモジュールとして `cv2.なんとか.so` などのファイルが作成されます。これをグローバルにインストールするには `make install` するだけです。

しかし、`virtualenv`（あるいは `venv` ）で作った環境からは、`--system-site-packages`  をつけない限りこの `cv2` モジュールが見えません。`cv2.なんとか.so` を `virtualenv` 環境内の `site-packages` にコピーすれば動くには動きますが、どうにもカッコ悪いです。

なのでこれを wheel にできないかと思いました。

# やりかた
本質的にやりたいことは「一つのビルド済み拡張モジュールを wheel にしたい」といえますが、こういうことはサポートされていないようです。

そのため色々錯誤しましたが、なんとかできました。
主に参考にしたのは

- [How can I make a Python Wheel from an existing native library? - Stack Overflow](https://stackoverflow.com/a/24793171/2709982)
- [Package only binary compiled .so files of a python library compiled with Cython - Stack Overflow](https://stackoverflow.com/a/39640762/2709982)
- [Including Data Files — setuptools 35.0.2 documentation](http://setuptools.readthedocs.io/en/latest/setuptools.html#including-data-files)

の三つです。

まず、ディレクトリ構成は以下のようになります。

```
--+-- cv2 --+-- _native --+-- cv2.なんとか.so
  |         |             |
  |         |             +-- __init__.py
  |         | 
  |         +-- __init__.py
  |
  +-- setup.py
  |
  +-- MANIFEST.in
```

`cv2` ディレクトリ直下の `__init__.py` には

```py3
import * from _native.cv2
```

と書きます。
`_native` ディレクトリ以下の `__init__.py` は空で構いません。

`setup.py` は以下のように、

```py3
from setuptools import setup
from setuptools.dist import Distribution

class BinaryDistribution(Distribution):
    def has_ext_modules(foo):
        return True

setup(
    name='cv2',
    version='1.0',
    packages=['cv2'],
    include_package_data=True,
    distclass=BinaryDistribution,
)
```

また `MANIFEST.in` は

```
include cv2/_native/cv2.なんとか.so
```

と書きます。

これで `python setup.py bdist_wheel` を実行すると、`dist` 以下に `cv2-1.0-cp36-cp36m-linux_x86_64.whl` みたいなファイル名の wheel　ができます。めでたしめでたし。

## 解説
やってることは単純で、ダミーのパッケージを作って本来の `cv2` モジュール内の定義を全て export しているだけです。本来の `cv2` モジュールは一応隠しておきたいところですが、`cv2.なんとか.so` を `_cv2.なんとか.so` にリネームすると動作しなくなるので、別のパッケージの中に入れることで解決しました。

`has_ext_modules = True` として強引に拡張モジュールが入っていると教えてやることで、他の OS に持っていくとインストールが拒否されるような wheel にすることができます。

## 応用
`numpy` や `scipy` は自前でコンパイルして高性能な行列演算ライブラリにリンクしないと性能がでないですが、これもコンパイルした結果を wheel にしておくと便利です。この詳細は後日書きます。
EclipseでJavaファイルではtabキーでスペースが入るようにしてタブとスペースを目視できるように設定する方法

1つのソースファイルにタブとスペースによるインデントが混在しているのが嫌いです。

最近見たのは特定の改修に関わる行だけタブであとは全てスペースのファイル。しかも、1行の中でもタブとスペースが混在しているのです。
何か自己主張しているのだろうか？とも考えられますがコーディングしている人がタブとスペースどちらを自分が入れているのかわかっていないのかもしれません。

なので、「タブとスペースどちらを使うのか」だけではなく「タブとスペースを可視化する」設定をすればいいと考えました。

- 環境
    - OS : macOS Sierra Version 10.12.4
    - Eclipse : Kepler Service Release 2 Build id: 20140224-0627
        - 設定しているデフォルトJRE : Java SE 7[1.7.0_67]

### Javaファイルではtabキーを押下すると4つスペースが入るように設定する
1. [Prefernces]ダイアログ > [Java] > [Code Style] > [Formatter] を選択します。
2. [New...]ボタンを押下し、[New Profile]ダイアログを開きます。
    - 既に自分用の設定があればそれを使ってもOK。
3. [Profile name:]に適当な設定名を入力し、[OK]を押下します。![Screen Shot 2017-05-30 at 22.21.13.png](https://qiita-image-store.s3.amazonaws.com/0/159761/40ac4f3a-4717-4a2e-fe54-f180101801df.png)
4. [Indentation]を押下して、[General settings]を見ます。
5. [Tab policy:]で[Spaces only]を選択します。
6. [Indentation size:][Tab size:]に「4」を入力します。![Screen Shot 2017-05-30 at 22.07.43.png](https://qiita-image-store.s3.amazonaws.com/0/159761/17754d0e-9f72-6f2a-ee57-0f74a73c2679.png)
7. [OK]を押下して、ダイアログを閉じます。
8. [OK]を押下して、[Prefernces]ダイアログを閉じます。

### タブとスペースを目視できるように設定する
1. [Prefernces]ダイアログ > [General] > [Text Editors] > [Show whitespace characters]にチェックを入れます。
2. [configure visibility]リンクを押下して、[Show Whitespace Characters]ダイアログを開きます。
3. 表示する文字[Space][Ideographic space][Tab]の表示場所[Leading][Enclosed][Trailing]にチェックを入れます。![Screen Shot 2017-05-30 at 22.37.15.png](https://qiita-image-store.s3.amazonaws.com/0/159761/ae59b409-7888-7e5e-e088-beef16beb0e7.png)
4. [OK]を押下して、ダイアログを閉じます。
5. [OK]を押下して、[Prefernces]ダイアログを閉じます。
デザインパターン入門（Strategy）

この記事ではStrategyについてまとめます。
wikipediaによると「アルゴリズムを使用者から独立したまま様々に変化させることができるようになる」とあります。
参考：[Strategyパターン](https://ja.wikipedia.org/wiki/Strategy_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

**主な登場人物**


| NO | 名前 | 役割 |
|:-:|:--|:--|
|1|コンテキスト|ストラテジをインスタンス化する|
|2|ストラテジ|アルゴリズムのインタフェース|
|3|ストラテジの具象クラス|アルゴリズムの実装|

アルゴリズムを使用者から独立するとありますが、入れ替えが可能な処理群をインタフェースで隠蔽して細かくまとめる。必要であれば入れ替えることで影響範囲を局所化します。

**パターンを実装する**
駅で自動改札を利用する場合を想定して実装します。「非接触型ICカード（Suicaや、ICOCAなど）専用改札」「乗り換え専用改札」「切符専用改札」の3種類改札を通るという行為をStrategyパターンで実装します。

**ストラテジ**

```java:Strategy.java
interface Strategy {
  void pass();
}
```

**ストラテジの具象クラス**

```java:ConcreteNonContactTurnstile.java
class ConcreteNonContactTurnstile implements Strategy {
  public void pass() {
    System.out.println("Set And Touch！");
  }
}
```

```java:ConcreteTicketTurnstile.java
class ConcreteTicketTurnstile implements Strategy {
  public void pass() {
    System.out.println("Ticket accept");
  }
}
```

```java:ConcreteTransferTurnstile.java
class ConcreteTransferTurnstile implements Strategy  {
  public void pass() {
     System.out.println("Transfer Line！");
  }
}
```

**コンテキスト**

```java:ContextStation.java
class ContextStation {
  Strategy strategy;

  public ContextStation(Strategy strategy) {
    this.strategy = strategy;
  }

  public void pass() {
    strategy.pass();
  }
}
```

**実行クラス**

```java:Main.java
class Main {
  public static void main(String[] args) {
    ContextStation contextStation;
    contextStation = new ContextStation(new ConcreteNonContactTurnstile());
    contextStation.pass();
  }
}
```

```:結果
Set And Touch！
```

上記の通り、類似した処理群を1つのインターフェスを実装する形で抽象化します。そのインタフェースへの参照を保持するコンテキストという役割のクラス経由でストラテジ以下のクラスをインスタンス化しています。実装時には、メインクラスの「new ContextStation(new Concrete○○)」の○○部分を入れ替えることで処理内容を高速に変更することがこのパターンの目的です。新しい種類の改札「有人改札」を追加する場合には新規ストラテジの具象クラスを追加して、前述したパターンの部分を入れ替えることで実装できます。
bashでバックグラウンドプロセスの終了を待つ

ちゃんと停止コマンドがあるやつはいいけど `kill`で停止するやつとかはちゃんと停止を待ってあげる必要がある。
最近、docker-entrypoint.shでよく書いてるのでメモする。

```bash
#!/bin/bash
set -e

## 
## なにがしかの処理
##

# &使ってバックグラウンドプロセスにしてる場合（実行の次の行に書く）
# nohup hogehoge &
# pid=$!

stop() {
    echo " * Stopping"
    # pidファイルを作ってた場合
    # local pid=`cat xxx.pid`

    kill $pid
    local psalive=`kill -0 $pid > /dev/null 2>&1; echo $?`
    while [ "$psalive" = "0" ]
    do
        sleep 1
        psalive=`kill -0 $pid > /dev/null 2>&1; echo $?`
    done
    echo "   ...done."
}


# SIGTERMで引っ掛けたい場合
# trap 'stop' TERM
```
WebminのSSL証明書をLet’s Encryptにしてみる

WebminのSSL証明書をLet’s Encryptにしてみました。
Webminはポート番号を変更しています。また、IPアドレスによるアクセス制限をしています。
更にWebサーバーは運用していないのでLet’s Encryptの証明書の取得はstandaloneを使用します。

#Let's Encryptの証明書の取得
##certbot-autoの入手

```
cd /opt
git clone https://github.com/letsencrypt/letsencrypt
```

##証明書の入手

```
/opt/letsencrypt/letsencrypt-auto certonly --standalone -d webmin.sample.local
```

#Webminの設定
##miniserv.confの変更

```miniserv.conf
keyfile=/etc/letsencrypt/live/webmin.sample.local/privkey.pem
certfile=/etc/letsencrypt/live/webmin.sample.local/fullchain.pem
```

##Webminの再起動

```
service webmin restart
```

#証明書の定期更新
Let's Encrypt の証明書の有効期限は90日間のため定期的に更新する必要があります。
毎月12日の朝5時に更新するようにcronを設定します。
更新日時はお好みで。

```
00 05 12 * */opt/letsencrypt/certbot-auto certonly --standalone --force-renewal -d webmin.sample.local && service webmin restart
```
Windows 10(Surface)にDocker for Windowsをインストール

**※Windows 10 Pro前提です（HyperVが必要）**
意外とまとまってる情報がなかったので作成。
Docker Toolboxではなく、Linuxに入れるような感じでDockerをWindowsで使えるようになった！

# Windows Subsystem for Linux(Beta)の有効化

Windows Menuを右クリック -> アプリと機能 -> プログラムと機能 -> Windowsの機能の有効化または無効化 -> [Windows Subsystem for Linux(Beta)]のチェックを入れる -> 再起動



# Docker for Windows をインストール

https://store.docker.com/editions/community/docker-ce-desktop-windows



# Docker for Windowsを実行
デスクトップにある「Docker for Windows」のアイコンをダブルクリックして実行
※ "Not enough memory to start Docker"というエラーが出た場合は以下を実行。

1. 右下のタスクトレイにいる赤色のクジラを右クリック -> Settings
2. Advanced -> Memroy の値を下げて [Apply]

※ 自分の環境では最低値にしてもエラーがでたので、chromeを閉じたところ起動するようになった。

右下のタスクトレイに白色のクジラがいれば起動成功



# コマンドプロンプトを開き、動作確認
```
docker version
```
※Client、Serverのバージョンが表示されてたらOK

```
docker run hello-world
```

※別途Docker用のコンソールのがあるかと思いきや、普通にコマンドプロンプトでいけた
さくらクラウドのMastodnを更新(1.3.2 -> 1.4.1) 

##環境：さくらのクラウドです。
CentOS Linux release 7.3.1611 (Core)
[ゼロからはじめるMastodon](http://knowledge.sakura.ad.jp/knowledge/8591/)
なのでDockerコンテナではありません。

##更新方法確認
* [Things to look out for when upgrading Mastodon](https://github.com/tootsuite/documentation/blob/master/Running-?Mastodon/Production-guide.md)
* [Release v1.4.1](https://github.com/tootsuite/mastodon/releases/tag/v1.4.1)

##環境整備
Release v1.4.1 に従って
■ Nodejsのversion確認

```
$ node -v
v6.10.3
```
先日カーネル更新したとき、一緒に更新してた。OK

■ pkgconfig 入ってた :D

```
# yum install pkgconfig
Package 1:pkgconfig-0.27.1-4.el7.x86_64 already installed and latest version
```

■ protobuf-devel protobuf-compiler 追加した。:)

```
# yum install protobuf-devel protobuf-compiler
```
■ /hove/mastodon/live/.env.production 確認
setしてたら調整してね！なので確認

```..env.production
#CDN_HOST
#STREAMING_API_BASE_URL
```
何もセットしてない。

##更新作業

■ fetch

```
# su - mastodon
$ cd live
$ git fetch
remote: Counting objects: 5466, done.
:(略)
 * [new tag]         v1.3.3     -> v1.3.3
From https://github.com/tootsuite/mastodon
 * [new tag]         v1.4.1     -> v1.4.1
 * [new tag]         v1.4rc1    -> v1.4rc1
 * [new tag]         v1.4rc2    -> v1.4rc2
 * [new tag]         v1.4rc3    -> v1.4rc3
 * [new tag]         v1.4rc4    -> v1.4rc4
 * [new tag]         v1.4rc5    -> v1.4rc5
 * [new tag]         v1.4rc6    -> v1.4rc6
```

■ checkout

```
$ git checkout v1.4.1
```

■ Release v1.4.1に従い依存関係更新

```
$ bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
:(略)
Bundle complete! 81 Gemfile dependencies, 134 gems now installed.
Gems in the groups development and test were not installed.
Bundled gems are installed into ./vendor/bundle.

$ yarn install
yarn install v0.22.0
[1/4] Resolving packages...
[2/4] Fetching packages...
:(略)
Binary found at /home/mastodon/live/node_modules/node-sass/vendor/linux-x64-48/binding.node
Testing binary
Binary is fine
node-sass@4.5.2 /home/mastodon/live/node_modules/node-sass
Done in 151.98s.
```

■ Mastodon更新

```
$ RAILS_ENV=production bundle exec rails db:migrate
$ RAILS_ENV=production bundle exec rails assets:clobber
$ yarn install --pure-lockfile
$ RAILS_ENV=production bundle exec rails assets:precompile
```

■ サービス再起動

```
# systemctl restart mastodon-*.service
```

![141.JPG](https://qiita-image-store.s3.amazonaws.com/0/71525/1178bd4f-b2ac-abc7-d623-3eaa551f0ae7.jpeg) :sunny: OK!

■ 少しトラブル X(

何故か、昨日分の画像が表示されなくなりました。
以前の物と、更新後の投稿分は正しく表示されます。

![a.JPG](https://qiita-image-store.s3.amazonaws.com/0/71525/42a76dfa-0f09-2e88-31ec-ad1cfbd63fab.jpeg)

![b.JPG](https://qiita-image-store.s3.amazonaws.com/0/71525/fae0ea6e-3543-3282-cc8b-e57b553666b2.jpeg)

□ dairyを手で回してみるも変わらず ;(

```
$ ./.rbenv/shims/bundle exec rake mastodon:daily > /dev/null
```

ま、しょうがない
rails db:rollbackとか考えたけど、動いてるからいいや。
初心者向け：AWS(EC2)にRailsのWebアプリをデプロイする方法 目次


## 概要
先日、RailsのWebアプリケーションを、AWSのEC2にデプロイしました。
丸々2日間掛かる作業となり、大変苦労しました。

同じように大変な思いをされている方がいると予想されますので、今回デプロイした手順をすべて画像で紹介致します。

ちなみに、ここで紹介した方法を設定し、1ヶ月運用すると約5000円掛かります。（AWSは1時間当たりの利用料金で請求されます。）

なので、勉強のためにデプロイしたい方は、一度デプロイした後はRDSをストップするなど、利用を制限することが重要です。

しかしながら、デプロイは非常に勉強になるので、一度試すことは良いと思います。

## デプロイしたWebアプリケーション
- 今回デプロイしたものは以下になります。

#### [キリスト教会マップ](https://www.christchurches-map.com/)

- ちょっと変わったサービスですが、これを作成した背景は自分がエンジニアになった経歴と関係がありますので、興味がある方はご覧ください。

#### [キリスト教の牧師(見習い)からWebエンジニアに転職した話](http://qiita.com/iwaseasahi/items/1c4fdd47d38f2f2fa45b)

## 目次
### [初心者向け：AWS(EC2)にRailsのWebアプリをデプロイする方法 ①](http://qiita.com/iwaseasahi/items/7af16215f06fbc57c490)
#### ・VPCの作成
#### ・サブネットの作成
#### ・インターネットゲートウェイの作成
#### ・ルートテーブルの作成
#### ・セキュリティグループの作成

### [初心者向け：AWS(EC2)にRailsのWebアプリをデプロイする方法 ②](http://qiita.com/iwaseasahi/items/4666f9a777ba3cf61a05)
#### ・RDSの作成
#### ・RDSの設定

### [初心者向け：AWS(EC2)にRailsのWebアプリをデプロイする方法 ③](http://qiita.com/iwaseasahi/items/4a48aa50594506cbd8b6)
#### ・インスタンスの作成
#### ・インスタンスの設定
#### ・SSH接続

### [初心者向け：AWS(EC2)にRailsのWebアプリをデプロイする方法 ④](http://qiita.com/iwaseasahi/items/b28f8b91c4638e2c57fd)
#### ・Nginxのインストール
#### ・Nginxの設定
#### ・作業用ユーザーの作成
#### ・作業用ディレクトリの作成
#### ・プラグインのインストール
#### ・Githubと連携
#### ・Githubに鍵を追加
#### ・RDSの確認
#### ・セキュリティグループの設定
#### ・パラメータグループの作成
#### ・Githubからクローン
#### ・Nginxの設定ファイル
#### ・Unicornの設定ファイル
#### ・database.ymlの設定

### [初心者向け：AWS(EC2)にRailsのWebアプリをデプロイする方法 ⑤](http://qiita.com/iwaseasahi/items/72c43bd932ad5cc2d206)
#### ・ロードバランサーの作成
#### ・Railsアプリの起動
#### ・ブラウザから表示

### [初心者向け：AWS(EC2)にRailsのWebアプリをデプロイする方法 ⑥](http://qiita.com/iwaseasahi/items/3e42a13b33ec5c792021)
#### ・Route53の設定
#### ・ネームサーバーの変更
#### ・ネームサーバーの確認
#### ・ドメインの適用
三項演算子の罠

多くの言語に存在する三項演算子（`? :`）ですが、ときどき引っかかるポイントがあります。なお、「どのような場面で、三項演算子を使うべきか、あるいは使わないべきか」という議論には踏み込まないこととします。

# 名称
よく「『三項演算子』という言い方は項数を表しているに過ぎないから、『条件演算子』と言った方がいい」という言説を聞きます。確かに、正確に言えば「三項演算子」ではあらゆる三項の演算子が入ってしまうことになります。

ただ、多くのプログラミング言語では、関数呼び出しや添字といった、項数が可変となる演算子を除いて、三項の演算子は`? :`しかありません。一方で、短絡評価を行う`&&`や`||`を、Javaでは「条件And演算子」「条件Or演算子」というように、条件演算子に区分しています。そのような状況を考えれば、言語がはっきりしている環境では「三項演算子」と呼ぶほうが通りもいいし、それで問題ないかなと考えています。

# PHP

PHPの場合、`(条件a) ? 値1 : (条件b) ? 値2 : 値3`のように書くと、**左結合**で`((条件a) ? 値1 : (条件b)) ? 値2 : 値3`のように処理されてしまいます。三項演算子の結果を次の三項演算子の条件にしてしまうという、直感的でない解釈がされますので、正しくカッコで括るなど、気をつけましょう。

# Ruby

Rubyにも三項演算子がありますが、こちらでは**トークンの多様性**が問題となってきます。

* `foo?`…そういう名前のメソッドが存在できる
* `?b`…[1文字を表す文字列リテラル](http://qiita.com/jkr_2255/items/403f8bf6d0c5211e66f4#1%E6%96%87%E5%AD%97%E3%81%AE%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB)
* `bar:`…ハッシュの略記法の一部
* `:baz`…シンボルリテラル

と、`?`や`:`の前後に英字を続けたものすべてがトークンになり得てしまうのです。ということで、Rubyで三項演算子を使う場合、`?`の前後、`:`の前後のスペースは必須と考えておいたほうがいいです（カッコが続く場合などはなくても通りますが）。
小数点以下X桁を指定して四捨五入

自分用メモ。
Math.round()は整数になってしまうので、専用の関数が必要。
調べたらすぐ出てきますが、これはMathに組み込んでみる感じで作ってみた。
JavaScriptはオーバーロードできないので残念。

2017/05/31・2017/06/02追記
オーバーロードみたいなことが出来るようです。
standard-softwareさん、ありがとうございます。
もう既に自分の記事じゃなくなった感がハンパないですが（汗

```js
/**
 * 小数点以下の桁数
 * @param {double} 数値
 * @param {integer} 小数点以下の桁数(省略可能)
 * @return {double} 四捨五入した値
 */
  Math.round = function (round_original) {
    return function (number, pricision) {
      var _pow;
      switch (arguments.length) {
      case 1:
        return round_original(number);
      case 2:
        _pow = Math.pow(10, pricision);
        return round_original(number * _pow) / _pow;
      }
    }
  }(Math.round);
```
webrtcをトランスコードしたい

# Introduction
ブラウザ上の制約でWebRTCが使えない場合や遅延を許容できる場合でHLSを使いたい場合がある。
そのためにどのようなシステムを構築すれば良いのかを図で書いてみた。
ベースになるのはJanus WebRTC Gateway。Janus触ってる人は日本ではかなり少ない模様？
普及活動をしたい。

ついでに、不毛なビルドエラーを防ぐためにdocker imageを作成した。興味があればスターお願いします（需要見てます）。
https://github.com/atyenoria/janus-webrtc-gateway-docker

# Architecture
<img width="1024" alt="system.png" src="https://qiita-image-store.s3.amazonaws.com/0/79563/cb7aed51-6cf6-5dca-df78-cb230d9f5fb6.png">
Tips : [Bash][Blat] bash上で塩基配列からゲノム上の位置を特定する


　ゲノム位置の特定をネットを介さずに一瞬で済ませる方法について説明します。

Blat の導入
--

　まずはじめにゲノム検索に用いるBlat というプログラムを用意します。

　ダウンロードはhomebrewをインストール済みであれば、以下の命令をbashに叩いてください。
　（homebrewのインストールは[こちら](https://brew.sh/index_ja.html "Homebrew")）

```bash
brew tap homebrew/science
brew install blat
```

　blatのインストールが完了したら以下のコマンドでヘルプが見れます。

```bash
blat
```

　この中のusageをみてください。

```bash
usage:
   blat database query [-ooc=11.ooc] output.psl
```

　blat ではウェブにつながず、ローカル上のファイルをデータベースとして利用します。

```bash:blatの入力
blat データベースファイル 検索する配列が入ったファイル 結果出力先ファイル
```

hg19.fa の取得
--

　では次にデータベースを用意しましょう。

　今回はヒトゲノムのリファレンスとして一般的なhg19 をデータベースとして使います。
　以下のアドレスをウェブブラウザでアクセスしてください。

```
hgdownload.cse.ucsc.edu/goldenPath/hg19/bigZips/chromFa.tar.gz
```

　唐突に905MBのファイルがインストールされます。しばらく待ちましょう。

　ダウンロードできたら、作業をしたいディレクトリへファイルを移動します。

　以下のコマンドでファイルを展開して、hg19.faを作成します。

```bash
tar -zxvf chromFa.tar.gz;
cat chr*.fa > ./hg19.fa;
```

　6GBくらい食われるので注意してください。

　hg19.fa ができたら残りは捨てて構いません。

　これでデータベースファイルが取得できました。

fastaファイルにはいった配列のゲノム上の位置を配列を検索する
--

　今回検索する配列はこちらです。

```txt:test.fa
>1
CAGCCAACAGTGGATATTCC
>2
AGAACTACGTGGAAGTGACC
>3
GAGCTGCGCGCGGGGCCACA
```

 ではhg19.fa があるディレクトリ上で検索しましょう。

```bash:test.faにある配列の検索
blat hg19.fa test.fa -minMatch=0 -minScore=20 output.psl
```

　-minScore=20 は検索配列が20塩基ということに由来します。

　これに関しては各自書き換えてください。

　しばらく待つと以下の表示がでます。

```bash:標準出力
Searched 60 bases in 3 sequences
```

　テキストエディタでoutput.pslは以下のようになっているはずです。

```txt:output.psl
psLayout version 3

match	mis- 	rep. 	N's	Q gap	Q gap	T gap	T gap	strand	Q        	Q   	Q    	Q  	T        	T   	T    	T  	block	blockSizes 	qStarts	 tStarts
     	match	match	   	count	bases	count	bases	      	name     	size	start	end	name     	size	start	end	count
---------------------------------------------------------------------------------------------------------------------------------------------------------------
20	0	0	0	0	0	0	0	-	1	20	0	20	chr16	90354753	90128334	90128354	1	20,	0,	90128334,
20	0	0	0	0	0	0	0	+	2	20	0	20	chr1	249250621	155182200	155182220	1	20,	0,	155182200,
20	0	0	0	0	0	0	0	-	3	20	0	20	chr17	81195210	1552707	1552727	1	20,	0,	1552707,
```

　見辛いので拡張子を.tsvに変えてエクセルで開きます。![スクリーンショット 2017-05-30 19.54.21.png](https://qiita-image-store.s3.amazonaws.com/0/147329/98aeaa09-01a1-1dcc-8681-fbe243735d8e.png)

　T欄の
　nameが染色体番号
　start,endはゲノム上の位置となります。

　これで位置が定まりました。

　念のためtest.faの番号１の配列（CAGCCAACAGTGGATATTCC）をUCSCの[genome browser](https://genome.ucsc.edu/cgi-bin/hgTracks?db=hg19&lastVirtModeType=default&lastVirtModeExtraState=&virtModeType=default&virtMode=0&nonVirtPosition=&position=chr16%3A90128334-90128354&hgsid=593874675_l9338dx2aSAe9SKSqamyd2na0HAH "UCSC Genome Browser")でも確認してみましょう。


![スクリーンショット 2017-05-30 20.01.41.png](https://qiita-image-store.s3.amazonaws.com/0/147329/9b3a0e3a-7f91-d86e-bdbf-332e4a295a1b.png)

　strandがマイナス（-）なので逆相補鎖が表示されていますが、間違いありませんね。

　この方法で1000個程度の配列も一気に検索できます。

　驚くべきことにその所要時間は先ほどの場合と大差ありません。

　これならblast の前で腕を組む生活にはさよならできそうです。


　また、補足として

```bash:test.faにある配列の検索２
blat hg19.fa test.fa -minMatch=0 -minScore=20 -noHead output.psl
```

　とすればヘッダーがない状態で保存されます。

　Rに直接データフレームとして読み込むときはこの形式がおすすめです。


　以上です。ありがとうございました。
意味のあるコメントとは

しばらく体調を崩していたので久々の投稿。
一応Javaのタグ付けたけど、正直Javaと関係なくて、むしろ一般的な話。

```java
// 「FALSE」を返却する
return false;
```

ここまで来ると、もはや怒りを通り越して笑うしかない。これ見てなんとも思わない人はプログラマー辞めた方がいい。ご丁寧にカギカッコまで付けやがって。
実際、こういうコメントが大好きで「意味のないことに意味がある」とか言っちゃうクソみたいな自称上級SEが横行しているのも事実だけどさ。
あと、学生にも多い気がする。レポート課題の模範解答がこんなだったり。

というわけで模範解答。

```java
// 管理者、社員、代理店のいずれにも該当しない場合
return false;
```

```java
// 画面遷移させない
return false;
```

と、ここまで書いてから以下の素晴らしい記事を発見。こっちの方が参考になります（ぁ

- [コードを読む人の助けになるコメントを書くために](http://qiita.com/mishimay/items/3dc2d832b76dee85410d)
HTTPClient でRuby on railsサーバ宛に画像を含むマルチパートでPOSTする

一日中、はまっていた。

画像と幾つかの変数を含む内容をRuby on rails 宛に、C#からHttpClientを使ってPOSTしたのだけど、うまくいかない。
素直にライブラリの使い方どおりやってもうまくいかない。
rails側で、変数名に改行が入る？という謎い事態になった。

# 回避法

`content.Headers.Add("Content-Disposition", $"form-data; name=\"{item.Key}\"");`
というように、ここでnameを指定し、MultipartFormDataContentにAddする時、名前をつけない。
根本的な解決法という感じはしないけど。

# ソースコード全体

```csharp
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace Test
{
    public class ImagePostData
    {
        public string id { get; set; }
        public string kind { get; set; }
        public byte[] image { get; set; }

　　　　//本来は変数はたくさんあったので、メタプログラミング用
        IEnumerable<KeyValuePair<string, string>> GetProperties()
        {
            foreach (var item in this.GetType().GetProperties())
            {
                if (item.PropertyType != typeof(byte[]))
                {
                    yield return new KeyValuePair<string, string>(item.Name, item.GetValue(this).ToString());
                }
            }
        }

        public MultipartFormDataContent CreateMultipartFormDataContent()
        {
            var dataContent = new System.Net.Http.MultipartFormDataContent();
            var byteContent = new ByteArrayContent(image);
            //Content-Dispositionの指定と、nameを文字列で渡す。
            byteContent.Headers.Add("Content-Disposition", $"form-data; name=\"image\" ; filename = \"{this.id}_{this.kind}.jpg\"");
            byteContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
            //nameをつけずに渡す。
            dataContent.Add(byteContent);

            foreach (var item in GetProperties())
            {
                var content = new StringContent(item.Value);
                //nameをヘッダーにかく
                content.Headers.Add("Content-Disposition", $"form-data; name=\"{item.Key}\"");
                //nameをつけずに渡す。
                dataContent.Add(content);
            }
            return dataContent;
        }
    }

    [TestClass]
    public class UnitTest2
    {
        string postUrl = "https://****.****.com/****/upload";

        /// <summary>
        /// 使い方
        /// </summary>
        /// <returns></returns>
        [TestMethod]        
        public async Task TestMethod1()
        {
            System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();

            var imageFile = @"0.jpeg";
            var post = new ImagePostData()
            {
                image = System.IO.File.ReadAllBytes(imageFile),             
                id = "1",
                kind = "default",
            };

            var c = post.CreateMultipartFormDataContent();
            var result = await client.PostAsync(postUrl, c);
        }
    }
}

```
arulesSequences ライブラリで汎用的data.frameを処理する

arulesSequences を使いこなすには、前処理で適切なデータフレームへの変換が必要です。
容易に使えるように以下のようなラッパーをかませて使いたいところです。

# 文字列はfactor, 数値はdiscretizeでfactorに変換

シーケンスはすべてfactorでないとなりません。

```R
df$str <- factor(df$str)
df$num <- discretize(df$num)
```


# eventIDは昇順のIDとして付与

通常eventIDになりそうなIDがついているデータはそうは無いので、row_number()を使ってシーケンシャルなIDをつけましょう。

例として seqIDでシーケンスのIDが定められたすでに時刻などでソートされたデータについて、eventIDとsequenceIDを付与する方法を示します。

```R
    df <- df %>% group_by(seqID) %>%
            mutate(eventID = row_number()) %>%
            arrange(eventID) %>%
        　　{ mutate(ungroup(.), sequenceID = group_indices(.)) }%>%
          　arrange(sequenceID)
```

全部数値にするのはかなり面倒で間違いやすいですが、このライブラリが許容しないので致し方ないです。
value 列も必要になるので、あとで追加しておきます。

# ファイルで行って来い（汗）
Rのライブラリに多いのですが、カスタムデータセット形式のbuilderが、入力としてファイルしか取れないです。
正直、うんざりですが、これも仕方ないですねorz

```R
    write.table(df, "./temp.csv", sep = ",", row = F, col = F)
    os <- read_baskets("./temp.csv", sep = ",", info = c("sequenceID", "eventID"))
```

こんなuglyなコードはhelperとして関数化しておきたいところです。。。
GoogleAppsScript(GAS)からSlackに画像を投稿する

# はじめに

GoogleAppsScriptからSlackに画像を投稿する方法を調べたところ、良さそうなサンプルなどを見つけることができなかったので、いろいろ調べて作りました。
やりたかったことは、画像のURLを指定し、その画像をSlackに画像ファイルとして投稿することです。
URLを送るだけでは画像は表示されなかったので、ファイルとして投稿する必要があるようです。

# コード

```js:postImage.gs
var SLACK_TOKEN='hogehoge';

var image=UrlFetchApp.fetch('http://example.com/image.png').getBlob();
var data={
  token:SLACK_TOKEN,
  file:image,
  channels:'random',
  title:'image'
};
var option={
  'method':'POST',
  'payload':data
};
  
UrlFetchApp.fetch('https://slack.com/api/files.upload',option);
```

SLACK_TOKEN、画像のURLは適宜置き換えてください。

# 解説
```js
var image=UrlFetchApp.fetch('http://example.com/image.png').getBlob();
```
この部分で、URLの画像を取得し、Blobオブジェクトを生成しています。
その下の行では、各プロパティーを設定しています。
ほかに設定可能なプロパティーは以下のページに記載してあります。
[files.upload method | Slack](https://api.slack.com/methods/files.upload)
そして、以下の行でSlackに画像を投稿しています。

```js
UrlFetchApp.fetch('https://slack.com/api/files.upload',option);
```

# まとめ
Node.jsで動くサンプルなどはあったのですが、GASでURLを指定して画像を投稿するサンプルは見つけられませんでした。(調査不足だったらごめんなさい)
用途としてはサーバー監視サービスMackerelのグラフを定期的に投稿するbotなどが考えられます。
GASは他サービスやAPIとの連携が簡単にできて本当に便利ですね!!
レコードが存在しない時に追加


```:sql
INSERT INTO テーブル名 (`col_1`, `col_2`, `col_3`) 
SELECT  1, 2, 3 

FROM テーブル名 WHERE 
NOT (SELECT EXISTS(SELECT * FROM テーブル名 WHERE 条件)) 
LIMIT 1;
```

まだ、100%原理を理解しきれない

LIMIT1にしないと、テーブルの総レコード数、レコードを追加してしまう。SELECT INSERTを使う苦肉の策？ 決まりごと的に覚えておけばいいのかな？　

簡素に書くと、存在するかしないか(SELECT EXIST)は、true/falseを返してるだけ

```:sql
INSERT INTO テーブル名 (`col_1`, `col_2`, `col_3`) 
SELECT  1, 2, 3 
FROM テーブル名 WHERE true( or false ) 
LIMIT 1;
```
PHPerがrailsで本格的にwebサービスを作ったよ！

サービスを作ってローンチしたよ！ということで、
使っていたものを軽く紹介しようと思い、
投稿させていただきました！

もともとPHPをやっていまして、今回rails使いましたので、
PHP使っていて、rails興味ある人、
これからwebサービス作る人の少しでも参考になればと思います。

## 作ったもの
[Teamlancer](https://teamlancer.jp) というIT系サービス作りました。
クラウドソーシングに似ていますが、
プロジェクトチームに参加という切り口で、
やりがいを重視してお仕事を受けることができます。

クラウドソーシングの問題点にフォーカスしてるため、
**フリーランサーなどの受注側はシステム手数料とか仲介料とか全くなく、無料で**利用することができます。

現状は大きく特徴的な機能はまだありませんが、頑張ってます。
フリーランサーの環境が良くなるといいなあと本気で思ってます。

## なぜrailsを使ったか
もともとPHPerな私ですが、単純な理由としてモチベーションもありますが、
やはり**開発速度が速いから**が重要だと思ってます。
特に少人数のチームでは制作にかけれる工数も少ないので、
如何にプロダクトを早くリリースするか、工数をかけないかが重要になってきます。
そこで今回は優秀なgemやintegrationが揃っているrailsにしました。
言語的に記述量が少ないのもそうですが、コミュニティが活性化しているのが開発速度にとても貢献してくれたなと思ってます。

## railsを使用してみて
もともとweb開発をやっていたので、そこまで抵抗ありませんでした。
基本的にMVCの考え方も同じ。
また、[Laravel](https://laravel.com/)を愛用しており、コンポーネント志向のお陰で、
スムーズにrubyのオブジェクト志向に移行できたかなと思います。
少し時間がかかったのは、rubyの型宣言(タイプヒンティング)がないこと。
ダックタイピングはやはりPHPerからすると非常に不安でしたが、
開発速度が上がること、テストを習慣づけすれば、
特に大きな不安でもなくなりました。

でもタイプヒンティング的な機能はほしいので、ruby3に期待してます！

## 使用したgem

使用感が良かったものだけ羅列していきます。

### carrierwave
画像アップロード用gem。
S3を利用しているのですが、tempファイルもS3にアップロードできるのが
意外と便利でした。
フォームエラー時に画像消えちゃうので。

### enumerize
enum使うときにrailsのenumよりも柔軟性があります。
とても便利です。

### draper
viewレイヤーのメソッドをまとめるときに、
モデルに書きたくなかったので、使ってます。
こちらはLaravelのviewcomposerを意識して採用しました。

### pundit
権限周りはこちらで管理。
テストしやすく、シンプルなので使ってます。

### sidekiq-cron
こちらは簡単に導入できるのと、運用工数を挙げたくなかったので、
キューと同じくredisにクーロンを一元化してます。

### redis-object
こちらちょっと特殊な使い方をしております。
モデルに紐づく場合はそのまま使えばいいんだけど、
モデルに紐付かない処理は独自でclassを作って
Redisクラスの乱用を防いでます。


## 利用している外部ツール
初期プロダクトはお金あまりかけれないよね、ということで
無料のものを中心に紹介していきます。

### bitbucket-pipeline
最近複数コンテナが立ち上げられるようになって、
railsのDBを利用したテストも簡単に実行することができるようになりました！
現状こちらでCIを回すようにしています。

### sentry
あらゆるエラーを監視、通知してくれる優秀なツール。
slackに飛ばすようにして、すぐ感知してます。

### docker
開発に利用してます。
docker-composeでredisやらDBやらwebやら立ち上げて、環境を汚さずにワンタッチで開発環境構築できます。
DBとかだけコンテナ化して、webサーバーはローカルで、、
なんてコトもできるようにしてあります。

あと、[maildev](https://hub.docker.com/r/djfarrelly/maildev/)というコンテナが便利で、letter-openerとかgem入れる必要なくなるので、おすすめ！！！

## フォームオブジェクト
railsで一番悩んだのがここかも。form周りがきれいに書けない。
reformというgemもあるんですが、私は結局ActiveModelをincludeし、独自実装する形で落ち着きました。
バリデーションはformオブジェクトに全て委譲するやり方です。
ここは需要と時間があれば、また詳しく書きたいと思います。



ザーッとgemやツールなどを紹介しました。
思い当たること、今後使ってみて便利だったものがあれば
都度更新していきます(^o^)
Divタグの中で右下に文字を表示させたい

# 作りたいイメージ
![pict.PNG](https://qiita-image-store.s3.amazonaws.com/0/101848/c68d9ad4-1b57-9784-5d7f-4984562431e2.png)

# 実装方法
親と子のDivを作って、親にはposition:relative; 子にはposition: absolute;を指定すれば良かった

```html:main.html
<div id="parent_flame">
  <ul>
    <li>項目１</li>
    <li>項目２</li>
    <li>項目３</li>
  </ul>
  <div id="child_flame">
   [+]
  </div>
</div>
```

```css:target.css
#parent_flame {
  height:100%;
  position:relative;
  border:1px solid #ccc;
}

#child_flame {
    position: absolute;
    bottom: 0px; /** 場合によっては微調整 **/
    right: 0px;  /** 場合によっては微調整 **/
}
```
[WPF] ウィンドウ位置の保存、復元

# 開発環境
- Visual Studio 2017
- WPF 4.5.1

# 概要
1. Settings.settingsを利用してパラメータを保持する。
1. イベントを利用して、適宜処理を行う。
![2017-05-30_18h36_59.png](https://qiita-image-store.s3.amazonaws.com/0/144504/e76fc4f8-5d24-e2ac-89b9-fdd70fddb3d5.png)

# サンプルコード(該当コードのみ)
```csharp
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
	/// <summary>
	/// OnSourceInitialized
	/// </summary>
	/// <param name="e">EventArgs</param>
	protected override void OnSourceInitialized(EventArgs e)
	{
		base.OnSourceInitialized(e);

		LoadWindowPlacement();
	}

	/// <summary>
	/// OnClosing
	/// </summary>
	/// <param name="e">CancelEventArgs</param>
	protected override void OnClosing(CancelEventArgs e)
	{
		base.OnClosing(e);

		if (!e.Cancel)
		{
			SaveWindowPlacement();
		}
	}

	/// <summary>
	/// Window位置の復元
	/// </summary>
	void LoadWindowPlacement()
	{
		Properties.Settings.Default.Reload();

		var bounds = Properties.Settings.Default.Bounds;
		Left = bounds.Left;
		Top = bounds.Top;
		Width = bounds.Width;
		Height = bounds.Height;

		WindowState = Properties.Settings.Default.WindowState;
	}

	/// <summary>
	/// Window位置の保存
	/// </summary>
	void SaveWindowPlacement()
	{
		Properties.Settings.Default.WindowState = WindowState == WindowState.Minimized ? WindowState.Normal : WindowState; // 最小化は保存しない
		Properties.Settings.Default.Bounds = RestoreBounds;

		Properties.Settings.Default.Save();
	}
}
```
What is server?

# What is Server? (for beginners)

## What is Virtual Environment? 

Before going into the explanation of sever, we need to understand what virtual environment is. 

**Virtual environment is a way to make several environment inside your computer. By doing that, we can create several projects by using several environment.**

It might sounds difficult so I will try to explain by using an example. 

For example, you will create project A and project B.
However, your project A requires python 2.7 version, while your project B requires python 3.5 version. 
But if you adapt your computer in project A, your project B doesn't work. 
Nevertheless, virtual environment can solve this dilemma by creating 2 environment which are the environment that can use python 2.7 and the environment that can use python 3.5.

## So what is the server now? 

Server has software and sometimes database inside, so it is kind of like your computer. However, you know that your computer cannnot work when you shut down your computer, but when you rent a server, the program can still work regardless of your computer's situation. Therefore, it is a good way to store your data of your homepage, for example, and that will make everyone accessible anytime they want. 

## 4 types of server

1. Public Server (シェアハウス)
2. Private Server (一軒家)
3. VPS (Virtual Private Server) (マンションの一室)
4. Public cloud  (仮想上の家)  

I stated the metaphor of those server types above, because I thought the metaphor used by [this home page](http://knowledge.sakura.ad.jp/beginner/2691/) is so comprehensive. 
1 and 2 actually exists physically, but 3 and 4 are using virtual environment. 
Thus, 1 cannnot change the environment, but the others can change and adapt the environment to your projects. 
3 and 4 is kind of similar but 3 already has a limit but 4 doesn't have any limitation. You can use the amount you want, by using the metaphor, you can enlarge the house as much as you want, but you have to pay as much as you have enlarged. 

## Summary 

Therefore, I think for most of people here just need to use VPS, and if you want to make your project bigger, then I suggest you to borrow either Private server or Public cloud.
【Raspberry Pi】3.5インチLCD起動画面を切り替える

raspi用の3.5インチLCDを買ったのですが、色々なqiita記事を見てもどうにもうまくいかない:frowning2:

どうやら製造メーカーによってドライバが違うらしい・・・ふむ
Elecrow製の3.5インチLCDドライバのqiita記事がないので書いておきます。

ちなみに他社のLCDの環境設定については、以下を参照ください。（Elecrow製も出来るのかな？無理だったけど）
[Raspberry Pi 3 でRaspberryPI用タッチ液晶(LCD)を使う](http://qiita.com/loopsketch/items/4c7169b9c4373e6da4d0)
[Raspberry Pi 2 Model B で安いRaspberry用タッチ液晶(LCD)を使う](http://qiita.com/satorukun/items/54dcd6d4d6b33fb253ad)
[cdario/waveshare-3.5-Spotpear-for-Rpi](https://github.com/cdario/waveshare-3.5-Spotpear-for-Rpi)

#Elecrow製の3.5インチLCD
基本的には以下のサイトに書いてあるのを実行するだけで出来ます！
[3.5 Inch 480x320 TFT Display with Touch Screen for Raspberry Pi](https://www.elecrow.com/wiki/index.php?title=3.5_Inch_480x320_TFT_Display_with_Touch_Screen_for_Raspberry_Pi)

```
# 買ったらすぐやろう
sudo apt-get update
sudo apt-get upgrade

# ドライバをクローン
git clone https://github.com/Elecrow-keen/Elecrow-LCD35.git

# ドライバをインストール
cd Elecrow-LCD35
sudo ./Elecrow-LCD35

# 再起動をしようとするので yes
```

再起動するだけで、切り替わります。
（これに気づくまで死ぬほど時間かかった・・・:pensive:）
Socket.ioをAngularJS1.xの$qでPromisifyした

サービスの定義

```js:socket.js
app.factory('Socket', function($rootScope, $q) {
  const makeAsyncCb = (cb)=> (data)=> {
    const deferred = $q.defer();
    cb(data, (data, cb)=> deferred.resolve([data, makeAsyncCb(cb)]));
    return deferred.promise;
  };

  return class Socket {
    constructor() {
      this.socket = io();
    }
    on(name, fn) {
      this.socket.on(name, fn && ((...args)=> {
        $rootScope.$apply(()=> fn(...args));
      }));
    }
    onAsync(name, fn) {
      this.socket.on(name, (data, cb)=> {
        fn($q.resolve([data, makeAsyncCb(cb)]));
      });
    }
    emit(name, arg, fn) {
      this.socket.emit(name, arg, fn && ((...args)=> {
        $rootScope.$apply(()=> fn(...args));
      }));
    }
    emitAsync(name, arg) {
      const deferred = $q.defer();
      this.socket.emit(name, arg, (data, cb)=> {
        deferred.resolve([data, makeAsyncCb(cb)]);
      });
      return deferred.promise;
    }
  };
});
```

使う時

```js:my-controller.js
app.controller('myController', function(Socket) {
  const socket = new Socket();

  socket.onAsync('greeting-from-server', promise => {
    promise.then(([data, cbAsync])=> {
      console.log(data);
      return cbAsync('Nice to meet you, too.');
    }).then(([data, cbAsync])=> {
      console.log(data);
    });
  });

  socket.emitAsync('greeting-from-client', 'Hello!').then(([data, cbAsync])=> {
    console.log(data);
    return cbAsync('Have a nice day.');
  }).then(([data, cbAsync])=> {
    console.log(data);
  });
});
```
python3で振幅復調

#概要
python3で振幅復調してみた。
復調アルゴリズムは、hilbert

#写真
上　sin信号
中　AM信号
下　復調
![am4.png](https://qiita-image-store.s3.amazonaws.com/0/18104/1851eea0-ac7f-0dd0-ae9a-9a7d8d5bd239.png)


#サンプルコード

```
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert

sample_rate = 48000.
nsamples = 320
F_1KHz = 1000.
A_1KHz = 1.0
F_15KHz = 15000.
A_15KHz = 0.5
F_14KHz = 14800.
t = np.arange(nsamples) / sample_rate
vin = A_1KHz * np.sin(2 * np.pi * F_1KHz * t) 
vam = (A_1KHz * np.sin(2 * np.pi * F_1KHz * t) + 1.0) * A_15KHz * np.sin(2 * np.pi * F_15KHz * t)
hil = hilbert(vam)
o = np.abs(hil)
fig = plt.figure(1)
ax = fig.add_subplot(311)
ax.plot(vin[1: 300])
ax = fig.add_subplot(312)
ax.plot(vam[1: 300])
ax = fig.add_subplot(313)
ax.plot(o[1: 300])
fig.set_tight_layout(True)
plt.savefig("am4.png")
plt.show()


```
PHOTOSHOPでアンカーポイントの座標を取得する

<img width="464" alt="スクリーンショット 2017-05-30 18.24.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/100188/f11af49c-d798-2e1d-ab93-50809c7a9ba1.png">

# やりたかったこと
imgタグで日本地図を置き、usemapを使って地方をリンク化したいってことが結構あります。
このときに、photoshopでパスでポチポチやって地方を囲み、アンカーポイントを吐いてほしい。アラートでいい。
これを実現するjsxを作成しました。

# コード
```js
LF = String.fromCharCode(10);
docW = activeDocument.width.value;
docH = activeDocument.height.value;
pObj = activeDocument.pathItems; // 全パス配列
result = '';
for (var i=0; i<pObj.length; i++) {
	result += pObj[i].name + ':';
	var pp = pObj[i].subPathItems[0].pathPoints;
	for (var j=0; j<pp.length; j++) {
		var x = pp[j].anchor[0];
		var y = pp[j].anchor[1];
		x += '';
		y += '';
		var pointFloatX = x.indexOf('.');
		var pointFloatY = y.indexOf('.');
		if (pointFloatX !== -1) x = x.slice(0, pointFloatX);
		if (pointFloatY !== -1) y = y.slice(0, pointFloatY);
		result += x + ',' + y;
		if (j !== pp.length-1) result += ',';
	}
	if (i !== pp.length-1) result += '\n';
}
alert(result);
```

# Photoshop CC での実行方法
1. 上記コードを保存したjsxファイルをPhotoshopのScriptsフォルダに配置（参考：[PHOTOSHOP JSX開発メモ - Qiita](http://qiita.com/bgn_nakazato/items/0a941497600fdb1d6208)）
2. Photoshopを再起動
3. 日本地図などの画像を開き、リンク化したいエリアをパスで囲む
4. ファイル > スクリプト > {保存したファイル名} を実行

アラートで表示される座標をコピーし、areaタグのcoords属性の値に設定します。

# あとがき
この手のスクリプトは探すと結構あるのですが、本当にシンプルに打ったパスの座標を表示するだけのものが見つからなかったので、作ってみました。