OmniAICreator/Qiita-1.07M huggingface dataset:
GCP Compute Engineを使ってLinuxサーバを始める

# はじめに
Google Cloud Platform (GCP) で仮想マシンを作成して利用する為の手順をまとめています。
この手順を行う前に予めGCPに「[共通鍵を設定する](https://qiita.com/ariaki/items/e225b815924d37bc19d5)」必要があるので注意しましょう。
今回はサーバ用途ではおそらく最も人気の高いディストリビューション「[Cent OS](https://www.centos.org/)」でのセットアップを紹介します。

# VMの作成から起動まで

## VMを作成する
1. Compute Engine→VMインスタンスの作成メニューを選択する<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/184843/f9c3f3ee-2b46-196f-6f4e-0d6a0aa21878.png" width="320"><br>
2. 「インスタンスを作成」をクリックする<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/184843/fb2341f6-d02c-f759-f17c-352cfb2063ca.png" width="480"><br>
3. 初期設定を行う<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/184843/0d91d580-3667-2be6-919d-3c0a4053a20c.png" width="320"><br>

それぞれの設定内容は以下の通り。

| 項目名 | 説明 | 
|:------|:-----|
| 名前 | マシンの名称（※後から変更不可） |
| ゾーン | 1. [無料利用枠](https://cloud.google.com/free/docs/frequently-asked-questions?hl=ja&_ga=2.118799241.-1478914968.1507256218#always-free)を利用する場合 … "us"から始まるものを選ぼう<br>2. それ以外の場合 … 主に日本からアクセスする場合は"asia-northeast1"から始まるものを選びましょう |
| マシンタイプ | 1. [無料利用枠](https://cloud.google.com/free/docs/frequently-asked-questions?hl=ja&_ga=2.118799241.-1478914968.1507256218#always-free)を利用する場合 … "f1-micro"を選びましょう<br>2. それ以外の場合 … 利用用途に応じてできる限り小さいものを選ぼう |
| ブートディスク| **Cent OS 7**を選ぼう |
| IDとAPIへのアクセス | 標準のアクセス範囲では**プログラムから多くのCloud APIにアクセスできない**ので、必要に応じてAPIへのアクセス権を設定しましょう（開発サーバ目的であれば「**すべての Cloud API に完全アクセス権を許可**」でも可） |
| ファイアウォール | Webサーバとして稼働させる場合は、チェックを入れよう |

※初期設定では、ネットワークIPアドレスに「エフェメラル（自動）」が設定されている為、インスタンスを停止／起動するごとにIPアドレスが再設定されます。
IPアドレスの固定化が必要な場合は画面下部の「管理、ディスク、ネットワーク、SSH 認証鍵 → ネットワーキングタブ」より外部IPアドレスの固定設定をしましょう。

設定が完了したら、画面下部の「作成」ボタンを押すとインスタンス生成が開始され、2-3分で起動し、SSH等で接続できるようになります。
以下のように一覧表示の左側に緑色のチェックアイコンがついたら生成完了！
<img src="https://qiita-image-store.s3.amazonaws.com/0/184843/aa5bc7ed-8515-d824-6345-bce0d0af6db7.png" width="480">
このインスタンスに外部からSSH接続するには「**外部IPアドレス**」を使います。


## VMにSSH接続する
VMの作成が完了したら、サーバにSSH接続しましょう。
Cloud Console からもSSH接続手段は提供されていますが使い勝手が悪いため、今回は「[RLogin](http://nanno.dip.jp/softlib/man/rlogin/)」というターミナルクライアントを使ってアクセスする方法を紹介します。
このクライアントはダウンロードしたEXEファイル1つだけで動作するシンプルな作りながら、複数接続先をタブを切り替えながら利用できたり、SFTPを使えたりと非常に高機能なので是非おすすめです。

[詳しい紹介](https://qiita.com/murachi1208/items/d6e4ce7ba75f1625fe51)を書いている人がいたので貼っておきます。

1. RLoginを起動し、接続ダイアログから「新規」を選択する<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/184843/8632990f-772d-85ea-1847-c797a3518915.png" width="320"><br>
2. 設定画面に必要な項目を設定する<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/184843/e008dff4-950b-5043-a784-686c4ba4f1cf.png" width="320"><br>
  * ① エントリー … サーバの名前を自由に設定しましょう
  * ② Server Address … GCPに表示された「外部IPアドレス」を設定しましょう
  * ③ User Name … SSHフィンガープリントに設定した「キーコメント名」を設定しましょう
  * ④ SSH Identify … 作成したキーペアの秘密鍵を設定しましょう
3. OKを押せば設定が完了し接続先一覧が表示されるので、「OK」ボタンより接続しましょう。<br>
※初回接続時には以下のようなダイアログが表示されるので、指示に従って接続を許可しましょう。<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/184843/fb45a190-8f53-c830-0cc0-ad4e8eff0757.png" width="320">

これでCompute EngineサーバにSSH接続されたはずです。
ターミナルクライアントであなただけのサーバを自由に操作できるようになりました。
sqliteによるデータ書き込み


普通にファイル保存するよりも小さいBLOBに限ってはDBにぶっ込んだ方が早いそうな。
排他とか色々あるから遅いと思ってたのですが、、、、、

それだけ性能上がってるなら普通のテーブルも高速に保存できるのか？
と思ったので検証

# 環境
* mac(結構前)
* go言語
* SQLite version 3.16.0 2

でsqlite3 VS json VS csv による出力でどれが早いかやってみますか。

jsonはその配列をデコードで出力するだけ、他は１レコード毎にする。
これでcsvより早ければそれはそれで価値があるってことね。

とりあえずsqlite3の勝利で終われば非常に楽だなぁ。

# 条件
* テーブルは以下にする
    1. ID(int)
    2. Title(string)
    3. value(int) 
* 1000件のレコード書き込みを10セット実施する。

# 結果

|DB追加|CSV|json|
|---|---|---|
|1.028847秒| 0.004198秒|0.005193秒|
|0.882089秒|0.003451秒|0.000538秒|
|0.753490秒|0.002792秒|0.000565秒|
|0.781892秒|0.003049秒|0.000592秒|
|0.785775秒|0.006175秒|0.000909秒|
|0.709185秒|0.002781秒|0.000600秒|
|0.696319秒|0.003531秒|0.000613秒|
|1.247061秒|0.003052秒|0.000569秒|
|0.774548秒|0.002544秒|0.000595秒|
|0.977571秒|0.002651秒|0.000593秒|

予想通り、やはり特定条件だけですね。
なんとなくDBの性能による副産物な感じがします。
セミオープン状態になってるとでもいいますかね。

そして、この際NoSQLでも試してみますかね。

# 改定
改めて時間ができたのでエントリーをみたところ、トランザクション閉じてないってことね。ということでやって見ました結果以下のようになりました。
![graf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51009/c58501b8-7438-a876-779c-6e267afaa34b.png)

一番時間がかかっているのが、本エントリーの最初のやつです。
変更した結果、このスケールのグラフだとほぼ変わらんところまで行きました。
それをやったあと、気づいたのはブロブ保存でそこそこのVARCHARを保存しないとダメじゃないかと思ったけど、本件については一旦完了と言うことで。
githubとsourcetree連携（画像あり、初めての方向け）

githubとsourcetreeの連携について、画像付きのものがなかったのであげます。（検索能力がないだけかもしれません。すみません）
sourcetreeで新規リポジトリを作るところから、githubと連携するまでの一連動作をまとめます。
sourcetreeとgithubのアカウントは取得済みであることが前提です。

#sourcetreeでリポジトリをつくる
まずは、自分がgithubで公開したいプロジェクトをgitで管理する。
そしてgitに上がったものがgithubにさらにアップロードされる感じです。

ではまず、リポジトリを作成します。
sourcetreeを起動すると、下の画面が出てきます。
上の部分にある「新規リポジトリ」を押します。
![スクリーンショット_2017-10-22_22_57_03.png](https://qiita-image-store.s3.amazonaws.com/0/147990/58a60700-29da-5dc7-ae52-f18393cecb81.png)

そうするとこのプルダウンが出てきますので、「ローカルリポジトリを作成」ボタンを押します。
![スクリーンショット_2017-10-22_22_58_00.png](https://qiita-image-store.s3.amazonaws.com/0/147990/04615961-3adc-33b5-2633-3c356cc74631.png)

ローカルリポジトリの作成画面になりますので、「保存先のパス」に自分の開発中のアプリケーションが置いてあるパスを記入します。
ここはfinder(macの場合）を見ればわかるかと思います。
例えば、Userフォルダのmynameのworkフォルダにあるexampleというプロジェクトならば、
User/myname/work/example のような感じでパスをいれます。
パスを記入し、okを押せばgitの管理画面に行きます。
![スクリーンショット 2017-10-26 23.31.03.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/1201af73-d193-2cd1-39d3-eafef74154a0.gif)


これでプロジェクトをgitで管理できるようになりましたので、githubにあげる準備をしましょう。

#githubのURLを確認する
githubのトップはこのような画面になりますので、start projectをクリックしてください。
![スクリーンショット_2017-10-22_23_02_39.png](https://qiita-image-store.s3.amazonaws.com/0/147990/f622631e-c66b-d303-d913-53e5ea5c0aba.png)

リポジトリ作成画面になりますので、お好きな名前をつけていただいて（写真はexample)、下の緑色のcreate　repositoryボタンを押しましょう。
　![スクリーンショット 2017-10-22 23.02.54.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/c9bada84-f966-90e7-bfdf-135bfdd3d53b.gif)



作成すると、URLが表示されます(SSHの隣にあるやつ)。このURLはあとで使うので、コピーしておいてください。そのあとsourcetreeに戻ります。
![スクリーンショット 2017-10-22 23.03.11.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/0dc0ddae-2caa-1e75-8929-328a7f9b6731.gif)


#sourcetreeでgithubのURLを登録する。
sourcetree、gitの管理画面の右上にある設定ボタンを押します。
![スクリーンショット 2017-10-22 22.59.13.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/e6d06cad-2fa0-4d79-7b8f-7a470087297c.gif)


この画面になりますので、上のタブのリモートを押します。
![スクリーンショット_2017-10-22_22_59_22.png](https://qiita-image-store.s3.amazonaws.com/0/147990/a4c6b207-b41b-62f9-8ca2-43dfa7ae2788.png)

下の画面になります。最初にこの画面に来た時はおそらく何もないはずです。（写真はすでにありますが。。。）　何もない場合は追加を押しましょう。　すでにある場合は、そのgitファイルがリポジトリに上がるのをよしとするなら編集。そうでなければ、追加で作ってしまいましょう。
![スクリーンショット 2017-10-22 22.59.29.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/aed4e6c0-a4d5-26ae-6c87-06e665dfd951.gif)


追加を押すと下の画面になります。リモートの名前はサービスの名前でいいかと。。。(今回はexample）
その下にあるURL欄に先ほどのgithubで入手したURLを貼り付けてください。
![スクリーンショット 2017-10-22 22.59.40.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/ca49bb0a-84b2-5ba5-9394-838ef3e53242.gif)
オプションの拡張とかはひとまず置いておいて、下のokボタン

これで、githubとsourcetreeの連携は完了です。
sourcetreeでpushしたものがgithubで新規追加されていくはずです。

意外と初めてやる時はわからなくなってしまったので、参考にしていただけると幸いです。

##個人開発をされている方へ

Moverというプロダクトを開発しています。登録していただくと、開発したプロダクトのテスト利用を依頼し、フィードバックをもらうことができます。自分のプロダクトを公開して個人開発を加速させましょう！！　現在僕のアカウントも登録されているので、そちらにテスト利用依頼をいただければ実際に使ってみた感想などをお送りさせて頂きます。(アドバイスなどではなく、一人のユーザーとしての感想となります。)　もちろん無料です。
https://mover-web.herokuapp.com/



![Screen Shot 2020-05-19 at 4.36.42 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147990/40822905-5a9d-6323-4318-bb475c68e887.gif)
AWSのAPIGatewayとLambdaの組み合わせを手軽に作成してみた

# AWSのAPIGatewayとLambdaの組み合わせを手軽に作成してみた

## はじめに

APIGatewayを手軽に作成してみました。Lambdaを実行し、固定文字列(json)を返します。

## ロールの作成

以下のロールを作成します。既に作成済み場合は次へどうぞ。

* Lambdaの実行権限を持つロール

IAMのロールからロールの作成を行います。Lambdaを選択して、

![ロールの作成　その1](https://qiita-image-store.s3.amazonaws.com/0/203323/c8f5722e-a78c-47c4-a0ed-c09039b42481.png)

`AWSLambdaBasicExecutionRole` のポリシーを選択します。
DynamoDBにもアクセスしたい、などありましたら、適宜追加してください。

![ロールの作成　その2](https://qiita-image-store.s3.amazonaws.com/0/203323/b354a95b-3f41-7979-64f3-f2e11562d582.png)

ロール名は適当に。

![Lambdaの作成　その3](https://qiita-image-store.s3.amazonaws.com/0/203323/69e1f771-2651-1b81-b361-418164b4aebd.png)

## Lambdaの作成

`microservice-http-endpoint-python3` を使用して作成します。
フィルタに追加すると絞り込めます。

![Lambdaの作成　その1](https://qiita-image-store.s3.amazonaws.com/0/203323/8e1e03ed-b424-f10a-fc4e-8a77e572fb80.png)


ポチポチと入力していきます。さきほど作成したロールを使用します。


![Lambdaの作成　その2](https://qiita-image-store.s3.amazonaws.com/0/203323/fba27289-52c5-7858-7c03-78697059c817.png)


関数コードはシンプルにしています。Pythonで書きます。

```python
import json

print('Loading function')

def lambda_handler(event, context):

    data = {}
    data['Message'] = 'This is return message.'

    return {
        'statusCode': '200',
        'headers': {
            'Content-Type': 'application/json',
        },
        'body': json.dumps(data),
    }
```

## 動作確認

httpアドレスを調べます。下記に記載してあるのでコピーします。

![Lambdaの作成　その3](https://qiita-image-store.s3.amazonaws.com/0/203323/642cf467-90cb-9e8a-d990-793adff414e6.png)


そして、ブラウザでアクセスすると、、、

![結果](https://qiita-image-store.s3.amazonaws.com/0/203323/a9dbbe91-6310-c309-0c6b-2e8d4071c2bf.png)


できました！！

あとはLambda側で好きにすれば、いろいろなことができますね。

## 参考Webサイト

今回は手軽に作成しましたが、APIGatewayでは様々な設定をすることが可能です。
その参考として下記Webサイトを載せておきます。（AWS公式ドキュメントも確認しましょう。）

* <https://qiita.com/vankobe/items/ab5bc6487c7e07cb3aba>
* <https://dev.classmethod.jp/cloud/aws/api-gateway/>
Stripeのダッシュボード上で決済情報を簡単に検索できるようにするためのマル秘でもないテクニック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/9a76fa60-ccff-afc6-b374-1a7a444c4a8b.png)

Stripeをご利用の開発者の皆様、こんな経験はございませんか？

- Dev環境とStage環境で同じテストアカウント使っているからどっちの決済情報か分からなくなる
- StripeデータとサービスのDBデータを紐付けて不整合が起こらない様チェックしたい

あるあるーと思った方はこのまま読み進めてください。
ないないーと思った方はどうぞスキップしてください。


あ、結論を言いますと、StripeのCustomerやCharge等の各種データにメタデータを付与することで上記を解決出来ます。 

#メタデータを付与してみよう
Stripeの[公式ドキュメント](https://stripe.com/docs/api#metadata)にある通り、各種データにはメタデータつまり紐付けたい独自の属性を付与することが出来ます。

例えばDBにStripeのCustomerを格納しているテーブルがあったとして、そのテーブルのプライマリキーや決済を行ったユーザーのIDをメタデータとしても良いです。
また一つのテストアカウントでDev、Stage等複数の環境で使用しているとしたら環境の情報も紐付けることが出来ます。

実際にPHPのサンプルコードでStripe決済時(Charge作成)にメタデータを付与してみましょう。

```php
// メタデータ
$metaData = [
    'env'        => 'stg',
    'user_id'    => 1,
];
        
$charge = [
    'customer'    => $customer,
    'amount'      => 1000,
    'currency'    => 'JPY',
    'description' => 'テスト',
    'metadata'    => $metaData
];

// Charge作成
$response = \Stripe\Charge::create($charge);

```

お分かりでしょうか？
Chargeとして登録する配列に`metadata`キーの値として更に連想配列を設定しています。
この連想配列に任意のキーバリューを設定出来るのでサンプルコードでは決済したユーザーIDと環境情報を付与しています。


#メタデータを基に検索してみる
Stripeのダッシュボードの検索ボックスでの検索は任意の文字列でのキーワード検索の他に`{Filterキー}：{値}`での検索が可能です。
https://stripe.com/docs/dashboard/search

例えばVISAカードでの決済情報を検索したい場合、`brand:visa`と入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/aab479c0-1faf-e03e-8518-d36e3cd7ee92.png)

実はこれと同様にメタデータによる検索も`{メタデータに設定したキー}:{値}`で可能となります。
例えば先程のサンプルコードで登録したChargeを環境別で検索する場合、`env:stg`と入力して検索すれば一覧に表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71113/6ad34557-0f99-dad7-a8cb-2e4eea1061e6.png)


簡単なことではありますが、このメタデータを使うと使わないでは、Stripeデータと自身のサービスのDBデータの整合性検証やダッシュボードの検索のし易さに大きな違いが出ますので、**必ず使うようにしましょう**。

ちなみに私はStripeを利用した決済機能のリリース直前にこのことに気づいて速攻で実装しました(汗)


これだけでダッシュボードからとっても検索しやすくなりましたとさ。
(何をメタデータとして登録するかはサービスによりますのでPLと相談の上、用法・容量を守り正しくお使い下さい)
trace-cmdコマンドの使い方

#1 trace-cmdとは
Linuxカーネルのftrace(カーネル内の各種処理を追跡するツール)を操作するためのコマンドです。
障害対応等のデバッグのときに使います。

#2 環境
VMware Workstation 12 Player上のゲストマシンを使っています。

```
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@server ~]# uname -r
3.10.0-514.el7.x86_64
```

#3 事前準備
##3.1 trace-cmdパッケージのインストール

```
[root@server ~]# yum -y install trace-cmd
[root@server ~]# rpm -qa|grep trace-cmd
trace-cmd-2.6.0-8.el7.x86_64
```


#4 trace-cmdのコマンド一覧

```
[root@server ~]# trace-cmd
trace-cmd version 2.6.

usage:
  trace-cmd [COMMAND] ...

  commands:
     record - record a trace into a trace.dat file
     start - start tracing without recording into a file
     extract - extract a trace from the kernel
     stop - stop the kernel from recording trace data
     restart - restart the kernel trace data recording
     show - show the contents of the kernel tracing buffer
     reset - disable all kernel tracing and clear the trace buffers
     report - read out the trace stored in a trace.dat file
     stream - Start tracing and read the output directly
     profile - Start profiling and read the output directly
     hist - show a historgram of the trace.dat information
     stat - show the status of the running tracing (ftrace) system
     split - parse a trace.dat file into smaller file(s)
     options - list the plugin options available for trace-cmd report
     listen - listen on a network socket for trace clients
     list - list the available events, plugins or options
     restore - restore a crashed record
     snapshot - take snapshot of running trace
     stack - output, enable or disable kernel stack tracing
     check-events - parse trace event formats
```
| コマンド | 概要                                                                                          |
|:--------|:----------------------------------------------------------------------------------------------|
|record   | トレースを開始する。終了はCtrl + cを押下する。トレースはファイル(trace.dat)に保存される。      　   |
|report   |  保存したトレース(trace.dat)をテキストファイルに変換する                                          |
|start    | トレースを開始する（トレースのメモリへの保存を開始)                                                |
|stop     | トレースを停止する（トレースのメモリへの保存を停止）                                               |
|extract  |  メモリに保存されているトレースをファイルに保存する                                                |
|reset    | メモリに保存されているトレースを消去する                                                          |
|show     | メモリに保存されているトレースを表示する                                                          |
|listen   | あるマシンで採取したトレースを別のマシンに転送するときに使います。詳細は[8章](https://qiita.com/hana_shin/items/359240688a53c849593b#8-listen%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)を参照ください。           |

最新版は以下に記載しました。
https://hana-shin.hatenablog.com/entry/2022/05/08/200215
bootstrapを使ってシンプルなWebページを作成する①〜セットアップ〜


# bootstrapとは

- cssのフレームワーク
- 自分でcssを書かなくてもシンプルできれいな画面を作れる
- bootstrapのcssで定義されたスタイルを適用していくので、特定のclass名をhtmlタグにつけていくだけ
- 最新版は4系だけどこの記事では3系について書いていく
- https://getbootstrap.com/docs/3.3/

## 動作確認するためのセットアップ手順

- [ここ](https://github.com/twbs/bootstrap/releases/download/v3.3.7/bootstrap-3.3.7-dist.zip)からダウンロードしてzipを展開する
- BootstrapはjQueryというjavascriptのライブラリに依存している
- jQueryは[ここ](https://raw.githubusercontent.com/jquery/jquery/1.12.4/dist/jquery.js)からダウンロードしてjsフォルダに入れておく
    - ソースが直接表示されてしまう場合は右クリックで名前をつけて保存する
    - フォルダに`jquery.js`という名前で配置
- こんな状態になっていればOK

<img width="293" alt="スクリーンショット 2017-10-26 22.16.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/d216c288-bd71-d467-634e-2e9f8cdce0a2.png">

- 不要なファイルを除外して最小限にするならこんな感じ

<img width="320" alt="スクリーンショット 2017-10-26 22.18.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/fe417d8a-e703-1768-0589-4b3e80be77dc.png">

## 動作確認

- bootstrapのファイルを配置したフォルダ内に`index.html`を作成する

<img width="201" alt="スクリーンショット 2017-10-26 22.20.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/8f75aabf-399f-c004-e0a1-29f51d1b6dfe.png">

- index.htmlに以下の内容を記載する

```html:index.html
<html>
  <head>
    <meta charset="utf-8">
    <title>bootstrap sample</title>
    <link rel="stylesheet" href="./css/bootstrap.css">
    <script src="./js/jquery.js"></script>
    <script src="./js/bootstrap.js"></script>
  </head>
  <body>
    <h1>Hello!</h1>
  </body>
</html>
```

- headタグの中でcssとjavascriptを読み込んでいる
- ファイルをブラウザで開くとこんな感じ

<img width="561" alt="スクリーンショット 2017-10-26 22.26.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/6c66f513-61e2-1d21-839b-3440bf0096d7.png">

- ここまでできたら後はbodyの中を作っていくだけ
- html + css + javascriptはファイルを作ってブラウザで開くだけで動作確認できるので便利
- 次回以降具体的な画面の作り方を見ていく

## 次回

- 続きは[こちら](https://qiita.com/ozaki25/items/7401c97ddcf0482aafa2)
Daydream開発入門 uGUIを使いスコアを固定位置に表示したかったけど出来なかった話

Unityで開発する際、uGUIを使いスコアを画面上部に固定表示することがあると思います
↓こんな感じのことをDaydreamでもやりたいなーと思ったのですが...
![スクリーンショット 2017-10-26 21.56.45.png](https://qiita-image-store.s3.amazonaws.com/0/112492/45703cc2-cf26-d2cb-fcb7-e1092d16a199.png)

結論から言うと、この固定表示はDaydreamでは**出来ません**
理由はUnityの[公式サイト](https://unity3d.com/jp/learn/tutorials/topics/virtual-reality/user-interfaces-vr)に記載がありました。抜粋すると、
> VR では通常、このアプローチは使用できません。理由は、人間の眼は近過ぎる物には焦点を合わせることができないことに加え、 Unity VR が Screen Space-Overlay に対応していないからです。

とのことです。そもそも対応していないのですね

ではDaydreamでスコア表示など、どうすれば良いかというと。こちらも先ほどのサイトに記載がありました
> VR では、上記の方式ではなく、通常は、描画モード（Render Mode）の World Space Canvas を使用して環境自体の中に UI を配置する必要があります。こうすることでプレイヤーの眼が UI に焦点を合わせられるようになります。これは Spatial UI （空間 UI）と呼ばれます。

画像のようにCanvasのRendre Modeを`World Space`にすればOKです
![スクリーンショット 2017-10-26 22.10.48.png](https://qiita-image-store.s3.amazonaws.com/0/112492/a648edfc-2b9c-d099-54f1-f49707e90213.png)

これでテキスト配置をすることが出来たのですが、さらに注意点として
> ワールド内に UI を配置する際にも注意すべきことがあります。UI がユーザーに近すぎると眼精疲労に繋がります。逆に遠すぎると水平線に焦点を合わせているような感覚になり、これは屋外の場合は問題ないかもしれませんが小さな部屋の場合は問題です。また UI の縮尺に関しても適正な設定が必要です。動的な設定が必要な場合もあります。

とのことなので、配置する際の大きさやカメラとの距離も考慮しないといけないのですね

[公式]((https://unity3d.com/jp/learn/tutorials/topics/virtual-reality/user-interfaces-vr))がすごくよくまとまっている上に日本語なので、ぜひ興味のある方は読まれると良いかと思います！
lensの演算子と等価な関数の対応表

　`view`と`(^.)`のように、
型は違えど（`flip`されていたり、一般化されていても）同じことをする
関数と演算子があります。

　よく`review`と`preview`を間違えて覚えてたりして困るので、
これをここにまとめておきます。

　なおここでの「等価」という言葉は「QuickCheckで両者の比較したら同じものが返ってくることをテストできるだろう」程度の意味合いで用いています。

|演算子 |関数 | 役割 |
|:----------------------------------------------|:--------------------------------------------------------------------|:----------------------------:|
| (^.) :: s -> Getting a s a -> a | view :: MonadReader s m => Getting a s a -> m a | `Lens`型向けのgetter |
| (^?) :: s -> Getting (First a) s a -> Maybe a | preview :: MonadReader s m => Getting (First a) s a -> m (Maybe a) | `Prism`型向けのgetter |
| (.~) :: ASetter s t a b -> b -> s -> t | set :: ASetter s t a b -> b -> s -> t | `Lens`型向けのsetter |
| (?~) :: ASetter s t a (Maybe b) -> b -> s -> t | 対応なし | 直和型に対するsetter**？？** |
| (#) :: AReview t b -> b -> t | review :: MonadReader b m => AReview t b -> m t | bにPrism (AReview) を適用してtを得る |


# 使用例
　以下ではこれのimportを省略します。

```haskell
import Control.Lens
import Data.Void (Void)
```

## ^.

```haskell
-- _1はLens
main :: IO ()
main = print $ ('a', Right 10) ^. _1
-- {output}
-- 'a'
```

## ^?

```haskell
-- _RightはPrism
main :: IO ()
main = print $ ('a', Right 10) ^? _2 . _Right
-- {output}
-- Just 10
```

```haskell
-- _LeftはPrism
main :: IO ()
main = print $ ('a', Right 10 :: Either Void Int) ^? _2 . _Left
-- {output}
-- Nothing
```

## .~

```haskell
main :: IO ()
main = print $ ('a', Right 10 :: Either Void Int) & _1 .~ 20
-- {output}
-- (20,Right 10)
```

`.~`は`Prism`にも使えます。

```haskell
main :: IO ()
main = print $ ('a', Right 10 :: Either Void Int) & _2 . _Right .~ 20
-- {output}
-- ('a',Right 20)
```

```haskell
-- 評価されないから恥ずかしくないもん！
dummy :: Void
dummy = undefined

-- _Leftの照合に失敗するので、変更が起こらない
main :: IO ()
main = print $ ('a', Right 10 :: Either Void Int) & _2 . _Left .~ dummy
-- {output}
-- ('a',Right 10)
```

## ?~

```haskell
main :: IO ()
main = print $ ('a', Right 10) & _2 ?~ 20
-- {output}
-- ('a',Just 20)
```

```haskell
main :: IO ()
main = print $ ('a', Just 10) & _2 ?~ 20
-- {output}
-- ('a',Just 20)
```

```haskell
main :: IO ()
main = print $ ('a', Right 10 :: Either Void Int) & _1 ?~ 20
-- {output}
-- ('a',Just 20)
```


# 余談
## 関数の方の使いどころ
　演算子でなく関数を使った方が綺麗に書けるパターンとして、以下のように
`Functor`の内側にアクセッサを適用したいというものがあります。

```haskell
{-# LANGUAGE TemplateHaskell #-}

import Control.Lens

makeLensesFor [("runIdentity", "_Identity")] ''Identity

x :: Identity (Identity Int)
x = Identity $ Identity 10

-- ここ
z :: Identity Int
z = x <&> view _Identity

main :: IO ()
main = print z
```
ブラウザに画像ファイルをドラッグアンドドロップして表示

# ブラウザに画像ファイルをドラッグアンドドロップして表示

## 仕様

- HTMLのドロップエリアに画像ファイルを落とすと、表示エリアに画像が表示される
- テスト段階なので無駄がおおいかもしれないがとりあえず動く

## ソース

### HTML

```HTML:test_8.htm
<html>
<head>
<link rel="stylesheet" type="text/css" href="test_8.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript" src="test_8.js"></script>
<title>test_8 ブラウザに画像ファイルをドラッグアンドドロップして表示</title>
</head>
<body>
<div id="droparea">ファイルをドロップしてください。</div>
<div id="viewarea">ここに表示</div>
</body>
</html>

```

### CSS

```css:test_8.css
#droparea,#viewarea{
border: gray solid 1em;
padding: 2em;
}

```

### javascript

```javascript:test_8.js
$(function() {
  $("#droparea").on({
    "dragenter dragover":function(e){
      e.preventDefault();
    },
    "drop":function(e){
      var file = e.originalEvent.dataTransfer.files[0];
      var fr1 = new FileReader();
      fr1.onload = function(e) {
        var blob=new Blob([e.target.result],{"type":file.type});
        var fr2 = new FileReader();
        fr2.onload = function(e) {
          var src=e.target.result;
          src=new Uint8Array(src);
          src=String.fromCharCode.apply("",src);
          src=btoa(src);
          src="data:"+file.type+";base64,"+src;
          $("<img>").attr({"src":src,"alt":file.name}).appendTo('#viewarea');
        }
        fr2.readAsArrayBuffer(blob);
      }
      fr1.readAsArrayBuffer(file);
      e.preventDefault();
    },
  });
});
```

## 検証

今後の調整課題

- そもそもfilereaderは2ついるのか？
- バイナリの中間形式に無駄はないのか？
- サイズが大きなデータでメモリオーバーがおきないのか？

## 動作確認

各Windows版

- IE11
- Edge
- Firefox56
- Chrome62
オフラインリアルタイムどう書くF07の実装例


問題 : http://nabetani.sakura.ne.jp/hena/ordf07walk/
実装リンク集 : https://qiita.com/Nabetani/items/cf93b63acc8a313c88bb

当日は ruby の実装をお見せしたんだけど、なんとなくここでは python。

python2 でも python3 でも動くと思う。
慣れない class を使ってみた。

```python:python
class Walker:
  def __init__( self, src ):
    self._map = [[int(x) for x in list(line)] for line in src.split("/")]
    self._visited=[[False for x in range(5)] for y in range(5) ]

  def visited(self,x,y):
    return self._visited[y][x]

  def map(self,x,y):
    return self._map[y][x]

  def visit(self, x, y):
    self._visited[y][x]=True

  def walk(self, x, y):
    self.visit(x,y)
    nb0 = [[x+n[0], y+n[1]] for n in [[0,-1],[0,1],[-1,0],[1,0]]]
    nb1 = [n for n in nb0 if n[0] in range(5) and n[1] in range(5) and not self.visited(n[0], n[1]) ]
    cur = self.map(x,y)
    nb = [n for n in nb1 if abs(cur - self.map(n[0],n[1]))<2 ]
    for n in nb:
      self.walk( n[0], n[1] )

def solve( src ):
  w=Walker(src)
  w.walk(2,0)
  return "/".join([
    "".join(["*" if w.visited(x,y) else str(w.map(x,y)) for x in range(5) ])
    for y in range(5)
  ])

def test( src, expected ):
  actual = solve(src)
  okay = actual==expected
  print( ", ".join( [("ok" if okay else "**NG**"), src, actual, expected ] ) )

test( "12345/29496/19485/09594/82457", "*****/*9*9*/*9*8*/*9*9*/82**7" );
test( "12345/11011/65432/71999/65432", "*****/*****/*****/*1999/*****" );
test( "11111/11111/11111/11111/11111", "*****/*****/*****/*****/*****" );
```

いつも通りテストデータの大半は省略。
順当な深さ優先探索。

リスト内包表記をたくさん使ってみた。
`Walker` の `walk` で、`nb0`, `nb1`, `nb` の辺りが美しくない。たくさん条件のある `if` をを書くよりこの方がいいかと思ったけど、微妙。
プロパティ属性のweakについて

今更ながら、プロパティの属性について備忘録を残しておこうと思います。

プロパティの属性とは
プロパティを宣言する際につける、(strong, nonatomic)的なもの。

```
@property (strong, nonatomic) NSString *userName;
```

今回は、左側の「strong」などに関して、メモします。
これは、宣言したオブジェクトの値を解放するかをどうかを明示的に指定するもののようです。
種類としては、strongとweakの２つが主。

**"strong" = 使わなくなっても値を保持する**　
**"weak" = 使わなくなったあとは値がnullになる**

みたいなニュアンスならイメージしやすいかもしれません。

ちなみに、属性指定をしなかった場合どうなるか。
属性を指定しない場合でも、エラーなどは出ずに動きます。
それは、**「何も書かなかったら勝手にstrongになる」**という設定があるからです。

ただ、最近「weak出なければいけないところが、strongになっていた」などのケースで起こるクラッシュがあったので、
今回は、細かい説明は省き、weakにした方がいい点のみをメモしておこうと思います。

##weakで宣言している箇所

**Outletで宣言するとき**
→ 基本は宣言時に勝手に設定されるので問題なし

**デリゲートプロパティを宣言するとき**
→ strongで宣言するとメモリーリークが起こる可能性がある

**ブロック処理のハンドラー内でselfを使うとき**
→ ブロックとクラスの間で循環参照が起こってします可能性がある


以上です。
AnsibleでAWSのSG(Security Group)ルール追加


## 経緯
- AnsibleからAWSのSecurity Groupルール追加で色々分かったので投稿

## 前提
- 既に作成してあるSecurity Groupにルールを追加する

## 参考
- http://docs.ansible.com/ansible/latest/ec2_group_module.html

## YAML記載例

### 単体ポート指定 + CIDR表記

- 以下のYAMLの場合管理コンソール上ではプロトコルSSHと認識してくれます

```bash
- name: add Securty Group rule
  ec2_group:
    name: セキュリティーグループ名 
    description: 説明 <= 既に作成してあるSGと同じものにしてください
    region: リージョン
    vpc_id: VPC-ID
    rules:
      - proto: TCP
        ports: 22
        cidr_ip: 10.0.0.0/16
```

### ポート範囲指定 + CIDR表記

```bash
- name: add Securty Group rule
  ec2_group:
    name: セキュリティーグループ名 
    description: 説明 
    region: リージョン
    vpc_id: VPC-ID
    rules:
      - proto: TCP
        ports: 25-40 <= 範囲してはここで行います
        cidr_ip: 192.168.10.0/24
```        

### 単体ポート指定 + ソースSG指定

```bash
- name: add sg rule
  ec2_group:
    name: セキュリティーグループ名
    description: 説明
    region: リージョン
    vpc_id: VPC-ID
    rules:
      - proto: TCP
        ports: 3389
        group_id: sg-hogehoge <= SG-ID を記載(moduleはgroup_id)
```

### ポート範囲指定 + ソースSG指定

```bash
- name: add sg rule
  ec2_group:
    name: セキュリティーグループ名
    description: 説明
    region: リージョン
    vpc_id: VPC-ID
    rules:
      - proto: TCP
        ports: 5000-8000 <= ポート範囲指定
        group_id: sg-hogehoge 
```

## 結論
- 管理コンソールで出来る事はAnsibleからでも可能
- 送信元ポート単体指定は勿論可能
- 送信元ポートの範囲指定も可能
- 送信元SG(Security Group)の指定も可能
Windowsキー＋カーソルキーの動作を整理する

Windows10にて、Windowsキー＋カーソルキーでアクティブウィンドウの制御ができる（Windows7以降？）が、ウィンドウがどの状態の時にどのキーを押すとどんな挙動になるのかが、組み合わせによってはよくわかっていなかったので、整理して表にまとめてみた。

| ウィンドウ状態 | Windows+↑ | Windows+↓ | Windows+← | Windows+→ |
|:-:|:-:|:-:|:-:|:-:|
| **最大化** | 変化なし | 通常 | 左1/2サイズ | 右1/2サイズ |
| **通常** | 最大化 | 最小化 | 左1/2サイズ | 右1/2サイズ |
| **左1/2サイズ** | 左上1/4サイズ | 左下1/4サイズ | 右1/2サイズ | 通常 |
| **右1/2サイズ** | 右上1/4サイズ | 右下1/4サイズ | 通常 | 左1/2サイズ |
| **左上1/4サイズ** | 最大化 | 左1/2サイズ | 右上1/4サイズ | 右上1/4サイズ |
| **右上1/4サイズ** | 最大化 | 右1/2サイズ | 左上1/4サイズ | 左上1/4サイズ |
| **左下1/4サイズ** | 左1/2サイズ | 最小化 | 右下1/4サイズ | 右下1/4サイズ |
| **右下1/4サイズ** | 右1/2サイズ | 最小化 | 左下1/4サイズ | 左下1/4サイズ |
なるほど、こういうことか！
よしわかった！
終了！
Xcode Botについて

誰も書いてないみたいなので、後で書く。

Xcode botとはxcode9からxcodeにbuiltinになった、CIです。

## 総括

https://medium.com/xcblog/xcode9-xcode-server-comprehensive-ios-continuous-integration-3613a7973b48

個人的な感想としては、fastlaneをjenkinsで使うよりもxcodeでビルドした方が安定している印象です。Pull Request連携とかはないですし、apiも使いづらいですが、**Continuous Delivery Tool**としてビルドをアップロードするなどは、結構行ける気がします。

## Xcode9からはexportoption.plistを指定しましょう。

**自動ではexportに失敗することがある**ので、exportoption.plistを作成してxcode serverにアップロードすることをオススメします。

- use custom export optionを選択

## Slackに結果を通知したい。

https://gist.github.com/ArtSabintsev/38947954cf4a86ff93b4

この通りにやればできます。**Hipchat**も似たような感じです。
Terraform 環境周りTips 

環境は以下の３つの環境があるということにして話を進めます

* dev: 開発環境
* stg: ステージング環境
* prd: 本番環境


#workspaceの用意と開発環境で構築を進める
```bash
$ terraform workspace new dev
$ terraform workspace new stg
$ terraform workspace new prd
$ terraform workspace list
* default
  dev
  prd
  stg
$ terraform env select dev
```
参考 https://www.terraform.io/docs/state/workspaces.html#using-workspaces


#Terraform内で環境情報を利用する
##単純な呼び出し
```
count = "${terraform.env}"
```

##環境ごとに変数の内容を切り替える
###変数定義
```
variable "demo" {
  type = "map"
  default = {
    dev.comment = "開発環境だよー"
    stg.comment = "ステージングだよー"
    pro.comment = "本番だよー"

    dev.instance_count = 1
    stg.instance_count = 3
    prd.instance_count = 10
  }
}
```

###利用側 
```
comment = "${lookup(var.demo, "${terraform.env}.comment")}"
count = "${lookup(var.demo, "${terraform.env}.instance_count")}"
```

##環境ごとにリソースの数を変える
↑で定義した変数をそのまま使います

```
resource "aws_lambda_function" "log_warner" {
  count = "${lookup(var.demo, "${terraform.env}.instance_count")}"
~~~~~以下略~~~~~~
```

##開発環境にはリソースを作らない
開発環境はアラートいらないよねーって言う時などに使う

```
resource "aws_lambda_function" "log_alart" {
  count = "${terraform.env == "dev" ? 0 : 1}"
~~~~~以下略~~~~~~
```
fastlane の info.plist 指定でハマったのでメモ


#tl;dr

`info_plist_path` の実体が `xcodeproj + ".." + plist_path` になるようにパラメータを書け

## どういうこと？

`update_app_identifier()` とか `update_info_plist()` とかは、 iOS向けビルドを作るために fastlane にお仕事してもらう際、アプリのBundle IDとかアプリ名称とかを変更してもらう時に使う。
Dev版と本番で名前変えたいとかそういうたぐい。こんな使い方。

```ruby
update_app_identifier(
  xcodeproj: PROJ_PATH,
  plist_path: PLIST_PATH,
  app_identifier: "com.example.testapp.dev"
)
```
    
```ruby
update_info_plist(
  xcodeproj: PROJ_PATH,
  plist_path: PLIST_PATH,
  display_name: "[dev] example app"
)
```

んで、カンで 「xcodeproj と plist_path それぞれそのものを示してればいいんだろうなー」と考えて設定していたが、どうしてもfastlaneがその .plist を見つけられない。

## 原因は

この2つ、 .plist へのパスをこんな風に作ってやがりました。

```ruby
info_plist_path = File.join(params[:xcodeproj], '..', params[:plist_path])

```

('A`)なんで


### 遠因は

この時いじっていたのが ionic だったので、プロジェクトフォルダが `./platforms/ios/target.xcodeproj` とかにあり、真面目に相対パス書いてたのでこのパスの作り方の地雷を踏んだ形。

```ruby
update_info_plist(
  xcodeproj: "./platforms/ios/target.xcodeproj",
  plist_path: "./platforms/ios/target/target-Info.plist"
)
```

↓

```ruby
info_plist_path = "./platforms/ios/platforms/ios/target/target-Info.plist"
```

そりゃそんな所には何もありませんわ....

## 対処は

別に xcodeproj に指定してるパスに対して何かをしてるわけではなさそうなので、出来上がる `info_plist_path` を想像しながら

```ruby
update_info_plist(
  xcodeproj: "./target.xcodeproj",
  plist_path: "target/target-Info.plist"
)
```


とか書いてやりゃあいい。
地雷踏んでた ionic の例だとこう。

```ruby
update_info_plist(
  xcodeproj: "./platforms/ios/target.xcodeproj",
  plist_path: "target/target-Info.plist"
)
```
共有のSSHユーザアカウントでも自分だけの.bashrcを使う裏ワザ

なんらかしらの事情でサーバに個人ユーザを作れず、複数人でひとつのSSHを共有して使う場面があります。個人ユーザを作ることが許される環境であれば、自分のアカウントに.bashrcを置いて自分用のカスタマイズをできます。しかし、共有アカウントの場合は他の人もログインすることを考えて.bashrcを書き換えられなかったりします。

こうしたケースでも自分用の.bashrcを使える方法があります。

## ログインした後に`source`するオーソドックスな方法

まず、個人的な.bashrcは他の人の迷惑にならなそうなところに置きます。

たとえば、`~/company03/suin/.bashrc`といった自分用のフォルダに置くとします。

ログインした後に`source`するオーソドックスな方法では、最低でも次のような2ステップになります。

```
# 目的のサーバにログインする
$ ssh company03@example.com

# ログイン後に個人的な.bashrcを読み込む
[company03@websvr ~]$ source ~/company03/suin/.bashrc
```

この方法だとSSHするたびに`source`コマンドを実行しなければならず、頻繁にログインするサーバではとても面倒です。

## ~/.ssh/authorized_keysを細工する方法

~/.ssh/authorized_keysを細工すると、オーソドックスな方法ではどうしても必要になってしまう2ステップ目を省くことができます。

~/.ssh/authorized_keysはログインを許可する公開鍵を列挙するファイルですが、カギ情報の他にもオプションを書くことができます。そのオプションのひとつに`command`オプションがあります。このオプションは特定の鍵でログインしたとき、自動的にそのコマンドを実行し、その処理が終わったらSSH接続を切断する設定です。

たとえば、次のように`command`オプションに`ls`をセットしておくと、SSHでログインしたら自動的に`ls`を実行し切断されます。

```~/.ssh/authorized_keys
...他の人の公開鍵...
command="ls" ssh-rsa AAAA…(公開鍵中略)…Kbm1 suin@suin.local
```

これを応用して、`command`に`bash --rcfile ~/company03/suin/.bashrc`をセットしておきます。`bash`コマンドは自分でexitしない限り処理が続いていくので勝手に切断されることはありません。自分のbashrcを読み込ませるために、`bash`コマンドには`--rcfile`オプションを渡します。当然ですが、SSH公開鍵は自分個人のものを`~/.ssh/authorized_keys`に書くようにしてください。


```~/.ssh/authorized_keys
...他の人の公開鍵...
command="bash --rcfile ~/company03/suin/.bashrc" ssh-rsa AAAA…(公開鍵中略)…Kbm1 suin@suin.local
```

このようにしておくと、共有のSSHアカウントでも`ssh`コマンド一発で、自分がログインしたときだけ自分の個人的な.bashrcを自動的に読み込んでくれるようになります。

なお、`command`オプションを設定するときは、設定に失敗してSSHできなくなることも想定して、別窓で予備のSSH接続を維持しておくことをオススメします。
AndroidStudioでのandroidannotations導入

急にAndroidアプリを作ることになってしまった人が、知識ゼロからひとまず自力で導入できるかどうかやってみる。

2017/10/26現在での条件

- AndroidStudio 2.3.3
- androidannotations 4.3.1

何はともあれ公式ドキュメント
https://github.com/androidannotations/androidannotations/wiki/Building-Project-Gradle

# 手順

##1.GradleのConfiguration


build.gradle(Module: app)のdependenciesのところにannotationProcessorとcompileを書き足す

```
def AAVersion = '4.3.1'
dependencies {
    // 中略
    annotationProcessor "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"
}
```

##2.ビルドしてみる

>10:26	Executing tasks: [clean, :app:generateDebugSources, :app:compileDebugSources]
>10:26	Gradle build finished in 17s 690ms
>10:26	Gradle sync started
>10:26	Gradle sync completed

おお、なんだか成功したようだ

#使ってみる
ためしにFragmentに配置したボタンにイベントハンドラをつける。

``` AndroidManifest.xml
<application>
    <activity android:name=".MainActivity_">　// _をつける
```

``` MainActivity.java
@EActivity(R.layout.activity_main) // 追加
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 中略
        // Fragmentを追加するところを修正
        MainFragment fragment = new MainFragment_(); // _をつける
        getFragmentManager().beginTransaction().add(R.id.container, fragment).commit();
    }
}
```
``` fragment_main.xml
    <Button
        android:id="@+id/SearchButton" />
...以下略
```
``` MainFragment.java
@EFragment(R.layout.fragment_main)
public class MainFragment extends Fragment {
    @Click
    // fragment_main.xmlで指定したidをそのままメソッド名にする
    public void SearchButton(View view) {
        Log.d("MainFragment ", "ボタンが押されました");
    }
}
```

ボタンを押すとlogcatにログが出る。

以上。
Vue.js で画像(ファイル)アップロード直後に表示させる方法

## バージョン
Vue.js： 2.4.3

## サンプル
https://jsfiddle.net/vtexxmh1/1/
![vue_upload.gif](https://qiita-image-store.s3.amazonaws.com/0/57002/a578101e-5f95-4085-568f-cacc6a916727.gif)

## 方法
### `v-on` でチェンジイベントを取る

```.html
<div id="app">
  <h2>↓画像↓</h2>
  <img v-show="uploadedImage" :src="uploadedImage" />
  <input type="file" v-on:change="onFileChange">
</div>
```

### 取得したファイルをバインドする

```.js
new Vue({
  el: '#app',
  data() {
    return {
      uploadedImage: '',
    };
  },
  methods: {
    onFileChange(e) {
      let files = e.target.files || e.dataTransfer.files;
      this.createImage(files[0]);
    },
    // アップロードした画像を表示
    createImage(file) {
      let reader = new FileReader();
      reader.onload = (e) => {
        this.uploadedImage = e.target.result;
      };
      reader.readAsDataURL(file);
    },
  },  
})
```
goでtraitっぽいやつとDCIっぽいやつ

# traitのmixinっぽいやつ
っぽいやつじゃなく、mixinのイメージ通りのものは[実装されてる方がいらっしゃる](https://gist.github.com/haazime/270657beb140a307a559)みたい。

でもgolangはエイリアス型を宣言できるので、レシーバーでメソッドを付け加えることでtraitっぽいことができるし、作ったオブジェクトの型変換だけでやりたいことは事足りるんじゃ？

構造体のフィールドはそのままで振る舞いだけを特化するので、オブジェクト指向のダウンキャストと違って安全に（アプリ動作的に安全とかではなく、ポインタは変わらないだけだけど）新しい型として振る舞えそう。

以下、妄想で書いてるのでなんの検証もしてません。

# 例：DCIっぽい実装
シンプルな手続き型言語であることを活かしてDCIっぽく実装できそうとか思ったので、脊髄反射的なサンプル書いてみた。

```go:例１
package main

import (
	"fmt"
)

func main() {
	// 普通のたろー君
	taro := NewPerson("Taro")
	fmt.Printf("ポインタ %pの%sとして生まれた\n", taro, taro.Name)
	// たろー君設計する
	ctxDesign(taro)
	// たろー君プログラマーになる
	ctxProgramming(taro)
	// なんならgoも書くよ
	ctxGoProgramming(taro)

	fmt.Printf("たろー君の人生は終わらない。ポインタはずっと同じ。%p\n", taro)

	// 逝く。
	taro = nil
	fmt.Printf("臨終。%v\n", taro)
}

// 人だよ
type Person struct {
	Name string
}

// 出産
func NewPerson(name string) *Person {
	return &Person{
		Name: name,
	}
}

// 設計書書くよ
type DocumentWritable interface {
	WriteDocument(spec string)
}

// コード書けるよ
type CodeWritable interface {
	WriteCode(code string)
}

// アーキテクト
type Architect Person

func (a Architect) WriteDocument(spec string) {
	fmt.Println(spec)
}

// プログラマー
type Programmer Person

func (p *Programmer) WriteCode(code string) {
	fmt.Println(code)
}

// goプログラマー
type Gopher Programmer

func (p *Gopher) WriteCode(code string) {
	fmt.Printf("fmt.Println(\"%s\")\n", code)
}

// コンテキスト: 人雇って設計書を書かせる
func ctxDesign(p *Person) {
	a := (*Architect)(p)
	fmt.Printf("ポインタ %pのアーキテクト%s\n", a, a.Name)
	a.WriteDocument("こんなあぷりつくる")
}

// コンテキスト: 人雇ってプログラマーとしてコード書かせる
func ctxProgramming(p *Person) {
	pgr := (*Programmer)(p)
	fmt.Printf("ポインタ %pのプログラマ%s\n", pgr, pgr.Name)
	codingTask(pgr)
}

// コンテキスト: 人雇ってgoプログラマーとしてコード書かせる
func ctxGoProgramming(p *Person) {
	pgr := (*Gopher)(p)
	fmt.Printf("ポインタ %pのgoプログラマ%s\n", pgr, pgr.Name)
	codingTask(pgr)
}
func codingTask(coder CodeWritable) {
	coder.WriteCode("HelloWorld!")
}
```
[playground](https://play.golang.org/p/DiqPUAPQfC)

## アンチパターン
オブジェクト指向言語だとエイリアス型の宣言自体がアンチパターンとして挙げられるみたいだし、モデルの振る舞いがデータと切り離されるという意味では、ドメイン駆動に対して典型的な貧血症モデル。構造体はドメイン内でどう振る舞うかなんて知らないから、パッケージ外に複雑な操作は公開しないほうがよさそう。
Unity で Xcode のプロジェクトを生成後に必要な設定を Unity の Script で自動化する方法


## 概要
iOS 用の Cocoa Touch Static Library を作ったものの、Unity でビルドが通らず、Xcode の Build Settings を変更する必要があった。
毎回手作業で変更するには項目数が多すぎたのと、自分以外の環境でビルドできないと意味がないので、自動化する方法がないか調べてみた。

## Cocoa Touch Static Library を作る方法
下記を参考にしました。
[UnityでAndroid、iOS両対応のC++プラグインの実装](http://devops.vccorp.net/blog/2015041701/)
[Unity & iOSプラグイン連携](https://qiita.com/shell/items/7a1e585f030f3f6aa601)
[[Unity] C#とObjective-Cの連携まとめ](https://qiita.com/tkyaji/items/74d485a021c75ed10bca)

## 自動化する方法
下記を参考にしました。
[UnityでXcodeの設定を自動化する方法まとめ](http://smartgames.hatenablog.com/entry/2016/06/19/164052)

コピペですが、一応、ソースコード。

```XcodeSettingsPostProcesser.cs
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.iOS.Xcode;
using UnityEditor.Callbacks;
using System.Collections;

public class XcodeSettingsPostProcesser
{
    [PostProcessBuildAttribute(0)]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
    {
        // iOS以外のプラットフォームは処理を行わない
        if (buildTarget != BuildTarget.iOS)
        {
            return; 
        }

        // PBXProjectの初期化
        var projectPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
        PBXProject pbxProject = new PBXProject();
        pbxProject.ReadFromFile(projectPath);
        string targetGuid = pbxProject.TargetGuidByName("Unity-iPhone");

        // ここに自動化の処理を記述する
        pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_MODULES", "NO");
        pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_MODULE_DEBUGGING", "YES");
        pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_OBJC_ARC", "NO");

        // 設定を反映
        File.WriteAllText(projectPath, pbxProject.WriteToString());
    }
}
```

## 少しでも楽に設定を C# のソースコードに反映する方法
1. Library を作るときの Git の履歴から、project.pbxproj ファイルの変更行をコピーして、テキストエディタにコピペ
2. テキストエディタの検索置換で正規表現を使って整形
3. C# のソースコードにコピペ

**検索パターン**

```
\t\t\t\t"?(.+?)"? = "?(.+?)"?;$
```

**置換パターン**

```
pbxProject.AddBuildProperty(targetGuid, "\1", "\2");
```

**置換前のテキスト**

```
				CLANG_ENABLE_MODULES = NO;
				CLANG_ENABLE_MODULE_DEBUGGING = YES;
```

**置換後のテキスト**

```
pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_MODULES", "NO");
pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_MODULE_DEBUGGING", "YES");
```

環境によって検索側のパターンは変える必要があると思う。
あと、AddBuildProperty は設定を追加するので、Unity がビルド時に設定を追加していると、「Unity が書き換えた設定 + Script で追加した設定」というおかしな状態になるので、必要に応じて関数を変えないとダメ。

## 感想
毎回手作業で40個ぐらい設定を変える必要がなくなったので、その分猫社員を撫でようと思った。
python基礎 | 正規表現 初歩の初歩

使い方すぐ忘れる。。。とても参考にしたのはこちら。

[Pythonでの正規表現の使い方](https://qiita.com/wanwanland/items/ce272419dde2f95cdabc)

## 使い方
```py3
>>> pattern = r"ca"
>>> s = "canada"
>>> r = re.compile(pattern)
>>> r.match(s).group()
'ca'
```
group()のところ、search()とかいろいろある。

## 自己問答

###### Q) rってなんだっけ。
A) 
> それから、パターンの最初にrを付けることをを勧めします、付けなくても基本的には大丈夫ですが、付けることによって文字列中のバックスラッシュ文字をそのままバックスラッシュとして扱えるので、パターンの書き方が分かりやすくなります。
[Pythonでの正規表現の使い方](https://qiita.com/wanwanland/items/ce272419dde2f95cdabc)

raw文字列にするかしないか。下でテストをしていますが、エスケープシーケンスのことを気にしないでよいので、rを付けておいたほうがよいでしょう。

###### Q) raw文字列にするかしないか、って何をだっけ？
A) patternと対象の文字列の2つ。
[Python の raw 文字列を用いて正規表現を書く](http://d.hatena.ne.jp/pyxis-dev/20080229/1204290507)を参考に。

> pattern も string も raw 文字列

```py3
>>> re.findall(r'\\\'', r'backslash \' single quote')
["\\'"]
>>> print re.findall(r'\\\'', r'backslash \' single quote')[0]
```

> pattern も string も 普通の文字列（バックスラッシュのエスケープが必要）

```py3
>>> re.findall('\\\\\'', r'backslash \\\' single quote')
["\\'"]
>>> print re.findall('\\\\\'', r'backslash \\\' single quote')[0]
```


###### Q) あれ、raw文字列ってそもそも何か違うの。。。
A) [Pythonのバックスラッシュの話](https://blog.varwww.com/2015/04/python-backslash.html)を参考に、試し打ちをするとraw文字列と文字列の違いがよくわかりました。raw文字列だとr'\n'で \n とprintされる、エスケープシーケンスじゃなくなるのかぁ。

__文字列__

```py3
>>> s = '\\'; s; len(s) ;print(s)
'\\'
1
\
>>> s = '\n'; s; len(s) ;print(s)
'\n'
1

>>> s = '\'; s; len(s) ;print(s)
  File "<stdin>", line 1
    s = '\'; s; len(s) ;print(s)
                               ^
SyntaxError: EOL while scanning string literal
>>>
>>>
```

__raw文字列__

```py3
>>> s = r'\\'; s; len(s) ;print(s)
'\\\\'
2
\\
>>> s = r'\;'; s; len(s) ;print(s)
'\\;'
2
\;
>>> s = r'\n'; s; len(s) ;print(s)
'\\n'
2
\n
>>> s = r'\'; s; len(s) ;print(s)
  File "<stdin>", line 1
    s = r'\'; s; len(s) ;print(s)
                                ^
SyntaxError: EOL while scanning string literal
>>>
```

## その他参考
[Windowsのパスがうまく指定\表示できない問題 in Python](http://cocodrips.hateblo.jp/entry/2015/07/19/120028)

## あとがき
勉強した時にメモを残すことを肝に命じます。でないと、繰り返し調べている。。。
[WPF][XAML]StyleにTextWrappingのWrap指定をすると表示が遅くなる

## 概要
テキストが大量に入っている要素にTextWrappingのWrapスタイルを適用すると、
表示するまでに時間がかかりフリーズしてしまいます。

## 環境
- Windows10
- Visual Studio Professional 2015

## 発生条件
- スタイルにTextWrappingのWrapを指定している
- テキスト量が多い（19,000文字で発生していますが、どこから重くなるかは未確認）
- 上記2つの条件を満たした上で折り返しが発生している

## 対策
根本的な解決方法は発見できていません。
同じ要素に固定幅を指定することで少しは軽くなりましたが、理由はよく分かりませんでした。
指定する数値によっても重さに差が出るため、適用する場合は色々な幅で試すことをオススメします。

## その他の対策
こちらが一番スムーズにいきそうな対応策ですが、なるべくXAMLのみで解決できる方法を探していたので試していません。

https://stackoverflow.com/questions/11048179/poor-textbox-performance-with-wrapping-on-and-large-amounts-of-data
>You could react to the windowResizeStart event and disable wrapping for the >text block. Then wrap just once when the resize completes.
>
>You gain performance but lose some visual flair I guess.


~~**良い方法をご存知の方がいらっしゃれば是非ご教示いただけると嬉しいです！！**~~
改めて表示を確認していたところ、表示速度が改善されていました。
その間Visual Studio 2015から2017へのアップデートを行いましたが、それで解消されたのかは不明です。
再現しなくなってしまったので原因は分からずじまい。。
mac/MAMP で使用している mysql に スロークエリログ を設定する【MySQL】

#### 環境
||バージョン|
|---|---|
|macOS Sierra|バージョン10.2.6|
|MAMP|バージョン4.1.1 (492)|
|MySQL|version: 5.6.35|

既に起動しているMYSQLに突貫工事のごとく設定をする。
(本来は、my.cnfに書けばいいんだよね(^_^)/

### 設定方法
① mysql にログインする

```
$ cd /Applications/MAMP/bin
```

```
$ ./mysql -u root -p 
```

② 設定する
既にMYSQLを起動して実行している状態のときは、 
**set global show** をしようすることにより設定が可能になる。

```
$ mysql> set global show_query_log=1;
```

スロークエリログが吐かれてしまう秒数を設定できる。
設定する単位は**秒**である。つまり、下記は1秒！

```
$ mysql> set global long_query_time=1;
```

**log_queries_not_using_indexes** を設定すると、
スロークエリログの秒に達さないとしてもINDEXをはっていないクエリを
スロークエリログに吐き出すことができる。

```
$ mysql> set global log_queries_not_using_indexes=1;
```

ファイル名は、任意の場所が設定できる。

```
$ mysql> set global slow_query_log_file ='/Applications/MAMP/logs/slow_query.log';
```


③ ターミナルで mysql を ログアウト し再度ログインする
ログアウトしないと **long_query_time** には修正前の値が表示する。

```
$ mysql>  show variables like 'long_query%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 1.000000  |
+-----------------+-----------+
1 row in set (0.00 sec)
```
※ デフォルトは10秒が設定されている。
border-radius

# border-radiusとborder
border-radius（丸くする）が流行り始めました。borderと同時に指定する場面が多いので、注意点を一つ備忘録がてら投稿致します。

## 画像を含んだリスト
下記の<font color="red">.listクラス</font>にborder-radius, borderを追加するとどうなるか。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/3e0acd74-aede-b14a-890a-10339b620098.png)


```html
<div class="list">
  <div><img class="img" src="https://placehold.jp/150x40.png"></div>
  <div class="item">リストアイテム</div>
  <div class="item">リストアイテム</div>
  <div class="item">リストアイテム</div>
</div>
```
###　適用後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/5fd208cb-1e40-1ab2-b359-5f5a7adf0dbb.png)

```css
.list {
  display: block;
  border-radius: 20px;
  border: solid 1px gray;
  margin: 20px;
  width: 150px;
}
```
実は、こうなります。画像、リストアイテムの要素には、border-radiusが適用されるわけではありません。
### 解決方法
ですので、下記のように、上と下それぞれ適用する必要があります。

```css
.img {
  display: block;
  border-top-right-radius: 20px;
  border-top-left-radius: 20px;
}
.item:last-child {
  border-bottom-right-radius: 20px;
  border-bottom-left-radius: 20px;
}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/ba0a4aa3-1982-7b93-92be-3c4e46845775.png)

※[mask-imageを使用する手段](https://qiita.com/nabettu/items/8847e690758e280ee3bc)もありますが、画像を挿入する必要があるのでおすすめしません。

### 訂正
overflow: hiddenをご教授いただきました。
画像には、borderをつけたくない場合、上記のようにimgの上とitemの下にbroder-radiusを指定するか、.list, .item両者にborder-radiusを指定する方法が正確です。

.listにoverflow: hiddenを指定し、.itemにborder-radiusを指定しないと下記のようになるためです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192967/bceb8964-35b4-ab07-7711-331163f07944.png)


```css
.list {
  display: block;
  border-radius: 20px;
  margin: 20px;
  width: 150px;
  overflow: hidden;
}
.item {
  border: solid 1px gray;
  box-sizing: border-box;
}
```
【FuelPHP】php-benchmark を入れてみる【メモ】

#### はじめに
FuelPHP で処理速度測りたいとか色々思ったんです。
microtime でやっていたのですが、なんとなくその延長で入れてみましたので
記録として残していきます。

#### 導入した benchmark は
php-benchmarkです。
https://github.com/lavoiesl/php-benchmark

### 以下導入方法
Fuelphp のあるところで、下記を実行する

```
$ composer require lavoiesl/php-benchmark
```

なんか入ったっぽい。

```
Using version ^1.4 for lavoiesl/php-benchmark
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing lavoiesl/php-benchmark (v1.4): Downloading (100%)         
Writing lock file
Generating autoload files
```
##### 適当なコントローラで実行しようと思った

とりあえず入ったので、実行してみようかと思いました。
action に入れちゃおう。

```
<?
use Lavoiesl\PhpBenchmark\Benchmark;

class Controller_XX extends Controller
{
  public function action_XX()
  {
　　　　　　　　　$benchmark = new Benchmark;

　　　　　　　　　// add で追加したい関数など設定できるんですね。
    　$benchmark->add('sample1', function(){ 
            return $this->sample1() });

    // 実行結果表示
    d($benchmark->run());
  }
  
  public function sample1() 
  {
     // (略)何かの処理
  }
}
```

##### 終わりに
簡単に導入できてしまうと、すごい。って思う。
すごい。
FFmpegを使ってOPENREC（アーカイブ）を保存する方法

ffmpeg を使えばOPENRECアーカイブ動画をmp4ファイルに録画することができる

- この記事はmacOS想定
- ffmpegさえ利用可能にすればWindowsやLinuxでも使えるのでは

# Homebrew のインストール
必須ではないが便利

```:macOS
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# ffmpeg のインストール

```:macOS
brew instal ffmpeg
```

## インストールできたかの確認

```:macOS
ffmpeg -version
```

```
ffmpeg version N.N Copyright (c) 2000-YYYY the FFmpeg developers
```


# 録画したファイルを置く専用フォルダを用意して移動

```:macOS
$ cd Desktop
$ mkdir video
$ cd video
```

# OPENRECを録画する

## デベロッパーツールを開き、Networkタブへ移動する
表示 > 開発 / 管理 > デベロッパー ツール
"Network"タブを表示する

## 録画したいOPENREC（アーカイブ動画）をChromeブラウザで開く

```
https://www.openrec.tv/live/hogehoge
```

## normal.m3u8の情報を取得する

### Networkコンソールにm3u8を表示する
フィルターに``` m3u8 ```を指定すると便利

### m3u8を右クリックしてcURLを取得する
Copy > Copy as cURL

<img width="853" alt="fig_2017-10-26_18_13_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/207089/2ad1defd-3e08-f00a-aadb-b71ab9b790e2.png">




### ffmpeg コマンドラインの構築に必要な情報を抽出する
コピーしたcURLは以下のようになる

```
curl 'https://hogehoge.cloudfront.net/hogehogehogehogehogehogehogehogehogehogehogehoge/normal.m3u8' -H 'Origin: https://www.openrec.tv' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: ja,en-US;q=0.8,en;q=0.6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36' -H 'Accept: text/plain, */*; q=0.01' -H 'Referer: https://www.openrec.tv/live/hogehoge' -H 'If-None-Match: "hogehogehogehogehogehogehoge"' -H 'Connection: keep-alive' -H 'If-Modified-Since: hoge, DD MMM YYYY HH:MM:SS GMT' --compressed
```

### ffmpeg コマンドラインを構築する
上記の情報を以下のように再構築する

```
ffmpeg \
-headers 'Origin: https://www.openrec.tv' \
-headers 'Accept-Encoding: gzip, deflate, br' \
-headers 'Accept-Language: ja,en-US;q=0.8,en;q=0.6' \
-user_agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" \
-headers 'Accept: text/plain, */*; q=0.01' \
-headers 'Referer: https://www.openrec.tv/live/hogehoge' \
-headers 'If-None-Match: "hogehogehogehogehogehogehoge"' \
-headers 'Connection: keep-alive' \
-headers 'If-Modified-Since: hoge, DD MMM YYYY HH:MM:SS GMT' \
-i "https://hogehoge.cloudfront.net/hogehogehogehogehogehogehogehoge/normal.m3u8" \
-codec copy \
-bsf:a aac_adtstoasc \
-movflags faststart \
video.mp4
```


## 録画する
macOSのターミナルを開き、上記コマンドを実行する。

録画が終了したら自動的に停止する

# 確認する
フォルダ内を覗くと
``` video.mp4 ```
ができているはず

# 高度な操作
[ffmpeg Documentation] (https://ffmpeg.org/ffmpeg.html#Options)
にたくさんオプションが説明されている