OmniAICreator/Qiita-1.07M huggingface dataset:
varnish + nginxでPROXY PROTOCOL

webサーバ（バックエンド）をロードバランサ下に複数置いて負荷分散をするのは極めて一般的なことですが、
そのときの問題として、バックエンドからはアクセスがロードバランサーから来たものとして扱われてしまいます。

バックエンド側のアクセス元IPが変わってしまうので、アクセスログに元IPが載らなくなってしまいます。
また、アプリケーション側でIP制限をかけたい場合も、標準的な方法（PHPだと`$_SERVER['REMOTE_ADDR']`）で取得できるIPアドレスが変わってしまうのも困りものです。

この問題を解決するために、ロードバランサーからバックエンドへ元IPを伝えるための[PROXY protocol](http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt)というプロトコルがあります。

今回はvarnish（ロードバランサ）とnginx（バックエンド）の組み合わせで、PROXY protocolを有効にして、バックエンド側に元IPを伝えてみます。

# 構成
- varnish 5（4は未対応）
- nginx 1.10

今回はvarnishのバージョンの関係上、Ubuntu 17.04（開発版）で検証しました。

varnishとnginxは同一マシンに同居させ、外部からvarnishが80番ポートで受け付けたアクセスを、8080番で待ち受けてるnginxにforwardします。

```
クライアント → | varnish(80) - (with PROXY Protocol) → nginx(8080) |
```

## varnish

```
vcl 4.0;

backend default {
  .host = "127.0.0.1";
  .port = "8080";
  .proxy_header = 1;
}

sub vcl_recv {
  return (pass);
}

sub vcl_backend_response {
}

sub vcl_deliver {
}
```
backend に `.proxy_header = 1` を追加することで、PROXY protocolを有効になります。
PROXY Protocolはv1とv2の2つのバージョンがありますが、nginxはv1のみの対応のため、v1(1)を指定します。

## nginx

```
server {
  listen 8080 proxy_protocol;
  server_name _;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  root /var/www/html;
  index index.html index.htm index.nginx-debian.html;

  set_real_ip_from 127.0.0.1;
  real_ip_header proxy_protocol;

  location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
  }

  location ~ [^/]\.php(/|$) {
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  }
}
```
ポイントは以下の3点。

- `listen` に `proxy_protocol`を指定。
- `set_real_ip_from` に ロードバランサーのIPを指定。（今回は`127.0.0.1`）
- `real_ip_header proxy_protocol`を指定。

# で、どうなるの？
ロードバランサーがバックエンドにHTTPリクエストをforwardするときに、通常のHTTPリクエストヘッダの前に1行を挿入します。

```
PROXY TCP4 192.168.33.1 192.168.33.177 55407 80
```

左からTCPバージョン、送信元IP、ロードバランサのIP、送信元ポート、ロードバランサのポートなります。
この送信元IPがアクセス元のIPになります。nginxはこの情報を受け取ってアクセス元IPを書き換えます。

`$_SERVER['REMOTE_ADDDR']`も自動的に書き換わってくれるので、アプリケーションからはダイレクトにアクセスされた場合と同じように処理ができるようになります。

## 注意！
非常に便利なPROXY PROTOCOLですが、このPROXY行を無条件に受け付けてしまうと、アクセス元IPの改ざんを許してしまうことになります。`set_real_ip_from`でロードバランサーからだけのPROXY行を受け付けることが重要です。

## 追記
今回はロードバランサーにvarnishを使いましたが、AWS ELBもPROXY Protocolを有効にできます。設定方法はAWSのドキュメントを参照してください。

http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/enable-proxy-protocol.html
シェルで使える色一覧を確認するスクリプト

シェルで使用できる色の一覧を表示するスクリプト。LS_COLORとかの参考用。

```shell-session:colors.sh
#!/bin/bash

# reference: man console_codes

for i in `seq 30 38` `seq 40 47` ; do
    for j in 0 1 2 4 5 7 ; do
        printf "\033[${j};${i}m"
        printf "${j};${i}"
        printf "\033[0;39;49m"  # set default
        printf " "
    done
    printf "\n"
done
```

実行結果

![color_codes.png](https://qiita-image-store.s3.amazonaws.com/0/156722/1eb5472f-8487-7bbb-34f8-4800eb4cf354.png)


`ESC`, `[`, パラメータ, `m`の順番で標準出力に制御コードを出力すれば色を変更できる。パラメータを複数指定する場合は`;`で区切る。デフォルトの色に戻す場合はパラメータを`0;39;49`とすればよい。
※`ESC`を出力する場合は`printf`コマンドでエスケープシーケンスを使い`\033`を表示する。

制御コードの詳細は`man console_codes`で確認できる。
stsにprojectをcheck outするまでの手順

#stsでworkspaceを変えて、新しいスペースへプロジェクトをチェックアウトして開発する

・workspaceフォルダをローカルに新規作成
・ファイル→switch workspaceから選択
・右上のopen perspectiveからSVN Repository Exploringを選択
・URLにリポジトリのアドレスを入力
・check outしたいプロジェクトを右クリックしてcheck out
はじめてのExpress　2017年版

#Expressとは
Node.jsで動作するWebアプリのフレームワークの一つ。
2017年1月現在、Nodeのフレームワークではこれが主流で使われている。

#テンプレートエンジン
Expressでは様々な種類のテンプレートエンジンを使用できる。
有名なものを簡単に紹介する。
###Pug(jade)
Hamlの影響を受けたJavascript製のテンプレートエンジン。特徴としてはタグで囲まずに記述できる。
※商標名登録の関係で、2017年からjadeがPugという名前に移行しました。
[ygkn](http://qiita.com/ygkn)さんご指摘ありがとうございます！

###ejs
htmlライクに書ける。

なお、expressをインストールする際に、テンプレートエンジンを指定する方法は次の書き方。
ここではejsを使用した例

```bash:terminal
express -e ejs hoge //hoge.ejsを作成
```

#Hello world
それでは実際にExpressをいれて「Hello world」を行いましょう。
ターミナルで下記のコマンドを実行します。

```bash:terminal
npm install express
```
すると、npm_moduleというフォルダが生成されているはずです。
ターミナルで実行したフォルダと同じ階層で適当な名前のjsファイルを作成し、以下のコードを打ち込みます。ぼくは名前をapp.jsとしました。

```js:app.js
const express = require('express'); //expressモジュールのインストール
const app = express();
 
app.get('/', (req, res) => {
  res.send('Hello Express!'); //記述内容
});
 
app.listen(3000); //3000ポートでサーバーが立てられる。
```
ここまで記述したら、あとはターミナルで上に作成したjsファイルを実行します。

```bash:terminal
node app.js
```
ここでエラーが出なければ、ブラウザで``localhost:3000``を開いてみてください。
上で作成したjsファイルのsend()の中身のメッセージが実行されているはずです。


#express-generator
　なにやらexpress-generatorというライブラリをインストールすると自動でアプリの雛形を作ってくれる優秀なライブラリがあるとのこと。
　途中ハマりましたが、なんとか脱出。要はグローバルインストールしたら解決した。これだけいれればexpressコマンドが使えるので、express個別でのインストールはいらない？
　まず、npmが入ってる状態で、次のコマンドを実行

```bash:terminal
npm install -g express-generator
```
すると次のような結果がでるはず。

```bash:terminal
/Users/.nodebrew/node/v7.2.1/lib
└─┬ express-generator@4.14.0 
  ├─┬ commander@2.9.0 
  │ └── graceful-readlink@1.0.1 
  ├─┬ mkdirp@0.5.1 
  │ └── minimist@0.0.8 
  └── sorted-object@2.0.0
```

　これでexpressコマンドが使えるようになりました。
アプリケーションの作成は``express ApplicationName``ですが、デフォルトだとviewの中のファイルが**jade**で作成されています。
今回は**ejs**を使用したいので、ここでは ``express -e ApplicationName`` とすると、あら不思議、ejsファイルが出来上がっています。
　その他のコマンドを見るには``express --help``をしましょう。

```bash:terminal
$ express --help

  Usage: express [options] [dir]

  Options:

    -h, --help           output usage information
        --version        output the version number
    -e, --ejs            add ejs engine support
        --pug            add pug engine support
        --hbs            add handlebars engine support
    -H, --hogan          add hogan.js engine support
    -v, --view <engine>  add view <engine> support (ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
    -c, --css <engine>   add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
        --git            add .gitignore
    -f, --force          force on non-empty directory
```

次にアプリケーションフォルダの階層に移動して``npm install``します。
　そんでやっと``DEBUG=ApplicationName:* npm start``で実行できます。お疲れ様でした！！！
中身のファイルをいじっておらず、起動している場合、ブラウザでlocalhost:3000を開くと、**Express**の文字が出てきます。


#参考ページ
- [Node.jsのMVCフレームワーク「Express」の基礎知識とインストール](http://www.atmarkit.co.jp/ait/articles/1503/04/news047.html)
価格を表す数値を、0のとき「無料」にしたり3桁ごとにカンマで区切ったりした文字列にする

こんにちは :octocat:

SwiftでiOSアプリを作っています。
Intとして持っている価格を表す変数 `price` を、

* 0なら `無料` と表示
* それ以外なら3桁ごとにカンマで区切って
* `¥` マークを先頭につけてStringとして返す

関数を作りましたが、これが複数のモデルにおいて必要になったので
今回はこれをプロトコル指向でまとめた `PriceFormattable` を紹介します

# TL; DR

### プロトコル側

```swift:PriceFormattable.swift
import Foundation

protocol PriceFormattable {

	var price: Int? { get set }

	func priceString() -> String?

}

extension PriceFormattable {

	func priceString() -> String? {
		guard let price = price else {
			return nil
		}

		guard price != 0 else {
			return "無料"
		}

		let numberFormatter = NumberFormatter()
		numberFormatter.numberStyle = NumberFormatter.Style.decimal

		guard let formattedPriceString = numberFormatter.string(from: NSNumber(value: price)) else {
			return ""
		}

		return "¥\(formattedPriceString)"
	}

}
```

### 構造体側

```swift:Item.swift
import Foundation

struct Item: PriceFormattable {
    var name: String?
    var price: Int?
}
```

# やってること

### プロトコル側

```swift:PriceFormattable.swift
protocol PriceFormattable {
	var price: Int? { get set }
	func priceString() -> String?
}
```

`PriceFormattable` を採用するクラスや構造体は、 `price` を持っていることを必須とします。
 `priceString()` 関数を生やします。

```swift:PriceFormattable.swift
extension PriceFormattable {
	func priceString() -> String? {
		guard let price = price else {
			return nil
		}
		guard price != 0 else {
			return "無料"
		}
		let numberFormatter = NumberFormatter()
		numberFormatter.numberStyle = NumberFormatter.Style.decimal
		guard let formattedPriceString = numberFormatter.string(from: NSNumber(value: price)) else {
			return ""
		}
		return "¥\(formattedPriceString)"
	}
}
```

すぐ下に Protocol Extension を書きます。中身は地味なので割愛します
これで `price` 変数を持って `PriceFormattable` を採用するだけで `priceString()` 関数が使えるようになります。

### 実装側

```swift:Item.swift
struct Item: PriceFormattable {
    ...
}
```

`PriceFormattable` プロトコルを採用します。これで

```swift:なんとかViewController.swift
var item = Item()
item.price = 100

print(item.priceString()) // => "¥ 100"
```

とかいうことができるようになります。 :tada:
crontabの設定

#crontabとは

設定した時間に設定したコマンドを実行する管理コマンドです。

>以下wikiより抜粋
>Unix系OSにおいて、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。
>一般にcrontabコマンドで編集されたスケジュール内容は、crondデーモンにより実行される。
>crondはバックグラウンドで稼動し、毎分ごとに実行すべきスケジュールがないか確認し、もし実行すべきジョブがあれば、それを実行する

#crontabのコマンド

crontabのオプションと意味

```sh:
crontab [ -u user ] { -l | -r | -e }  

-u: cronを設定するユーザーを指定
-l: cronを一覧で表示
-r: cronの設定を全消去
-e: cronを設定するエディタを起動する
```

以下コマンドでログインしているユーザーで設定ができます。

```sh:
crontab -e
```

編集時の書式は以下となります。

```sh:書式
分 時 日 月 曜日 <実行コマンド>

分 0-59 
時 0-23 
月内日 1-31 
月 1-12
曜日 0-7 (0 と 7 は日曜日)
※「*」は全てが対象となります。
```

##・基本指定
毎月1日の14時15分にhoge.shを実行する設定

```sh:crontab
15 14 1 * *     /bin/sh /home/hoge.sh
```

毎日動かす場合は下記となります。

```sh:crontab
15 14 * * *     /bin/sh /home/hoge.sh
```

##・複数指定(,)
15分、20分に動かす場合は下記となります。

```sh:crontab
15,20 14 * * *     /bin/sh /home/hoge.sh
```

##・間隔指定(/)
15分毎に動かす場合は下記となります。

```sh:crontab
*/15 * * * *     /bin/sh /home/hoge.sh
```

##・範囲指定(-)
14時から20時の15分の時に動作します。一日7回。

```sh:crontab
15 14-20 * * *     /bin/sh /home/hoge.sh
```

#設定ファイルの読み込み

crontabコマンドで直接編集する方法でも良いのですが、
オプションのe(編集)とr(削除)が隣にあり誤って削除する可能性もあり、
別ファイルで管理して読み込んだ方が良いそうです。
下記コマンドで反映できます。

```sh:crontab
crontab [ -u user ] file 
```

誤って削除した場合も、元のファイルがある為、修正が可能です。


#備考
・cronの実行コマンドは、実行ユーザーのホームディレクトリで実行されます。
　実行パスはフルパスで記載すれば、特に気にしなくて大丈夫です。
・実行権限は実行ユーザーとなります。（ファイル・フォルダ操作をする処理の場合は意識する必要がある）
・cronの標準出力、標準出力エラーは、mailコマンドを経由して実行ユーザーのメールボックスに送信されます。
　内部でエラー処理を行ってる場合は出力の必要が無いので、下記のように捨ててしまうのも。
　※ここでは「>/dev/null 2>&1」は出力を捨てるとだけ覚えて居れば

```sh:crontab
15 14 1 * *     /bin/sh /home/hoge.sh
```

以上crontabの備忘録。
sbtの起動でハマった

GitBucketを社内に導入することにした。
scalaは触ったことがなかったが、中身を見る限り多少ならいじれそうなので
改造することを決意し、
http://qiita.com/icoxfog417/items/31d88358942d8dd0eb8b
を参考に環境を構築してみた。

が、肝心のビルドが実行できない。
sbtコマンドを叩くと
`Your proxy requires authentication.`
とプロキシ認証エラーが出る。

sbtconfig.txtには

    -Dhttp.proxyHost=プロキシホスト
    -Dhttp.proxyPort=ポート
    -Dhttp.proxyUser=ユーザ
    -Dhttp.proxyPassword=パスワード
    -Dhttps.proxyHost=プロキシホスト
    -Dhttps.proxyPort=ポート

を設定済み。

sbtのStackFlowを眺めていると以下の記事が
https://stackoverflow.com/questions/31018536/getting-org-scala-sbtsbt0-13-8-not-found-error-though-i-have-the-same-versi/31706477#31706477

> By mistake my environment was pointing to jre rather than jdk.

原因はこれでした。
自分の環境ではいろんなソフトを入れてるうちにJavaが４つも入っていて
環境変数pathがJREの1.8を指していました。

良く考えたらsbtはbuildツールだから当然ＪＤＫが必要ですよね。
しかし、あのメッセージでは気づかない…。
てっきりプロキシ設定がおかしいのだと思ってずっと調べていました。。
[Python]可変長引数を用いたリスト要素の表示

Pythonでリスト要素を全て表示する方法はいくつもあるが、加工等をせず単に表示をするだけなら、可変長引数を用いる方法が最も簡単。

以下のソースコードはPython 3での実行を想定

## リスト要素を全て表示

####ソースコード例
```python
words = ["新", "米", "大統領"]
print(*words)
```
####出力結果
```
新 米 大統領

```

デフォルトだとスペース区切りで出力され、最後に改行が行われる。

## カンマ区切りで表示
printにsepを指定することで、任意の文字で区切ることができる。区切り文字が要らないのであれば空文字列を指定する。
###ソースコード例
```python
words = ["新", "米", "大統領"]
print(*words, sep=",")
```
####出力結果
```
新,米,大統領

```
## 区切らずに表示
###ソースコード例
```python
words = ["新", "米", "大統領"]
print(*words, sep="")
```
####出力結果
```
新米大統領

```
terraform / インスタンスのEBSのデフォルトサイズを変更する

デフォルトが8GBなのでうっかりしていると、
ログなどでEBSの容量がオーバーしている時がある

なので
インスタンス作る時に
ebs_block_deviseブロックで情報を渡せばいい

```go:hoge.tf
resource "aws_instance" "YOUR_INSTANCE_NAME" {
/*(略)*/
  ebs_block_device {
    device_name    = "/dev/sda1"　/* 各々の作りたいインスタンスで要確認 */
    volume_type = "gp2"　/* 各々の作りたいインスタンスで要確認 */
    volume_size = 100 /*ここで任意のギガ数かく*/
  }
/*(略)*/
}
```
詳細なパラメータは https://www.terraform.io/docs/providers/aws/r/instance.html

ただし、この記法でつくると
すでにインスタンスがある場合は
インスタンスを作り直すことになるのでオペレーションには注意

既存のを生かしてアドオンする場合は
`aws_volume_attachment`,`aws_ebs_volume`
でやる。-> https://www.terraform.io/docs/providers/aws/r/volume_attachment.html
PugのIncludeやMixinなど


## Includes

`include`を使ってファイルの読み込みが可能。
共通ヘッダーなどに使うとよい。pugファイルだけでなく、PlainTextやMarkdownも読み込める。

```
//- index.pug
doctype html
html
  include includes/head.pug
  body
    h1 My Site
    p Welcome to my super lame site.
    include includes/foot.pug
    
    
//- includes/head.pug
head
  title My Site
  script(src='/javascripts/jquery.js')
  script(src='/javascripts/app.js')
  
//- includes/foot.pug
footer#footer
  p Copyright (c) foobar        
```

詳しくは[こちら](https://pugjs.org/language/includes.html)

## Template Inheritance

`block`や`extends`を使ったテンプレートの継承が可能。
レイアウトテンプレートを`extends`を使って呼び出し、その下に`block`を定義する。
再定義しなければ初期値として用意したものがレンダリングされる(サンプルコードでいうところの`foot`)
また、`block`内での`include`も可能である。

```
//- layout.pug
html
  head
    title My Site - #{title}
    block scripts
      script(src='/jquery.js')
  body
    block content
    block foot
      #footer
        p some footer content
        
//- page-a.pug
extends layout.pug

block scripts
  script(src='/jquery.js')
  script(src='/pets.js')

block content
  h1= title
  - var pets = ['cat', 'dog']
  each petName in pets
    include pet.pug
    
//- pet.pug
p= petName
```

オーバライドなども可能なので詳しくは[こちら](https://pugjs.org/language/inheritance.html)


## Block append / prepend

テンプレートをオーバライドするだけでなく、アペンドやプリペンドも可能。


```
//- layout.pug
html
  head
    block head
      script(src='/vendor/jquery.js')
      script(src='/vendor/caustic.js')
  body
    block 
    
//- page.pug
extends layout.pug

block append head
  script(src='/vendor/three.js')
  script(src='/game.js')
```

## Mixins

Mixinも作成可能。

```
//- Declaration
mixin list
  ul
    li foo
    li bar
    li baz
//- Use
+list
+list
```

```
mixin pet(name)
  li.pet= name
ul
  +pet('cat')
  +pet('dog')
  +pet('pig')
```

## Mixin Blocks

MixinでBlockも使用可能。

```
mixin article(title)
  .article
    .article-wrapper
      h1= title
      if block
        block
      else
        p No content provided

+article('Hello world')

+article('Hello world')
  p This is my
  p Amazing article
```

もう少しサンプルを見たければ[こちら](https://pugjs.org/language/mixins.html)
「ちょっと確認」のHTTPサーバー起動にはpocke/wwwが便利

Webページなんかを作ったりしていると、何かと「ちょっと確認」したいときにHTTPサーバーを起動したいという機会は多いと思います。

アプリケーションの配布用のサイト、個人サイト、etc...
htmlファイルをそのまま開くのも悪くはないですし、特に問題なく動くことも多いですが、絶対パスでのファイル指定やXHR/FetchでのOrigin成約に阻まれること、`://`スキームで問題が起こることもしばしばあります。

そんなときは簡易的なHTTPサーバーを建てるのが一番ですが、みなさんどのように建てていますでしょうか？

## Pythonで建てる

メジャーな方法の１つに、Pythonで建てるという方法があります。
Python2系ではSimpleHTTPServerが、Python3系ではhttp.serverがあり、以下のような記述でサーバーを建てることが可能です。

```bash:terminal
$ python -m SimpleHTTPServer
$ python3 -m http.server
```

悪くはないですし、私も利用していましたが、何分融通が効きづらいこと、入力量が多いことから面倒でした。 
また、ブラウザ自体は自動で立ち上がらないので、自分で開ける必要がありました。

## PHPで建てる

次に、つい最近まで私はPHPでサーバーを建てるようになっていました。

PHPで建てる利点としては、以下の様なものがあります。

* Document rootの指定が簡潔
* ポートの指定もまた簡潔
* `0.0.0.0`指定が可能（ローカルネットワークで他の人に確認してもらいやすい)

実際に利用していたのが以下となります。

```bash:terminal
$ php -S # 通常時
$ php -S 0.0.0.0:8080 # 8080に建てたい時
$ php -S 0.0.0.0:8080 -t ./public_html # パスを指定したい時
```

Pythonよりは簡潔で楽でしたが、依然としてそれなりの記述量はあり、また、ブラウザを自動で開いてくれることはありませんでした。

## pocke/wwwを使う

最終的に、私は[pocke/www](https://github.com/pocke/www)を利用することとしました。

これは、Goで書かれたシンプルなHTTPサーバーで、以下のような特徴があります。

* wwwの3文字のコマンドで立ち上がる
* 毎回ランダムなポート上で立ち上がるため、競合が少ない
* 自動でブラウザも立ち上げてくれる

と、非常に便利な代物になっており、オプションで`0.0.0.0`指定やポート指定も可能となっており、現在メイン利用してるHTTPサーバーのプログラムとなっています。

### 導入方法

[GitHub](https://github.com/pocke/www)を参考に、コマンド一発でインストールします。なお、導入にはGoの環境が必要となります。

```bash:terminal
$ go get github.com/pocke/www
```

### 使い方

ドキュメントルートのディレクトリに入り、以下のコマンドで自動で立ち上がります。

```bash:terminal
$ www
```

## まとめ

wwwを利用すると、非常に手軽かつ便利に、HTTPサーバーを立ち上げることが可能です。
今まで大抵gemかnpmで導入されてきたCLIツールを、珍しくgo getで入れることになり、golangの需要の高まりも見られる良い機会でした。

モダン環境を整えないでRiotなどでサッと作るタイプのJavaScript開発や、マークアップでのWebページの作成など、何かと活躍の場は多く、作業効率を上げるためには非常に良いツールではないかと思います。

## おまけ

もう一つの選択肢として、シェルスクリプトのエイリアスとして解決させる方法があったりします。
私は、wwwを利用しないときは、以下のエイリアスでブラウザの自動オープンなどを行っていました。

```bash:.bashrc
alias http="open http://0.0.0.0:8080 & php -S 0.0.0.0:8080"
```
やってはいけないSQL３種

チューニングのことは全く知らない初心者でも
とりあえず以下のようなSQLは書かないようにすると
先輩から怒られることが減るよ、というお話。

本当は体系的にお勉強すべきなんだけど。


#IN句を使うな
基本的に全件探しにいっちゃうためめっちゃ遅い。
EXISTSを使うことで１０倍以上速くなることも。



#左辺に算術式使うな
WHEREの条件式は、なるべく右側に変換、算術式を使うこと
INDEXが使えなくなるのを避けられる。



#UNION、DISTINCTはなるべく避けて。
UNIONするならUNINON ALLで。ALLつけないと
DISTINCTをつけた時と同じことをしてしまう。
DISTINCT処理はけっこう重いので極力減らして下さい。
どーしても必要なこともあるけど。




先輩いわく、どれも基本的なことらしい。
でも、どれも現場でそこそこ見かける記述なので、
自分含め初心者は気をつけよう。


ちなみに自分は３つとも書きました（）


#おまけ：もうちょっとキレイに書いて！

SQLはインデントの付け方などが人によって書き方がバラつきます。

初心者のうちは先輩をマネると思うんですが
先輩もかなり書き方がバラついたりしています。

整形ツールなどを活用しましょう。
http://www-atl.blog.so-net.ne.jp/2015-02-08#more
filesystem(std::tr2::sys)を使ってディレクトリ内のファイルを別ディレクトリにコピーする

# 環境
Microsoft Visual Studio Professional 2012

# 参考
[ディレクトリ内にある全ファイル/ディレクトリを列挙する](http://qiita.com/episteme/items/0e3c2ee8a8c03780f01e)
[\<filesystem\>](https://msdn.microsoft.com/ja-jp/library/hh874694.aspx)

# filesystem
\<fstream> より多機能で使いやすい。
boost::filesystem のようなインターフェイスになっている。

```cpp
#include <filesystem>

void copyDirectory(const std::tr2::sys::path& srcDirectory,
                   const std::tr2::sys::path& destDirectory)
{
    // 対象のディレクトリが無ければ作成
    if (std::tr2::sys::exists(destDirectory) == false)
    {
        if (std::tr2::sys::create_directories(destDirectory) == false)
        {
            // 失敗
            assert(false);
            return;
        }
    }

    // コピー対象のディレクトリを確認
    for (std::tr2::sys::directory_iterator it(srcDirectory);
         it != std::tr2::sys::directory_iterator(); ++it)
    {
        std::tr2::sys::path target              = *it;
        target = srcDirectory / target;
        const std::tr2::sys::path next          = target.filename();
        const std::tr2::sys::path nextDestFile  = destDirectory / next;

        // ディレクトリ？
        if (std::tr2::sys::is_directory(target))
        {
            // 再帰呼び出し
            copyDirectory
            (
                srcDirectory / next,
                nextDestFile
            );
        }        
        // ファイル
        else
        {
            std::tr2::sys::copy_file
            (
                target,
                nextDestFile,
                std::tr2::sys::copy_option::overwrite_if_exists
            );
        }
        
    }
}

int main()
{
    try
    {
        const std::tr2::sys::path src = "src";
        const std::tr2::sys::path dest = "dest";
        copyDirectory(src, dest);
    }
    catch (...)
    {
        assert(false);
    }

    return 0;
}
```
SQLite3にJSONテキストで保存したカラムのデータを扱う for Android

@eaglesakura です。

Androidで大量のデータを扱う場合、SQLite3を使うことが多いかと思います（[Realm](https://realm.io/jp/) を始めとした別なソリューションもあるので、必ず使うわけでは無いですが）。

データを保存する場合、大体はデータごとにカラムを整理し、分けて保存します。ですが、たまに「JSONでとりあえず突っ込んどこう」みたいな気分になるときがありますね（あるよね？）。

そんな時に、実装の選択肢の一つとして使えるかと思います。

# AndroidのSQLite事情

Androidでは `SQLite3` が標準で採用されていますが、細かいバージョンには差異があり、[公式ドキュメント](https://developer.android.com/reference/android/database/sqlite/package-summary.html)にまとまっています。ですが細かい差異はあっても、基本的に使える機能は一緒です。

| Android API | SQLite Version |
| --- | --- |
| API 24 | 3.9 |
| API 21 | 3.8 |
| API 11 | 3.7 |
| API 8	| 3.6 |
| API 3	| 3.5 |
| API 1 | 3.4 |

# SQLite3でJSON型がサポートされた

最近のバージョンで、JSON型がサポートされました( https://www.sqlite.org/json1.html )。これにより、構造化されたデータの扱いや拡張が大幅に楽になるというメリットがあります（速度とか細かいことはとりあえず置いときます）。

「JSON型がサポートされた」とは言っても、JSON形式の文字列がカラムにガッツリと入っているだけで、特別な要素は特にありません。ただし、標準のSQLiteではJSON全体を1つの文字列として扱えませんが、JSONサポートによって構造化したデータとしてSELECTやWHERE等で参照できるようになりました。

例えば、次のように書くことでJSON文字列で保存された値をSELECTすることができます。
細かいところは別な解説記事( http://qiita.com/smith/items/c0bd002666a23a6fe8e4 )や公式ドキュメントを参照してください。

```sql
-- CENTRAL_JSONというカラムに入っているJSONデータから値をSELECTする
SELECT
    DATE,
    SESSION_ID,
    json_extract(CENTRAL_JSON, "$.sensor.location.latitude") as json_number,
    json_extract(CENTRAL_JSON, "$.sensor.location.longitude") as json_number
FROM
    DB_SESSION_POINT
```

# SQLite Android Bindingsを利用する

Android SDKでサポートされているSQLite3は機種ごとに固定バージョンであり、かつJSONサポートは拡張機能の扱いなので標準では利用できません。
そこで、SQLite3が公式で用意してくれている [SQLite Android Bindings](https://sqlite.org/android/doc/trunk/www/index.wiki) を利用します。

このライブラリはAndroid SDK標準のAPIとpackage名のみが違うクラス群を提供しており、かつSQLiteのバージョンを任意に変更できます。

下記にビルド済みバージョンを用意しましたので、自由に使って構いません。
ここではSQLite3のバージョンを `3.16.1` でビルドしました。

このリポジトリではデフォルトオプションでビルドしていますが、ビルドオプションを変更すればEncrypt Extension等の有用な機能を利用できます。

https://github.com/eaglesakura/android-sqliteX

```groovy
// build.gradle
repositories {
    // add maven repository
    maven { url "http://eaglesakura.github.io/maven/" }
}

dependencies {
    // add library
    compile 'com.eaglesakura:android-sqliteX:3.16.1.+'
}
```

# Android SDK組み込みのSQLite3からの移行

Java側では、利用するクラスのpackage名を次のように変更してください。
package名以外は基本的に同じインターフェースが提供されています。

ただし、自前でビルドした共有ライブラリをロードする必要がありますので、 `System.loadLibrary("sqliteX")` をコールするか、初期化時に `org.sqlite.database.SQLiteX.install(Context)` を実行してください。

|  | 標準 SQLite3 | SQLiteX |
|---|---|---|
|package名変更 | android.database.sqlite | org.sqlite.database.sqlite |
| 初期化 | - | org.sqlite.database.SQLiteX.install(context); |

データベースファイル自体には互換性があり、カラムの型も `TEXT` のままで利用できます（少なくともSELECTは可能でした）。SQLiteにはカラムの厳密な型がなく、すべてテキストで保持しているため、あまり気にしなくて良いです。

# ORマッパーとの相性

ORマッパーを利用している場合、`android.database.sqlite.SQLiteDatabase` クラスを直接参照している場合があります。その場合、組み込みのSQLiteを使うことを強制されていますので、拡張機能を使うことはできません。

[greenDao 3](https://github.com/greenrobot/greenDAO) のように、抽象化されたアクセスを提供している場合は問題なく使えるかと思います。
Centos7 のMySql(インストールとかバージョンアップの移行)でつまづいたところのメモ

Centos7 のMySqlでつまづいたところのメモ


##1.起動で失敗する 

> [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

とか

> Failed to set up SSL because of the following SSL library error:

```
rm -rf /var/lib/mysql
mysql_install_db --datadir=/var/lib/mysql --user=mysql
```

##2. SELINUX

> os_file_get_status() failed

``` restorecon -R /var/lib/mysql ```


##3. ログインできない

> ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

### mysqld_safe --skip-grant-tables & ``` が使えない

```
systemctl stop mysqld
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
systemctl start mysqld
```

> grant all privileges on client_data.* to user1@"192.168.1.%"

あれ？

skip-grant-tables のまま...
> ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

```
systemctl set-environment MYSQLD_OPTS=""
```

## 4.mysql_install_db でパスワード変わってたみたい。。。（まるごといってるもんね）

ログから採取して変更

```
cat /var/log/mysqld.log | grep 'password is generated'
mysql_secure_installation

# mysqlにログインしてからpasswprd設定
set password for root@localhost=password('password');
```


## 5.反省すべきところ

移行しようと
```mysqldump --opt --all-databases --events -u root -p > full-backup.sql```
でしてたけどDB単位に変更した。
はしょったのがダメでしたね。

```mysqldump --single-transaction -u DBroot -p sample > table-backup.sql```
[Swift] Int型などの値が範囲内に入っているかチェックする

駄文です

関数に渡されたInt型などの値が適正範囲内であるかをチェックする時、C言語的な文法に引きずられて

```c
if 0 < number && number < 5 { ... }
```
などと書いたりしてないでしょうか？
Swiftでは見た目で何をしているかがすぐわかる記法が備わっています。


~~if (1...4).contains(number) { … }~~


~~if 1...4 ~= number { … }~~

（コメントで皆さんにより簡素でわかりやすい記法を教わりました）

```swift
if case 1...4 = number { ... }
```

誰がどう見ても 1, 2, 3, 4のいずれかですね。
数値が近くに並んであるのがいいです。

不等号の向きを見間違えたり打ち間違えたり、逆を取るときに && を || に変換し忘れたりなどの問題が起こりません。

----
@lovee さんのコメントも気になって調べて書いてみました。
稚拙だと思うのでGistのリンクだけ。
https://gist.github.com/anonymous/171deb51bfb85f045b22e2b76157cae5

----

ややこしくするなら

```swift
enum Number: Int {
case one = 1
case tow = 2
case three = 3
case four = 4
}

if let _ = Number(rawValue: number) { ... }
```

ですね！*（ダメです）*
github２段階認証後にSourceTreeへsign in する方法

##### 課題
githubで２段階認証を有効にすると，SouceTreeにサインインできなくなる．はまってしまったのでメモしておきます．
##### 解決のための参考になった頁
[GitHubの２段階認証でSourceTreeを使えるようにするには](http://qiita.com/hiroshi1000/items/4eb65695e4e5d4dfe9ef)

##### エラー詳細こんな感じの問題が発生
１．sign in しろとエラーがでる．
<img width="491" alt="Screen Shot 2017-01-21 at 22.32.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/108112/79b7adae-36ab-a5be-5847-6c71a9626b50.png">

２．上記で”Sing in"とするとここに飛ぶので，ID＆パスワードをいれてみる
<img width="733" alt="Screen Shot 2017-01-21 at 22.32.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/108112/62793e50-abb6-ff06-08f8-2a59be38ba2d.png">

３．２段階認証の番号を要求されます．（予め登録している方法，今回は携帯のSMSにくるように設定していました．）SMSに届いた番号をいれます．
<img width="733" alt="Screen Shot 2017-01-21 at 22.33.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/108112/009b8e87-23b1-18b9-8481-b426a29ec2d0.png">

４．以下のようなエラー文で怒られる．
`message: Must specify two-factor authentication OTP code.`
`https://developer.github.com/v3/auth#working-with-two-factor-authentication`

<img width="492" alt="Screen Shot 2017-01-21 at 22.33.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/108112/451262b7-c6f4-75f8-d5f3-80e166a3e593.png">



解決方法は文頭で記載した頁が参考になります．
nvidia-smi(CUDA API)で確認できるGPUIDの順番の設定


# デフォルトでは順番がGPU応答順で決まる

デフォルトは、早く応答したGPUに0、次のGPUに1...と付与されていく。（単純な経験則によるものと公式ドキュメントに記述）
つまり、実行する度にIDが変わる。

GPUを利用したプログラム実行時に確認しにくいため、PCI BUSのIDに紐付けて管理するよう設定する。
環境変数`CUDA_DEVICE_ORDER`により、nvidia-smiが表示するGPUの順番を設定できる。

# PCI BUSのIDに紐付けて管理
環境変数`CUDA_DEVICE_ORDER`に値を設定する。

ログインユーザー全員に適用する場合は、`/etc/profile`に追記する。

```
echo "CUDA_​DEVICE_​ORDER=PCI_BUS_ID" >> /etc/profile
```

個人の場合は、個人のシェル設定ファイルへ追記する。
これにより、nvidia-smi(CUDA API)を使うアプリケーションからGPUを確認する際に、IDが固定される。

ちなみに、デフォルトの値は`FASTEST_FIRST`である。

# 参考
- [CUDA Toolkit Documentation](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#env-vars)
- [How to make CUDA and nvidia-smi use same GPU ID](https://codeyarns.com/2016/07/05/how-to-make-cuda-and-nvidia-smi-use-same-gpu-id/)
- [cuda-smi](https://github.com/al42and/cuda-smi)
Macのプレビュー.appで縦横比固定して切り抜きするのは不可能

2017年現在(プレビューはバージョン9.0)、不可能です。

「Mac 縦横比固定　切り抜き」とかで検索しても同じようなプレビュー.appの使い方情報ばかり出てきてなかなかイライラしたので、少しでも煩わされる人が減るように書きます。

10分ほど代わりのソフトを探しましたが、驚くことに、MacでPhotoshopのように縦横比固定でトリミングできる、ちょっとしたフリーソフトはほとんどありません。WindowsだとjTrimというフリーソフトでできるみたいです。

一番マシなのは[Pixlr](https://pixlr.com/)というAutodeskが出してる画像編集フリーソフトです。Web版とApp版があり、どちらでも縦横比固定の切り抜きが可能です。

いつかプレビュー.appでも縦横比固定して切り抜きできるようになるといいですね。
もっと手軽なやつがあったら教えてください。

# 追記
Macの写真.app(Photos.app)のトリミングメニューで縦横比固定して切り抜きできるという情報が寄せられました。
画像をライブラリに読み込ませる必要があるのがつらいですが、新しいアプリ入れるほどでも…という人はお試しください。
(@sakuro さん、ありがとうございます！)

<img width="1198" alt="スクリーンショット 2017-01-23 18.09.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/27258/59855f5c-fa51-89df-c97d-97e6d0f7e309.png">
REST Assured を使ったREST API テスト

# はじめに

REST APIの自動テストを行うためのツールを探していたところ、[クラスメソッドさんの記事](http://dev.classmethod.jp/server-side/java/rest-assured/ "[Java]rest-assuredでREST APIのテストをする")を見つけたのですが、若干バージョンが古かったので 2017/01/23 時点での最新バージョンで改めて試してみました。

# REST Assuredとは

今回使用するライブラリは[REST Assured](http://rest-assured.io/)というもので、JavaでDSL風にREST APIのテストを記述することができます。
ライブラリを追加することでJSON/XMLのテストを簡単に書くこともできます。

# 使い方

ここでは、単純なJSONを返すREST APIのテストを書くための使い方を説明していきます。

## 依存関係の追加

お約束の依存関係追加です。
`pom.xml`に以下の依存関係を追加します。

```XML
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>3.0.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>json-path</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
```

最初のものがREST Assured本体、二番目がJSONの中身をパス式で評価するための追加ライブラリ、三番目がJUnitです。
JUnitのテストコードとして記述するこもできますが、REST Assuredが提供するDSL内で自然な形でAssertionを表現するために、hamcrestのMactherを利用します。

## static import追記

テストコードを記述するにあたり、DSLとして記述するために以下の static import を宣言します。

```Java
import static io.restassured.matcher.ResponseAwareMatcher.*;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
```

## テストコード作成

実際にテストコードを書いていきます。
REST Assuredは実際に対象サーバに向けてHTTP Requestを投げるのですが、ここでは[JSONPlaceholder ](http://jsonplaceholder.typicode.com/)を利用します。

以下のようなコードを書いてみます。

```Java
        RestAssured.baseURI = "http://jsonplaceholder.typicode.com/";
        given()
                .get("/posts/2")
        .then()
                .body("userId", equalTo(1))
                .body("id", equalTo(2))
                .body("title", equalTo("qui est esse"))
        ;
```

コードをみて、なんとなく何をしているのかわかっていただけたのではないでしょうか。
`givent()`　で開始し、`get(url)`でGET Methodでアクセス、`then()`の後にその結果についての操作がかかれ、ここでは`body()`メソッドでResponseのJSONをパス式で解析してAssertionを実行しています。

上記のテストコード通りにURLを叩いた際に戻ってくるJSONは以下のようなものです

```JSON
{
  "userId": 1,
  "id": 2,
  "title": "qui est esse",
  "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
```

プログラムでJSONのレスポンスを標準出力に流す場合は以下のように、Responseに対して`prettyPrint()`を呼びます。

```Java
        given().get("/posts/2").prettyPrint();
```

これだけでJSONがきちんと整形され標準出力に出力されるので、そのままデバッグでも利用できます。

## Github

実際に記述したコードは以下のGithunにPush済みです。
https://github.com/shimashima35/RestAssuredSample

# 終わりに

REST APIテストのためのツール REST Assuredを簡単に説明しました。
REST Assuredはメソッドチェインでテストコードを組み立てるため、IDEとの親和性が高いことが特長です。ここでは細かい操作は説明していませんが、IDEから提供されるメソッドを試して見るだけで色々できるのではないでしょうか。
pythonの配列の形の出力

こんにちは

pythonを勉強したばかりの者です。
今のところはランダム数字の配列を作成するプログラミングを書いています。
ランダム数字は確かに出ていますが、希望した形になれませんでした。
書いたコードは下記のようになります。

import numpy as np

n_zero=input('Insert the amount of 0: ')
n_one =input('Insert the amount of 1: ')
n_two =input('Insert the amount of 2: ')
n_three = input('Insert the amount of 3: ')

data = [0]*n_zero + [1]*n_one + [2]*n_two + [3]*n_three
np.random.shuffle(data)
print(data)


出力結果は

Insert the amount of 0: 6
Insert the amount of 1: 2
Insert the amount of 2: 1
Insert the amount of 3: 2
[3, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2]


自分が希望する結果はこのような形です。
30001010302

カンマと括弧なしの形は望ましい結果です。

よろしくお願いします。
Windows10にADBドライバをインストールする

# Windows10にADBドライバをインストールする
自宅のPCでADBを使用したいが、Android SDKまでは必要ない。
以下のサイトを参考にさせて頂き、ADBをインストールした。
>XDA Developers
>https://forum.xda-developers.com/

>15 seconds ADB Installer v1.4.3
>https://forum.xda-developers.com/showthread.php?p=48915118#post48915118

#### 本記事対象者

* どうしてもすぐにADBが必要
* そんなにPCに詳しくない
* 詳しくないけどやるしかない

#### 作業所要時間
5~10分

## インストール

#### 下記のURLからADBドライバをインストールします。

>https://forum.xda-developers.com/showthread.php?p=48915118#post48915118

ページ下部の「Google Drive」をクリックし、ダウンロードを開始させます。

![02.JPG](https://qiita-image-store.s3.amazonaws.com/0/157454/59f7c673-cf6f-d174-4b9e-20a44c7ced4a.jpeg)

#### ダウンロードした`adb-setup-1.4.3.exe`を実行します。
以下のような画面がでますので、`y`と入力します。

```
Do you want to install ADB and FastBoot? (Y/N) y
```
![01.JPG](https://qiita-image-store.s3.amazonaws.com/0/157454/6bdfdd3e-e070-fa1f-fdeb-ca0d37e9d697.jpeg)

入力後、さらに`y`を入力していきます。

```
Install ADB system-wide? (Y/N)y
   
Installing ADB and Fastboot ... (system-wide)

4 file(s) copied.

成功:　指定した値は保存されました。

Do you want to install device drivers? (Y/N)y

Installing 64-bit driver ...
Please continue driver installation ...
```

![03.JPG](https://qiita-image-store.s3.amazonaws.com/0/157454/610fd564-2a76-6517-908f-81ff9440a1b5.jpeg)

終えると、以下のウィンドウがでるので「次へ」をクリックします。

![04.JPG](https://qiita-image-store.s3.amazonaws.com/0/157454/701716fc-fd7c-33ea-d352-b8ea3bc5fc5d.jpeg)

「インストール」をクリックします。

![05.JPG](https://qiita-image-store.s3.amazonaws.com/0/157454/282287e7-faaf-d71b-cfb9-6b81a440a472.jpeg)

インストールが終了したら「完了」をクリックし終了します。

![06.JPG](https://qiita-image-store.s3.amazonaws.com/0/157454/727c3f12-5771-7071-eac2-8369364f0499.jpeg)

## ADBがインストールされているか確認する

コマンドプロンプトを起動します。（スタートメニューで「コマンド」とまで打てば出ます）
以下のコマンドを実行します。

```
C:\Users\>adb version
Android Debug Bridge version 1.0.32
Revision eac51f2bb6a8-android
```

上記のように、バージョン情報が表示されれば問題なくインストールされています。
コマンドラインからMySQL操作

コマンドラインからMySQL操作をしようとするたびにコマンドを忘れて調べてしまうので、よく使用するものをまとめました。
# MySQL接続
```ruby:パスワードを入力して起動
$ mysql -u ユーザー名 -p
Enter password: パスワード入力
```
```ruby:データベースの一覧を見る
mysql> show databases;
```

```ruby:使用するデータベースを選択する（その１）
mysql> use データベース名
```
```ruby:使用するデータベースを選択する（その２）
mysql> \u データベース名
```
```ruby:選択中のデータベースを確認する
mysql> SELECT database();
```
```ruby:終了（その１）
mysql> quit
```
```ruby:終了（その２）
mysql> \q
```
# SQL実行
```ruby:SQLを実行（その１）
mysql> select * from テーブル名;
```
```ruby:SQLを実行（その２）
mysql> select * from テーブル名\G
```
※SQL文の最後に「\G」を付けると縦表示に整形され、カラム数が多いときに見やすくなる。この場合、「;」は付けない。

```ruby:SQLの入力をクリアする
mysql> select * from テーブル名\c
```
SQL文を間違えた場合などに「\c」を付けると入力値がクリアされる。
Djnagoが動いているサーバをletsencryptでHTTPS化


# 環境
Nginx + uwsgi + Djang 1.10 on CentOS 7 (さくらVPS)

# letsencryptとは？
無料でウェブサイトを暗号化通信HTTPSにできる．[詳細はこちら](https://letsencrypt.org/getting-started/)

# どうやるか？
## Certbotインストール
letsencryptの認証を自動化してくれる Certbot をインストールする．
[ここで環境を選択すると，それぞれのインストール手順を示してくれる](https://certbot.eff.org/#centosrhel7-nginx)
自分の場合は以下の通り（Cent OS 7, Nginx)

```bash:install cerbot
sudo yum install certbot
``` 

## certbotで認証する
以下ようなコマンドを打つ．Djangoだとこのままだと成功しない．

```bash 
# /var/www/example = Django project root
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com
```

+ --webroot でwebrootプラグインなるものを使う
+ -w で認証ファイルの置き場を指定する．ここがDjangoの場合問題になる．
+ -d で認証させたいドメインを指定する．今回は example.com www.example.com になる．

## -w 認証ファイルの置き場について
certbotによって -w で指定した場所に，以下のような認証のためのファイルがつくられる．

```bash
# 上の例の場合
/var/www/example/.well-known/acme-challenge
```

## Django（とかRailsとか）の場合

DjangoとかRailsののような静的ファイルをそのまま配信しないようなアプリケーションサーバは，上で指定した /var/www/example/.well-known/acme-challenge に認証のためのファイルを作成されても読み込めないので，エラーになる．

よってこの -w で指定するディレクトリには，Djangoの静的ファイル置き場の場所を指定する必要がある．普通は多分以下の通り，Djangoプロジェクトの直下にあるstaticである．

```python:Django_static_root
/var/www/example/static
```

こうすれば，静的ファイルの場所に認証局が認証ファイルを読みいけるので， certbotによる認証作業はクリアできるが，まだ nginx側 の設定をいじる必要がある．

## nginxのconfigをいじる

```nginx:/etc/nginx/nginx.conf
server {
	listen 80;
	#
	# いろいろな設定
	# 
	location /.well-known {
		root /var/www/example/static; 
	}
}

server {
	listen 443 default ssl;
	# いろいろな設定
}

```

これで認証が通る．

```bash 
certbot certonly --webroot -w /var/www/example/static -d example.com -d www.example.com
```

認証が通ったら，nginxのlisten 443している方の設定を代えて，認証ファイルを指定してやる．

```nginx:/etc/nginx/nginx.conf
server {
	listen 80;
	#
	# いろいろな設定
	#
	}
}

server {
	listen 443 default ssl;
	 
	ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
	# いろいろな設定
}
```

これで https://example.com にアクセスして通常通りにページが表示されればSSL化できている．

## 参考
https://certbot.eff.org/#centosrhel7-nginx
https://www.abidibo.net/blog/2016/10/07/securing-django-lets-encrypt/
Ubuntu 18.04 LTSに複数のJDKをインストールする方法

Ubuntu 18.04 LTSに複数のJDK (Java Development Kit) をインストールする方法についてまとめます。


#インストール
1. `sudo add-apt-repository ppa:linuxuprising/java`コマンドを実行し、リポジトリを追加します。
2. `sudo apt update`コマンドを実行し、パッケージ一覧を更新します。
3. `sudo apt install default-jre`コマンドを実行し、デフォルトのJREをインストールします。<br>※デフォルトとして設定したJDKのバージョンに対応していないソフトウェアがあった場合、このJREを使うようにすると解消するかもしれません。
3. 以下をインストールしたいJDK全てに対して行います。
  4. `sudo apt install oracle-java*-installer`コマンドを実行し、JDKをインストールします。<br>※`*`にはJDKのバージョン (Java8なら`8`) を入れます。

#設定
※デフォルトとして設定するJDKのバージョンは揃える必要があるので注意してください。

1. `sudo apt install oracle-java*-set-default`コマンドを実行し、JDKの環境設定を行います。<br>※`*`にはデフォルトとして設定するJDKのバージョン (Java8なら`8`) を入れます。
2. `sudo update-alternatives --config java`コマンドを実行し、デフォルトの`java`コマンドを選択します。
2. `sudo update-alternatives --config javac`コマンドを実行し、デフォルトの`javac`コマンドを選択します。
3. `sudo update-alternatives --config javaws`コマンドを実行し、デフォルトの`javaws`コマンドを選択します。
4. `nano ~/.bashrc`コマンドを実行し、以下を追記します。

    ```bash:.bashrc
    JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
    export JAVA_HOME
    PATH=$PATH:$JAVA_HOME/bin
    export PATH
    ```
1. `source ~/.bashrc`コマンドを実行します。
4. `java -version`コマンドを実行し、デフォルトとして設定するJDKのバージョンが表示されれば成功です。

#参考文献
* [Debian系LinuxへOracle JDKをインストールする](http://astah.change-vision.com/ja/feature/install-linux-debian.html)
* [UbuntuにJava8環境構築 - Qiita](http://qiita.com/ayihis@github/items/01f95d5d465168043ae3)
* [JDKとは｜Java Development Kit － 意味 / 定義 / 解説 / 説明 ： IT用語辞典](http://e-words.jp/w/JDK.html)
* [Linuxmania:apt-getでJavaをインストールしよう (Ubuntu)](http://www.linuxmania.jp/apt-install-java.html)
* [java - How to install JDK 10 under Ubuntu? - Stack Overflow](https://stackoverflow.com/questions/49507160/how-to-install-jdk-10-under-ubuntu)
* [UbuntuへJAVA_HOMEを設定する - ryo’s blog](http://forco.hateblo.jp/entry/2015/04/05/035621)
ターミナルからAndroidアプリをビルドしてインストールして起動するスクリプト

いつもAndroidアプリをビルドする時、ターミナルからadbコマンド叩く派なんですがめんどくさかったので今更ながら
ビルドしてインストールして起動するスクリプト書いた

ついでにビルドしてそのまま気づいたら終わってたってことが結構あるので通知も飛ばしてくれるようにした(Macのみ)

```
#!/bin/bash

ROOT=`pwd`

$ROOT/gradlew assembleDebug
adb install -r $ROOT/app/build/outputs/apk/app-debug.apk
adb shell am start -n "com.sample/com.sample.activities.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
osascript -e 'display notification "finish" with title "Build and Install Debug App"'
```

これをてきとうにコマンドにしてプロジェクトルートで叩けば動くはず。
アプリ起動部分のIntentはてきとうに書き換えてください。
Git ブランチの「作成」->「チェックアウト」をワンラインで実行する

## 通常のコマンド
gitでbranchを作成してそのbranchをcheckoutする場合には通常以下の2工程が必要となります。

``` makeBranchAndCheckout.sh
$git branch testBranch
$git checkout testBranch
```

## ワンラインのコマンド
branchの作成、checkoutをセットで行いたい場合は以下のコマンドを使うとスマートです。

``` oneLine.sh
$git checkout -b testBranch
```

## 参考URL
https://git-scm.com/docs/git-checkout
ChainerやTensorFlowでGPUを使うと毎回結果が変わる理由と対策 (まとめ)

##結論から
ChainerやTensorFlowなどの機械学習(特にDeepLearning)フレームワークでGPUを使うと、誤差程度ではあるものの演算結果が毎回変わってしまいます。(非決定的な演算)

「乱数使ってるから当たり前でしょ」って話ではなく、乱数種を指定してもGPU内部での演算順序が非決定的であるためGPU演算の結果は安定しません。

浮動小数点演算なので誤差が出るのは当然だが、その誤差が安定しない(非決定的)なのが気になるところです。

**Chainerでは環境変数(CHAINER_CUDNN)の指定**またはConvolution2Dなどへのパラメータ追加で本事象を回避可能。

**TensorFlowについては**Google社曰く「EigenライブラリまたはcuDNNの仕様によるとのこと」であり**現状では対応策無し。**(詳細は次の記事に記載のIssuesを参照のこと)

尚、Caffeでも同様の事象が発生していたが、現状ではfixされているらしい。(詳細未確認)

##経緯
実務的には試験の時に結構困るのがこのGPU演算の誤差問題です。

###試験時に再現性が得られないのがかなり困りどころ
科学の実験と同じですが、システムの試験とは「同一条件下であれば、いつ誰が実行しても同じ結果が得られる」必要があります。

しかし、誤差程度とは言え、実行する度に結果が変わってしまうのはちょっと痛いところです。

###環境移行後の試験が厄介
開発(試験)環境から本番環境への移行時に行うテストで、両環境での試験結果が完全に一致しないと気持ち悪いですよね。

「Conv層が1層少ない古いバージョンをデプロイしちゃったか?」とか「パラメータ定義ファイルが古くてLearningRateが大きいのか?」なんて心配になるわけです。

「GPUだからきっと演算誤差だろう」なんて思っていたら痛い目に遭うケースもあるでしょう。

###機能修正後の試験が厄介
本稼働後に機能修正を行う際、JenkinsなどのCIツールやJUnit的な自動テストツールを使用してデグレードが発生していないことを確認することが多いと思います。
しかし、テスト結果が不定ですので、過去の試験結果との照合が困難になります。

過去の試験結果と比較する必要があるときだけCPU演算に切り替える手もありますが...
(実際にこのような運用をするケースもあります)

##速度優先で並列演算を実行することが原因のようです
GPUでは行列を多数のコアに分散して演算を行いますが、オペランド(値など)やGPUの内部状態によって各コアでの演算時間が異なります。
各コアでの演算終了後に結果を集約することになりますが、コアごとに演算時間が異なるため集約される順序は不定となります。

これはCPU(FPU)の知識ですがGPUでも同じでしょう。
そのため、浮動小数点演算では単純な足し算であっても、**演算順序が異なれば演算誤差の程度が異なる**ケースが発生します。

しかし、精度を重視して集約する順序を決定してしまうと、集約処理を並列化しにくいため、実行効率が低下してしまうようです。
(Chainerで実験したところ、精度優先の設定でも処理速度の低下は数%にとどまるようですが)

##CPUでも演算順序が異なると演算結果が変わることがあります

ここでCPUを使用してちょっとした実験を行ってみます。

0.0から0.999999まで0.000001刻みの階差数列を用意します。

この1000000の値を**ランダムな順序**で加算することにより総和を求めます。

```python:calculation_error_test.py
import numpy as np

v = np.arange(0.0, 1.0, 1e-6)

for _ in range(10):
    total = 0.0
    for p in np.random.permutation(v.shape[0]):
        total += v[p]
    print("{:6.9f}".format(total))
```
10回繰り返した結果が下記の通り。

```console
$ python calculation_error_test.py
499999.500000007
499999.500000000
499999.500000002
499999.500000009
499999.499999990
499999.499999996
499999.500000016
499999.499999984
499999.499999991
499999.500000009
```

倍精度浮動小数点数ですので16桁目で誤差が発生し、多数の加算を繰り返しているため誤差が蓄積し15桁目や14桁目にも誤差が発生しています。
ここまでは当然の話しですね。

でも、**計算の順序が変わるとその誤差の程度が変化**してしまいます。

この実験はわかりやすくCPUで行っていますが、ChainerやTensorFlowでGPU演算が行われる際、同様の事象が発生しているようです。

***
詳細につきましてはChainerとTensorFlowで分けて記述しましたので下記の記事を参照ください。
[ChainerでGPUを使うと毎回結果が変わる理由と対策](http://qiita.com/TokyoMickey/items/cc8cd43545f2656b1cbd)
[TensorFlowでGPUを使うと毎回結果が変わる理由と対策](http://qiita.com/TokyoMickey/items/57eb23e198ea6f29a1e8)
SCSSで配列を回す

*配列が全く分かってない自分用のメモです

SCSSにて
8要素の配列を回して12の要素に順番通り$listに格納された色を当てようとし、つまづいたのでメモ。

```
$list: (one, two, three, four, five, six, seven, eight);

@for $i from 0 through 11 {
  &:nth-child(#{$i + 1}) {
    border-color: nth($list, $i % length($list) + 1);

    &::before {
      border-color: nth($list, $i % length($list) + 1);
    }
  }
}
```
Ansible でハードウェアを制御する時の話

本トピックはあまり日本サイトでみられなかったので、作ってみました。

**Ansible** はOSや様々なソフトウェア（OSS、プロプラ）を自動でコンフィグレーションできます。また、ハイパバイザー、IaaSなど他のクラウドサービスへも拡張されているのも特徴的です。更に最近動きが大きいのは**特定のハードウェアへの自動化**です。

例えば、**ネットワーク装置**（CiscoやF5などの機器）は顕著に増えています。それ以外にもリモート管理のインタフェースを提供する**IPMI**であったり、**ストレージ装置**にも広がってきています。

本投稿は、これらがどんな形で提供されており、動くのかなどを解説しています。

> Ansible Moduleはどんどん増えていますので、投稿時点での見解を述べています。そのためタイミングによっては異なる部分もあるかもしれませんが、ご了承。

# おさらい
Ansibleを使って自動化を行うときには、基本的にはPython（WindowsではPowerShell）で作られたモジュールを利用します。よって、ターゲット側には原則的にはこれらが搭載されている必要があります。

# ハードウェアを設定するには
ハードウェアに搭載されている専用OSをターゲットとする際は前述のPython（やPowerShell）が含まれていないのでOSやその上のソフトウェアを操作する場合の動きとは変わってきます。ではどのように対応しているのでしょうか。

ネットワークやストレージ装置のほとんどが直接コンソールにつなげてオペレーションする以外に、外部からリモートでCUIなりGUIなりで管理するインタフェースを備えています。そして昨今は、それはきちんとAPIとして整備されています。つまり何らかのアプリケーションからリモートで操作可能な状態なわけです。

# Ansibleから制御するお作法のパターン
プロダクトによって**お作法**は異なるようで、わかっている範囲であげてみました。なお、下記は組み合わさっている事もあります。

* そのハードウェアを操作するために用意されているPython Module（SDKと称されているものもあり）を使ってAnsible Moduleを実行
* HTTP/HTTPS経由のインタフェース経由で```task```の中でURLを指定してAnsible Moduleを実行（例：netapp_e_***）
* Ansible Coreの中に専用のライブラリが入っており、Ansible Moduleは実行時にそれを使う

加えて、上記以外に共通している事としては、必ず装置へアクセスするための**認証**部分は存在しています。

# Ansible モジュールがないものを自動化するには
当然、Ansible Moduleが用意されていないハードウェアはたくさんあります。そんな時はどうするか、整理する意味でも記載してみます。

> （注意）すべてを自身で試みたわけではなく、私見がまざっています。

## SSHが使えるなら raw Moduleを試してみる（初級）
**raw Module** はSSH経由でそのままコマンドを実行してしまうモジュールです。相手方にPythonが入っている必要はないので、SSH Clientからリモートでターゲットのハードウェア上の設定を行えるようなケースではこちらが可能かもしれません。ただし、これのやり方で冪等性を意識した感じにできないのであれば、これまでの**シェルでゴリゴリ作る自動化**とあまり差がないかもしれません。一方で**過去の遺産（職人芸）**を手っ取り早く使うという考え方もできるかもしれませんが。

## RESTで投げるようなAnsible Moduleを作ってみる（中級）
REST（フルな）APIが提供されているハードウェア（の専用OS）であれば、それを意識したAnsible Moduleを作ってみるのも１つかと。よくデキたAPIであればリターン値に合わせて冪等性も担保しやすいはず。

## 専用OSのAPIを利用したAnsible Moduleを作成てみる（上級）
既にそのハードウェアの専用OSのAPIが既存でわかっていれば、それを用いてAnsible Moduleを作成してみるのが一番いい。ただし、この場合はハードウェアに依存したライブラリや、SDKの入手が個人では困難であることが多いという点かとおもいます。それらがオープン化されているような場合は、個人でも作れるものもあるかもしれませんが、専用OSに依存したものであればやはりベンダー側の協力を得て作成するのが吉であると考えています。
> そもそも専用のSDKを使うだけでも有償な場合もあったりもします。

!補足
この手のハードウェア設定は、「設定ファイルを作って流して終わり」系の運用もよくされていると思います。他のソフトウェアでもテンプレートを用意してそれをすげ替えるとか、インポートするとかに対応した形はあるので、同様にハード、API仕様に合わせてそのあたりもどのように対応できているかまたはいないのかを確認すると良いでしょう。

# 実際にAnsible Module開発する際（雰囲気）
```lib``` 配下（例えばプレイブック実行カレントの）に利用する当該ハードウェアのSDKやライブラリ、または自身でAPIに合うように開発したPythonコードを入れ、それを利用して認証や各種パラメータの設定をAnsible Moduleに与えるものとして表現する。

```yaml:sample.yml
- name: CubieBoard Configuration
  cubieboard_net_config:
    admin_user: admin
    admin_passwd: password00
    mgt_url: "http://10.0.0.1/management/"
    state: present
    ip_addr: 192.168.0.12
    subnet: 255.255.255.0
    gw: 192.168.0.254
    dns: 123.123.123.123
    hostname: "cubie.example.com"
```

# 総括
結論として、ないものを実装するところからやる場合はかなりしんどいかもしれません。業務利用やエンタープライズへの適用とする場合は特に余計な工数も加算でしまいかねません（それでも、スペシャルなエンジニアがいて、さくっと開発しちゃえるのであればいいですけど）。ツールありきでハードウェアを選択する事はあまりないかもしれませんので、自分で開発するスキームが組めないのであれば、いまのところはラインナップがそろうのを待つしかないでしょう。

ただし、ハードウェアベンダーとしては顧客を取り込む（買ってもらう）要素として、これだけ目立ったOSSの自動化・構成管理ツールを無視することはできないとおもいますので国内外ベンダーではAnsible Module開発をすることで、自社や他の周辺機器、ソフトウェア、管理ツール等々とソリューション化しプロモーションをかけるなどもありなのではと個人的には思っています。
Ubuntuを手抜きでUPDATEしたいけどファイル作るのも面倒な人（自分含む）用。

##１．コピペしてTerminalに貼り付けちゃいます。
```bash
echo '#!/bin/bash' > ./up && echo "sudo apt update && sudo apt -y upgrade" >> ./up && chmod +x ./up
```

ラズベリーパイなひとは　aptを　apt-getに直してください。

```bash
echo '#!/bin/bash' > ./up && echo "sudo apt-get update && sudo apt-get -y upgrade" >> ./up && chmod +x ./up
```


##２．以後、こうするだけ
```bash
$./up
```
注意
ライセンスの確認とかのアップデートでCUIのGUIが頻繁にでるよなひとはさけてください。
【自分の中で】自作CURL利用クラス(PHP)【大絶賛】

コード例はFuelPHP用ですが、
コピって、namespace消すだけで、
別にどこでも利用可能かと。

staticにしてもいいと思う。

# 使い方
「CURLOPT_RETURNTRANSFER」だけはデフォで設定してあるので、
オプションで指定しなくても、クロール先を出力してくれます。

```php:例
$curl = new My_Curl();

$array_options = array(
    CURLOPT_FAILONERROR => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_TIMEOUT => 10,
);


$output= $curl->get_single($url, $array_options);
```

# クラスのコード
```php:コード
<?php
namespace Lib;

Class My_Curl {
	/**
	 * シングルプロセスCURL
	 *
	 * @param string $str_url
	 * 			<br />処理対象URL
	 * @param array $array_options
	 * 			<br />CURLにセットするオプションと値のセット
	 * 			<br />
	 * 			<br />例) array(CURLOPT_RETURNTRANSFER => 1)
	 * @return $str_result
	 */
	public function get_single($str_url, $array_options) {
		$ch = curl_init($str_url);
		
		$this->set_options($ch, $array_options);
		
		$str_result = curl_exec($ch);
		
		curl_close($ch);
		
		return $str_result;
	}
	
	/**
	 * 並列処理CURL
	 * 
	 * @param array $array_urls
	 * 			<br />処理対象URLリスト
	 * @param array $array_options
	 * 			<br />CURLにセットするオプションと値のセット
	 * 			<br />
	 * 			<br />例) array(CURLOPT_RETURNTRANSFER => 1)
	 * @return $array_res
	 * 			<br />結果。$array_urlsと同じキーで格納。
	 */
	public function get_multi($array_urls, $array_options) {
		$mh = curl_multi_init();	//並列用ハンドル作成
		
		$ch = array();
		foreach($array_urls as $key => $str_url) {
			//ハンドル作成
			$ch[$key] = curl_init($str_url);
			
			//CURLオプション設定
			$this->set_options($ch[$key], $array_options);
			
			//並列用ハンドルに、各ハンドルをセット
			curl_multi_add_handle($mh, $ch[$key]);
		}
		
		//並列処理開始
		$still_running = null;
		do {
			$mrc = curl_multi_exec($mh, $still_running);
		} while($still_running);
		
		//レスポンス待ち
		while($still_running && $mrc == CURLM_OK) {
			if(curl_multi_select($mh, 10) != -1) {
				//状態更新
				do {
					$mrc = curl_multi_exec($mh, $still_running);
				} while($still_running);
			} else {}
		}
		
		$array_res = array();	//返却値を配列で格納
		foreach($array_urls as $key => $str_url) {
			//エラーが存在しない場合(正常時)
			if(curl_errno($ch[$key]) == '') {
				//結果取得
				$array_res[$key] = curl_multi_getcontent($ch[$key]);
			}
			//エラー
			else {
				$array_res[$key] = null;
			}
			
			//ハンドル後処理
			curl_multi_remove_handle($mh, $ch[$key]);
			curl_close($ch[$key]);
		}
		
		//並列用ハンドル削除
		curl_multi_close($mh);
		
		return $array_res;
	}
	
	/**
	 * CURLオプションの設定
	 * 
	 * @param resource $ch
	 * 			<br />curlハンドル
	 * @param array $array_options
	 * 			<br />CURLにセットするオプションと値のセット
	 * 			<br />
	 * 			<br />例) array(CURLOPT_RETURNTRANSFER => 1)
	 */
	private function set_options($ch, $array_options) {
		//固定CURLオプション設定
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		
		//動的CURLオプション設定
		foreach($array_options as $int_option => $multi_val) {
			curl_setopt($ch, $int_option, $multi_val);
		}
		
		return $ch;
	}
}
```
センシティブな文字列をPHPで伏せ字にするパターン集＜随時更新＞

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。

業務開発で、文字列の一部を伏せる対応が必要になり、
色々なサンプルをggってみたので、
個人的な備忘も兼ねてまとめておこうと思います。

特に、最後の「3文字置きに伏せる」は、
検索した範囲ではなかなかうまくヒットしなかったので、
自分たちで書いたサンプルを載せていますが、
もっと良い処理があればぜひコメントでお寄せ下さい。

# 文字列が1バイト文字のみ
```php
echo str_repeat('*', strlen($str));
```

# 文字列がマルチバイトを含む
```php
echo str_repeat('*', mb_strlen($str, 'UTF8'));
```

# 前5文字以外を伏せ字にする
```php
// abcdefghijklmno >> abcde**********
echo mb_substr($str, 0, 5, 'UTF8') . str_repeat('*', mb_strlen($str, 'UTF8') - 5);
```

# 後5文字以外を伏せ字にする
```php
// 1234567890abcde >> **********abcde
echo str_repeat('*', mb_strlen($str, 'UTF8') - 5) . mb_substr($str, -5, 'UTF8');
```

# 前5文字を伏せ字にする
```php
// 12345abcdefghij >> *****abcdefghij
echo str_repeat('*', 5) . mb_substr($str, 5, mb_strlen($str, 'UTF8'), 'UTF8');
```

# 後5文字を伏せ字にする
```php
// abcdefghijklmno >> abcdefghij*****
echo mb_substr($str, 0, mb_strlen($str, 'UTF8') - 5, 'UTF8') . str_repeat('*', 5);
```

# 数字のみ伏せ字にする
```php
// a1b23cde45f6ghi >> a*b**cde**f*ghi
echo preg_replace('/[0-9]{1}/', '*', $str);
```

# 3文字置きに伏せる
```php
// abcdefghijklmno >> *bc*ef*hi*kl*no
$hide_str = $str;
for ($pos = 0, $i = 0; $i < strlen($str) / 3; $i++) {
    $hide_str = substr_replace($hide_str, '*', $pos, 1);
    $pos += 3;
}
echo $hide_str;
```

# 参考リンク
- [文字を伏せ字に置換](http://php.o0o0.jp/article/php-asterisk)
  - 3文字置きに伏せる 以外はこちらからいただきました。

# まとめ
一部の文字列を伏せたいときにはこんなやり方があるよ、というご紹介でした。

おしまい。