OmniAICreator/Qiita-1.07M huggingface dataset:
DataDog Log Managementを使って、インフラダッシュボードから関連するログまでひとっ飛び

# DataDog Log Managementとは？
- DataDog上で[各種ログを管理するサービス](https://www.datadoghq.com/log-management/) です。
- 2017/12時点ではβ版でしたが、2018/3に generally availableになりました。

# 何ができるのか？
容易にログ管理ができて、トラブルシューティングが楽になるツールです。
インフラメトリクスのダッシュボードから関連するログへジャンプできたりします

その他、一般的な用途としては

- 複数ノードのログ集約
- ログフィルタリング、およびタグ管理
- 可視化、およびアラート通知
- ログ処理のパイプライン構築

などができます。

# 使ってみる
- Install方法は[こちらに書いてある](https://github.com/DataDog/datadog-agent/blob/master/docs/agent/upgrade.md) ので割愛。
- Log ManagementはDataDog Agentのversion 6.0以降の機能なので、5系以前の場合はupgradeする必要があります。


## 設定内容
- 1. Logs agentをONにします。

```/etc/datadog-agent/datadog.yaml
logs_enabled: true
```

- 2. nginx用のconfに以下を書きます。（今回の例はnginxのログ出力）

```/etc/datadog-agent/conf.d/nginx.d/conf.yaml
logs:

    # - type : (mandatory) type of log input source (tcp / udp / file)
    #   port / path : (mandatory) Set port if type is tcp or udp. Set path if type is file
    #   service : (mandatory) name of the service owning the log
    #   source : (mandatory) attribute that defines which integration is sending the logs
    #   sourcecategory : (optional) Multiple value attribute. Can be used to refine the source attribtue
    #   tags: (optional) add tags to each logs collected

  - type: file
    path: /var/log/nginx/access.log
    service: nginx
    source: nginx
    sourcecategory: http_web_access

  - type: file
    path: /var/log/nginx/error.log
    service: nginx
    source: nginx
    sourcecategory: http_web_access
```

- 3. datadogをrestartします。

```
datadog-agent stop
datadog-agent start
```

※ datadogのversion6.0以降はSysVinitがサポートされないため、AmazonLinux (ver1) など、init.dを使うようなOSでは、[コマンド](https://github.com/DataDog/datadog-agent/blob/master/docs/agent/changes.md#cli) が5系から少し変わります。


## 出力内容
上記でnginx用の設定は完了。
これでインフラダッシュボードの気になるポイントから対応するログまでひとっ飛び!!
![datadog_v6_01.gif](https://qiita-image-store.s3.amazonaws.com/0/95146/9041243b-2b74-f554-4c6f-3c533ea9336e.gif)


# 2018.3.27時点で対応しているサービス

<img width="645" alt="スクリーンショット 2018-03-27 13.15.48 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/95146/b925dd12-0990-a589-2a58-fad49fe764f2.png">
<img width="260" alt="スクリーンショット 2018-03-27 13.15.55 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/95146/cccb8721-0a75-ca38-bca9-eb723814a5d1.png">
<img width="639" alt="スクリーンショット 2018-03-27 13.16.01 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/95146/171439f6-651f-6896-ad1b-49fe1caaa4e9.png">

GCPやAzureはまだみたいです。これからどんどん増えていきそう。


# 料金
- LogのEvent数と保持期間によって[料金が変わってきます](https://www.datadoghq.com/logs-pricing/)
- 例えば、10000 Events/minが定常的に来るログを7日間保持すると

```
( 10000 Events/min * 60 min * 24 hour * 30 day ) * 1.27 / per 100 Million Events = $548 / month
```
- この程度であれば月5〜6万ですが、1種類のログでこの料金なので、保持期間を伸ばしたり、複数種類のログを保持したり、大規模にアクセスが増えたりすると、コストが一気に膨れ上がります。
- どうしてもコストを抑えたいのであれば、エラーログのみLog Managementで管理するなどで対策は取れそう。

# 注意事項
- version 6系は5系のコア部分を大きく書き換えており、コマンド実行方法以外にも、confファイル管理場所など、一部互換性がありません。exampleのymlファイルの中身にも変更があるため、exampleファイルをコード管理している場合は合わせて修正しとくのが吉。
- version6.0以降はコマンドも少し変わっているため、運用スクリプトなどを作り込んでいる場合はversion up時の影響は大きそうです。

# 感想
- インフラメトリクスのダッシュボードからのジャンプがイカす感じです。
- DataDog APMとも連携できるみたいなので、よりログと密接に付き合えそうです。
UnityのTextMeshProを日本語で使えるようにする方法

# テキストメッシュプロの使い方　メモです

TextMeshProは、便利なアセットですが　

デフォルトでは、日本語が使えません。　

ということで今回は　日本語を使えるようにしていきます。　

※　UnityのＶｒは　２０１７．３．１ｆ１です。


まずは　アセットストアからTextMeshProをダウンロードしておいてください。　

こちら　

![bandicam 2018-03-27 18-33-47-168.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/e2849611-6dc1-9e7c-fa3c-2f501ae6fe46.jpeg)


# 日本語フォントを用意する

　
予め、日本語フォントを用意する必要があります。　

日本語フォントとググれば、沢山出てくるので　自分の好きなやつを　
使って大丈夫です。　

今回私が使ったのはこちら　

https://www.google.com/get/noto/

サイトに行ったら、検索窓があるので　そこでJPと検索してください。　

そしたら、notosans　ＣＪＫＪＰ　というのが出てくるので　
それをダウンロードします。　


次に　ダウンロードした　otfファイルを　Unityのプロジェクトに入れます。　
場所としては、　アセット→TextMeshPro→リソース→フォントの部分に入れておくといいでしょう。

![bandicam 2018-03-27 18-44-42-757.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/f09827f8-95fe-1d9b-c2d5-33a3c52f99ff.jpeg)

※　今回は使ったのは　Blackのやつを使いました。


# 詳細設定をする

UnityEditorのメニューからFontAssetCreatorのウィンドウを開きます
Window > TextMeshPro > Font Asset Creatorを開きましょう。



詳細設定はこんな感じです。　↓

![bandicam 2018-03-27 18-52-54-910.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/89426abf-0c11-a221-1ed6-a0dd802afe1b.jpeg)



fontsoucreの部分は　先ほど取り込んだ　notosansを選びます。　

Atlas Resolutionの部分は　４０９６ｏｒ８１９２　にします。

Character Setは　custom　rangeにします。

そして　中の部分に　日本語の文字コードを入れます。　

文字コードはこちら　

　https://gist.github.com/thorikawa/2856a7cf912349c0b6b7

数字の部分を　全部コピーして、貼り付けます。


Get Kering Pairs?　の部分は　チェックをはずす　

そしたら、　Generate　font　atlasをクリック。

それで青いバーが完了となったら、ＳＡＶＥします。　


# 最後に　


Hierarchｙ　↓

Create　↓　

３ＤObjectから　TextMeshProを選択。
（ＵＩなどでも使えます）


そして、　inspecterにある、　Font　assetで　先ほどSaveしたアセットを入れます。　

そしたら、　画像のように　日本語が使えるようになります。

![bandicam 2018-03-27 18-11-18-575.jpg](https://qiita-image-store.s3.amazonaws.com/0/196263/ad8abf36-217b-1f77-d1cb-53de66207296.jpeg)





参考情報　

https://qiita.com/hinagawa/items/b606c6a2fd56d559a375






ＰＳ　


フォントや設定によっては　結構エラーが出たりします。　

私もなんだかんだで　８時間ほど　費やしましたからね。　


ＵＤＥＭＹでも　講座を出しています。　

大森拓也と検索すれば出てきますので、　よかったら見てください。　

unityの講座もあります。
RailsでWebアプリを作成するときにとりあえずやる事リスト

#はじめに
Railsから入ったプログラミング初心者です。
RailsでWebアプリを作成するときに、内容を作成する前準備としていつも行なっているものをメモとして残そうと思いました。
まだ初心者なので少ないかもしれません。それに随時更新する予定です。

##ターミナルにて
```
bundle init
vi Gemfile
```
##Vim操作
- i (挿入モードへ)
- #gem "rails" ←の#を消す
- ESC (コマンドモードへ）
- ZZ　（保存して終了）

##再度ターミナル操作
```
bundle install --path vendor/bundle
bundle exec rails new . -B -f -d mysql --skip-turbolinks --skip-test-unit
bundle install 
```
##giboにてgitignore作成
```
gibo Rails >> .gitignore
```
##Gemfile追加
```
31 #gem 'bcrypt', '~> 3.1.7' ←#消す。暗号化用のgem
gem 'pry-byebug', group: :development　#追加　pry用のgem
gem 'kaminari'  #ページネーション
group :development, :test do
  gem 'hirb'         # Hirb-1 モデルの出力結果を表形式で表示するGem
  gem 'hirb-unicode' # Hirb-2 日本語などマルチバイト文字の出力時の出力結果のずれに対応
end
```
その他deviseとかは、使うときに入れています。

参考
http://maetoo11.hatenablog.com/entry/2016/03/04/144216
React Nativeのデバッグ方法

バージョン: 0.54.2

## console.logの表示
```react-native run-ios or run-android```でアプリ起動中に
```react-native log-ios or log-android```を実行するとターミナル上でconsole.logで出力している内容などが確認できる。
例えば、

```js
  renderContent() {
    console.log(`[INFO] this.state.activeTab: ${this.state.activeTab}`);
    switch (this.state.activeTab) {
      case "home":
        return <Home />;
        〜
```
<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/3752/87cb2f3b-1659-3d42-025d-9f334bc2b5bd.png" />

## chromeでのデバッグ
react-native run-ios or run-androidでアプリ起動後、ローカルのnodeサーバによってdebugger-uiというページにアクセスできるようになっているので、chromeでhttp://localhost:8081/debugger-ui にアクセスする。
そのあと、シュミレータでDeveloperメニューを表示（iOS: ⌘ + d, Android: ⌘ + m）して、Debug JS Remotelyを選択し、chromeでChrome DevToolsを開くと以下のようにブレークポイントを設定したり、変数の中を確認したりすることができる。
	<img width="800" src="https://qiita-image-store.s3.amazonaws.com/0/3752/25d078e6-5dc1-77db-6ab1-06902fc7c815.png" /><img height="400" src="https://qiita-image-store.s3.amazonaws.com/0/3752/387af7ea-db70-c7bf-444e-496013638948.png" /><img height="400" src="https://qiita-image-store.s3.amazonaws.com/0/3752/8485d509-9d7a-2a22-17d3-b4c4b64f81f1.png" />

## VSCodeでのデバッグ
VSCodeのメニュー > デバッグ > 構成の追加を選択して、./.vscode/launch.json に```React Native: Debug Android```と```React Native: Debug iOS```を追加する。 デバッグビューを表示（⌘ + shift + d）し、Debug iOS or Debug Androidを選択して、デバッグの開始を実行するとchromeと同様のデバッグができる。
<img width="800" src="https://qiita-image-store.s3.amazonaws.com/0/3752/3d640027-5763-ca5a-dd78-d2daa1ccfca4.png" />
※ Debug JS RemotelyがOnになっているとアプリ起動後にエラーになるのでOffにしておく
<img height="400" src="https://qiita-image-store.s3.amazonaws.com/0/3752/4ab44189-0cea-caa2-995c-2dce43f1ad8d.png" />

## その他
React Native Debugger、reactron などのStandaloneのツールもある

* [reactotron](https://infinite.red/reactotron)
* [react-native-debugger](https://github.com/jhen0409/react-native-debugger)
非同期な処理って種類があることに気が付いた話

#非同期な処理って種類があることに気が付いた話

ついさっきふと
$ \Huge{あ!} $ 
と気が付てしまったのでメモ。

# 経緯

Unity Job Systemって何なの？
だってUnityの.Netアップデートされてawait/async使えるようになったじゃん？

って考えてふと
あ、この二つって用途ちょっと違うんだ…
となりました。

というわけで実は二種類あった非同期な処理のタイプがあったんだなーという話
疑似コードはだいたいC#

# 処理待機(所謂非同期処理)タイプ( 通信や重い処理を別スレッドに移す )

async/awaitは多分主にこのタイプ

裏で重たい処理を別スレッドに放り投げてUIスレッドやメインスレッドでは進行状況を表示するような手法。
勿論重たい処理が同時に何本も走る可能性はある。

コードのイメージとしてはこんな感じ。

```
//この重い処理が別スレッドになるのでUIが固まらない！
var response = await client.GetAsync(uri); 
var text = await response.Content.ReadAsStringAsync(); 

MessageBox.Show(text);
```

# 並列処理タイプ( 行列の計算などの同じ計算を複数のプロセッサで行う )

Unity Job Systemはこちら側だったHPC(High Performance Computing)とか呼ばれるやつもこっち
スパコンとかもこれが用途

100万回しなければいけない計算を10のプロセッサでやれば10万回の時間で終わるよねという方法論

コードのイメージとしてはこんな感じ

```

//めちゃくちゃ多い要素の掛け算を複数プロセッサで回せばきっと早い！
var array1 = (100万個のint配列);
var array2 = (100万個のint配列);

var result = (100万個のint配列);

//ここは複数プロセッサがいい感じに分担作業してくれる
Parallel.For(0,1000000, i =>{
    result[i] = array1[i] * array2[i];
});

```

# 結論

実は非同期処理って二つあるのねって話。
後者は非同期処理って言わないのかもしれないけど非同期といえば非同期

実は僕は大学で少し並列処理をかじりました。
そのあとくらいにawait/asyncの勉強をしては？これでどうやって"並列処理"するの？
と思ってました。

でようやく理解して今度は"非同期処理"の方のasync/awaitに慣れたころにJobSystemきたもんだから…
お前何者や…と思って調べてみたら

ああ、実は二つは違ったんだ！と気が付きました。


というわけで、混同している人地味にいそうだなと思ってパッと書いてみました。
MySQL 存在しないユーザー削除時のエラー回避方法

MySQLで存在しないユーザーを削除したときにエラーになるのを回避する方法を調べました。

#### MySQL 5.7.6以降

MySQL 5.7.6以降では`DROP USER`構文で`IF EXISTS`オプションが利用できる。

```sql
DROP USER IF EXISTS user
```

#### MySQL 5.7.5以前

`IF EXISTS`オプションが使えないため、`DROP USER`構文で存在しないユーザーを削除しようとするとエラーになる。これを回避するために、`GRANT`構文でユーザー権限を権限なし（`USAGE`）に変更（ユーザーが存在しない場合には作成される）してから`DROP USER`を実行する。

```sql
GRANT USAGE ON *.* TO user IDENTIFIED BY password;
DROP USER user;
```

※ このSQLはMySQL 5.7.6以降では以下の警告が出る。

```text
1287 Using GRANT statement to modify existing user's properties other than privileges is deprecated and will be removed in future release. Use ALTER USER statement for this operation.
```

##### 参考

* https://stackoverflow.com/questions/598190/mysql-check-if-the-user-exists-and-drop-it
* http://dev.mysql.com/doc/refman/5.7/en/drop-user.html
* https://dev.mysql.com/doc/refman/5.7/en/grant.html
* https://dev.mysql.com/doc/refman/5.6/en/grant.html
JavaScript -- 入門編#1

拡張子HTAで、最初に学ぶ、JavaScript。

```html
<script>

// Lsn 001
alert('あああああああああああああああ');


// Lsn 002

testObject = function(){

  alert('ＢＢＢＢＢＢＢＢ');

}

testObject();


// Lsn 003

function User(){
  // private member
  var name = "山崎 太郎";

  // public member
  this.getName = function(){
    return name;
  };
}

var user01 = new User();

// 直接プライベートメンバーにはアクセス出来ない
alert(user01.name); // -> undefined

// パブリック・メソッド経由でプライベートメンバーにアクセスし、値を得る
alert(user01.getName()); // -> "山崎 太郎"



window.close();

</script>

```
main関数で?演算子を使う

Rustの`?`演算子はエラー処理を簡略化できて便利ですが、`main`関数内では使えませんでした。

```rust
use std::fs::File;
use std::io::prelude::*;

fn main() {
    let mut file = File::create("foo.txt")?;
    file.write_all(b"Hello, world!")?;
}
```

これはエラーになるわけです：

```
error[E0277]: the `?` operator can only be used in a function that returns `Result` (or another type that implements `std::ops::Try`)
  --> src/main.rs:15:20
   |
15 |     let mut file = File::create("foo.txt")?;
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()`
   |
   = help: the trait `std::ops::Try` is not implemented for `()`
   = note: required by `std::ops::Try::from_error`
```

なるほど、`?`演算子は戻り値が`Result`（あるいは`std::ops::Try`を実装している型）を返す場合にしか使えないと。

ところで[来るRust 1.25のissue][1_25]を見ているとこんなものがありました：
[1_25]: https://github.com/rust-lang/rust/milestone/44

Stabilize `main` with non-() return types #48453
https://github.com/rust-lang/rust/issues/48453

これは正にやりたかったやつですね(*'▽')
早速やってみましょう。`#![feature(termination_trait)]`で有効にするようです：

```rust
#![feature(termination_trait)]

use std::error::Error;
use std::result::Result;
use std::fs::File;
use std::io::prelude::*;

fn main() -> Result<(), Box<Error>> {
    let mut file = File::create("foo.txt")?;
    file.write_all(b"Hello, world!")?;
    Ok(())
}
```

安定化して1.25に入ると良いですね(/・ω・)/
GKEでEXTERNAL-IPがpendingのとき



## 状態
`54.65.10.114` は qiita さんのIpです。
`auth-service`も`54.65.10.114`になってほしいが `<pending>`なってしまう。

```
$ kubectl get services

NAME                CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
kubernetes          10.31.240.1     <none>          443/TCP          96d
api-service    10.31.251.111   54.65.10.114   8080:32075/TCP   1h
auth-service   10.31.255.158   <pending>   8081:31613/TCP   16m
```

### サービスの詳細を確認
pendingになっているサービスの確認


```
kubectl describe service api-service

Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath   Type            Reason                          Message
  ---------     --------        -----   ----                    -------------   --------        ------                          -------
  14m           5m              5       service-controller                      Warning         CreatingLoadBalancerFailed      Error creating load balancer (will retry): Failed to create load balancer for service default/api-service: failed to create forwarding rule <ruleのハッシュ>: googleapi: Error 400: Invalid value for field 'resource.IPAddress': 'your Ipアドレス'. Specified IP address is in-use and would result in a conflict., invali
```
(横長)

## 原因
転送ルールが同じもの存在し、設定できない状態。


## 解決策
既存の転送ルールを削除すればよいので

GCPのコンソール -> 外部 IP アドレス 

該当のIPアドレスの転送で上のエラーが起きているルールと同じもを削除する。


`$kubectl get services`

```
NAME                CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
kubernetes          10.31.240.1     <none>          443/TCP          96d
api-service    10.31.251.111   54.65.10.114   8080:32075/TCP   1h
auth-service   10.31.255.158   54.65.10.114   8081:31613/TCP   16m
```
Trelloでおうちの買う物リストを管理するようにした

# はじめに

スーパーで一通り買い物をした後、家に帰ってから「あー、マヨネーズ買い忘れた！」みたいなことがよくあったので、Trelloを使って管理するようにしました。

# Trelloの構成

<img width="451" alt="Screenshot-2018-3-27 おうちのかいもの Trello.png" src="https://qiita-image-store.s3.amazonaws.com/0/104653/688118c2-2e77-1ba0-9c55-c5e06d936a38.png">

## ボード：おうちのかいもの

### リスト：かうもの
食料や調味料、日用品など、スーパーやドラッグストアなどで買うものをリスト化しています。

- 「買わねば」と思ったタイミングでカードを作成
- 銘柄、種類、詰替えなど、自分以外が商品を選ぶ時に困らないよう、具体的に書く
- 「買ったよ（買い物かごに入れたよ）」というタイミングでカードをアーカイブ

### リスト：しょせき
気になった本を覚え書きとしてリスト化しています。
購入はMUSTではなく、「セールなどで安くなってたら」程度の重要度なのでリストを分けています。

## 管理しないもの
大きな買い物（家電など）は管理していません。
ついでに買えるレベルじゃないし、まぁ忘れないし。

また、衣服など本人が実物を見て確認したくなる類のものも管理していません。

# Slackへの通知
家族共有のSlackチームと連携し、買い物用のチャネルに通知します。

![スクリーンショット (23).png](https://qiita-image-store.s3.amazonaws.com/0/104653/168372d1-1f8d-f65d-bd11-a28ee4089cbc.png)

## カードアーカイブ時
通知します。
「買ったよ」「今スーパーにいるよ」というのが何となく伝わります。

## カード追加時
最初は通知していましたが、現在は通知していません。
追加されたタイミングで通知されてもアクションしようがないと考えたからです。

# 良かったこと
## 「他の人の分もついでに買う」が増えた
それぞれが買わなければいけないと思っているものを全員で共有できるので、買い物に行ったタイミングで他の人の分もついでに買えるようになりました。それも、うろ覚えや何となくではなく確実にそれを買えます。
「えっ、ドラッグストアに寄るんだったら柔軟剤もついでに買ってきてほしかったなー」みたいな事態が無くなりました。

## 「何買うんだっけ？」が減った
買い物中に迷ったり思い出したりする時間が減りました。
思い出せないまま家に帰って冷蔵庫開けて思い出す、みたいな事態が無くなりました。

# 課題（だったこと）
最初の頃は「柔軟剤」とだけ書いたカードがあったりして、
「どの銘柄だっけ？」
「詰め替え？　ボトルごと？」
など、ついでに買いたくても買えないことがありましたが、カード名に「○○の詰め替え」と具体的な明記をするようルール化して解決しました。
全員の認識が一致しているなら「牛乳（いつもの）」みたいなカード名でも良いと思います。

今のところ、特に課題と感じる部分はありません。
しいて言うなら、料理中に何かがなくなった時、カード追加のためにスマホを触るのが憚られてつい忘れがちってことぐらいですかね。

# おわりに
今は妻と二人で運用してますが、大人数の家族の場合はもっと効果が出やすいと思います。
テザリング時にスプラッシュ画面を表示すると真ん中が抜ける問題

#　はじめに
テザリング時にロゴなどが表示されるスプラッシュ画面を起動すると真中部分が抜けてしまう問題があった
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/176479/46352a67-4cc5-ba9f-eeaa-dd4f303e5560.png)

どうやら別のアプリでもよく起こっている問題らしい
[OS: Launch image gets wrinkled in the center during a call/recording/hot-spot session](https://stackoverflow.com/questions/38892448/ios-launch-image-gets-wrinkled-in-the-center-during-a-call-recording-hot-spot-s)

## 基本情報
Xcode9.2
Swift4
会社のアプリのスプラッシュ画面の設定方法は`LaunchScreen.storyboard`を作ってそこにロゴをConstraintsを張って設定している。
<img width="839" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/176479/d4bb955a-1d14-56fc-48e8-bdaf6a984c07.png">

## 対策
### アプリの起動時スプラッシュ画面を表示する時にステータスバーを非表示に設定する
`TARGETS->Infoタブ内->Custom iOS Target Properties`
`Status bar is initially hidden`を `YES`に設定
<img width="840" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/176479/d557b7f3-18f8-2a3f-fc89-37a95829c992.png">

### AppDelegate.swift内に以下を記述
`application:didFinishLaunchingWithOptions:`- アプリケーションが画面を表示する直前に実行する、最後の初期化処理を記述するところでステータスバーを表示するように設定する

```
func application(_application:UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
      application.isStatusBarHidden = false
      return true 
}
```

ちなみに最初の遷移先のViewControllerに下記をViewDidLoad()内にかいても良さそうだがiOS9以降deprecatedだった

```
override func viewDidLoad() {
        super.viewDidLoad()
　　　　　　　　　　　　　　　　UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .Slide)
}
```


# 参考文献
[Hide statusbar during splash screen](https://stackoverflow.com/questions/35280747/hide-statusbar-during-splash-screen)
[Hide status bar on launch image](https://stackoverflow.com/questions/11864993/hide-status-bar-on-launch-image)

# おまけ
テザリングのことPersonal Hotspot Activeって言うんですね
kintoneアプリ開発ベース〜ビルド、デプロイ、環境切り替え〜

kintoneアプリ開発におけるビルド／デプロイの雛形となる環境を作成しました。

## このプロダクトでできること
-   ES6→CommonJS、Sass(scss)→CSSへのトランスパイル
-   本番／開発環境の設定ファイルによる管理（ソース、app番号等）
-   Node.jsスクリプトを使用したコマンドによるデプロイ

## プロダクト
GitHubにて公開しています。

[kintoneアプリ開発／デプロイ環境][kintone-dev-base]

## 開発環境の構成〜開発〜デプロイ
### 雛形のダウンロード
GitHubより一式をダウンロードし、任意のプロジェクト名に変更します。

```
$ git clone git://github.com/hiroyasu55/kintone-dev-base.git
$ mv kintone-dev-base my-app
```

### npmライブラリインストール

```
$ cd my-app
$ mv kintone-dev-base my-app
$ npm install
```

### 環境設定ファイル
環境設定ファイル（json）を環境開発／本番環境に分けて記載します。
-   開発用： env/dev.env.json
-   本番用： env/prod.env.json

環境設定ファイルの詳細は[こちら][kintone-dev-base]を参照ください。

### ビルド
JavaScript(ES6)、Sassソースを編集した後、GulpでJavaScript・CSSを生成（トランスパイル）します。

```
$ npx gulp
$ npx gulp watch  ←ソース監視し自動ビルド
```

### kintoneへのデプロイ
デプロイ用スクリプトを実行することにより、トランスパイル後のJavaScript・CSSファイルをkintoneにデプロイ（アップロード）します。
kintoneの設定画面でブラウザ上でJavaScript・CSSファイルを登録するより時短になります。

```
$ node deploy.js  # 全アプリのデプロイ
$ node deploy.js customers  # アプリ名を指定してデプロイ
```

## ポイント
### ビルド（トランスパイル）
-   ES6→JavaScript(CommonJS)への変換はBabelとWebpackを使用しています。
-   Sass→CSSへの変換はGulpで行っています。
-   "gulp"コマンドでJavaScript、CSSへの変換を一括で行います。
-   環境設定ファイル（***.env.json）に、各アプリとJavaScript、CSSのヒモ付を定義します。

### 本番／開発環境の切り替え
実際の開発プロジェクトでは、本番で使用するkintone環境とは別に、開発者ライセンス等で開発環境（ステージング環境）を設けたことがままあると思います。そのような場面に適応するべく、**本番／開発環境用にそれぞれ環境設定ファイルを用意することで、アプリ番号等を切り替えることができます。**

```
（開発環境）
  "apps": {
    "customers": 11,
    "schedule": 33
  },

（本番環境）
  "apps": {
    "customers": 22,
    "schedule": 44
  },
```

### 共通変数
環境設定ファイル上で、各アプリで共通で使用する値を定義できます。またアプリ番号も各アプリで共有できます。定義した値はkintoneEnvオブジェクトより参照できます。

```
  "apps": {
    "customers": 11,
    "schedule": 33
  },
  "props": {
    "someValue": "ABCDE"
  },
```

```
$ console.log(kintoneEnv.apps.customers)  # 11
$ console.log(kintoneEnv.props.someValue)  # ABCDE
```

### デプロイスクリプト
スクリプト内ではkintoneファイルアップロードAPIを使用しています。ブラウザ上で登録するのと違い、デプロイ後にJavaScript・CSSが反映されるまで数秒かかることにご注意ください。

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

-   [kintone JavaScriptカスタマイズのためのwebpackビルド環境（Dropbox併用）][the_red] @the_red さん
-   [R3 kintone js deployerを使ってkintoneカスタマイズをハッピーに！][deploy] @ha_ru_ma_ki さん

[kintone-dev-base]: https://github.com/hiroyasu55/kintone-dev-base
[deploy]: https://qiita.com/ha_ru_ma_ki/items/d7c58a2929c14a55fb5e
[the_red]: https://qiita.com/the_red/items/bd5270099443dc21410e
phpbrewでphp 5.6、php 7.1を切り替える

現在利用しているWebサーバーのPHPのバージョンが5.6系（開発環境は5.6.32を利用）です。
しかし、このバージョンのセキュリティーサポートは、2018/12/31までとなっています。
参考：[PHP: Supported Versions](http://php.net/supported-versions.php)

今から来年までに、できればサポート期間の長いphp 7.1系にバージョンアップしておきたいけど、既存のソースが不具合起こしたり、動作が変わったりするか検証する必要があります。

そこで、開発環境に、PHPのバージョンを切り替えるためのツール[phpbrew](https://github.com/phpbrew/phpbrew)をインストールして動作検証を行う環境を作っていこうと思います。

今回の開発環境は下記の通りです。
・CentOS 6.8

・ハマりどころ
phpbrew自体のインストールはREADMe.mdにある通りで大丈夫。
問題はphpbrewを使って別バージョンのphpをインストールするときに、phpをソースコードからビルドする必要があるため、必要なバイナリーを適宜インストールする必要があります。


```bash
$ phpbrew use <<バージョン指定>>
```

インストールしたphpバージョン7.1.10を使用する。

```bash
$ phpbrew use 7.1.10
```

システムにインストールされているPHP(5.6.32)に戻す場合はswitch-offを使います。

```bash
$ phpbrew switch-off
```
mocha で debugger を止める

mocha でテストを書いている時に、どうしてもブレークポイントで止めてデバッグしたくなることがあります。

おもむろにコードにdebuggerを仕込みます。
<img width="270" alt="Monosnap 2018-03-26 14-41-56.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/126264/fedbf457-5fc8-2bab-9df4-a45b13909f7b.jpeg">
そして `mocha` コマンドに `--debug-brk --inspect` とオプションをつけて実行しましょう。
`chrome-devtools://` で始まるURLが吐き出されるので、ブラウザでそれを開きます。

```shell-session
$ mocha ./something-spec.js --compilers js:babel-register --debug-brk --inspect
Debugger listening on port 9229.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
    chrome-devtools://devtools/remote/serve_file/@60cd6e859b9f557d2312f5bf532f6aec5f284980/inspector.html?experiments=true&v8only=true&ws=localhost:9229/12b2ad6b-da56-4f9b-bd3a-b610f3aa59c1
```

ブラウザで開きましょう。

<img width="2084" alt="Image 2018-03-27 18-01-16.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/126264/d7a5d8f9-67ed-3a51-af21-b44e395bc2fe.jpeg">

:laughing::laughing::laughing:

一行目で止まっているはずなので、 `F8` を押して `debugger` まで実行させましょう。

後は自由にデバッグするだけです:wink:

もちろん、わざわざ `debugger` を仕込まずとも、chrome-devtools上でデバッグしても良いでしょう！
VSCodeでswagger 2.0のyamlドキュメントを快適に書きたい

# はじめに

以前 ["swagger specどうやって管理する問題"](https://qiita.com/k3nNy_51rcy/items/64f96761a7f931b7e4b1) で、VSCodeを使ってswagger 2.0のjsonドキュメントをIntellisense込みで書く方法を記事にしました。
その中で使っている[Swagger Viewer](https://marketplace.visualstudio.com/items?itemName=Arjun.swagger-viewer)というVSCodeのExtensionのバージョン1.6で不具合があるらしく、jsonで書いたドキュメントがプレビューできなくなってしまいました。

そこで、yamlでIntellisense効かせながらswagger 2.0 (欲を言えばOpenAPI 3.0)のドキュメントを書きたいなぁ...と思ったので、やってみました。

たぶん他にもやり方はありそうなので、知ってる方はコメントとかで教えて頂きたいなぁ…とか思ってます。

# 手順

## 1. まずはVSCodeに必要なExtensionを入れます。

  * [YAML Support by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml)
  
これだけです。

## 2. ちょっと設定する

VSCodeの`settings.json`にさっきのExtensionの設定を書きます。

```json:settings.json
    "yaml.schemas": {
        "http://json.schemastore.org/swagger-2.0": ["*swagger.yaml", "*swagger.yml"],
    },
```

キーの`http://json.schemastore.org/swagger-2.0`というのは、swagger 2.0のjson schemaが公開されているURLです。
値の`["*swagger.yaml", "*swagger.yml"]`というのは、swagger 2.0のIntellisenseを効かせたいファイルの名前をglobで指定しています。

この設定の仕方からすると、json schemaが公開されているものに関してはなんでもIntellisenseを効かせられそうですね。
また、kedge(って何ですか？)とk8sについてはデフォルトでschemaを持ってるらしいので、以下のような設定もできるそうです。
([READMEより](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml))

```json:settings.json
    "yaml.schemas": {
        "Kubernates": "/myYamlFile.yml",
        "kedge": "/myKedgeApp.yaml"
    },
```

# できた！

これだけでIntellisenseが効くようになりました。(OpenAPI 3.0はjson schemaがまだ公開されてなくて断念…。)
思ったより簡単でした。


# 2019/3/26 追記

コメントより

> 価値のある記事をありがとうございます。
すでにご存知かもしれませんが、OpenAPI 3.0のjsonschemaも公開されていたみたいなので、この記事に辿り着いた方々のためにも共有させていただきます！
https://raw.githubusercontent.com/kogosoftwarellc/open-api/master/packages/openapi-schema-validator/resources/openapi-3.0.json

との情報を頂きました。 @toriiico さんありがとうございます。
手順2のところでsettings.jsonを以下のようにすると、OpenAPI 3.0のIntellisenseが効くようになります。

```json:settings.json
 "yaml.schemas": {
 "https://raw.githubusercontent.com/kogosoftwarellc/open-api/master/packages/openapi-schema-validator/resources/openapi-3.0.json": ["*swagger.yaml", "*swagger.yml"],
 },
```
Alibaba Cloud ECS の購入タイプについて調べてみた

## 購入タイプ
3 つあります。

- 従量課金
- サブスクリプション
- スターターパッケージ


## 従量課金
- 使いたい時、使った分だけの料金支払い（後払い）
- 契約の更新不要
- 秒単位で請求されるが、1時間ごとに決済される。請求単位は円/時間。
- 利用可能なスペックの制限あり
  - EIP: 最大トラフィック 100Mbps
  - ECS: 4コア 16GBまで購入可能


## サブスクリプション
- 支払いが行われた後にリソースを使用する（前払い）
- 月単位で契約更新必要。自動更新設定も可能。
- 選べるスペックの幅が広い
  - EIP: 最大トラフィック 200Mbps
  - ECS: 56コア 224GBメモリまで購入可能


## Starter Package
- データ転送量が含まれる
  - 上限有り。上限を超えた場合、通信量に応じた料金が発生。
- 更新が必要です。自動更新も可能
- 構成に柔軟性がなく、限られる
- インターネット帯域は 30Mbps 固定
いまだにシステムハンガリアン記法を用いているたった一つの場所


\*.NET で開発する際、画面上の GUI 部品（コントロール）にシステムハンガリアンを用いています。

TextBox1 -> txtQty などです。

こうすることで、コーディング時のヒンティングに使えるためです。

「あのテキストボックスに入っている値を取得したい。ID はなんだっけ？」というときに ` Me.txt ` まで入力すると何とかなるのです。

最近の Visual Studio なら ` Me.qty ` と入力しても txtQty を候補に表示してくれるかな？

入力欄と、それに付随するラベルなどにも同じような ID をつけざるを得ない場合にも便利だと感じてしまいますね [^1] 。

その他の場合システムハンガリアンは使わないのですが、何故かこのケースだけ未だに生き残っています。

## 免責

この記事はシステムハンガリアン記法の使用を推奨するものでも擁護するものでもありません。ただ自分の癖に、ふと気づいたもので...。

[^1]: ラベルに識別子をつけることは稀ですが。
[WordPress] WP Post Branches で更新された元記事の公開日時を変更しない

# WP Post Branches
https://ja.wordpress.org/plugins/wp-post-branches/

* 公開された記事に対して「ブランチ」を作って指定日時（公開予定日時）で元の投稿を上書きするプラグイン
* 上書きされるまで元の投稿はそのまま公開しておける

使い方はぐぐってください

# 元記事の公開日時も更新されてしまう問題
早い話プラグインの仕様な訳ですが、アーカイブなどで記事の順序が入れ替わるのでそれをやめたいわけです。

* 元記事の更新日時をブランチ記事の公開日時にする
* 元記事の公開日時は変更しない

フィルターフックがあるのでよしなに改変すればOK。
https://github.com/horike37/WP-Post-Branches/blob/master/wp-post-branches.php#L179

```php:my_wpbs_draft_to_publish_update_post.php
add_filter( 'wpbs_draft_to_publish_update_post', 'my_wpbs_draft_to_publish_update_post', 10, 1 );
function my_wpbs_draft_to_publish_update_post( $new ) {

	// 元記事の更新日時をブランチ記事の公開日時にする
	$new['post_modified']      = $new['post_date'];
	$new['post_modified_gmt']  = $new['post_date_gmt'];

	// 元記事の公開日時は変更しない
	$old_id   = $new['ID'];
	$old_post = get_post( $old_id );

	$new['post_date']     = $old_post->post_date;
	$new['post_date_gmt'] = $old_post->post_date_gmt;

	return $new;
}
```

現場からは以上です。
Git for Windows のコミットメッセージの編集にメモ帳を使う方法とメリット


私はデフォルトの vi 使っているので関係ないのですが、布教のためには多くの選択肢があったほうがいいものです。

GUI のエディタを使いたいという場合でも「エディタの終了を検知」してコミットを行う Git の仕様を好まない人もいるでしょう。たとえば、お気に入りのエディタは起動したまま終了しないで使う、といった場合です。そのようなケースでは、普段使いのお気に入りエディタとコミットメッセージを書くエディタは別のものにしたいはず。「メモ帳なら普段は使わないし、起動・終了も軽いし」といった理由でメモ帳を選択するニーズは意外とあるかもしれません。

## 問題

ただ「エディタをメモ帳に設定」しただけの状態では入力した日本語が化けます。

## 他の選択肢

- vi 使えるようになりましょう。
- UTF-8 に対応しやすいエディタを使いましょう。
    - https://qiita.com/kumazo/items/2169e1ee7be278f82b94
    - https://github.com/atom/atom/issues/12109

## メモ帳で使うための準備

Git Bash 画面で以下のコマンドを実行すると、git commit 時のエディタがメモ帳になります。

```sh
git config --global core.editor notepad
```

ただし、このままでは日本語が文字化けします。

## 文字化け対策

メモ帳が開いたときに、以下のようなメッセージが表示されていると思います。

```sh

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# ...
```

この状態でメニューから「名前をつけて保存」を選択して保存ダイアログを確認すると「文字コード」がANSIになっていると思います。

保存の際に「上書き保存」ではなく「名前をつけて保存」にして文字コードを「UTF-8」にすると、コミットメッセージが文字化けしないで登録できます。

## もっと簡単に

しかしコミットメッセージを入力するたびに保存ダイアログを操作するというのは面倒です。

コミット時にメモ帳が開く際、最初から UTF-8 の雛形を開いてくれればいいのです。

そのために、まずは UTF-8 で書かれたコミットメッセージの雛形ファイルを作ります。

例えば上記のメッセージを日本語に訳したものをメモ帳で作成し、UTF-8 にして保存しておきます。一行目は空行にします [^1] 。

```sh:gitMsgForNotepad.txt
　
# 変更内容についてのコミットメッセージをここに記述してください。
# 行頭に '#' の記号が書かれている場合、その行は無視されます。
# メッセージが空のままなら、コミットを中止します。
```

あるいは、[こちらのプレフィックスのチートシート](https://qiita.com/numanomanu/items/45dd285b286a1f7280ed) を訳したものでもよいでしょう。

保存場所は目立たない場所がいいでしょう。私は「C:\Users\私\AppData\Local\Git\gitMsgForNotepad.txt」に保存しました（途中の存在しないディレクトリは作成します）。

繰り返しますが UTF-8 で保存してください。

ではこれをコミットメッセージの雛形として使うように設定します。

```sh
git config --global commit.template "~/AppData/Local/Git/gitMsgForNotepad.txt"
```

これで、メモ帳で日本語コミットメッセージを入力しても文字化けを防ぐことができます。

## まとめ

以下をコピーして Git Bash に貼り付けることで上記の設定を一気に行います。

```sh
mkdir ~/AppData/Local/Git/
cd ~/AppData/Local/Git/
echo "" > gitMsgForNotepad.txt
echo "# 変更内容についてのコミットメッセージをここに記述してください。" >> gitMsgForNotepad.txt
echo "# 行頭に '#' の記号が書かれている場合、その行は無視されます。" >> gitMsgForNotepad.txt
echo -n "# メッセージが空のままなら、コミットを中止します。" >> gitMsgForNotepad.txt
git config --global core.editor notepad
git config --global commit.template "~/AppData/Local/Git/gitMsgForNotepad.txt"

```

## 戻したい

以下のコマンド（群）で設定を削除し、元に戻します。雛形ファイルは削除しません。

```sh
git config --global --unset core.editor
git config --global --unset commit.template
```

[^1]: このサンプルは表示のために、一行目に全角スペースを入れています。ご注意ください。
git rebase で squash しつつ edit したりコミットを分割したりする

`git rebase` で `x(exec)` を使うと捗りました。

## squash しつつ edit

例えば次のようなリベースで 002 と 003 を `squash` しつつ `edit` したいとき。

```
pick d94123a 001
pick d9b3511 002
pick b3f6c3e 003
pick 3a76981 004
```

普通にやると次のように `squash` したあとで、

```
pick d94123a 001
pick d9b3511 002
s b3f6c3e 003
pick 3a76981 004
```

もう一回リベースして `edit` する必要があります。

```
pick d94123a 001
e 20e1401 002+003
pick 72b2cdc 004
```

ので、２回に分けてリベースする必要がありますが・・・次のように `squash` のあとに `x(exec)` で `false` などの適当な失敗するコマンドを実行すると、そこでリベースが中断されるので、１回のリベースで `squash` と `edit` が同時にできます。

```
pick d94123a 001
pick d9b3511 002
s b3f6c3e 003
x false
pick 3a76981 004
```

## コミットを分割

次のようなリベースで 002 のコミットを分割したいとき。

```
pick 34f4f48 001
pick 548ac76 002
pick 94cdb81 003
```

普通にやると次のように `edit` し、ワーキングツリーを弄って `git commit --amend` とか、`git reset @^` からの `git commit -ap` とかかと思うんですけど・・・

```
pick 34f4f48 001
e 548ac76 002
pick 94cdb81 003
```

分割するコミットの行を削除して、代わりに下記のように分割したい数だけ追記します。

```
pick 34f4f48 001
x git checkout -p 548ac76 && git commit -c 548ac76
x git checkout -p 548ac76 && git commit -c 548ac76
x git checkout -p 548ac76 && git commit -c 548ac76
pick 94cdb81 003
```

`x git checkout -p ...` の段階で `git add -p` のようなインタラクティブな差分の追加のプロンプトが表示されるので、分割したいコミットになるように差分を修正します。

次の `git commit -c ...` で、元のコミットメッセージがデフォルトで入った状態でコミットメッセージが入力できます。

手順は若干異なりますが、次のようにできます。

![20180216-git-rebase-split.gif](https://qiita-image-store.s3.amazonaws.com/0/8734/fa3cf8aa-0a3f-89ca-2ae4-19d4975581bf.gif)

## さいごに

最近 Windows での Git を TortoiseGit からコマンドラインに乗り換え？たのですが、プッシュ前にコミットを綺麗にするためにリベースする作業がコマンドラインだと辛いなーと思ってました。

TortoiseGit なら、滅茶苦茶遅いしたまに謎の原因でリベースがコケたり、していたのですがグラフィカルに操作できて便利なので、リベースするときだけたまに TortoiseGit 使ったりしてました（コミットの入れ替えや `reword` や `squash` ぐらいならコマンドラインでも十分ですが・・）。

がしかし、リベースで `x(exec)` を使うようにしてみたところ、わりとコマンドラインだけでなんとかなる気がしてきました。
iPhoneXのレイアウトはXamarin.Formsでどうやって乗り切る？

UWPとかでデバッグしてたから気づかなかったけど、iPhoneXのあの凹っとした上の部分とか、やたらと長い下の＿の部分とか、どうすんの:dizzy_face:！？となったので調べました。
##解決策
XCodeだったらSafeAreaっていうのを使うんですね。~~じゃああそこはDangerousAreaかな？？~~え、固有のところでSafeArea使えよ、って設定すんの！？？と思ったけど、そうじゃなかった。素敵。対応は以下。

**設定したいPageにusingを追加**

```c#
using Xamarin.Forms.PlatformConfiguration.iOSSpecific;
```

**PageのコンストラクタでSafeAreaを設定**

```c#
On<Xamarin.Forms.PlatformConfiguration.iOS>().SetUseSafeArea(true);
```

ここで注意したいのは
Nugetパッケージのバージョン！
**Xamarin.Formsは2.4.0.74863以上に！！！**

以上。また今度ちゃーんとまとめます。まずは投稿するクセをつける。
テキストファイルをバックアップ

httpd.confを編集する前にコピーして取っておきたいと思い、バックアップコマンドを書いてみました。

```sh:~/bin/orgbackup
#!/bin/sh

if [ -f $1 ]; then
cp -p --backup=numbered $1{,.org}
touch $1.org -r $1
fi
```

実行権
**chmod 755 ~/bin/orgbackup**

**orgbackup httpd.conf**
実行結果
１度目
httpd.conf httpd.conf.org
２度目
httpd.conf httpd.conf.org httpd.conf.org.~1~
３度目
httpd.conf httpd.conf.org httpd.conf.org.~1~ httpd.conf.org.~2~

コピーする前にhttpd.conf.orgが存在したら、httpd.conf.orgがhttpd.conf.org.~3~という最後の番号の次に名前が変更されます。
そして、httpd.confがhttpd.conf.orgにコピーされます。
autoprefixerでinputとかのplaceholderのテキストの色をcssで変えたいとき

gulp-autoprefixerで、自動でベンダープレフィックスつけてますが、
placeholderのテキストの色を変えたいときに
`:placeholder-shown`ではダメだったので、こうしたよ、っていう内容です。

#はじめに

ベンダープレフィックスなんて嫌いだ！！
とずーっと思ってた私にとって、autoprefixerは天啓でした。神の啓示。神！いや、仏！

でもそんなautoprefixerも設定とかちゃんとしとかないと動かないときあるよね。

例えば、`display:grid`。
これはIEに対応しようと思うと大変！　だけどデフォルトでは対応してないので、optionに`grid: true`を入れる必要があります。



#どう書く？

placeholderの色を変えたいときに
`:placeholder-shown`　だと対応してくれなかったけど
githubの英語のイシュー漁ったら
`::placeholder`
でやろうぜ！みたいな議論があったので
やってみたら動いてくれました。


```style.scss
input::placeholder{
  color: red;
}
```

って書けばいいんだよっと！

#まとめ

なんかこんな感じで一応動いたので、記事にしましたが、
もし間違ってたら教えてください。
ELBの暖気申請(Pre-warming)の前提条件について

## 暖気申請(Pre-warming)を実施するには、各AZに1台以上のHealthyなインスタンスが配備されている必要がある
### そのため、ELBのみを建てて暖気申請(Pre-warming)をして、コスト節約することはできない。
(AZに1台ずつだけ建ててコスト節約は可能)
メモ pandasで曜日・セッションの追加方法

# 概要
kaggleをやり始めて特徴量をいかに付与するかが重要だと学んだので、
それらをつける方法のメモ
[TalkingData AdTracking Fraud Detection Challenge](https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection)
のデータを使って勉強中

# 曜日（平日は１、休日は０）
```python:yobi
# クリック曜日の付与
def add_clickweekday(df):
    yobi = [1, 1, 1, 1, 1, 0, 0]
    df["click_weekday"] = pd.to_datetime(df["click_time"]).apply(lambda x: yobi[x.weekday()])
    df["click_weekday"] = df["click_weekday"].astype(np.int8)
    return df
```

#セッション
```python:session
# セッションnumの付与
def add_session(df):
    df = df.sort_values(["ip", "click_time"])
    temp = df[["ip", "click_time"]].groupby('ip')
    df['session_number'] = temp['click_time'].apply(
        lambda s: ((s - s.shift(1)).astype('timedelta64[m]') > 30).fillna(0).cumsum(skipna=False))
    df["session_number"] = df["session_number"].astype(np.int8)
    del temp
    return df
```
Ionic3に入門してみる～その2 ドキュメント①～

# ドキュメント
本記事ではざっくりドキュメントを読みます。

## TypeScriptについて

>Ionic uses TypeScript for its code. If you’re unfamiliar with TypeScript, dont worry, it’s very similar to regular JavaScript. 
>But if you want to read up on it, take a look at this resource page.

グーグル先生の日本語訳
>IonicはそのコードにTypeScriptを使用します。TypeScriptに慣れていない場合は、心配しないでください。 
>これは通常のJavaScriptと非常によく似ています。しかし、あなたがそれを読んでみたいなら、このリソースページを見てください。

## TypeScriptってどんなもの？
こんなものです。
https://qiita.com/mugichan3/items/a0f17d9f4f757d88a83a

基本的にJavaScriptのスーパーセット(拡張)なので、あんまり気にしなくても良いです。
ES6でclassっぽい構文でかけるようになったのでそこまで恩恵はないかも？
https://liginc.co.jp/266587

気になる人はココらへんを見てみてください。
https://teratail.com/questions/95347
http://kangax.github.io/compat-table/es2016plus/

## Androidについて
リリースビルドを実行するコマンド
ionic cordova build android --prod --release

GooglePlayで公開するには、APKに対して署名、最適化が必要。
これはCordovaと同じ。なお、これらのコマンドはIonicのコマンドではないので注意。

秘密鍵作成コマンド
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

ドキュメントの署名コマンド
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.jks android-release-unsigned.apk my-alias

APK最適化コマンド
zipalign -v 4 android-release-unsigned.apk HelloWorld.apk

署名の確認は下記で行うことができる。 
apksigner verify HelloWorld.apk

## Angularについて
IonicではAngularを使うことができます。
1も2も4もです。と、言ってもそれぞれ使えるIonicのバージョンがあります。
Ionic1→Angular1
Ionic2→Angular2
Ionic3→Angular4
1と2では互換がないので注意。2と4は互換性があります。

参考:https://qiita.com/kokorau/items/022594793ba13b1ed5c6

## 移行問題
Ionic1などからの移行は下記ページの通りに書き換えが可能。
https://ionicframework.com/docs/intro/migration/
この記事が新規で始める人向けなので、ここではそこまで詳しくは読まない。

## コンセプト
ここもだいぶざっくり行きます。
気になる人は原文をどうぞ。
https://ionicframework.com/docs/intro/concepts/

* IonicはオープンソースSDKだよ
* 商用・非商用を問わずに利用できるよ
* CLIはコマンドラインインターフェースのことだよ
* CLIでビルドツール、デバッグツールなどを提供しているよ

※コンポーネントとかは後で出てくるので後回し。

## ブラウザのサポート

https://ionicframework.com/docs/intro/browser-support/ 
次のOSとブラウザがサポートされています

* iOS 8+
* Windows 10ユニバーサルアプリケーション
* Android 4.4+
* サファリ
* クロム
* エッジ
laravelのフォルダ構成

#フォルダ構成
##app
モデルファイル　※laravel5.5ではデフォルトでUser.phpが配置
###Http-Controllers
コントローラーファイル

##config
設定ファイル

##database
###migration
データベースのバージョン管理
※ユーザーに関するファイルがデフォルトで配置されている

##public
ブラウザからアクセスした時に見るフォルダ

##resourses
###views
画面のテンプレート

##routes
URLにアクセスした時にどの処理をするのかを実行するのかを決める
（いわゆるルーティング・ラウティング）

＃参考
ドットインストール　https://dotinstall.com/lessons/basic_laravel_v2/42203
JavaScriptでゼロフィルした日時を取得する

タイムスタンプとして、ゼロフィル（ゼロパディング、ゼロ埋め）した日時の文字列が必要なケースで使うJavaScriptコードを作成してみました。

## ECMAScript2017版

IEだと動作しません。

### コード 

```javascript
const getDateStr = () => {
   const now = new Date();
   return [now.getFullYear(),
           now.getMonth() + 1,
           now.getDate(),
           now.getHours(),
           now.getMinutes(),
           now.getSeconds()]
           .map(d => d.toString().padStart(2,'0'))
           .join('');
};

getDateStr(); // 20180102030405
```
### 解説

1. 日付の各項目（年月日時分秒）を配列に格納する
2. 各要素をpadStart関数で2文字なければ0で埋める
3. 配列を連結する

## IE対応版

IEでも利用できて、すでにゼロフィルされた文字列を使う方法。
タイムゾーンはUTCになるので注意。

### コード

```javascript
var getDateStr = function(){
	var now = (new Date()).toISOString();
	var nowArray = now.match(/\d{2,4}/g);
	nowArray.pop();
	return nowArray.join('');
};

getDateStr(); // 20180102030405
```

### 解説

1. 日付のISO形式の文字列を取得する（`YYYY-MM-DDTHH:mm:ss.sssZ`）
2. 数字２〜4桁にマッチする部分を抽出して配列にする
3. 配列からミリ秒の部分を削除（今回のケース）
4. 配列を連結する

### おまけ

ミリ秒つけるならもっとシンプルになります。

```javascript
var dateStr = (new Date()).toISOString().match(/\d{2,4}/g).join('');

console.log(dateStr); // 20180102030405123
```
Google Spreadsheetで行が追加になった場合に自動で日付を入力する数式

#やりたいこと
下記のようなスプレッドシートのデータがあります。

|日付|曜日|やること|
|:--|:--|:--|
|2018/04/01|日|市場へ出かける|
|2018/04/02|月|お風呂をたく|
|2018/04/03|火|お風呂にはいる|
|2018/04/04|水|友達がくる|
|2018/04/05|木|送っていく|

※スプレッドシート自体、6行目までしか存在しないものとします。

このとき、スプレッドシートの末尾に行追加をしたら、自動で日付（と曜日）が入るようにしたい。

|日付|曜日|やること|
|:--|:--|:--|
|2018/04/01|日|市場へ出かける|
|2018/04/02|月|お風呂をたく|
|2018/04/03|火|お風呂にはいる|
|2018/04/04|水|友達がくる|
|2018/04/05|木|送っていく|
|**2018/04/06**|**金**||
|**2018/04/07**|**土**||

#完成した数式（日付部分）

```
=ArrayFormula(date(2018,3,30)+row(A2:A))
```
#説明
##経緯
行を追加した時に自動で値が入るという挙動は、[ARRAYFORMULA](https://support.google.com/docs/answer/3093275)で実現するのが良いかなと思ったので、ARRAYFORMULAを使う方法から逆算して考えました。

##いったんARRAYFORMULAを外して考える。

```
=date(2018,3,30)+row(A2)
```
2018年3月30日 `date(2018,3,30)` にA2セルの行番号`row(A2)`（=2）を足すので、「2018/04/01」になります。
`date()`に入れる日付は、数式を入力する行番号と、最初に表示したい日にちから適宜設定してください。

##ARRAYFORMULAで列に展開
```
=ArrayFormula(date(2018,3,30)+row(A2:A))
```
A2列以降のA列`row(A2:A)`に対して、数式を適用します。

###適用イメージ
- A3セル=2018年3月30日+3(行目)=2018/04/02
- A4セル=2018年3月30日+4(行目)=2018/04/03
- A5セル=2018年3月30日+5(行目)=2018/04/04

（以降繰り返し）



#補足
曜日部分は下記の通りです。
```
=ArrayFormula(text(WEEKDAY(A2:A,1),"ddd"))
```
Ansible(AWX)で"load_config() got an unexpected keyword argument 'config_dict'"の対処法

# 概要

Ansible AWX(local Docker版)構築する際に以下のようなエラーでハマったので、その対処法を残したいと思います

```
"Error connecting: load_config() got an unexpected keyword argument 'config_dict'"
```

# 原因

いろいろと調べたが [dockerを3.0.0にダウングレード](https://github.com/ansible/awx/issues/1197)したらいけたよとか書いてあったが、試しても改善できなかった

バージョンの問題ではなく、dockerよりも先にdocker-pyを導入したことによるエラー
詳しい原因は理解できていない（インストール時にコンパイルするのかな？）

```
> pip install docker-py docker
```

# 対処法

**dockerをdocker-pyよりも先に導入！**

```
> pip install docker docker-py
```
wordpressで（サイト内）リンク先をサムネイル表示したい（2）

**wordpressメモ**
　独学でwordpressで作られたサイトを管理しているので、
　少しずつメモをストックしようと思います。

#リンク先をサムネイル表示したい！

##前回までのおさらい
wordpress4.4以上だとURLを記述しただけでサムネイル表示されるらしい
でも自分の管理するサイトだとできないのはなぜ？
ということで調べてみました。

<a href="https://qiita.com/aquagre_en/items/1263b1b66a7255d858c4">前回(1)の記事</a>では、
オリジナルテーマのため、wp_headerから何も出力していなかったので、
wp-embed.min.jsを参照するようにヘッダに追記したところ、
ttp://hogehoge.com/kotei/embed/
とブログカード（URLに/embed/をつけると表示される内容）を表示できました。

![embed_sample.png](https://qiita-image-store.s3.amazonaws.com/0/172603/76acd648-491e-6355-9bfb-2e2593986769.png)

しかし、サイトには写真の掲載があるのですが表示されません。
サイトタイトルの前にあるロゴもwordpressのもの
自サイトのfaviconにしたいなぁ・・・

##アイキャッチの設定
SNSなどではurlを貼り付けると勝手にそのサイトのこんな感じ・・・を作ってくれるのですが、
自サイトではそうも勝手に写真をピックアップして表示とかしてくれないようす。
ページごとにアイキャッチを設定する。

投稿欄の上部、オプションに、アイキャッチ画像チェックボックスがあるので、こちらをチェックする
![wp_option.png](https://qiita-image-store.s3.amazonaws.com/0/172603/7aca373c-b32e-4465-d308-6e0b99ec0dc7.png)

右下にアイキャッチ画像を追加する欄が出てくるので、ここでアイキャッチ画像を追加する
![wp_eycatch.png](https://qiita-image-store.s3.amazonaws.com/0/172603/b5967848-de96-66bc-6aa2-d965c593049a.png)

ここで選択できるのは、このwordpressが管理する画像だけだ、
というわけで、メディアからの選択、あるいはメディアへアップロードしてからの選択となる。

![wp_image_temp.png](https://qiita-image-store.s3.amazonaws.com/0/172603/a9c0e121-acd3-2762-00e6-a7e71c0e1150.png)

ブログカードに画像がつけられました。

![wp_blogcard2.png](https://qiita-image-store.s3.amazonaws.com/0/172603/a033649a-7442-2410-a063-58ca87fe34b5.png)

##サイトアイコンの設定
次にアイコンの設定
外観＞カスタマイズ＞サイト基本情報を選択

画像の変更からiconに使う画像を選択すると、サイトアイコンが設定されます。

![customize_c.png](https://qiita-image-store.s3.amazonaws.com/0/172603/af99d3c2-50e4-708d-97d9-95d1b0b64142.png)

appleのホーム画面用に作ったような画像が良いでしょう。

これでどうだ！
![wp_blogcard3.png](https://qiita-image-store.s3.amazonaws.com/0/172603/488c4112-d3c9-32f0-8985-4fbfecac1a06.png)
（画像はハメコミ合成です）

##まとめ
embedについて検索していると、
一覧表示にブログカードを挿入されると遅くなるからでしょうか、
embedしない方向でヘッダからはずすための記述はたくさんありました。
表示するための記述はあまりなかったので、書き留めてみました。

また、wp-headerの出力だとwordpressのバージョン情報が付与されるようです。
セキュリティ的にはよろしくないと思われるので、
バージョン情報を表示しないように工夫する必要もあると思います。

画像のあるものは投稿時にアイキャッチ設定しておくとリンクを貼るときには便利そうですが、めんどうでもあります。
wordpressで（サイト内）リンク先をサムネイル表示したい（１）

**wordpressメモ**
　独学でwordpressで作られたサイトを管理しているので、
　少しずつメモをストックしようと思います。

#リンク先をサムネイル表示したい！

wordpress4.4以上だとURLを記述しただけでサムネイル表示されるらしい
でも自分の管理するサイトだとできないのはなぜ？
ということで調べてみました。

##できない原因はなに？
想定できるのは、

<ul><li>wpのバージョン？</li>
<li>プラグインがじゃま？</li>
<li>投稿・固定ページ以外ではできない</li>
<li>その他</li>
</ul>

バージョンは最新だし、投稿欄に固定ページのサムネイルを表示したいだけだし、
プラグインも、あやしいプラグインはない。
しいていえばセキュリティ系か？
と思ったのですが、

まったくできないわけじゃないんですよ。
urlを記述すると、
 <a href="">タイトル</a>
という感じにのリンクができるのです。ということはtitleは読んでいるのです。

セキュリティからいうと、wordpressでは内部のホワイトリストに一致するURLのみを埋め込みの対象とするそうなので、それも問題ないということがわかります。
参考）wordpress Codex https://wpdocs.osdn.jp/oEmbed

##リンク先のURL/embed/でカードが表示される

で、リンク先のURL/embed/とするとサムネイル化された（ブログカードとかいうらしい）が表示されるというのですが、
ttp://hogehoge.com/kotei/embed/
とすると、たしかに、タイトルとページの一部が見えます。

![embed_sample.png](https://qiita-image-store.s3.amazonaws.com/0/172603/76acd648-491e-6355-9bfb-2e2593986769.png)

そうそう、惜しいけどこんな感じに表示したい！

##じゃぁ何が足りない？そうか参照だ！
ぐぐっていくうちに、テーマをメジャーなものにすると表示されるけれど、
という記述を発見。
あ、そういえばこのサイト、完全オリジナルテーマで、
前任者がwp-header出力しないようにしていたんだっけ。

ということで、
一番あやしそうな、wp-embed.min.jsを参照するようにヘッダに追記

`<script type="text/javascript" src="http://自分のドメイン/wp-includes/js/wp-embed.min.js"></script>
`
お！読み込まれました！
/embed　で読み込んだものが表示されました！

というわけで、
wp-includes/js/wp-embed.min.js
の読み込みが足りなかった様子。

でもこの、サイトタイトルの前に出ているWordpressのマークじゃなくて、
このサイトのiconにしたいなぁ・・・
faviconは設定しているのだけれど、ヘッダに記述しただけじゃだめなのかな？

それに、アイキャッチを設定していないからか、写真がない。
というわけで、<a href="https://qiita.com/aquagre_en/items/1f05133d063b585fa6cf">次回に続く・・・</a>
【GAS】メール送信で「無効な引数です」が出てハマったのでメモする

# TL;DR
* スプレッドシートを編集した際、スプレッドシートを編集した人のアドレスを送信元としてメールを送ろうとしたができなかった。
* MailAppとGmailAppではoptionとして指定可能なものが違う。

# 状況
承認を管理するスプレッドシートがあり、承認されるとGAS経由でメールを規定の人に送信するように開発をした。
送信元がスクリプトオーナー(私)に固定されていたので、事務的なメールを開発部署の私が各営業部署にホイホイ通達する状況が発生。(開発中は気づかなかった)
ここで私、何を考えたか **送信元をシートの編集者にすればいいのでは？:thinking:**と発想する。(前提が既に間違っている)

# 元のコード
宛先やタイトルは「mailSetting」に既に設定済とする
`mailSetting.from = Session.getActiveUser().getEmail();
MailApp.sendEmail(mailSetting); //送信元は私のまま`

# 動かない…！！
そもそも間違っている点としては`MailApp`を使用している点で、`from`を指定するためには`GmailApp`を使わないといけない。
以下のように書き換え。
`mailSetting.from = Session.getActiveUser().getEmail(); //別の人に操作してもらってテスト
GmailApp.sendEmail("宛先", "件名", "内容", {from : mailSetting.from}); //Exception:無効な引数です`

# まだ動かない…！！！
「無効な引数です」は、例えばJavaなどでよく見る「この変数の型を間違えている」ということではなく、「このアドレスがメールの送信元として使えない」ということが正しい。
詳しくは[この記事に載っていた](https://qiita.com/co-ikeya/items/c097ba9e9d75fd7a4d01)のだけど、ようは「メールの送信元は前提としてスクリプトオーナーが基準」であり、「そこから参照として正しく設定したメールアドレスのみが送信元として使用可能」なのだ、ということでした。
私は「スクリプトオーナーが基準である」を、「実行者が基準である」と勘違いしていたので長いことハマってしまった……。
結局私のアカウントに連絡用のメーリングリストをエイリアス設定して、以下の感じになった。

`var alia = GmailApp.getAliases(); //スクリプトオーナーのアカウントのエイリアスされたアドレスが載っている配列
GmailApp.sendEmail("宛先", "件名", "内容", {from : alia[0]}); //Successfully sent!!!`

# モヤ
[docs](https://developers.google.com/apps-script/reference/mail/mail-app)を読んでもなぜMailAppとGmailAppのメール送信の仕方や引数、取りえるオプションに違いがあるのかは分からなかった……。
「メールを送る」という観点だけで考えれば同じような気がするんだけど、セキュリティ的な理由なんだろうか :thinking: 
GASプロがいたら教えてほしい。
ブロックチェーンと現実世界を繋げるOracle

# はじめに
最近Ethereumの勉強をはじめ、まだ全然初心者レベルですが、
勉強した内容を忘れないようにメモしたいので書かせていただきます。

# スマートコントラクトの課題
スマートコントラクトにおける課題の一つとして、ブロックチェーンと外部との情報のやりとりが不可能であることが考えられます。

例えば、
・今年のW杯でドイツが優勝したら、AがBに1ETHを渡す

みたいな契約がある場合、ドイツが優勝したかどうかの情報を知る必要があります。AがBにETHを渡すことはブロックチェーン場に記録されているので疑う必要がありませんが、ドイツが優勝したという事実は誰かがinputしてくれないとブロックチェーンだけでは解決が難しいのです。

もう一つの例としては保険があります。
仮にAが自動車保険に入っていて、Aの自動車が事故に遭ったとします。その時、Aの自動車がどのくらい故障したかをブロックチェーンに入力しない限りブロックチェーンのスマートコントラクトは実行されないので該当する情報をブロックチェーンにinputする作業が必要になります。

また、人が該当事実を入力しなければならない場合、自動化の意味もなくなり、さらに第３者(Middle Man)が登場するようになり既存のシステムと差異がなく、第３者が詐欺(Fraoud)をする余地が発生します。

# Oracleとは
それで登場したのがOracleです。(ソフトウェアではないw)
Oracleは、外部とデータのやりとりができないEthereumのスマートコントラクトの代わりに外部とデータのやりとりを行い、それで得られた情報をスマートコントラクトに渡す架け橋的な存在です。
![https://blockchainhub.net](https://steemitimages.com/DQmXFKRsTpX9VeDPhvzvpSmkonfMcJmTAEVW8HLDV9oaMiT/image.png " https://blockchainhub.net")
参考: https://blockchainhub.net

# Oracleの種類
Oracleにはいくつかの種類があります。
- Hardware Oracles
- Software Oracles
- Inbound Oracles
- Outbound Oracles
- Consensus Based Oracles
ですが、ここではHardware OraclesとSoftware Oraclesだけ説明します。

### Hardware Oracles
Hardware Oracleは事実上センサーのことです。外部の変化をセンサーが感知し、特定のシステムに入力する役割をするセンサーはコンピュター世界と現実世界を繋げる役割をします。ブロックチェーンにもこのようなセンサーが与える情報で一つのデータを作ることができます。例えば、車の破損具合、気温の変化などのデータを使うことができます。
### Software Oracles
インターネット上のデータを取ってくる役割をします。
例えばトランプ vs ヒラリーの当選結果を決める時に、ウェブ上にある数多くの記事のテキストから「トランプ当選」と「ヒラリー当選」という文言の数を比較します。もし「トランプ当選」が多ければトランプが当選したことをブロックチェーンにinputします。

# なぜOracleは重要なのか
Oracleが必要な理由は上記に記述したように、スマートコントラクトを第３者(Middle Man)なしに実現するには外部データが必須不可欠だからです。つまり、Oracleなしにはブロックチェーン上に作られるDappには限界があるということです。
例えば、grit computingをDappで実現したサービスがあるとしましょう。自分が利用者で、もしOracleなしで自分のPCのリソースがどのくらい使われ、時間はどのくらい提供したかを知ることができないとしたらこのサービスを利用し続けることができるでしょうか。結局、Oracleなしで作れるDappは外部データなしで実現できる１次元的なDapp、例えばギャンブルやメッセンジャー程度です。

# 終わりに
OracleはDappでサービスを考えている事業者やプラットフォームには必須不可欠ですが、結局Oracleも側からみると第３者だなーと正直に思います。それを克服するために異なる信頼できる技術を利用して回避することも不可能ではないと思いますが、もっとEthereumらしい、Dappらしい解決策やアイディアが出てきたらいいなーと思います(ふわっとしすぎ)

# 参考
https://blog.ethereum.org/2014/07/22/ethereum-and-oracles/
https://blockchainhub.net/blockchain-oracles/
http://about.smartcontract.com/
https://medium.com/@mustwin/building-an-oracle-for-an-ethereum-contract-6096d3e39551
TIMEOUTコマンドの出力を非表示にする

#サイレントモードでTimeoutコマンドを実行
「n 秒待っています。続行するには何かキーを押してください ...」という表示を出さない方法のメモ

nulにリダイレクトする

```
@echo off
timeout /t 3 >nul
```

[参照元](https://stackoverflow.com/questions/17829884/use-batch-file-timeout-without-echoing-command)
Django,TestCase,Thread

バージョン
python 3.6.4
django 2.0.3


以下のテストは成功するような気がするけど失敗する

```python:
class Test(TestCase):
    def threadmain(self):
        self.assertTrue(Foo.objects.all().count()>0)

    def test(self):
        #オブジェクトを作成する
        Foo.objects.create()

        th = Thread(target=self.threadmain)
        th.start()
        th.join()

        self.assertTrue(Foo.objects.all().count()>0)
```

結果
<pre>
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
........................................................Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/mnt/c/prj/sao/sao/tests.py", line 1414, in threadmain
    self.assertTrue(Foo.objects.all().count()>0)
  File "/usr/local/lib/python3.6/unittest/case.py", line 682, in assertTrue
    raise self.failureException(msg)
AssertionError: False is not true

.....................................
----------------------------------------------------------------------
Ran 93 tests in 3.652s

OK
Destroying test database for alias 'default'...

</pre>

対処
TransactionTestCaseを継承する

```python:
class Test(TransactionTestCase):
    def threadmain(self):
        self.assertTrue(Foo.objects.all().count()>0)

    def test(self):
        #オブジェクトを作成する
        Foo.objects.create()

        th = Thread(target=self.threadmain)
        th.start()
        th.join()

        self.assertTrue(Foo.objects.all().count()>0)
```

結果
<pre>
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.............................................................................................
----------------------------------------------------------------------
Ran 93 tests in 4.101s

OK
Destroying test database for alias 'default'...</pre>
１回のリクエストで複数回 Fatal error になるケース

PHP で Fatal error になるとその時点で処理が停止するため、１回のリクエストで２回 Fatal error にはならないはずですが、下記のような Fatal error の後でも実行できる処理で Fatal error が発生すると複数回発生することがあります。

- `register_shutdown_function` で登録したシャットダウン関数
- `session_set_save_handler` で登録したセッションハンドラ の `write` や `close`

```php
<?php
class MySessionHandler extends SessionHandler
{
    public function write($session_id, $session_data)
    {
        for (;;) {
            $arr[] = str_repeat('x', 1024*1024);
        }
        parent::write($session_id, $session_data);
    }

    public function close()
    {
        for (;;) {
            $arr[] = str_repeat('x', 1024*1024);
        }
        parent::close();
    }

}

register_shutdown_function(function () {
    for (;;) {
        $arr[] = str_repeat('x', 1024*1024);
    }
});

session_set_save_handler(new MySessionHandler(), true);
session_start();

for (;;) {
    $arr[] = str_repeat('x', 1024*1024);
}
```

１回のリクエストでログに複数回 Fatal error が出ているのを見て不可解に感じたけど、よく考えればおかしなことではなかった。

```
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 1052672 bytes) in /app/public/xxx.php on line 32
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 1052672 bytes) in /app/public/xxx.php on line 24
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 1052672 bytes) in /app/public/xxx.php on line 7
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 1052672 bytes) in /app/public/xxx.php on line 15
```