OmniAICreator/Qiita-1.07M huggingface dataset:
「1000人を部屋に集めてお金をランダムな相手に渡し続ける」を色々条件を変えてやってみる


はじめに
=========

[「100人を部屋に集めてお金をランダムな相手に渡し続ける」とだんだんと貧富の差が生まれる](http://gigazine.net/news/20170711-random-people-give-money-to-random-other-people/) というGigazineの記事があります。

「そりゃあ、まあそうだろ」「おお、驚いた」と色々な感想があると思いますが、簡単な実験なので色々条件を変えてやってみると、意外と面白かったので紹介します。

「1000人を部屋に集めてお金をランダムな相手に渡し続ける」を色々条件を変えてやってみる
=========
100人だと少ない気がしたので1000人でやってみます。

1000人が初期に金1000を持って、各ターンで無作為に誰かに金1を渡す場合
----------------

それぞれ、10, 100, 1000, 10000ターン目の所持金額とその人数のヒストグラムは以下のようになりました。

![Kobito.0rXvUI.png](https://qiita-image-store.s3.amazonaws.com/0/11124/01a08221-ac7b-19dc-7ffb-ded92ba614b7.png "Kobito.0rXvUI.png")


基本的に、1000を中心とした正規分布っぽい感じですね。試行を繰り返すと裾野が広がっていくのがわかります。

1000人が初期に金1000を持って、各ターンで無作為に渡すが *自分より金持ちに渡す時は10%の確率で再度誰に渡すか考え直す* 場合
----------------

自分より金持ちに渡す場合に、10%の確率で渡す相手を再度決め直す場合です。

![Kobito.621N5V.png](https://qiita-image-store.s3.amazonaws.com/0/11124/c3e6e5a5-185a-2f18-06ad-49e925964842.png "Kobito.621N5V.png")


似たような分布ですが、先程より裾野が狭いです。富の再分配が行われているとでもいいましょうか。


1000人が初期に金1000を持って、各ターンで無作為に渡すが *自分より貧乏人に渡す時は10%の確率で再度誰に渡すか考え直す* 場合
----------------

先程とは逆に、自分より貧乏人に渡す場合に、10%の確率で渡す相手を再度決め直す場合です。

![Kobito.u3hiSE.png](https://qiita-image-store.s3.amazonaws.com/0/11124/3b8b2e52-2ec1-6e85-c23e-dc2bcc614bfc.png "Kobito.u3hiSE.png")


今度は逆に裾野が大きく広がりました。格差社会ですｗ
貧乏人には仕事を依頼しない社会の縮図でしょうか。


1000人が *初期に金50* を持って、各ターンで無作為に誰かに金1を渡す場合
----------------

今度は一番最初のようにお金を渡す条件は特にはないですが、最初の所持金が50だった場合です。

![Kobito.FFphBG.png](https://qiita-image-store.s3.amazonaws.com/0/11124/6e692bce-cc10-e02b-c008-abccf9cf8c9f.png "Kobito.FFphBG.png")


お金が0になる人が増え、お金を持たない人は誰にも渡さないので、かなり偏っていくようです。


スクリプト
=========
今回使ったスクリプトです。Jupyter Notebookで実行できます。

```python
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline

N = 1000  # 人数
M = 1000  # 最初の所持金
P = 0     # 金持ち・貧乏に渡す時に再考する確率. しないなら0。10%なら0.1。
plot_index = [10, 100, 1000, 10000]  # グラフ表示を行うターン番号
T = max(plot_index)
plt.figure(figsize=(24, 6))


def transfer_money(moneys):
    transfer = np.zeros_like(moneys)
    for i in range(N):
        if moneys[i] > 0:
            while True:
                to_money = np.random.randint(0, N)
                # 金持ちには渡さない場合: `moneys[to_money] > moneys[i]`
                # 貧乏人には渡さない場合: `moneys[to_money] < moneys[i]`
                if moneys[to_money] < moneys[i] and np.random.random() < P:
                    continue
                break
            transfer[i] -= 1
            transfer[to_money] += 1
    moneys += transfer

moneys = np.ones((N, )) * M

for i in range(T+1):
    if i in plot_index:
        plt.subplot(1, len(plot_index), plot_index.index(i)+1)
        ax = sns.distplot(moneys, kde=False, bins=20)
        ax.set_title("i=%d" % i)
        ax.set_xlabel("money")
        ax.set_ylabel("person count")
    transfer_money(moneys)

plt.show()
```

さいごに
=======

こういうのは楽しいですね。
UIPickerViewのattributedTitleForRowとviewForRowの使い分け

#はじめに

UITableViewCellのように「画像とテキスト」を並べたい場合、attributedTitleForRowを使う方法と、viewForRowを使う方法のいずれを採用すべきか。

<img width="410" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/84185/201a43c6-d555-c073-8421-04ad1ed4de5b.png">

#結論
横並びの場合、attributedTitleForRowで済ませたほうが実装の簡潔さになります。

これに対して、テキストの上下に画像が配置されるなどレイアウトが複雑になる場合は、viewForRowを使う必要があります。

#余談: delegateのメソッドが呼ばれる順番

ところで、UIPickerView delegateのメソッドが呼ばれる順番はどうだったでしょうか。

###1. widthForComponent

まず、ローの高さよりも先に幅を指定するメソッドが呼ばれます。

```swift
func pickerView(_ pickerView: UIPickerView,
                           widthForComponent component: Int) -> CGFloat
```

###2. rowHeightForComponent
次に、高さです。ここでは、確定したwidthを利用できます。

```swift
func pickerView(_ pickerView: UIPickerView,
                           rowHeightForComponent component: Int) -> CGFloat
```

###3. titleForRowなど
実際にローに表示する中身を指定するメソッドが呼ばれます。
3種類ありますが、仮に3つが実装されている場合は、viewForRow > attributedTitleForRow > titleForRow の順番で優先されます。
特にどのメソッドを使うかを指定する必要はありません。コードを書くだけで、優先度の高いメソッドが呼ばれます。

```swift
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView 
```

```swift
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString?
```

```swift
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
```

viewForRowを実装した場合は、attributedTitleForRow以下は無視されます。
attributedTitleForRowとtitleForRowを実装している場合、attributedTitleForRowのreturn がnilのときは、titleForRowが呼ばれます。

#関連
[UIPickerViewDelegate Reference](https://developer.apple.com/documentation/uikit/uipickerviewdelegate)
[実装例 StringPickerPopover.swift](https://github.com/hsylife/SwiftyPickerPopover/blob/master/SwiftyPickerPopover/StringPickerPopover.swift)
ゼロから始めるCocoaPods

# 環境
mac os Sierra 10.12.5
# 手順
1, gemインストール

```
$ gem install -n /usr/local/bin cocoapods
```
2, セットアップ

```
$ pod setup
```
3, プロジェクトディレクトリへ移動

```
$ cd ~/プロジェクトディレクトリ
```
4, podファイル作成

```
$ pod init
```
5,使うライブラリを記述

```rb:Podfile
# Uncomment the next line to define a global platform for your project             
   platform :ios, '9.0'
   
   target 'ディレクトリ名' do
     use_frameworks!
     pod 'ライブラリ名'  
  end
```

6, インストール

```
$ pod install
```
[Javascript] 配列の重複を取り出す方法

Javascriptでは標準で`unique`や`distinct`関数がないので、配列の重複を取り出すいくつかの方法を紹介します。

# Array.prototype.reduceを使う方法

```javascript
const animals = ["cat", "cat", "dog", "mouse", "dog"];

const distinctAnimals = animals.reduce(
  (distinct, animal) =>
    (distinct.indexOf(animal) !== -1) ? distinct : [...distinct, animal]
  , []
)

console.log(distinctAnimals)

// ["cat", "dog", "mouse"]
```

`reduce`の初期値を空の配列`[]`にし、重複がなければ、配列に入れていていく方法です。


# Array.prototype.filterを使う方法

```javascript
const animals = ["cat", "cat", "dog", "mouse", "dog"];

const distinctAnimals = animals.filter((animal, index, array) => {
    return array.indexOf(animal) === index;
});

console.log(distinctAnimals);

// ["cat", "dog", "mouse"]
```

# ES6のSetを使う方法

```javascript
const animals = ["cat", "cat", "dog", "mouse", "dog"];

const distinctAnimals = [...new Set(animals)];

console.log(distinctAnimals);

// ["cat", "dog", "mouse"]
```
文字列を1行のbase64に変換するスクリプト

WindowsやMacで文字列を1行のbase64に変換するサンプルスクリプトです。
_@DamashiGami様、@norisio様にいただいたコメントを反映しました。ご指摘ありがとうございます。_

# Windows
標準で提供されているcertutilを使用します。
certutilでbase64に変換するには入出力がファイルでなければならないので、少し使いづらいです。
そこで、以下のbatchスクリプトを作成しました。

```bat:base64.bat
REM 使用時は「-- [数字]」部分を削除してください。
@echo off
setlocal enabledelayedexpansion

set /p<NUL="%~1" > "%~dp0.tmp"  -- [1]
certutil -encode "%~dp0.tmp" "%~dp0.out" >NUL  -- [2]
for /f %%i in ('findstr /b /c:"-" /v "%~dp0.out"') do set /p<NUL="%%i"  -- [3]
echo;  -- [4]
del "%~dp0.tmp" "%~dp0.out"  -- [5]
```

### 使い方
```base64.bat 文字列```

### 動作説明
#### [1] ```set /p<NUL="%~1" > "%~dp0.tmp"```
``` %~1 ```が第一引数です。
これを```set /p<NUL=```に与えることで、改行文字を含まない文字列を標準出力に出力できます。
※ 改行文字を含めてしまうと、base64に変換したときに、改行文字まで含めた値が変換されてしまいます。

``` %~dp0 ```には```base64.bat```が存在するディレクトリのパスが格納されています。
```.tmp```は一時ファイルのファイル名です。

これらを組み合わせて、改行を含まない文字列を```.tmp```ファイルに出力しています。

#### [2] ```certutil -encode "%~dp0.tmp" "%~dp0.out" >NUL```
「```certutil -encode 入力ファイル 出力ファイル```」で入力ファイル内の文字列をbase64に変換した結果を出力ファイルに書き出します。「```>NUL```」で標準出力がターミナル上に表示されるのを抑制します。

#### [3] ```for /f %%i in ('findstr /b /c:"-" /v "%~dp0.out"') do set /p<NUL="%%i"```

ここは少し複雑なので、分割して説明します。
```for /f %%i in ('command1') do command2部分：```
```command1```部分に指定したコマンドの実行結果に応じて1行ごとに```command2```を実行します。引数で与えられた文字列が長い場合、certutilの出力結果が複数行に分かれてしまうため、ここで連結するためにforコマンドを利用します。

```findstr /b /c:"-" /v "%~dp0.out"部分：```
[2]で作成した一時ファイル「%~dp0.out」にはcertutilが出力した余分な行が含まれています。それらを除外してbase64の行だけをcommand2に渡すために、findstrコマンドを利用します。
まず、findstrコマンドに```/b /c:"-"```オプションを指定します。これにより、先頭がハイフンで始まる行にマッチします。
また、```/v```を指定することで、マッチした行以外にマッチします。これらのオプションを組み合わせることで、```%~dp0.out```ファイルの中身のうち、先頭がハイフンで始まる行以外を出力します。

```set /p<NUL="%%i"部分：```
base64に変換した結果を出力しています。

#### [4]
``` echo; ```で改行を出力します。
（コマンドプロンプト上での見た目を調節するため）

#### [5]
``` del ```コマンドで一時ファイルを削除します。


# Mac
以下のコマンドで変換できます。

```bash:base64.sh
printf "$1" | base64
```

### 使い方
```base64.sh 文字列```

### 動作説明
``` printf ```は第一引数に与えられた文字列を改行を含まずに標準出力に出力します。``` $1 ```には第一引数が格納されています。

base64コマンドは、標準入力で与えられた文字列をbase64に変換した結果を出力しますので、printfの結果をパイプすることでbase64コマンドに渡しています。
PlantUMLで気軽にUML作成

##UML作成ツールは数々ありますが
ちょっとクラス図書くだけだし、レイアウトはいい感じにしてくれないかなあ。
なんて要望に応えるべく、便利なツールを揃えたいと思います。

モデリングツールは持っているけど、プロジェクトメンバーとかクライアント全員は持ってなかったりで結局画像ファイルで配ってるんだよなあ、という場合にも良いかなと。

ツールってたくさんありますが・・[Wikipediaでツール比較]
(https://en.wikipedia.org/wiki/List_of_Unified_Modeling_Language_tools)
さくっとかけて、できればgitでバージョン管理も。
→「テキストでUML描けたらいいんじゃない？」
→ [PlantUML](http://plantuml.com/)が便利そう。
ATOMのPlantUMLプラグインを使えば、Previewしながら書けるらしい。
[AtomとPlantUMLで爆速UMLモデリング](http://qiita.com/nakahashi/items/3d88655f055ca6a2617c) を参考にさせていただき、Macに環境を整えました。

##環境
- macOS Sierra 10.12.5
- Atom 1.18.0

##前提ソフトウェア
以下は別途準備されている想定です。

- Java (PlantUMLプラグインが使用するGraphvizの動作に必要)
- Homebrew (Graphvizの導入に使用)

##セットアップ
###graphviz
Homebrewでインストールします。

```shell-session
$ brew install graphviz
```

インストールできたかチェック。

```shell-session
$ dot -V
dot - graphviz version 2.40.1 (20161225.0304)
```

ちょっと横道にそれますが、Graphvizの使い方はこちらに大変詳しくまとまってます。
[Graphvizとdot言語でグラフを描く方法のまとめ](http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d)

###PlantUML
Atomのプラグインに含まれているのでスキップ可能です。
ただコマンドから出力する際には必要なので、以下から単体のjarファイルのダウンロードをしておきます。
http://plantuml.com/download

jQueryのプラグインなんかもあるみたいですね。

###Atom PlantUMLプラグイン


Atomのパッケージ管理プログラムのapmを使用し、プレビューのためのplantuml-vieweとエディタでハイライト表示するためのlanguage-plantumlを導入します。

```shell-session
$ apm install plantuml-viewer
Installing plantuml-viewer to /Users/hiroshi/.atom/packages ✓

$ apm install language-plantuml
Installing language-plantuml to /Users/hiroshi/.atom/packages ✓
```

##実行
PlatUMLのDSLでモデルを記述し保存します。

```
@startuml
Alice -> Bob: test
@enduml 
```
[Ctrl]+[Alt]+[P] で右側にプレビュー表示。 
![Screen Shot 2017-07-11 at 17.46.07.png](https://qiita-image-store.s3.amazonaws.com/0/184931/6f325a0d-837d-1ec9-1302-d5af986ad527.png)


日本語大丈夫。特に文字化けもありません。

```
@startuml

class ユーザー {
  ユーザー名
  パスワード
  +ログイン()
}

class グループ {
  グループ名
}
　　
class メンバー {
  役割
}

ユーザー .. メンバー
グループ .. メンバー

@enduml
```
![Screen Shot 2017-07-11 at 17.29.17.png](https://qiita-image-store.s3.amazonaws.com/0/184931/bb3ec044-d134-438d-22cf-c9ddc2c9536b.png)



ただ、時折変なエラーに遭遇します。どうも日本語入力状態で、Ctrl+Alt+Pを打つと、見えない文字が入力されてしまう模様。見えない文字を削除すればエラーは解消されます。。
![Screen Shot 2017-07-11 at 17.23.34.png](https://qiita-image-store.s3.amazonaws.com/0/184931/5ab9cec3-d81f-7f7d-764f-7116aa81ab48.png)




## 参考資料
 * [PlantUML](http://plantuml.com/) : 公式サイト。
 * [PlantUML Cheat Sheet - Qiita](http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48) : PlantUML記法のまとめ。
 * [AtomとPlantUMLで爆速UMLモデリング - Qiita] (http://qiita.com/nakahashi/items/3d88655f055ca6a2617c) : 参考サイト。
[android] Android Studioで正規表現に変数を使って置換する方法

# ○AndroidStudioで置換するとき、正規表現に変数を使う
## 例

``` 正規表現する前の文字列.
"hoge"
"１００"
"トマト"
```
↓ 置換操作 (\*ctrl [macはcommand] + r)(\*正規表現regexを ☑️ )
<img width="748" alt="スクリーンショット 2017-07-11 17.24.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/50917/e65afdca-d5f1-1c2f-4d05-d24e226edc62.png">
文字列:　上→"(.*)"　　下→$1
↓


``` 正規表現した後の文字列.
hoge
100
トマト
```

\[解説\]
・()で囲んだ部分が変数$1に入る
[fish shell] AWS IAM スイッチロールを行う fisherman プラグインを作成しました


* [GitHub - aws\_swrole: Switch AWS IAM Roles and start new session\.](https://github.com/waddyu/aws_swrole)

AWSを使っていると、複数のアカウントが必要になるシーンも多いと思います。AWSはこのようなシーンに対して Switch Role を行うことを推奨しています。だいたい以下の流れになるはずです。

1. ~/.aws/config にAWS アカウント情報を書く
1. ベースとなるアカウントから切り替え先アカウントへの assume role  を行う 
    + awsコマンドを実行することで一時アクセストークンが手に入る
1. 一時アクセストークンを環境変数にセット
1. 切り替え先のアカウントで aws リソースを操作できるようになる

このプラグインは2,3を自動化するものです。 ~/.aws/config が存在すること前提となりますのでご注意ください。

## あらかじめ用意しておくもの

* [aws/aws\-cli: Universal Command Line Interface for Amazon Web Services](https://github.com/aws/aws-cli)
    * assume role の aws コマンドを実行するため使います
* [stedolan/jq: Command\-line JSON processor](https://github.com/stedolan/jq)
    * assume role の結果パースに使います

## インストール

```
fisher waddyu/aws_swrole
```

## 使用方法

```fish
aws_swrole [-o] <aws profile>
```

* -o オプションを指定すると、 AWS_XXX 環境変数をセットするためのコマンドを出力するにとどめます（セットまではしません）。
* -o オプションをつけない場合、AWS_XXX 環境変数をセットした状態で新しいシェルを起動します。
* AWSのアクセストークンは仕様に則り約1時間で無効になります。

## 使用例

```fish
$ aws_swrole
Usage: swrole [-o] <aws profile>

Defined profiles:
  development
  test
  staging
  production
```

```fish
$ aws_swrole development   
Enter MFA code > 123456

$ aws dynamodb list-tables --region ap-northeast-1
{
   "TableNames": [
       "Movies"
   ]
}
```

```fish
$ aws_swrole -o test
Enter MFA code > 123456
set -x AWS_ACCESS_KEY_ID XXXXXXXXXXXXXXXXXX
set -x AWS_SECRET_ACCESS_KEY YYYYYYYYYYYYYYYYYYYYYYYY
set -x AWS_SESSION_TOKEN ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
```


残課題
---

fish 2.7.0が待たれます。具体的には以下の課題の解決により、いくつかの追加実装が可能になります。

* https://github.com/fish-shell/fish-shell/issues/4164

2017年7月11日現在、fish には 「新しいシェルを対話モードで実行し、新しいシェルでいくつかの事前コマンドを実行する」という機能がありません。bashの場合は

```bash
ENV=test \ PASSWORD=123455 \ bash
```

というように指定することができます。これに相当する機能が fish shell に実装されると

* 新しいシェルのプロンプトを変更し、どのプロファイルを使っているのかをわかりやすくする
* シェルごとに環境変数を設定し、`aws_swrole`の多段利用でもエラーが発生しないようにする

これらに対処できます。fish shell v2.7.0 が公開され次第修正します。また、テストについても順次追加していきます。

参考
---

以下のプロジェクトを参考にさせていただきました。

* [tilfin/homebrew\-aws: AWS commands easy to manipulate on terminal](https://github.com/tilfin/homebrew-aws)
react-routerをv4にアップグレードしようとしてやめた話

業務でreact-router v2をv4にアップグレードにしようとしたけど諦めた話を書きます。
特に得るものはないですが、気持ちを鎮めるために書きます。

##使用技術
弊社では下記のような環境でWebアプリケーションを構築しています。

- React
- Redux
- redux-saga

そして、アプリケーションのルーティングに下記ライブラリを使用しています。

- react-router
- react-router-redux

主にreact-routerでページ遷移をし、react-router-reduxで履歴などを Reduxのstoreに紐付けています。

ここまではよくある構成だと思います。

##顛末
2017年3月、react-routerのv4が正式にリリースされました。
とてつもなく破壊的な内容ゆえに一大騒動となったことは記憶に新しいでしょう。

弊社でもreact-routerを使用していたので、アップデートのタイミングをうかがっていました。
そして僕がそのアップグレードを任され、いろいろと調べてみた結果、アップグレードは見送りになった、という話です。

##見送った理由

###react-router-reduxがreact-router v4に対応していない
一番大きいのがこれでした。
react-router-reduxの最新版はv4.0.8（2017年7月11日現在）ですが、それはreact-router v4に対応していません。現在、v5のβ版が鋭意開発中とのことで、それはreact-router v4に対応しているとのこと。しかし、さすがにプロダクトでベータ版を使用するのはためらわれるので、今回はreact-router-reduxのアップグレードを見送りました。
（今までは `React Community` というグループ配下に[リポジトリ](https://github.com/reactjs/react-router-redux)がありましたが、5月に `react-router` を開発している　 `React Training` 配下に[移動](https://github.com/ReactTraining/react-router/tree/master/packages/react-router-redux)しました。今後は `react-router` の公式Packageとして開発が続くようです。v5が早くリリースされることを願っています。）

###他のライブラリが使いにくい
上述の通り、react-router-reduxがreact-router v4に対応していないので、Reduxとの接続に別のライブラリを使おうと考えました。（[ルーティングライブラリ一覧](https://github.com/markerikson/redux-ecosystem-links/blob/master/routing.md)）（スターが多いものはほとんどない…）
その中で以下のライブラリが候補に上がりました。

- [connected-react-router](https://github.com/supasate/connected-react-router)

しかし、ドキュメントが少なかったり、うまく動かなかったりしたので、結局使用を断念しました。

###特に困っていない
バージョンが低いことによる弊害などは特になく、現状特に困っていませんでした。また、使用するライブラリなどを変更することでバグが起きてしまう可能性もあったので、今回はアップグレードを見送ることになりました。

##疑問
**僕らには本当にreact-router-reduxは必要なのか…？**

- ルーティングに2つのライブラリを使用するのつらい
- Reduxに履歴とか全部突っ込むなら、react-routerではなく別のライブラリを使用すべきなのでは？
- そもそもReduxにつっこむ必要あるのか？

##まとめ
react-router-redux v5出たら頑張る
ロリポップが無料で独自SSLを使えるようになったので試して見た

[「ロリポップ！」が無料の独自SSLを導入できる機能を提供開始 〜全プラン対象、サーバー月額料金のみでウェブサイトを簡単に常時SSL化〜](https://pepabo.com/news/press/201707111300)


すごいよね!やばいよね！！

独自SSLが使えるよ！！！しかもタダだよタダ！！

僕はサイトを1つ持ってるんですけど、サーバーはロリポを使ってるんですよ。

ってなわけで、今流行りの、なんか三文字の英語ってだけでかっこいいSSLを設定して見たいと思います。

先に感想を行ってしまえば、ほんと一瞬。
簡単すぎて疑うぐらい簡単。


手順


1.ロリポにログイン

2.サイドバーから
<img width="213" alt="スクリーンショット 2017-07-11 16.53.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/4ae94e50-afa7-22b2-df0e-17ea28321020.png">

「証明書お申し込み・設定」を選択
<img width="209" alt="スクリーンショット 2017-07-11 16.53.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/138ccae4-1809-93b9-dfca-0e875ccc70e5.png">

3.SSL保護されていないドメインに表示されていてSSL保護したいドメインのチェックボックスを選択
<img width="762" alt="スクリーンショット 2017-07-11 16.55.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/da4a0885-9d45-ddac-7b14-4e1f826b240d.png">
↑すでに僕はやってしまったので表示されていません。。。

4.軽くカップ麺の麺がふやける待つ(最大5分)そしてリロードする
<img width="732" alt="スクリーンショット 2017-07-11 16.59.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/093eb478-4f07-8b25-6b06-f3c6ecd154da.png">
すると、こんな感じに、保護されているドメインにさっき選んだドメインが表示されてるはず。
ちなみに僕は20秒後くらいには反映されていた感じ。

この状態で速攻自分のサイトに「https://」をつけてアクセスしたら403エラーになったんだけど、少し時間をおいて試したら
<img width="176" alt="スクリーンショット 2017-07-11 17.04.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/117128/e6d94364-1ed6-221f-7e65-234a0aca2025.png">

感動だよね。嬉しいね。一人前になった気持ちになるよね。

めっちゃ簡単にSSL保護ができるようにしてくれたGMOペパボに感謝であります。
LaravelでLINEやTwilioでメッセージを送信する場合に、bladeテンプレートを使う

# はじめに
最近仕事でLaravel上に、LINEやTwilioを使用したBOT作成に勤しんでいて、メッセージってBladeテンプレート使えないの？？
ってので、調べてみたらあっさりできてしまったのでその方法を残しておきます。

# やり方
Viewのrenderメソッドを使うと、viewの展開後文字列を取れるのでこれをメッセージとして使用すればOK。

# ソース

```blade:resources/views/bot/send.blade.php
{!! $message !!}
```

```php:app/Http/Controller/Api/LineBot.php
public static function sendText($view, $to, $message)
{
    $bot = new \LINE\LINEBot(
        new \LINE\LINEBot\HTTPClient\CurlHTTPClient('あなたLINE@のAPIトークン'),
        ['channelSecret' => 'あなたLINE@のChannelシークレット']
    );
    $textMessageBuilder = new TextMessageBuilder(view($view, compact('message'))->render());
    $bot->pushMessage($to, $textMessageBuilder);
}
```

```php:LineBot.phpを使うPHPファイル
$send_content
LineBot::sendText('bot.send', '送信先LINE ID', 'LINEに送信してみました');
```

# 解説
以下のメソッドで用意したviewにmessage変数の値が展開された状態のstringが取れるので、
これでTextMessageBuilderを作ってあげてればOK。
> view($view, compact('message'))->render()

これだけだと有難味が微妙ですが、
Webで送信メッセージを作ってDBに入れて置きあとで使う、と云った場合に改行コードなどを気にせずに値をバインドして送信できるので、
割とストレスなくコードが書けるようになるのではないでしょうか。
ImageMapの埋め込みなども、こんな感じで上手いことやりたいですが、まだ検証できてないのでそれはまた今度・・・。

# 参考
http://localdisk.hatenablog.com/entry/2014/05/26/133216
How to Add Watermark on UIImage

## Background

In my company's business flow, we will take photo on user's information, then add wateramrk on the photo. This article will try to show two ways how to add watermark on UIImage.

## Immutable Attachment

One condition is just adding some immutable pattern such as info of author and company, or logo on the photos. In this condition, we can initially put that info into a template. When handling a new photo, we can just cover the template on it. Notice that the template has a clear background color.

```objc:
- (UIImage *)addWatermarkOnImage:(UIImage *)origin withImage:(UIImage *)template {
    if (origin == nil || template == nil) return [[UIImage init] alloc];

    double width = origin.size.width;
    double height = origin.size.height;

    UIGraphicsBeginImageContext(CGSizeMake(width, height));
    [origin drawInRect:CGRectMake(0.0, 0.0, width, height)];
    [template drawInRect:CGRectMake(0.0, 0.0, width, height)];
    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}
```

## Mutable Attachement

Another condition is adding mutable info, for instance, the date, remark, etc. So when adding this type of watermark on new photo, we can print the strings on the photo directly.

```objc:
- (UIImage*)drawText:(NSString*)text inImage:(UIImage*)image {
    if (image == nil) return [[UIImage init] alloc];

    UIFont *font = [UIFont boldSystemFontOfSize:40];
    CGSize textsize = [text sizeWithFont:font];
    CGPoint margin = CGPointMake(20, 20);
    // draw text at bottom-right
    CGRect textrect = CGRectMake(image.size.width - 0.7 * textsize.width + 0.3 * textsize.width - margin.x,
                                 image.size.height - textsize.height - margin.y,
                                 textsize.width,
                                 textsize.height);

    UIGraphicsBeginImageContext(image.size);
    // draw image
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    // draw rotated text
    [[UIColor lightGrayColor] set];
    [text drawWithBasePoint:textrect.origin andAngle:-M_PI_4 andFont:font];
    // get new image
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return newImage;
}
```

## Tips

- You may fix the image orientation before adding watermark on it.
Windows版のmitmweb.exeが起動しないときはVisualStudio2015のVisualC++再頒布可能パッケージをインストールしてみる

HTTP/HTTPSの通信内容を調べたいときには mitmproxy や owasp-zap を使うことが多いと思うのですが、owasp-zap は脆弱性検査のツールなので、単に通信内容だけを見たい場合は mitmproxy のほうが便利ですよね。

そしてmitmproxyをWindowsで使う場合はPortable版のZipを使う方は割と多いんじゃないでしょうか。私の場合は複数の試験環境で共用したいのでVMware Workstationの各ゲストマシンから参照する共用フォルダに入れています。Portable版はこのような使い方ができてインストール不要なので大変助かります。

しかし、Portable版の筈なのに、なぜかこんなエラーが出て使えないことがあります。(installer 版で再現するかどうかは確認しておりません）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149350/25263df5-dbac-0530-5a05-fcf1d8086404.png)

Python35.dll が無い、とか言われても Portable 版のアーカイブにこんなものは含まれていないので困るのですが、この場合は [Visual Studio 2015 の Visual C++ 再頒布可能パッケージ](https://www.microsoft.com/ja-JP/download/details.aspx?id=48145) をインストールすると解決するかもしれません。手元の複数の環境では、いずれもこれをインストールすることで解決しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149350/b83b0283-e525-7de2-9cf2-4dc35b33347c.png)

このときにインストールすべきなのは 32bit 版の vc_redist.x86.exe であることに注意してください。


インストールすれば、このようにちゃんと起動するようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149350/2df8428a-2abc-f8dd-f263-decd3f0d1db9.png)



![image.png](https://qiita-image-store.s3.amazonaws.com/0/149350/89d77347-8c43-9e6e-2e18-d315c854f931.png)


ちなみに mitmproxy の最新版はこの記事の執筆時点（2017/7/11) では v2.0.2 でした。
https://github.com/mitmproxy/mitmproxy/releases/ より入手できます。そして赤で囲っているのが Portable 版ですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149350/4c2543c5-c678-8208-33c7-a1661d201db2.png)


# See also
https://github.com/mitmproxy/mitmproxy/issues/1763
npxが結構良さそうな件について


追記：2017/07/12 gist連携時の理解が間違ってたので修正

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">npm 5.2リリース。npmパッケージのダウンロードと実行を一度に行うCLIツールnpxが同梱された / “Release v5.2.0 (2017-07-05) · npm/npm · GitHub” <a href="https://t.co/2CXccPBqcq">https://t.co/2CXccPBqcq</a></p>&mdash; Teppei Sato (@teppeis) <a href="https://twitter.com/teppeis/status/884605783173849088">2017年7月11日</a></blockquote>

へー、と思って見に行ったら結構面白かったので雑な紹介を書いてみることにする。

* [v.5.2.0 リリースノート](https://github.com/npm/npm/releases/tag/v5.2.0)
* [npxの紹介記事](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)

この記事は紹介記事のざっくりしたサマリ相当です。

適当に20分くらい触ってわかったことだけ書いてあるので間違ってたり不正確だったりしたら別途詳解記事を書いて教えてもらえると幸いです。

## npx is 何？

1. `$(npm bin)` やってくれるマン
	* `npx tsc` は大体 `$(npm bin)/tsc` か `tsc`
	* 実際にはproject local見てglobal見てなかったらどっかに自動的に入れるとかしてくれるぽいのでもっと複雑かも
2. コマンド無かったら勝手に入れて実行してくれるマン
	* `npx create-react-app my-cool-new-app` とかやると `create-react-app` パッケージを（どっかに）インストールして `create-react-app my-cool-new-app` を実行してくれる
	* `npx -p typescript -p typescript-formatter tsfmt -r` とかもできる
		* パッケージ名とコマンド名が一致してなかったりdependencies以外の依存があったりするとちょっとだるそう
3. gistとか適当に試すマン
	* `npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32` とかやると `npm install` して bin を実行してくれるっぽい

## 使い方

npm 5.2.0 以降ならバンドルされています。つまりNode.jsにもそのうちバンドルされる…？
`npm -v` して 5.2.0以前なら、`npm install -g npm` か `npm install -g npx` の好きなほうを実行すればよさそうです。

## 何が良いのか？

ライブラリ作者がNode.js環境は整っている人に適当に何かを試させるのが簡単になる。
例えば、typescript-formatterなら `npx -p typescript -p typescript-formatter tsfmt -r` を実行してもらうだけでとりあえず動作確認してもらえる。
使う側も、コマンドを見ればどういう依存関係を追加すればどういうことができるか見ればわかるので試した後に導入も簡単。
`npx -p typescript@next -p typescript-formatter tsfmt -r` とか `npx -p typescript@^1 -p typescript-formatter tsfmt -r` みたいなこともできるので便利そうです。

~~gistにコンパイルエラーの再現環境を作っておいて `npx -c "npm run exec" https://gist.github.com/vvakame/4d882bb3f611c8c14ab86c5d18d8a9eb` とかやると手元での再現とかも一瞬で確認できます。~~
gistにコンパイルエラーの再現環境を作っておいて `npx -p https://gist.github.com/vvakame/4d882bb3f611c8c14ab86c5d18d8a9eb run-tsc` とかやると手元での再現とかも一瞬で確認できます。
便利ですね。
注意点として、gistのURLをターゲットにした場合も単にそれがinstallされて通常のnpmのルールに従ってbinが展開されてパスが通るだけなので、訂正前のように `-c "npm run exec"` とかやってもpwdで実行されてしまって再現という意味では意味がなかったです。
この記事を最初に書いたときは再現環境直下で試したので上手く動いたように誤解してしまっていました。
再現環境下で動かすには結局何らかのトリックが必要になります。
例えば[こういうshell scriptで仲介](https://gist.github.com/vvakame/4d882bb3f611c8c14ab86c5d18d8a9eb#file-run-sh)するとか。

どこにcloneとかinstallとかされて実行されているのかはよくわからないので、実はgistの設定ではなくてproject localとかglobalのコマンドを実行していてハマる… というパターンもありそうです。がんばりましょう。
ちなみに僕の環境のデフォルトだと `~/.npm/_npx/` の下にパッケージが展開されていたりしました。

じゃあくな使い方も簡単にできそうなので使わせる方も使う方もじゃあくにやられないように気をつけましょう。
Spotlightでテキストが入力できない

## 環境
* macOSSierra v10.12.1
* MacBookPro TouchBarモデル 15inch


## Spotlight再起動で復旧

Spotlightで突然，キーボードからの入力が全くできなくなるときがある．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/18cf7e6d-98fb-d54e-1cdc-13753242644e.png)

Utilities > Activity Monitor > 「Spotlight」で検索 > For a process to quit (メニューバーの左上のｘ) 
で正常に動くようになる．

<img width="800" alt="Screen Shot 2017-07-11 at 16.30.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/31862/b760084b-5c82-58a6-c4af-a053d10bcf33.png">
java.nio的に読み書き

今更感ありあふれますがさっくり。
ついStream直で書いちゃう癖なおしたいですね。

##不定の型に対する場合
```Channels.java
ReadableByteChannel inChannel = Channels.newChannel(InputStream);
WritableByteChannel outChannel = Channels.newChannel(OutputStream);

ByteBuffer buffer = ByteBuffer.allocate(102400);

for (int readBytes = inChannel.read(buffer); readBytes != -1; readBytes = inChannel.read(buffer)) {
    buffer.flip();
    outChannel.write(buffer);
    buffer.clear();
}
```

##ファイルの読み書き1
```FileChannel1.java
File srcFile = new File(IN);
FileChannel in = new FileInputStream(srcFile).getChannel();
FileChannel out = new FileOutputStream(new File(OUT)).getChannel();

out.write(in.map(FileChannel.MapMode.READ_ONLY, 0, srcFile.length));
```

##ファイルの読み書き2
```FileChannel2.java
FileChannel in = new FileInputStream(new File(IN)).getChannel();
FileChannel out = new FileOutputStream(new File(OUT)).getChannel();

in.transferTo(0, in.size(), out);
```
~dots.~TECH PLAYの大阪新着RSS by Feed43

タイトル書いた瞬間改名？に気づいた。
もしかして別サービス？


https://feed43.com/5578438661777540.xml

# 免責

* 無関係なリコメンドイベントは外せなくて1 + 15件
* 参加者周りはズボラ。予約0人でHTMLも変わるので。
* サムネ・主催名もあったりなかったりするので省略
* 転載元はロゴにしているのでRSS連携先如何では表示されないかも
* 動作確認はしていない

# <i class="fa fa-book"></i> 参考

* [.dotsとconnpassの新着イベントをRSS化する - Qiita]
* [Feed43を使ってRSSフィードを独自のカテゴリ・範囲で自作する - 試纏]


# コード

## Address

`https://techplay.jp/event/search?keyword=&pref=27&sort=created_desc`

## Item (repeatable) Search Pattern

```
<div class="eventlist clearFix">
{*}<div class="date">
{*}<div class="year">{%}</div>
{*}<div class="day">{%}</div>
{*}<div class="time">{%}</div>
{*}<div class="place">{%}</div>
{*}<div class="apilogo"><img src="{%}" width="100" height="15"></div>
{*}<h3><a href="{%}" target="_blank">{%}</a></h3>
{*}<div class="count">
{*}{%}</div>
```

### いちサンプル

```
{%1} = 2017
{%2} = 07/25(火)
{%3} = 13:30〜15:00
{%4} = 大阪府 天満橋
{%5} = https://techplay.jp/images/top/apilogo_dots.png
{%6} = https://techplay.jp/event/627549
{%7} = 「WEB広告で6倍超の効果！成功事例に学ぶ、データドリブン・マーケティングの最新動向」
{%8} = <span class="accepted">1人</span><br> 定員10人
```

## Item Title Template

`{%7}`

## Item Link Template

`{%6}`

## Item Content Template

```
開催日 :  {%1}/{%2} {%3}<br>
場所 : {%4}<br>
人数 : {%8}<br>
<img src="{%5}">

```

# 感想

RSS化できるのはよかった。
しかし、Feed43のSearch Patternの組み方がよくわからず、HTMLの改行？にうまく対応できなかった。その為、改行？ごとに`{*}`を入れて対応したが、`{*},{%}`は合計20個までしか使えないので、もうちょっと1アイテムが大きくなると、足りなくなる。
一行につき最低でも改行用の`{*}`と取得用の`{%}`が必要だから。
たぶんここは調査不足。


[.dotsとconnpassの新着イベントをRSS化する - Qiita]:http://qiita.com/ryskiwt/items/8292edc97947a063b290
[Feed43を使ってRSSフィードを独自のカテゴリ・範囲で自作する - 試纏]:http://try-and-matome.hatenablog.jp/entry/20170222_create-your-own-rss-feed-by-feed43
ActiveRecord::Enumのbefore_type_castは必ず数値を返すわけじゃない

```Ruby
class Monster < ActiveRecord::Base
  enum element: [ :fire, :water, :dark ]
end

```
こんなモデルがあったとして、

```Ruby
monster = Monster.new
monster.element = 1
monster.element # => "water"
monster.element_before_type_cast #=> 1
```
という挙動をするのでenumの数値を取るときに使われがち。

しかし、


```Ruby
monster = Monster.new
monster.element = :fire
monster.element # => "fire"
monster.element_before_type_cast #=> :fire
```

シンボルで代入するとbefore_type_castはシンボルを返す。
素直に```Monster.elements[monster.element]```とするのが無難っぽい。

そもそもとしてEnumの元の数値を使って何かするというのが微妙なのかもしれない。
Cognosのログ(cogserver.log)を見る時に便利なツール

##概要
Cognosで障害や不具合が発生すると、cogserver.logを参照すると思います。
こんな感じのログを目を凝らしながら見てますよね。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/0d88b9ee-4c77-f908-7da3-4db44f6d267a.png)

このログは、タブで分かれていて、各列に意味があるのですが、ログファイル内にそれが書かれてないので、読むのになかなかの経験を要します。

このログを、テキストファイルとして読むのではなく、もっとわかりやすく参照できるツールの紹介です。

##内容
そのツールというのが、Cognos導入ディレクトリの下のbin64フォルダにある、「logviewV2.exe」というツールです。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c352b8b7-b11e-2729-d920-51ead45141ca.png)

これをダブルクリックで実行し、「File」メニューの「Load Cognos Log File」からcogserver.logを指定すると、こんな感じに見えます。
Session IDとか、Statusとか、列名が表示されているのがうれしいですね。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b4d269a7-a315-5bd2-d0ed-e404e3cc8d5c.png)

ログ表示のフィルターもできます。
例えば、Status列がWarningかFailureのものだけに絞ってみましょう。
左下のフィルターアイコンをクリック、適当な名称を入れてEdit、「Status」をチェックしAddしてOK。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c5ae03ce-0e1b-04ed-ce94-eff28cb52e08.png)

すると、Statusのレベルを聞かれるので、FailureとWarningを選択しOK。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/86c2f210-b1f0-88aa-a378-91180d2d8b7d.png)

Ruleにそれっぽい記載がある事を確認しOK。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/dc9430a1-6cdf-5904-3a57-1efd25535cfb.png)

左下のFiltersのウィンドウに「Status」と名前付けたフィルターのエントリーが表示されるので、チェック。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/86224c1d-303c-d9df-9a79-a0ee32f6554e.png)

するとこんな感じにStatusがWarningとFailureのエントリーのみの表示になり、エントリーをダブルクリックすると、下部ウィンドウで細かいメッセージが確認できます。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/051fbaef-3194-a0de-4250-877a760cf8bb.png)

という感じです。
是非Cognos PDの際にご活用下さい。
Babel環境を構築

備忘録のため投稿します。
(Babel単独で使用するときのもの)

※gulpでBabelを使用するときの手順はこちらにまとめてます。
[gulp入門と備忘録から作業前の環境構築のパターンまで](http://qiita.com/macotok/items/241ed1f832746f4f9ce1#%E8%A4%87%E6%95%B0%E3%81%AEjs%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B5%90%E5%90%88%E3%81%97%E3%81%A6min%E5%8C%96%E3%81%95%E3%81%9B%E3%82%8B%E5%A0%B4%E5%90%88)

## Babelとは

> 次世代のJavaScriptの標準機能を、ブラウザのサポートを待たずに使えるようにするNode.js製のツールです。次世代の標準機能を使って書かれたコードを、それらの機能をサポートしていないブラウザでも動くコードに変換（トランスパイル）します。
「次世代のJavaScriptの標準機能」というのはECMAScript（以降、ESと呼びます）のバージョン6や7で追加された（る）機能、そしてさらにその先の標準機能です。

引用元：[Babelの手ほどき](https://app.codegrid.net/entry/babel-1)

## 手順

- ローカルにインストール
- package.json生成
- .babelrcを生成
- es6でjsファイルを書く
- コンパイル作業
- ファイルの監視(watch適用)

### ローカルにインストール

``` command:command
$ npm install --save-dev babel-cli
$ export PATH=$PATH:./node_modules/.bin
```

### package.json生成

公式サイトを参考
[http://babeljs.io/docs/usage/cli/](http://babeljs.io/docs/usage/cli/)

### .babelrcを生成
「babel-preset-es2015」をインストール

``` command:command
$ npm install --save-dev babel-preset-es2015
$ echo '{ "presets": ["es2015"] }' > .babelrc
```

### es6でjsファイルを書く

``` javascript:input.js
class App {
  constructor() {
    console.log('class syntax');
  }
}

const func = () => {
  console.log('arrow function');
};
```

### コンパイル作業

``` command:command
$ babel input.js --out-file output.js
```

es6以前のコードにコンパイルされる

``` javascript:output.js
'use strict';

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var App = function App() {
  _classCallCheck(this, App);

  console.log('class syntax');
};

var func = function func() {
  console.log('arrow function');
};
```

### ファイルの監視(watch適用)

``` command:command
$ babel input.js --watch --out-file output.js
```

## 参考サイト

- [Babel CLI（babelコマンド）の使い方](https://mae.chab.in/archives/2845)
簡単Dos攻撃対策

# 前書き
今さらですが、Dos攻撃対策の1つ、mod_dosdetector について、ササっと。
設定作業をメインに記載します。
詳細は、いろいろなページがあるので、そちらでパラメータの確認を行ってください。

# インストール

```
apxs(httpd-develに入ってます） とgcc、wget を利用するので、入ってなければ入れときましょう。

# yum install httpd-devel gcc wget
# cd /tmp
# wget http://ncu.dl.sourceforge.net/sourceforge/moddosdetector/mod_dosdetector-0.2.tar.gz
# tar zxfv mod_dosdetector-0.2.tar.gz
# cd mod_dosdetector-0.2
# make 
# make install

```

インストールは、これで完了です。
make やmake install したときに何かしら表示されますが、error が出なければ大丈夫！
インストールが完了すると、/etc/httpd/conf/httpd.conf がバックアップされ、
httpd.conf.bak が出来上がってます。

```
この1文がhttpd.confに書き込まれからですね。

LoadModule dosdetector_module /usr/lib64/httpd/modules/mod_dosdetector.so

```

設定しましょ。

# 設定
/etc/httpd/conf/httpd.conf の一番下に次の要に記載します。

```
RewriteEngine on
DoSDetection     on
DoSPeriod        10
DoSThreshold     100
DoSHardThreshold 100
DoSBanPeriod     3600
DoSTableSize     3000
RewriteCond %{HTTPS_HOST} hogehoge\.jp
RewriteCond %{ENV:SuspectHardDoS} .+
RewriteRule .* - [R=503,L]
ErrorDocument 503 "503 Forbidden."
DoSIgnoreContentType  image|javascript|css
DoSIgnoreIpRange 127.0.0.1


```

ここでは、10秒間に100回のアクセスが来たら、503エラーを返して1時間（3600秒）その状態を維持します。
パラメータについては、こちらを参照してみてください。
[株式会社prophetさんのSTAFF BLOG](http://blog.prophet.jp/1175)


/var/log/httpd/error_log にこんなログが出ます。

```
[Tue Jul 11 04:55:19 2017] [notice] dosdetector: 'XX.XX.XX.XX' is suspected as DoS attack! (counter: XX)

```


ちゃんとチューニングしましょうね。
Matrix2Dで回転移動・対称移動を試みるも失敗したので、座標をあれこれいじるも上手く行かない。

[Matrix2D | CreateJS](http://labo.project-nya.jp/createjs/matrix2d/ver0/)

回転移動、対称移動だけなら、上手く行ってるけど、
回転移動・対称移動の組み合わせで、変な移動をするので、改良の余地あり。
MySQLのリモートアクセスができない時

サーバにあるMySQLに対してローカルからリモートアクセスしようとした時のメモ。
ポートの確認・設定には触れていません。

#環境
CentOS Linux release 7.3.1611
MySQL MariaDB 5.5.52

#設定手順
**bind-addressの確認**
`$ netstat -ant`で確認すると「127.0.0.1:3306」でLISTENされている。
これを「0.0.0.0:3306」に変更する。

**bind-addressの設定**
/etc/my.cnfに「bind-address」の項目がある。
これをコメントアウト。

**mariadbをリスタート**
`$ systemctl restart mariadb.service`で再起動
Istio のサンプルに出てきた正規表現を理解する

Istio のサンプルの bookinfo に`re =/^(.*?;)?(user=jason)(;.*)?$/` という正規表現が出てくる。
これは、Cookie にマッチさせるための表現らしい。

ところが、これをTypeScript で次のようなプログラムを作ってみるとマッチしない。正規表現がテストできる、このサイト[Regular Expression Test Drive](http://regex-testdrive.com/ja/dotest)の方でもマッチしない。しかし、サンプルは正常に動作している。とても気になったので上記の正規表現をちゃんと理解してみようと思った。

# ^ 先頭からのマッチ

まず汎用の下記のような関数を書いてみる。

```
function exec(re: RegExp, matches: Array<string>) {
    for (let chr of matches) {
        console.log(`***: ${chr} :***`);
        console.log(re.exec(chr));
    }
}

```

^ は先頭からのマッチなので、下記のようにすると、予想どおり、最後の１つを除いてマッチする。

```
// ^ 
console.log("^ ----");
let matches = ["hello", "hey", "head", "hinder"];
re = /^/
exec(re, matches);
```

# . 任意の１文字

. は任意の一文字。改行はふくまれないので、これも最後以外はマッチ。
 
```
// .
console.log(". ----");
matches = ["a", "1", "*", "\n"];

re = /./
```

#  () グループ と?　直前の 0 もしくは 1 回の出現

`*` は直前の0もしくは複数の繰り返しなので `.*` で任意の文字列。つまり()の中は任意の文字列; のパターンになる。下記の結果は、`(.*;) user=jason` だと、最後の `user=jason` を除いてマッチする。`(.*;)?user=jason

最初の、`(.*;)user=jason` にはいづれもマッチしない。必ずxxx; のパターンを要求するので。?をつけると、0 か、1の出現なので、なくてもよくなるので、マッチする。ちなみに、`/(.*;) user=jason/` にすると、最初の２つだけマッチする。３つ目は、スペースが入っているのでマッチしない。

```
console.log("(.*;) -----");
re = /(.*;)user=jason/;
matches = ["name=ushio; user=jason",
           "name-ushio; some=yamagata; user=jason",
           "user=jason"]
exec(re, matches);

// (.*;)? 
console.log("(.*;)? ----");
re = /(.*;)?user=jason/;

exec(re, matches);
``` 

# そして、本来の理解

Cookie は、 name=xxxx; user=jason; ... " という形態で記述される。

であるので、`/^(.*?;)?(user=jason)(;.*)?$/`に関しては、マッチちない。`name=xxx; user=jason` はマッチしない。`user=jason` はマッチするけど。理由は、先頭マッチの場合は、user=jason のスペースがマッチしないから。

```
let ma = ["NAME=v2tester; user=jason", "user=jason"];
re =/^(.*?;)?(user=jason)(;.*)?$/

console.log ("------------------ answer");
console.log(exec(re, ma));
```

こう変えるとちゃんとマッチする。なぜ上記のでIstio はオッケーなのかが謎なので質問してみる。

```
ma = ["NAME=v2tester; user=jason", "user=jason"];
re =/^(.*?;\s?)?(user=jason)(;.*)?$/

console.log ("------------------ answer2");
console.log(exec(re, ma));
```
Windows10にVirtualBoxとUbuntuをインストール


# はじめに

Linuxの動作環境を作るために、WindowsマシンにVirtualBoxをインストールし、そこにUbuntuをインストールしました。インストール手順の備忘録です。

TechPitに詳しい教材がありますので、こちらもご参考にしてください。
https://www.techpit.jp/courses/190

# 大まかな流れ

    1. VirtualBoxをダウンロード
    2. VirtualBoxをWindowsにインストール
    3. Ubuntuをダウンロード
    4. UbuntuをVirtualBoxにインストール

# VirtualBoxをインストール

   - VirtualBoxのサイトにアクセスする　 [VirtualBoxのサイト](https://www.virtualbox.org/wiki/Downloads)
   - サイトから「Windows hosts」を選択するとダウンロードが開始されます。
   - ダウンロードされたファイルをクリックして実行する。
   - ウィザードに沿って「Next」で進めていく。
   - ウィザードで「Install」をクリックするとインストールが開始。
   - 途中でこのような画面が出てくる。仮想ディバイスとは、仮想マシンで認識されるディバイスとホスト側のディバイスとでやり取りする橋渡し役のようなもの。「インストール」をクリックする。
![Ubuntuｲﾝｽﾄｰﾙ記事01.png](https://qiita-image-store.s3.amazonaws.com/0/94029/2ab5f1fa-00c1-68c4-4ad8-405a20471421.png)
   - インストールが完了すれば「Finish」をクリックして終了。


# VirtualBoxの設定

   - ディスクトップにある「Oracle VM VirtulaBox」のアイコンをクリックして起動。
   - メイン画面から「新規」をクリック。
   - 次の画面が出てきます。「名前」は仮想マシン名を任意で入力。「タイプ」は「Linux」、「バージョン」は「Ubuntu(64-bit)」を選択する。「メモリーサイズ」は「1024MB」とした。「1024MB」以上が推奨されている。
   ![Ubuntuｲﾝｽﾄｰﾙ記事02.png](https://qiita-image-store.s3.amazonaws.com/0/94029/a92cc021-0bbf-6a6e-d09f-33ba17d58bcb.png)
   - 「作成」をクリックすると、次の画面が出てきます。ファイルサイズは「12GB」にした。Ubuntuをインストールすると、システムだけで5GBとるみたいなので、やや多めに取っておいた方が無難だろう。他の設定はデフォルトのまま。
      ![Ubuntuｲﾝｽﾄｰﾙ記事03.png](https://qiita-image-store.s3.amazonaws.com/0/94029/a026e3e2-ea2d-eb6f-fdee-7af39f56d4ff.png)

   - 「作成」をクリックして完了。
   
# Ubuntuのインストール

   - Ubuntuのサイトにアクセスする。　 [Ubuntuのサイト](http://www.releases.ubuntu.com/16.04/)
   - 今回ダウンロードするバージョンは「Ubuntu 16.04 Desktop LTS」。因みに、LTSとは、Long Term Supportのことで、通常バージョンよりも長期間サポートが受けられるバージョンということ。このバージョンでは、2016年4月～2021年4月まで5年間サポートを受けることができる。
   - 「64-bit PC (AMD64) desktop image」をクリックしてダウンロードする。64ビット版なのでこっちになる。Intelの「x86-64」アーキテクチャのCPUであるが、Linux版では「AMD64」といういい方をする。
   - ダウンロードが終了したら、ディスクトップの「Oracle VM VirtulaBox」のアイコンをクリックして「VirtulaBox」を起動する。
   - メイン画面にある「起動」（緑色の右矢印）をクリックする。
   - 次の画面が表示されるので、ダウンロードしたUbuntuのイメージファイル（拡張子がiso）を選択して「起動」をクリック。
   
![Ubuntuｲﾝｽﾄｰﾙ記事04.png](https://qiita-image-store.s3.amazonaws.com/0/94029/6e5af764-1f80-0f95-c5c5-7abd794ce8d6.png)

- 次の画面が表示されるので「Ubuntuをインストール」を選択する。デフォルトでは英語表示になっているので、右の一覧から日本語を選択する。因みにだが「Ubuntuを試す」を選択する場合は、UbuntuをCD-ROM等の媒体に焼いて、HDDにインストールすることなく、媒体から起動するような使い方をしたい場合に選択する。　
![Ubuntuｲﾝｽﾄｰﾙ記事05.png](https://qiita-image-store.s3.amazonaws.com/0/94029/ee04806a-b9ec-c563-c080-5461c901bb79.png)

    - 「Ubuntuのインストール中にアップデートをダウンロード」にチェックを入れて「続ける」をクリック。
    - 「ディスクを削除してUbuntuをインストール」にチェックを入れて「インストール」をクリック。
    - タイムゾーンの画面で「Tokyo」を指定して「続ける」をクリック。
    - キーボードレイアウトは「日本語」を選択して「続ける」をクリック。
    - ユーザ情報を入力して「続ける」をクリック。パスワードは忘れないようにメモっておきましょう。
    - インストールが開始されます。終わったら「今すぐ再起動する」をクリック。この後が多少長いので辛抱。
    - ログイン画面が表示されるとめでたく完了です。お疲れさまでした。
jQueryでモーダルウィンドウ


「作りながら学ぶ jQueryデザインの教科書」より

# モーダルウィンドウの実装

### 完成イメージ
モーダル出現を押すとモーダルが出てくる
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/142918/d3b001d4-c8f3-aad4-7e86-1485e2aa6b84.png)

モーダルのイメージ
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/142918/93d568a9-c333-1c72-028f-278a58d5d6a8.png)

### ソースコード
解説は後日

```modal.html 
<a herf="#" class="show-modal">モーダル出現</a>
<div id="modalwin" class="modalwin hide">
    <a herf="#" class="modal-close"></a>
    <h1>タイトル</h1>
    <div class="modalwin-contents">
        <img src="img/nomad_surfing_nangoku.png">
        <p>テキスト</p>
        <button>閉じる</button>
    </div>
</div>
```

```modal.css
        /*▼▼▼モーダル▼▼▼*/

        .modalwin {
            position: fixed;
            width: 600px;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 2px 4px 0 #000;
            z-index: 1;
        }

        .modalwin dl {
            padding: 0px 10px;
        }

        .show {
            display: block;
        }

        .hide {
            display: none;
        }

        .modalwin h1 {
            background: #ededed;
            padding: 20px;
            border-radius: 5px 5px 0 0;
            font-size: 1.2em;
            margin-top: 0;
            text-align: center;
        }

        .modalwin-contents {
            padding: 5px;
        }

        .modalwin-contents img {
            margin: 0 0 1em 0;
            float: left;
            width: 30%;
            height: 30%;
        }

        .modalwin-contents p {
            margin: 0 0 1em 0;
            line-height: 1.8em;
        }

        #shade {
            position: fixed;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            background-color: #999;
            opacity: 0.9;
            z-index: 1;
        }

        @media screen and (max-width: 600px) {
            .modalwin {
                width: 90%;
            }
        }
```

```modal.js
    $(function () {
        // モーダルウィンドウを開く
        function showModal(event) {
            event.preventDefault();

            var $shade = $('<div></div>');
            $shade
                .attr('id', 'shade')
                .on('click', hideModal);


            var $modalWin = $('#modalwin');
            var $window = $(window);
            var posX = ($window.width() - $modalWin.outerWidth()) / 2;
            var posY = ($window.height() - $modalWin.outerHeight()) / 2;

            $modalWin
                .before($shade)
                .css({left: posX, top: posY})
                .removeClass('hide')
                .addClass('show')
                .on('click', 'button', function () {
                    hideModal();
                });
        }

        function hideModal() {
            $('#shade').remove();
            $('#modalwin')
                .removeClass('show')
                .addClass('hide');
        }

        $('.show-modal').on('click', showModal);

    }());
```
php-fpmをsystemdで動かす時のメモ

# php-fpmをsystemdで起動する時にハマったのでメモ

## 環境
```
CentOS 7
PHP 7.0.6 (fpm-fcgi)
```

## `# systemctl start php-fpm.service`のエラー
```
# journalctl
Started php-fpm service.
Starting php-fpm service...

php-fpm.service holdoff time over, scheduling restart.
Started php-fpm service.
Starting php-fpm service...
php-fpm.service holdoff time over, scheduling restart.
・
・
・
start request repeated too quickly for php-fpm.service
Failed to start php-fpm service.
```
たぶん、systemdがphp-fpmのPIDを自動判定できず、怒られている。

## /etc/systemd/system/php-fpm.service
```
[Unit]
Description = php-fpm service

[Service]
PIDFile = /var/run/php-fpm/php-fpm.pid
ExecStart = /usr/local/php/7.0.6/sbin/php-fpm --fpm-config /usr/local/php/7.0.6/etc/php-fpm.conf

Restart   = always
Type      = simple
User      = nobody
Group     = nobody

[Install]
WantedBy = multi-user.target
```
php-fpmが、rootユーザで実行されることを嫌うので、nobodyユーザで実行するようにしている。

## /usr/local/php/7.0.6/etc/php-fpm.conf
```
pid = /var/run/php-fpm/php-fpm.pid
```
PIDファイルを指定する。

## /usr/local/php/7.0.6/etc/php-fpm.d/confファイル
```
listen = /var/run/php-fpm/php-fpm.sock
```
ソケットファイルを指定する。
実行ユーザ・グループの設定は `php-fpm.service` で指定したユーザ・グループ。

## /var/run/php-fpm
```
$ ls -al /var/run/php-fpm
drwxr-xr-x   2 nobody  nobody           80 2017-07-11 13:18 php-fpm
```
PIDファイル・ソケットファイルを置くディレクトリ
所有者を変更しておく。
cron 設定手順

#cron インストール
CentOS7では初期設定でcronie-anacronがインストールされており、
ジョブの実行時間に幅を持たせている。
指定日時ぴったりにジョブを実行したい場合、cronie-noanacronを入れる必要がある。

依存関係上先に、cronie-noanacronをインストールし、その後にcronie-anacronを削除する。
yum -y install cronie-noanacron
yum -y remove cronie-anacron

#/etc/crontab 修正

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

\# For details see man 4 crontabs

\# Example of job definition:
\# .---------------- minute (0 - 59)
\# |  .------------- hour (0 - 23)
\# |  |  .---------- day of month (1 - 31)
\# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
\# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
\# |  |  |  |  |
\# *  *  *  *  * user-name  command to be executed

以下、追記する。
分 時 日 月 曜日 ユーザ <実行コマンド>
0 4 * * * root /tmp/delete/file-delete.sh

分	0-59
時	0-23
日	1-31
月	1-12
曜日	0-7 (0または7は日曜日）
0=日、1=月、2=火、3=水、4=木、5=金、6=土、7=日
[ELB(CLB)]忘れがちな細かいTips


忘れがちな細かいことを書いたTipsです。

# バックエンドインスタンスとの疎通ができない場合

## HTTP/HTTPS通信に対するSecurity Groupが削除された(オペミス)

ELBは[HTTP 504:Gateway Timeout](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/ts-elb-error-message.html#ts-elb-errorcodes-http504)を返す（その間リクエスト元は待たされる)
CloudWatch metrics: HTTPCode_Backend_5XX に記録される。

or

ELBのバックエンドインスタンスへのヘルスチェックが失敗し、UnHealthyHostCountが上がる→バックエンドインスタンスが全滅したとみなし、[HTTP 503: Service Unavailable](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/ts-elb-error-message.html#ts-elb-errorcodes-http503)を返す。
CloudWatch metrics: HTTPCode_ELB_5XX に記録される。


どちらが返るかはELBの設定値に依存し
　　- Idle Timeout([HTTP 504:Gateway Timeout](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/ts-elb-error-message.html#ts-elb-errorcodes-http504))
　　- Health checkのInterval x Unhealthy threshold([HTTP 503: Service Unavailable](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/ts-elb-error-message.html#ts-elb-errorcodes-http503))
の短い方が返る。
レンタルサーバーの「Value Server」でComposerを利用する方法


## 条件
* [Value Server エコプラン](https://www.value-server.com/spec/)
* SSHでサーバーに接続可能。

## 手順

Composerは標準でインストールされているが、そのまま実行するとエラーが出る。

```
$ composer

You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug

                                           
  [ErrorException]                         
  Invalid argument supplied for foreach()  
                                           
```

CLI版から実行すると動作する。

```
$ which composer
/usr/bin/composer
```

*php5.6*

```
$ php56cli /usr/bin/composer

You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.0-dev (f25446e507a3f420b2b88e6dedc47787d42ea7e9) 2015-12-15
```

*php7.1*

```
$ php71cli /usr/bin/composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.0-dev (f25446e507a3f420b2b88e6dedc47787d42ea7e9) 2015-12-15
```

### Composerのバージョンを最新にする

標準でインストールされているものはバージョンが古いため、最新版にしたい場合はダウンロード
する。

```
$ curl -sS https://getcomposer.org/installer | php71cli

All settings correct for using Composer
Downloading...

Composer (version 1.4.2) successfully installed to: /virtual/culture24/composer.phar
Use it: php composer.phar
```

最新版を実行してみる。

```
$ php71cli composer.phar

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.4.2 2017-05-17 08:17:52
```

.bashrcへエイリアスを登録して`composer`コマンドで利用可能とする。

```
$ vi .bashrc

#追記
alias composer='php71cli ~/composer.phar'

$ source ./.bashrc
```
【Xcode】コンパイル時に64bitかどうか判定する

# はじめに

Xcodeコンパイル時に64bitか32bitで処理を分けたいケースがあったので備忘録としてまとめました。

# サンプルコード
```
/* Swift */
#if (arch(arm64) || arch(x86_64))
    print("64bit cpu")
#else
    print("32bit cpu")
#endif
```
```
/* Objective-C */
#if __LP64__
    NSLog(@"64bit cpu");
#else
    NSLog(@"32bit cpu");
#endif
```
```
/* C++ */
#if __LP64__
    printf("64bit cpu\n");
#else
    printf("32bit cpu\n");
#endif
```

# 環境
Xcode Version 8.3.3 (8E3004b)
【Xcode】iOSシミュレータビルドかどうか判定する

# はじめに
Xcodeコンパイル時にiOSシミュレータか実機で処理を分けたいケースがあったので備忘録としてまとめました。

# サンプルコード
```
/* Swift */
#if (!arch(i386) && !arch(x86_64))
    // 実機
#else
    // シミュレータ
#endif
```
```
/* Objective-C */
#if TARGET_OS_SIMULATOR
    // シミュレータ
#else
    // 実機
#endif
```
# 環境
Xcode Version 8.3.3 (8E3004b)

# 参考
[https://blog.ymyzk.com/2015/12/ios-tvos-watchos-architectures/
](https://blog.ymyzk.com/2015/12/ios-tvos-watchos-architectures/)