OmniAICreator/Qiita-1.07M huggingface dataset:
c++ builder / Indy > IndyTextEncoding()の使い方 > 2通り > メモリリークに注意

```txt:動作環境
C++ Builder XE4
```

Indyの関数としてIndyTextEncoding()があり、その使い方の情報が二通りあることに気づいた。

https://forums.embarcadero.com/thread.jspa?threadID=110762

```
enc := IndyTextEncoding(1252);
```

と

```
IndyTextEncoding(TEncoding.GetEncoding(20127))
```

上記のリンクで気になる部分は以下の返答。

Remy Lebeau
Posted: Dec 9, 2014 3:17 PM
> Just keep in mind that TEncoding.GetEncoding() returns a new TEncoding object that needs to be freed, but the IndyTextEncoding(TEncoding) wrapper does not do that yet (I'm going to add that option soon), so make sure you are not leaking the TEncoding objects that you create.

FastMMでメモリリークを追っているうちに、TEncoding::GetEncoding()関連のリークにたどりついて、上記のリンクにたどり着いた。

TEncoding objectのポインタを一次変数に置いて、終了時にFreeするようにしないといけない。

## 関連記事

注意が必要な過去の記事

http://qiita.com/7of9/items/51bd31318c6e1332adbf
http://qiita.com/7of9/items/1fa350ce89d5f6cb356b
http://qiita.com/7of9/items/840d1bf4515335b52109
【Unityエディタ拡張】Prefab以外アタッチできなくするPropertyDrawerを自作する

#はじめに
変数にpublicやSerializeField属性をつけると、Inspectorからオブジェクトをアタッチすることが
できるようになります.

ただ、Prefabを扱うつもりで用意した変数に間違えてScene内のオブジェクトをアタッチしてしまう、といったヒューマンエラーが発生する危険があります.

そこで、Prefab以外をアタッチしたら勝手に外れるPropertyDrawerを作ってみました。

#どんなことができるの？

```NewBehaviourScript.cs
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    [PrefabField]
    public GameObject hoge;
}
```

public変数の直前に   ```[PrefabField]```  と書くことでその変数にPrefab以外のオブジェクトをアタッチすることが
できなくなります。 Prefab以外のオブジェクトをアタッチしても勝手に外れるようになります。

# ソースコード
まず、以下のスクリプトを作成してプロジェクトに入れます。

```PrefabFieldAttribute.cs
using UnityEngine;

public class PrefabFieldAttribute : PropertyAttribute
{
}
```

次に以下のスクリプトを作成してEditorフォルダ内に入れます.

``` PrefabFieldDrawer.cs
using UnityEngine;
using UnityEditor;

[CustomPropertyDrawer(typeof(PrefabFieldAttribute))]
public class PrefabFieldDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        if (property.objectReferenceValue != null)
        {
            var prefabType = PrefabUtility.GetPrefabType(property.objectReferenceValue);
            switch (prefabType)
            {
                case PrefabType.Prefab:
                case PrefabType.ModelPrefab:
                    break;
                default:
                    // Prefab以外がアタッチされた場合アタッチを外す
                    property.objectReferenceValue = null;
                    break;
            }
        }

        label.text += " (Prefab Only)";
        EditorGUI.PropertyField(position, property, label);
    }
}
```

以上で完了となります。

#実行結果
変数名の表記が Hoge から　Hoge (Prefab Only) となります。 
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/14fd4c03-c546-409c-ff29-acb96bbc5503.png)
ここにはPrefabを入れればいいんだな？　ということがエディター上から読み取れるようになります。(ヒューマンエラー防止)

<br>
Prefab以外のオブジェクトをアタッチしても勝手に外れます
![prefab.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/a9f18d75-3040-2065-95b2-3933a6682880.gif)

<br>
Prefabの場合はアタッチできます 
![prefab2.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/e523ac61-c230-9dbf-3b8f-4d7b139835ab.gif)


#参考
自分だけのPropertyDrawerを作ろう！
http://qiita.com/kyusyukeigo/items/8be4cdef97496a68a39d
babel,es2015についてのメモ1


以前。coffee scriptについてはちょっと調べた。
http://qiita.com/bonk/items/8ecbf48aa889a2927e32

チートシート
http://postd.cc/es6-cheatsheet/


## export/import

require()とは何か？何が便利なのか - Qiita
http://goo.gl/npp0XP

	サーバーサイドで外部ライブラリを読み込む時にはrequire()となった。今の自分だとwebpack。


【古い記事】Babelで理解するEcmaScript6の import / export - Qiita
http://goo.gl/NPUJb1

	es2015がbabelによりトランスパイルされる。
	importはrequireを使った式に変換される。
	
	exportはmodule.exportとかObject.definePropertyを使った式に変換される

import - JavaScript | MDN
https://goo.gl/p9nJf4

	いろんな書き方がある。

ES Modules と Node.js について - from scratch
http://goo.gl/WbtIB7

ES6でexportとexport defaultをどう使い分ければいいの？ - なっく日報
http://goo.gl/Eg53Eq

	基本的にはdefaultを指定しておく。
	
(Babel 5における)ES6のモジュールを解説してみた - uehaj's blog
http://goo.gl/j1sOHw


	defaultとnamedの挙動がわかりやすい。

## アロー関数

http://analogic.jp/arrow-function/

## react-routerのアロー関数

```
export const HomeView = () => (
  <div>
    <h4>Welcome!</h4>
  </div>
)
```

これは、定数でファットアローのクロージャーをエクスポートしている？？
babelでコンパイルすると、、なんかreactの記述が入ってきてる。。
どういうこと？
JSXって何？

```
var Home2View = exports.Home2View = function Home2View() {
  return _react2.default.createElement(
    'div',
    null,
    _react2.default.createElement(
      'h4',
      null,
      'Welcome!'
    ),
  };
```


React.jsのJSXを使ってみる - Qiita
http://goo.gl/8dbSQS

JSX - Wikipedia
https://goo.gl/t2tbmy

「JSX」って名前のものが色々あって混乱する - Qiita
http://goo.gl/kJAzHY

入門 React.js その2 JSXについて | JavaScript Journal
http://goo.gl/slr2d6


なるほど文字リテラルじゃないのか。
babelを使ってjsxをjavascriptに変換してる・・・と言っていいのかな？

jsxじゃない処理をjsxのところに入れようかと思ったけど変に混在させる記述はきっとよくないんだろうな。（この手探り感。。）

reactのドキュメントを見よう。。

## ループ処理

http://qiita.com/gaogao_9/items/18b20ad9b76c9c81b5fa

関数を再帰的しているのをループに書き直してくれるらしい。

## IDE intellij

http://blog.asial.co.jp/1434

	intellij-es67を入れようとしたがバージョンが対応してなかった。

https://blog.jetbrains.com/webstorm/2015/05/ecmascript-6-in-webstorm-transpiling/

	external toolにも登録できた

## constを使う

JavaScript(ES2015)でvarやletを使う必要はほぼ無い - id:anatooのブログ
http://goo.gl/eA8nk0

> letだけを使う人を見かけるんだけど、実際にはletもほとんど使う必要なくて、多くの場合はconstで問題ない。また、他人が書いたソースコードの中でletを見ると、「これ後で再代入されるん？」って一瞬身構えるので、再代入の必要がないならconstを使う方が可読性も良くなる。

> 追記: よくよく調べてみると、ESLintには再代入しないletに警告を出すprefer-constがあった。より厳格にしたい場合はこのprefer-constを有効にする。

可読性だけなら、、警告出してくれるならletでもいいんじゃないか。。
って考え方ってだめかなあ。コード量が増えたらだめか。

## @hoge

How can we access redux in componentDidMount with react-router 1.0? · Issue #239 · reactjs/redux
https://goo.gl/wJaSV1

で、

`@connect(select)` という記載をみたけど、これはどういう意味だろう。。

decorator syntaxというらしい？？
まだ先進的な機能かな？たぶん、後述の処理結果を別処理に並行して注入したりする？？よくわからん。
 
es2015 デコレータ - Google 検索
https://goo.gl/Ugp5Ga

Syntax decorators · Babel
https://goo.gl/y07DpG

全力で ES Decorator使ってみた - Qiita
http://goo.gl/kBG65b

ECMAScript 2015のブラウザ対応状況と実践投入に向けて | HTML5Experts.jp
https://goo.gl/Rwhcp8

ECMAScript 6 compatibility table
http://goo.gl/49OaXU
Nutanixのクラスタ構成条件部分を和訳

Nutanixのノードが増えたのと世代変わりで構成が複雑になってきたので構成条件をついでに和訳してみた。(適当)
原文は下記リンクの8ページから9ページを参照。

http://download.nutanix.com/documentation/v4_7/Hardware_Admin_Ref-AOS_v4_7.pdf

- 1.１Gbase-Tのインターフェイスを使用する場合、NX-1020はNX-1065Sと混在することができます。
NX-1020ノードは他のプラットフォームと混在することはできません。
最大クラスタサイズは8ノードです。

- 2.NX-1000シリーズのノードは同じクラスタ内の他の製品と混在することができます。
全てのNX-1000のノードはノードごとに最低10コアを持っていることと、10GbEネットワークを利用している場合です。
NX-1000シリーズのノードは1GbEインターフェイスを使用している場合、最大のクラスターサイズは8です。
NX-1000シリーズのノードは10GbEインターフェイスを使用してる場合、最大のクラスターサイズは他のすべてのプラットフォームの場合と同じです。
重複排除と圧縮はNX-1020以外のNX-1000プラットフォームでサポートされています。

- 3.より大きなフラッシュティアを持つために、NX-3050、NX-3060、およびNX-3060-G4/-G5は他の製品より推奨は全てのNX-6000シリーズとNX-8150です。

- 4.NX-8150、NX-8150-G4、およびNX-8150-G5は示したすべてのシステムと混合することができます。
ただし、Microsoft Exchange、およびOracleデータベースの展開で最適なパフォーマンスのために、クラスタにはNX-8150ブロックが含まれている必要があります。
あなたはNX-8150クラスタ内の少なくとも、20 TBのフェイルオーバーキャパシティを持っていることを確認する必要があります。

- 5.最適なNX-8150、NX-8150-G4、およびNX-8150-G5の性能のために、NX-1050と混在しないでください。

- 6．ヘビーストレージのNX-6035CとNX-6035C-G5プラットフォームはユニークな要件があります。
    ・NX-6035CとNX-6035C-G5はNutanixコントローラVMs（CVM）だけを実行することができます。つまりゲストを実行することができません。
    ・NX-6035CまたはNX-6035C-G5ノードを含むすべてのクラスタノードは障害に耐える大きさでなければなりません。
    ・これを行うために最適の方法は、クラスタに追加NX-6035CまたはNX-6035C-G5ノードを追加することです。
    ・これは必須ではありませんが、Nitanixが勧めしている任意のクラスタのNX-6035CまたはNX-6035C-G5ノードは、任意のクラスタに少なくとも二つのNX-6035CまたはNX-6035C-G5のノードを持つ必要があります。
    ・任意のNutanixスクラスタの複製ターゲットとして使用する最小値の3つのノードと、スタンドアロンNX-6035CまたはNX-6035C-G5クラスタを作成することが可能です。

- 7.NX-1065Sは、10GbE NICおよびIntel Xeon E5-2680 v2 10Core Ivy Bridge 2.8 GHzのCPUの両方を満たしていることが、他のプラットフォームと混合する場合必要です。
NX-1065Sの1GbEインターフェースを使用している場合、最大クラスタサイズは、8つのノードです。

- ブロック内のすべてのノードは、同じタイプでなければなりません。
例えば、混在のNX-3050と同じブロック内のNX-1050のノードはサポートされていません。

- Nutanix NXおよびXpressのノードは、同じクラスタ内に混在させることはできません。

- 暗号化されたノードは、同じクラスタ内の暗号化されていないノードと混合することはできません。

- ALL-SSDのノードは、同じクラスタ内のハイブリッドなSSDとHDDのノードと混在させることはできません。

- Intel Broadwell "-G5"のCPUとIntel Haswell"-G4"のCPUのノードは、同じブロック内に混在させることはできません。

- 同じクラスタ内のDell XC、レノボHX、およびNutanix NXノードの混在はサポートされていません。
ただし、ハードウェアの種類に関わらずNutanixインターフェースを使用して、個別にクラスタを管理することができます。

- クラスタ内のすべてのノードは、同じハイパーバイザータイプ（ESXi、AHV、またはHyper-V）でなければなりません。
クラスタは、NX-6035Cのようなヘビーストレージノードが含まれている場合、この制限は適用されません。（これは常にAHVを実行しています）。

- クラスタ内のすべてのコントローラのVMが同じAOSバージョンをである必要があります。

- 同じクラスタ内の別のプロセッサアーキテクチャとの混合ノードがサポートされています。
　
- ノードを同じクラスタで異なるプロセッサアーキテクチャと混ぜることはサポートされています。
しかし、そのようなケースにおいて、エンハンスドvMotion機能（EVC）が可能でない限り、vSphereは、1タイプのノードから別のノードに、Enhanced/Live vMotionをサポートしません。
EVCの詳細について、vSphere 5ドキュメンテーションと以下のVMwareナレッジベース記事を参照してください:

Enhanced vMotion Compatibility (EVC) processor support [1003212]
EVC and CPU Compatibility FAQ [1005764]
名前空間の概要 


```php
/*まだよく理解していませんが名前の衝突を避けるための
カプセル化と理解しています
名前空間の影響を受けるのは・クラス・関数・定数*/
<?php
// Book.php
namespace my\name; 

class MyClass {}
function myfunction() {}
const MYCONST = 1;

$a = new MyClass;
$c = new \my\name\MyClass; 

$a = strlen('hi'); 
                   

$d = namespace\MYCONST; 
                       
$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); 
?>

<?php
// Note.php
require_once'Book.php';

$x = new my\neme\MyClass();

```
Docker Compose Getting Startedをやってみる


複数コンテナを簡単に管理するためのツール
Docker Composeを触ってみたときのメモです。

 
https://docs.docker.com/compose/gettingstarted/

## 環境
Mac OSX

## 事前準備
### インストール

```
# Homebrew Cask をインストールする
$ brew install caskroom/cask/brew-cask

# VirtualBox をインストールする
$ brew cask install virtualbox

# Docker, Docker Machine, Docker Compose をインストールする
$ brew install docker docker-machine docker-compose
```

### Dockerホストを作成 

作成

```
$ docker-machine create -d virtualbox default
```
確認

```
$ docker-machine ls
NAME        ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default     -        virtualbox   Running   tcp://192.168.99.100:2376           v1.11.2
```
環境変数確認

```
$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/a12499/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env default)
```

環境変数設定

```
$ eval $(docker-machine env default)
```


## セットアップ
プロジェクト用ディレクトリ作成

```
$ mkdir composetest
$ cd composetest
```

テスト用プログラム作成

```app.py
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello World! I have been seen %s times.' % redis.get('hits')

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
```

テスト用アプリの依存関係を定義したファイル作成

```requirements.txt
flask
redis
```

## Docker imageを作成する

Dockerfileを作成する

```Dockerfile
FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py
```

ビルド

```
$ docker build -t web .
```

## サービス定義

docker-compose.yml作成

```docker-compose.yml
version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    depends_on:
     - redis
  redis:
    image: redis
```

## ビルド＆Composeでテストアプリ起動


```
$ docker-compose up
```

## 確認

IPアドレス取得

```
$ docker-machine ip default
192.168.99.100
```


http://192.168.99.100:5000/
にブラウザでアクセス

無事にアクセス回数を表示するページを表示できました。

![スクリーンショット 2016-07-28 19.12.15.png](https://qiita-image-store.s3.amazonaws.com/0/68580/bb767351-3032-df45-1391-a7f2f9246ce4.png "スクリーンショット 2016-07-28 19.12.15.png")
S3をバックエンドにしてbasic認証をかける方法

### 前提
- Client -> ElasticBeanstalk(EC2) -> S3 という構成
- ClientとEB間にBasic認証をかける
- EBとS3間は、Authorization Headerを使った認証をかける
  - https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/RESTAuthentication.html
- ElasticBeanstalkではnginxを用いた

### 要件
- 実際はこのClientとEBの間にCloudFrontをはさみます
- 特定のpathだけBasic認証をかけたいという要望があり、基本的にはCF -> S3な構成なのですが、一部EBを経由させてここでBasic認証をかけるという狙い(この記事を書いた時点では、CFを介しての検証はしてないですが、CFを介したBasic認証の事例はたくさんあったので大丈夫という想定)

### 課題
最初は単純に、Basic認証とS3の認証をそれぞれクリアすればよいと思って以下のような設定にしました。
s3_auth.luaの中で、S3へアクセスするためのAuthorization Headerの値を生成してます。

```
...
location ~ ^/(.*)$ {
      auth_basic "Restricted";
      auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
      rewrite_by_lua_file '/usr/local/nginx/lua/s3_auth.lua';
      proxy_hide_header x-amz-id-2;
      proxy_hide_header x-amz-request-id;
      proxy_intercept_errors on;
      proxy_pass http://$bucket.s3.amazonaws.com/$1;
    }
...
```

参考までにs3_auth.luaはこんな感じ

```
local date = ngx.http_time(ngx.time())
local string_to_sign = ngx.req.get_method() .. "\n\n\n" .. date .. "\n/" .. ngx.var.bucket .. "/" .. ngx.var.full_filename
ngx.req.set_header("Date", date)
local digest = ngx.hmac_sha1(ngx.var.secret_key, string_to_sign)
local signature = ngx.encode_base64(digest)
ngx.req.set_header("Authorization", "AWS " .. ngx.var.access_key .. ":" .. signature)
ngx.req.clear_header("x-amz-cf-id")
```

これだと、S3用のAuthorization Headerに書き換えてしまいBasic認証が通らなくなってしまうという罠にハマってしまいました。
内部的にproxyさせてあげることで、Basic認証とS3への認証を別々に扱うことができました。

```
...
    location ~ ^/(.*)$ {
      auth_basic "Restricted";
      auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
      proxy_hide_header x-amz-id-2;
      proxy_hide_header x-amz-request-id;
      proxy_intercept_errors on;
      proxy_pass http://127.0.0.1:8081/$1;
    }
  }

  server {
    listen 8081 default_server;
    sendfile      on;
    tcp_nopush    on;
    send_timeout 120;
    access_log off;

    set_by_lua $bucket 'return os.getenv("BUCKET")';
    set_by_lua $access_key 'return os.getenv("AWS_ACCESS_KEY")';
    set_by_lua $secret_key 'return os.getenv("AWS_SECRET_KEY")';

 
    location ~ ^/(.+)$ {
      set $full_filename $1;
      rewrite_by_lua_file '/usr/local/nginx/lua/s3_auth.lua';
      proxy_hide_header x-amz-id-2;
      proxy_hide_header x-amz-request-id;
      proxy_hide_header Cache-Control;
      proxy_set_header Host $bucket.s3.amazonaws.com;
      proxy_pass http://$bucket.s3.amazonaws.com/$1;
      error_page 415 /50x.html;
    }
... 
```
rake db:migrate


|command | explanation |
|:-----------|:------------|
|rake db:abort_if_pending_migrations|実行されていないmigrationを表示|
|rake db:migrate [VERSION=バージョン番号] [オプション]|db/migrate内のスクリプトファイルからdatabaseにテーブル作成|
|rake db:migrate:down|指定したmigrationファイルのself.downメソッドを実行|
|rake db:migrate:redo [STEP=ステップ数]|指定したmigrationファイルのself.downメソッドを実行|
|rake db:migrate:reset|databaseを一度削除してもう一度作成し、db:migrate実行|
|rake db:mgrate:up|指定したmigrationファイルのself.upメソッドを実行|

テーブルの初期化

```
rake db:migrate:reset
```

指定したマイグレーションのみ実行

```
rake db:migrate:up VERSION=201010190000
```

一つ前のバージョンに戻す

```
rake db:migrate:redo STEP=1
```

スキーマのバージョンを調べる

```
rake db:version
```
checkinstall, ccacheを用いてUbuntuにソフトウェアをインストールする方法

checkinstall, ccacheを用いて、自前でmakeしなければならないソフトウェアをUbuntuにインストールする方法について紹介します。

#利点
* checkinstallを使ってインストールを行うと、APTのパッケージの1つとして扱われるため、ソフトウェアの管理がしやすくなります。
* ccacheを使用すると、コンパイル時のデータがキャッシュされるので、2回目以降のコンパイルが高速化されます。

#必要なパッケージのインストール
1. `sudo apt install checkinstall ccache`を実行し、必要なパッケージをインストールします。
2. 以下のように`/usr/local/bin/ccache-gcc`を作成します。

```bash
#!/bin/bash

ccache gcc $@
```
2. 以下のように`/usr/local/bin/ccache-gxx`を作成します。

```bash
#!/bin/bash

ccache g++ $@
```
1. `sudo chmod +x /usr/local/bin/ccache-g*`コマンドを実行します。
2. `echo "export CC=\"/usr/local/bin/ccache-gcc\"" >> ~/.bashrc`を実行し、C言語のコンパイル時にccacheを使用するよう設定します。
2. `echo "export CXX=\"/usr/local/bin/ccache-gxx\"" >> ~/.bashrc`を実行し、C++のコンパイル時にccacheを使用するよう設定します。
3. `source ~/.bashrc`を実行し、設定を反映させます。

#ソフトウェアのインストール
1. ソフトウェアをダウンロードし、適当なディレクトリに展開します。
2. 端末を起動し、カレントディレクトリを解凍したディレクトリに移動します。
3. `./configure CFLAGS="-O3" CXXFLAGS="-O3"`を実行します。  
※エラーになる場合には適宜オプションを外してください。
4. `make -j $(grep -c ^processor /proc/cpuinfo)`を実行します。
4. `sudo checkinstall`を実行し、ソフトウェアをインストールします。

#参考文献
* [Checkinstall - なんなんなん行く？](https://sites.google.com/site/teyasn001/ubuntu-13-04/checkinstall)
* [KyTeaのコンパイルオプション](http://www.phontron.com/kytea/compile-ja.html)
* [ccacheでC/C++のコンパイルを高速化する - Qiita](http://qiita.com/bgpat/items/f1990846ac9166710ff5)
* [makeのときにCPU個数を自動で調べて-jオプションのジョブ数に指定する簡単な方法 - 組み込みの人。](http://d.hatena.ne.jp/embedded/20140829/p1)
UILabelの特定の文字列をリンク化

https://github.com/TTTAttributedLabel/TTTAttributedLabel

これを使うとLabelの特定の文字列にアクションを付与できる。

```swift

termLabel.linkAttributes = [NSForegroundColorAttributeName:UIColor.darkGrayColor(),NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue]
termLabel.activeLinkAttributes = [NSForegroundColorAttributeName:UIColor.darkGrayColor(),NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue]
termLabel.delegate = self       
termLabel.addLinkToURL(NSURL(string:RJWebViewController.RJWebViewURL.TERM.rawValue)!, withRange: NSMakeRange(0, 4))
```

Delegate側

```swift

extension LoginInitialViewController:TTTAttributedLabelDelegate{
    func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) {
        let vc = UIStoryboard.loadInitial("Web") as! WebViewController
        vc.setWebViewURL(url)
        self.navigationController?.pushViewController(vc, animated: true)
    }
}
```
FlashAir で、ネットワークに接続するときに、待つ方法

# 概要

FlashAir で、ネットワークに繋がる前に、ネットワークに繋ごうとするとエラーになる。
（と、思っている）

# 結論

待つか、回避するかを判定すれば良い


# lua

例えばこんな感じ。
固定IPの場合うまくいった。
一分間待つようにしている。
DHCPでも使えるかもしれない

```
local i=0
local loop=1
while i < 60 do
  reg=fa.ReadStatusReg()
  all=all..reg.."\n"
  sleep(1000)
  local ip = string.sub(reg,161,168)
  all=all..ip.."\n"
  if ( ip ~= "00000000" ) then
    all=all.."break\n"
    break
  end
  i=i+1
end
```

あとは、以下のページにある
checkWlanConnect()
を使う手もあると思う

[FlashAirのLuaでGoogle Driveに写真を自動アップロードする (2)](http://rinx.biz/blog/2016/02/21/flashair-to-google-drive-2/#.V5s5tZN96_I)
僕のソース管理術

## GHQ+peco
僕のソース管理術

---

## pecoってなに？

- **行をインクリメントサーチして、結果を返す**
- CLI
- Goで作られてる
- percolの亜種

---

### えっ？なにがいいのそれ？
### 利点が文章では伝わりにくいので

---

## peco install

ここからダウンロードできる
Releases · peco/peco https://github.com/peco/peco/releases

```
# mac
% brew install peco

# 他
% cd /usr/local/src
% wget https://github.com/peco/peco/releases/download/v0.3.3/peco_linux_amd64.tar.gz
% tar -C /usr/local/bin -xzf peco_linux_amd64.tar.gz
```


---

## 例) % `ls -al` | peco
絞込みながら、ファイル一覧が見て取れる

![inline](http://i.imgur.com/0O2L8ii.gif)

---

## 応用例: history search
とりあえず、.bashrcにコピペ
『 bind '^r'』= Ctrl-R

```
% cat >> .bashrc
function peco-select-history() {
    typeset tac
    if which tac > /dev/null; then
        tac=tac
    else
        tac='tail -r'
    fi
    BUFFER=$(fc -l -n 1 | eval $tac | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle redisplay
}
zle -N peco-select-history
bindkey '^r' peco-select-history
```

---

うろ覚えなコマンドとか探すの便利！！
これは、life-changing!


![inline](http://i.imgur.com/H43GaXX.gif)

---

## 応用例: ファイル検索
### vimで階層の深いファイル開きたい時とか便利！

![inline](http://i.imgur.com/5FYXLwA.gif)

---

#GHQ

---
## GHQってなに？
### ソース管理ツールです！！

---
## その前にGoのお作法

```
## コードのチェックアウト方法
% go get github.com/motemen/ghq

$GOPATH
|-- src/
|   `-- github.com/
|       `-- motemen/
|           `-- ghq/
|-- bin/
     `-- ghq
```

---

## ファイル管理体型

- `% export $GOPATH=$HOME`
- 自分は、go getですべてのソースを$GOPATH/srcに 
  集約管理してます
- $GOPATH/src/domain/user/reposname
  - github.com/motemen/ghq
  - stash.example.com/awesome-app/awesome-app

---

## ここでGHQの設定


```
cat >> ~/.gitconfig
[ghq]
  root = ~/src
```

---

## GHQコマンド

すると、~src/に並んでいるリポジトリリストが！

```
% ghq  list | head
bitbucket.org/mprasil/docker_dokuwiki
ghe.exmaple.com/awesome_tool/awesome_api.git
ghe.exmaple.com/awesome_tool/awesome_batch.git
ghe.exmaple.com/awesome_tool/awesome_core.git
ghe.exmaple.com/awesome_tool/awesome_filter.git
ghe.exmaple.com/awesome_tool/awesome_flume.git
```

---
## GHQ list [query]

検索も可

```
% ghq list awesome
ghe.exmaple.com/awesome_tool/awesome_api.git
ghe.exmaple.com/awesome_tool/awesome_batch.git
ghe.exmaple.com/awesome_tool/awesome_core.git
ghe.exmaple.com/awesome_tool/awesome_filter.git
ghe.exmaple.com/awesome_tool/awesome_flume.git
```

---
## GHQ+pecoの設定をzshrcへ

```
cat >> ~/.zshrc
function peco-src () {
    local selected_dir=$(ghq list --full-path | peco --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-src
bindkey '^T' peco-src
```

---

## GHQ+peco
![inline](http://i.imgur.com/1Lzkp4U.gif)


---

![inline](https://camo.githubusercontent.com/38df9b507042dded48415dbb5a5a3c4966ea324c/687474703a2f2f692e696d6775722e636f6d2f3965743864614e2e6a7067)

---

# enjoy!
StopCoroutineではコルーチンは完全に止まらない


Unity(C#)でコルーチンを使うことがあるが、
変な動きをする部分があったので検証したら
コルーチンのせいだった。

テストで書いてみないと原因わからない感じだったので一応記載


##意図したとおりに動いていなかったコード

```Hoge.cs
using UnityEngine;
using System.Collections;

public class hoge : MonoBehaviour {
    IEnumerator routine;
	// Use this for initialization
	void Start () {
        routine = coroutine();
        StartCoroutine(routine);
	}
	
	// Update is called once per frame
	void Update ()
    {
        if (Input.GetKeyDown(KeyCode.X))
        {
        	StopCoroutine(routine);
           StartCoroutine(routine);
        }
	}

    IEnumerator coroutine()
    {
        Debug.Log("start");
        yield return new WaitForSeconds(1f);
        Debug.Log("1s");
        yield return new WaitForSeconds(1f);
        Debug.Log("2s");
        yield return new WaitForSeconds(1f);
        Debug.Log("3s");
        yield return new WaitForSeconds(1f);
        Debug.Log("4s");
        yield return new WaitForSeconds(1f);
        Debug.Log("5s");
        yield return new WaitForSeconds(1f);
    }
}

```

こういう感じで書いて、途中でXキー押すと

```
start
1s
2s
start
1s
2s
3s
4s
5s
```

という挙動をするのだと思いこんでいた。
だけどこの書き方だとコルーチンは完全に止まったわけじゃなく
スタートするともう一度止まった次の部分から開始するらしいことがわかった。

##解決策として

```
if (Input.GetKeyDown(KeyCode.X))
{
	StopCoroutine(routine);
	routine = null;
	routine = coroutine();
	StartCoroutine(routine);
}
```

1回null入れると完全に死んでもういっかい最初からになった。
FlashAir の LUA_RUN_SCRIPT をデバッグしたくてファイルに書き出したい時

# 概要

FlashAir で LUA_RUN_SCRIPT を使いたいのだが、デバッグもしたい時に
ファイルにうまく書き出せなかった

# 結論

ファイルを開いて、閉じて、もう１度開くと良い


# lua

```
local filename="debug.txt"
local file = io.open(filename, "w")
file:close()
file = io.open(filename, "w")
-- 以下でバッグ出力など
```

とりあえずこれでうまく動いていると思っている
システムエンジニアのエレベータの乗り方

エレベータはシステムエンジニア思考を鍛えるよい乗り物です。
対象について注意深く観察し、エラーを起こさずスループットが最大化されるように設計・行動する力を付けましょう。

## ボタンキャンセルの仕様を確認しておく

メーカーによって異なります。

http://karapaia.livedoor.biz/archives/52138000.html

基本的にはダブルクリックでキャンセル可能ですが、扉が開いてないと有効にならないものがあるので注意が必要です。

## 混雑したエレベータで1Fから最後らへんに乗り込み扉付近に立ったとき

高速にエレベータ運用するためには、ここのポジションは重要です。

1. まず何階のボタンが押されているか確認します。
2. エレベータが各階に止まったとき、それが…
  1. 1F出発時点で押されていない階の場合、降りる人はいないはずですので、乗ってくる人のためにエレベータの内部方向に詰めます。
  2. 1F出発時点で押されている階の場合、降りる人がいるので、一度エレベータを降りて、出入り口のスペースを作ります。

ちゃんとこの場合分けに沿った行動が取れないと、ドアが開いてからのレイテンシが大きくなってしまうので、乗った時点での停止予定階確認は必ずやっておきます。

## パネルの前に立っていて降りるとき

エレベータの中にいる人の数は、ボタンが押されているフロアの数は、同じかそれよりも多くなります。エレベータの中にいる人の数が多い場合は、少なくともどこかのフロアで2人以上が降りることを意味します。

鳩の巣原理です。

> n 個の物を m 個の箱に入れるとき、n > m であれば、少なくとも1個の箱には1個より多い物が中にある、という原理である。

さて、自分が降りる番になったとき、押されているフロアの数とエレベータの人数が同じであれば、そのフロアで降りるのは、あなたひとりです。この場合は速やかに降りましょう。このとき、残心("閉"ボタンを押しながら降りる行為)は不要です。最近のエレベータだと、閉じるボタンを押したときに、人がまだ降りているとセンサが察知して、すぐ閉じずにウェイトが入ります。このため、かえってエレベータが閉じるまでの時間が長くなってしまうためです。

## 下りで1Fについた場合

みんな一斉に降りますが、ここで考慮しなくてはならないのは、カウンターで乗ってくる人です。エレベータの出入り口の帯域は限られていますから、ダウンストリームが占めている場合は、アップストリームの乗客はのってこれません。大体、全員が降り終わってようやくのり始めるのではないでしょうか?
ところが、現代のエレベータの扉が閉じるまでのタイムアウト値は非常に短く、最後に降りる人が、"開"のボタンを押していないと、乗り込もうとした人が挟まれてしまうエラーが発生することが多くあります。

したがって、最後に降りる人は(特に1Fでは)必ず"開"ボタンを押しながら降ります。

## 上りで最後の1人として降りる場合

この場合も「下りで1Fに付いた場合」と同じく、"開"ボタンを押していないと、乗り込もうとした人が挟まれるエラーの可能性があります。
しかし、前のケースと違うのは、最上階に着いたのではない限り、必ずしも乗り込むとは限りません。到着したときに、上下階のどちらを向いてるかを瞬時に把握します。到着音で判断できることもあります。上に行くときは「トンティン」と音階があがるメロディーで、下に行くときは「ティントン」とさがるメロディーなものです。
まれにこの到着音メロディーが逆になっている場合がありますが、ビル管理者に連絡すると修正してもらえることがあるようです。

エレベータがまだ上に行こうとしていて、誰も乗り込む気配が無いときは、速やかに上に送ってあげなきゃいけないので、"開"ボタンを押さずに降ります。
逆に下に行こうとしていて、乗り込む人がいれば、"開"ボタンを押しながら降ります。

## エレベータがなかなか来ないことにイライラするとき

エレベータがなかなか来ずにイライラすることがあります。
この問題の解決策は、ワインバーグ先生の「ライト、ついてますか―問題発見の人間学」で書かれております。

http://ktadaki.hatenablog.com/entry/2015/03/29/005054

[![](https://images-na.ssl-images-amazon.com/images/I/410X6YM9F7L._SX334_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4320023684)

これはシステムエンジニアやっていれば必ず読めって言われるしろものなので、未読の方はこの機会にお読みください。


ーそうはいっても、アルゴリズムがクソなんだよぅ!!と思う方は、ElevatorSagaで最適なアルゴリズムを構築してビル管理者に掛け合ってみましょう。

http://play.elevatorsaga.com/

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/ece298df-8502-45d8-9d97-cff83ad96e26.png)

エレベータのアルゴリズムをJavascriptで書いてビジュアル的に検証することができます。

## まとめ

このように、エレベータの所作ひとつとっても、システムエンジニア的にはアルゴリズムを考え実行するトレーニングになるので、実践してみましょう。特にパネル操作は、エンジニアの瞬発力を鍛えることになるので、積極的に担当していきましょう。
Ruby | ハッシュのキーに配列を使う

使えるんだ。知らなかった。

# 定義の例

```rb
hash = {[:a, :a] => 100, [:a, :b] => 200}

# => {[:a, :a]=>100, [:a, :b]=>200}
```

## ハッシュ追加の例

```rb
hash[[:a, :c]] = 300

# hash = {[:a, :a]=>100, [:a, :b]=>200, [:a, :c]=>300}
```

# 用途

ケースによっては、次のように、ネストしたハッシュを作らなくて良くなりそう。
工夫しないと NoMethodError が出るから厄介。

```rb
hash = {} 

hash[:a][:a] = 100

# => NoMethodError: undefined method `[]=' for nil:NilClass
```

ただしご覧のとおり「ネスト」しているわけではないので
「ひとつの親要素を取り出して、その子分を展開する」とかは出来ないかも。

# 環境

- ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
RSpecのletにパラメータを渡したくなったとき

RSpecのletにパラメータを受け取って、柔軟にオブジェクトを生成したいときありますよね。そんなとき`RSpec let parameters`とかで検索しても欲しい答えにたどりつけない。そもそもパラメータなんて受け取れない。

そこで思いついたのが、パラメータにしたかった部分をさらにlet化することだ。

```rb
let(:hoge) { create(:hoge, :easy) }
```

上記の`:easy`の部分が、`:easy, :normal, :difficult`など複数のパターンを取るとき、`let`が`引数（パラメータ）`を受け取れたらいいのになあと思う。

しかし、引数を受け取ることはできない。**我々はRSpecという新しい言語パラダイムの中にいるのだ**。

```rb
let(:hoge) { create(:hoge, status) }
```

として、適切な箇所で、

```rb
let(:status) { :easy }
```
というようにして、欲しい`let(:hoge)`を作っていく。
JSで、ある要素をhoverしてるようにする


リンクの要素など、cssで`:hover`でスタイルをつけている。

実際にhoverしなくても`:hover`で指定したスタイルに一時的にしたい。
例えば、Aをクリックした時に、Bをhover状態のスタイルにしたい。

## 結論

__無理だった__
jsでhoverしていることにする、という動作はそもそも無理なようだ。


なので代わりに、`.hovered`というクラスも一緒に定義して、jQueryなどでクラスをあてて実現する。

``` css:style.css

.B:hover, .B.hovered {
  background-color: #ccc;
}


```

``` js:main.js

$('.A').on('click', function() {
  $('.B').toggleClass('.hovered');
});


```
seed-fuでマスタデータを管理していたら困った事があった

# seed-fuは便利
seed-fu便利です。お世話になってます。いいと思います。ありがとうございます。
[seed-fu(GitHub)](https://github.com/mbleigh/seed-fu)

[ここ](http://qiita.com/ko2ic/items/be96e450a33d631e0059)参考にして使ってます。

スプレッドシートでマスタデータ作って、csvとしてdb/fixturesに何個か配置して、下みたいなタスクを1ファイルだけ作って管理してました。このやり方だとタスクは1ファイルだけなので、[ファイルが複数あるとアルファベット順で実行されるとかいうウザさ](https://github.com/mbleigh/seed-fu/issues/60)もなくて良いですね。でもテーブル多かったらそうも言ってられないかもですね。

```ruby:import_master.rb
require 'csv'

CSV.read('db/fixtures/' + Rails.env + '/model1.csv', headers: :first_row).each do |row|
  Model1.seed do |s|
    s.id = row['id']
    s.name = row['name']
    s.category = row['category']
    s.deleted_at = row['deleted_at']
  end
end

CSV.read('db/fixtures/' + Rails.env + '/model2.csv', headers: :first_row).each do |row|
  Model2.seed do |s|
    s.id = row['id']
    s.name = row['name']
    s.desc = row['desc']
    s.image = row['image']
    s.deleted_at = row['deleted_at']
  end
end

・・・・・・
```

これで初回投入時であれcsvマスタデータ修正して再度実行時であれ、 rake db:seed_fu により解決できる訳です。そう思って小気味よく開発してたんです。

# Mysql2::Error: Duplicate entry '{id}' for key 'PRIMARY': INSERT INTO 〜〜
なんでやねん。
再実行しても、主キー(id)同じデータが存在したら更新してくれるって書いてあるやん。なんでや。

# 答え：論理削除してるから
`seed-fu duplicate`とかでgoogle先生に聞いて同じ目にあってる人いないか調べて誰もいなくてショック受けたりしつつ、色々試してみると、deleted_atカラムに値入ってたり入ってなかったりでエラーになったりならなかったりしてる事が分かった（ちなみに[paranoia](https://github.com/rubysherpas/paranoia)で使ってる論理削除フラグ）。paranoiaはActiveRecordのメソッド書き換えたりしてるから、DBのデータで論理削除されてるデータはseed-fu実行時にも無いと判断され、無理やりデータ突っ込みに行ってmysqlから怒られてたんですね。

なのでしょうがないので、タスクの方で論理削除されるかどうか見るようにして対応しました。

```ruby:import_master.rb
require 'csv'

def logical_deleted?(model, row)
  record = model.with_deleted.find_by(id: row['id'])
  record.present? && record.deleted_at.present?
end

CSV.read('db/fixtures/' + Rails.env + '/model1.csv', headers: :first_row).each do |row|
  next if logical_deleted?(Model1, row)
  Model1.seed do |s|
    s.id = row['id']
    s.name = row['name']
    s.category = row['category']
    s.deleted_at = row['deleted_at']
  end
end

CSV.read('db/fixtures/' + Rails.env + '/model2.csv', headers: :first_row).each do |row|
  next if logical_deleted?(Model2, row)
  Model2.seed do |s|
    s.id = row['id']
    s.name = row['name']
    s.desc = row['desc']
    s.image = row['image']
    s.deleted_at = row['deleted_at']
  end
end

・・・・・・
```

seed-fuと言うより、論理削除を併用してる場合の問題でした。
Intentでenumを渡したい、取得したい


intentを用いてenumを渡したり、その値を取得する方法を紹介します

# まず、enumってよくわかってないんだけど…

ざっくり言うと**定数**を簡単に扱う方法です

```java:
enum Hogemon{
    ZENIHOGE,HITOKAGE,FUSHIGIHOGE
}
```

`Hogemon.ZENIHOGE`と呼び出せます。
ZENIHOGEはStringとかではなくZENIHOGEという定数になります。
定数を`static final int HOGEMON_ZENIHOGE = 1`みたいな感じに定義するよりもいろいろなメリットがあるそうです（詳しくは調べてください…）

# Intentで渡す方法
他の値と同じようにintentにつめられます。

```java:intentにつめる
intent.putExtra("hogemon",Hogemon.FUSHIGIHOGE);
```

# Intentから取得する
enumを取得するにはObjectを取り出す時と同じように`getSerializableExtra()`を使用します

```java:intentから取得
Hogemon foo = (Hogemon)getIntent().getSerializableExtra("hogemon");
```

### getSerializableExtra()ってなんだ…
intを取得するときはgetIntExtra()とわかるけどSerializableって何？
なんでObjectはgetSerializableExtra()で取得できるの？

[【Java】Serializableの基本（シリアライズ・直列化） - TASK NOTES ](http://www.task-notes.com/entry/20150925/1443150000)
>通常、オブジェクトはそのままストリームに書き出して読み込むことが出来ないので、読み書きできる形にデータを整形する事をシリアライズ（直列化）と呼んでいるようです。 オブジェクトをシリアライズ可能にするには java.io.Serializable インタフェースを実装する必要があります。

Objectはprimitive型と比べて複雑なので受け渡しのために変形できるようにする（Serializable）ということですね
なのでObjectを取得するときには`getSerializableExtra()`を使います（ObjectがSerializableインタフェースを実装していること）
そしてenumもSerializableインタフェースを実装しているからこのようにして取得できるわけです（参考：[enum定数とシリアライズ：柴田 芳樹 (Yoshiki Shibata)：So-netブログ](http://yshibata.blog.so-net.ne.jp/2008-12-21-2)）
sshでつないでる複数ホストで同じコマンドを同時実行する


調べる動機は
「落ちてしまったプロセスというかデーモンを一括であげられたら障害がすばやく収束していいかんじかなー」
というやつです。
（monitとかで気軽に勝手にあげるとかNGなケースもあるというか詰まってるとこが解消してから人があげないといけない場合に）
先輩が同じこと調べてどこにも書いてなかったらしいので私がかいちゃうじょ。同じこと書いてる人いそうですがまあ備忘録です。


* Poderosa

「ツール」→「キー入力をブロードキャスト」とすると、接続中のターミナル全てにコマンド発行可能。

* PuttyConnectionManager

メニューバーのCommandに入力して実行すると、接続中のターミナル全てにコマンド発行可能。

[複数サーバに一括コマンド実行 - ike-daiの日記](http://d.hatena.ne.jp/ike-dai/20101207/1291725701)


* Rlogin

「コマンド同時送信」ボタンをおしとくと、接続中のターミナル全てにコマンド発行可能。

[高機能 ターミナルソフト（RLogin）](http://www.letsplay-network.info/rlogin/)


* Teraterm（実行するホストの指定が可能）

「コントロール」 > 「ブロードキャストコマンド」で選択したターミナル全てにコマンド発行可能。

[Teratermで複数台のホストに対し一度にコマンドを実行させる | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2014/07/teraterm%E3%81%A7%E8%A4%87%E6%95%B0%E5%8F%B0%E3%81%AE%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AB%E5%AF%BE%E3%81%97%E4%B8%80%E5%BA%A6%E3%81%AB%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C/)


Winのツールは関係ないやつはログアウトしとかないといけない仕様が多いようでした。
ウィンドウ分ければいいかな。確認コマンドとかで挙動確認が必要そうですね。


* Macとか

pssh(pararell-ssh)というやつがあるようです。（実行するホストの指定が可能）

[pssh(pararell-ssh)で複数サーバの同時操作 | Pocketstudio.jp log3](http://pocketstudio.jp/log3/2013/06/04/pssh-pararell-ssh-command-line-tool/)

他のをお使いの方は"ssh 同時実行 <お使いのリモートログインツール名>"とかで検索してみるとたぶん何かでてくるんじゃないでしょうか。
以上です。
Swiftでeach_sliceを実装する

## なぜ
- each_sliceなかったから
- あるのかもしれんがぐぐってもでてこんかった

## なに
- 配列内の要素を指定した数値で分割した返してくれるやーつ

``` swift
var wasshoi = ["a", "n", "c", "ika", "tako"]
```

を

``` swift
let result = wasshoi.eachSlice(2)~

[["a", "n"], ["c", "ika"], ["tako"]]
```

みたいに分けてくれるやつがほしかった

## 早速じっそう
なかみすごいシンプル

``` swift
extension Array {
    func eachSlice<S>(sliceCnt: Int, transform: [Element] -> S) -> [S] {
        var result = [S]()
        for from in 0.stride(to: self.count, by: sliceCnt) {
            let to = from.advancedBy(sliceCnt, limit: self.count)
            result.append(transform(Array(self[from ..< to])))
        }
        return result
    }
}
```

## 使用方法

``` swift
wasshoi.eachSlice(2) { slicedArray in
  // ["a", "b"]とかが帰ってくるよ
}
```
サッカー試合の結果『勝・分・負』で、それぞれの出る確率が1/3になる？

　最近、インターネットでtoto・bigの当選確率に関する記事をみた。理論値で『勝・分・負』の出る確率が1/3で、計算されることが多い。本当に1/3になる？

##Jリーグのデータ
データ期間：1993年〜2015年
対象チーム：J1,J2,J3の全チーム
ルール：90分間内の結果（延長戦、PK戦の結果は引分とする)

|ホーム|全|勝|分|負| 
|:-:|:-:|:-:|:-:|:-:|
|回数|12,552|5,266|3,118|4,168| 
|率|-|41.95%|24.84%|33.21%|

ホームが有利だと分かるが、引分が25%だと？えっ、1/3ではない？

##理論的に、引分の出る確率が1/3になるか?
###仮定
中立の場所で（ホーム要素なし）、実力(勝つ確率、得点数など)が全く同じである両チームの対戦
試合時間：90分間
両チームの得点数：0.5~2.5 goals/match（0.1刻みで設定する)
守備力：とりあえず考慮しない
分布：90分間内の得点数は、二項分布に従うとする。

シミュレーション：100万回の中で、引分の割合を見てみよう。

###結果
完全に対等な両チームであっても、引分の確率が1/3にならない。

```
       goals prob_draw
 [1,]   0.5   0.46632
 [2,]   0.6   0.41768
 [3,]   0.7   0.38492
 [4,]   0.8   0.35270
 [5,]   0.9   0.33012
 [6,]   1.0   0.30564
 [7,]   1.1   0.28890
 [8,]   1.2   0.27644
 [9,]   1.3   0.26416
[10,]   1.4   0.25263
[11,]   1.5   0.24364
[12,]   1.6   0.23508
[13,]   1.7   0.22820
[14,]   1.8   0.22292
[15,]   1.9   0.21470
[16,]   2.0   0.20891
[17,]   2.1   0.20319
[18,]   2.2   0.20047
[19,]   2.3   0.19346
[20,]   2.4   0.19193
[21,]   2.5   0.18550
```

##結論
toto・big確率計算で、『勝・分・負』を当確率で計算することをやめてくれ。
面白い結果だ。
ホーム要素などを考慮して、続けてやってみたい。

続き!

##コード

```
n <- 100000
t <- 90
goals <- seq(0.5,2.5,by = 0.1)
prob_draw <- rep(0, length.out = length(goals))
result <- cbind(goals,prob_draw)

Fun <- function(x){
  home <- rbinom(n,size = t,prob = x["goals"]/t)
  away <- rbinom(n,size = t,prob = x["goals"]/t)
  length(which(home==away))/n
}

result[,2] <- apply(result,1,Fun)
result
```
ソースコード品質改善委員会


プログラマーになりたての皆様へ

これは、私のプログラマー人生で学んできたソースの書き方です。
心構えみたいなものです。
読み流してください！！

しばらくVisualStudioから離れているうちにコード解析ができるようになってた（知らんかっただけかも...）

では、いざ計算！！！（ででん！！）

とりあえず保守容易性インデックスは80オーバーで安全基準は満たせてそう(ーー;)

でも、これを見てインデックスが低いソース見るとやっぱり難解だったりいらない変数を見つけられた！！！

自分が関わってない箇所でも、怪しい個所が丸わかりですね！！

Visual Studioやりおる...

ただね、あんまりなソースだと直す気にならないよね、動いてるしOKとか思ってしまう(・・;)

コードメトリックスも一つの基準にしようと思う今日この頃でした。

以下は、自分が師匠に教わったコードの書き方
1. メソッドを定義する際には戻り値を設定しろ
2. 1メソッドは100行以下にする
3. ifを重ねるな！！（3回ぐらいまでなら可）
4. コメントを丁寧に！！！
5. スーパークラスを活用せよ


それぞれコードの品質に直結するので甘く見てはいけない...

# 1.メソッドを定義する際には戻り値を設定しろ
師、曰く、「voidのメソッドほど設計が難しい」とのことでした。
メソッドは動作な訳ですから、その動作の結果を返さないというのはかなり稀であるといっていました。
つまるところメソッドを呼び出して結果をが帰ってこないと何がどうなったかわからないのである。

# 2. 1メソッドは100行以下にする
師、曰く、「画面内にメソッドが収まらないと読む気にならない」とのことでした。
ぶっちゃけ、仕事なんだから読めよ...と思いましたが、確かに長すぎるのはだめです。
なので、自分は100行を目安にメソッドをわけわけするようにしてます。
でも、メソッド切りすぎると今度は流れを追うのが大変なので、細分化はほどほどにしましょう...(・・;)

# 3. ifを重ねるな！！（3回ぐらいまでなら可）
師、曰く、「ifで階層を増やすならreturnで返せ」とのことでした。
try catchを含めて3回までだそうです！！階層をつくるなら条件を満たさない場合はreturnすればいいそうです。
括弧の分ソースも減るので一石二鳥です！！！

# 4. コメントを丁寧に！！！
師、曰く、「ソースとコメントは、1対1で！！！」とのことでした。
なんか調味料の分量のようですが、パッと見で処理を把握できるぐらい丁寧にコメントしろっていってました！！
しかも、コメント含めて100行いないですから(-"-)
MENDOKUSAI！！！

# 5.スーパークラスを活用せよ
師、曰く、「吸収できる処理は基本クラスに書け」とのことでした。
画面が複数あるようなシステムですと、別画面でも同様の処理を使用する可能性があるので、基本クラスを定義しておくように
とのことでした。（後から適用するびのはしんどいし、影響範囲が大きいので...）

以上が師匠から伝授された内容です。
他にもこまごま言ってましたが、理にかなってなかったり無茶苦茶だったりで聞き流しもしたのでこんなものです。

今は師匠とは一緒に仕事してないですが、いまだに教えは大切にしています。
そして、師匠から学んだ一番大事なことは、「年長者の意見ほどめんどくさいものはない。」です。
なかなか理不尽だったり頭が固くなってしまうようで、自分の考えが一番と考えている人が多いこの業界ですが
うまく立ち回れる人だけが生き残れるのでした。( ^^) _U~~
css-modulesを初めて導入してみて思ったこと

どうもヒロです。
もうそろそろ8月だというのに梅雨が抜けきらない感じに雨が降りますよね。年々梅雨の時期がズレて来ているように感じます。
そんなこんなで、前回の記事[wp-rest-apiとreact.jsを使って色々試してみた話し](http://qiita.com/hirodeath/items/6a9d9de8e34b671e5674)でcss-modulesを初めて使用してみて思ったことや簡単な導入の仕方等、説明して行きたいと思います。

前回と同じですが、[コードはこちらのリポジトリ](https://github.com/takahiro-saeki/react-wp-rest-api)にあります。

##css-modules導入のことはじめ
初めに、css-modulesを使うにはcss-loaderが必要なので、css-loaderをインストールしましょう。

```js:ターミナル 
$ npm i css-loader -D
```
そして、webpackのconfigファイルの中にcss-loaderを読み込みますが、以下のような感じで読み込みます。

```js:webpack.config.babel.js
{
  test: /\.css$/,
  loaders: ['style', 'css?modules', 'postcss']
}
```
上記の`css?modules`となっているところがポイントで、上記のようにすることによりcss-modulesを使用することが出来ます。

ここまでが完了したらあとは簡単！適当にCSSのクラスを用意しましょう。

```css:assets/css/style.css
.loader {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
  z-index: 100;
}

.loaderBg {
  background: #f7f7f7;
  width: 100%;
  height: 100%;
  position: absolute;
  z-index: 10;
}

.contentWrap {
  display: flex;
  flex-wrap: wrap;
}
```

ここで一つポイント。通常CSSのクラス名を決める時、キャメルケースにはしないのが一般的だと思いますが、javascript側に読み込ませる為にキャメルケースを採用しています。

##実際に読み込ませてみる
```jsx:assets/js/container/Main.jsx
import styles from '../../css/style.css';
...
<main>
  <Header page="もふ☆パラブログ" leftIcon={false} />
  <div className={styles.contentWrap}>{this.state.body ? title : ''}</div>
</main>
...
```
上記の`styles.contentWrap`の部分でCSSを読み込んでいます。実際にブラウザでこの部分を確認してみると....

<img width="966" alt="スクリーンショット 2016-07-28 16.42.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/79274/bbed047c-9f85-1eb8-95f7-bb8cb32d44bc.png">

ちゃんと読み込めてる！

##感想
css-modules使ってみたいという気持ちはあった物の、導入が面倒な気がして引き気味でしたが、やってみたら意外と簡単でした。

また、inline-cssと違い、今までと同じようにCSSを記述し、それを読み込むだけなので、導入してみて違和感等もありませんでした。むしろ今後積極的に取り入れて行きたいと思えるくらい便利だなーと思いました。

BEMやSMACCS等で適切なルール決めをすれば不要なのかもしれませんし、そもそもclassがバッティングするような設計が間違いなのかもしれませんが、本当に違和感がなかった。というのが正直な感想ですね。

まとまりが悪いですが汗
今回はこんな感じで！それではまた！

##参考
CSSモジュール ― 明るい未来へようこそ
http://postd.cc/css-modules/
css-modulesのリポジトリ
https://github.com/css-modules/css-modules
webpackのcss-loaderでCSS Modulesをやる
http://qiita.com/_likr/items/c335dec5221024ad56bc
ElasticsearchからAmazon ESに移行したこと

# 2015年夏にAmazon ESが東京リージョンにやってきました

もともと、EC2上でElasticsearchを運用していたのですが、AmazonESがやってきたので2015年10月に移行しました。
使っていたプラグインはAmazonESにも搭載されていましたし、Scripts FieldsがAmazonESでは使えないのがどうかな～と思ったのですが、運用楽になるしそもそもScripts Fields使ってなかったのでとっとと移行しちゃった話です。

# 流れは以下のような感じ

1. elasticsearch-cloud-awsプラグインをinstall
2. リポジトリの作成
3. スナップショットをS3に作成
4. AmazonESリポジトリの作成
5. AmazonESにスナップショットのrestore

### 1. elasticsearch-cloud-awsプラグインをinstall
まずはスナップショットをS3に作成するためにelasticsearch-cloud-awsプラグインをinstallします。

```bash:プラグインインストール
/usr/local/elasticsearch/bin/plugin install elasticsearch/elasticsearch-cloud-aws/2.4.2
```
```bash:/usr/local/elasticsearch/config/elasticsearch.yml
#以下を最終行に追加
plugin.mandatory: cloud-aws
cloud:
    aws:
        access_key: アクセスキー
        secret_key: シークレットキー
        region: ap-northeast-1
discovery:
    type: ec2
```

これでElasticsearchを再起動


### 2. リポジトリの作成

```bash
curl -XPUT http://localhost:9200/_snapshot/s3_repository  -d '
 {
   "type": "s3",
   "settings": {
      "bucket": "バケット名",
      "base_path": "パス" 
   }
 }'
```

### 3. スナップショットをS3に作成

```bash
curl -XPUT http://localhost:9200/_snapshot/s3_repository/snapshot_1?wait_for_completion=true
```

### 4. AmazonESリポジトリの作成

```bash
curl -XPOST http://ESドメイン/_snapshot/s3_repository  -d '
 {
   "type": "s3",
   "settings": {
       "access_key": "アクセスキー",
       "secret_key": "シークレットキー",
       "role_arn": "iamロール",
      "region": "ap-northeast-1",
      "bucket": "バケット",
      "base_path": "パス" 
   }
 }'

```

### 5. AmazonESにスナップショットのrestore

```bash
curl -XPOST http://ESドメイン/_snapshot/s3_repository/snapshot_1/_restore
```

## 注意点
<Font color="red">Elasticsearchの公式ドキュメントではスナップショットのリストアはPUTメソッドで実行するサンプルになっていますが2015/10時点ではAmazonESにPUTリクエストができなかったのでPOSTメソッドを使ってリクエストしています。</font>

# 移行してみて

やっぱ運用は楽です。
もともと検索エンジンど素人がEC2上で運用していたので、Logにエラーが吐かれたりするたびに調べてチューニングしていたりしたので、AWSに任せられるのは非常に大きいです。

要望があるとするとバージョンアップを早くしてほしい・・・いま、AmazonESのバージョンは1.5.2なんですが、mappingの変更けっこう大変なんで早くReindexが使えるようになりたい。
あと、デフォルトでkibanaもついてきますがkibana使ってるとけっこうScripts Fields使いたくなるケースがあるのでScripts Fieldsもいつかは使えるようにしてほしいな～
plotly + Jupyterでローソク足


bokehと比べてあまりメジャーじゃないplotly。
plotlyはオンライン上のツールだと思われているフシがあるので、localな環境でJupyter上にローソク足を描画してみる。

以下、全てJupyter notebook上から実施

```py
from plotly.offline import init_notebook_mode, iplot
from plotly.tools import FigureFactory as FF
import pandas as pd
try:    
    import Quandl as quandl
except ImportError:
    import quandl as quandl
```
plotly.offlineというのがあるので、これをインポートするとオフライン上でplotlyが使えるようになる。
今回のデータはQuandlから引っ張ってくるが、なぜか環境によっては最初のQが大文字だったり小文字だったりするので、苦肉の策。(対策がわかる方教えてください)

```py
# jupyter上に描画するためのおまじない
init_notebook_mode()

# Quadlから日経平均株価をDataframeで取得
df = quandl.get("NIKKEI/INDEX")

# ローソク足を描画
fig = FF.create_candlestick(df['Open Price'], df['High Price'], df['Low Price'], df['Close Price'], dates=df.index)
iplot(fig)
```
結果はこんな感じに↓

![newplot.png](https://qiita-image-store.s3.amazonaws.com/0/22023/a6768fb1-f624-06ae-df77-03a7ce21bd90.png)

実際にJupyterで実行してグラフにカーソルを合わせると四本値が表示される。
Ansible | YAML の yes は true / no は false と同じ意味

表題の通り。

# 作法

同じ意味だが作法があるっぽい？

[Ansibleのモジュールで使用する引数についてのメモ(随時更新)](http://qiita.com/digitalpeak/items/308888187f0451c6186a)

>論理値は使い分ける
>モジュールの引数はyes,no
>その他はTrue,False




# 参考

>Ansible doesn’t really use these too much, but you can also specify a boolean value (true/false) in >several forms:

>create_key: yes
>needs_agent: no
>knows_oop: True
>likes_emacs: TRUE
>uses_cvs: false


- http://docs.ansible.com/ansible/YAMLSyntax.html








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[baserCMS] IPアドレスによる管理画面へのアクセス制限をかける方法


baserCMSの管理画面には、ログインの仕組みがあります。
しかし、セキュリティ対策として、管理画面へのURLにのみIPアドレスなどでの制限をかけたい時があるかとおもいます。

そんな場合はドキュメントルートフォルダ内に管理画面のURL（通常admin）のフォルダを作成して、.htaccessにてIP制限をかけると簡単に実現できます。

例）
http://test.example.com/
http://test.example.com/admin/ < 特定のIPアドレス（会社内とか）からしかアクセスさせたくない！

- 下記フォルダを作成

`(baserCMS設置場所)/app/webroot/admin`
 
- .htaccessファイルを作成

`(baserCMS設置場所)/app/webroot/admin/.htaccess`

- .htaccessファイルに下記を記述

```lang:.htaccess
order deny,allow
deny from all
allow from 11.22.33.44   # アクセスを許可するIPアドレスを記述
allow from 55.66.77.88   # 同上
```

- 管理画面へのURLを調整（下記ファイルに追記の例）

`(baserCMS設置場所)/app/webroot/.htaccess`

```lang:.htaccess
RewriteEngine on

RewriteRule	(^admin/$) /admin/dashboard/index [L]   # ← ここを追記１
RewriteRule	(^admin$) /admin/dashboard/index [L]    # ← ここを追記２

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

```

以上です。

※１ .htaccessファイルを使っているので、webサーバはapacheを想定しています。
※２ webrootの位置の変更や、adminの名前を変更している場合は、読み替えて下さい。
AWSにphp 5.6+ZendFrameworkを入れる

## はじめに
AWSのデフォルトだとphp 5.3なのでｐｈｐ５．６を入れた時のメモ。
ついでにZendFrameworkを入れました。
今更需要ないと思いますが。。。

以下のものをインストールしてます。

* php 5.6
* php-ZendFramework 1.12.13

## 概要

1. 競合しそうなものを削除
2. ｐｈｐ５６のインストール
3. ZendFrameworkのインストール

## 詳細
----
#### 1. 競合しそうなものを削除
まず依存関係が邪魔するので一旦いろいろ消します。

```
# yum erase php
# yum erase httpd
```

----
#### 2. ｐｈｐ５６のインストール
めんどくさいのでphp56系全部インストール

```
# yum install php56*
```

----
#### 3. ZendFrameworkのインストール

ZendFrameworkをインストール

```
# yum install php-ZendFramework*
```
親サイト・子サイトの情報を表示する | WordPress

```php
<?php switch_to_blog( ブログID ) ?>
このタグで囲まれている間は、指定したブログIDの情報を取得
<?php restore_current_blog() ?>
```

子テーマで以下の記述をした場合、親テーマの情報を表示する

```php
<?php switch_to_blog(1) ?>
	<header>
		<div class="logo">
			<a href="<?php echo home_url(); ?>">
				<h1 class="logo"><?php echo get_bloginfo('name'); ?></h1>
			</a>
		</div>
	</header>
<?php restore_current_blog() ?>
```
jQery QuickSearchを使ってdateから年月日形式の日付項目検索

#やりたいこと
- テーブルから、指定した日付を含む行を抽出したい
- 日付指定は`<input type="date" />`でサボりたい
- テーブルの日付は日本語表示（XXXX年XX月XX日）
- keyupじゃなくてボタンクリックで検索したい

#使うもの
https://github.com/DeuxHuitHuit/quicksearch

#コード
検索ボックス

```html
<input type="date" id="date_search" />
<button id="date_search_btn" type="button">検索</button>
```

テーブル

```html
<table>
<tbody>
<tr>
<th>No.</th>
<th>名前</th>
<th>日付</th>
<tr>
<td>1</td>
<td>田中</td>
<td class="date">1980年2月26日(火)</td>
</tr>
<tr>
<td>2</td>
<td>鈴木</td>
<td class="date">1990年10月13日(土)</td>
</tr>
・
・
・
```

JS

```js
$(function() {
	// 検索ボタンクリックでsearchイベント発火
	$('#date_search_btn').click(function () {
	    $('#date_search').trigger('search');
	});

	$('#date_search').quicksearch('table tbody tr', {
	    selector: 'td.date',
	    bind: 'search',    // デフォルトのkeyupでは動かさせず、↑の検索ボタンクリックによるイベントのみで動かす
	    prepareQuery: function (val) {
	        var date = new Date(val + ' 00:00:00');
	        return date.getFullYear() + "年" + (parseInt(date.getMonth()) + 1) + "月" + date.getDate() + "日"; // 日付の変換
	    },
	    testQuery: function (query, txt, _row) {
	        if (txt.indexOf(query) === -1) {
	            return false;
	        }
	        return true;
	    }
	});
});
```
Linux | rm -f の役目は「確認を飛ばす」だけではない

「存在しないファイルを削除しようとした時」に「エラーメッセージを出さない」という効能もある。

>-f
>Attempt to remove the files without prompting for confirmation, regardless of the file's permissions. 
>If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error. 
>The -f option overrides any previous -i options.

# 例

普通なら怒られるところでも。

```
$ rm not_exist_file
rm: not_exist_file: No such file or directory
```

`-f` なら何も言われない。

```
$ rm -f not_exist_file
```

# 参考

- `rm man`








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WP REST API V2 で独自のエンドポイントを追加する

WordPressでもREST APIがプラグインで提供され、かつ、独自エンドポイントも作れるようになっていました。実装方法や説明は、色んな方がまとめてくれているので、そちらを見た方が早いです。（他力本願）
ただし、参考先のソースだと一部動かなかった部分などあったので、そこだけ補足しておきます。

## 参考URL

まずは公式
http://v2.wp-api.org/

WP REST API V2にてカスタムエンドポイントを追加するまとめ
http://kayakuguri.github.io/blog/2016/07/12/wp-rest-api-custom-endpoint/

WP REST API のドキュメントの認証ページの翻訳
http://nskw-style.com/2016/wordpress/wp-api/auth.html

WP REST APIを利用したNodeJSのWebアプリを死ぬ思いで作る
http://takahashifumiki.com/web/programing/3683/


## 注意事項
ここからが本題。

### API側
ステータスとかは、`WP_REST_Response`クラスを使うと返せるようです。ただし、参考ソースは公式ドキュメントを見るようにしましょう。

公式ドキュメント
http://v2.wp-api.org/extending/adding/

```php:my_api_sample.php
// return a response or error based on some conditional
if ( 1 == 1 ) {
	return new WP_REST_Response( $data, 200 );
}else{
	return new WP_Error( 'code', __( 'message', 'text-domain' ) );
}
```

### JS側

オレオレエンドポイントへのアクセス方法については、公式ドキュメントには何も言及が無いように見えます。（私が見落としているだけかもなので、知っていたら教えてください）

有志の方の説明を見ると、`WP_API_Settings` を使うようサンプルソースが多いのですが、動かないのでおかしいと思ってソースを確認したら、`wpApiSettings`に名称が変わっていました。そこだけ注意しましょう。

```js:my_script_sample.js
$.ajax({
    url       : wpApiSettings.root + 'wp/v2/users/me',
    method    : 'GET',
    beforeSend: function (xhr) {
        xhr.setRequestHeader('X-WP-Nonce', wpApiSettings.nonce);
    }
}).done(function (response) {
    console.log(response);
});
```

### おまけ

http://v2.wp-api.org/extending/javascript-client/
公式ドキュメントにそのまんま書いてありますが、JSからAPIアクセスするには、wp-apiスクリプトをEnqueueしてあげる必要があります。

```php:functions.php
// (1)直接enqueueする
wp_enqueue_script( 'wp-api' );
```

と直接やるか、または

```php:functions.php
// (2)アクセス処理をしているJSファイルのenqueue時に依存関係にwp-apiを指定
wp_enqueue_script( 'my_script', 'path/to/my/script', array( 'wp-api' ) );
```

このように、依存指定のところ（arrayで指定している箇所）に`wp-api`を指定すれば、(1)を記述する必要はないです。
foreachをunset() 

```php
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// この時点で、$arr は array(2, 4, 6, 8) となります

// unset($value) しなければ、$value は今でも最後の要素 ($arr[3]) を指したままです

foreach ($arr as $key => $value) {
    // $arr[3] が、$arr の各要素で上書きされて...
    echo "{$key} => {$value} ";
    print_r($arr);
}
// ...つまり、二番目から最後までの値が最後の値にコピーされていきます

// 出力
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )

```