OmniAICreator/Qiita-1.07M huggingface dataset:
Nginx 1.10.1でHTTP/2, TLS 1.2をつかっているとiOSからPOSTリクエストができない！？


## 前提条件

- Ubuntu 16.04 LTS
- Python 2.7.11
- Nginx 1.10.1
- 小学生に怒られる覚悟

## 環境

```
View <-> Nginx <-> gunicorn/Django
```

みたいな関係でアプリケーションが動いている

下手な説明をするとDjango自体は `gunicorn PROJECT_NAME.wsgi:application --bind 0.0.0.0:8000 -D` で起動し、Nginxでリバースプロキシでhogehogeっていう感じ

## エラー内容

Xcodeのコンソールに出てくるログでは以下のように出てくる

> FAILURE: Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo={NSUnderlyingError=0x137d39380 {Error Domain=kCFErrorDomainCFNetwork Code=-1004 "(null)" UserInfo={NSErrorPeerAddressKey={length = 16, capacity = 16, bytes = 0x100201bb341a9f540000000000000000}, _kCFStreamErrorCodeKey=-2200, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=[FILTERED], NSErrorFailingURLKey=[FILTERED], _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2200, NSLocalizedDescription=Could not connect to the server.}

引用: http://stackoverflow.com/questions/36907767/nsurlerrordomain-code-1004-for-few-seconds-after-app-start-up

(エラーログを控え忘れた)

## どういうことだ

![スクリーンショット 2016-10-15 午後3.44.19.png](https://qiita-image-store.s3.amazonaws.com/0/97280/b03814e1-0911-8a5a-a2ed-b87dbea20da4.png "スクリーンショット 2016-10-15 午後3.44.19.png")

どうやら上記引用先の回答をみると `Nginx 1.10.0 (and 1.9.15)` 。つまりNginxがHTTP/2に対応したバージョンからHTTP/2を使いつつTLS 1.2をサポートしていると `Could not connect to the server.` というようなエラーが出されてしまうようだ。

## 対策

Nginxを2016/10/15現在最新版のMainlineの1.11.5にバージョンアップをしてあげればいい

![スクリーンショット 2016-10-15 午後3.44.25.png](https://qiita-image-store.s3.amazonaws.com/0/97280/889f89a3-9447-e996-b921-6f108f028bbd.png "スクリーンショット 2016-10-15 午後3.44.25.png")

ちょっと下の回答をみると `http2_body_prepared_size` を更に指定してあげる必要があるらしい

> *) Change: HTTP/2 clients can now start sending request body
       immediately; the "http2_body_preread_size" directive controls size of
       the buffer used before nginx will start reading client request body.

引用: http://nginx.org/en/CHANGES

公式さんのアップデート情報をみるとこんな感じなのでやっぱり1.11.5が必要

### Nginxアップデート

http://nginx.org/en/linux_packages.html

`codename` のところは各自変更で。また、Debian, Ubuntu前提

```bash
$ echo "deb http://nginx.org/packages/mainline/ubuntu/ codename nginx" > /etc/apt/sources.list
$ echo "deb-src http://nginx.org/packages/mainline/ubuntu/ codename nginx" > /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ nginx -v
nginx version: nginx/1.11.5
```

### 設定ファイル

```:nginx.conf
server {
    ・・・
    http2_body_preread_size 64k;
    ・・・
}
```

上記のような形で付け加える。

### 適用

```bash
# 一応テスト
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo /etc/init.d/nginx restart
[ ok ] Restarting nginx (via systemctl): nginx.service.
```

一応今回のサーバで設定してるファイルは以下
https://github.com/nnsnodnb/django-mbaas/blob/master/nginx.conf
UnityのMirrorRefrectionによる鏡の表現

#MirrorRefrection
MirrorRefrectionは平面の鏡を表現するのに最適なアセットです。
以下のような特徴があります。

- 動的な反射ができる
- リフレクションプローブよりパフォーマンスコストが低い。
- 平面の反射しか想定していない(球面とか無理)
- 鏡にTextureを適用できる

MirrorRefrectionイメージ画像
わかりやすいように鏡(MirrorRefrectionを適用したPlane)に色をつけてます。Cubeが鏡に映っている様子がわかると思います。
![anim.gif](https://qiita-image-store.s3.amazonaws.com/0/116884/624f9388-fc37-eb43-9c59-58398b9d7cba.gif)

余談ですが、ユニティちゃん Candy Rock Starのステージの床の反射にもこのアセットの技術が応用されているらしいです。
https://www.youtube.com/watch?v=M_GUlXJ52YA

#MirrorRefrectionの使い方

http://wiki.unity3d.com/index.php/MirrorReflection4

1. 上記リンク先からMirror.shaderと、MirrorReflection.csをコピペしてきます。
2. Materialを作成して1.で作成したshaderを割り振ります。
3. Scene上にPlane等の平面のオブジェクトを配置します。
4. PlaneのMaterialを2.で作成したMaterialに差し替えます。
5. PlaneにMirrorReflection.csをアタッチします。

上記の手順を踏むと鏡ができます。尚、MirrorRefrectionは平面のオブジェクト(Plane,Quad等)を想定して作られているので、平面以外ではうまく動きません。
またマテリアルのMainTextureに任意のテクスチャをセットすると、そのTextureが反映された鏡ができます。

#MirrorRefrectionが何をしているか

MirrorRefrectionがやっていることをざっくり言うと、RenderTextureを生成する反射カメラを常にメインカメラから見て反射の位置関係にしておくことで、あたかも鏡を見ているかのようなTextureを見せているという仕組みです。

![refrection.002.png](https://qiita-image-store.s3.amazonaws.com/0/116884/5e2b2ed5-d576-10ba-6f3e-0898b595b163.png)


#ソースコード解説

全部説明すると長くて面倒なので概要のみにします。
##MirrorReflection.cs
上記ソースコードは鏡に映すRenderTextureを生成します。
RenderTextureは、MainCameraと反射面に対して反射の位置関係にあるRefrection Cameraから作られます。

##MirrorReflection.shader
上記シェーダーは、鏡に適応したTextureに対して反射の効果(MirrorReflection.csで生成したRenderTexture)を掛け合わせています。
ニューラルネットワークのライブラリのインストール方法

# 環境

- Ubuntu 16.04
- Anaconda https://www.continuum.io/downloads
- Python 3.5

# CUDA

CUDA のインストール方法は http://qiita.com/yukoba/items/3692f1cb677b2383c983 をご覧ください。

# Tensorflow

--no-deps つけて依存ライブラリは自分で入れないと Anaconda が崩壊。```conda install tensorflow``` のやつはちゃんと管理されてない＠2016年10月14日現在。

### CPU

```
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp35-cp35m-linux_x86_64.whl
pip install --no-deps --ignore-installed --upgrade $TF_BINARY_URL
```

### GPU

```
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0-cp35-cp35m-linux_x86_64.whl
pip install --no-deps --ignore-installed --upgrade $TF_BINARY_URL
```

# Theano

```
pip install theano
```

```sudo apt install g++ gfortran``` も Anaconda だと必要なはず。

### ~/.theanorc

```
[global]
floatX = float32
device = gpu

[lib]
cnmem = 1

[nvcc]
flags=-D_FORCE_INLINES
```

# Keras

```
pip install keras
```

### ~/.keras/keras.json

```
{
    "epsilon": 1e-07,
    "image_dim_ordering": "th",
    "floatx": "float32",
    "backend": "theano"
}
```

# Autograd

```
conda install future
pip install autograd
```

# Anaconda の Matplotlib

2016年10月14日現在、Anaconda の Matplotlib 関係がおかしくなっていて、github で議論中。

~/.config/matplotlib/matplotlibrc にこれを記載して回避

```
backend: qt5agg
```

X11 サーバーが動いていないなら

```
backend: agg
```
iTerm2 で Alt + Delete で単語削除をする


Preferences から Keys を選択して
Alt + Delete の Action に ```Send Hex Codes: 0x17``` を設定する。

![kobito.1476510930.774242.png](https://qiita-image-store.s3.amazonaws.com/0/10012/e12f5b37-d721-c4b5-efe3-129d9a45d08c.png "kobito.1476510930.774242.png")
CUDAのための時間計測の簡素化

#Abstract
CUDAはNVIDIAのGPUのための統合開発環境である.

cudaAPIの時間計測にはcudaEventを用いるがcudaEventCreate()やcudaEventSynchronize()、cudaEventElapsedTime()を使ったりしてるうちにProgramが雑多となるので, プログラム簡素化のために時間計測のためのクラスを作成した.

#Source Code
```
git clone https://github.com/hurou927/cuda_get_time.git
```

#Usage

```cpp
// some headers
#include "my_cuda_get_time.cuh"

int main(){

 cudatimeStamp cutime(5);//最大5回のタイムスタンプ取得可能
 //cudatimeStamp cutime; //デフォルト＝10回分のタイムスタンプ取得可能

 cutime.stamp(); // 0回目 タイムスタンプ
 // cudaCode 0
 cutime.stamp(); // 1回目 タイムスタンプ
 // cudaCode 1
 cutime.stamp(); // 2回目 タイムスタンプ


 cutime.print(); //全スタンプ間である2回分(0-1,1-2)の時間を出力
 printf("%f,ms\n",cutime.interval(0,1));//0-1回目の時間を出力
 return 0;
}
```
WordやPowerPointの数式ツールでの筆記体（花文字）の入力

フーリエ変換などに用いる、アルファベットの筆記体は、LaTexでは

```
\mathcal{A}
```

のようにすると入力できる。
これを、WordやPowerPointの「数式ツール」を使って、を入力したいときは、

```
\scriptA
```

のように入力し、`space`を押す。

![script.PNG](https://qiita-image-store.s3.amazonaws.com/0/128431/83bd197d-6482-c65c-5f41-8446178a187a.png)
このように入力できる。

こちらの方法もあるようです。
[MS Word / PowerPoint の数式エディタで花文字(?)を打つ方法](http://qiita.com/usuyama/items/725475c50200649fa4e8)

※Windows向けのWord2016でも可能であることを確認しました
rubyプロジェクトのbin/console, bin/setup はバイナリじゃなくスクリプトだった

```
bundle gem sample_sample
```

でrubyプロジェクトを作成するとこんな感じになります。![スクリーンショット 2016-10-15 1.57.55 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/105028/0ac37610-628b-ff71-a4f7-1af5ea9bdf56.jpeg)

このbin配下には、console , setup があって

![スクリーンショット 2016-10-15 2.11.30 PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/105028/2a236b28-6feb-2303-a6f6-46f78e7e6fb4.jpeg)

```shell-session
./bin/console
```
を実行するとirbが

```shell-session
2.3.0 :001 > 
```

一方

```shell-session
./bin/setup
```

を実行するとbundle installが動きます。

```shell-session
bundle install
+ bundle install
Resolving dependencies...
Using rake 10.5.0
Using bundler 1.11.2
Using sample_project 0.1.0 from source at `.`
Bundle complete! 3 Gemfile dependencies, 3 gems now installed.
Bundled gems are installed into ./vendor/bundle.

# Do any other automated setup that you need to do here
```

というのも
[BundlerでRubygemsとGitHubに公開してみる](http://qiita.com/nstoym/items/13649b3e8a9d0a515069)
にて、

```
bin/setupはbundle installを実行するもので、その他のセットアップ処理を追加する場合は、こちらを利用しましょう。
```

とあり、どうやってやるんだ？？と思って調べていたところ

[Ruby on Rails 4.2 リリースノート](http://railsguides.jp/4_2_release_notes.html)

に

```
bin/setupスクリプトが導入されました。これはアプリケーションの初期設定時に設定を自動化するためのコードの置き場所となります。
```

とあり、やっとここで

```shell-session
vim ./bin/setup
```

すると

```shell-session
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
set -vx

bundle install

# Do any other automated setup that you need to do here

```

ここに追加すればいいんですね！


ちなみに*./bin/console* は

```shell-session
#!/usr/bin/env ruby

require "bundler/setup"
require "sample_project"

# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.

# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start

require "irb"
IRB.start

```
IRBやってるだけ！！！！
Serverless Frameworkで同じLambdaファンクションを参照する


「APIエンドポイントは分けたいけど、裏側のLambdaは同じでいいや」って時は、`handler`のパスを同じにすればOKらしい。

```serverless.yml
functions:
  hello:
    handler: src/handler.hello
    description: Start endpoint
    events:
      - http:
          method: get
          path: whatever
  sub:
    handler: src/handler.hello
    events:
      - http:
          method: get
          path: whatever/{post_id}
```

思いつきでやってみたら行けたので、とりあえず覚書。
Serverless Frameworkでwebページを作る


「Serverlessでwebサイト」っていうと大体「S3にHTMLを置いて、APIでやりとりしよう」という構成の話が出てきますよね。
でもそれだとSPAでは良いのですが、通常のwebサイトのような動的にコンテンツやmetaタグを出したいサイトでは、都度都度S3にHTMLをアップロードしないといけなくなっちゃいます。

ということでLambda + API Gatewayで動的にコンテンツ配信やっちゃいましょう。

## Serverless Frameworkでプロジェクトを作る

なにはともかくプロジェクト作りましょう。
以下のコマンドでプロジェクト雛形が作れます。

```
$ npm install serverless -g
$ serverless create --template aws-nodejs --path sample
$ cd sample
```

##API / Lambdaの設定をする

続いてAPI Gatewayの設定をします。

```serverless.yml
functions:
  hello:
    handler: handler.hello
    description: Index Page
    events:
      - http:
          method: get
          path: index
          response:
            headers:
              Content-Type: "'text/html'"
            template: $input.path('$')

```

Response.headersの`Content-Type`を`"'text/html'"`に設定することで、API GatewayからHTMLを配信することが可能になります。

##LambdaからHTMLを返す

あとはLambdaからHTMLを返せばOKです。

```
'use strict';

// Your first function handler
module.exports.hello = (event, context, cb) => {
    var renderedPage = renderFullPage( 'Go Serverless v1.0! Your function executed successfully!');
  cb(null, renderedPage );
};

// You can add more handlers here, and reference them in serverless.yml

function renderFullPage(renderedContent) {
  return `<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
	</head>
	<body>
		<div id="container">${renderedContent}</div>
	</body>
</html>`;
}
```

##デプロイ・動作確認

```
sls deploy
Serverless: Packaging service...
Serverless: Removing old service versions...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...

..........
Serverless: Stack update finished...

Service Information
service: serverless-react
stage: dev
region: us-east-1
api keys:
  None
endpoints:
  GET - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/index
functions:
  serverless-react-dev-hello: arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:serverless-react-dev-hello
```

デプロイが成功すれば、`endpoints`にURLが表示されます。
アクセスすると、このようにHTMLが表示されます。
![スクリーンショット 2016-10-15 14.13.32.png](https://qiita-image-store.s3.amazonaws.com/0/23936/924dad74-6906-294f-224e-ed7bbcc589aa.png "スクリーンショット 2016-10-15 14.13.32.png")

##最後に
今回はとりあえずHTML返すだけにしましたが、APIのクエリを動的にしたりReactあたりを使ってSSRしていくとより良い感じになるかなと思います。
SwiftでRealmSwift使って日記アプリ実装

#備忘録の為に　＊途中経過（自分用）

```swift:ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    
    
    
    

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}



```


```swift:WriteDiary.swift

import Foundation
import UIKit
import RealmSwift

var writeDairydata:UITextView!



class WriteDiary: UIViewController, UITextViewDelegate {
    
    
    
    @IBOutlet weak var writeDairydata: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        writeDairydata.text = "ここに本文を入力してください"
        
        print(writeDairydata)
        
   
        
        
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
   
    
    @IBAction func save(sender: AnyObject) {
        
        let text = self.writeDairydata.text
        
        print (text)
        
 
        //クラスをインスタ
        let myDog = textSaveData()
        
        myDog.name = text
        
        
        
        
        
        
        
        
        // デフォルトRealmを取得します
        let realm = try! Realm()
        
        // データを永続化するのはとても簡単です
        try! realm.write {
            realm.add(myDog)
        }
        
//        print("テキストに保存成功: \(myDog.name)")
        
                 
        }
    }
    




// 通常のSwiftのクラスと同じように定義します
class textSaveData: Object {
    
     dynamic var name = ""
 
    
}



```


```swift:DiaryData.swift

import Foundation

import UIKit
import RealmSwift

var pullData:UITextView!

class DiaryData: UIViewController {
    
    @IBOutlet weak var pullData: UITextView!

    
    override func viewDidLoad() {
        super.viewDidLoad()
        

        let realm = try! Realm()
        
        let texts = realm.objects(textSaveData)
        
        // ためしに名前を表示
        
  
        
        for text in texts {
            
            
             self.pullData.text = text.name
            
            //print("name: \(dog.name)")
        }
        
       // let aaaaa : String = "sasisu"
        
      //  self.pullData.text = aaaaa
        
        

        
//    　　self.pullData.text  = dogs
        
        
    }
    
//    override func pullData() -> AnyObject {
//        return dogs
//    }
    
    
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
}



```


#詰まったところ

ストーリーボドAの「日記を保存ボタン」押忍でUITextViewからRealmSwiftに保存した文字列を

ストーリーボードBの「日記帳を見るボタン」押忍でUITextViewに表示させるところで

文字列がなかなか入らなくて詰まった

```swift:DiaryData.swift

self.pullData.text = text.name

```

#GitHubにソースあり


https://github.com/Ryosuke-Hujisawa/Swift-2016-10-1/tree/master/%E6%97%A5%E8%A8%98%E3%82%A2%E3%83%97%E3%83%AAUI%E3%83%A9%E3%83%95
【Tkinter】Radiobuttonで、選択されたもの以外を選択できない状態（disable）にする

# 前提
Pythonの基礎文法がある程度理解できている
Tkinterについての知識がある（なければ[こちら](http://qiita.com/nnahito/items/ad1428a30738b3d93762)をどうぞ）

# プログラム
```python
#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
from Tkinter import *
import tkMessageBox


root = Tk()
root.title(u"Software Title")
root.geometry("400x300")


# 状態の変更
def change_state():
    # チェックされているラジオボタンを取得
    checked = v.get()

    if ( checked == 1 ):
        # radio1がチェックされていたら
        radio2.configure( state = "disabled" )
        radio3.configure( state = "disabled" )

    elif ( checked == 2 ):
        # radio2がチェックされていたら
        radio1.configure( state = "disabled" )
        radio3.configure( state = "disabled" )


    elif ( checked == 3 ):
        # radio3がチェックされていたら
        radio1.configure( state = "disabled" )
        radio2.configure( state = "disabled" )

    else:
        print "error"




# ラジオボタンのグループ
v = IntVar()
v.set(0)


# ラジオボタン
radio1 = Radiobutton(text = u"項目1", variable = v, value = 1, command = change_state)
radio1.pack()

radio2 = Radiobutton(text = u"項目2", variable = v, value = 2, command = change_state)
radio2.pack()

radio3 = Radiobutton(text = u"項目3", variable = v, value = 3, command = change_state)
radio3.pack()


root.mainloop()
```
Scalaにおける値型(列挙型、Beans)の表現


[Scala Design Patterns](http://shop.oreilly.com/product/9781785882500.do)を読んでいたところ、Scalaにおける値型(列挙型, Beans)の自然な表現が紹介されていたので、まとめました。

## 値型とは？

値型とは、メソッドを持たず、値のみを保持するオブジェクトのことです。
ここでは値型として、列挙型とBeansを紹介します。

## 列挙型
### 定義の方法
```scala:
sealed abstract trait Weekday

case object Sunday extends Weekday
case object Monday extends Weekday
case object Tuesday extends Weekday
case object Wednesday extends Weekday
case object Thursday extends Weekday
case object Friday extends Weekday
case object Saturday extends Weekday
```

### ポイント
- 列挙型の本体(`Weekday`)を、`sealed`キーワードで修飾する。
	- こうすることで、誰かが勝手に`Weekday`を拡張して8つ目の曜日を作るすることができない。
	- パターンマッチに漏れがあると、コンパイラが警告してくれる
- 本体をインスタンス化できないよう、`abstract`修飾子を施す 
- 具体的な値は`case object`として定義し、本体(`Weekday`)を継承する
	- `case`キーワードを付与することで、パターンマッチが可能になる
	- インスタンスを区別する必要がまったくないため、`class`ではなく`object`で定義する

### 使い方
```scala:
def weekdayToNum(weekday: Weekday): Int = 
	weekday match {
		case Sunday => 0
		case Monday => 1
		case Tuesday => 2
		case Wednesday => 3
		case Thursday => 4
		case Friday => 5
		case Saturday => 6
	}
	
val monday: weekDay = Monday

weekdayToNum(monday) // => 1
```

## Beans
Beansは、プロパティとその読み書き機能のみを持つオブジェクトです（厳密な意味でのJavaBeansにはもう少し色々制約がありますが、ここではデータ型としての機能だけに着目します）。

###定義の方法
```scala:
sealed case class Name(firstName: String, lastName: String)
```

###ポイント
+ `sealed`を使用して勝手に拡張されないようにする
+ `case class`として定義し、パターンマッチを可能にする
+ 必要なメンバ変数をコンストラクタに定義するだけ。クラスの本体を書く必要なし。

###使用法
```scala:
val bob = Name("Bob", "Dylan")
bob.lastName // => Dylan
```

## 代数的データ型(ADT)
上で紹介したような値型のことを、関数型プログラミングでは代数的データ型(ADT = Algebraic Data Types)といいます。
そのうち、列挙型の表現として紹介したものを`SUM ADT`、Beansの表現として紹介したものを`PRODUCT ADT`と言います。

## SUM ADTとPRODUCT ADTの複合型

SUM ADTとPRODUCT ADTを合体させることも可能です。
次は図形を表すADTです。

```scala:
sealed abstract trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(width: Double, height: Double) extends Shape

def calcArea(shape: Shape): Double =
    shape match{
        case Circle(r) => r * r * 3.14
        case Rectangle(w, h) => w * h
    }

val c = new Circle(1)
calcArea(c) // => 3.14

```
Bash on Ubuntu on Windows でのSKK日本語入力FEPやMicrosoft IMEによる日本語入力



# 目的
Bash on Ubuntu on Windows のデフォルトで提供されているコンソールでは日本語入力が出来ません。
CmderとかConEmuとかを使ってbashを起動するといくつか問題がありますが一応日本語入力出来ます。その設定をご紹介します。

私はSKK日本語入力FEPを常用していますのでこちらも試しています。
http://coexe.web.fc2.com/skkfep.html

なお、cmderはConEmuにmsysgitとかをパッケージ化したものです。
細かい違いがありますがそのあたりは好みで選べばいいと思います。

## cmderの場合
http://cmder.net/

miniをダウンロードすればbashを使う為には十分です。
Setting -> Startup -> Task で**"Bash on Windows"**という名前でtaskを作成し以下をcommandに指定します。
これはBash on Ubuntu on Windowsを起動するショートカットで指定されているものと同じ設定です。

```
C:\Windows\System32\bash.exe ~
```

![cmder_set0.JPG](https://qiita-image-store.s3.amazonaws.com/0/99584/d9f68308-ac63-3c93-b859-23db8ab9aba4.jpeg)

Setting -> StartupでStartup Optionの"Specified named task"で**{Bash on Windows}**を選択しておけばcmder起動時にBashが起動します。

![cmder_setup2.JPG](https://qiita-image-store.s3.amazonaws.com/0/99584/de84de82-d5dc-a3b2-c334-eb31092d7fc3.jpeg)

### 注意点

vim上ではカーソルキーが無効となります。
emacsとかでは使えるようです。

## ConEmuの場合 
cmderの元となったConEmuです。
https://www.fosshub.com/ConEmu.html

以下の記載のようにConEmu側でカーソルキーの問題は対処されています。
デフォルトでBashを使えるtaskが用意されています。

https://conemu.github.io/en/BashOnWindows.html


Setting -> Startup -> Taskの**{Bash::bash}** で起動します。
無い時は、"Add default tasks..."で追加します。



なお以下のように**~** を追加する事でホームディレクトリで開始します。

```
%windir%\system32\bash.exe -cur_console:p ~
```
![ConEmu2.JPG](https://qiita-image-store.s3.amazonaws.com/0/99584/d44199b0-e408-1bee-836c-cf2acd654f5d.jpeg)



Setting -> StartupでStartup Optionの"Specified named task"で**{Bash::bash}**を選択しておけばConEmu起動時にBashが起動します。

![ConEmu1.JPG](https://qiita-image-store.s3.amazonaws.com/0/99584/41e06944-c5d8-47a2-1708-0f285d5b3b41.jpeg)



## 共通の注意点
cmder,ConEmuともにSetting-> Main -> fontの**Monospace**のチェックを外さないと日本語文字が重なって表示されますので外しましょう。

日本語入力すると文字の間にスペースが入った冗長な画面になってしまいます。
これは保存後は正しく表示されます。
又編集時に文字が多重になったり順番が入れ替わったりします。
ただし表示の問題だけなのでリフレッシュすれば戻ります。
また保存してcatとかで参照する時には問題ないようです。

![Corrupt.JPG](https://qiita-image-store.s3.amazonaws.com/0/99584/07069489-eb09-0aab-1e27-4354a129457e.jpeg)
![Currupt2.JPG](https://qiita-image-store.s3.amazonaws.com/0/99584/828b2b31-1dca-a7a4-9e6a-565c4a8f48f1.jpeg)


あとSKK日本語入力FEPでは明示的に英語と日本語入力を切り替えないと、日本語入力時には英文字が明確に入力出来無いようです。
AutoLayoutで画面をちょうど2分割するViewをつくる(Xcode7)

![Main_storyboard_—_Edited6.png](https://qiita-image-store.s3.amazonaws.com/0/12939/296dce7f-8333-6143-a531-0e0d47554791.png)

2つViewをつくり、StackしてStackViewに入れます。1つ目のViewを右クリックしたまま引っ張って2つ目のViewの上で放し、「Equal Heights」を選びます。あとはStackViewの上下左右の余白を設定し、AlignmentをFillにします。

---
2つViewをつくり、両方選択してStackしてStackViewに入れます。

1つ目のViewを右クリックしたまま引っ張って2つ目のViewの上で放し、「Equal Heights」を選びます。

![スクリーンショット_2016-10-15_12_45_25.png](https://qiita-image-store.s3.amazonaws.com/0/12939/5e8a5683-0987-2929-b98d-8e7da62b308f.png)


あとはStackViewの上下左右の余白を設定し、AlignmentをFillにします（最初の図）。

Alignmentは段落スタイルの右寄せとか中央寄せに使われるので、ここでは「水平方向はFillを指定」ということなのでしょう。

---
ブログやっています：http://weed.nagoya
middleware の spec を書く


参考: [rack middlewareのテストをrspecで書いてみた - Qiita](http://qiita.com/ogawatti/items/4db6dbdfb2405342e0da)

上記ページを参考に書いてみた。
テスト対象が`MyMiddleware`とした場合、以下のように書ける。

```
require "rails_helper"

RSpec.describe MyMiddleware do
  include Rack::Test::Methods

  # テスト用アプリケーション
  class TestApplication
    def call(_)
      [200, { "Content-Type" => "text/html;charset=utf-8" }, ["test body"]]
    end
  end

  let(:test_app) { TestApplication.new }
  let(:app) { MyMiddleware.new(test_app) }

  describe "GET /" do
    it "200 を返すこと" do
      get "/"
      expect(last_response.status).to eq 200
    end
  end
end

```

## Tips

### リクエストのドメイン名を指定

get のパラメタにドメイン名を含むURL文字列を渡すと `request.host` にドメインが設定される。

```
get "http://hoge.example.com/"
# => request.host == "hoge.example.com"
```

## 参考

* [brynary/rack-test: Rack::Test is a layer on top of Rack's MockRequest similar to Merb's RequestHelper](https://github.com/brynary/rack-test)
* [rack middlewareのテストをrspecで書いてみた - Qiita](http://qiita.com/ogawatti/items/4db6dbdfb2405342e0da)
コマンドラインからLINEメッセージを送れるLine Notifyを使ったrubyスクリプト

# 参考
コマンドラインから LINE にメッセージを送れる LINE Notify
http://developers.linecorp.com/blog/ja/?p=3784

# スクリプト

windows だと エンコードの問題が発生するので、送信するときにUTF-8に変換している。

```rb:line_notify.rb
require 'net/http'
require 'openssl'
require 'uri'
require 'optparse'
require 'json'

module LineNotify
	class << self
		def getopts
			params = ARGV.getopts('', 'token:', 'message:', 'image_thumbnail', 'image_fullsize')

			f = false
			if params["message"].nil?
				puts "please set 'message' parameter"
				f = true
			end

			if params["message"].nil?
				puts "please set 'token' parameter"
				f = true
			end

			if params["image_thumbnail"]
				if !params["image_fullsize"]
					puts "please set also 'image_fullsize' parameter if 'image_thumbnail' parameter is set"
					f = true
				end
			else
				if params["image_fullsize"]
					puts "please set also 'image_thumbnail' parameter if 'image_fullsize' parameter is set"
					f = true
				end
			end

			[params,f]
		end

		def message(params)
			uri = 'https://notify-api.line.me/api/notify'
			url = URI.parse(uri)
			req = Net::HTTP::Post.new(url.path)
			req['Authorization'] = "Bearer #{params["token"]}"

			data = {}
			data["message"] = params["message"].encode('UTF-8')
			data["imageThumbnail"] = params["image_thumbnail"] if params["image_thumbnail"]
			data["imageFullsize"] = params["image_fullsize"] if params["image_fullsize"]
			req.set_form_data(data)

			req.each do |n,v|
				p "#{n} : #{v}"
			end

			http = Net::HTTP.new(url.host, url.port)
			http.use_ssl = true
			http.verify_mode = OpenSSL::SSL::VERIFY_NONE

			http.start { |h|
				h.request(req)
			}
		end
	end
end

params,f = LineNotify.getopts

exit(-1) if f

res = LineNotify.message(params)

case res
when Net::HTTPSuccess
	puts "successful"
else
	j = JSON.parse(res.body)
	puts "[status:#{j["status"]}] #{j["message"]}"
	exit(-1)
end
```

# 使い方
```
ruby line_notify.rb --token {access_token} --message "こんにちわ" --image_thumbnail {url1} --image_fullsize {url2}
```
* `access_token`はLine Notify マイページで取得する
* `url1` は サムネのURL
* `url2` は フルサイズのURL
AWSのGPUインスタンスでTensorFlow製音楽生成プロジェクト「Magenta」を動かす

# はじめに

TensorFlow製の音楽生成プロジェクト「[Magenta](https://github.com/tensorflow/magenta)」をいじっています。

参考：[サカナクションさんをTensorFlow製アート・音楽生成プロジェクト「Magenta」に学習させてみる。]
(http://qiita.com/tackey/items/1295a0347a8b4cc30d46)

ただMagentaの学習にはMacだと数時間かかってしまうことがあるため、AWSのGPUインスタンス(g2インスタンス)で動かせないかと思い、やってみました。


# 手順

下記の記事を参考にさせていただきました。
ありがとうございます。

参考：[AWSのGPUインスタンスにTensorFlowとJupyterを入れる](http://qiita.com/masafumi_miya/items/8263a25642d65a0c4a20)

NVIDIA Dockerをインストールするところまではこちらの通りに実行すれば大丈夫かと思います。

## 環境

AMI：Ubuntu Server 14.04 LTS (HVM), SSD Volume Type

なお、ストレージは8GBのままだと途中で容量オーバーになってしまいました。
私は36GBにして行いました。

## NVIDIA Driver のインストール

Driverのバージョンなども変更することなく、そのまま実行。

```$ sudo ./NVIDIA-Linux-x86_64-361.42.run
```でエラーを吐くことがありましたが、再度

```
$ sudo update-initramfs -u
$ sudo reboot
```
を実行することで、問題なく進めました。
(WARNINGはYESを選んでいれば大丈夫だと思います。)

なお、NVIDIA Driverが機能しているかどうかは下記で確認可能です。

```
ubuntu@ip-xxxxxx:~$ nvidia-smi -q | head

==============NVSMI LOG==============

Timestamp                           : xxx x xx xx:xx:xx xxxx
Driver Version                      : 361.42

Attached GPUs                       : 1
GPU 0000:00:03.0
    Product Name                    : GRID K520
    Product Brand                   : Grid
```

## Dockerのインストール

参考記事の通り進めました。

## NVIDIA Dockerをインストール

参考記事の通り進めました。


## Magenta用のDockerインスタンスを立てる

Magentaでは[Dockerコンテナ](https://github.com/tensorflow/magenta#docker)を準備してくれています。
下記で起動できます。

```
$ sudo nvidia-docker run -it -p 6006:6006 -v /tmp/magenta:/magenta-data tensorflow/magenta
```

Docker内に入ったのち、参考記事を元に設定をし、

```
# export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
# pushd /usr/lib/x86_64-linux-gnu
# ln -s libcudnn.so.4 libcudnn.so
# popd
```

動くことが確認できれば大丈夫だと思います。

```
# lookback_rnn_generate \
>   --bundle_file=/magenta-models/lookback_rnn.mag \
>   --output_dir=/magenta-data/lookback_rnn/generated \
>   --num_outputs=10 \
>   --num_steps=128 \
>   --primer_melody="[60]"

INFO:tensorflow:Wrote 10 MIDI files to /magenta-data/lookback_rnn/generated
```


# おわりに

ありがとうございました。
オブジェクトを戻り値で返す関数のコストとClang/GCCの-fno-elide-constructorsの効果について

# 要約

* RVOが無効の場合，かなりコストが高い
* -fno-elide-constructorsを使う場合は，戻り値のための一時オブジェクトのコストを考慮した上で利用すること

# 詳細

[前に書いた記事](http://qiita.com/MasayukiNagamachi/items/fa6e5525c40695f18493)に対するコメントでRVOについて教えていただいたので，実際に確認してみます．

```shell-session
$ clang++ -o test -D LOGGING -fno-elide-constructors test.cc  # test.ccは前の記事と同じ
```

出力結果は以下の通りです．

```shell-session
X()
X(x)
~X()
X(x)
~X()
~X()
```

これも予想とは少し違いますね．コピーコンストラクターとデストラクターがそれぞれ１回多く呼び出されています．なお，GCCでも同じ結果になります．

以下はLLVM IRからの抜粋．

```llvm:test.llからの抜粋
; Function Attrs: norecurse uwtable
define i32 @main(i32 %argn, i8** %argv) #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i8**, align 8
  %x = alloca %"class.(anonymous namespace)::X", align 1
  %4 = alloca %"class.(anonymous namespace)::X", align 1
  %5 = alloca i8*
  %6 = alloca i32
  store i32 0, i32* %1, align 4
  store i32 %argn, i32* %2, align 4
  store i8** %argv, i8*** %3, align 8
  call void @_ZN12_GLOBAL__N_11aEv(%"class.(anonymous namespace)::X"* sret %4)
  invoke void @_ZN12_GLOBAL__N_11XC2ERKS0_(%"class.(anonymous namespace)::X"* %x, %"class.(anonymous namespace)::X"* dereferenceable(1) %4)
          to label %7 unwind label %9

; Function Attrs: uwtable
define internal void @_ZN12_GLOBAL__N_11aEv(%"class.(anonymous namespace)::X"* noalias sret %agg.result) #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  %1 = alloca %"class.(anonymous namespace)::X", align 1
  %2 = alloca i8*
  %3 = alloca i32
  call void @_ZN12_GLOBAL__N_11XC2Ev(%"class.(anonymous namespace)::X"* %1)
  invoke void @_ZN12_GLOBAL__N_11XC2ERKS0_(%"class.(anonymous namespace)::X"* %agg.result, %"class.(anonymous namespace)::X"* dereferenceable(1) %1)
          to label %4 unwind label %5

; <label>:4                                       ; preds = %0
  call void @_ZN12_GLOBAL__N_11XD2Ev(%"class.(anonymous namespace)::X"* %1)
  ret void
```

なるほど，確かに手順的にはこれが正しいですね．なぜなら，関数からの戻り値を一度変数で受けてから，それを使って`x`のコンストラクターを呼び出すことになるからです．例えば，以下のようなコードを考えればその必要性が理解できます．

```cpp
a().SomeMethod();
```
SSL自己証明書のインストール (Windows)

1. xxxx.crt ファイルをダブルクリックする。
1. 「証明書のインストール」ボタンを押下。
1. 「保存場所」で「現在のユーザー」を選択。
1. 「次へ」ボタンを押下。
1. 「証明書をすべて次のストアに配置する」を選択。
1. 「参照」ボタンを押下。
1. 「信頼されたルート証明機関」を選択。
1. 「OK」ボタンを押下。
1. 「次へ」ボタンを押下。
1. 「完了」ボタンを押下。
AWSのOpsWorksでEC2のステータスチェック失敗アラームを作成する

AWSのEC2インスタンスに組み込まれているステータスチェックのアラームをOpsWorksが提供するChefのレシピで作成する手順です。
EC2インスタンスは障害が発生したときにステータスチェックの失敗を報告して再起動することがあるので、そのチェックのためのアラームです。(ステータスチェックについては https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html?icmpid=docs_ec2_console を参照)

### 前提条件
* OS: Amazon Linux 2016.09
* OpsWorksのChefのバージョン: 12

### SNSトピックの作成
先に通知先のSNSトピックをCloudFormationで作成します。`Endpoint`のメールアドレスは適宜読み替えて下さい(AWS::SNS::Topicについては https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html を参照)。 `Properties`の`TopicName`(https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html#cfn-sns-topic-name) については指定するとリソースの置き換えが発生したときにエラーが発生する(更新の度に新しい名前を指定する必要がある)のであえて指定しません。


```json:sns.template
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "SNS Topic",
  "Resources": {
    "AlarmTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "DisplayName": "ステータスチェック失敗の通知",
        "Subscription": [
          {
            "Endpoint": "hoge@example.com",
            "Protocol": "email"
          }
        ]
      }
    }
  },
  "Outputs": {
    "AlarmTopic": {
      "Value": {
        "Ref": "AlarmTopic"
      },
      "Description": "Alarm Topic ARN"
    }
  }
}
```

### トピックSNSのARNをChefレシピのattributesに設定
CloudFormationで作成したスタックのOutputsタブに作成したSNSトピックのARNが表示されるのでここに貼り付けます。(AWSコンソールのCloufFormationの画面から作成したスタックを選択し、Outputsタブをクリックすると表示されます)

```ruby:sample_cookbook/attributes/default.rb
default[:sns][:alarm_topic] = "arn:aws:sns:ap-northeast-1:*******************"
```

### アラーム作成のレシピ
awscliを使ってアラームを作成します。

```ruby:sample_cookbook/recipes/default.rb
##
#=== data bagsから情報を取得
stack = search(:aws_opsworks_stack).first
instance = search(:aws_opsworks_instance, "hostname:#{node[:hostname]}").first

##
#=== ステータスチェック失敗アラームの作成
execute "Create status check failed alarm" do
  command %W{
    aws cloudwatch put-metric-alarm
    --region "#{stack[:region]}"
    --alarm-name "#{stack[:name]} StatusCheckFailed at #{node[:hostname]} > 1"
    --alarm-description "[#{stack[:name]}]#{node[:hostname]}(#{instance[:ec2_instance_id]})でステータスチェックに失敗しました。"
    --metric-name StatusCheckFailed
    --namespace 'AWS/EC2'
    --statistic Maximum
    --period 300
    --threshold 0
    --comparison-operator GreaterThanThreshold
    --dimensions Name=InstanceId,Value="#{instance[:ec2_instance_id]}"
    --alarm-actions #{node[:sns][:alarm_topic]}
    --ok-actions #{node[:sns][:alarm_topic]}
    --evaluation-periods 1
    --unit Count
  }.join(' ')
end
```

### 参考元
http://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-alarm.html
https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/data-bags.html
PhotoshopでSVG書き出しを行う際の注意点

昨今Retinaディスプレイ対応などを目的として画像・アイコン・見出しのテキスト等にSVGを使うことが増えています。
SVGを作成する際はIllustratorを使うことが多いですが、PSDで作成されたデザインカンプをSVG出力したいこともありますよね。
今回はPhotoshopからPSDファイルを操作してSVG書き出しを行った際にハマったので、注意点を共有します。

### 実例

Photoshopでこんな見出しをSVGで書き出すときに…
<img width="1441" alt="スクリーンショット 2016-10-13 17.15.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/1762681b-0b7d-ed0f-8740-2a729bcc01d0.png">

#### カラーオーバーレイに注意
文字色を赤から白に変更しようと、「レイヤースタイル」→「カラーオーバーレイ」機能で白く塗りつぶしました。
<img width="305" alt="スクリーンショット 2016-10-13 17.28.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/c4162299-b86a-3d75-85f4-796ec5057424.png">
<img width="1102" alt="スクリーンショット 2016-10-13 17.16.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/9049056c-deba-5c14-dddb-4278a156eb11.png">
すると、スクショでは分かりにくいですが、微妙に元々の赤い色が外側にはみ出してるように見えます。
#### 書き出し方法に注意
それに普通に.jpgや.pngを書き出すときと同じように「書き出し」→「書き出し形式」で保存しようとすると右上に「フォントが想定通りレンダリングされない場合があります」と注意書きが出ます。
<img width="331" alt="スクリーンショット 2016-10-13 17.16.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/6c3fb580-9eea-4f61-e6eb-8b881ce145a1.png">
実際に、このまま書き出したSVGファイルはSafariでフォントが正しく表示されない（ブラウザごとの標準フォントで描画されてしまう）問題が発生しました。
きちんと表示されないSVGファイルをテキストエディタで開いて詳しく見てみると、font-sizeやfont-familyなどフォントとしての情報が記載されている代わりにパス（path）データがありません。
<img width="1157" alt="スクリーンショット 2016-10-15 10.51.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/19e215ed-3522-f202-afaf-9be98b0a20d1.png">
### 解決方法
解決方法は以下のとおり。
Photoshopで当該のレイヤーを選択した後、**「書式」→「シェイプに変換」**
<img width="663" alt="スクリーンショット 2016-10-13 17.30.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/aae7dbfe-3fb9-dc60-eadc-36eff846d70e.png">
この操作を行った後に先ほどと同じように書き出し操作を行うと、「フォントが想定通りレンダリングされない場合があります」の注意書きは出ず、きちんとヴェクター画像として書き出し・保存ができています。

テキストエディタで確認しても、先ほどと違ってきちんとパスデータが記録されていますね。
<img width="1158" alt="スクリーンショット 2016-10-15 10.52.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/119598/1998b3ea-126f-c585-423f-3e8de1cd8fbf.png">
なお、赤い色が白い色の外側に微妙にはみ出してしまっていた問題も、`<style>`タグ内のfill(塗りつぶし色)を`fill: #d20000;`から`fill: #fff;`に書き換えて解決できました！
golangの便利なサブコマンドや関連コマンドまとめ

# golang
便利じゃない(ソースに手を加える必要があるとか)や、自分が理解できなかったのはありません。

## サブコマンド
### go build [goファイル]
実行ファイルを作成する
環境変数GOOSやGOARCHの設定をしてやるとクロスコンパイルができる。
https://golang.org/doc/install/source#environment
(mainパッケージが複数ある場合は複数のファイル名を指定)
<b>例:go build main.go board.go xy.go</b>
実行ファイル名は一番左にあるファイル(この場合はmainやmain.exe)になる

### go run [goファイル]
実行ファイルを作成せずに実行する
(mainパッケージが複数ある場合は複数のファイル名を指定)
<b>例:go run main.go board.go xy.go</b>

### go fmt [goファイル]
リファクタリング。ソースの整形をしてくれる。
具体的にはインデントの調整や空行の調整など
実行結果に影響は出ないので安心して使おう
<b>例:go fmt main.go</b>
<b>例:go fmt</b>
ファイル名を指定しないとカレントディレクトリにある全てのgoファイルを整形し、対象のファイル名を出力してくれる

### go doc [パッケージやその関数や型]
パッケージやその関数、型、型のメソッドを参照できる。
しかし、関数や型やメソッドは、先頭が大文字(つまりパッケージ外から参照できるもの)でないと表示されない。
また、パッケージ名として指定できるのは標準パッケージと環境変数GOPATHが通っているパッケージに限る。
関数名等は表示順は自動的にソートされるので、ソースコードの書き方に左右されない。
自作パッケージを参照したいときは関数等の上にコメントアウトで説明を書いておくと、表示されるのでわかりやすい。
<b>例:go doc net</b>
netパッケージの関数や型を一覧表示する
<b>例:go doc net.Dial</b>
netパッケージのDial関数の詳細と、その上にかかれているコメントを表示する
<b>例:go doc net.Dialer</b>
netパッケージのDialer型とそのメソッドを一覧表示する
<b>例:go doc net.Dialer.Dial</b>
netパッケージのDialer型のDialメソッドを表示する

### go get [githubなどのパス]
パッケージをリモートリポジトリからローカルにコピーするコマンド。
環境変数GOPATHが通っている一番はじめのパスにコピー(つまりダウンロード)される
実行ファイルがGOPATH/binにダウンロードされることもあるけど、どうやってやるのかは謎(教えて欲しい)
環境変数GOPATH、gitコマンドが必須
<b>例:go get golang.org/x/mobile</b>
公式はgolang.org、その他の一般はgithub.comが多い気がする。
上の例では、
<b>import "golang.org/x/mobile"</b>
とすることでパッケージを使用できる。

### go env
環境変数
今まで挙げたGOROOT,GOPATH,GOOS,GOARCH等だけでなく、その他のgoが参照する環境変数とその中身を一覧できる

## その他関連コマンド
### gofmt [フラグ] [goファイル]
go fmtよりも自由度が高い、と言うかgo fmtがgofmtを呼び出している。
#### フラグの一部
-s シンプルにする
-d 差分を表示(diffコマンド必須)
-l 更新される(つまり未整形の)ファイルを一覧する
-w ファイルに上書きする


他にもベンチマークしたり(test)、goファイルが変形したアセンブリを見たり(tool)と様々なコマンドがあります。
SSL自己証明書作成

## 秘密鍵作成
```
openssl genrsa 2048 > xxxxx.key
```

## CSR作成
```
openssl req -new -key xxxxx.key > xxxxx.csr
```

## 証明書作成
```
openssl x509 -req -days 36500 -signkey xxxxx.key < xxxxx.csr > xxxxx.crt
```
実行時間計測　timeコマンド 

```shell-session
user$ time top //例。
real	0m8.993s
user	0m0.012s
sys	0m0.016s

user$
```

real ... 実時間
user ... ユーザー領域でのCPU使用時間
sys ... カーネル領域でのCPU使用時間

topコマンドは定期的に情報更新するので負荷が高いイメージあるけど、
上記の結果から、ほどんどの時間は待機状態にあるみたいですね。
PyQt5インストール

# 1. pipを使ってインストール

-----

## 1.1. インストール

``` bash
pip install pyqt5
```

(もしくはpip3)

-----

## 2.2. 確認

``` python
>>> import PyQt5.QtCore
>>> PyQt5.QtCore.QT_VERSION_STR
'5.7.0'
```

-----

# 2. [Mac] brewを使ってインストール

-----

## 2.1. インストール

（sipもインストールされます）

``` bash 
# インストール
brew install pyqt5
# リンク作成（環境に合わせてパス変更）
ln -s /usr/local/Cellar/pyqt5/5.6/lib/python3.5/site-packages/PyQt5/ ~/.pyenv/versions/anaconda3-2.5.0/lib/python3.5/site-packages/
```

-----

## 2.2. 確認

``` python
Python 3.5.2 |Anaconda 2.5.0 (x86_64)| (default, Jul  2 2016, 17:52:12) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
In[2]: import PyQt5.QtCore
In[3]: PyQt5.QtCore.QT_VERSION_STR
Out[3]: 
'5.6.1'
```

-----
現時点では、pipでインストールした方が新しいバージョンです
[baserCMS]データキャッシュ用ファイルが大量に生成されることを防止する


baserCMSで、プラグインや拡張機能を作る際に、留意した方が良いキャッシュの動作がわかったのでシェアします。


## 発生する条件

- モデルで BcCache を利用している場合
    - 例: BlogPost, Page モデル等
- getConditionAllowPublish() のように、find 時の conditions の条件に、日時判定を利用している場合


## キャッシュが動作する際の仕組み

モデルのデータキャッシュは、以下のような仕組みで動作する。

- キャッシュファイルは、以下のパスに保存される
    - /app/tmp/cache/datas/mysite_pg_blog_posts
    - ※モデル別に保存ディレクトリのパスは異なる
- キャッシュファイルのファイル名の命名規則は、conditions の条件をシリアライズ化し、キャッシュのファイル名としている
    - 保存する際に、conditions の条件をシリアライズ化している
    - シリアライズ化したものを、ファイル名に設定している
- conditions の条件で取得した結果を、ファイルとして保存している


## 動作による影響

- getConditionAllowPublish() のように、日時を判定している箇所については、1秒毎にキャッシュファイルが生成されてしまう
    - ※ キャッシュファイルの無限増殖に繋がってしまう
    - conditions の条件により、大量のデータを取得するケースがある場合、取得したデータはキャッシュファイルに保存される
    - キャッシュファイルの容量が大きくなり、サーバのHDD容量を圧迫することに繋がるケースがある
        - キャッシュファイルの1ファイルのサイズが15MB等になるケースもある


## わるい動作例

### OptionalLink の場合

- バージョンが 2.4.5-beta 以降
- 対象ファイル: OptionalLink/Event/OptionalLinkHelperEventListener.php

```php
$conditions			 = $BlogPostModel->getConditionAllowPublish();
$this->blogPostList	 = $BlogPostModel->find('all', array(
	'conditions' => $conditions,
	'fields'	 => array(
		'id', 'blog_content_id', 'no', 'name', 'blog_category_id', 'user_id', 'status', 'posts_date',
	),
	'order'		 => 'BlogPost.id DESC',
	'recursive'	 => 2,
));
```

#### 修正後の内容

find を利用する際のオプションに「cache => false」を設定する。
こうすることで、キャッシュファイルを生成しない動作とすることができる。

```php
$conditions			 = $BlogPostModel->getConditionAllowPublish();
$this->blogPostList	 = $BlogPostModel->find('all', array(
	'conditions' => $conditions,
	'fields'	 => array(
		'id', 'blog_content_id', 'no', 'name', 'blog_category_id', 'user_id', 'status', 'posts_date',
	),
	'order'		 => 'BlogPost.id DESC',
	'recursive'	 => 2,
	'cache'		 => false,
));
```


## まとめ

キャッシュを利用しているモデルで、データの日時や期間を見るような検索条件を利用する場合、

```
'cache' => false,
```

の指定を忘れず入れるようにしましょう。
Vue2.0とnl2br

vue2.0では`v-html`に対してfilterが使えなくなりました。
これまで改行含むテキストに対して`<p v-html="message | nl2br"></p>`とやっていたものを、
どう修正するか試したメモです。

##v-htmlとreplace
[デモ](https://jsfiddle.net/huigo/5qnqkjr1/)

```html:html
<p v-html="message.replace(/\n/g,'<br/>')"></p>

```

メリット　:　わかりやすい。
デメリット　:　エスケープされない。

##v-forとsplit
[デモ](https://jsfiddle.net/huigo/72zah021/1/)

```html:html
  <div v-for="str of message.split('\n')">{{str}}</div>

```

メリット　:　エスケープされる。
デメリット　:　改行が続くと空のdivが出たりと、出力されるhtmlが微妙。

##関数型コンポーネント
[デモ](https://jsfiddle.net/huigo/7obwujdo/1/)

```html:html
  <nl2br tag="p" :text="message"></nl2br>
```

```js:js
Vue.component('nl2br', {
  functional: true,
  props: ['tag','text'],
  render: function (createElement, context) {
  	return createElement(context.props.tag,
      context.props.text.split("\n").reduce(function(x,y){
    	  if (!Array.isArray(x)){
      	    return [x,createElement('br'),y];
          }
    	  return x.concat([createElement('br'),y]);
      }));
  }
});
```


メリット　:　エスケープされる。renderが使えて少し楽しい。
デメリット　:　renderめんどい


##css
[デモ](https://jsfiddle.net/huigo/6m5q0xxr/)

```html:html
<p style="white-space: pre;" v-text="message"></p>
```
(折り返す時は`white-space: pre-wrap;`などを使う)

メリット　:　楽。エスケープされる。
デメリット　:　ない。
#まとめ
cssでいいのか……？　cssでいいな……。
Linuxからsqlplusを利用してOracleに接続する

やってみた時のメモ。

# 参考

+ [【AWS】Amazon LinuxにOracle Instant Clientをインストールする（Chefレシピ付）](http://dev.classmethod.jp/cloud/aws/install-oracle-instant-client-into-amazon-linux/)
+ [amazon linux に sqlplus をインストール](http://qiita.com/takashi0314/items/7b8a36682780652e9ab2)

# やってみた

上記リンクを参考にOracleのサイトから以下のrpmをダウンロード

+ oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
+ oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm

インストール

```bash
$sudo rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm

$sudo rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
```

LD_LIBRARY_PATHを設定する必要があるようなので以下で対応。


```bash
$sudo vi /etc/ld.so.conf.d/oracle.conf 
```

```/etc/ld.so.conf.d/oracle.conf
/usr/lib/oracle/12.1/client64/lib
```

```bash
$ldconfig
$sqlplus64 -V

SQL*Plus: Release 12.1.0.2.0 Production
```

これで`sqlplus64`コマンドが利用できるので実際に接続してみます。
接続コマンドは以下を参考に実施。
ユーザー名、ホスト名、SIDは適宜変更。

[Oracle DB インスタンスを作成して Oracle DB インスタンス上のデータベースに接続する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html)

```bash
$sqlplus64 'root@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxx.ap-northeast-1.rds.amazonaws.com) (PORT=1521))(CONNECT_DATA=(SID=ORCL)))'
```

パスワードを入力することでログインできました。
[C#]プロパティのgetアクセサの穴をふさぐ、堅牢な公開

クラスのプロパティを公開する際に、外部から変更されたくない場合にgetアクセサを用いると思いますが、
その公開している型が参照型であった場合、一見変更できないように見えて、バリバリ変更できてしまっている状態になっています。

```csharp:sample.cs
//外部から変更不可
readonly string s;
public string S
{
    get
    {
        return s;
    }
}

//外部から変更可能
readonly List<string> str;
public List<string> Str
{
    get
    {
        return str;
    }
}
```

このStrに対して、外部から要素を追加削除変更し放題になっています。
そこで、登場するのが、ReadOnlyCollection、ReadOnlyDictionaryなどの読み取り専用クラスになります。
使い方は簡単、これらのインスタンスを生成する際に、引数に読み取り専用としたいコレクションを指定するだけ。


```csharp:sample.cs
readonly List<string> str = new List<string>();
public ReadOnlyCollection<string> Str
{
    get
    {
        return new ReadOnlyCollection<string>(str);
    }
}

readonly Dictionary<string, string> dict = new Dictionary<string, string>();
public ReadOnlyDictionary<string, string> Dict
{
    get
    {
        return new ReadOnlyDictionary<string, string>(dict);
    }
}
```

ちなみに、List<string> strの変更は、ReadOnlyCollection<string> Strにも反映されます。
つまるところ、ReadOnlyCollection<string> StrはただのList<string> strの（List<string> strの参照を保持している）ラッパークラスということですね。

ただし、コレクションの要素に参照型が入っていれば同じことになるので、気をつけましょう。

```csharp:sample.cs
//Tが参照型の時、コレクション自体は変更できないが、
//要素のインスタンス（Tクラス）内部を変更可能
readonly List<T> str = new List<T>();
public ReadOnlyCollection<T> Str
{
    get
    {
        return new ReadOnlyCollection<T>(str);
    }
}
```

これで、スティーブジョブズ級のコントロールが、容易に実現できるかも!?
MacにQt5をインストールしてCreatorを起動 => ERRORとなりビルドができない時の対処方法

[Qt5](https://www.qt.io/download-open-source/)をダウンロード&インストールを行い「Qt Creator」を起動したら下のエラーが出てビルドができませんでした。

```
Project ERROR: Xcode not set up properly. You may need to confirm the license agreement by running /usr/bin/xcodebuild.
```

環境は、OS X 10.12、Xcode 8.0、Qt 5.7、QtCreator 4.1.0。


## 対処方法

* Qt5のインストールディレクトリ配下の[.インストール先ディレクトリ/Qt/5.7/clang_64/mkspecs/features/mac/default_pre.prf]ファイルを修正(14行目)

### 変更前
```
    # Make sure Xcode is set up properly
    isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null"))): \
```

### 変更後
``` 
    # Make sure Xcode is set up properly
    #isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null"))): \
    isEmpty($$list($$system("/usr/bin/xcrun -find xcodebuild 2>/dev/null"))): \
```

Qtを再起動でビルドが出来る様になります。
Webhook で動作する Hubot をテストする (mocha, chai, hubot-test-helper)

HTTP POST リクエストを受信すると動作する [Hubot](https://hubot.github.com/) をテストする。

- Hubot をテストするには [hubot-test-helper](https://github.com/mtsmfm/hubot-test-helper) が便利
- CoffeeScript 書いたテストを [mocha](https://mochajs.org/) で動かすには --compilers オプションが必要
- npm test でテストを実行するには package.json に scripts を書く
- HTTP POST を送信するには [request](https://www.npmjs.com/package/request) が楽だけど、json を送る時には注意が必要

# テスト対象の Hubot

POST /hello/hook?room=<部屋ID> を受信すると、リクエストボディから名前を取得して、挨拶メッセージを作り、部屋へ送信する。

```js
module.exports = (robot) ->
  robot.router.post "/hello/hook", (req, res) ->
    room = req.query.room
    announceMessage req, (what) ->
      robot.messageRoom room, what 
    res.end "ok"
    
  announceMessage = (req, cb) ->
    cb 'Hello, ' + req.body.name

```

# 事前準備

## パッケージ構成

```
.
├── package.json
├── scripts
│   └── hook.coffee
├── tests
│   └── test-hook.coffee
...
```

## npm
mocha, chai, [hubot-test-helper](https://github.com/mtsmfm/hubot-test-helper) をインストールする

```
$ npm install mocha chai hubot-test-helper --save-dev
```

mocha で CoffeeScript を動かすために、compilers オプションが必要。また、

```
$ npm test
```
でテストを実行するために、package.json に scripts を追記する。

```js
...
    "scripts": {
        "test": "mocha 'tests/**/*.coffee' --compilers coffee:coffee-script"
    }
...
```

# テストの書き方
Webhook を HTTP GET で起動するテストは
https://github.com/mtsmfm/hubot-test-helper/blob/master/test/httpd-world_test.coffee
が参考になる。

HTTP POST を送信する場合は、以下に注意する。

- http ではなく request で起動する方が楽。
- ただし JSON を渡す場合、reuqest.post() ではなく、request() を使う。json: true の指定が必要。

```js
Helper = require('hubot-test-helper')
helper = new Helper('../scripts')
{assert} = require('chai')
request = require('request')

process.env.EXPRESS_PORT = 8080

describe 'hello-webhook', ->
  beforeEach ->
    @robot = helper.createRoom()

  afterEach ->
    @robot.destroy()

  context 'POST /hello/hook', ->
    beforeEach (done) ->
      request {method: 'POST', url: 'http://localhost:8080/hello/webhook?room=12345', json: true, body: {name: 'takatama'}},
        (@error, @response, @body) => done()

    it 'responds with status 200', ->
      assert.equal @response.statusCode, 200
      assert.equal @body, 'ok'
      assert.deepEqual @robot.messages, [['hubot', 'Hello, takatama']]
```

テストを実行するには

```
$npm test
```
技術英語 > one of the [chief culprits] in confusing code. / decisive factor

@ Code Complete (No. 14646 / 36077)

> one of the <font color=red>chief culprits</font> in confusing code.

http://ejje.weblio.jp/content/culprits
> culpritの複数形。犯人、 犯罪者

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

http://ejje.weblio.jp/content/decisive+factor
> 決定的要因

<hr>
Djangoを始めよう！ 〜チュートリアル⑥〜

# 概要

[前回](http://qiita.com/gcfuji/items/1b6079bec064a4e8b211)の続きです。

全5回に渡って、DjangoでのWebアプリケーションの作成について解説してきましたが、今回が最終章です。

最終章は、静的ファイルの取り扱いについて解説したいと思います。

# 静的ファイルの名称

Djangoでは、静的ファイルのことを **static** と名付けています。
(他のフレームワークだと,publicとかwwwとかもある。)

# 静的ファイルの配置場所

templatesファイルを配置する時と同じで、少し違和感のある配置場所になります。

最初に、 polls ディレクトリの中に、 static ディレクトリを作成します。Django はそこから静的ファイルを探します。Django が polls/templates/ からテンプレートを探す方法と同様です。

故に配置場所は、```polls/static/polls/静的ファイル```となります。

# スタイルの作成

実際に静的ファイルが反映されるかをCSSを書いて確認してみましょう。


```css:polls/static/polls/style.css
li a {
    color: green;
}
```

次に、テンプレートファイルを修正します。

```polls/templates/polls/index.html
{% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

{% if latest_question_list %}
    <ul>
        {% for question in latest_question_list %}
            <li><a href="{% url 'polls:detail' question.id %}">{{question.question_text}}</a></li>
        {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
```

やっている事は単純で、まずstaticテンプレートタグをloadします。
{% static %} テンプレートタグは、静的ファイルの完全 URL を生成します。

ここまでできたらサーバを起動して確認します。

![localhost_8000_polls_.png](https://qiita-image-store.s3.amazonaws.com/0/129216/1505e29d-9e41-2b4a-c431-55bac04acff1.png "localhost_8000_polls_.png")

style.cssが反映されて、文字が緑になっています。

# まとめ

全6回でDjangoのチュートリアルの解説を行なってきました。
Pythonのイメージは、機械学習やIoTやデータ解析など数学の分野で強そうなイメージでしたが、しっかりWebアプリを作成できる事が分かりました。

何か機会があれば、案件でも使ってみたいと思います。

[GitHub](https://github.com/gcfuji/django_tutorial)

# シリーズ

- [Djangoを始めよう！ 〜チュートリアル①〜](http://qiita.com/gcfuji/items/bff55a0b8ae1b76c0ca1)
- [Djangoを始めよう！ 〜チュートリアル②〜](http://qiita.com/gcfuji/items/27d2c9e4b3334447b6af)
- [Djangoを始めよう！ 〜チュートリアル③〜](http://qiita.com/gcfuji/items/c8a0e4add7a628c12f8d)
- [Djangoを始めよう！ 〜チュートリアル④〜](http://qiita.com/gcfuji/items/68101227141cde134326)
- [Djangoを始めよう！ 〜チュートリアル⑤〜](http://qiita.com/gcfuji/items/1b6079bec064a4e8b211)
- [Djangoを始めよう！ 〜チュートリアル⑥〜](http://qiita.com/gcfuji/items/8560eade5a11c08a0ff1)