OmniAICreator/Qiita-1.07M huggingface dataset:
TextExpanderでURLを展開する時に勝手に置換される問題


## URLを展開するとおかしな感じになる
TextExpanderでは、展開されるテキストにAppleScript等を記述することで、実行結果を編集中のテキストに挿入することができる。

例：Safariで開いているページのURLを取得して挿入するAppleScriptスニペット

```AppleScript
tell application "Safari" to get URL of document 1 as Unicode text
```

例えばこのページ [保護者 - Wikipedia](https://ja.wikipedia.org/wiki/保護者) をSafariで開いている状態で、上記スクリプトを実行すると、以下のようなテキストが挿入される。

    https://ja.wikipedia.org/wiki/%E47月F%9D%E8日曜日D7月7%E8%80%85

が、デッドリンクになってしまう。ただしいURLは以下の通り。

    https://ja.wikipedia.org/wiki/%E4%BF%9D%E8%AD%B7%E8%80%85

## TextExpanderマクロ文字列
これは、展開された（されるべき）文字列に、**TextExpanderマクロが含まれる**ためである。
上記の例でいえば、`%B`は月、`%A`は曜日に、自動的に変換される。

現在のTextExpanderで、スニペットごとにマクロの展開を抑止する方法は**ない**。はず。
よって、マクロ機能を有効にし、かつ「マクロと解釈されうる文字列」をそのまま展開するには、クリップボードに格納してペーストするなどの対策を取るしかない。

AppleScriptによるGUIスクリプティングでペーストまたはキー操作`Ctrl+V`を実行するくらいしかないのだろうか。


## 対策：%clipboard+%snippet:hoge%
AppleScriptでURLをクリップボードへ格納した上で、`%clipboard`マクロを展開してみるのはどか。

```AppleScript
tell application "Safari" to set the clipboard to URL of document 1 as Unicode text
get "%clipboard"
```

やはり同様の結果になってしまう。**マクロで展開されたテキストに含まれるマクロも展開される**のだ。

ところが、マクロとして解釈されうる文字列をクリップボードに格納した状態で、**プレインテキストのスニペットとして**`%clipboard`を展開すると、さらなるマクロ展開は起こらなかった。
バグくさいが、とりあえずTextExpander5.1.4においては、**マクロの多重展開は、スクリプト系スニペットでしか発生しない**。

ここで、他のスニペットを読み込むマクロ、`%snippet:hoge%`が使える。ふたつのスニペットを組み合わせて運用するのだ。

1. URLを取得し、展開する文字列をクリップボードに格納するスクリプトスニペット
2. 1のスニペット呼び出し＋クリップボードから貼り付けを行うプレーンテキストスニペット

## 結論
以上を踏まえて、最終的なスニペットは以下のようになった。

### 1.スクリプトスニペット
これは直接展開しないので、abbreviations（短縮形）は誤展開しないよう長いものにしておく。

- ???copyURLfromSafari
    - SafariからURLをクリップボードに格納

```AppleScript
--Copy URL from Safari
tell application "Safari" to set the clipboard to URL of document 1 as unicode text
```

- ???copyLinkFromSafari
    - SafariからMarkdown形式のリンクをクリップボードに格納

```AppleScript
--Copy Markdown link from Safari
tell application "Safari"
	set cTitle to name of document 1 as Unicode text
	set cURL to URL of document 1 as Unicode text
	set the clipboard to "[" & cTitle & "](" & cURL & ")"
end tell
```

### 2.プレーンテキストスニペット
実際に展開するのはこちらになるので、単純なabbreviationsにする。

- srl
    - SafariからURLを貼り付け

```text
%snippet:???copyURLfromSafari%%clipboard
```

- sln
    - SafariからMarkdown形式のリンクを貼り付け

```text
%snippet:???copyLinkfromSafari%%clipboard
```
「開眼！JavaScript」サンプルコード#4/4  第13-16章　

# 13章 プリミティブ型文字列、数値、真偽値　

13.1 プリミティブ型は、プロパティにアクセスされるとオブジェクトに変換される

http://jsfiddle.net/jseja/sVLHz

13.2 文字列、数値、真偽値は常にプリミティブ型を使う

http://jsfiddle.net/jseja/UJV7g


# 14章　null

14.1 null

http://jsfiddle.net/jseja/wDwjs

14.2 typeof null は'object'を返す

http://jsfiddle.net/jseja/HLwCL


# 15章 undefined

15.1 undefined

http://jsfiddle.net/jseja/rVNet

15.2 JavaScript ECMA-262 Edition 3 以降では undefined 変数が存在

http://jsfiddle.net/jseja/GYJaG


# 16章　Ｍａｔｈ関数

16.1 ビルトインＭａｔｈオブジェクト

サンプルコードなし

16.2 Mathが持つプロパティとメソッド

サンプルコードなし

16.3 Mathはコンストラクタ関数ではない

サンプルコードなし

16.4 Mathオブジェクトは変更・削除不可

サンプルコードなし





* * *

前：[「開眼！JavaScript」サンプルコード#3/4 第9-12章](http://qiita.com/ykt68/items/9531c233be522f70c9db)
「開眼！JavaScript」#3/4 サンプルコード 第9-12章　

# 9章　配列（Array())　

9.1 Array()オブジェクト

http://jsfiddle.net/jseja/VWTYU
 
9.2 Array()パラメータ

http://jsfiddle.net/jseja/RTPTr

9.3 Array()のプロパティとメソッド

サンプルコードなし

9.4 Array()のインスタンスのプロパティとメソッド（Array.prototypeのプロパティ）

サンプルコードなし

9.5 配列を生成する

http://jsfiddle.net/jseja/jkZP8

9.6 要素の追加・変更

http://jsfiddle.net/jseja/5SmEt

http://jsfiddle.net/jseja/nr8Qd

9.7 lengthとインデックス

http://jsfiddle.net/jseja/teDJv

9.8 指定した数の要素を持った配列を生成する

http://jsfiddle.net/jseja/2AJmv

9.9 配列のlengthを指定して要素の追加・削除

http://jsfiddle.net/jseja/3TLW4

9.10 配列を配列に格納（多次元配列）

http://jsfiddle.net/jseja/9yDf3

9.11 配列の要素を前から・後ろからループする

http://jsfiddle.net/jseja/ZbvJ3

http://jsfiddle.net/jseja/bgzpK


# 10章 String()

10.1 String() オブジェクト

https://jsfiddle.net/jseja/uvsHS

10.2 String()で文字列オブジェクトを生成、そして値を文字列に変換

https://jsfiddle.net/jseja/7yCf6

https://jsfiddle.net/jseja/89v7n

10.3 String()のプロパティとメソッド

サンプルコードなし

10.4 String()のインスタンスのプロパティとメソッド（String.prototypeのプロパティ）

サンプルコードなし


# 11章 Number()

11.1 Number()オブジェクト

http://jsfiddle.net/jseja/KZQ4V

11.2 整数と小数

http://jsfiddle.net/jseja/8zY5B

11.3 Number()に引数を渡して数値に変換

http://jsfiddle.net/jseja/B7Wrc

11.4 Number()のプロパティとメソッド

サンプルコードなし

11.5 Number()のインスタンスのプロパティとメソッド（Number.prototypeのプロパティ）

サンプルコードなし


# 12章　Boolean()

12.1 Boolean()オブジェクト

http://jsfiddle.net/jseja/78G7M

12.2 Boolean()のパラメータ

http://jsfiddle.net/jseja/gVCkG

12.3 Boolean()のプロパティとメソッド

サンプルコードなし

12.4 Boolean()のインスタンスのプロパティとメソッド（Boolean.prototypeのプロパティ）

サンプルコードなし

12.5 真偽値オブジェクトは格納されている値がfalseであってもtrueと評価される

http://jsfiddle.net/jseja/vAtaY

12.6 いくつかの値はfalse、それ以外はすべて trueに変換

http://jsfiddle.net/jseja/f8THU



* * *

前：[「開眼！JavaScript」サンプルコード#2/4 第5-8章　](http://qiita.com/ykt68/items/9f67fb1de2af9a96bf8a)

次：[「開眼！JavaScript」サンプルコード#4/4 第13-16章](http://qiita.com/ykt68/items/f199d88c07f91aec5bd3)
「開眼！JavaScript」サンプルコード#2/4　第5-8章　

# 5章 グローバルオブジェクト

5.1 グローバルオブジェクト

http://jsfiddle.net/jseja/MqYcW

5.3 グローバルプロパティ、グローバル変数

http://jsfiddle.net/jseja/nFtYH

http://jsfiddle.net/jseja/2MPZN

http://jsfiddle.net/jseja/6Xyh3

5.4 グローバルオブジェクトにアクセスする

http://jsfiddle.net/jseja/RrKK2

5.5 グローバルオブジェクトは暗黙的に参照される

http://jsfiddle.net/jseja/ZGDP4


# 6章 this

6.1 thisとは何か、およびthisは何を参照するか

http://jsfiddle.net/jseja/KbVvW

http://jsfiddle.net/jseja/wKEM2

6.2 thisの値はどのように決められるのか？

http://jsfiddle.net/jseja/JxUwf

http://jsfiddle.net/jseja/aLLDJ

6.3 入れ子関数内では、thisはグローバルオブジェクトを参照する

http://jsfiddle.net/jseja/b5yDY

http://jsfiddle.net/jseja/rhpsL

6.4 入れ子関数内でthisを見失う問題をスコープチェーンを使って回避する

http://jsfiddle.net/jseja/twq8c

6.5 call()やapply()を使ってthisの値をコントロールする

http://jsfiddle.net/jseja/G3kJp

http://jsfiddle.net/jseja/HFd7C

6.6 thisキーワードをユーザー定義のコンストラクタ関数で使う

http://jsfiddle.net/jseja/xZ4tP

http://jsfiddle.net/jseja/apDPN

6.7 プロトタイプメソッド内のthisは生成されるインスタンスを参照する

http://jsfiddle.net/jseja/Fj26a


# 7章 スコープとクロージャ

7.1 JavaScriptのスコープ

http://jsfiddle.net/jseja/AYRqg

7.2 JavaScriptはブロックスコープを持たない

http://jsfiddle.net/jseja/NYRX9

7.3 関数内で変数を定義する際は常に var を使い、スコープの穴を避ける

http://jsfiddle.net/jseja/qaPzH

7.4 スコープチェーン（静的スコープ）

http://jsfiddle.net/jseja/pdqXG

http://jsfiddle.net/jseja/q8E29

7.5 スコープチェーンの検索は最初に発見した値を返す（マスキング）

http://jsfiddle.net/jseja/Vftn8

7.6 スコープは関数実行時ではなく関数定義時に決められる

http://jsfiddle.net/jseja/W73T2

7.7 クロージャはスコープチェーンによって生成される

http://jsfiddle.net/jseja/Dfx2a

http://jsfiddle.net/jseja/hBJvA

http://jsfiddle.net/jseja/xbRYY

http://jsfiddle.net/jseja/Vu49m

7.8 グローバルスコープで宣言されている関数もクロージャである

http://jsfiddle.net/jseja/9sQNx


# 8章 関数のprototypeプロパティ

8.1 プロトタイプチェーン

http://jsfiddle.net/jseja/7VfFW

8.2 なぜprototypeプロパティが重要なのか

8.3 prototypeプロパティはすべてのFunction()インスタンスに自動的に付与される

http://jsfiddle.net/jseja/aZQmw

8.4 prototypeプロパティのデフォルト値はObject()オブジェクト

http://jsfiddle.net/jseja/nxxvP

8.5 コンストラクタ関数から生成されたインスタンスはそのコンストラクタのprototypeプロパティにリンクする

http://jsfiddle.net/jseja/NMLUj

8.6 プロトタイプチェーンの終着点は Object.prototype

http://jsfiddle.net/jseja/kzJW2

8.7 プロトタイプチェーンは最初に見つけたプロパティを返す

http://jsfiddle.net/jseja/CxBBS

8.8 prototypeプロパティに新しいオブジェクトを設定するとデフォルトのconstructorを失う

http://jsfiddle.net/jseja/Y4tNg

http://jsfiddle.net/jseja/7wmKy

8.9  プロトタイプからプロパティを継承するインスタンスは常に最新の値を取得

http://jsfiddle.net/jseja/ssjDg

http://jsfiddle.net/jseja/qs32T

8.10 prototypeプロパティを新しいオブジェクトに置き換えた場合、過去のインスタンスは更新しない

http://jsfiddle.net/jseja/UfBps

8.11 ユーザー定義コンストラクタもプロトタイプ継承を行うことができる

http://jsfiddle.net/jseja/34t4G

http://jsfiddle.net/jseja/E2thT

8.12 継承チェーンを生成する

http://jsfiddle.net/jseja/brsxy



* * *

前：[「開眼！JavaScript」サンプルコード#1/4　第1-4章](http://qiita.com/ykt68/items/5aee04682f95f2354398)

次：[「開眼！JavaScript」サンプルコード#3/4 第9-12章](http://qiita.com/ykt68/items/9531c233be522f70c9db)
wxHexEditor を使ってみた > raspbian jessie liteの変更箇所の確認

http://qiita.com/mt08/items/51797cdd31e7568ebce4#comment-33e33bb524e401b57b53
> ちなみに、バイナリエディタは、wxHexEditorというものを使いました。
Options>FileMode>DirectWriteをえらべば、その場でDisk上のデータを書き換えるので、どんな大きなファイルでも編集できるっぽいので、jessieのおおきなimgファイルの検索、編集がいけました。

上記コメントにて教えていただいたwxHexEditorを使ってみた。

開いたファイルは http://qiita.com/mt08/items/c680c6363d4d071d641c にてQEMU上でのraspbian実行に使われている 2016-05-27-raspbian-jessie-lite.img ファイル (パッチ変更前)。

### オフセット表示切替 

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7b3f2353-c33c-6d3a-4394-b9f8f7748a53.png)


wxHexEditorのデフォルトでは「オフセット」の表示が16進数ではないようだ。

「オフセット」の項目の上で右クリックしていくと表示が切り替わって、そのうちの１つに16進表示が見つかった。




### Raspbianのパッチ部分の確認

http://qiita.com/mt08/items/c680c6363d4d071d641c
にてjessie-liteの書き換えをしている。

以下の該当箇所を見てみた。

> 0CAAF044: 2F 23

wxHexEditorの下に「カーソルオフセット: 0AAF087h」のような表記がある。これでカーソル部分のアドレスが分かる。

0x0CAAF044で始まる行から0x0Aまでを選択してみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/712a7434-8fc3-ce58-9d9a-de39d9a2578e.png)

上記の行の行頭を0x23(#)に変更することで/dev/mmcblk0p1を無効にしていることを理解した。

> ２つのファイルで、/usr/lib/arm-linux-gnueabihf/libarmmem.so, /dev/mmcblk0p1, /dev/mmcblk0p2をコメントアウトしている。
pod install で Unable to add a source と言われました。

ipaのbuild環境を作成しています。新しく作った環境で`pod install`がうまくいきませんでした。

# pod installが失敗

```
pod install

Updating local specs repositories
Creating shallow clone of spec repo master from https://github.com/CocoaPods/Specs.git
[!] Unable to add a source with url https://github.com/CocoaPods/Specs.git named master.
You can try adding it manually in ~/.cocoapods/repos or via pod repo add.
```
手動で、pod repoを追加しろとあります。

# ~/.cocoapods/reposにSpecs.gitをclone
ホームにあるCocoaPodsのディレクトリに、Specs.gitをcloneします。

```
cd ~/.cocoapods/repos
git clone https://github.com/CocoaPods/Specs.git master
```

# 再度pod install

```
# podのディレクトリに戻る、無くても良い
cd -

# pod installを実行
pod install
```
今度はうまくいきました(☝ ՞ਊ ՞)

# 参考
https://github.com/CocoaPods/CocoaPods/issues/4293
cloud9でrailsのgemであるdeviseを使用し、ユーザログイン機能を開発した末路

#ユーザログイン時のメールが届かない！
急な見出しだが、この問題に直面して随分と苦戦した。
頑張った挙句、凄惨な末路を辿ったので念のため備忘録としてのメモ。

とりあえずデバイスをgemでインストールをし、開発時のメール送信先の設定を行う。
今回はgmailを使用した。

config/environments/development.rb

```
config.action_mailer.default_url_options = {  host: 'cloud9のドメイン（○○○.c9users.io）', port: 8080（使用するポート番号を入力） }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address => "smtp.gmail.com",
  :port => 587,
  :user_name => "自分のgmailアドレス",
  :password => "gmailのアプリケーション固有のパスワード",
  :authentication => :plain,
  :enable_starttls_auto => true
}
```
上記のアプリケーション固有のパスワードとは、gmailのログインパスでもなければcloud9のログインパスでもありません。
https://support.google.com/mail/answer/185833?hl=ja
上記URLでログイン後、アプリケーション（この場合cloud9？）から使用する際のパスワードをいちいち生成して、それを張り付けるという意味です。googleのセキュリティカオス。


config/initializers/devise.rb

```
config.mailer_sender = '自分のgmailアドレス'
```
なぜかこのファイル内にconfig.mailer_senderが二行あったのでとりあえず二行に自分のアドレスをぶち込む。

db/seeds.rb

```
user = User.new :username => '名前', :email => '自分のgmailアドレス', :password => 'gmailのアプリケーション固有のパスワード', :admin => true
user.save!
```
最後にシードファイルでテーブルに一行のデータを流し込んで終了。

```
$ rake db:seed
```
無事データが入ったみたい。
#railsアプリ起動
railsアプリ内で早速ユーザログインしてみる。
メールアドレス宛にURLを送りました的なメッセージが出たので、gmailを見に行く。
#結果
メールは来ていたが、、、
####__利用規約違反でgmailアカウントを止められた。__

なぜなんでしょう。
どなたかわかる方いましたら、コメントで教えてくださいお願いします。
変化がありましたら追記予定です。
rake db:migrateでDuplicate column name 'email': ALTER TABLE `admin_users`と言われました。

Railsのプロジェクトにactiveadminを新しく入れようとしています。

# rake db:migrateでエラー

```
bundle exec rake db:migrate

略

Migrating to AddDeviseToAdminUsers (20160714141618)
== 20160714141618 AddDeviseToAdminUsers: migrating ============================
-- change_table(:admin_users)
   (6.7ms)  ALTER TABLE `admin_users` ADD `email` varchar(255) DEFAULT '' NOT NULL
   (0.3ms)  SELECT RELEASE_LOCK('5237447081854824375')
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Duplicate column name 'email': ALTER TABLE `admin_users` ADD `email` varchar(255) DEFAULT '' NOT NULL

略
```
以前activeadminを入れていたのでadmin_usersテーブルがすでに存在しています。
そこにまた`admin_users`を作成するマイグレーションファイルが追加され実行されたためにエラーがでています。

# admin_usersテーブルを削除

rollbackしたほうが良いと参考ページに有りましたが、どうせ新しく入るのでMySQLからdropしました。

```
mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 15
Server version: 5.5.47-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use pugiemonn_com;
MariaDB [pugiemonn_com]> drop table admin_users;
```

# 再度 rake db:migrate
こんどはうまくいきました。

# 参考
http://stackoverflow.com/questions/7453981/devise-rake-dbmigrate-fails-because-of-duplicate-column-in-my-users-table-ra
Kusanagi(AWS)でもSequel Proを使う


#Kusanagi(AWS)でも使う設定

![aws_sequel.jpg](https://qiita-image-store.s3.amazonaws.com/0/37670/106ce7ac-05fb-1c9b-c1ba-9303f57d479f.jpeg "aws_sequel.jpg")

1. MySQLホスト … `127.0.0.1` localhostに設定
1. ユーザー名 … Kusanagiの設定で作成したMySQLユーザー
1. パスワード … Kusanagiの設定で作成したMySQLユーザーのパスワード
1. データベース … Kusanagiの設定で作成したWP用のデータベース
1. SSHユーザー … `centos` 
1. SSHホスト … AWSで作成したKusanagiのインスタンスに紐付いている `パブリック DNS`
1. SSH鍵 … pemファイル

※他は特に設定しなくてOK

これで繋がる！
[Kusanagi](https://kusanagi.tokyo/document/)、早くて感動！捗る〜
[Android]向きの固定

スマホの向きを固定したいときってありませんか？
例えば、横向きだと収まらなかったり、操作しづらかったりといった理由で
縦向きに固定したいとき。

実はすごく簡単にできます。

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.nobuo.create.firstappli"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="net.nobuo.create.firstappli.MainActivity"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```

**android:screenOrientation="portrait"**の部分です。

こちらを指定することで縦向きに固定することができます。
ちなみに、横向きは"landscape"を指定すれば実現できます。

※画面（Activity）が複数ある場合は、固定したい画面全てに記述する必要があります。

以上です。
React.jsでループするには。

# 自己紹介

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の新2回生です👍 (2016.7.18現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

では、早速。

# ループ

僕自身、普段はjQuery、Vue.js、Angular.js、Riot.js、Reactなどを使っています。

その中でも、JavaScriptの配列をループで回して要素に当て込んで行きたい時ありますよね。

例えば、vue.jsなら

```html
<ul id="app">
  <li v-for="item in items">{{item.text}}</li>
</ul>
```

```js
new Vue({
  el: "#app",
  data: {
    items: [
      { text: "1" },
      { text: "2" }
    ]
  }
});
```

みたいなやつですね。

Angularだとどうなるでしょうか。

```html
<ul>
  <li ng-repeat="item in items">{{item.text}}</li>
</ul>
```

```js
$scope.items = [
   { text: "1" },
   { text: "2" }
 ];
```

こんな感じにVueには`v-for`など、angularには`ng-repeat`がありますね。

では、 Reactはどうでしょうか。

[React.jsのJSXで条件分岐・繰り返しを記述する](http://qiita.com/r7kamura/items/b16cb11b30a54d3c607d)

こんな記事を見つけました。

他の記事をあさってみても、Reactに関してはこのループが存在しないようです。

※ あるぞボケ！って方いたらコメントしてください。。

# Reactでループするには。

先ほどの記事のように、htmlを記述している場所に直接mapなどを使って描く方法があります。

Reactでは`{...}`の中であればJavaScriptとして認識されるようで

その中に関数を仕込みループさせる方法です。

```html
<ul>
  {this.state.datas.map((data) => {
    return <li>{data.text}</li>;
  })}
</ul>
```

この方法とは別にStack over flowにもよく載っていて、Reactの開発元であるFacebook社の書き方を見てみると

```html
render: function(){
  var list = [];

  var data = [
    { text: "1" },
    { text: "2" }
  ];

  for(var i in data){
    list.push(<li>{data[i].text}</li>);
  }

  return(
    <ul>
      {list}
    </ul>
  );
}
```

forなどで、先に配列に要素を追加しておいて、表示部分はその配列だけ書いとくパターンです。

fluxにおいても、後者の書き方をしていました。

[facebook/flux](https://github.com/facebook/flux)

どちらがいいとかはないですが、参考ほどに。
UnityでVRを触ってみた 〜導入編〜

## はじめに
VR作りたくて、Unityで試行錯誤して何とか動いたのでそのまとめです。

## 環境
- Mac OSX v10.11
- Google VR SDK v0.8
- Unity v5.3.5

## Google VR SDK for Unityのダウンロード
[こちら](https://developers.google.com/vr/unity/download)からUnity用のGoogle VR SDKをダウンロードします。

```
$ git clone https://github.com/googlevr/gvr-unity-sdk.git
```

## いざ開発！

### 1. Unityでプロジェクト作る

新規にプロジェクトを作ってSceneに適当にObjectを置きます。今回はPlaneとCubeを置きました。（草はAssets Storeから無料のテキスチャを頂戴しております。）
![スクリーンショット 2016-07-18 17.06.22.png](https://qiita-image-store.s3.amazonaws.com/0/13703/ecb2f388-f3c9-6c34-bddb-7bd8b24e05de.png)

### 2. Google VR SDKをImportする

[Assets] -> [Import Package] -> [Custom Package] からダウンロードした`GoogleVRForUnity.unitypackage` ファイルをImportします。
Importする際にDemoScenesは特に必要ないのでチェックを外しました。

<img width="475" alt="スクリーンショット 2016-07-18 17.26.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/13703/a1daef9d-ba4a-fe67-e2dd-4bc733630f8c.png">


### 3. GvrViewerMainを置く

Google VR SDKをImportするとPrefabsの下にGvrViewerMainというプレファブがあるのでScene上にドラッグ&ドロップします。
![vrqiita_1.png](https://qiita-image-store.s3.amazonaws.com/0/13703/066312bd-18a5-53e2-2714-2b6c82c126c8.png)


これだけで再生ボタンを押すとVRになってます！
カメラはoptionキーを押しながらマウスを動かすと視点を移動できます。

![スクリーンショット 2016-07-18 17.40.30.png](https://qiita-image-store.s3.amazonaws.com/0/13703/c887624f-2d20-6925-5659-97800cd2ab8e.png)

簡単！

次は視点の検知をやりたいと思います。
[UnityでVRを触ってみた 〜視点の検知編〜](http://qiita.com/yukatou/items/d854ebfacef85a221f49)
ubuntu14.04にNginxをインストールし、pukiwikiを動かす


LTSの関係で、Ubuntu14.04の人は、[7/21 リリース予定のUbuntu16.04.1までお預け](http://kledgeb.blogspot.jp/2016/04/ubuntu-1604-37-ubuntu-1604update.html)らしい。なので、今更14.04の記事。

いろんなサービスやらツールを使うにあたっての、アカウントや家庭内LANの情報なんかが氾濫して収集がつかなくなってきたので、家族のポータルをwikiで作り、そこでいろいろ情報をまとめることにした。ついでに未だに触ったことのないNginXでやってしまう。

```hoge@locaohost:~$ apt-cache search nginx```

すると、nginxというそのものなパッケージが見つかるので、

```sudo apt-get install nginx```

でさくっとインストール。

```hoge@locaohost:/etc/nginx$ /etc/init.d/nginx start```

して、ブラウザでインストールしたホストを開いてやれば、NginXのデフォルトページとこんにちは。

デフォルトの80ポートを変更してみる

```
sudo vim sites-enabled/default
```

変更前

```
 listen 80 default_server;
 listen [::]:80 default_server ipv6only=on;
```

変更後

```
 listen 89 default_server;
 listen [::]:89 default_server ipv6only=on;
```

```hoge@locaohost:/etc/nginx$ sudo apt-get install php5-fpm
```

```
hoge@locaohost:/etc/nginx$ sudo vim /etc/nginx/sites-available/default
```

```
location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                ＃fastcgi_pass 127.0.0.1:9000; ★コメントアウトのままに注意
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
```

ドキュメントルートが/usr/share/nginx/html
なので/usr/share/nginx/html配下にtest.phpあたりを作成して、
```
<?php phpinfo();
```

と、よくあるPHPの動作確認でPHPInfoを出力してやる。
ブラウザで、PHPInfoが出力されればOK。

あと一息。

[pukiwikiの公式サイト](https://osdn.jp/projects/pukiwiki/)からアーカイブをダウンロードし、展開し、
出てきたindex.phpが開ければ、目標達成です。
ワードプレスのテーマを調べさせない方法

初めましてKionaです。

表題の通りワードプレスのテーマを調べさせない方法やプラグインを探しています。
みなさんご存知の通り下記サイトでワードプレステーマを使用してる場合何のテーマかを調べることができます。
・http://whatwpthemeisthat.com/
・http://www.isitwp.com/

当方ワードプレスを使用してWebサイトを構築しているため、以前私が構築したサイトとほぼ同じサイトを作られてしまいました。

このような経緯がありワードプレスのテーマを調べさせない方法やプラグインを探しています。
オススメの方法やプラグインがあれば教えていただけると幸いです。
Androidのアイテム課金でレシート検証をサーバ側で行う

## 概要
Androidのアイテム課金を行うに当たり、サーバ側でアプリから送られたレシートの正当性を検証する必要があったため、サーバ側でやったことをまとめます。

## 環境 
- In-app Billing Version 3 API

## ざっくり手順説明
- PEM形式の公開鍵を準備
- アプリ側は署名と、Developer Payloadを含んだレシートをサーバに送信
- サーバ側で検証する

## RSA公開鍵をPEM形式のものに変更
Google Play Developer Consoleの [サービスとAPI] でRSA公開鍵がありますので、
コピーしてpublicというファイル名でローカルに保存します。

<img width="1239" alt="rsa_publickey.png" src="https://qiita-image-store.s3.amazonaws.com/0/13703/4508deef-6ea0-ff83-0fa8-bd41c21c11fc.png">



以下コマンドで先ほど保存したpublicファイルをPEM形式に変換し、public.pemを作成します。
（自分はMacのターミナルでやったので base64 -D となってます）

```
$ base64 -D public > public.der
$ openssl rsa -inform DER -outform PEM -pubin -in public.der -out public.pem
```


## アプリ側

レシートにはDeveloper Payloadというものがあり、開発者側で任意の文字列をDeveloper Payloadに指定することができます。アプリ側は、レシートにユーザ識別子を入れることで、サーバ側はより強固にレシートの検証を行うことが出来ます。

```java
String developerPayload = "ユーザ識別子";
Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(),
   sku, "inapp", developerPayload);
```

## サーバ側
サーバ側は、送れられたレシートと署名を使って検証を行います。
レシートに含まれるDeveloper Payloadには想定されたユーザ識別子があることを確認しています。

```php
<?php

// 1. レシートと署名どちらもBase64エンコードされていることを想定
$receipt   = base64_decode($_POST['receipt']);  
$signature = base64_decode($_POST['signature']);

// 2. レシートの検証
$public_key      = file_get_contents('/path/to/file/public.pem');
$public_key_id   = openssl_get_publickey($public_key);
$result = (int)openssl_verify($receipt, $signature, $public_key_id);

if ($result === 0) {
  echo '署名が正しくありません';
  // error_handle();
} else if ($result === -1) {
  echo '署名の検証でエラーが発生しました';
  // error_handle();
}

openssl_free_key($public_key_id);

// 3. Developer Payloadの確認
$user_identifier = 'ユーザ識別子';
$obj = json_decode($receipt);
if ($obj->developerPayload !== $user_identifier) {
  echo 'Developer Payloadが正しくありません';
  // error_handle();
}

// 4. 以下、サービスのアイテム課金処理

```

問題がなければDB登録等、サービスがやりたいことを行って終わりです！

## 参考
- [In-app Billingでsignatureの検証をサーバサイドで行う](http://d.hatena.ne.jp/isher/20110507/1304755460)
- [iOS/Androidアプリ内課金の不正なレシートによる有料会員登録を防ぐ](http://inside.pixiv.net/entry/2014/12/09/111310)
- [Android アプリ内課金（API Version3）の実装](http://y-anz-m.blogspot.jp/2013/02/android-api-version3.html)
Dockerfileを使ったDockerイメージの作り方


Dockerfileを使ったDockerコンテナイメージの
作り方の流れを説明。

ひとまず今回は **なんでもいいからnginxが動作するところまで** を実施。

# Dockerイメージの作り方
## Dockerfileの解説

```Text:Dockerfile
FROM ubuntu:xenial-20160706
MAINTAINER Ryoma Fujiwara
LABEL OBJECT="Nginx latest package install"

ENTRYPOINT ["/bin/bash"]
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get -y install curl
RUN curl http://nginx.org/keys/nginx_signing.key | apt-key add -
RUN apt-get install -y nginx
```

## ベースとなるイメージの確定(FROM)

FROM句では作成するベースとなるDockerのイメージを指定する。
今回はubuntu:xenial-20160706を指定した。

## コンテナ起動時の実行コマンド指定(ENTRYPOINT)

ENTRYPOINT句でコンテナ起動時の実行コマンドを指定する。
ここでは具体的に何をしたいといった事柄はないため、/bin/bashを指定している。

コンテナイメージが既にアプリケーションのデプロイが完了している場合はアプリケーションを起動させるためのコマンドを指定することも可能。

## 実行コマンドの指定(RUN)

RUN句でコンテナビルド時の実行コマンドを指定することができる。

```Text:RUN句部分の抜粋
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get -y install curl
RUN curl http://nginx.org/keys/nginx_signing.key | apt-key add -
RUN apt-get install -y nginx
```

ここでは最新バージョンのnginxのインストールを行っている。
 **基本的にはインタラクティブな操作が発生しないようにする** 必要がある?
 
## イメージのビルド

カレントディレクトリに上記のDockerfileが存在する
場合は以下のコマンドでコンテナイメージをビルドすることができる。

```Bash:イメージのビルド
docker build -t ubuntu-16.04-nginx:latest `pwd`
docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
ubuntu-16.04-nginx   latest              7063dce16718        12 minutes ago      236.3 MB
```

## 作成したイメージの起動

```Bash:作成したイメージの起動
docker run -d -p 80:80 --name nginx_sample --hostname nginx -i -t ubuntu-16.04-nginx
```

DockerfileのENTRYPOINTで/bin/bashを指定しているので、
コンテナ起動時のコマンド指定は不要

### nginxの起動

今回はなぜかsystemdを使った起動ができないので、
手動でnginxを起動する。


```Bash:nginxの起動
docker exec -it nginx_sample /bin/bash
service nginx start
```

ホスト外からブラウザでアクセスするとnginxのトップページが
見えるので、ひとまず、nginxは動作している。

- nginxのデフォルト画面
![Kobito.io5nf3.png](https://qiita-image-store.s3.amazonaws.com/0/40692/7e551f50-5d82-3b48-1cd1-0a05b35c82ea.png "Kobito.io5nf3.png")

## ここまでの残課題

systemctlが正しく動作していないように見えるので
動作するように変更を加えないといけない。

```Bash:systemctlの動作の問題
systemctl
Failed to connect to bus: No such file or directory
```
思うようにいかない"Background Fetch"


##はじめに
最初に"Background Fetch"のことをさらっと聞いた時、「きっと、アプリが落ちていても、指定した間隔で定期的に処理をさせることができるAPIなんだろうな」なんて期待しましたが、いざ調べてみると、私の期待は見事に打ち砕かれました。

というわけで、今回のお題は「思うようにいかない"Background Fetch"」です。

##何故期待が打ち砕かれたか
"Background Fetch"はコーダーが制御することはできず、通知されるタイミングはシステム依存です。

"Background Fetch"の間隔を指定する定数は、Fetchを最小間隔で通知する"UIApplicationBackgroundFetchIntervalMinimum"とFetchを実行しない"UIApplicationBackgroundFetchIntervalNever"しかありません。

どうやら、システム側がアプリの利用頻度を学習し、起動していると思われる時間に通知タイミングが来るようになっているみたいです。

つまり、"Background Fetch"だけではコーダーの思った通りの間隔で処理を走らせることはできないというわけです。

##とりあえず試してみた
すでに試す前から心を折られた感じの筆者ですが、とりあえず試してみました。

###プロジェクト作成
まず、プロジェクトを作ります。（BackgroundFetchTestというプロジェクトにしました。）

次に"TARGETS"の"Capabilities"を以下のように設定します。

![background_Fetch_ss_1](https://dl.dropboxusercontent.com/s/jbkptju2jpmrndd/background_Fetch_ss_1.png)

###コード記述

とりあえず、Fetchが通知されたらログを吐き出すだけの簡単なコードを書いてみました。

```Swift:AppDelegate.swift
	func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
		// OSでサポートされている最小の間隔を指定
		application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
        
        return true
    }

    func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
        
        // ログ出力
        NSLog("ふぇっちたん起動したお♪")
        
        // データなし
        completionHandler(.NoData);
        
    }
```
"performFetchWithCompletionHandler"の中の"completionHandler"は必ず呼ぶ必要があるようで、引数は以下のenum型になります。

```Swift
public enum UIBackgroundFetchResult : UInt {
    
    case NewData // 新しいデータのダウンロードに成功した

    case NoData // ダウンロードすべきデータがなかった
    case Failed // データのダウンロードに失敗した
}
```

ところで、"ふぇっち"と平仮名にすると、なんか可愛い感じなので、なんとなく擬人化したら女の子かなって思うのは私だけでしょうか？

###デバッグ
"Background Fetch"のデバッグには、以下の2種類の方法があります。

1."Edit Scheme">"Options">"Background Fetch"にチェックを入れてビルドする。

![background_Fetch_ss_2](https://dl.dropboxusercontent.com/s/dvsxuecz3yp0s1v/background_Fetch_ss_2.png)

2."Debug">"Simulate Background Fetch"を実行する。

![background_Fetch_ss_3](https://dl.dropboxusercontent.com/s/vs74wxcsljbnsax/background_Fetch_ss_3.png)

##実行してみた
とりあえず、私は1の方法でデバッグしてみました。

アプリが起動される（バックグラウンド実行のため、画面は表示されない。）と、以下のログが表示されました。

![background_Fetch_ss_4](https://dl.dropboxusercontent.com/s/7zxpeyhkjbjgzfx/background_Fetch_ss_4.png)

##まとめ
ネットで記事を漁って軽く触っただけですが、現時点では、"Background Fetch"単体ではあまり有用ではないのかな、と感じました。

今回は触れませんでしたが、"Remote Push Notification"をトリガーに"Background Fetch"を実行させる機能があり、それを使えば定期的に処理を走らせることが可能なようです。
msys2でlcovをinstallする方法

ものすごい簡単です。

# 前提

```
pacman -S base-devel mingw-w64-i686-clang mingw-w64-x86_64-clang mingw-w64-i686-perl mingw-w64-x86_64-perl git
```

まあこのくらいはよく使うので入れておきましょう。

# install

``msys2_shell.cmd``があるところをコマンドプロンプトで開いて

```bat:コマンドプロンプト
call msys2_shell.cmd -mingw32
```

```bash:msys2_mingw32
mkdir patches
cd patches
git clone -v --progress --config core.autocrlf=false https://github.com/Alexpux/MINGW-packages.git ./
cd mingw-w64-lcov
makepkg -csi
```

同様にして


```bat:コマンドプロンプト
call msys2_shell.cmd -mingw64
```

```bash:msys2_mingw64
cd patches/mingw-w64-lcov
makepkg -csi
```

以上です。

# 注意:msys2 mingw clangではlink errorになる

coverageを取るときは、gccでもclangでも

```
clang++ test.cpp -o test.out -coverage -g -O0 -Wall -Wextra -std=c++14 -lWs2_32
```

のように``-coverage``をつけてコンパイルするんですが、msys2 mingw clangでは

```
C:\msys64\tmp\test-9d9013.o:(.text+0xb5f2b): `llvm_gcda_emit_function' に対する定義されていない参照です
C:\msys64\tmp\test-9d9013.o:(.text+0xb5f3e): `llvm_gcda_emit_arcs' に対する定義されていない参照です
C:\msys64\tmp\test-9d9013.o:(.text+0xb5f43): `llvm_gcda_summary_info' に対する定義されていない参照です
C:\msys64\tmp\test-9d9013.o:(.text+0xb5f48): `llvm_gcda_end_file' に対する定義されていない参照です
C:\msys64\tmp\test-9d9013.o:(.text+0xf8923): `llvm_gcov_init' に対する定義されていない参照です
```

こんな感じのlink errorがどっさり出てきます。``libprofile_rt.a``がないせいだと思います。ので、gccを使いましょう。pacmanからじゃなくて自力でllvmをビルドしてパッケージングすればワンちゃん(めんｄ)

# 参考

- http://txt.arboreus.com/2015/05/29/howto-get-lcov-test-coverage-on-windows.html
- https://github.com/MaverickTse/lsw-build2/blob/master/get_patch.sh
- https://wiki.archlinuxjp.org/index.php/Makepkg#.E4.BD.BF.E7.94.A8.E6.96.B9.E6.B3.95
- http://clang-developers.42468.n3.nabble.com/Code-coverage-on-clang-td4033066.html
nysol (MCMD) （3） nysol は、学ぶに値するか？(オフトピ)

[nysol](http://www.nysol.jp/)をこれから使うと思っている人向けです。

# こんな人は該当します。

## **そこそこ大きなCSVを前処理している**

ざっとデータを見たり
データの形式を整えたりなどの処理には、nysol は向いています。
mcut,mbest など単純ですが、便利です。あとで使いやすいように、
join しておくのもさくさくできます。
タイプコストが低いので、スクリプト使いすてでも気になりません。

## **そこそこ大きなデータをあつかっているけど、単純集計で十分**

微妙に便利なコマンドがあります。mslide,mshare,mbucket などです。
出力結果は、エクセル等に取り込めばいいでしょう。


## **Mac もしくは、Linux Desktop を使っている**

windows で使うのは現時点では難ありです。windows10 で、ubuntu が使えるようになるのを
まちましょう。
ぼくのかんがえたさいきょうのAPI管理(JWT)

#環境
サーバからAPIを叩いてjsonを取ってくるWEBシステム
フロントはJavaScript,jQuery,Riotで組まれている。
認証サーバとAPIサーバが同一(マシンもIPもシステムも)

# 問題点
JWTにjsonはbase64でエンコードされたものであり、暗号化はされていない。
実装によるがLocalStorageに値を入れる事が多いが、LocalStorageはJSから自由に読み込む事が可能なためXSSにより任意のJSが実行された場合は容易にAccess Tokenを盗む事ができる。
※改ざんされないだけであり、盗まれるたものを利用される恐れはある。
(セッションハイジャック)

#解決案
XSS,CSRF対策がしてあるのは大前提

- Access TokenをCookieに格納して"HTTP Only"と"Secure"フラグを付ける。
- Access Tokenやセッショントークンは一定時間ごとに更新される。(30分等)



#機構
### 1. ログイン時にサーバからクライアントに以下の３つを渡す。
**クライアント側**

|value name|store place|expire|element|Desc|
|---|---|---|---|---|
|Access Token|Session Storage| 30m|user_num,token用乱数|必ずJWT|
|Local Key|Local Storage|30d|user_num,expire,key用乱数|コストが気になれば通常のjsonでも可|
|Cookie Key|Cookie|LocalStorage Keyと同じ期間|user_num,key用乱数|HTTPOnly,Secure(コストが気になれば通常のjsonでも可)|

※ user_num : `user_id`と1対1になる乱数(JWTの内容は暗号化されないのでuser_idそのままはまずい)


**DB**

|value name|Desc|
|---|---|---|---|---|
|User ID|ログイン時に使うid|
|User Num|user_idの代わりにjsonへ含める乱数値|
|Refresh Hash|Sessionが切れた場合に新規Access Tokenを発行する場合の検証につかうHash値|
|Salt|上記ハッシュを生成する際に使ったソルト値|

**サーバ側(内部変数)**

|value name|
|---|
|Access Token|
|User Num|
|Local Key|
|Cookie Key|


※`Refresh Hash`の生成方法

1. `Local Key`+`Cookie key`をハッシュ化する。
1. `1のハッシュ`+`ソルト`をハッシュ化する。


### 2.通常(画面遷移なし)利用時
フロントエンド側は定期的にサーバと通信を行っているものとする。

1. クライアントは`Access Token`をサーバへ送信する。(`Cookie key`も勝手に送られるけどきにしない。)
1. サーバは送られてきた`Access Token`と内部変数の`Access Token`が一致するかを検証する。異なればログインページへリダイレクトする。
1. 一定時間(30分)毎に`Access Token`,`Local Key`,`Cookie Key`の3つともクライアントへ送信する。クライアントはそれぞれを格納する。(※この段階では`Local Key`と`Cookie Key`は内部変数で保持しているのみで、`Refresh Hash`は生成・保存されていない。)
1. クライアントとのセッションが切れた段階でサーバは`Local Key`と`Cookie Key`を使いサーバは`Refresh Hash`を生成し、DBへ保存する。


### 3.ブラウザやタブを閉じた後、再開時
`Access Token`は`Session Storage`に入っているため、ブラウザを閉じたりタブを閉じれば消えてしまうため再度Access Tokenを取得する必要がある。

1. クライアントはサーバに対して`Local Key`と`Cookie key`を送信する。
1. サーバはKeyの検証を行う。
    1. クライアントから送らてきた`Local Key`,`Cookie key`が改竄されていないかJWTのチェックをする。※KeyがJWTの時のみ
    1. `Local Key`,`Cookie key`とDBにあるソルトを使い`Refresh Hash`を生成する。(1の`Refresh Hash`の生成方法を参照)
    1. `1のRefresh Hash`とDBの`Refresh Hash`を突き合わせる。
    1. 一致すれば新規の`Access Token`を発行する。異なれば ログイン画面へリダイレクトする。
1. サーバはクライアントに`Access Token`,`Local Key`,`Cookie Key`を送信する。
1. クライアントは新規の3つをそれぞれ格納する。

### 4.その他
- JWTのjsonが改ざんされていた場合
- `Access Token`がなく`Local Key`,`Cookie key`もない場合
- `Local Key`,`Cookie key`の期限が切れている

これらはすべてログイン画面へリダイレクトさせる。
Ionicで画像をローカルファイルストレージにキャッシュする方法


[imgcache.js](https://github.com/chrisben/imgcache.js)を使用して画像をファイルストレージにキャッシュし、オフラインでも参照できるようにする。

ここではIonic上でimgcache.jsを使用するための設定方法を説明する。

### Cordovaプラグインのインストール
```
ionic plugin add cordova-plugin-file --save
ionic plugin add cordova-plugin-file-transfer --save
```
### JavaScriptライブラリのインストール
```
bower install imgcache.js --save
bower install angular-imgcache.js --save
```
### JavaScriptライブラリを読み込み
```
<html>
  <head>
    <!-- ionic/angularjs js -->
    <script src="lib/ionic/js/ionic.bundle.js"></script>
    
    <!-- cordova script (this will be a 404 during development) -->
    <script src="cordova.js"></script>

    <!-- ここでライブラリを読み込む -->
    <script src="lib/imgcache.js/js/imgcache.js"></script>
    <script src="lib/angular-imgcache/angular-imgcache.js"></script>

    <!-- your app's js -->
    <script src="js/app.js"></script>
    <script src="js/controllers.js"></script>
    <script src="js/services.js"></script>
  </head>
  <body ng-app="starter">
    <!-- 省略 -->
  </body>
</html>

```

### app.jsでimgcacheを初期化
```
// 使用モジュールにImgCacheを追加
angular.module('starter', ['ionic', 'starter.controllers', 'starter.services', 'ImgCache'])

// ImgCacheをDI
.run(function($ionicPlatform, ImgCache) {
  $ionicPlatform.ready(function($q) {

    /* 省略 */

    // ここで初期化
    ImgCache.$init();
  });
})

.config(function(ImgCacheProvider) {
    // ここでオプションを設定
    ImgCacheProvider.setOptions({
        debug: true,
        usePersistentCache: true
    });
    // 手動で初期化するオプションを設定
    ImgCacheProvider.manualInit = true;
})

    /* 省略 */

```
### Controllerで画像のURLをセット
```
angular.module('starter.controllers', [])
.controller('MyCtrl', function($scope) {
  // テンプレートに渡す画像のURLをセット
  $scope.imgUrl = "http://xxx/xxx.jpg";
})
```
### Templateで画像をキャッシュする
```
<!-- 省略 -->

<img img-cache ic-src="{{imgUrl}}" />

<!-- 省略 -->
```

### 参考
[imgcache.jsをCordova/Phonegapで使用する場合](https://github.com/chrisben/imgcache.js/blob/master/CORDOVA.md)
Custom operator for OptionSetType

###Custom operator for OptionSetType


**RawValue**が**UInt32**の場合

```objc
func -=<O: OptionSetType where O.RawValue == UInt32>(inout lhs: O, rhs: O) {
    lhs = O(rawValue: lhs.rawValue ^ rhs.rawValue)
}
func +=<O: OptionSetType where O.RawValue == UInt32>(inout lhs: O, rhs: O) {
    lhs = O(rawValue: lhs.rawValue | rhs.rawValue)
}
func +<O: OptionSetType where O.RawValue == UInt32>(lhs: O, rhs: O) -> O {
    return O(rawValue: lhs.rawValue | rhs.rawValue)
}
func -<O: OptionSetType where O.RawValue == UInt32>(lhs: O, rhs: O) -> O {
    return O(rawValue: lhs.rawValue ^ rhs.rawValue)
}
```
nysol (MCMD) （2） 基準時を指定して指数を出す

# 基準時（年）を指定して指数を出す
※[nysol](http://www.nysol.jp/) を実際に触っている人向けの文章です。

基準年を使って指数を出すことはよくあります。単純な作業なので、エクセルでももちろんできますが、数が多くなるとそこそこやっかいです。また、Rやpython でも可能ですが、わざわざ使うまでもないともいえます。

対象となるデータは、2012年から、2015年までの年別データです。

[year_2012_15.csv.zip](https://www.dropbox.com/s/eilvj25681j6sak/year_2012_15.dat.zip?dl=0)

処理するスクリプト

```
H=hs2
BASE=2012
msum i=year_2012_15.dat k=Year,exp_imp,${H},Country f=VY |
mcut f=Year,exp_imp,${H},Country,VY o=temp.1
mselstr i=temp.1 f=Year v=${BASE} |
mcut f=exp_imp,${H},Country,VY:base o=temp.2
mjoin k=exp_imp,${H},Country i=temp.1 m=temp.2 f=base |
mcal c='format(100*(${VY}/${base}),"%4.1f")' a=index |
msortf f=${H},Country,exp_imp,Year o=exp_imp_${H}_country.csv
```

説明

1.H hs2 HSコード２桁の指定
2.base 基準年
3.集計キー（次元は）Year 年、exp_imp 輸出輸入（1:輸出 2:輸入) ${H} hsコード今回は、hs2 と指定、Country 国コードで、集計項目は、VY 年間の取引額の集計
4.年、輸出輸入、HSコード、国、取引額　を temp.1 に一時保存
5.基準年（２０１２年）の取引額を切り出し、temp.2 に一時保存
6.基準年の取引額を、HSコード、輸出輸入、国をキーにして　項目名　base　として 追加
7.基準年を１００として計算し、index として追加
8.並べ替えて保存

中間ファイルをつくって join を使うだけの作業です。
どのプログラミング言語でも可能ですが、使う文字数がすくなくて済むのと、
プログラミングが全く分かっていない人でも理解が苦痛ではないのがメリットです。（と思う）


結果

```
Year,exp_imp,hs2,Country,VY,base,index
2012,1,00,103,181151377,181151377,100.0
2013,1,00,103,213394699,181151377,117.8
2014,1,00,103,246818820,181151377,136.3
2015,1,00,103,280344819,181151377,154.8
2012,2,00,103,92019302,92019302,100.0
2013,2,00,103,100792390,92019302,109.5
2014,2,00,103,124617764,92019302,135.4
2015,2,00,103,145478060,92019302,158.1

```

このデータをもとにあとはいろいろ分析ができます。

（例）中国への輸出の伸びが高いもの、逆に輸入が落ち込んだところとか
MySQL


## 接続
mysql -u root -p

----

## DB選択
use `DB名`

----

### ユーザ作成
create user `ユーザ名` identified by'`パスワード`'

### DB作成
create database `db名`

### テーブル作成
create table `テーブル名`(`カラム名` `型`,`カラム名` `型`,`カラム名` `型`..)

### テーブル一覧表示
show tables from `db名`

### テーブル削除
drop table `テーブル名`

### レコード挿入
insert  into `テーブル名` (`カラム名`)values(`値`)

### レコードの値更新
update `テーブル名` set `カラム名` = `変更する値` where `変えるid` = `値`

### カラム追加
alter table `テーブル名`　add `カラム名` `型情報` 

### カラム名変更
alter table `テーブル名` change `古いカラム名``新しいカラム名``型`

### カラム削除
alter table `テーブル名` drop `カラム名` 

### テーブルを日本語使用可能にする
alter table `テーブル名`　character set utf8

### カラムを日本語使用可能にする
alter table `テーブル名` midify `カラム名` `型` character set utf8

### テーブル削除
delete from `table名` where `削除したいid` = `値`
Redshiftの論理パーティション

2016年7月時点で、Redshiftには論理パーティションの機能がありません。

それでは、pvログのようにデータ量が非常に大きいテーブルは、Redshiftではどのように扱えば良いのでしょうか？例えば、Hiveでは、月毎（日毎）にパーティションを作成しておき、月単位（日単位）でデータを分けておくというアプローチが一般的だと思います。が、論理パーティションの機能がないRedshiftでは、このアプローチを取ることができません。

答えは、ソートキーを正しく設定するです。特に、pvログのような時系列データの場合は、タイムスタンプ列をソートキーに設定します。例えば、タイムスタンプ列timeをソートキーに設定しておけば、

```sql
select
   *
from
   pv_log
where
   time >= timestamp '2016-04-01 00:00:00'
;
```

のように指定することで、Redshiftは2016年4月1日以降のデータだけをスキャンします。タイムスタンプ列timeにソートキーを設定していない場合、テーブルのフルスキャンが発生します。データ量が非常に大きい場合、クエリの結果が返ってくるのに非常に時間が掛かり、他のジョブにも悪影響を及ぼします。

また、Redshiftでは、ソートキーの設定状況は、

```sql
select
   *
from
   pg_table_def
where
   schemaname = 'hoge'
   and tablename = 'pv_log'
;
```

のようにSQLを実行すれば確認できます。pg_table_defの詳細は<a href='http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_PG_TABLE_DEF.html'>公式ページ</a>に載っています。
マルチサイト移転時のトラブル③ードメイン、pathの設定トラブル（wordpress,xampp,windows)

<p>今回はブログ移転に伴うドメインやpathの変更にまつわるトラブルについて。<br>
ブラウザに行きたいサイトのurlを入力してもenterキーを押すと勝手に違うurlへ飛ばされてしまう。なんてこと、皆さんは経験したことがありますでしょうか。私はこのトラブルに見舞われてしまい、1週間ほどとかしてしまいました(^o^)</p>

<p>ということで、今回はおそらく初心者にとってはなかなかわかりずらいポイントであろう、ドメインやpassの設定について取り上げたいと思います。<br>
そもそも私が何のサイトをどこへ移転しようとしているのかを再確認しておきます。レンタルサーバー上で動いているwordpressのマルチサイトをローカルに移転しようとしているのです。しかもローカル上にはすでに1つwordpressのサイトが移転してある状態です(そちらはマルチサイトではありませんが)。私は最終的には以下のようにして、マルチサイトを移転させることに成功しました。

![domain_setting.png](https://qiita-image-store.s3.amazonaws.com/0/134035/8980ad34-18ef-9e08-3fa3-ea2d642f1463.png)

<p>上の画像を見てください。このようにセッティングすると、、
![localhost1.png](https://qiita-image-store.s3.amazonaws.com/0/134035/6158fb8b-2c28-51fb-ab21-ca0dc11c025d.png)
このようにしっかりローカルでサイトを見ることができました！
</p>

<p>必ずしも上記の方法でなくてもいいかと思うのですが、マルチサイトですと、config.phpに'DOMAIN_CURRENT_SITE'と'PATH_CURRENT_SITE'を設定しないといけない関係上、以上のように仮想化ホストを自分で建てて、そこをルートディレクトリにしてしまった方が設定が混乱しないようです。私はこの設定をする前は、このサイトのルートディレクトリがlocalhost/matom.xyzであったため、'DOMAIN_CURRENT_SITE'にlocalhost、'PATH_CURRENT_SITE'に/matom.xyz/を設定しようと試みていたのですが、なぜかうまくいきませんでした、、(.htaccessもちゃんと変えていたはずなのですが、、)<br>
あと、ルートディレクトリに仮想化ホストを設定した場合も<strong>'PATH_CURRENT_SITE'の/は忘れないように</strong>しましょう。これがないと、ドメインとpathをつなぐ/が消えてしまい、一部のページのリンクが狂ってしまいます。
</p>

<p>また、.htaccessの設定はなかなか曲者で、ルートディレクトリより下の階層から設定することが重要です。上記サイトの場合は.htaccessは以下のように設定しました。<br>
![.htaccess.png](https://qiita-image-store.s3.amazonaws.com/0/134035/091c226a-af3f-4e25-41a3-af7a487d0c03.png)
<strong>ルートディレクトリとpassの間をつなぐ/をRewriteBaseや最後の行のRewriteRuleのところに忘れずに</strong>設定しておきましょう。</p>

<p>また、仮想化ホスト(バーチャルホスト)の設定についてはこのサイトにわかりやすくまとめられているので、<a href="http://oxynotes.com/?p=8300"　target="_blank">こちら</a>を参照してみて下さい。</p>
@wikiでGoogleカレンダーの挿入の時


@wikiでGoogleカレンダーを挿入する時にうまくいかないことがある。

```
#google_calendar(){
<iframe src="http://www.google.com/calendar/embed?"
style="border: 0" width="800" height="600" frameborder="0"
scrolling="no"></iframe>
}

```

これだと、エラーが出て正常に表示できないことがある。

なので、以下のようにすれば正常に表示できる時がある。

```
 #html2(){{{{{
 <iframe src="(所望のURL)" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>
 }}}}}
 
```
(所望のURL）には、指定されたURLを埋めること。

html2(){{{{{ }}}}}内で書かれたコードが直接表示になるので、うまく表示できるようになる。
Dockerのコンテナにボリュームを見せる


Dockerでは-vオプションを利用することでコンテナ内の任意の場所にホストOSの任意のディレクトリを見せることができる。

```Bash:ホストOSのボリュームの見せ方
sudo docker run -d -v ホストOSディレクトリ:コンテナでのマウント先ディレクトリ --name コンテナ名 -i -t イメージ名 /bin/bash
```


# (前準備)楽に操作するために

dockerグループに操作したいユーザを所属させる。
毎回sudoうつのダルいので。

```Bash:dockerグループへの追加
sudo usermod ユーザ名 -G 既存グループ名・ID,docker
```

# コンテナにホストOSのディレクトリを見せる

```Bash:ホストOSのボリュームをコンテナに見せる
docker run -d -p 80:80 -v /home/ubuntu/nodecode:/opt/nodecode --name nodejs002 -i -t node /bin/bash

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS                NAMES
a21c33a1756c        node                "/bin/bash"         5 seconds ago       Up 4 seconds                   0.0.0.0:80->80/tcp   nodejs002

```

ホストOSの/home/ubuntu/nodecodeをコンテナ内の/opt/nodecodeディレクトリにマウントしている。

今回はnodejsのコンテナを利用している。

/home/ubuntu/nodecodeディレクトリに以下のファイルを作成する。

```JavaScript:test.js
var http = require('http');

var server = http.createServer();
server.on('request', doRequest);

server.listen(80);
console.log('Server running!');

function doRequest(req, res) {
	res.writeHead(200, {'Content-Type': 'text/plain'});
	res.write('Hello World\n');
	res.end();
}
```

# コンテナ内からの確認

docker runの記述内容から/opt/nodecodeの配下に
test.jsが作成されているはずなので、これを確認する。

```Bash:コンテナ内でのtest.jsファイルの確認
docker exec -it nodejs002 /bin/bash
cd /opt/nodecode
ls -la
total 8
drwxrwxr-x 2 1000 1000 4096 Jul 15 15:39 .
drwxr-xr-x 3 root root   22 Jul 15 15:36 ..
-rw-rw-r-- 1 1000 1000  276 Jul 15 15:39 test.js
```

test.jsが存在することが確認できた。
先ほどのコンテナ内でnodejsを起動させ、test.jsの内容を実行する。

```Bash:test.jsのコンテナ内での起動
node test.js
Server running!
```

起動させた後に、Dockerコンテナを実行している
VMのTCP80番ポートにアクセスする。


![Kobito.Oz7tMe.png](https://qiita-image-store.s3.amazonaws.com/0/40692/04495180-5cca-b079-643b-9b07113ace4c.png "Kobito.Oz7tMe.png")

期待した通りの文字列(Hello World!)が帰ってきた。

# まとめ

-vオプションを用いることでホストOS上のファイルをコンテナに見せることができた。
また、それを使ってアプリケーションを起動させることもできた。
マルチサイト移転時のトラブル②ーデータベース接続確立エラー（wordpress,xampp,windows)

<p>先日の日記の項目をチェックしてphpのエラーは乗り越えたものの、今度は「データベース接続確立エラー」とでてきました、、これにはかなり苦戦しました。今回はこのデータベース接続確立エラーについて、とりあげます。「データベース接続確立エラー」に対するネットでよく見かける代表的な対処方法は以下の3分類ほどでしょうか。</p>

①config.phpの設定を間違えている<br>
②レンタルサーバーツールの使い間違い<br>
③データベースの破損など<br>

<p><a href="http://www.nishi2002.com/4087.html" target="_blank">こちら</a>のホームページが参考になると思います。<br>
また、サイトを置換するときは必ず、Search-Replace-DB-master を使いましょう。これを使わないとデータベースに不具合が出る恐れがあります。
Search-Replace-DB-masterは<a href="https://interconnectit.com/products/search-and-replace-for-wordpress-databases/"　target="_blank">こちら</a>からダウンロードすることができます。</p>
マルチサイトの移転時のトラブル①～「お使いのサーバーの php では wordpress に必要な mysql 拡張を利用できないようです。」（wordpress,xampp,windows）

<p>皆さま、こんばんは。今日の今日までさんざん苦労させられた、wordpressのマルチサイトをローカルに移転するおこったトラブルについて語っていきたいと思います。<br>
そもそもなぜ移転する気になったかと申しますと、wordpressにいろいろな自作ゲームをあげていこうと考え、それをいきなりサーバーでやるのは怖いなと思ったからです。しかし、移転が完了した後に技術に詳しい友達に言ってみたら、wordpress上でゲームを公開するのは珍しいといわれてしまいました（えっ）。<br>
それはともかく、今回は接続しようとした途端に「お使いのサーバーの php では wordpress に必要な mysql 拡張を利用できないようです。」と表示されるエラーについてです。<br>
このエラーが出た瞬間、文章をググってみると多くの結果が表示されるので、しめしめ楽勝だぜ～と侮っていた私でしたが大きな勘違いでした（笑）ググってみると色々な対処法が出てきます。まとめてみると以下のように分類できるでしょう。なるべく調査の上で記述していますが、初心者ゆえ多少の間違いなどはあるかもしれません。見つけていただけましたらご指摘のほどよろしくお願いいたします。</p>

##0. そもそもPHPの拡張モジュールとは
<p>具体的な対処法に入る前に、phpの拡張モジュールの仕組みをざっと理解していたほうがいいでしょう。当然ではありますが、phpの拡張モジュールとはphp extensionのことです。このモジュールはextフォルダ（拡張機能を入れる）の中に入っていて、phpに様々な機能を付加しています。また、一つ一つのモジュールはname(任意の機能の名前).dllという名のファイル形式になっています(windowsの場合)。そして、このphpの拡張モジュールを設置する場所をphp.iniのextension_dirで指定して読み込んでいます。ちなみに私の場合は"C:\xampp\php\ext"に拡張モジュールが入っています。</p>

##1. MySQLに接続するためのPHPの拡張モジュールが入っているかどうか確認
<p><a href="http://blog.kujira-station.com/201501261644" target="_blank">こちら</a>のようにコマンドライン（コマンドプロンプト、あるいはコンソールといった環境を使用する方法）を使って確認する方法がネットでは広く紹介されています。そちらの方がより正確な方法なのでしょうが、初心者にとっては結構ハードルが高いのではないでしょうか。初心者である場合は上術のextフォルダの中のdllファイルを調べるのが、早いのではないでしょうか。<br>
extフォルダの中にphp_mysql.dllやphp_mysqli.dllが見当たらない場合は拡張モジュールが入っていない状態だと思います。私は詳しくないので、他にも必要なモジュールはあるようです。<a href="http://php.plus-server.net/install.windows.extensions.html" target="_blank">こちら</a>のページなどが参考になるでしょう。とはいえほとんどの場合はphp_mysqlが欠損しているなど少し見れば一目瞭然だと考えます。</p>
##2. php.iniの設定を確認(phpのフォルダ内)
<p>拡張モジュールをインストールしても、それを有効化しなくては意味がありません。この設定はPHPのバージョンによっても対処が異なるようですので、<a href="http://php.net/manual/ja/mysqli.installation.php" target="_blank">こちら</a>のページ等で確認するといいでしょう。</p>
##3. httpd.confの設定を確認（Apacheのフォルダ内）
<p>また、wordpressはApacheを使っているため、Apacheからphpを利用するための設定もしなくてはなりません。この設定については<a href="http://www.adminweb.jp/apache/php/" target="_blank">こちら</a>や<a href="http://algorhythnn.jp/blg/2013/11/10/check-php-say-phpmyadmin/" target="_blank">こちら</a>のサイトを参照するといいでしょう。</p>
.NETテクノロジーまとめ

# 良く言えば多様化

.NETほにゃららが溢れていて、どういうフレームワークがあるのか、いつ何を使うのか、実は知らないだけでそんなのあるんかい！ということが日常茶飯事です。一時期 Java開発していたのもあって、何がなんだかです。（Javaも大概多いですけどね）

概要レベルの全体像はこんな感じ。
![.NET Framework](https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/17/59/metablogapi/8182.image_thumb_565CC803.png)

全てを書き上げる自身はありませんが、がんばってみます。

いやいや、もっとちゃんと知りたい！という方はこちらへ。
https://blogs.msdn.microsoft.com/chack/2013/09/11/net/

## デスクトップ アプリケーション

* .NET Windows Presentation Foundation (WPF)
RIAなデスクトップ・アプリケーション。UIにはXAMLを利用する。XAMLはストアアプリケーションでも利用するので、覚えると両方の開発スキルとなる。

* .NET Windows フォーム
クラシカルなWindowsフォーム。慣れている人が多いだろうけど、今後のスキルのためにもWPFの方が良いかと。。

* LightSwitch プロジェクトのデスクトップ クライアント
モデル駆動型開発によって2層アプリケーション(Out of Browser SilverLight＋DB、3層アプリケーション(Out of Browser SilverLight＋IIS＋DB) の開発が行える。

## Windowsストアアプリ

お好きなので。

* .NET/XAML
* WinJS/HTML5
* C++/XAML 

## UWP (Universal Windows Platform)

お好きなので。

* .NET/XAML
* WinJS/HTML5
* C++/XAML 
* Apache Cordova： JavaScript、Android／iOS
* Xamarin： C#、Android／iOS
* Unity： C#、Android／iOS／Mac／Linux／Xbox／PlayStation
* Visual C++ for Cross-Platform Mobile Development： C++、Android／iOS

## Webアプリケーション

* LightSwitch プロジェクトのWeb クライアント
デスクトップと同じくモデル駆動型開発のよって3層ブラウザ(In Browser SilverLight＋IIS＋DB) の開発が行える。

* ASP.NET Web フォーム
Windowsアプリケーションと同じ感覚でイベントドリブンなWebサイトを構築できます。従来のWindows開発者であれば馴染みありますが、昨今のHTML/JavaScript開発とはかけ離れています。

* ASP.NET MVC
Railsを意識した大規模開発向けのフレームワーク。MVCといってもルーティング、モデルバインド、ヘルパーメソッドといったViewやControle部分が主でModel部分はADO.NET、LINQ、.Net EntityFrameworkを利用する。

* ASP.NET Web ページ
Webフォームは今時じゃない、MVCは大げさすぎる、といことで登場。Razor記法によってHTML内にC#やVB.NETのコードを埋め込んでいく。ページとコードを分離しない単一管理が嫌いな人には使えない。

* APS.NET Single Page Application (SPA)
これは単体のフレームワークではなく、APS.NET MVCを利用した設計パターン。Knockout(JavaScript内で MVVMパターンをサポート)や Breeze(高度なデータ管理が可能)などのJavaScriptライブラリを多用。双方向通信するには SignalR を使用する。

* ASP.NET Scaffolding
データモデルとなる型を元に、CRUDを行う画面とそのコードのスケルトンを自動で生成する機能。

## Web サービス

* ASP.NET Web API
RESTによるWeb APIを提供する。データ形式は OData、JSON。ちなみにGoogleさんが提唱しているのはGData。

* Windows Communication Foundation (WCF)
サービス指向アーキテクチャのためのSOAPを用いたプロセス間通信を提供している。トランスポート・プロトコルとしてHTTP/HTTPS/TCP/名前付きパイプ/MSMQが利用できる。

* WCF Data Services
ODataのみをサポートしたREST

* Windows Workflow Foundation (WF) 
ワークフローモデルを記述することで動作可能なアプリケーションを構築する。外向きにはWCFだが、内部ではワークフローに従ったビジネスロジックが動作する。

* ASP.NET SignalR
WebSocketなどを用いたリアルタイムな双方向通信を行うフレームワーク。数多くのクライアントに対してプッシュ通信できる。

## データーアクセス

* ADO.NET (ActiveX Data Object .Net)
データベースへの接続・操作、トランザクション管理といったデータプロバイダと、DataSetコレクションと呼ばれるデータをメモリ上に保持する仕組みの提供している。

* ADO.NET Entity Framework
O/Rマッパー。開発スタイルデータベースファースト、モデルファースト、コードファーストが選択できる。接続のリトライと非同期処理もサポート。

* LINQ to SQL
クエリー式によるSQL操作。

## その他のテクノロジー

* Unity Application Block 
DIコンテナ

* MEF (Managed Extensibility Framework)
プラグインを作るためのフレームワーク

* WIF (Windows Identity Foundation)
認証フレームワーク

* TPL (Task Parallel Library)
タスク並列ライブラリ

* PLINQ (Parallel Linq)
クエリー並列

* Microsoft Bot Framework
Skype、Slack、SMS、メールなどに向けたBotを作るためのフレームワーク

# 所感

なんか、書ききれていない気がします。
というか、説明があっさりすぎて、分かる人にしか分からないというパターン。
MVVMとかRESTとかSOAPとかLINQとかDIとかO/Rといった用語が分からない方は、まずはそれらのお勉強を！
IO.read/readlines をNKF対応させる もしくは、binding.pryでソースが表示されずにキレた話

# before_session hook failed: ArgumentError: invalid byte sequence in Windows-31J

これにイラっときた人は少なくない筈
非Windows環境ならば、UTF-8で統一すれば大分減るはずですが

## 事の発端
binding.pry の直前に日本語コメントが入ってて表示できなかった
何度もこの問題(default_external と別エンコードのファイルの読み込みに失敗する)に直面して
正直疲れたので、いっそハックしてしまおう

# 対策

```rb:.pryrc
require 'nkf'
# Fix IO
module IO_NKF
  def read(path, length = nil, offset = 0, opts = {})
    keys = opts.keys
    return super unless (keys & %i[encoding external_encoding binmode]).empty?
    return super if keys.include?(:mode) && opts[:mode].include?(':')
    NKF_read path, length, offset, opts
  end

  def NKF_read(path, length = nil, offset = 0, opts = {})
    len = length || 1024
    enc = NKF_guess path, [1024, len].min, offset
    read path, length, offset, NKF_opts(enc, opts)
  end

  def readlines(path, rs, limit, opts={})
    keys = opts.keys
    return super unless (keys & %i[encoding external_encoding binmode]).empty?
    return super if keys.include?(:mode) && opts[:mode].include?(':')
    NKF_readlines(path, rs, limit, opts)
  end

  def readlines(path, rs = $/, opts = {})
    keys = opts.keys
    return super unless (keys & %i[encoding external_encoding binmode]).empty?
    return super if keys.include?(:mode) && opts[:mode].include?(':')
    NKF_readlines(path, rs, opts)
  end

  def NKF_readlines(path, rs, limit, opts)
    bin = binread(path, [1024, limit].min)
    encode = NKF.guess bin
    readlines path, rs, limit, NKF_opts(encode, opts)
  end

  def NKF_readlines(path, rs = $/, opts = {})
    enc = NKF_guess path
    readlines path, rs, NKF_opts(enc, opts)
  end

  def NKF_guess(path, limit = 1024, offset = 0)
    encode = NKF.guess binread(path, limit, offset)
    case encode
    when NKF::JIS then nil
    when NKF::EUC then Encoding::EUCJP
    when NKF::SJIS then Encoding::CP932
    when NKF::UNKNOWN then nil
    when NKF::UTF8 then Encoding::UTF_8
    when NKF::UTF16 then Encoding::UTF_16
    end
  end

  def NKF_opts(enc, opts = {})
    opts.dup.tap{|o|
      o[:external_encoding] = enc
    }
  end
end

# クラスメソッドをprependする方法ってこれでいいのかな
IO.singleton_class.class_eval { self.prepend(IO_NKF) }
Encoding.default_internal ||= Encoding::UTF_8
```

コレをpryrcに仕込めば、コードの文字コードに左右されにくくなります

後でGem化してみるかも

# 既知の問題点
- JISと判別された場合どうすりゃいいんだろう
- BOM 非対応
- UTF32 非対応

# 最後に
File.read(path) を外部ファイルの読み込みに使ってる人は~~爆発しろ~~エンコーディングを設定する必要がないのかきちんと考えてください