OmniAICreator/Qiita-1.07M huggingface dataset:
エンリュの迷い森　～Top～


【2016/10/14: 追記】
移しました→  [**はてなブログ：エンリュの迷い森**][blog]

　このブログでは，私，迷子のエンリュがふらふらと森の中を彷徨うように，情報分野のあらゆるテーマで勉強してみたその記録を，つらつらと書き連ねていきます．

## [ごあいさつ][1]
　このブログの趣旨について説明しています．はじめましての方は是非一度お立ち寄りください．
　
## [Index][2]
　取り組んだテーマについて，系統立ててまとめたページです．お探しのテーマについての情報が見つかるかもしれません．

## [Journey][3]
　迷いの森を歩いた道筋の記録です．当ブログにおける環境の構築の手順など，順序立ててまとめています．

## [独りごと][4]
　勝手に決めた当ブログ内の設定なんかをほろほろと紡いでいこうと思います．独り言なので人に読まれる意識は薄めです．ご了承ください．
　思ったことを綴っていく分，独りごとの方がブログっぽいかも．

## 追記：はてなブログへの移動について
　いきなりですが，やっぱりブログははてなブログに書くべきだと思いまして，やるなら早いうちにと，記事を移してきました．今後の投稿は主に**はてなブログ**になります．Qiitaの方が投稿しやすいし，投稿してすぐに反応があってうれしかったのですが，やはりQiitaは技術メモとして，とくに環境構築の話はできるだけ置いておいて，ソースコード貼ったりプログラミングの上で四苦八苦したことなどを残していくメモとして使っていこうということにしました．
　今後も，備忘録，ログという形で記事は書いていきますが，リンクで繋いだりということはやめます．いつも通りQiitaらしい使い方の中で，役に立っていければうれしいです．
　ブログのリンクはこちら↓

#####  [**はてなブログ：エンリュの迷い森**][blog]

　それでは今後とも，迷子のエンリュと，エンリュの迷い森を**よろしくお願いします**．
 
[1]: http://qiita.com/LostEnryu/items/7fa98ab1511c7fdf45a1
[2]: http://qiita.com/LostEnryu/items/0bde259205ed4f5c3e94
[3]: http://qiita.com/LostEnryu/items/5c4346f5dfc3e268082d
[4]: http://qiita.com/LostEnryu/items/695e90b1e51be0fea0d5

[blog]: http://lost-in-forest.hatenablog.com/entry/toppage
rspecで「ActionController::TestCase HTTP request methods will accept only」が発生する場合の対処



## 環境
Rails5, rspec3.5.2


## 状況

controllerのspecを実行したところ、spec自体は正常終了するものの、「ActionController::TestCase HTTP request methods will accept only」が発生する

## ワーニング内容

```shell
SettingsController
  PATCH #update
DEPRECATION WARNING: ActionController::TestCase HTTP request methods will accept only
keyword arguments in future Rails versions.

Examples:

get :show, params: { id: 1 }, session: { user_id: 1 }
process :update, method: :post, params: { id: 1 }

```
 
## 対処
 
ワーニングメッセージにしたがって、specのコードを以下のように書き換える。
 
```ruby
patch :update, user: attributes_for(:user, name: "renamed user")
```

↓

```ruby
process :update, method: :patch, params: {user: attributes_for(:user, name: "renamed user")}
```
Laravelで処理を定期実行する方法

Laravelで処理を定期実行する方法

備忘録です。

app/Console/Commands/Kanel.phpに定期的に実行したい処理を記述する

```Kanel.php
protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        \Log::info('hello');
    })->everyMinute();
}
```

クーロンテーブルに追加する

```
crontab -e
```
/path/toをプロジェクトのパスに置き換える(pwdしてコピーするのが楽)

```
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
```

これで定期的にLogファイルにhelloが出力されます。
[CakePHP 2.x]Securityコンポーネントのデバッグの仕方

#背景
あるプロジェクトにSecurityコンポーネントを導入してみましたが、
BlackHoleに直行してしまうという問題にはまりましたので、デバッグの仕方を共有します。

---

#環境
PHP 5.6
CakePHP 2.x

---

#解説
Securityコンポーネントは、Formヘルパーと弱い関連を持っています。
※実際にクラス同士が関連を持っているわけではなく `"_Token"` というリクエストパラメータでつながっています。
そのため、デバッグするときはSecuritytコンポーネントだけではなく、Formヘルパー側も意識する必要があります。

公式ドキュメントでの記載箇所は以下

[CakePHP 2.x Cookbook：セキュリティ](http://book.cakephp.org/2.0/ja/core-libraries/components/security-component.html)
[CakePHP 2.x Cookbook：FormHelper - セキュリティコンポーネントを使う](http://book.cakephp.org/2.0/ja/core-libraries/helpers/form.html#id14)

###処理の流れ

かなり省略した図ですが、以下がSecurityコンポーネントとFormヘルパーの処理の流れです。

![image](https://qiita-image-store.s3.amazonaws.com/0/103853/b19a661f-e2ed-9f5f-9b95-e71f50216ed1.png)

- **1.2: generateToken()**で、リクエストパラメータ配列に`"_Token"`をセットしています。
ここではhashを生成しているだけなので、ここでデバッグしてもあまり意味がありません。
- **2.1.1: secure()**は、`"_Token"`がリクエストパラメータ配列にセットされていた場合に呼び出され、hiddenフィールドとしてTokenの値を出力しています。
ここでToken生成のロジックを見ることができますので、デバッグしてみると良いです。
ちなみにTokenは、フォームのフィールド情報のhash値です。
また、この処理はendメソッドから呼び出されるので、view側でendを呼んでいないと実行されません。
- **1.1: blackHole()**は、不正なリクエストと判断した場合に呼び出されます。
大抵はTokenのチェックに引っかかった場合に呼び出されると思われます。
ここのチェックロジックでデバッグして、生成ロジック側と見比べれば、どこが異なっているのかが分かると思います。

---

#まとめ

なにかとはまるSecurityコンポーネントですが、
デバッグ箇所さえ把握できれば、問題はすぐに解決すると思います。

---

#参考

- [極める！Security Component (CakePHP Advent Calendar 2010 24日目) : akiyan.com](http://www.akiyan.com/blog/archives/2010/12/security-component-cakephp-advent-calendar-2010.html)
- [CakePHP Security コンポーネントのまとめ | Sun Limited Mt.](http://blog.syuhari.jp/archives/148)
- [[CakePHP2.x]Security Component でハマる | CodeLab技術ブログ](http://www.codelab.jp/blog/?p=497)
- [CakePHP1.2.5 SecurityComponentでハマったときに確認するポイント - 忍び歩く男 - SLYWALKER](http://slywalker.hateblo.jp/entry/20090926/1253926623)
- [CakePHP1.3 お手軽な複数チェックボックスの作り方 - Code Life](http://blog.code-life.net/blog/2011/11/10/how-to-create-multiple-checkboxes-in-cakephp/)
Heroku Toolbelt をDyno上で実行する


結構古めのリポジトリだけど、小さいコードなのでおそらく問題なさそう。

https://github.com/gregburek/heroku-buildpack-toolbelt

## USAGE

1. ビルドパックに追加
2. [.netrc生成](https://github.com/gregburek/heroku-buildpack-toolbelt/blob/master/bin/gen-netrc.sh)のために `$HEROKU_TOOLBELT_API_EMAIL` `$HEROKU_TOOLBELT_API_PASSWORD`を環境変数に追加
3. vendor/heroku-toolbelt/bin/heroku hogehoge
[Unity]Webから画像をダウンロードして表示しようとしたときにiOSでUnsupported URLのエラーが出た時の対処[覚書]


## 対処方法

１．Edit>Project Settings>Playerを開いてiOSタブを選択。
　　Other Settingsの"Allow Download over HTTP"にチェックを入れる。
　　
２．URLエスケープされているか確認する。

```csharp:
using System.Web;

...
...


	string Url = @"https://maps.googleapis.com/maps/api/staticmap?size=500x500&maptype=terrain&center=40.714728,-73.998672&zoom=17&sensor=false";
	Url = Uri.EscapeUriString(Url); // URLエスケープする。
```

　System.Webを使うために、.NETをサブセットではなくフルセットにする。
　　Edit>Project Settings>Playerを開いてiOSタブを選択。
　　Other Settingsの"Api Compatibility Level"を".NET 2.0 Subset"ではなく".NET 2.0"に変更する。
[Unity]Vuforiaの動画再生サイズを変更したい


## はじめに

Vuforiaを使って動画を再生すると、必ず決まったサイズでしか再生できない。
これをなんとかしたい。

## 対処方法

スクリプトVideoPlaybackBehaviour.csで強制的にアスペクト比にあったサイズに変更されているようなので、これに修正を加える。

```csharp:VideoPlaybackBehaviour.cs（２３０行前後）
                    if (videoWidth > 0 && videoHeight > 0)
                    {
                        // Scale the video plane to match the video aspect ratio
                        float aspect = videoHeight / (float) videoWidth;

						// Flip the plane as the video texture is mirrored on the horizontal
						transform.localScale = new Vector3 (-0.1f, 0.1f, 0.1f * aspect);
                    }
```

上記のようになっているのを下記のように変更する。

```csharp:VideoPlaybackBehaviour.cs（２３０行前後）
                    if (videoWidth > 0 && videoHeight > 0)
                    {
                        // Scale the video plane to match the video aspect ratio
                        float aspect = videoHeight / (float) videoWidth;

						if (KeepWidth) {
							transform.localScale = new Vector3 (transform.localScale.x, 0.1f, -transform.localScale.x * aspect);
						} else {
							// Flip the plane as the video texture is mirrored on the horizontal
							transform.localScale = new Vector3 (-0.1f, 0.1f, 0.1f * aspect);
						}
                    }
```

また、５０行目付近のパブリック変数を宣言しているあたりに、次の行を追加する。

```csharp:VideoPlaybackBehaviour.cs
	public bool KeepWidth = true;
```

以上で、スクリプトを貼り付けたオブジェクトの幅（Scaleのx）に合わせた動画サイズでビデオが再生されるようになる。

## 参考サイト

[Modifying the scale of the video plane in the Video Playback Sample app](https://developer.vuforia.com/forum/unity-3-extension-technical-discussion/modifying-scale-video-plane-video-playback-sample-app)
DockerのWindows対応についての整理

この記事は2016年頃の情報となっています。2021年となっては古い話です。
現在はWSL2を使うことによってかなり快適にLinuxコンテナをWindows上で扱うことができます。
https://docs.docker.jp/docker-for-windows/wsl.html

私自身も個人PCをWindows+WSL2で運用するようになりました。

----

DockerはWindowsで動くの？ という質問をたまに受けます。
動くといえば動くし、動かないといえば動かない。

私自身はWindowsで開発をあまりしない人（普段使いはUbuntu)なので正直WindowsでDockerを使おうというモチベーションはあまり無いのですが、プロダクト名が若干ややこしかったりして混乱しやすいので自分の理解のためにも書いておこうと思います。


## 最近の動向

つい最近、Microsoft社とDocker社の努力によってWindowsコンテナが使えるようになりました。
（実用上はどうなのかわかりませんが）

* https://blog.docker.com/2016/09/build-your-first-docker-windows-server-container/
* https://msdn.microsoft.com/ja-jp/virtualization/windowscontainers/docker/configure_docker_daemon

## WindowsでDockerが使える？　とは

この質問には2通りの解釈があります。

1. Windowsマシンを使ってLinuxベースイメージのコンテナを使うことができる
2. Windowsマシンを使ってWindowsベースイメージのコンテナを使うことができる

### 1. Linuxベースイメージのコンテナを使うことができるか？

これは以下のプロダクトを使ってできるといえます。

* [Docker for Windows](https://docs.docker.com/docker-for-windows/)
* [Docker Toolbox](https://docs.docker.com/toolbox/overview/)

#### Docker for Windows と Docker Toolbox

これらのツールは仮想マシンでLinux OSを起動し、そのLinuxマシン上でDockerを動作させます。
そして、Dockerホストとなる仮想マシンにログインすること無く、まるでWindows上で動作しているかのようにコマンドプロンプト、Power-Shellプロンプトから直接dockerコマンドを実行できるように工夫がされています。
（とは言え中間にDockerホスト仮想マシンがいるということは理解しておく必要があります）

Docker Toolboxは[VirtualBox](https://www.virtualbox.org/)を使用してLinux仮想マシンを起動しますが、Docker for WindowsではWindowsとより親和性の高いHyper-Vを使用しています。
https://docs.docker.com/docker-for-windows/faqs/

なお、これらのツールは開発者が手元のPCでDockerを試すことを主目的としたツールであるため、これらを使った本番環境構築などは考えないほうが幸せかと思います。

#### どちらを使えばいいのか 

利用可能な環境であればDocker for Windowsを使用することをおすすめします。
(といいつつ残念ながら私の手元には動作に適したマシンが無く、実は使ったことがありません。)
現状ではDocker ToolboxはDocker for Windowsを使用できない環境下での代替手段と考えたほうが良いでしょう。

Docker for Windowsの動作要件は以下のように記されています。

> Docker for Windows requires 64bit Windows 10 Pro, Enterprise and Education (1511 November update, Build 10586 or later) and Microsoft Hyper-V. Please see What to know before you install for a full list of prerequisites.

### 2. Windowsベースイメージのコンテナを使うことができるか？

2016/10よりできるようになりました。
おそらく、「WindowsでDockerが使える？」の質問意図の大半はこちらになるかと思います。

#### Docker Windows Containers

元々のDockerはLinuxカーネルに依存したものでしたが、[Docker Windows Containers](https://msdn.microsoft.com/ja-jp/virtualization/windowscontainers/docker/configure_docker_daemon)の登場により可能になりました。(Windowsコンテナを動かすDocker Engineの正式なプロダクト名がよくわからないのでDocker for Windowsと混同しないようにDocker Windows Containersと呼ぶようにしました）

これはWindows 2016 Server, Windows 10で使えるようになりました。
詳しくはこちらの記事を参照すると良いでしょう。
https://msdn.microsoft.com/ja-jp/virtualization/windowscontainers/containers_welcome

#### Windowsのベースイメージ

そろそろ知識の限界が来たので退散しようとしていますが、最後にもう一つだけ。
LinuxのベースイメージはCentOS, Ubuntu, Alpineなど多岐にわたりますが、Windowsについては現状以下のどちらかのベースイメージとなります。

* [Nanoserver](https://hub.docker.com/r/microsoft/nanoserver/)
* [Windows Server Core](https://hub.docker.com/r/microsoft/windowsservercore/)

ここでLinuxと比べた懸念はサイズの大きさです。Nanoserverは300MB程度ですが、Windows Server Coreに至っては4GBと巨大です。

## まとめ

* 2016/10現在ではWindowsでDockerが使える状況にあります
* Windowsで何のイメージを動かしたいのかによって手段と要件が変わります
vmstat

# メモリ、CPU使用率を計測する

vmstatというコマンドを使って計測を行います。

測定間隔を指定したりできるので、負荷テストを行う場合は必須になると思います。

## 1秒間隔に計測する

```bash
#vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 118860 411900 249828 13330468    0    0    21  1552    0    0  8  3 86  3  0
 0  0 118860 412016 249828 13330472    0    0     0    16 1138  795  1  1 99  0  0
 0  0 118860 412016 249836 13330464    0    0     0    40 1285  898  1  2 97  0  0
```


|項目|意味|
|:--- |:---|
|r|実行可能で、「実行キュー」に入っているプロセスの数。|
|b|本来は実行可能なプロセスであるが、何らかの理由で処理を「ブロック」されているプロセスの数|
|swpd|使用しているスワップ領域の量|
|free|純粋に未使用状態なメモリの量|
|buff|主にカーネルがバッファ領域として使用しているメモリ量|
|cache|ディスクアクセス時にキャッシュデータを保存しているメモリの量|
|si|スワップ領域から読み込んでメモリに展開したデータの量（スワップ・イン）|
|so|メモリからスワップ領域に書き込んだデータの量（スワップ・アウト）|
|bi|ブロックデバイス（主にディスク等）からの読み取り量|
|bo|ブロックデバイス（同上）への書き込み量|
|in|割り込み処理の回数|
|cs|コンテクストスイッチの回数|
|us|カーネルコード以外の処理に費やした時間の割合|
|sy|カーネルコード（OS自身、またLinuxシステムコール等を呼び出された等）の処理のために費やした時間の割合|
|id|アイドル時間の割合。要するに何もしていない時間のこと|
|wa|データの入出力処理（ディスクへのアクセス、ネットワークへのアクセス）を試みたものの、結果的にデータを待っていた時間の割合|
|st|ゲストOSがリソース要求を行ったが、CPUリソースを割り当ててもらえなかった時間の割合|
FactoryGirlに新しいシンタックスを追加する

# 本来やりたかったこと

DB分割前提のテストを書きたいので、FactoryGirlを拡張して、シャード指定できるようにしたい。
ちなみに分割はOctopusを利用した水平分割です。


# FactoryGirlにシンタックスを追加する方法

## 概要

方法は色々ありそうですが、今回は、`FactoryGirl::StrategySyntaxMethodRegistrar`を利用します。
非公開APIっぽいのでメンテナーにはあまりいい顔されないかもしれません。
例として、テストコードを書いてるときに🍣が食べたくなった時を想定して`create_sushi`を追加します


## コード例

```rb:spec/support/factory_girl_ext.rb
class SushiSyntaxRegistrar < FactoryGirl::StrategySyntaxMethodRegistrar
  def define_strategy_methods
    define_sushi
  end

  private

  def define_sushi
    strategy_name = @strategy_name

    define_syntax_method("#{strategy_name}_sushi") do
      Rails.logger.debug "🍣"
    end
  end
end

sushi_create_syntax_registrar = SushiSyntaxRegistrar.new(:create)
sushi_create_syntax_registrar.define_strategy_methods
```


```rb:spec/models/sushi.rb
RSpec.describe Sushi, type: :model do
  it "looks like 🍣" do
    expect(create_sushi).to be true
  end
end
```

テストを実行するとログに🍣が表示されています。やったね！

## ちょっとだけ解説

 * デフォルトだと`spec/support/`配下は読まなかった気がするので、`spec_helper.rb`辺りでrequireしてあげてください
 * `FactoryGirl::StrategySyntaxMethodRegistrar#initialize`の引数は定義するシンタックスに利用されます。
    * 今は`:create`を引数にして`create_sushi`を定義していますが、`:build`を渡せば `build_sushi`も定義することが出来ます
 * `FactoryGirl::StrategySyntaxMethodRegistrar#define_syntax_method`は、`FactoryGirl::Syntax::Methods`に対してメソッドを追加するメソッドです。もし、すでに定義されてしまっている場合は`Module#undef_method`してしまうので、`create`を定義すると後勝ちで`create`が全て🍣メソッド化します :fearful: 
 


# 本来やりたかったことの解決

 * 要するに便利なdefine_methodを呼んでいるようなものなので、上の`define_sushi`のように今回は以下のようなコードを書きました
 * 以下を実行すると、`create_with_shard :model_name, :shard1` のようなシンタックスが生まれます

```rb
def define_singular_strategy_method_with_shard
  strategy_name = @strategy_name

  define_syntax_method("#{strategy_name}_with_shard") do |name, shard, *traits_and_overrides, &block|
    Octopus.using(shard) do
      FactoryGirl::FactoryRunner.new(name, strategy_name, traits_and_overrides).run(&block)
    end
  end
end
```


# まとめ

 * FactoryGirlにsyntaxを追加する方法でした。
cron.dに書いたcronの実行結果にgetpwnamがエラーとして載ってしまう場合

#前提

あるサーバーのあるディレクトリの使用量を定期的に取得しようとして/etc/cron.dにcronを設定した時に、メールが上手く飛んでこなかった時の作業メモ。

#今回ぶつかった壁

```bash:/root/bin/check.sh
#!/bin/bash
du -h /home/user
```
というシェルスクリプトを

```bash:/etc/cron.d/check
MAILTO="user@example.com"
0 1 1 * * /bin/sh /root/bin/check.sh
```
毎月1日の1時に実行しよう

```bash:/var/log/cron
Oct 1 01:00:01 localhost CROND[990]: (root) CMD (/bin/sh /root/bin/check.sh)
Oct 1 01:00:01 localhost crond[990]: (/bin/sh) ERROR (getpwnam() failed)
```
**ダメだった。**

#環境
| OS |
|:---------:|
| CentOS7 |

#やったこと
どうやらcron.d/とcrontabでは微妙に書き方が違うらしい。
参考：[各ユーザのcrontabファイルの場所について](http://qiita.com/iganari/items/5a61ec93d989f7c77a2c "各ユーザのcrontabファイルの場所について")

大雑把にまとめるとこんなイメージ？

| cron.d/ | crontab |
|:---------:|:---------:|
| ユーザーを問わず利用できる | ユーザー毎にファイルがある |

なのでcron.dに書く内容を以下の様に修正してみる。

```bash:/etc/cron.d/check
MAILTO="user@example.com"
0 1 1 * * root /bin/sh /root/bin/check.sh
```

するとエラーも出ず、うまいことメールが飛んでくる様になりました。

#結論
crontabはユーザー毎にファイルが存在しているため、ユーザー指定をしなくても問題ないが、cron.d/以下はユーザーを問わず(Apacheとかね)実行させるcronを置くことができる為、cronの中に```user```で実行しますよ～という指示を与えてやる必要がある。
#からはじまるメッセージを持つコミットを対話式で修正したいとき

コミット漏れやメッセージ内容の修正で `git commit --amend` で対話形式で修正するときに、`#1234` のようなチケット番号を先頭にいれているときのやり方のメモ。

デフォルトだと、#はコメントアウトの記号になるので、このままではうまくいかないです。

1. `--cleanup=whitespace` を追加
2. `git config core.commentchar ";"` などとしてコメントアウトの記号をかえる
3. `git commit --amend -m "#1234 hogehoge"` として対話式をあきらめる


`--cleanup=whitespace` でコメント行を無視してメッセージを整形（余計なものを消す）する設定です。これをやると、先頭以外にもあるコメント行もメッセージとして採用されてしまうので注意が必要です。

# 参考サイト

* http://code.reeloo.net/2012/03/git-commit-message-starting-with-hash.html
* https://coderwall.com/p/gs_vzw/start-interactive-commit-messages-with-hash
* http://stackoverflow.com/questions/2788092/start-a-git-commit-message-with-a-hashmark
* http://rochefort.hatenablog.com/entry/2014/08/17/073000
* http://qiita.com/tunepolo/items/7303f56854feeba46c82
【 iOS】titleがAttributedのUIButtonの文字色を変える

UIButtonの文字色を変えようと思ったがAtrributedで作られており、
文字色を変えたいだけなのにとてもハマってしまったのでメモ

## 変え方
```swift
// 変更したいButtonのtitleを取得してNSMutableAttributedStringに変換
let attributedString = NSMutableAttributedString(attributedString: self.attributedButton.attributedTitleForState(.Normal)!)

// 変更したい文字範囲の定義 (この場合は全部変えたいのでlength分のrangeを作成
let range = NSRange(location: 0, length: attributedString.length)

// 変更したい属性をDictionaryで渡す
attributedString.addAttributes(
    [
        NSForegroundColorAttributedName: UIColor.whiteColor()
    ],
    range: range
)

// 属性変更済みのNSMutableAtributeStringを設定して完了
self.attributedButton.setAttributedTitle(attributedString, forState: .Normal)
```

ちょっと長いので、もっとにスマートに変更できるやり方あれば知りたい...


## ハマり所
### 1. Plainのtitleだった場合は以下の方法で変更できるが、Attributedの場合はできない

```Swift
self.plainButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
```

### 2. NSMutableAttributedStringに変換しないと属性を変更できない
UIButtonから取得するときは`NSAttributedString`の状態なのでどうやっても変更できず積んでいた(常識っぽい
Raspberry Pi に、Chromeをインストールする

```bash
export http_proxy=http://proxy.example.com:8080/
sudo -E apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5B393194
```

> sudo -E で実行し環境変数の引き継ぎ
> apt-getする際、sudoをそのまま使うと環境変数を引き継がない為、プロキシを通らない
> 実行するときにオプションで'-E'をつけると、環境変数を引き継いでsudoする
> 例: sudo -E apt-get update

上記では、公開鍵を取得できなかったので、ミラーサーバで試したらうまくいった

```bash
sudo -E apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 5B393194
```

```bash
sudo vi /etc/apt/sources.list
deb http://ppa.launchpad.net/canonical-chromium-builds/stage/ubuntu vivid main
```

```bash
sudo apt-get update
sudo apt-get install chromium-browser chromium-browser-l10n
```

お世話になったページ
•http://gozuk16.hatenablog.com/entry/2016/03/24/144400
•http://mmays.hatenablog.com/entry/2016/05/07/194111
•http://qiita.com/mrtry/items/99e2f912da4be2f8f48f
WindowsでLinuxの「tail -f」っぽいことをする方法

Windowsサーバーで開発を行っていると、
ログ監視するために、
Linuxの「tail -f」っぽいことをしたくなることがある。
いつもぐぐってるのでメモ。

PowerShellを起動して、以下のコマンドを実行すると良い。

```txt:コマンド
Get-Content -Path "[ファイルのパス]"  -Tail 10 -Wait
```
IEだとBabelでコンパイルした forOf が使えない


コンパイル時に`Symbol`を使用していて、
IEではサポートされていないので、エラーになる。
[Array.prototype.forEach()か$.each()](http://qiita.com/mo4_9/items/2968fea172c028d58aec#arrayprototypeforeach%E3%81%A8each)を使うのが良い

> 参考
https://babeljs.io/docs/plugins/transform-es2015-for-of/
http://stackoverflow.com/questions/33828840/symbol-is-undefined-in-ie-after-using-babel
桁数を前ゼロで揃えるTips

まあこれは既出の可能性が高いけれども。例えば数字を6桁で揃えたい。桁数が満たない数字は0で埋めたいというケースはままある。

```
000001
```

こういう時よく使う技。数年前に知ったが当時感動したので書いておこう。

```javascript
var x = 1;

var a = ('000000' + x).slice(-6);
// a = '000001'

//これを知る以前に行っていた方法
var a = '000000' + x;
a = a.substr(a.length - 6,6);
```
以上
railsでmongoid使う時にidがintegerになるseedsを使う時のtips

```sample_model.rb
class SampleModel
  include Mongoid::Document

  field prefecture_id, type: :Integer
  belogs_to :prefecture #idがinteger
end

# permited_params => {prefecture_id => "1"}
hoge = SampleModel.new(permited_params)
hoge.prefecture_id => 1
```

`type: :Integer`でid fieldを定義しておくと、
hashを渡した時にちゃんとIntegerになおしてくれる。
逆に定義していないと文字列の１となってしまい動かない。
field定義するという冗長になってしまうが、これが一番工数が少ない気がする。

別解として、そもそもseedsで入れる時に文字列として投入するというのもありかも。
UnityEditorで動的にメニューを生成する方法

UnityEditorでは簡単に開発用のメニューを追加することができるんですが、私が調べた限りでは、動的にメニュー項目を生成することはできないようです。確かに、MenuItemプロパティとしてスクリプトに指定するものなので、実行時にどうこうという話ではありません。

が、ひと手間かければできることが分かりました。一言で言うと、

「**メニュー用スクリプトをメニューハンドラ内で動的生成してアセットとして追加する**」

です。一度メニューを実行するというひと手間が入ってしまいますが、目的によっては十分使える仕組みだと思います。

例えば、特定のフォルダ内にあるシーンをリストアップしてメニューから開くことができるようにするEditorスクリプトはこんな感じになります。一度メニューの"Assets/Create Scene List"を実行して、しばらく待つと、同じところにシーンリストが登録され、開くことができるようになります。

```SceneListCreator.cs
using UnityEngine;
using UnityEditor;
using System.IO;

public class SceneListCreator
{
    [MenuItem("Assets/Create Scene List", false, 7651)]
    public static void CreateSceneList()
    {
        string[] sceneDirs = { "Assets/Test/Scenes" };
        string scriptDir = "Test/Editor";
        string scriptName = "SceneList.cs";

        string scriptFilePath = Application.dataPath + "/" + scriptDir + "/" + scriptName;
        string scriptAssetPath = "Assets/" + scriptDir + "/" + scriptName;

        using (StreamWriter sw = File.CreateText(scriptFilePath))
        {
            sw.WriteLine("using UnityEngine;");
            sw.WriteLine("using System.Collections;");
            sw.WriteLine("using UnityEditor;");
            sw.WriteLine("using UnityEditor.SceneManagement;");
            sw.WriteLine("");
            sw.WriteLine("public class SceneList");
            sw.WriteLine("{");

            string[] sceneGUIDs = AssetDatabase.FindAssets("t:Scene", sceneDirs);
            foreach (var sceneGUID in sceneGUIDs)
            {
                string scenePath = AssetDatabase.GUIDToAssetPath(sceneGUID);
                string[] splittedScenePath = scenePath.Split(new char[] { '/' });
                string sceneName = splittedScenePath[splittedScenePath.Length - 1].Replace(".unity", "");
                sw.WriteLine("    [MenuItem(\"Assets/Scene/" + sceneName + "\", false, 7650)]");
                sw.WriteLine("    public static void OpenScene" + sceneName + "()");
                sw.WriteLine("    {");
                sw.WriteLine("        if (EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())");
                sw.WriteLine("            EditorSceneManager.OpenScene(\"" + scenePath + "\");");
                sw.WriteLine("    }");
            }

            sw.WriteLine("}");
        }
        AssetDatabase.ImportAsset(scriptAssetPath);
    }
}
```
書き出すスクリプトファイル名(scriptName)やスクリプトディレクトリ(scriptDir)、AssetDatabase.FindAssetsに渡すアセット検索ディレクトリ(sceneDirs)はご自分の環境に合わせて変更してください(プロジェクト内全探索は大きなプロジェクトだとちょっと怖いので却下)。もちろんメニュー位置もご自由に。

![Unity_SceneList.png](https://qiita-image-store.s3.amazonaws.com/0/141731/9e535d83-fa42-d4d0-5cf7-e4872b6bc6bd.png)

っていうか、なんでメニューに"Recent Scenes"がないんでしょうね？ あったら絶対に便利なのに。ということで、不便なので作ってみたのでした。

なお、アイデアはこちらから頂きました。Grazie Marco!
Creating Dynamic MenuItems in Unity
http://www.marcosecchi.it/2015/12/03/creating-dynamic-menuitems-in-unity/?lang=en
「Swiftで日記アプリ」UITextViewに入力された文字を「保存ボタン押忍」で取得する

```swift:WriteDiary.swift

import Foundation
import UIKit

var writeDairydata:UITextView! //グローバル変数


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

        writeDairydata.text = "" //UITextViewを空白に初期化
        
        print(writeDairydata) //デバック確認
        
   
        
 
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
      
    }
   
    
    @IBAction func save(sender: AnyObject) {
        
        let text = self.writeDairydata.text //bnutton押忍でUITextView取得
        
        print (text)//デバック確認
        
        
    }
    
    
}

```








後はIBActionの中にrealmを実装するだけ
How to use "ros" in Emacs

Lisp でパッケージを使いたかったので、[Roswell](https://github.com/roswell/roswell) ってのを導入してみたんですね。で、[slime](https://github.com/slime/slime) でも使いたいな、と……。

```init.el
;; https://github.com/papaeye/dotfiles/blob/master/.emacs.d/init.el
(defun require-safe (requirelib)
  "安全な require。読み込みに失敗してもそこで止まらない"
  ;; missing-ok で読んでみて、ダメならこっそり message でも出しておく
  (let ((require-status (require requirelib (symbol-name requirelib) t)))
    (or require-status (message (format "[require-safe] failed %s" requirelib)))
    require-status))

;; slime
;; http://qiita.com/bori_so1/items/38182e4171fad82c7ff0
;; http://takoeight0821.hatenablog.jp/entry/2016/03/02/182449
(when (require-safe 'slime)
  (slime-setup '(slime-repl slime-fancy slime-banner))

  ;; ros 対応
  (setq inferior-lisp-program "ros run") ; インタフェース
  (quickrun-add-command "lisp/sbcl" '((:command . "ros")))) ; quickrun

(add-to-list 'auto-mode-alist '("\\.ros\\'" . lisp-mode))
```

c.f. [RoswellでCommon Lisp環境をセットアップする - ギークもどきの日記帳](http://takoeight0821.hatenablog.jp/entry/2016/03/02/182449)

#### ところで
```fibo.lisp
(defvar nn 3)
(defvar n 40)

(defun print-second (time)
  (format t "処理にかかった秒数: ~A~%"
          (float (/ time internal-time-units-per-second))))

(defun fibo-1 (x)
  (if (or (= 0 x) (= 1 x))
      1
      (+ (fibo-1 (- x 1)) (fibo-1 (- x 2)))))

(defun fibo-2 (n &optional (a1 1) (a2 0))
  (if (< n 1)
      a1
      (fibo-2 (1- n) (+ a1 a2) a1)))

(let ((a (get-internal-real-time)))
  (format t "~a 番目のフィボナッチ数 非末尾再帰版~%" n)
  (dotimes (x nn) (fibo-1 n))
  (print-second (- (get-internal-real-time) a)))

(let ((a (get-internal-real-time)))
  (format t "~a 番目のフィボナッチ数 末尾再帰版~%" n)
  (dotimes (x nn) (fibo-2 n))
  (print-second (- (get-internal-real-time) a)))

(exit)
```

```shell-session
% ros filo.lisp
```

とかで実行できるんですけど、最後に `(exit)` が無いとエラーになるんです。
`ros init fibo` とかで作らないと駄目なんかなあ……。
まあ、今後の課題ということで。

---
# 追記

`(exit)` の件について、コメント欄でご指導頂いたのですが、忙しさにかまけて「いいね」だけして放おっておいたら、ご削除されました。
不義理をするものじゃないですねorz

[RoswellでCommon Lisp環境をセットアップする - ギークもどきの日記帳](http://takoeight0821.hatenablog.jp/entry/2016/03/02/182449) を読んでちょっと解ったのですが、 `main` というのはエントリ・ポイントなんですね。

つまり C でいうところの

```
int main(char* argv[], int argc)
```

みたいなものなんですね。

で、以下のように書いたら動いたんですが、多分、まだ誤解しているorz

```lisp:fibo.ros
(defun main ())

(defvar nn 3)
(defvar n 40)

(defun print-second (time)
  (format t "処理にかかった秒数: ~A~%"
          (float (/ time internal-time-units-per-second))))

(defun fibo-1 (x)
  (if (or (= 0 x) (= 1 x))
      1
      (+ (fibo-1 (- x 1)) (fibo-1 (- x 2)))))

(defun fibo-2 (n &optional (a1 1) (a2 0))
  (if (< n 1)
      a1
      (fibo-2 (1- n) (+ a1 a2) a1)))

(let ((a (get-internal-real-time)))
  (format t "~a 番目のフィボナッチ数 非末尾再帰版~%" n)
  (dotimes (x nn) (fibo-1 n))
  (print-second (- (get-internal-real-time) a)))

(let ((a (get-internal-real-time)))
  (format t "~a 番目のフィボナッチ数 末尾再帰版~%" n)
  (dotimes (x nn) (fibo-2 n))
  (print-second (- (get-internal-real-time) a)))
```
CGPoint をちょっと便利にしようと思ったら、結構便利になってしまった話

`CGPoint` を `CGPoint(x: 100, y: 200)` なんて何千回（ウソって？）も書いていると、`x:`, `y:` がやっぱり面倒になってきて、`x:` と `y:` を省略できるイニシャライザを extension で書こうと思った。

```.swift
extension CGPoint {
	init(_ x: CGFloat, _ y: CGFloat) {
		self.x = x
		self.y = y
	}
}
```

なんかこう書いてみると、`CGFloat` だけでなく、`Double`, `Float` などいろいろな種類を同時に対応できないものかと思うようになりました。そこで、こんなイニシャライザがあれば、便利だと思いました。

```.swift
extension CGPoint {
	init<T: FloatingPoint, U: FloatingPoint >(_ x: T, _ y: U) {
		// initializer
	}
}
```

これで、`CGFloat`、`Double`, `Float` などに一度で対応できるかと思いきや、イニシャライザの中で、ジェネリックな `x` を `CGFloat` や `Double` に変換できない事に気がつきました。

```.swift
	let cx = CGFloat(x) // error
	let dx = Double(x) // error
```

ここで皆さんに助けを求めようと文章を考えている時に、ちょっと閃きました。これがあるからエンジニアはやめられない。

作戦はこうです。まずは なんでも、`CGFloat` に変換できるプロトコルを用意します。

```.swift
protocol CGFloatCovertible {
	var cgFloatValue: CGFloat { get }
}
```

そこで、`CGPoint` でよく使いそうな、型の `CGFloatCovertible` extension を用意します。そこでは、元の値を `CGFloat` に変換して戻してあげます。

```.swift
extension CGFloat: CGFloatCovertible {
	var cgFloatValue: CGFloat { return self }
}

extension Float: CGFloatCovertible {
	var cgFloatValue: CGFloat { return CGFloat(self) }
}

extension Double: CGFloatCovertible {
	var cgFloatValue: CGFloat { return CGFloat(self) }
}

extension Int: CGFloatCovertible {
	var cgFloatValue: CGFloat { return CGFloat(self) }
}
```

これで、`CGPoint` の　イニシャライザを用意してあげれば結構万能なイニシャライザが出来上がりました。

```.swift
extension CGPoint {
	init<T: CGFloatCovertible, U: CGFloatCovertible>(_ x: T, _ y: U) {
		self = CGPoint(x: x.cgFloatValue, y: y.cgFloatValue)
	}
}
```

いい感じです。こうなると調子に乗ってよく使う `CGSize` や `CGRect` にも手を出してみる事にします。

```.swift
extension CGPoint {
	init<X: CGFloatCovertible, Y: CGFloatCovertible>(_ x: X, _ y: Y) {
		self = CGPoint(x: x.cgFloatValue, y: y.cgFloatValue)
	}
}

extension CGSize {
	init<W: CGFloatCovertible, H: CGFloatCovertible>(_ w: W, _ h: H) {
		self = CGSize(width: w.cgFloatValue, height: h.cgFloatValue)
	}
}

extension CGRect {
	init<X: CGFloatCovertible, Y: CGFloatCovertible, W: CGFloatCovertible, H: CGFloatCovertible>(_ x: X, _ y: Y, _ w: W, _ h: H) {
		self = CGRect(x: x.cgFloatValue, y: y.cgFloatValue, width: w.cgFloatValue, height: h.cgFloatValue)
	}
}
```

これで、以前の記事「[Swift で 半精度浮動小数点数 (16 bit Float) を扱う](http://qiita.com/codelynx/items/0acb340791ba0e33316a)」で扱ったような、特殊な数値型な数値型でも、extension で対応可能なので、必要に応じて対応可能になります。

```.swift
extension Float16: CGFloatCovertible {
	var cgFloatValue: CGFloat { return CGFloat(self.floatValue) }
}
```

# Gist

ソースコードはこちらから入手できます。

https://gist.github.com/codelynx/dffd34d66e1a4d54f1dc862acdbca07f

### 環境に関する表記

```.log
Xcode Version 8.0 (8A218a)
Apple Swift version 3.0 (swiftlang-800.0.46.2 clang-800.0.38)
```
codeDeployでGem::ConflictError

codeDeployでrailsのアプリケーションがデプロイ出来なくなった。

## 状況

* amazon Linux
* ruby 2.3.1
* aws-sdk-core 2.6.3

```
$ sudo yum info codedeploy-agent
Loaded plugins: priorities, update-motd, upgrade-helper
Installed Packages
Name        : codedeploy-agent
Arch        : noarch
Version     : 1.0
Release     : 1.1037
Size        : 9.4 M
Repo        : installed
From repo   : /codedeploy-agent-1.0-1.1037.noarch.tmp-20161013-7770-7wuth6
Summary     : Provides the required files for CodeDeploy agent to run in EC2 instances
License     : Amazon.com Internal
Description : CodeDeploy instance agent is responsible for doing the actual work of deploying software
            : on an EC2 instance.
```


ログをみるとcodedeploy-agentが動いている間ずっと以下エラーを繰り返し吐いていた

```/var/log/aws/codedeploy-agent/codedeploy-agent.log
2016-10-13 11:12:19 ERROR [codedeploy-agent(27845)]: Plugin codedeploy could not be loaded: Unable to activate codedeploy-commands-1.0.0, because aws-sdk-core-2.6.3 conflicts with aws-sdk-core (~> 2.3.0).
2016-10-13 11:12:19 ERROR [codedeploy-agent(27845)]: Plugin codedeploy could not be loaded: Unable to activate codedeploy-commands-1.0.0, because aws-sdk-core-2.6.3 conflicts with aws-sdk-core (~> 2.3.0).
2016-10-13 11:12:19 ERROR [codedeploy-agent(27845)]: booting child: error during start or run: Gem::ConflictError - Unable to activate codedeploy-commands-1.0.0, because aws-sdk-core-2.6.3 conflicts with aws-sdk-core (~> 2.3.0) - /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/specification.rb:2284:in `raise_if_conflicts'
/usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/specification.rb:1407:in `activate'
/usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems.rb:196:in `rescue in try_activate'
・
・
```

## 対処したけどダメ
* codedeploy-agentの再起動
* gem cleanup

## 対処できた方法

1. bundle exec gem uninstall aws-sdk-core
2. bundle install で再度aws-sdk-coreをインストール

## 原因
まだ良くわからない
アプリ用APIで、jsonはunicode escapeしたくない

ここでいうアプリとは、iOSアプリ、Androidアプリの話になります。

またWebAPIの認証方式はOAuth2を想定しています。

# jsonでユニコード エスケープすると視認性が低下する

WebAPIでjsonが流行ってる理由として視認性が優れていることもあると思います

たとえばこんなの

```
{
  "name":"たろう",
  "title":"自己紹介",
  "comment":"はじめまして"
}
```

人間に優しく、わかりやすいです


でもunicode escapeするとこんなレスポンスになります

```
{
  "name":"\u305f\u308d\u3046",
  "title":"\u81ea\u5df1\u7d39\u4ecb",
  "comment":"\u306f\u3058\u3081\u307e\u3057\u3066"
}
```

人間では解読できなくなる


アプリ開発する上で、APIレスポンスのこのフィールドが、UI上のここに当てはまっているか？というのを実際にAPIのレスポンスと照らし合わせながら確認することも多いと思います。

そのときにunicode escapeされていると、作業が捗らなくなります。

# jsonでユニコード エスケープするとレスポンス容量が増加する

識別子一文字一文字が1byteとってしまうので容量増加になってしまいます

ピンと来ない人はこちらを読むといいかと思います

>文字コード考え方から理解するUnicodeとUTF-8の違い | ギークを目指して
http://equj65.net/tech/charcode/

# なぜ ユニコード エスケープが必要なのか

json をunicode escapeする理由はセキュリティが理由で

- jsonを直接呼び出すことによるXSS

こちらは古いブラウザを使っていると、json中にjavascriptの任意のコードを仕込むと、それが実行されてしまうというブラウザのセキュリティホールです。以下が詳しいです

>PHPのイタい入門書を読んでAjaxのXSSについて検討した(3)～JSON等の想定外読み出しによる攻撃～ - ockeghem(徳丸浩)の日記
http://d.hatena.ne.jp/ockeghem/20110907/p1

上を読むとわかるのですが、 PHPのjson_encode()をOPTIONなしでそのまま使っていると、日本語はユニコードエスケープされるのですが、XSS対策としては足りてないです

# アプリAPIではjson unicode escapeが必要なのか？

ユーザが投稿したコンテンツを返すAPIなどは、直接ブラウジングされた場合の注意が必要ですが、

>PHPのイタい入門書を読んでAjaxのXSSについて検討した(3)～JSON等の想定外読み出しによる攻撃～ - ockeghem(徳丸浩)の日記
http://d.hatena.ne.jp/ockeghem/20110907/p1

こちらにあるように

```
Content-Type:application/json; charset=UTF-8
X-Content-Type-Options: nosniff
```

をレスポンスヘッダに設定しておけば、メジャーブラウザではIE7以前以外は問題なさそうです。


# 結論

利用サービスにもよるだろうけど、json unicode escapeをやめるのは選択肢として考えるのもいいのではないでしょうか

アプリ用APIの話で書いたつもりが、API全般の話になってた。

自分の認識が間違ってなければ、IE7以下を無視するのであれば、APIならなんでもjson unicode escapeしなくてもよさそう。

# おまけ

## 著名アプリで使われてるAPIはどうなのか実際に見てみた

- メルカリ
    - unicode escapeされてる
- minne
    - unicode escapeしてない

## jsonハイジャック

OAuth2を使うようにしてcookieを直接受け取るようなAPIを作らなければ問題ないはずです

>JSONをvbscriptとして読み込ませるJSONハイジャック(CVE-2013-1297)に注意 | 徳丸浩の日記
http://blog.tokumaru.org/2013/05/JSON-information-disclosure-vulnerability-CVE-2013-1297.html
PhoenixでS3 + CloudFrontでアセットを配信する


## やりたいこと

`priv/static`以下の静的ファイルを`mix`のタスクからS3にアップロードし、CloudFrontからアセットを配信したい

## やったこと

PHPでLaravel向けに[`vinelab/cdn`](https://github.com/Vinelab/cdn)というアセットライブラリがあるのだけどElixirに似たようなライブラリがなかったのでポートしたのを[作って](https://github.com/shufo/cdn)S3 + CloudFrontで配信出来るようにした

[cdn | Hex](https://hex.pm/packages/cdn/) ([GitHub](https://github.com/shufo/cdn))

## Installation

- mix.exsに依存を追加

```elixir
{:cdn, "~> 0.0.4"}
```

- 依存更新

```elixir
mix deps.get
```

- configを追加

`config/config.exs`

```elixir
config :cdn,  include: [
                directories: ["priv/static"],
                patterns: ["**/*"],
                hidden: true
              ],
              exclude: [
                directories: [],
                patterns: [],
                hidden: true
              ],
              acl: :public_read,
              bypass: true,
              cache_control: "max-age=#{86400 * 30}",
              expires_after: 86400 * 30
```

|項目|説明|
|--:|:--|
|`include`|`directories`: アップロード対象のディレクトリ<br>`patterns`: Glob patternでアップロード対象の絞込。複数指定可。<br>`hidden`: 隠しファイルを含めるかどうかをtrue, falseで指定|
|`exclude`|除外対象のファイル。`include`と同じようにディレクトリとパターンを指定。|
|`acl`|アップロードしたオブジェクトの権限。アセットとして公開されるので通常は`public_read`にする。|
|`cache_control`|`Cache-Control`ヘッダに指定する値|
|`expires_after`|`Expires`ヘッダに指定するキャッシュ期限切れまでの秒数|

`config/dev.exs`

```elixir
config :cdn, bucket: "foobar.assets",
             cloudfront_url: "https://foobar.cloudfront.net",
             bypass: true
```


|項目|説明|
|--:|:--|
|`bucket`|アップロード対象のS3バケット|
|`cloudfront_url`|S3と紐付けられているCloudFrontのURL|
|`bypass`|`true`の場合ビュー用のヘルパーでURLを補完しない。<br>e.g. `cdn("/css/app.css") => "/css/app.css"`|

`config/prod.exs`

```elixir
config :cdn,  bucket: System.get_env("ASSET_BUCKET") || "foobar.production.assets",
              cloudfront_url: System.get_env("ASSET_HOST") || "https://foobar.cloudfront.net",
              bypass: false
```

|項目|説明|
|--:|:--|
|`bypass`|`false`の場合ビュー用ヘルパーでURLを補完する。<br>e.g. `cdn("/css/app.css") => "https://foobar.cloudfront.net/css/app.css"`|

- AWSのアクセスキーを環境変数にセット

```elixir
export AWS_ACCESS_KEY_ID=foo
export AWS_SECRET_ACCESS_KEY=bar
```

## Usage

- アセットアップロード

`mix cdn.push`

![](https://raw.githubusercontent.com/wiki/shufo/cdn/img/upload.gif)

- 削除

`mix cdn.empty`

![image](https://qiita-image-store.s3.amazonaws.com/0/47983/105db105-df4c-dddf-3a6c-dea012a68eac.png)

- テンプレートで静的ファイルの読み込み

`web/web.ex`

```elixir
def view do
～中略～
  # 追加
  import Cdn.Helpers

end
```

`app.html.eex`

```elixir
<script src="<%= cdn static_path(@conn, "/js/vendor.js") %>"></script>

# bypass=trueの場合
#=> "<script src="/js/vendor.js"></script>"

# bypass=falseの場合
#=> "<script src="https://foobar.cloudfront.net/js/vendor.js"></script>"
```

## まとめ

- PhoenixでS3 + CloudFrontでアセットを配信出来るようにした
- Elixir内で完結するので他のツール使いたくない場合はいいかも
- 今気づいたけど[asset_sync](https://github.com/ohr486/asset_sync)って似たようなライブラリが既にありますね（遅）
【ツール】「OneNoteに送る」のキャプチャ機能が意外と便利

#前提条件
・OneNoteが使える環境

#ドキュメント作成用のキャプチャだけならOneNoteで解決
##ショートカットキー
一度でもOneNoteを起動したことがあれば「OneNoteに送る」がタスクトレイに常駐しています。
この状態で[windowsキー]+[s]でキャプチャ機能を起動できます。

キャプチャ領域を選択してちょっと待つとダイアログが立ち上がります。
（環境によっては自動でクリップボードに行くかも）
![image](https://qiita-image-store.s3.amazonaws.com/0/144238/6997ae7b-b364-fcb5-39bf-0473e80571e5.png)

どこにキャプチャを張り付けるか選択して、キャプチャ完了です。
Excelなり、PowerPointなり、ペイントなりに張り付けて楽しんでください。

##自動でクリップボード送り
いちいちダイアログが立ち上がるのが面倒な方は
「常に次のようにし、今後メッセージを表しない」にチェックを入れてから選択を確定してください。

私は常にクリップボードに行くように設定しています。
チェック入れてから、クリップボードにコピー選択で設定完了。

##自動送り解除
ダイアログが立ち上がるようにしたい場合はOneNoteの設定から解除できます。
OneNote2013の場合：
左上、[ファイル]から[オプション]へ
![image](https://qiita-image-store.s3.amazonaws.com/0/144238/d2dd7c68-e07e-a7f2-2679-ef95be0f4a16.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/144238/0ef6adb3-b25a-b76a-e5f5-2fa95582d3e5.png)
[OneNoteに送る]の設定で[画面の領域]の設定を変えてあげれば設定完了。
![image](https://qiita-image-store.s3.amazonaws.com/0/144238/d90f5bac-3129-3c13-22e7-0568d9df0f63.png)

#まとめ
Qiitaの記事にも切り取ったまま張り付けられるので便利です。
キャプチャツール調べて入れるのすら手間な人は活用しましょう。
ペイントに張り付けてトリミングするめんどくさい作業とはさようならです。

#注意
OneNote2007だと64bitのOSでうまく機能を使えないそうです。
http://onenote.hprs1.com/onenote-okuru/

以上。
macOS上のGUI版Emacsのバージョンに対してcask installを行う

こんにちは:octocat:
最近 [ハッカーになろう#同じ問題を二度解くような無駄はいやだ](http://cruel.org/freeware/hacker.html#believe2) を読んで情報の共有を意識して行っていこうと痛感している次第です。

さて、Emacs用のパッケージ管理ツール [cask](https://github.com/cask/cask) を使って [GUI版Emacs](https://emacsformacosx.com) に対するパッケージ管理を行おうとしたのですが、Terminal上のEmacsのバージョンにしか操作が行われず若干ハマりました。今回はその症状と対処法についての投稿になります。

## 環境

* macOS 10.12 sierra
* Emacs
    * 25.1.1 (GUI)
    * 24.5.1 (CUI)
* cask
    * curlでインストール

## 症状

下記のように、CUI版Emacsのバージョン用のディレクトリしか作られていないという状況です。

```shell-session
% emacs --version 
GNU Emacs 24.5.1
Copyright (C) 2015 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
% /Applications/Emacs.app/Contents/MacOS/Emacs --version
GNU Emacs 25.1.1
Copyright (C) 2016 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
% cd ~/.emacs.d
% cask init
% cask install
% cd .cask
% ls
24.5/  24.5.1/
```

## 対処法

[Caskの公式ドキュメントの'Usage'の項](https://cask.github.io/usage.html) によると

> To specify a custom Emacs, use the EMACS environment variable, for example:
> `$ EMACS="$(evm bin emacs-24.1)" cask command`

とあり、emacsの場所を渡すことができるようなので、次のように打ちます。

```shell-session
% cd ~/.emacs.d
% EMACS="/Applications/Emacs.app/Contents/MacOS/Emacs" cask install
% cd .cask
% ls
24.5/  24.5.1/  25.1/
```

私の環境では、これでGUI版Emacsに対するパッケージの用意が完了しました。
以上になります。
対処方法 ERROR ITMS-90206: "Invalid Bundle. The bundle at ‘XXX.app/PlugIns/YYY.appex' contains disallowed file 'Frameworks'."

※CocoaPods1.1.0では対応済みでこのエラーは起きないようです。(コメント欄参照)
 そのため1.1.0にするのが一番良い解決方法かと思います。
 ただ書き方は少し変わるため、どうしても1.1.0にしたくない場合のみ下記をお試しください。

#はじめに
アプリを審査に出そうとしたらエラーが出て焦りました。
エクステンションアプリにライブラリーをCocoaPodsで入れると起こります。
Xcode8です。

#エラーの内容
エクステンションアプリの中にFrameworksフォルダが存在するとエラーになります。

#対処方法
エクステンションアプリの中にFrameworksフォルダが存在しないようにすればエラーが起きなくなります。
(パッケージの中から単純に削除するだけではアプリがひらかなくなることがありました。下記の対処方法のその1だけで解決する場合は単純に削除で良いはずです。)

##その1
メインアプリ以外のBuild PhasesにあるRun Scriptに下記を追加します。
(エラーとなっているTARGETだけでOKです)

```
cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
if [[ -d "Frameworks" ]]; then
rm -fr Frameworks
fi
```

<img width="699" alt="スクリーンショット 2016-10-13 11.02.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/073abfd2-5076-dc38-eb01-64b60638ac03.png">

これで解決しているかArchiveからやり直して確認してみてください。
Swiftのライブラリーを使っているとこれだけでは解決しないです。

※このRun Scriptを追加した後にCocoaPodsで追加すると処理の順番？か何かで
Frameworksフォルダを削除した後にFrameworksフォルダを作ってしまいます。
その場合は追加したRun Scriptsを削除して再度追加してください。
処理の順番？が変わってうまくいきます。

##その2
メインアプリ以外のBuild PhasesにあるEmbed Pods Frameworksを削除しましょう。
(エラーとなっているTARGETだけでOKです)

<img width="695" alt="スクリーンショット 2016-10-13 11.02.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/6465b982-7501-51cb-82cf-ea0bb134943c.png">

これで解決しているかArchiveからやり直して確認してみてください。
解決できない場合はその3へ

##その3
メインアプリ以外のBuild Settingsの
Always Embed Swift Standard LibrariesをNO
EMBEDDED_CONTENT_CONTAINS_SWIFTをNO
とします。
(エラーとなっているTARGETだけでOKです)

<img width="697" alt="スクリーンショット 2016-10-13 11.03.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/e337c43e-f321-c0bc-f181-bf5d7004a2c6.png">

これで解決しているかArchiveからやり直して確認してみてください。
私はこれで解決しました。

#さいごに
エクステンションアプリにCocoaPodsでRealmを入れると起きたので自分のメモも兼ねて残しました。
間違いやもっと良い方法などございましたら教えてください。
ruby set_color 输出

https://github.com/erikhuda/thor/blob/master/lib/thor/shell/color.rb

```bash
[5] pry(main)> $stdout.tty?
=> true
[6] pry(main)> puts "\e[31mhahahhahahaha\e[0m"
hahahhahahaha
=> nil
[7] pry(main)> puts "\e[32mhahahhahahaha\e[0m"
hahahhahahaha
=> nil
```

https://github.com/erikhuda/thor/blob/master/lib/thor/shell/color.rb#L84
すでに来ている。devicePixelRatioが3な時代

普段、[Xperia Z5 Premium](http://www.sonymobile.co.jp/xperia/docomo/so-03h/)でスマホライフを送っていると「あれ？ ぼやけてない？」と思うことが。次の画像は普段お世話になっているAmazonのサイトトップ。ロゴやバナーの文字の輪郭がほんわかして見えます。

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/55103/7f74d98f-b2d6-7489-1bd1-58922adc27a4.png)

Xperia Z5 PremiumはdevicePixelRatioが3の端末なので、おそらくそこが原因かと思います(本当にAmazonさん日頃からお世話になっております:bow:)。

# 意外と多いdevicePixelRatioが3な端末

2016年のdevicePixelRatio事情は記事「[【CSS】スマホ、タブレットの横幅(端末解像度と実質解像度)](http://scene-live.com/page.php?page=96)」にてまとめられていました。

devicePixelRatioが3な端末は次のようになっています。ここまで増えているとは気づきませんでした。。

- iPhone
 - iPhone 6 Plus
 - iPhone 6s Plus
- Android
 - ほとんどの端末

※記事ではXperia Z5 PremiumのdevicePixelRatioが6となっていますが、手元の端末で[mydevice.io](http://mydevice.io/)を確認すると3でした。

# 今後も増えていくdevicePixelRatioが3な端末

スマホの画面解像度も日に日に高くなり、おそらくdevicePixelRatioが3な端末が今後も増えていくでしょう。ロゴやバナーをぼかさないためにも、そろそろ向き合うタイミングが来たのかもしれません。
SwiftのArrayはスレッドセーフ?

## Arrayはスレッドセーフなのか？

通常、スレッドセーフとして作られているならばそうドキュメントに書いてあります。
しかし、Swiftの[ドキュメント](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105)にはそのようなことは書いてありません。
そのためArray型はスレッドセーフでない、と考えるべきです。
はい、終了。

## Copy-on-writeはスレッドセーフ?

待てよ？SwiftのArrayはCopy-on-Writeっていう仕組みがあるんだよな？
そうすると別の変数でも実体は同じインスタンスを指している可能性がある。
それじゃあ別々のスレッドからアクセスするには明示的に別インスタンスとして生成しないとまずいんじゃないの？

```Swift
let a = [1,2,3]
let b = [Int](a)
```

こんな風に書かないといけない？めんどくさっ
（というかこれで本当に別インスタンスになるのだろうか？）

と思いましたが、

[Value and Reference Types - Swift Blog - Apple Developer](https://developer.apple.com/swift/blog/?id=10)
> In Swift, Array, String, and Dictionary are all value types. They behave much like a simple int value in C, acting as a unique instance of that data. You don’t need to do anything special — such as making an explicit copy — to prevent other code from modifying that data behind your back. Importantly, you can safely pass copies of values across threads without synchronization. In the spirit of improving safety, this model will help you write more predictable code in Swift.

適当訳(最後めんどくなってGoogle翻訳しちゃった)
> SwiftではArray, String, Dictionaryなどは値型です。これらはCでの単純なint型と同じように振る舞い、事実上データのユニークなインスタンスです。裏でデータを変更する処理が走っていても特別なこと(明示的にコピーを作る等)をする必要はありません。重要なことは同期を取ることなく安全にスレッド間で値のコピーを渡すことができることです。安全性向上の精神では、このモデルではSwiftでより予測しやすいコードを書くのに役立ちます。

ということで、Copy-on-Write自体はスレッドセーフかはわかりませんが、Array等が実装しているCopy-on-Writeはスレッドセーフになってるみたいです。
値型として考えると自然な動作になるようしてるんですね。

余談ですがCopy-on-Writeを実装するならスレッドセーフにするよう推奨してるっぽいですね。

## 結論

- Array自体はスレッドセーフでない
- ArrayのCopy-on-Write実装はスレッドセーフ
- 同じ変数に格納されたArrayを複数スレッドからアクセスするときは同期とっとけ
- 別の変数に保持してあれば別スレッドからアクセスしても大丈夫

```NG.swift
var a = [1,2,3]
DispatchQueue.global().async {
    a.append(5)
}
DispatchQueue.global().async {
    a.append(6)
}
```

```OK.swift
var a = [1,2,3]
var b = a
DispatchQueue.global().async {
    a.append(5)
}
DispatchQueue.global().async {
    b.append(6)
}
```


## 参考

[Is swift array thread safe? Can swift array face race condition? : swift](https://www.reddit.com/r/swift/comments/4myh3w/is_swift_array_thread_safe_can_swift_array_face/?st=iu7m9ty1&sh=0d24d7e3)
[Value and Reference Types - Swift Blog - Apple Developer](https://developer.apple.com/swift/blog/?id=10)
[The Swift Programming Language (Swift 3): Collection Types](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105)
Promiseの闇？（再帰の闇かもしれない）

200万行近いShapefileがあるじゃろ？

Node.jsで処理しようと思えば、[Shapefile](https://www.npmjs.com/package/shapefile) モジュールを使うじゃろ？

で、単純に、サンプルに等しい処理をまわすと...

```js:shapefile単純ぶんまわし
var shapefile = require("shapefile");

var count = 0;   
shapefile.open("example.shp")
    .then(source => source.read()
    .then(function log(result) {
      if (result.done) return;
      count = count + 1;
      if (count % 10000 == 0) console.log(count); 
      return source.read().then(log);
    }))
  .catch(error => console.error(error.stack));
```

160万行目くらいで、こうじゃ！

```shell-session:Windowsコマンドプロンプト
<--- Last few GCs --->

 1775279 ms: Scavenge 1398.3 (1458.1) -> 1398.3 (1458.1) MB, 0.3 / 0 ms (+ 0.0 m
s in 1 steps since last GC) [allocation failure] [incremental marking delaying m
ark-sweep].
 1776507 ms: Mark-sweep 1398.3 (1458.1) -> 1398.3 (1458.1) MB, 1227.5 / 0 ms (+
0.0 ms in 2 steps since start of marking, biggest step 0.0 ms) [last resort gc].

 1777674 ms: Mark-sweep 1398.3 (1458.1) -> 1398.3 (1458.1) MB, 1178.9 / 0 ms [la
st resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 00000114947E3AD1 <JS Object>
    2: decode [D:\Works\XXXXXX XXX\XXXX\node_modules\text-encoding\lib\encoding.
js:1128] [pc=00000318CB0F1257] (this=0000024543C241C9 <a TextDecoder with map 00
0001CBC3223059>,input=0000015E2DF8DE69 <an Uint8Array with map 0000035139609CC9>
,options=0000015E2DF8DE31 <an Object with map 00000351396095E9>)
    3: arguments adaptor frame: 1->2
    7: _decode [native v8natives.js:1213] [pc=0000031...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
```

これ以上は知識なさ過ぎて、Promiseネストか再帰ネストかどっちが問題なんかようわからへんけど、160万階層もネストすればまあ何かしら問題あるんやろなあ...
Engine（engine.io）v1.7の目指すところの和訳

Socket.ioの通信部分（WebSocket,HTTP）を担うEngineというライブラリのv1.7のdocsを読んでいたのですが、メモしていたらなんとなくまるっと和訳っぽくなったので公開します。

ちなみに何を改良してるのかはまだ読み途中なので、なんかいい感じに書けたら追って公開します。

[socketio/engine.io at 1.7.0](https://github.com/socketio/engine.io/tree/1.7.0)

以下は [Goals](https://github.com/socketio/engine.io/tree/1.7.0#goals) のみの和訳です。
結構適当なので面白いと思った方は本文を読んでみてはいかがでしょうか。

### ゴール

以前のバージョンのsocket.io coreとは異なり、Engineはlong-polling connectionを最初に確立し、その後でよりよいtransports（WebSocketなど）にupgradeしようと試行する。

socket.io projectのlifetimeのなかで、開発チームは数え切れない欠点をHTML5 WebSocketとFlash Socketをfirst-connection-mechanismとして使うことに見出してきた。

これらは両方とも双方向通信を確立するのに正しい方法であり、HTML5 WebSocketは未来の手法である。
しかしながら、ほとんどのビジネスの要望に答えるには、別のtraditionalなHTTP1.1のmechanismsが最良の解答でもある。

WebSocketベースの通信には以下の2つの基本的な利点がある。

1. Better server performance
  * A: Load balancers ロードバランサー
    * long-polling接続のload-balancingは重大なアーキテクチャの悪夢をもたらす。なぜなら、リクエストはuser agentにより開かれたいくつものソケットにより送信されるからだ。 しかしこれらはすべてプロセスにまわされる必要があり、コンピュータはEngineのための接続を持つ。これはRAMとCPU利用率に悪い影響をもたらす。
  * B: Network traffic ネットワーク通信
    * WebSocketは各message frameが少なくとも一定量のdataにより構成されていることを前提に設計されている。HTTP1.1 tranportsでは、各message frameはHTTP headerとchunked encoding frameにより構成されている。もしあなたが"Hello World"というmessageをxhr-pollingで送信しようとしたら、そのmessageは絶対的にWebSocketで送信しようとするデータより大きいサイズになる。
  * C: Lightweight parser 軽量なパーサ
    * Bの影響により、サーバはネットワークのdataをパースするためにたくさんの仕事をしなければならないし、いつ昔ながらのHTTPリクエスト（logn-polling）が使われるのかをわかっていなければならない。これはWebSocketは少ないサーバのCPU利用率ですむという別の利点をあらわしている。

2. Better user experience
  * 1で言及した理由により、WebSocketによる接続確立の重要な影響は、raw dataの転送速度であり、これはいくつかの場合においてより良いUXであるととらえられる。
  * 重いリアルタイムのインタラクションがあるアプリケーション（ゲームなど）は大変に恩恵を受けられる。その一方でリアルタイムチャット（Gmail/Facebook）、ニュースフィード（Facebook）やタイムライン（Twitter）には些細な改善にしかならない。

このように言えるが、WebSocket接続を直接確立するには、これまでのところ以下のような問題になり得る点が証明されている:

1. Proxies
  * 多くの会社のproxyはWebSocket通信を遮断する
2. Personal firewall and antivirus software
  * 調査の結果、少なくとも3点の個人向けセキュリティアプリケーションがWebSocket通信を遮断することがわかっている
3. Cloud application platforms
  * HerokuのようなplatformやNo.deはWebSocketプロトコルの早いペースでの進化についていくことに問題を抱えている。結局のところアプリケーションはlong-pollingを使うことを避けられない。しかしsocket.io開発チームはssocket.ioのインストールがシームレスに行えるようにして、こういったことががなくなるように努力している。

これらのいくつかの問題には解決法がある。しかしながら、proxyと個人のプログラムに関しては、解決には何回ものソフトウェアのアップグレードが含まれてしまう。
経験から言ってクライアントソフトウェアのアップグレードをビジネスの解決法として提供するのは無益である: このプロジェクトの存在そのものはuser agent distributionのばらばらになった全景（panorama）に対処することである。そしてそれは最新のモダンなuser agent(Chrome, FireFox, and Safari)で行うクライアントの接続による。けれども、IE5.5よりも古い他のバージョンもあるのだ。

ユーザ視点からは、成功しなかったWebSocketの接続は、リアルタイムアプリケーションがデータを通信し始めるまでに少なくとも最高10秒間の待ち時間をかけて通信の変換を行う。これはUXを知覚的に感じ取れるほど損なっている。

まとめると、Engineは信頼性とUXを第1に集中する。また、軽微で潜在的なUXの改善とサーバの性能改善を第2とおく。Engineは結果として荒野のWebSocketから学んだ教訓となっている。
PHPビルドインサーバーに外部からつなぎたい場合

（そのうち清書）

**!PHP5.4.0以降の話**

## まずは外部から繋がるように

```bash
php -S localhost:8000
```
のような指定があったら、

```bash
php -S 0.0.0.0:8000
```
というような感じに。
ポートも開く。

## URL書き換えしてる場合
.htrouter を作成し色々書いてみる。
こんな感じ

```bash
<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    $_GET['_url'] = $_SERVER['REQUEST_URI'];
}
return false;
```
まぁここは状況次第。

## 最終的には

```bash
php -S 0.0.0.0:8000 .htrouter
```
となる。

今まで結構Apacheの設定とかやってましたが、ちょっと試すだけならこれで十分そう。