OmniAICreator/Qiita-1.07M huggingface dataset:
GAIQを受けてみた

GAIQを受けてみたのでこれからGAIQを受けようかな、そもそもGAIQって何？って方のためにメモを残そうと思います。

# GAIQとは？
正式名称はGoogle Analytics Individual Qualificationであり、その名の通りGoogleAnalytics(以下GA)の習熟度を認定する個人資格です。
詳細は以下の通りになります。

| 項目 | 内容 |
|:----------|:-----------|
| 問題数 | 70問 |
| 試験時間 | 90分 |
| 問題形式 | 選択問題(択一式) |
| 合格ライン | 80%(56問)以上の正解 |
| 再受験可能までの期間 | 7日 |
| 受験料 | 無料 |
| 受験方法 | GooglePartnersサイト上で回答 |
| 有効期限 | 18ヶ月 |

※受験後に何問正解したかはわかるのですが、どの問題を間違えて、正解は何なのかを知ることはできません。
※テスト中は中断不可です。

ちなみに2014年10月以前は

* 再受験可能までの期間が14日
* 有料
* 試験問題言語は英語
* 受験するにはGoogleテストセンターに行かなくてはならない

というかんじだったらしいです。

# 難易度

基礎的な問題が多いので難易度が高いわけではないです。
ただ、少し問題にクセがあったりするので対策は必要だと思われます。
私は業務で多少GAを見て分析の材料にしたり、そもそもそのGA仕込んだりしているくらいのスペックの人間ですが、勉強時間は20時間あったかどうか。。。

# 受験の流れ

## 受験準備
GooglePartnersへの登録から受験開始までの流れはここに丁寧に手順が載っているので参考にするといいと思います。
一瞬、広告代理店の人ではないと登録できないのかと勘違いしますが、Googleアカウントを持っていれば誰でもPartnersのアカウントを作れるようです。
http://www.gaiq.jp/word/gaiqexam.html

## 試験
基本的に択一問題です。
画面下に進捗、残り時間が出ているので計画的に回答しましょう。
注意すべきなのは、**一度「解答する」ボタンをクリックしてしまうともうその回答を修正することはできない**という点です。
おそらく時間が足りなくて試験が終了してしまうということはないと思うので(私は約1時間余りました)、悩ましい問題が出てきたら焦らずじっくり考えてから回答した方が良さそうです。

## 試験終了
全問回答を終了するとこんなかんじの画面が出てきてすぐに結果を知ることができます。
![スクリーンショット 2015-11-04 0.14.21.png](https://qiita-image-store.s3.amazonaws.com/0/100736/2db015da-bea9-f278-c3b2-bc70cbe8f991.png)

また、認定証はPartnersの「プロフィール」、「アナリティクス認定」をクリックすると表示することができます。
![スクリーンショット 2015-11-15 15.03.03.png](https://qiita-image-store.s3.amazonaws.com/0/100736/01a82545-91fa-b187-101f-a70bd8e19ef7.png)

# 試験対策
試験を受けるにあたって自分が活用したものを書いてみたいと思います。

## Analytics Academy
Googleが動画でGAについてのポイントを解説してくれています。
音声自体は英語ですが、字幕で日本語を選択することができます。

![スクリーンショット 2015-11-15 11.16.51.png](https://qiita-image-store.s3.amazonaws.com/0/100736/15b6e1f8-5943-e7b6-6068-6a1cf754375c.png)

ページの下の方には本番と同じような問題もついているのでやってみることをおすすめします。

## ヘルプ

GAに関する情報が詰め込まれているので、試験対策、日頃GAで困った時にはぜひ読んでみるべき公式サイトです。
https://support.google.com/analytics/?hl=ja

## 書籍

以下の書籍を購入して一通り読み通しました。何問かここに載っていた問題がほぼそのまま出てきたということもあり、おすすめです。
「模擬問題全73問付き！GAIQ対策テキスト[2014年11月改訂日本語新試験対応] [Kindle版]. 吉田沙織. 株式会社Hayakawa.」
前者2つのみを活用した勉強でもいけると思いますが、手っ取り早く試験の雰囲気を掴むには問題に触れることが重要です。

私は前者2つに一通り目を通すことはできなかったのですが、この本でしっかり学習していたら合格できました。

# 受験してみた感想
当たり前ですがGAに対する理解がかなり深まりました。
今まで知ったつもりになっていただけだったな、と思うところもあったり。
とりあえず試験としては成功しましたが、まだまだ知らないこともあるのでこれからも勉強していきたいなと思いました。
TensorFlowを使ってみた

今話題のTensorFlowを使ってみたので、メモってみる。

◆TensorFlowのインストール
TensorFlowは以下のサイトを参照にインストールしました。
http://tensorflow.org/get_started/os_setup.md

私はMac OSを使っているので、Mac OSの所を参照してインストール。

$ pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl

を実行してみたが、エラーとなる。
よく見ると「# Only CPU-version is available at the moment.」とあるではないか。

なので、virtualEnv経由でのインストールを行うことにする。
以下のコマンドを実行

$ sudo easy_install pip
$ sudo pip install --upgrade virtualenv

![スクリーンショット 2015-11-13 6.56.03.png](https://qiita-image-store.s3.amazonaws.com/0/1553/2337676a-3cdd-5fe0-d5c5-c70da919883b.png)


そして、以下のコマンドを実行。~/tensorflowディレクトリを作成されるので、場所変えたいときはパスを変えよう。

$ virtualenv --system-site-packages ~/tensorflow

実行したらディレクトリを移動して、vittualenvをActivateする。
$ cd ~/tensorflow
$ source bin/activate

そして、以下を実行するとtensorflowがインストールされる。
(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl

![スクリーンショット 2015-11-13 19.30.00.png](https://qiita-image-store.s3.amazonaws.com/0/1553/8ff050d4-5898-1612-a16b-708276359b87.png)

◆実行してみる
まずは手っ取り早くソースを持ってくる

$ cd ~/tensorflow
$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow

そうすると、~/tensorflow/tensorflowにソースがチェックアウトされる。

pythonを実行する
$ python tensorflow/models/image/mnist/convolutional.py

こんな画面が出て来ればOK
![スクリーンショット 2015-11-15 15.25.11.png](https://qiita-image-store.s3.amazonaws.com/0/1553/9c79fe87-17a6-cc41-12df-8f79a8dc3187.png)


とりあえず、これで環境は整いました。
続きは気が向いたら書くか。
Clojureでバイト配列を整数に変換する

Clojureでバイト配列を整数に変換する方法のメモ。

以下のコードでバイト配列を符号あり/なしのlong値に変換できます。
※ビッグエンディアンでの変換

```sample.clj
(def << bit-shift-left)
(def >> bit-shift-right)

(defn unsigned [^bytes bytea]
  {:pre [(<= 1 (alength bytea) 7)]}
  (areduce bytea i ret 0
           (bit-or (<< ret 8) (bit-and 0xff (aget bytea i)))))

(defn signed [^bytes bytea]
  {:pre [(<= 1 (alength bytea) 8)]}
  (areduce bytea i ret (if (neg? (aget bytea 0)) -1 0)
           (bit-or (<< ret 8) (bit-and 0xff (aget bytea i)))))
```

`areduce`を使うと、配列に対してJavaのforループと似たような処理ができます。
`areduce`の引数の`i`と`ret`はインデックスと戻り値の名前で、名前は自由に決められます。

リトルエンディアンのバイト配列の場合、配列に対する`reverse`を先にしておきます。

```sample2.clj
(defn areverse-byte [^bytes bytea]
  (let [len (alength bytea)]
    (areduce bytea i ret (byte-array len)
             (do (aset-byte ret (- len i 1) (aget bytea i)) ret))))
```

整数からバイト配列への変換は以下のコードでできます。

```sample3.clj
(defn ^bytes ->bytes [^long len ^long value]
  {:pre [(<= 1 len 8)]}
  (byte-array
   (reduce (fn [a i] (conj a (>> value (* (- len i 1) 8)))) [] (range len))))
```


なお、バイト数が8固定で符号ありlongへの変換のみなら
`(.. (java.nio.ByteBuffer/wrap bytea) asLongBuffer get)`
の方が4倍くらい性能はいいです。
Jenskins実践入門を読む


# 1章

## 1.1 継続的インテグレーションとは
+ 1日に何度もビルドを実行し、ソフトウェアをインテグレーションした時に発生する問題を早期に検出し、ソフトウェアの開発の品質と生産性を向上

## 1.2 継続的インテグレーションに必要なもの
+ ビルドサーバ
+ ソースコード管理サーバ
+ CIサーバ
+ ビルドツール
	+ Ant,Gradle,Maven
+ テストツール 
	+ JUnit
	+ Selenium
+ テストカバレッジ取得ツール
+ インスペクションツール

## 1.3 Jenkinsとは
+ 継続的インテグレーションサーバに必要なビルドを実行する機能を備えている
+ Jenkinsの６つの利点
	+ インストールが容易
	+ webブラウザだけで操作可能
	+ 大規模でも複数環境でも対応可能
	+ プラグインで機能の追加可能
	+ オープンソース
# 2章

## 2.1 Jenkinsのインストール

## 2.2 Jenkinsの初期設定
### 2.2.1 ビルド結果をメール通知する
+ 通知メールの設定：JenkinsJenkinsの管理から
+ システムの設定画面==>Jenkins URL項目に設定されているか確認する

### 2.2.2 JDK,Ant,Mavenを自動でインストールする

### Column
+ Apacehの後ろでJenkinsを動かすと,Jenkinsマシンのアドレスが変更した際などで便利で

# 3章 ジョブを作ってビルドする
## 3.1 ジョブをつくる
ジョブ：Jenkinsが一度に実行する処理のまとまり
ジョブの作り方として
	+ テンプレートからジョブをつくる
	+ まっさらな状態からジョブをつくる

ジョブ作成のstepとして
+ 新規ジョブの設定
+ ソースコード管理システムを設定
+ ビルドトリガを設定する
	+ 他のPJの後に実行
	+ 定期的に実行
	+ SCMをポーリングして実行
+ ビルドタスクを設定
+ ビルド後の処理の設定

## 3.2 ビルドして結果を確認する
ビルドの実行方法には、手動で実行する方法と自動で実行する方法が存在する

## 3.3 結果を確認する
+ ビルドの状態確認
+ ビルド結果画面を確認
+ コンソール出力を確認
Atom1.2.0 日本語表示バグの解消

## 現象 ##
日本語の表示が下記画像のように改行されている。（実際に改行コードは無い）
![oAZczGa.png](https://qiita-image-store.s3.amazonaws.com/0/73902/abcb7b70-fcb3-d969-d184-d1840bd44c9c.png)

## 原因 ##
どうやらver1.2.0で日本語周りのアップデートが行われたそうで、パッケージjapanese-wrapと干渉しているっぽい。

## 解決策 ##
japanese-wrapを無効またはアンインストールする。
Vectorの範囲チェック


よく使うのでメモ。
vectorのat()メソッドは範囲外の場合range_errorを返す。


```cpp
template<typename T>
class Vec : public std::vector<T>{

public:
    using vector<T>::vector;
    
    T& operator[](int i){
        return vector<T>::at(i);
    }
    
    const T& operator[](int i) const {
        return vector<T>::at(i);
    }
};
```

### 使用方法
try~catchを使います。

```cpp
Vec<int> list;
try {
    list.push_back(2);
    list[list.size()] = 100;
}
catch(out_of_range){
    std::cout << "range error \n" << std::endl;

}
```
Haskellの環境を5秒で作る


各プラットフォームに専用のパッケージが用意されてるので、コマンド一発で環境が出来上がります。[^1]

### Mac OSX の場合

```
brew install ghc cabal-install
```

### Linux（Ubuntu） の場合

```
sudo apt-get install haskell-platform
```

### 何も考えず VM で動かしたい場合

```
git clone https://github.com/south37/haskell-dev && I && vagrant up && vagrant ssh
```

ちなみに、VM の中身は Ubuntu 15.04 で `haskell-platform` を install してるだけだったりします。VM を使うと環境に依存せずほぼ確実に動いてくれるのでオススメです。

## 試しに動かしてみる

`ghc` コマンド haskell プログラムをコンパイルして、 Hello, World してみましょう。無事コンパイルに成功すれば、 `HelloWorld` という名の実行ファイルが生成されるはずです。

```
$ echo 'main = print "Hello, World"' > HelloWorld.hs

$ ghc --make HelloWorld.hs
[1 of 1] Compiling Main             ( HelloWorld.hs, HelloWorld.o )
Linking HelloWorld ...

$ ./HelloWorld
"Hello, World"
```

完璧ですね！
これであなたも Let's Haskell！！


[^1]: タイトルの5秒とはこのコマンドを打つまでの時間を指しています。既にお気付きの方も多いと思いますが、パッケージインストール自体にはそこそこ時間がかかります（10~20分ほど）。釣りタイトルですいません。。。。
PayPal デベロッパーが見るべきページ10選+1さらに+1

- 全てはここからデベロッパーサイト
https://developer.paypal.com/

- NVP(Classic) APIのはじめの一歩はこのページ
https://developer.paypal.com/docs/classic/api/NVPAPIOverview/

- すべてのNVP APIはここからたどれます
https://developer.paypal.com/docs/classic/api/

- デモサイトで動作を確認しながらサンプルコードがダウンロードできます
https://demo.paypal.com/jp/navigation?device=desktop&page=merchantHome

- モバイルネイティブに組み込みたい方はこちら
https://github.com/paypal/PayPal-iOS-SDK
https://github.com/paypal/PayPal-Android-SDK

- SDKのサンプルコードやAPIコールが試せるサイト
http://paypal.github.io/sdk/

- REST APIを使いたいひとはこちら
https://developer.paypal.com/docs/api/

- すべてのSDKはPayPal githubから
https://github.com/paypal

- テストに不可欠sandbox
https://developer.paypal.com/webapps/developer/docs/classic/lifecycle/ug_sandbox/

- （おまけ）ぼくがRubyとPayPal学習用に書いたPayPalデモアプリ
https://jo-pp-ruby-demo.herokuapp.com/

- **日本向け開発コンテンツ公開！（New）**
https://www.paypal.jp/merchant/developer/
ATOM 1.2.0で japanese-wrap が有効になっていると折り返しがおかしくなる

# 現象
こんな感じになります
![151115-0002.png](https://qiita-image-store.s3.amazonaws.com/0/15257/57dce545-357f-78fb-6f4b-6206080d833a.png)

#原因
想像ですが、ATOM1.2.0でCJK wrapが導入されたためと推測されます
[ATOM 1.2](http://blog.atom.io/2015/11/12/atom-1-2.html)

#対応方法
japanese-wrap を disabled にする。もしくはjapanese-wrap をアンインストールすることで折り返しが正しくなります。

[ATOM 1.2からCJKのSoft Wrapが公式対応されたのでjapanese-wrapのパッケージが必要なくなりました。 - Qiita](http://qiita.com/naru0504/items/fffcc9d5c8e9ef9d1146)
にも書かれてました(汗

japanese-wrapの作者さまありがとうございました！
upstartで管理するサービスの最大ファイルディスクリプタ数の設定

## はじめに

プログラムがファイルやソケットを作りすぎると`too many open file`のようなエラーが出て、最大ファイルディスクリプタ数を増やしたくなることがあります。
Linuxだとデフォルトが1024などの値になっていて、以下のように`ulimit`コマンドで増やしたりします。

```
# デフォルト値を確認
$ ulimit -n
1024

# 2048に増やす
$ ulimit -n 2048
```

これだとログアウトすると設定は残りません。
サービスごとにこれを設定したくなりますね。

## upstartで管理するサービスの最大ファイルディスクリプタ数を設定する

ubuntuではupstartでサービスを管理することがありますが、その場合は `/etc/init`以下にあるスクリプトの中で以下のように記述をすると、そのサービスについて最大ファイルディスクリプタ数を設定できます。

```
description "test service"
start on startup
stop on shutdown
# set max file descriptors to 4096
limit nofile 4096 4096

script
/path/to/test/script
end script
```

`limit nofile`の行で指定してます。
ulimitで設定できる他の項目についても同様です。

参考:

- [Stanzas#limit - Upstart](http://upstart.ubuntu.com/wiki/Stanzas#limit)
- [Upstart Intro, Cookbook and Best Practises](http://upstart.ubuntu.com/cookbook/#limit)

なお、`/etc/init.d/`以下に起動スクリプトを置く場合には、その中で`ulimit -n 2048`などとすればOKです。
Rubyインストール手順

# インストール
###readline のインストール
これがないとirbで日本語が表示されないらしい

```bash:
$ brew install readline
```

###ruby-build、rbenv のインストール

```bash:
$ brew install ruby-build 
$ brew install rbenv
```

###~/.bash_profile に設定を追加；

```bash:
$ echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> .bash_profile
```

以下の一行が追加されます

```bash:.bash_profile
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```


###Rubyのインストール

バージョン確認

```bash:
$ rbenv install -l
```

インストール(2.2.3を入れたいと思います)

```bash:
$ rbenv install 2.2.3
```

バージョンの切り替え

```bash:
# デフォルトバージョンの切り替え
$ rbenv global 2.2.3
# 設定を有効にする
$ rbenv rehash
$ ruby -v
> ruby 2.2.3p173
```
IT業界未経験入社の１年目新人プログラマーが Windows10 にアップデートしてみた。

##2015年7月。
マイクロソフトより「Windows10」が正式にリリースされました。
また、「Windows7」や「Windows8.1」を利用しているユーザーなら１年間に限り無料アップデートが出来るようになりました。

リリースされ始めの無料アップデートをした人達の「ファイルが落ちない！」「ただひたすら再起動している！」なんて失敗談もすでに懐かしく感じます。そんな中、そろそろ落ち着いた頃かと思うので私も「Windows10」にアップデートしてみようと思います。

そもそもの始まりは、「自作PCを作ろう」となり各パーツを選んでいたのですが【OS】を選ぶ際に使い慣れた「Windows7」にしようかそれとも新しいものにチャレンジという意味で「Windows10」にするかで悩んでいました。

そこで思いついたのが、【OS】をお店で購入する際には「Windows7」にし、「Windows10」にアップデートすることです。
アップデートしてから１ヶ月以内なら元のOSに戻すことも出来るので、使いづらかったら「Windows7」に戻す。という考えが始まりです。

自作PCを作った時の記事も書いたのでこちらに貼っておきます。

 [IT業界未経験入社の１年目新人プログラマーが自作PC組んでみた。](http://qiita.com/S_Takuya/private/95ef89b5866c23e88abd)


今回は「アップデートしてみた」という記事ですが、ただアップデートしている様子だけだと物足りないので、「Windows10」の
メリットやデメリット、また最低システム用件を記述していきます。またWindows7の時とWindows10にアップグレード後でベンチマークをとり、性能に差があるのか見えるようにしたいと思います。

##Windows10のメリットとは
+ 評判の良かったWindows7を継承
+ Windows7のようなスタートメニューが復活！
+ コマンドプロンプトの機能が１５年ぶりに大きく強化
+ 起動やスリープからの復帰が早い
+ 評判の良い新ブラウザ「Edge」が使用できる
+ 音声認識アシスタントの「Cortana」が使用できる
+ 生態認証などのセキュリティ強化

##Windows10のデメリットとは
+ Windows10にまだ対応していないハードウェアドライバを持つ周辺機器ある
+ Windows10にまだ対応していないソフト・アプリがある

メリット・デメリットに関してはこんな感じです。

##Windows10の最低システム用件とは
まず、Windows7やWindows8.1が普通に動作していれば、アップグレードしても動作が重くなるということはまずないと思います。

+ CPUクロック数：1GHｚ以上
+ メモリー容量：32bit版は1GB、64bit版は2GB
+ ストレージの空き容量：32bit版は16GB、64bit版は20GB
+ グラフィックス：DirectX 9以上
+ ディスプレイ（画面解像度）：1024×600ピクセル

ちなみにアップグレードする際はインターネットに接続状態にしておきます。
かかる時間は通信速度やファイル数などにより人それぞれです。

##Windows10のアップグレード手順について
アップグレードに関しては特に考えることはなく、「Microsoft」のホームページへいき、画面の指示にしたがい実行していくとインストールが完了します。

##アップグレード前と後のベンチマーク
まずはアップグレード前のWindows7のベンチマークから見ていきます。
基本的に5回計測し、平均的な数値を比較してみます。

![ベンチマーク7.jpg](https://qiita-image-store.s3.amazonaws.com/0/94120/428f2e6c-eabf-46a7-ef67-cb8f51e04a87.jpeg)

続いてWindows10にアップグレード後のベンチマークです。


![ベンチマーク10.jpg](https://qiita-image-store.s3.amazonaws.com/0/94120/393b1676-fe71-381a-b2fc-e09c10d08256.jpeg)

数値が出たので大きく変わっているところを見ていきたいと思います。

ベンチマーク合計値
Windows7  :136011
Windows10 :136947
アップデート前に比べるとアップデート後の数値は約1000程上昇しています。

CPU合計値(ALU + FPU)
Windows7  :51045
Windows10 :52807

アップデート前に比べるとアップデート後の数値は約2000程上昇しています。
Windows10は「CPU」の性能を活かせるOSということがこの事からわかります。

その他のベンチマークは、少しの差はあるもののほぼ同じ数値になっています。


Windows10のメリット・デメリット、最低システム用件、アップデート前とのベンチマーク比較が終わりました。

上記に書いた内容からわかるのはWindows10にアップデートすることはメリットのほうが多いということです。
もちろんデメリットもありますし、良いか悪いかはその人次第です。
私は今回Windows10についてしっかりと調べることによりたくさんのメリットが知れたので、しばらくWindows10を使ってみようと思います。
1日でも早く使いこなせるように今のうちは新機能を体感し慣れることから努めていきたいところです。

以上、IT業界未経験入社の１年目新人プログラマーが Windows10 にアップデートしてみた。でした。
Javascriptで継承（補足）

以前JavaScriptで継承を実現する方法について書きましたが、幾つか改善点が見付かったので補足します。

* [Javascriptで継承](http://qiita.com/pizyumi/items/15261272eaa4a1ad2f51)

上の記事で作成したコードを再掲します。

```js
> function Currency(name, code) {
... this.name = name;
... this.code = code;
... }
undefined
> Currency.prototype.toString = function() {
... return this.name + " " + this.code;
... }
[Function]

> function CryptoCurrency(name, code, author) {
... this.name = name;
... this.code = code;
... this.author = author;
... }
undefined
> CryptoCurrency.prototype = new Currency()
Currency { name: undefined, code: undefined }
> CryptoCurrency.prototype.constructor = CryptoCurrency
[Function: CryptoCurrency]
> CryptoCurrency.prototype.base = Currency.prototype
Currency { toString: [Function] }
> CryptoCurrency.prototype.toString = function() {
... return this.base.toString.call(this) + " " + this.author;
... }
[Function]
```

# 子コンストラクタで親コンストラクタを呼ぶようにした方が良い

と思います。

上のコードでは子コンストラクタである`CryptoCurrency`コンストラクタで`name`プロパティや`code`プロパティを定義していましたが、これらのプロパティは親コンストラクタから継承しているものなので、子コンストラクタで直接定義すべきではないでしょう。なので、子コンストラクタでは親コンストラクタを呼び出してこれらのプロパティは親コンストラクタに定義させるべきです。

```js
> function CryptoCurrency(name, code, author) {
... Currency.call(this, name, code);
...
... this.author = author;
... }
undefined
```

# Object.createを使うこともできる

上のコードでは子コンストラクタの`prototype`プロパティを設定する際に`new`を使ってオブジェクトを実体化していましたが、`new`の代わりに`Object.create`を使うこともできます。

```js
> CryptoCurrency.prototype = Object.create(Currency.prototype, {
... constructor: { value: CryptoCurrency, enumerable: false, writable: true, configurable: true },
... base: { value: Currency.prototype, enumerable: false, writable: true, configurable: true }
... })
CryptoCurrency {}
```
Processing 3.0で実行中にwindowのsizeの変更やタイトルバーを非表示にする方法


processing3.0になってvoid setup(){}内でしかsize()の設定ができなくなったり、windowのタイトルバーを非表示にするframe.setUndecorated(true)がそのまま書くと｢<b>fullscreen()を使え</b>」的なerrorが出るから
processing2.0の時に書いたコードが使用できなくなってる... orz

そこでマルチディスプレイにフルスクリーンサイズにしたりサイズをランダムに変更できるようにprocessing3.0仕様に書き換えたのがこれ



```size_change.pde
import processing.awt.PSurfaceAWT;
 
void setup(){
  //windowサイズの初期化
 surface.setResizable(true); 
}
 
void draw(){
  background(#FFFFFF);
  
}
void keyPressed() {
  if ( (key == 'a')) {
    //smoothCanvas.getFrame()関連のメソッドを使えるようにする

    PSurfaceAWT awtSurface = (PSurfaceAWT)surface;
    PSurfaceAWT.SmoothCanvas smoothCanvas = (PSurfaceAWT.SmoothCanvas)awtSurface.getNative();
   
    smoothCanvas.getFrame().setAlwaysOnTop(true);
    smoothCanvas.getFrame().removeNotify();
    
    //タイトルバー非表示
    smoothCanvas.getFrame().setUndecorated(true);
    
    //マルチディスプレイ用にsetLocation(x,y);のパラメータのxをマイナスにする
    smoothCanvas.getFrame().setLocation(-1368, 0);
    smoothCanvas.getFrame().addNotify();
    
    // //window上で"左クリック+a"でフルスクリーンサイズ
    smoothCanvas.getFrame().setSize(1368,720);
    


}

 if ((keyPressed == true) && (key == 'b')){
    PSurfaceAWT awtSurface = (PSurfaceAWT)surface;
    PSurfaceAWT.SmoothCanvas smoothCanvas = (PSurfaceAWT.SmoothCanvas)awtSurface.getNative();
    smoothCanvas.getFrame().setAlwaysOnTop(true);
    smoothCanvas.getFrame().removeNotify();
    smoothCanvas.getFrame().setUndecorated(true);
    smoothCanvas.getFrame().setLocation(-1368, 0);
    smoothCanvas.getFrame().addNotify();
    
    //window上で"左クリック+b"でランダムにwindowサイズが変更する
    smoothCanvas.getFrame().setSize(round(random(100, 500)), round(random(100, 500)));


  }
 }
```
左クリック＋Ａでフルスクリーン
左クリック＋Ｂでランダムにサイズ変更できます


ちなみにマルチディスプレイを使わないでPC単体の場合は
> smoothCanvas.getFrame().setLocation(-1368, 0);　
のところを
 smoothCanvas.getFrame().setLocation(0, 0);　
とパラメーターを変えて下さい
Cloudera QuickStart VMを試す

ClouderaのQuickStartVMを利用するためのまとめ。
常に変化しているので随時キャッチアップ（これは2015年11月15日時点の情報です）。

##参考


* [Cloudera Quickstart VM（CDH5）をVirtualBoxで起動してHadoopの環境構築をする](http://www.task-notes.com/entry/20150614/1434250800)
* [Hadoopを10分で試す](http://linux.wwing.net/WordPress/?page_id=941)
* [「Cloudera Quick Start VM」を活用したビッグデータ分析の学習環境構築](https://codezine.jp/article/corner/583)

##準備

###ダウンロード

ダウンロードボタンのCSSがずれててうまく押せない。。。ボタンの下の方を押せば大丈夫みたいです。
私はVMWare版をダウンロードしました。

###解凍

サイトにも書いていますが、解凍は7zipを使ったほうがよいみたい。
私はMacなので、brewでインストール。

```bash
brew install p7zip
7z e 
```

解凍が完了すると、いくつかのファイルができますが、その中の、cloudera-quickstart-vm-5.4.2-0-vmware.vmxをVMWareから開きます。

###VMの起動

起動前に、可能な限りのメモリとCPUを割り振ります。
マシン環境に依存すると思いますが、起動にはしばらく時間がかかります。ログインは自動的に行われるようです。

###キーボードレイアウトの変更

私はJIS配列のキーボードを使用していますが、VMの設定はUSになっているようなので変更します。

GUIからSystem->Preferences->Keyboard->Layouts->Add...->Country->Japan->Add

という流れで設定し、Layoutの画面でJapaneseをDefaultに設定し、再起動すればよいでしょう。

[こちら](http://qiita.com/tamamius/items/ad261090d47560b17c73)のサイトが大変参考になります。

###日本語化

日本語サポートをインストールします。


```bash
sudo yum install japanese-support
```
一度ログアウトするか再起動します。

###ブラウザを日本語化する

MacだとOptionを押せば、メニューが表示されますので、Edit->Preference->Content->Languages->Chooseを選び日本語を追加します。

###JSTにする

標準ではUSTになっているようです。日本時間に変更しましょう。

```bash
sudo cp /usr/share/zoneinfo/Japan /etc/localtime
sudo vi /etc/sysconfi/clock
```

で、ZONE="Asia/Tokyo"

に変更。

##利用

###Cloudera Expressを起動

デスクトップ上にある「Launch Cloudera Express」をダブルクリックします。すると、「最低でも8GBのRAMをおすすめします・・・」というメッセージが8GB以上のRAMを割り当てても出ます（苦笑）。

このチェックを無視して実行するためには、下記のコマンドを実行します。
expressを利用するには--express optionを付与するとよいようです。

```bash
sudo /home/cloudera/cloudera-manager --force --express
```

>コンソールを開けば/home/clouderaなので、
> `sudo ./cloudera-manager --force --express`
とすればいいです。

http://quickstart.cloudera:7180 にアクセスしろと出るのでアクセスします。ID,PWはそれぞれclouderaです。

なお、このコマンドは再起動を行った際は毎回必要なようです。

###各サービスのステータスが？になっている

サービスが起動できていないのか、ステータスがうまく取得できていないのか？（たぶん後者）、ステータスがグリーンになっていない場合がありますが、しばらく待てばオールグリーンになるようです。

>ならない場合は、Cloudera Management Serviceを再起動してみます。
それでだめなら各サービスを再起動してみます。

###Hueでサンプルのクエリを実行する

Hueのクイックスタートの「手順2」で必要なアプリケーションサンプルをインストールします（しておきます）。
すると、「家マーク（マイドキュメント）」で、サンプルリストを見ることができます。

必要なSampleをクリックし、クエリを実行してみましょう。
RDSでmysqldumpslowを使う

# 初期設定

RDSのコンソール上で下記を設定してください

* slow_query_log=1
* log_output=FILE
* slow_query_log_file=/rdsdbdata/log/slowquery/mysql-slowquery.log (デフォルト値)

log_outputはデフォルトでTABLEとなっています。
TABLEでも mysql.slow_query テーブルにログが溜まっていくのですが、ほったらかしにしてログが膨れ上がることが多々あるでしょう。
殆どの場合、直近のログさえあれば十分なのに、「mysql.slow_queryが膨れ上がってSELECTの結果が終わらない！！」
ということはしばしばあるかと思います。私もなりました。
FILEにしていれば、1時間毎のログが1日分残ります。これなら、ファイルが大きすぎて分析できない！ということは無いでしょう。

# 分析方法

まずは、cliからログをDLしてください。
下記のRDSのslowquery.logをまとめてDLするワンライナーを使うといいです。
{rds_instance_name} を書き換えて使ってください。

```bash
$ for i in {0..23}; do
  aws rds download-db-log-file-portion \
    --db-instance-identifier {rds_instance_name} \
    --log-file-name slowquery/mysql-slowquery.log.$i \
    --output text \
  >> slowquery.log; \
done
```

mysqlclientが入っていれば、mysqldumpslow が一緒に入っています。
ファイルを読み込むだけで、遅いクエリがソートされるので一発で分かります。

```bash
$ mysqldumpslow slowquery.log > mysqldumpslow.log
```


## ※追記

いつの間にかログに余計な情報が入るようになって、mysqldumpslowの結果がおかしくなってしまってました。
あんまり詳しく調べてませんが、必要ない行を除けば期待したものが見れるので、あんまり深追いしてません。環境の問題なのかもしれません。

```bash
$ perl -ne 'print $_ unless /^(?:# Time|SET timestamp)/;' slowquery.log > slowquery-fixed.log
$ mysqldumpslow slowquery-fixed.log > mysqldumpslow.log
```

# 参考

権限の問題など、大人の事情でslow_query_log=TABLEのまま運用しなければいけない場合は、以下を参考にするといいです。
http://qiita.com/DianthuDia/items/d235f8fb563ffed89884

aws cliを入れるところからは以下を参考に。
http://qiita.com/ysk_1031/items/0efc7aa17a57316ec328

やっぱり公式ドキュメントが一番ですよね！
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html
CSVを扱うならExcelではなくCalcで

[LibreOffice Advent Calender](http://www.adventar.org/calendars/949)の季節がやって参りました。
[榎さん](http://eno.hatenablog.com/entry/2015/12/02/020543)に続いて 2015年12月3日の記事です。
今回は小さなTipsでも紹介しようと思います。

**csvファイルにはCalc** を使いましょう。

csvファイルは**Excelで開くな** とIT業界で伝えられております。
下記の2つの理由です。

- 文字化けする
- 勝手に日付に変換

Calcは上記の問題を難なく解決してくれます。
僕が管理している住所録のCSVを元に説明していきます。

## 環境
- Windows7 SP1 x64
- Microsoft Excel 2010
- LibreOffice Calc 5.0.32 (x64) ja_JP


## 準備するファイル

下記の2つのファイルを用意しました。
リンクをクリックしてそれぞれダウンロードしておいて下さい。

- [address.csv](http://yahoo.jp/box/u71RSX)
    - Encoding UTF-8N
    - Webサービスで扱われる一般的なUTF-8
- [address2.csv](http://yahoo.jp/box/ZfJM01)
    - Encoding UTF-8 BOM付き
    - Excelで扱えるUTF-8


```text:address.csvとaddress2.csvの中身
"氏名","郵便番号","都道府県","市区町村","番地","建物名等"
"荒川　雄介","602-0000","京都府","京都市の何処か","12-9","マンション10-9"

```

デスクトップにでも転がしておきましょう。


## 文字化け

### Excelの場合
まずは手っ取り早く開いてみましょう。

1. address.csvを右クリック
2. プログラムから開く > Microsoft Excel を選択

![openexcel01.png](https://qiita-image-store.s3.amazonaws.com/0/24550/b2b6d33d-5ec3-79b0-7e34-64b9824b497d.png)

見事な文字化けです。
ExcelはUTF-8に対応しましたが、BOM付きでないと文字化けします。

### Webサービスのcsvは文字化けすると思え
Webサービスで提供されるcsvファイルは、まず文字化けすると考えて下さい。
Linuxで提供されているサービスが殆どなので、
BOM付きのUTF-8なんかにはしてくれません。
BOMのないUTF-8です。
Yahoo!知恵袋等にはCSVが文字化けします。
みたいな投稿ばかりです。

### Calcの場合
1. address.csvを右クリック
2. プログラムから開く > LibreOffice Calc
3. テキストのインポートで文字エンコーディングを選ぶ
4. 区切りのオプションで コンマ を選ぶ
5. OK を押す

![opencalc01.png](https://qiita-image-store.s3.amazonaws.com/0/24550/26e0e9f6-e7e8-73ae-30d3-1fe55f8fd7f3.png)

![opencalc02.png](https://qiita-image-store.s3.amazonaws.com/0/24550/b24baa6a-4897-7781-7b0c-5b96096aaaef.png)

Shift-JISだろうが、UTF-8だろうが何でも来い。
ステキ！


## 勝手に日付に変換
文字化けを避けるためにExcel,Calc共にUTF-8 BOM付きのCSVを読み込むことにします。
デスクトップにあるaddress2.csvを右クリックして開きます。

### Excelの場合
番地の列をみてください。
CSV上では12-9としていたのが 12月9日 と勝手に日付に変換されてしまっています。
これをこのまま 上書き保存 してしまうと、
もう 12-9 ではなく、 2015/12/9 の文字列に変わってしまいます。
勝手にデータを書き換えるなんてありえない！！
![openexcel02.png](https://qiita-image-store.s3.amazonaws.com/0/24550/ac36ce05-868a-4447-94f0-def4142096d6.png)


### Calcの場合
同じく番地の列を見ると…。
お、 12-9 のままです。
ステキ！
![opencalc02.png](https://qiita-image-store.s3.amazonaws.com/0/24550/5ab82c4d-7c8e-2981-3e01-cf66069cf83c.png)

## 結論
csvファイルを扱うならExcelではなくCalcを使え。

次はnogajunさんの
[Impressで映画Trainspottingのオープニングみたいな画面効果を作る](http://www.nofuture.tv/diary/20151204.html#p01)
です。

## 参考資料
[Excel で UTF‐8 の CSV を作成したい](http://answers.microsoft.com/ja-jp/office/forum/office_2010-excel/excel-%E3%81%A7-utf8-%E3%81%AE-csv/25d8bea2-f20c-4feb-9216-e06cb3bf0757)
ExcelはBOM付きのUTF-8しか読めないことが分かります。

[Square-商品情報をインポートするには](https://squareup.com/help/jp/ja/article/5153-)
csvはUTF-8で吐き出すのでExcelでは文字化けすると公言している。
個人向けoffice365のダウンロード（備忘録）

個人向けoffice365のoffice2016をダウンロードするページを
探すのですが、いつも全然見つからないので残しておきます。

https://products.office.com/JA-JP/whats-new-office?Wt.mc_id=oan_JA-JP_mscom_prog_office2016launchwhatsnew
input type="file"でC:\fakepath\が入る問題の対処法

input type="file"を非表示にして
独自のデザインでファイル選択フォームを作っていた時のこと。
`$("#file").val()`

したら
`c:\fakepath\<ファイル名>`

調べるとセキュリティ的にクライアントのフルパスは取得できなくなったみたい。。
でもそのままなのもダサいので
しぶしぶreplaceを使い置換することに。

`$("#file").val().replace(/C:\\fakepath\\/g ,"");`

なんか強引な気がするけどとりあえずかな。。

# 追記
コメント欄で教えてもらった方法(2015年12月15日18:24追加)
`$('#file')[0].files[0].name`
MacでX1のクロス開発（アセンブラ準備編）

開発をするには、Macで動くZ80のアセンブラが必要です。
こちらも情報が少ないのですが、いくつか探した結果、[ASxxxx](http://shop-pdp.net/ashtml/asxxxx.htm)を使うことにしました。
理由は、比較的簡単に使える状態にできたのと、アセンブルした結果を[intel HEX](https://ja.wikipedia.org/wiki/Intel_HEX)形式という比較的平易なフォーマットで出力できるためです。
また、これは、Z80だけでなく色々な8bit CPUのアセンブラがセットになっていますので、他の機種向けの開発にも使えそうです。

## ASxxxx の用意
以下の手順で用意します。

- http://shop-pdp.net/ashtml/asxxxx.htm を開く
- Get the "ASxxxx Cross Assemblers" をクリック
- ASxxxx Cross Assemblers Source Code as a zipped file (4578K) をクリックしてダウンロード
- 解凍し、asxs5p10/asxv5pxx/asxmak/linux/build に移動
- make
- asxs5p10/asxv5pxx/asxmak/linux/exe の下に実行ファイルができている
- asz80,aslink をパスの通ったディレクトリ（/usr/local/bin など）にコピー


### その他試してみたアセンブラ
ASxxxx 以外に試してみたものです。

#### z80asm

homebrew で brew search z80 として出てくるもの。インストールしようとしたがサーバーが反応しませんでした。

#### [gnu binutils](http://ftp.gnu.org/gnu/binutils/)

ビルドの仕方がよくわからず断念しました。
`./configure --target=z80-unknown-coff`
とすればいけそうでしたが、途中で面倒くさくなってきて後回しにして、そのままです。

#### [sdcc](http://sourceforge.net/projects/sdcc/files/sdcc-macosx/3.5.0/)

8bit CPU向けのCコンパイラですが、アセンブラも含んでいます。
sdcc-3.5.0-universal-apple-macosx.tar.bz2 を解凍すると、bin/sdasz80 にビルドされたものがあるので、用意するのは一番簡単です。
ちょっと試しましたが、イミディエイトアドレッシングに # をつけるのに違和感があります。(LD A,#0 とか）

# X1エミュレータでHello world
まずは、X1エミュレータでプログラムを動かせるかテストをしてみます。
おなじみのHello worldです。

```hello.asm
	.area	TEST	(ABS)
	.org	0xe000
	ld	bc,0x2000+40	;;アトリビュートのアドレス
	exx
	ld 	bc,0x3000+40	;;テキストVRAMの２行目のアドレス
	ld 	hl,_msg
_loop:
	ld 	a,(hl)
	or 	a
	jr 	z,_end
	out 	(c),a		;;テキストVRAMに１文字出力
	inc 	bc
	inc 	hl
	exx
	ld 	a,7
	out 	(c),a		;;アトリビュートに出力（文字色を白にする）
	inc 	bc
	exx
	jr 	_loop
_end:
	halt
_msg:
	.ascii	/Hello, world!/	;;出力するメッセージ
	.db	0					;;メッセージの終了
```

これをアセンブル、リンクします。

```
asz80 -o hello
aslink -i hello
```

これで、hello.ihx というintel HEX形式のファイルができます。
が、このままではエミュレータで読み込めません。
ディスクイメージに変換する必要がありますが、適当なツールは見当たらないので、これくらいは自作することにします。（詳細は後述）
見事出来上がったディスクイメージファイルを、エミュレータの仮想ディスクドライブにセットして起動します。

```
mame64 x1 -flop1 hello.2d
```

すると・・・
![hello.png](https://qiita-image-store.s3.amazonaws.com/0/96092/51e8d240-7c68-5808-4015-8197ce6b337e.png "hello.png")
１行目はIPLでディスクイメージを読み込んだというメッセージで、２行めがプログラムで出力したメッセージです。
これでようやくプログラム開発の必要最小限の環境が整いました。
MacでX1のクロス開発（エミュレーターの準備編）

X1の実機で開発をするのはさすがにきついのです。
というわけで、動作確認のためにエミュレーターを使えるようにします。

# Macで使えるエミュレーターはあるのか？
まず問題はここです。
検索すると、Windows用はそこそこあるのですが、Macだととたんに情報がありません。
で、現状ほぼ唯一使えそうなのが [MESS](http://www.mess.org) です。
MESS(Multi Emulator Super System)はMAMEの一種ですが、ゲームだけでなく古いPCのエミュレーターも含んでいるようです。

しかも、Mac向けにビルドされたものが [SDLMAME](http://sdlmame.lngn.net) として配布されているので、面倒が少なそうです。

※エミュレーターでX1を動かすためのソフトウェア（BIOS等）を必要としますが、それらの入手に関しては割愛します。


## MESS(SDLMAME)を使えるようにする
###SDL2のインストール
まずSDLをインストールします。
このサイト https://www.libsdl.org/download-2.0.php から"Runtime Binaries"にある"Mac OS X"用のdmgファイルをダウンロードします。
dmgファイルを開くと "SDL2.framework" があるので、これを /Library/Frameworks にコピーすればよいです。

##SDLMAMEのダウンロード
SDLMAMEのサイトからSDLMAME本体をダウンロードします。32bitと64bitの両方がありますが、ここでは64bit版(SDLMAME v0.167 64-bit)にします。
zipファイルを適当な場所に展開します。
中にある mame64 という148MBもある実行ファイルがSDLMAMEの本体です。

##BIOSの入手
X1のBIOS(x1.zip)をどこかから入手します。
SDLMAMEの実行ファイル(mame64)のあるディレクトリに roms ディレクトリを作成します。
その下に、x1.zip をzipのままコピーします。

##MESSを実行する前に
これでMESSでX1をエミュレーションできるのですが、実行前に必ず以下のファイルを作成しておきます。
これがないと、MESSを終了させることができなくなります。
実行ファイルのあるディレクトリに cfg というディレクトリがない場合は作成してください。

```cfg/default.cfg
<?xml version="1.0"?>
<mameconfig version="10">
    <system name="default">
        <input>
            <port type="UI_TOGGLE_UI">
                <newseq type="standard">
                    KEYCODE_LALT KEYCODE_LWIN
                </newseq>
            </port>
        </input>
    </system>
</mameconfig>

```

ここまでで以下のようなファイル構成になります。

```
- mame64
- + roms
| - x1.zip
|
- + cfg
| - default.cfg
```

##MESSの起動
ターミナルで以下のように起動します。
`mame64 x1`

色々とメッセージが出ますが、 とりあえずenterを押して進みます。
"Type OK or .." と出たらOKと押してください。
白い文字で以下のメッセージが出れば、X1のエミュレーションが始まります。

```
IPL is under preparing
```

##MESSの終了
Option+commandキーを押すと、以下の様なメッセージが出ます。

```
Emulation Status
UI: enabled
```

この状態でESCを押せば終了できます。

X1のエミュレーションが始まると、キーは基本的にX1に渡されてしまうため、MESSそのものを操作できなくなります。
そのため、MESSそのものを操作するときは、MESSのユーザーインターフェースが優先してキー入力を受け取るように切り替える必要があります。
この切替を Option+command でできるようにするために cfg/default.cfg を用意していたのです。
これがないと、ESC を押してもX1が拾ってしまうので、終了できません。
切り替えキーはX1が認識しないキーであれば何でもかまいません。
なお、デフォルトは ScrLock になっていますので、これがついているキーボードを使っているのなら、default.cfg を用意する必要はないかもしれません。
NavigationBar(下にボタンが並んでるバー)を消す


![navigation-bar.png](https://qiita-image-store.s3.amazonaws.com/0/6061/ebc5f900-4f84-2295-dafe-e9e01a5d0c93.png "navigation-bar.png")

http://developer.android.com/intl/ja/training/system-ui/navigation.html に書いてありました。

サンプルではステータスバーも消すようなコードが書かれていますが、ナビゲーションバーだけを消したいだけなら以下で大丈夫そうです。

```java
View decorView = getWindow().getDecorView();        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
```

但し、上記のコードだと１回どこかをタップなどすると再度ナビゲーションバーが表示されてしまうのでそのあたりの調整は別途行う必要がありそうです。
技術英語 > Maps do not serve us well. / on a first-come-first-served basis

@ Star Trek Voyager > INITIATIONS

敵対しているケイゾンの領域を侵犯したChakotayがケイゾンの一人とのやりとりの中で「地図を見てなかった」と言ったことに対して、そのケイゾンが言った言葉

> Unfortunately, our territorial claims change every day. Maps do not serve us well.

訳すと「残念ながら、我々の領域は日々変化するんだ。地図は役に立たない。」

<hr>
serve関連で思い出したのは

http://eow.alc.co.jp/search?q=first+come+first+served
> on a first-come-first-served basis.

FIFOの説明でよく出てきそう。
WEB Apiの話 (JSON RPC)

#WEB Apiの話 (JSON RPC)

前回の**[Restの話](http://qiita.com/xuj/items/7e9501f91df9eb9e23bf)**があったように、
Rset Api作るために、CRUD操作**(GET, POST, PUT, DELETEDB)の設計、URIの設計、仕様作成しながら、決めていかないといけない、以外と面倒です。
今回、json-prc 2.0の話をします。

##json-prc 2.0
RPC (Remote Procedure Call リモート関数コール)の略です。
json-rpcは、json形式のRPCと考えればよいです。

話の前に、まずjson-rpc2.0の簡単な例で見てみましょう。
>--> {"jsonrpc":"2.0", "method": "subtract", "params":[42, 23], "id": 1}
><-- {"jsonrpc": "2.0", "result": 19,"id": 1}
> **※**　--> は、リクエスト。　<-- は、レスポンス。
> **※**　jsonrpcにはJSON-RPCのバージョンを設定します。
> **※**　methodにはサーバに実行してもらうメソッド名を設定します。
> **※**　paramsにはメソッドの引数を設定します。
> **※**　idは、クライアントによって確立された識別子。なくでもよいです。レスポンスは、受け取った値をそのまま設定して返します。



##メリット
Restは、GET, POST, PUT, DELETEDBとは、考えるのは大変で、
json-rpcは、すべてpostになります。
データはすべてjson形式。
URLも、このように、楽勝　https://domain.com/xxx_api
主な設計は、Methodぐらいですね。

開発も楽、機能より、関数の実装を注力、テストも関数のテストになります。


##json-rpc2.0新機能
 - Notiﬁcation
 - Batch

###### Notiﬁcation(通知)
クライアントからサーバー側に情報を通知です。サーバにレスポンスの内容を返すことを要求しません。例えば、PVのカウントとか。
リスエストの「id」の要素を省略すると、自動的にNotificationとなります。


###### Batch
複数のリクエストを束ねたバッチリクエスト
>--> [
>        {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
>        {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
>        {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
>        {"foo": "boo"},
>        {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},
>        {"jsonrpc": "2.0", "method": "get_data", "id": "9"} 
>    ]
><-- [
>        {"jsonrpc": "2.0", "result": 7, "id": "1"},
>        {"jsonrpc": "2.0", "result": 19, "id": "2"},
>        {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},
>        {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"},
>        {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}
>    ]
独自SSL認証局(CA)作るときの「CA -newca」をやり直す

俺俺SSL証明書作るときは俺俺ルートCA(認証局)作ると思うのですが、

例えばパスフレーズを省略しようとしちゃうと

```
# /etc/pki/tls/misc/CA -newca
…
Enter PEM pass phrase:
140290371733320:error:28069065:lib(40):UI_set_result:result too small:ui_lib.c:869:You must type in 4 to 1024 characters
…
```

こうやってエラーが出て CA コマンドは終了しちゃうんですが、その後に

```
# /etc/pki/tls/misc/CA -newca
```

ってもう一回CA作ろうとしてもこのコマンドはウンともスンとも言わず、そのままだと二度と「CA -newca」再実行ができないのです。**ものすごい理不尽。**これって仕様？？？？？

## 対処
とりあえず以下のようにファイル消せば、また「CA -newca」実行できます。

```
# rm -f /etc/pki/CA/index.txt
# rm -f /etc/pki/CA/private/cakey.pem
```

消すのが不安な場合は削除前に ```ls -l``` してみると良いです。0バイトのファイルができているだけなので安心して消せることが分かるはず。
Nginxのエラーページをカスタマイズする方法

Nginxのデフォルトのエラーページは格好良くないし、Nginxを使ってることがバレバレです。それが嫌だったので以下の方法でカスタマイズしました。

# 基本
Nginxではエラーページのカスタマイズには**error_page**ディレクティブを使います。
カスタマイズの基本的な方法は、**custom_404.html**を作って、nginxの設定ファイルを以下の様な感じにします。
これで、Nginxを再起動して、存在しないファイルへリクエストするとcustom_404.htmlが帰ってくるようになります。

```nginx
server {

    # 中略

    error_page 404 /custom_404.html;
    location = /custom_404.html {
        root /opt/nginx/html;
        internal;
    }

    # 中略
}
```

# 応用
以下では、よりより実践的な例を紹介します。

## IP直打ちでのアクセスは全てエラーページを表示
IPアドレスを直接入力してアクセスしてきた場合や想定外のホスト名でアクセスしてきた場合に常にcustom_404.htmlを表示したければ以下の様にします。

```nginx
server {
    listen 80 default_server;
    error_page 404 /custom_404.html;
    location / {
        return 404;
    }
    location = /custom_404.html {
        root /opt/nginx/html;
        internal;
    }
}
```

## どんなエラーが発生しても404ページを返す
実際に発生しているエラーが403だろうが503だろうが、ユーザーには404エラーが発生しているように見せかけます。
下の例では403, 404, 500, 503のいずれが発生してもクライアントに返すHTTPステータスコードを404に書き換え、custom_404.htmlを返します。

```nginx
server {
    listen 80;
    server_name example.com;
    error_page 403 404 500 503 =404 /custom_404.html;
    location = /custom_404.html {
        root /opt/nginx/html;
        internal;
    }
}
```

## 管理画面を隠す
特定のIP以外から管理画面へアクセスされた時は404画面を出します。
この例では192.168.0.1からの管理画面へのリクエストは許可し、それ以外の場合は404ステータスとcustom_404.htmlを返します。

```nginx
server {
    listen 80;
    server_name example.com;
    error_page 403 404 =404 /custom_404.html
    location /admin {
       allow 192.168.0.1;
       deny all;  
    }
    location = /custom_404.html {
        root /opt/nginx/html;
        internal;
    }
}
```

## Apacheのエラー画面の真似をする
Nginxを使っていることを隠して、代わりにApacheのフリをするには以下のようにします。

```nginx
server {
    listen 80;
    server_name example.com;
    error_page 403 404 500 503 = /apache_404.html;
    location = /apache_404.html {
        return 404 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>404 Not Found</title>\n</head><body>\n<h1>Not Found</h1>\n<p>The requested URL $request_uri was not found on this server.</p>\n<hr>\n<address>Apache/2.2.31 Server at $host Port $server_port</address>\n</body></html>";
        internal;
    }
}
```
[Xcode]この素晴らしい(クソ)コードは誰が書いたのか調べる方法

# [Xcode]この素晴らしい(クソ)コードは誰が書いたのか調べる方法

初の記事投稿になります。

初記事に何を書こうかなと思ってたんですが，
意外と見ない人も多いのかなと思いまして。
知っている人は知っている内容です。

## はじめに
複数でチーム開発とかやっていると一つのファイルを
複数人で編集することって多いと思います。そんな中，

```
この素晴らしいコード誰が書いたんだろう？
このクソみたいなコード誰が描いたんだ？
```

っていう経験が少なからずあると思います。
こういうのを Xcode で調べる方法についてです。
コンフリクトの話は今回は置いておきます。

## Xcode の Blame 機能
初期段階では気にならないとは思いますが，ある程度プロジェクトが
進んで行くと機能追加，改修やバグ修正などでこのコードよくわからんぞーとか
なんて素晴らしい書き方なんだ！とかあると思う。
バグ改修とかでわからない場合は書いた人に聞くのが一番の早道。
でも GitLab とか Redmine とかで誰が担当したのか
調べてもよくわからないときもあるかと思います。

だいたい Git で管理してるプロジェクトが多いと思います。

```bash:bash
$ git blame filename
```

でもいいですが，視覚的に見た方がわかりやすいかなーって。
Xcode のツールバーの右側部分をいじるだけでわかってしまう訳です。
クリックしたら下記のような選択ができます。真ん中の Blame 機能が該当です。

<img width="207" alt="スクリーンショット 2015-11-15 3.22.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/88266/524f55f5-209f-f238-3dd9-b2967a3f0544.png">



上の Comparison 機能は文字どおり比較です。
今作業中のブランチと切り元との差分とかを見たりします。
わりとよく使う機能なので割愛します。便利ですよね。

下はログです。こちらでも Commit したログがしっかり見れますが，
コード編集者となるとまだ絞りきれないかもしれません。

Blame を選択してみるとコーディングエリアの右側に編集者名，
いつ Commit されたものか，Commit のコメントも見れます。

<img width="697" alt="スクリーンショット 2015-11-15 3.23.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/88266/b5eabf07-db12-272d-9252-2efbfa3b42e8.png">

コメントアウトだけ変更して Commit したものですが，
別の日に 2 人で編集したんだとわかります。
マウスカーソルをボックス内に合わせると i ボタンが出てきて詳細も見れます。

<img width="698" alt="スクリーンショット 2015-11-15 3.23.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/88266/56fec599-8f3e-490d-5c24-2d733742a817.png">

14 個も一緒に Add して Commit しているようですが当然ながら良くないですね。
この場合はプロジェクトを新規作成して最初の Commit なのでいいのですが。

コメントアウトの追加だけしたところは見にくいですが；・・

<img width="695" alt="スクリーンショット 2015-11-15 3.24.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/88266/2b1b0bff-dfca-d38f-defe-4b052731dfa6.png">

しっかり見れますね。コメント内容が抽象的すぎたら困ってしまうかもですね。
今回は，コメントアウトを 2 行追加しただけならいい気もします。
通常業務，自分のアプリ作りでは次のことを心がけて作業しています。

## 心がけ
- Commit のコメントの最初にチケット番号などを書くようにする
- Commit のコメント内容は(当然ながら)見てわかるようにする
- Commit はできるだけ分けて修正ごとにするようにする

まぁ当然っちゃ当然ですね。
Redmine や GitLab の MR 内で議論していたらチケット番号はありがたい。
コメント内容がわかりやすければそりゃ嬉しい。
多くの修正が含まれている場合該当箇所を探す際に困ったり，
深刻なバグが見つかったときの修正の際に大幅なコードLOSTもありうる。

## おわりに
今回はコード書いた人がわかる Xcode の Blame 機能について書きました。
素晴らしいコード書く人がいたら尊敬して真似しよう。
バグ修正などで困ったときにチーム内に書いた人がいたら質問しに行ってください。
この記事のために username 新しいの add してしまったのは内緒。

ご覧いただきありがとうございます。
東京都内のいくつかの団体のSSL証明書情報ピックアップ

ちょっとCSRを作るときに、「State or Province Name」のところを「Tokyo」にすべきか「Tokyo-to」にすべきか迷ってしまったので、他の団体がどういう内容で証明書を作っているのかいくつかピックアップして調べてみた。

## 調べ方
```
$ openssl s_client -connect <FQDN>:443 -showcerts 2>&1 | grep "depth=0"
```

## 結果
```
# login.yahoo.co.jp (Yahoo)
depth=0 C = JP, ST = Tokyo, L = Minato-Ku, O = Yahoo Japan Corporation, CN = login.yahoo.co.jp

# msc.sony.jp (SONY)
depth=0 C = JP, ST = Tokyo, L = Minato-ku, O = Sony Marketing(Japan) Inc., OU = ISS DEPT. MSC 2015 04, CN = msc.sony.jp

# splatoon.nintendo.net (Splatoon)
depth=0 C = JP, ST = Kyoto, L = Minami-ku, O = "Nintendo Co., Ltd.", CN = splatoon.nintendo.net

# www.nenkin.go.jp (日本年金機構)
depth=0 C = JP, ST = Tokyo, L = Suginami-ku, O = Japan Pension Service, CN = www.nenkin.go.jp

# www.nttdocomo.co.jp (NTTドコモ)
depth=0 C = JP, ST = Tokyo, L = Chiyoda-ku, O = "NTT DOCOMO, INC.", OU = Strategic Marketing Department, CN = www.nttdocomo.co.jp

# www.odn.ne.jp (ODN)
depth=0 C = JP, ST = Tokyo, L = Minato-ku, O = SOFTBANK TELECOM Corp., OU = Service Platform Operations Department1, CN = www.odn.ne.jp

# digital.asahi.com (朝日新聞)
depth=0 C = JP, ST = Tokyo, L = Chuo-ku, O = The Asahi Shimbun Company, CN = digital.asahi.com

# pid.nhk.or.jp (NHK)
depth=0 1.3.6.1.4.1.311.60.2.1.3 = JP, serialNumber = 0110-05-000968, businessCategory = Private Organization, C = JP, ST = \E6\9D\B1\E4\BA\AC\E9\83\BD, L = \E6\B8\8B\E8\B0\B7\E5\8C\BA, O = \E6\97\A5\E6\9C\AC\E6\94\BE\E9\80\81\E5\8D\94\E4\BC\9A, OU = nhk-pid, CN = pid.nhk.or.jp

(注記)
\E6\9D\B1\E4\BA\AC\E9\83\BD … 東京都
\E6\B8\8B\E8\B0\B7\E5\8C\BA … 渋谷区
\E6\97\A5\E6\9C\AC\E6\94\BE\E9\80\81\E5\8D\94\E4\BC\9A … 日本放送協会
```

必ずしも多数派＝正解というわけではないが、無難策として、とりあえず「Tokyo」「Tokyo-to」で迷った場合は前者で良さそうな感じ（というか後者が見つからなかった）。特殊な例として NHK がなかなか独自路線を行っていて、UTF-8 の日本語情報が埋め込まれていた。
PHPでAmazon API を使い商品画像を取得

Amazon Product Advertising API
を使ってASINから商品画像を取得した時の雑なメモ


## 手順
1. パラメータ設定　[REST リクエストの構造](https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?AnatomyOfaRESTRequest.html)
2. 署名認証　[ RESTリクエストの認証方法](https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?AnatomyOfaRESTRequest.html)
3. URL組み立ててリクエスト
4. Xmlパース



```php

<?php
//ASIN
$asin = 'B013PUTPHK';

//アクセスキー
$access_key_id = '';
//シークレットキー
$secret_access_key = '';
//アソシエイトタグ
$associateTag = '';

//APIエンドポイントURL
$endpoint = 'http://ecs.amazonaws.jp/onca/xml';

// パラメータ
$params = array(
    //共通↓
    'Service' => 'AWSECommerceService',
    'AWSAccessKeyId' => $access_key_id,
    'AssociateTag' => $associateTag,
    //リクエストにより変更↓
    'Operation' => 'ItemLookup',
    'ItemId' => $asin,
    'ResponseGroup' => 'ItemAttributes,Images',
    //署名用タイムスタンプ
    'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
);

//パラメータと値のペアをバイト順？で並べかえ。
ksort($params);

//RFC 3986?でURLエンコード
$string_request = str_replace(
    array('+', '%7E'),
    array('%20', '~'),
    http_build_query($params)
);

//URL分解
$parse_url = parse_url($endpoint);

//署名対象のリクエスト文字列を作成。
$string_signature = "GET\n{$parse_url["host"]}\n{$parse_url["path"]}\n$string_request";

//RFC2104準拠のHMAC-SHA256ハッシュ化しbase64エンコード（これがsignatureとなる）
$signature = base64_encode(hash_hmac('sha256', $string_signature, $secret_access_key,true));

//URL組み立て
$url = $endpoint . '?' . $string_request . '&Signature=' . $signature;


// xml取得
$xml = simplexml_load_string(getHttpContent($url));

$item = $xml->Items->Item;
echo "画像URL：".$item->LargeImage->URL."\n";


function getHttpContent($url)
{
    try {
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
        ]);
        $body = curl_exec($ch);
        $errno = curl_errno($ch);
        $error = curl_error($ch);
        curl_close($ch);
        if (CURLE_OK !== $errno) {
            throw new RuntimeException($error, $errno);

        }
        return $body;
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}



```
Azureで使えるResource Monitoring Serviceまとめ


# これは何？
Azureのリソースモニタリングに使えそうなサービスまとめ。
わざわざお金払わなくてもPortalにリソースモニタリング機能あるやん！って思うかもしれないけど、
現状だと利用しているサービス単位でポータル開いて確認してまわるしかないので非効率。

と、いうわけで、ダッシュボード的に１画面で複数サービスのリソース情報を確認できるサービスを整理しはじめました。

結論を書いちゃうとCloudmonix一択な現状です。

Management API経由にデータを取って自前で作ってもええんやけど
諸事情により社内では実現できない状態なのが悲しみながら調べています。

他にも良いサービスあったら教えてもらえると嬉しいです。



# Service一覧

PricingはWebAppsのBasicプラン以上を監視する場合の最低価格をピックアップしたもの。
ですが、DatadogはWebApps未対応とのこと。

| Service | Pricing | URL |
|:------------:|:------------:|:------------|
| Datadog | Target per $15/mon | http://docs.datadoghq.com/integrations/azure/ |
| New Relic | Target per $40/mon | https://azure.microsoft.com/en-us/marketplace/partners/newrelic/newrelic/?WT.mc_id=ri_azuremp_gtm_newrelic_052015 |
| Cloudmonix | 5 Target per $75/mon | http://cloudmonix.com/features/azure-management/ |





# Azureサービス対応表

| Target | Datadog | New Relic | Cloudmonix | Remark |
|:------------:|:------------:|:------------:|:------------:|:------------:|
| WebApps | x | o | o | |
| Linux VM(IaaS) | o | o | o |  |
| Windows VM(IaaS) | o | ? | o | |
| Cloud Services | x | x | o | |
| SQL Databases | x | x | o | |
| Survice Bus | x | x | o | |
| Azure Storage | x | x | o | |
| Azure Automation | x | x | o | |
| Azure Virtual Networks | x | x | o | |
Chromium OS インストール

この頃はWindowsもUbuntuもChromium OSもUSBフラッシュメモリでインストールできてしまうらしい。

# 前準備
1. [Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)をインストールする。
2. [Chromebook リカバリユーティリティ](https://chrome.google.com/webstore/detail/chromebook-recovery-utili/jndclpdbaamdhonoechobihbbiimdgai?hl=ja)をインストールする。
3. [CloudReady](http://www.neverware.com/free#freedetails)のbinファイルをダウンロードする。

# インストールメディア作成
1. [Chromebook リカバリユーティリティ](https://chrome.google.com/webstore/detail/chromebook-recovery-utili/jndclpdbaamdhonoechobihbbiimdgai?hl=ja)を起動する。
2. 画面右上の設定用の歯車アイコンをクリックする。
3. [ローカルイメージを使用] を選択する。
4. ダウンロードした[CloudReady](http://www.neverware.com/free#freedetails)のbinファイルを選択する。
5. USBフラッシュメモリを挿入し、インストールメディアとして選択する。
6. [続行] > [今すぐ作成]

# PCへのインストール
1. 作成したインストール用USBフラッシュメモリをPCに挿入し、電源をOnにする。

*Note:* BIOS設定のUSB起動が有効になっていないとインストールメディアが起動しない。
2. 起動後、画面右下にある時刻表示部分をクリックする。
3. [Install CloudReady] をクリックする。
4. [Erase Hard Drive & Install CloudReady] をクリックする。

*Note:* インストールの意思を確認するウィンドウが開く。ここから先に進むとHDDの中身が全て消去される。
5. HDDが完全に消去されても問題なければ [Erase & Install] をクリックする。
6. インストールが完了するまで待つ。

# 参考
[lifehacker](http://www.lifehacker.jp/2015/11/151113cloudready_chromebook.html)
Objective-CとSwift2.0でのビット論理和の指定方法

Objective-CとSwift2.0でのビット論理和（OR）の指定方法について備忘録


```objc:Objective-C
NSUInteger flags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday;
```


```swift:Swift2.0
let flags : NSCalendarUnit = [.Hour, .Minute, .Second, .Weekday]
```
Bootstrap3で手軽に上下中央揃えを実現する


## 前提として

- Slim
- Sass
- Compass

を使っています。古いIEでの細かいレイアウトなどは目をつぶっています。

## Bootstrapで上下中央揃えできない..

BootstrapのGridは便利ですが、ちょっと凝ったレイアウトになると、途端に実装どうしようとなりがちですよね。
その１つが上下中央揃えだと思っています。

以下の様に書いても上下中央揃えならない！table-cell使う？と悩んでしまいがちです。

```
.row
  .col-xs-6 // 真ん中にならない。。
  .col-xs-6
```

そういう時は **flex**を使いましょう。

以下のコードを追加します。


```_bootstrap_and_overrides.sass
.row
 &--flex
   +display-flex
   > *
    +align-self(center)
```

これだけで上下中央揃えが実現できます！

## レスポンシブも対応したいんだけど？これだと縮めた時に回りこまなくない？

ごもっともですね。

以下のようにメディアクエリを使うmixinを登録して、指定の幅以下になったときはdisplay: blockにするようにしましょう。

```_mixin.sass

// メディアクエリ
$bootstrap_bp_md: 1199px
$bootstrap_bp_sm: 991px
$bootstrap_bp_xs: 767px

=mq($bp)
  @if $bp == md
    @media screen and (max-width: $bootstrap_bp_md)
      @content
  @else if $bp == sm
    @media screen and (max-width: $bootstrap_bp_sm)
      @content
  @else if $bp == xs
    @media screen and (max-width: $bootstrap_bp_xs)
      @content
  @else
    @media screen and (max-width: $bp)
      @content
```

```_bootstrap_and_overrides.sass
.row
 &--flex
   +display-flex
   &--md
     +mq(md)
       display: block
   &--sm
     +mq(sm)
       display: block
   &--xs
     +mq(xs)
       display: block
```

実際には

```
.row.row--flex.row--flex--sm
```

のようにつかいます。

こんな感じで手軽に実装できました。(display: blockにしているところはflexでもっと綺麗にかけるような気がしています)

## おわりに

Bootstrap4からはflexが実装されるみたいなので、上のようなコードは不要かもしれません。
とはいえ、しばらくBootstrap3なこともあり、わりかし重宝しています。かゆいところに手が届きます。
参考になれば幸いです。
【Rails】コピペでできる！Ajaxローディングの実装


## はじめに

Ajaxでローディングを実装したいということはしばしばあると思います。
が、ローディング画像を探したりどんなコード書けばいいのか少し迷ってしまうのも事実。
なので備忘録的にまとめておくことにしました。
Rails(Slim, Sass, CoffeeScript)で利用しましたが、他でも問題なく使えるかと思います。

## アウトライン

以下のステップでやります。

1. Ajax通信中にloadingの文言が出ることを確認(JS)
2. ローディングgifを用意する パーシャルに切り出す
3. CSSを実装

Ajax通信中はページの上下左右中央にローディングgifが出るイメージです。

## 1. Ajax通信中にloadingの文言が出ることを確認(JS)

Slimで以下の記述をします。
場所はどこでもいいですがレイアウトファイルに書くことにしましょう。

```slim
.loading.js-loading | loading
```

続いてCoffeeScriptに以下を書きます。

```coffee

$ ->

  speed = 300
  $loading = $('.js-loading')

  # Ajax ローディング
  $(document)
    .on 'ajaxSend', ->
      $loading.show()
    .on 'ajaxComplete', ->
      $loading.fadeOut speed

```

※ speedはお好みでOK. Ajax処理中はローディングを表示、終了したらフェイドで消えていくという感じですね。

## 2. ローディングgifを用意する パーシャルに切り出す

さて、これだけだとしまりがありませんね。(文言表示してるだけなので…)
Ajaxといえば、くるくるしたローディング画像でしょう。ということで、探します。

今回は

http://preloaders.net/ から、Floating raysを選択。

![Screen Shot 0027-11-15 at 01.00.24 .png](https://qiita-image-store.s3.amazonaws.com/0/52425/05cdefa0-c93a-555d-2ea6-df162942af7a.png "Screen Shot 0027-11-15 at 01.00.24 .png")

画像、背景色、サイズやスピードなど色々変えられるので要件に応じて変えましょう。

![Screen Shot 0027-11-15 at 01.01.21 .png](https://qiita-image-store.s3.amazonaws.com/0/52425/9e381c37-b67d-87ee-9c03-bdd073f836ab.png "Screen Shot 0027-11-15 at 01.01.21 .png")

変えたらダウンロードしてたあとに、

assets/images以下の共通ディレクトリにloading.gifを入れます。

Slimのコードは以下のような感じに。

```slim
.loading
  = image_tag('common/icons/loading.gif', class: 'img')

```

そしてこれをそのままパーシャルに切っていきます。

今回はいろんな箇所で使うことを想定して、views/partials/_loading.html.slimに追加しました。

## 3. CSSを実装

あとは見た目を整えるだけです。

SMACSSでの利用を想定して、assets/stylesheets/module以下に_loading.sassを作成します。
loading画像のサイズは64px x 64pxを想定しています。

```_loading.sass
.loading
  display: none // はじめは非表示
  height: 100%
  width: 100%
  z-index: 1000
   > .img
    $loading_negative_margin: -32px
    left: 0
    margin:
      top: $loading_negative_margin
      left: $loading_negative_margin
    position: fixed
    top: 0    
    
```

これでページの上下左右中央にローディング画像が出るようになったかと思います。

## 終わりに

ローディング画像を実装するだけでUXはかなり向上されるかと思います。
工数もそこまでかからないので、さくっと実装してみてはいかがでしょうか。
参考になれば幸いです！

## 他参考

special thanks!

http://morizyun.github.io/blog/overlay-loading-image-ajax/
FuelPHPで条件によってバリデーションを追加する方法

# FuelPHPで条件によってバリデーションを追加する方法です。

```php
$val = Validation::forge('xxxx');
$val->add('name', '名前')->add_rule('required');
if ('何か')
{
    $name_field= $val->field('name');
    $name_field->add_rule('max_length', 255);　　　　
}
```
field()メソッドでfieldが取得できるんです。
ツクールMVで書き出したゲーム、暗号化できる？

AdventCalendar前哨戦として投稿します。

ツクールMVかっちゃっていじってます！！

さて表題の件についてです。現時点でソリューションは存在しませんが、できるかできないか、できるならどのように、の観点で書きたいと思います。

#その前に……

***クライアントサイドの暗号化は、かならず破られます。***
暗号化は、データの抽出に時間がかかるか、そうでないかの違いでしかありません。やるひとはやります。
よって、リソースの保護という観点では、あまり意味がありません。

それなのになぜ暗号化するのか？理由はプレイヤ側にあると考えてます。

##簡単に見えたりいじれると萎える
人間安きに流れます。たとえばラスボスの画像が画像ビューアでみえちゃうとなると、みたくなるのが人情というもの。
また、プロジェクト丸見えなため、敵強すぎー！！って思ったら、ちょちょいといじれちゃいます。Lvもいきなり９９です。

これはお互いしょんぼりです。

つまり、暗号化の目的は、 **プレイヤを萎えさせないため** です。

目的を明らかにすることで、とるべき方法の方針も自ずと決まってきます。

* イメージ、音楽は、少なくてもビューアやプレイヤで見えないようにすればよい
* data/以下は、MVのエディタで読めなくすればよい
* スクリプトはぱっとみわからなければいい

#アセットの暗号化
戦略としては二つあります。

##そもそもビューアでみれないようにする
ヘッダをいじったり、ファイルに暗号化をかける方法です。
WebAudioはsourceにArrayBufferを受け取れるため、暗号化を解除するだけでよいですが、画像を読み込むためには一工夫が必要です。

* JavaScriptでデコードを行う

[png-js](https://www.npmjs.com/package/png-js)というものが存在します。速度的に劣るでしょうが、可能です。

* dataURIを使う。

Image.srcにBase64でエンコードしたdataURIを指定します。Base64にエンコードする時間と、ブラウザがBase64をデコードし、pngをデコードする時間が必要です。


##ビューアでみれても無意味にする

ビューアでみれても無意味にする戦略です。画素に対して暗号化を書ける、といえるかもしれません。音楽にこの処理は逆に難しいため、省きます。

* ピクセルに対してxorをかける

乱数のシードをあわせてxorをかければ、ぱっと見無意味な画像にできますし、xorを再度かければ、もとに戻せます。

* ダイス化、あるいはレイヤ化する

画像を細切れにして、読み込み時につなぎ合わせます。ただし、ファイル数自体が増えるため、読み込みに時間がかかります。

#data/以下の暗号化
そもそももとがテキストデータのため、暗号化するにあたって、特に問題は無いでしょう。

#スクリプトの暗号化
まず、Web版では暗号化は無意味です。できますが、暗号化を解除するためにはJavaScriptを記述する必要があるため、コードを読める人にとっては意味がありません。難読化（uglify）はできますが、コードを読めるレベルの人は、その逆変換（beautify）ができることは知ってますので、やはり無意味です。

一方、PC版は、簡単に改造できない形式に変換することができます。[nwjc](https://github.com/nwjs/nw.js/wiki/Protect-JavaScript-source-code-with-v8-snapshot)です。
V8にはスナップショットという、JavaScriptの「環境の状態」を保存する機能があり、それを利用したものです。
ただし、実験的機能であることに注意してください。これを行ったせいで動かなくなる、ということも十分考えられます。

以上が、暗号化の行うための技術的なポインタになります。

#おまけ：ネトゲ化という夢
Web版の場合、ロジックをすべてサーバ側でもてば、改造のたぐいは難しくなるでしょう。
MO並の負荷がサーバにかかるため、これが現実的かといわれると疑問です……。が、面白い題材だと思います！