OmniAICreator/Qiita-1.07M huggingface dataset:
一つ上のPython使いになろう



Pythonという言語についての周辺の理解が深まってきている。
そこで、１つ上のPython使いになろう。


###**きれいなコードを書こう。**

　そのためには次の本が役立つだろう。

 
 [「Effective Python――Pythonプログラムを改良する59項目」](https://www.oreilly.co.jp/books/9784873117560/)

English [Effective Python](http://www.effectivepython.com/)

![表紙](https://www.oreilly.co.jp/books/images/picture978-4-87311-756-0.gif)

参考記事　[Effective Pythonについての記事](http://xaro.hatenablog.jp/archive/category/Effective%20Python3)


## **読みやすいコードを書こう**
[typing --- 型ヒントのサポート](https://docs.python.org/ja/3/library/typing.html)





###**C/C++ プログラムからPythonモジュールを使おう。**
 
 そのためには、次のページの例題を用いてCプログラムからPythonモジュールを読み込む手法を身につけよう。

   [5. 他のアプリケーションへの Python の埋め込み](http://docs.python.jp/2/extending/embedding.html)
   [5. Embedding Python in Another Application](https://docs.python.org/2/extending/embedding.html#embedding-python-in-another-application)

[pybind11 — Seamless operability between C++11 and Python](https://github.com/pybind/pybind11)
C++ はC++11以降を前提としてコーディングしよう。
その状況では、スマートポインタが使えるので、メモリ関係が簡単になる。
C++11を前提とすれば、pybind11が使え、Pythonへのバインディングが格段に簡単になる。



###**Python　スクリプトの実行速度を速くしよう。**

　スクリプトを遅くしてしまいがちなコードをどう書き換えたらよいのか、スクリプトのどこがボトルネックになっているのか、プロファイリングして書き換えるにはどうしたらよいのかが書かれている。

[「ハイパフォーマンスPython」](http://www.oreilly.co.jp/books/9784873117409/)
English [High Performance Python](http://shop.oreilly.com/product/0636920028963.do)

![表紙](http://www.oreilly.co.jp/books/images/picture978-4-87311-740-9.gif)

これらの手法を身につけて、一つ上のpython使いになろう。

-----

ここに書いてあった内容は独立した記事に書き換えました。
[Spyder 統合環境を用いたPythonスクリプトの速度の改善](https://qiita.com/nonbiri15/items/e0fdbae59b4ba51dd9a5)

-----------
付記：

一つ上になりきれていない自分：
ジェネレータ内包で十分な場合に、リスト内包表記を用いてしまう。

　そのような場合の弱点：

- メモリの消費が多くなってしまう。 

    - [Pythonの内包表記（リストとジェネレータ式について）【追記あり】](https://qiita.com/ycctw1443/items/4da894971630810379c0)

    - [pythonの内包表記を少し詳しく](http://qiita.com/y__sama/items/a2c458de97c4aa5a98e7)

    - [『Effective Python』Item 9: 大きなリスト内包表記ではジェネレータ式を検討しよう](http://xaro.hatenablog.jp/entry/2015/04/29/144422)
マイクロサービス否定派が変節した経験

#マイクロサービスとは
マイクロサービスとは読んで字のごとく**小さいサービス**です。小さいサービスを**組み合わせて**、RESTのような**軽い通信でつなぎあわせて**ひとつのサービスを構築することをマイクロサービスアーキテクチャと呼びます。[リンク先スライド](http://www.slideshare.net/iwashi86/micro-service-architecture-46205859)がわかりやすいです。
#マイクロサービスくそくらえ？
私の仕事はERPやCRMといった大きめのシステムが多く、**システム間インタフェースの手間や複雑さに痛い思い**をしていました。その経験から、周りの人がマイクロサービスについて言及していた時に**「馬鹿か!?マイクロサービスくそくらえ」**くらいに思っていました。
#マイクロサービスの良さを知ったきっかけ
最近、IoTの仕組みを構築したのですが、AWSのサービス群を使いました。ひとつひとつの小さなサービスがシームレスに連携していて衝撃を受けました。**「これ、いい :smile: 」**と思わず唸ってしまうほどです。
#こんな感じでマイクロサービスを使ってみました
AWS IoTでセンサーから情報を受け取り、Kinesis Firehose経由でS3へ溜め込みます。Spark使ってS3のファイルを加工すると、そのイベントをLambdaがキャッチしてSlackへ通知を送る仕組みにしました。この仕組を作るのにLambdaで少しコーディングした程度で、**1日もかからずに構築できます**(Sparkは特殊なので除外)。
後日、詳しく掲載しようと思います。
![Micro Serviceon AWS.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/477de442-cedd-9526-da04-a59bf7fc8716.jpeg)
#マイクロサービスの良さと注意点
IoTやらStreamingやらSNS連携やらをJavaなどひとつの仕組で構築するのは厳しいです。しかし、マイクロサービスを使うことで非常に簡単に構築できます(特にクラウド上のサービス)。そして、これらは、**検証でのスモールスタートから本稼働でのスケールアウトが簡単**にできるのが魅力です。
逆に注意点は**全てに対してマイクロサービスを適用するのではなく、モノリシックなサービスを使う部分と分ける**点です。マイクロサービスの良さを知った今でも、ERPをマイクロサービスで構築しようとは思いません(部分的にはありだと思いますが)。ERPでは、ひとつのシステム上でマスタや伝票が統合されている点に強みがあるので、分離していると非常に面倒です。
また、ERPでなくてもやりすぎると大変です。**[「マイクロにしすぎた結果がこれだよ！」](http://www.slideshare.net/mosa_siru/ss-64839846)の経験談は非常に参考になります。**

※[「Amazon S3にドキュメントを置いたらLambda経由でSlackに通知させてみた」](http://qiita.com/FukuharaYohei/items/bf053fc78b4dcb961245)にAmazon S3→Lambda→Slack部分の連携設定・コーディングを追記しました。

※[「[AWS IoT] Kinesis Firehoseに連携しAmazon S3へ保管」](http://qiita.com/FukuharaYohei/items/96699933fa7ff9247739)にAWS IoT→Kinesis Firehose→Amazon S3部分の連携設定を追記しました。
キノコならわかる！Atom atom-term2 を Macで使う

# 何か使いやすそうだ
Atom というテキストエディタが何か面白そう

# Atom内でターミナルも使える？
ターミナルを使うためのパッケージにはいくつかあるようだけど、atom-term2を何となく選択

# ということでパッケージをインストールしようとしたらエラーじゃん
Installing “term2@0.9.21” failed.

# とりあえず動いた
自前でコマンド打ったら動いた。めでたしめでたし。

cd ~/.atom/packages/
git clone https://github.com/f/atom-term2.git
cd atom-term2
apm install
apm link
JavaScriptにおけるthis

##thisとは何か？
thisは関数のスコープ内で有効な値で、実行中の関数を保持しているオブジェクトへの参照

例）

```
var cody = {
  living : true,
  age : 33,
  gender : 'male',
  getGender : function(){ return this.gender; }
};

console.log(cody.getGender()); //出力 : 'male'
```

##thisの値の決まり方
そんなthisの値は呼ばれた時のコンテクストに依存する。


例１）

```
var foo = 'fooA';
var myObject = { foo: 'fooB'};

var sayfoo = function(){
  console.log(this['foo']);
}

//myObjectにsayfooメソッドをもたせ、その内容にsayfoo()関数を与える
myObject.sayfoo = sayfoo;

myObject.sayfoo();  //fooB

sayfoo(); //fooA
```

上記のコード例を実行すると、「オブジェクトを指定すると、そのオブジェクトがもつ'foo'が参照されるが、オブジェクトが指定されないと、グローバルなスコープでのfooが参照されること」がわかる。




例２）
また、入れ子関数内でthisを使用すると・・・

```
var myObject = {
  func1: function(){
      console.log(this);
      var func2 = function(){
        console.log(this);
        var func3 = function(){
            console.log(this);
        }();
      }();
    }
}

myObject.func1();

```


```
結果

Object { func1: myObject.func1() }
Window → file:///C:/Users/hogehoge.html
Window → file:///C:/Users/hogehoge.html

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


この問題を以下のように、スコープチェーンを使うことで解決できる

```
var myObject = {
  myProperty: 'I can see the light',
  myMethod: function(){
    var that = this;
    var helperFunction = function(){
      console.log(that.myProperty);
      console.log(this);
    }();
  }
}

myObject.myMethod();

```

```
結果

I can see the light
Window → file:///C:/Users/hogehoge.html

```

##thisの値をコントロールする

call()もしくはapply()を使うとthisの値をコントロールできる

```
var myObject = {}

var myFunction = function(pram1, pram2){
  this.a = pram1;
  this.b = pram2;
  console.log(this);
}

myFunction.call(myObject, '1','2');//myObjectをthisとしてmyFunctionを呼ぶ
//myFunction.apply(myObject, ['1','2']);
//出力：Object { a: "1", b: "2" }


console.log(myObject);
//出力：Object { a: "1", b: "2" }
//*call(),apply()で関数を呼ぶ際に関数のスコープに設定されるthisの値がオーバーライドされることが確認できる。

```

##まとめ
・thisキーワードは、関数内で使用した場合、関数を保持するオブジェクトを参照する汎用的な手法である。

・thisの値は、関数が呼ばれたコンテクストに応じて関数の実行時に決定される。

・thisをグローバルスコープで使用すると、グローバルオブジェクトを参照する。


##リファレンス
開眼！JavaScript(第６章) (https://www.oreilly.co.jp/books/9784873116211/)
C++11 の User-defined literals で fizzbuzz する

C++11 の [User-defined literals](http://en.cppreference.com/w/cpp/language/user_literal) で fizzbuzz してみます．

【l1048576 様よりご指摘を受け，ソースを修正しました．】

```cpp:fizzbuzz.cpp
#include <iostream>
#include <string>

const std::string operator "" _fb(unsigned long long int x)
{
  if ( !((x % 3) + (x % 5)) ) return "fizzbuzz";
  else if ( !(x % 3) ) return "fizz";
  else if ( !(x % 5) ) return "buzz";
  else return std::to_string(x);
}

int main(int argc, char **argv)
{
  std::cout << 3_fb << std::endl;
  std::cout << 5_fb << std::endl;
  std::cout << 15_fb << std::endl;
  std::cout << 22_fb << std::endl;
  std::cout << 30_fb << std::endl;
  std::cout << 24_fb << std::endl;

  return 0;
}
```

コンパイルと実行

```bash
$ g++ fizzbuzz.cpp -std=gnu++11
$ ./a.out 
fizz
buzz
fizzbuzz
22
fizzbuzz
fizz

```
無償 Upgradeした Windows 10 を再インストールする場合の注意点


# はじめに
2016年7月までの間に Windows 10に無償アップグレードした方も多いと思いますが、再インストールしたい場合もあると思います。

私の場合は、BootCampパーティションにインストールされた Windows 8.1 があったのでそれを Winsdows 10にしておきました。しかし、後になってやっぱり 「Parallelsの仮想環境に入れておけばよかった」と思い、再インストールを行ったのですが、ライセンス認証がうまくいかず、MSサポートのお世話になりました。

以下、覚書を兼ねて私の体験をメモしておきます。

# BootCamp → Parallels
本来であれば BootCampパーティションをそのまま吸い上げて Parallelsの仮想ディスク化できるはずなのですが、「ERROR: Failed to import the virtual machine.」というエラーが出て、うまくいきませんでした。

[Parallelsのサイト](http://kb.parallels.com/jp/115406) などを参照したのですがうまくいかず、再インストールを決意した次第です。

なお、うまく仮想ディスク化できたとしても、環境が大きく変わると Windows 10の再アクティベーションが必要になると思いますので、以下の件は再インストールしていなくても起こっていたのではと思います。

# 無償アップグレードした Windows 10を別環境に再インストールする方法

サポートの方と相談したところ、上記私のケースで、現時点で最も安全な再インストール方法は以下の方法だそうです。
(注：私は結局別の方法を取ってしまったので、検証はまだできていません。この方法で発生したトラブルについては責任を負いかねますのでご注意ください）

- 移行元のWindowsに Anniversary Updateを適用する
- Windowsのアカウントを Microsoftアカウントに紐付ける
	- ローカルアカウントを使っている場合は、「設定」-「アカウント」-「メールとアカウント」から「Microsoftアカウントでのサインインに切り替える」でできるようです
- 移行先にWindows 10を再インストールする
	- プロダクトキーには元のWindows 8のものを入力
	- Windows 10の ISOファイルは[この辺り](https://www.microsoft.com/ja-jp/software-download/windows10ISO)からダウンロードできます
	- おそらく、AnniversaryUpdateまで適用されている必要があると思いますが、最新のISOであれば適用済みと思われます
- 移行先のWindows 10に、Microsoftアカウントでログイン

このようにすることで「このプロダクトキーのWindows 8は Windows 10にアップグレード済みで、このMicrosoftアカウントの所有者に紐づけられている」ということが記録され、別の環境でもライセンスが有効になるようです。もちろん、この場合は元の Windows 10は破棄することが前提のはずです。(両方使い続けた場合にどのような事態になるのかはわかりません)

サポートの方によると、Micorosoftアカウントとの紐付けがされていない場合、別環境に入れた Windows 10は Windows 8のプロダクトキーではアクティベーションできないそうです。7月までであればその時点でもう一度無償アップグレードが適用されたので良かったのですが、今は有償になってしまったので、別途 Windows 10のアップグレードライセンスを購入する必要があるとのことでした。


# 結論

* Anniversary Updateはさっさと適用
* Microsoftアカウントと紐付けておくと色々メリットがあるようなのでやったほうがよさそう
* とはいえ再インストールは慎重に
* MSのサポートはとても優秀でした。変に構えずにありのまま(BootCampとかParallelsとか)をきっちり説明すれば最適な方法を教えてくれます。
	* 今回は[この辺り](https://support.microsoft.com/ja-jp)からチャットでサポートしてもらいましたが、プロダクトキーなどを口頭で伝える必要がないのでとてもスムーズでした。
DBMS_LOB.LOADCLOBFROMFILEプロシージャを使ってテキストファイルを Oracle Database の CLOB型列 に ロードする。

表題の通り、DBMS_LOB.LOADCLOBFROMFILEプロシージャ で
テキストファイル を CLOB型列 に ロードするやで彡(ﾟ)(ﾟ)

まずCLOB型の列を持つテーブルとディレクトリ・オブジェクトを作ります。

```sql
CONNECT AYSHIBAT/xxxxxxxx
CREATE TABLE TEST_CLOB (
    C1 NUMBER
  , C2 CLOB
);
ALTER TABLE TEST_CLOB ADD CONSTRAINT TEST_CLOB_PK PRIMARY KEY(C1) USING INDEX;

CONNECT /AS SYSDBA
CREATE DIRECTORY DIR_AYSHIBAT as '/home/oracle/work/ayshibat';
GRANT READ, WRITE ON DIRECTORY DIR_AYSHIBAT TO AYSHIBAT;
```

テキストファイルをディレクトリ・オブジェクトのパスに置きます。

```shell-session
$ pwd
/home/oracle/work/ayshibat
$ ls -la
total 112
drwxr-xr-x 2 oracle oinstall   4096 Aug 15 11:49 .
drwxr-xr-x 3 oracle oinstall   4096 Aug 15 11:45 ..
-rw-r--r-- 1 oracle oinstall 102000 Aug 15 11:47 test_clob_data.txt
$
```

件数が無いのを確認して、DBMS_LOB.LOADCLOBFROMFILEプロシージャでテキストファイルをCLOB型列に流し込むと……

```sql
SELECT C1, DBMS_LOB.GETLENGTH(C2) FROM TEST_CLOB;

no rows selected

DECLARE
  bfile_p  BFILE;       -- BFILE pointer
  clob_loc CLOB;        -- CLOB locator
  n_c1     NUMBER;      -- TEST_CLOB Column C1
  n_doffs  NUMBER := 1; -- dest_offset
  n_soffs  NUMBER := 1; -- src_offset
  n_lctx   NUMBER := 0; -- lang_context
  n_warn   NUMBER;      -- warning
BEGIN
  -- BFILE pointer set
  bfile_p := BFILENAME('DIR_AYSHIBAT', 'test_clob_data.txt');
  -- Insert record and CLOB locator get
  SELECT NVL(MAX(C1), 0) + 1 INTO n_c1 FROM TEST_CLOB;
  INSERT INTO TEST_CLOB VALUES (n_c1, EMPTY_CLOB())
  RETURNING C2 INTO clob_loc;
  -- File open
  DBMS_LOB.FILEOPEN(bfile_p, DBMS_LOB.FILE_READONLY);
  -- LOAD CLOB from text file
  DBMS_LOB.LOADCLOBFROMFILE(
      clob_loc                   -- CLOB locator
    , bfile_p                    -- BFILE pointer
    , DBMS_LOB.LOBMAXSIZE        -- amount
    , n_doffs                    -- dest_offset
    , n_soffs                    -- src_offset
    , NLS_CHARSET_ID('AL32UTF8') -- BFILE Characterset ID
    , n_lctx                     -- lang_context
    , n_warn                     -- warning
  );
  COMMIT;
  -- File close
  DBMS_LOB.FILECLOSE(bfile_p);
END;
/

PL/SQL procedure successfully completed.
```

件数とバイト数を確認すると、上手く行ったやで彡(^)(^)

```sql
SELECT C1, DBMS_LOB.GETLENGTH(C2) FROM TEST_CLOB;

        C1 DBMS_LOB.GETLENGTH(C2)
---------- ----------------------
         1                 102000
```

マニュアル類(※11gR2版)は下記やで彡(ﾟ)(ﾟ)

> DBMS_LOBパッケージ
> LOADCLOBFROMFILEプロシージャ
> http://docs.oracle.com/cd/E16338_01/appdev.112/b56262/d_lob.htm#i998978
>
> SQL言語リファレンス
> BFILENAME
> http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions019.htm#i76871
>
> SQL言語リファレンス
> EMPTY_BLOB、EMPTY_CLOB
> http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions056.htm#i77384
>
> SQL言語リファレンス
> NLS_CHARSET_ID
> http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions108.htm#i78230
iCloud上のメモが飛んだ場合の復旧方法＆バックアップ方法

#序
先日、いきなりEl capitanのiCloudメモが全死した。
私の場合、Evernoteみたいになんでもかんでもメモに突っ込んでいたので（打ち合わせ内容やプログラム関連のレシピ、URLとかあれこれなんでもかんでも突っ込んでいる）、これが飛ぶとメールが飛ぶぐらいに洒落にならない状態になってしまう。
復旧しようとしたけど、なかなか出来ず、最後は妻からアドバイスをもらい、ついでにそっから検索してある程度の方法論があることがわかったので、ここにまとめることにする。

#注意
読んでいるとわかると思うが、基本的にはOSXのタイムマシンでバックアップしていることが前提である。
してない場合、恐らく復旧はほぼ不可能だと思われる（ここでAppleに噛みついても、恐らく謝罪を述べるだけでなにもしてくれないだろう）。
運が良く、まだメモ関連にトラブルがないのであれば、早々にタイムマシンでバックアップをお勧めする。

#手順
手順としては、次のようなものである。
バックアップする場合は、手順1〜3までを飛ばして手順4から7を行えば問題ない。

1. メモの同期を切る
2. タイムマシンで~/Library/Group\ Containers/group.com.apple.notesのバックアップを正常時から引っ張り出す
3. メモを立ち上げ、復帰していることを確認する
4. 新規に適当なメモを作成する
5. 左メニューから[このMac内]というのがあることを確認する
6. iCloudのメモを[このMac内]に移動する（バックアップの場合はここでコピーしても構わない）
7. メモの同期を行う
8. [このMac内]にあるメモをiCloud内にコピーする（移動でもいいけど、バックアップとして残しておく方が安全）

これで、iCloud上のメモが復旧（バックアップ）しているはず。

#結
ちなみに色々検索してみると私と同じようにいきなりiCloud上のメモが飛んだ人がちらほらいるようだ。
やはり、基本的にはタイムマシンでの日頃バックアップをしておくことが転ばぬ先の杖となるだろうと思われる。
LSTM autoencoderのTensorflow実装

下記の論文において、動画像系列のためのLSTMを用いた教師なし学習が提案された：
Nitish Srivastava, Elman Mansimov, Ruslan Salakhutdinov, "Unsupervised Learning of Video Representations using LSTMs," Proceedings of The 32nd International Conference on Machine Learning, pp. 843–852, 2015.
http://www.jmlr.org/proceedings/papers/v37/srivastava15.html

同論文中、LSTM autoencoderが導入されているが、それをTensorflowで実装した人がいた：
https://github.com/iwyoo/LSTM-autoencoder

これをそのまま使うというよりは、適当にforkして自分なりに改造するのが良いだろう。
オレオレDockerメモ（基本操作編）


## Example

```bash
# -i: 標準入力でコンテナに接続
# -t: 擬似端末を割り当てる
# -v: ホストとコンテナ間でデータ同期
# --rm: コンテナからのデタッチ時にコンテナを削除
# exit でターミナル終了＆コンテナ停止
# ctrl+P+Q 同時押しでターミナル終了＆コンテナ未停止
$ docker run -it --name centos -v /tmp:/tmp --rm centos:7 /bin/bash

# -d: バックグラウンドで起動
$ docker run -d --name background centos:7 ping 127.0.0.1 -c 50
$ docker logs -ft background

# -P: ランダムにポートフォワーディング（ docker ps でポート確認）
# -p: 任意のポートフォワーディング
$ docker run --name nginx -d -p 8080:80 nginx
$ docker exec -it nginx /bin/bash
```

## Commands

```bash
$ docker version

Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      linux/amd64

# ローカルイメージの表示
$ docker images

# イメージの取得
$ docker pull <name>[:tag]

# コンテナの作成と実行
$ docker run [options] <name>[:tag] [command] [args]

# コンテナの一覧
$ docker ps [options]

# コンテナのログ確認（PID1のあらゆる標準出力）
$ docker logs [options] <container>

# コンテナへのアタッチ（PID1のプロセスを操作）
$ docker attash <container>

# コンテナへのプロセス追加（ターミナルを終了してもコンテナ未停止）
$ docker exec [options] <container> <command> [args]

# コンテナの停止
$ docker stop <container>

# コンテナの強制停止
$ docker kill <container>

# コンテナの削除
$ docker rm <container>

# イメージ/コンテナ/タスク の情報を表示
$ docker inspect [options] image|container|task
```
いつの間にか Faker が ポケモンに対応していた

説明しよう。 Faker はダミーデータを作るための ruby gem だ。
このFakerでポケモンの「名前」と「場所」が生成できるようになっていた。

https://github.com/stympy/faker#fakerpokemon

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/5aa21011-2035-c347-55e3-3875533138c7.png)


# 検証: ポケモンは何種類登録されているのか？

```rb
$ gem install faker
$ pry 
```

```rb
[35] pry(main)> require 'faker'
=> true

pokemons = []; 100000.times { pokemons.push Faker::Pokemon.name }; pokemons.uniq.size
=> 149
```

## 結論

149匹。

# ラインナップ

```rb
[4] pry(main)> pokemons = []; 100000.times { pokemons.push Faker::Pokemon.name }; pokemons.uniq.sort
=> ["Abra",
 "Aerodactyl",
 "Alakazam",
 "Arbok",
 "Arcanine",
 "Articuno",
 "Beedrill",
 "Bellsprout",
 "Blastoise",
 "Bulbasaur",
 "Butterfree",
 "Caterpie",
 "Chansey",
 "Charizard",
 "Charmander",
 "Charmeleon",
 "Clefable",
 "Clefairy",
 "Cloyster",
 "Cubone",
 "Dewgong",
 "Diglett",
 "Ditto",
 "Dodrio",
 "Doduo",
 "Dragonair",
 "Dragonite",
 "Dratini",
 "Drowzee",
 "Dugtrio",
 "Eevee",
 "Ekans",
 "Electabuzz",
 "Electrode",
 "Exeggcute",
 "Exeggutor",
 "Farfetch'd",
 "Fearow",
 "Flareon",
 "Gastly",
 "Gengar",
 "Geodude",
 "Gloom",
 "Golbat",
 "Goldeen",
 "Golduck",
 "Golem",
 "Graveler",
 "Grimer",
 "Growlithe",
 "Gyarados",
 "Haunter",
 "Hitmonchan",
 "Hitmonlee",
 "Horsea",
 "Hypno",
 "Ivysaur",
 "Jigglypuff",
 "Jolteon",
 "Jynx",
 "Kabuto",
 "Kabutops",
 "Kadabra",
 "Kakuna",
 "Kangaskhan",
 "Kingler",
 "Koffing",
 "Krabby",
 "Lapras",
 "Lickitung",
 "Machamp",
 "Machoke",
 "Machop",
 "Magikarp",
 "Magmar",
 "Magnemite",
 "Magneton",
 "Mankey",
 "Marowak",
 "Meowth",
 "Metapod",
 "Mewtwo",
 "Moltres",
 "Mr.",
 "Muk",
 "Nidoking",
 "Nidoqueen",
 "Nidoran",
 "Nidorina",
 "Nidorino",
 "Ninetales",
 "Oddish",
 "Omanyte",
 "Omastar",
 "Onix",
 "Paras",
 "Parasect",
 "Persian",
 "Pidgeot",
 "Pidgeotto",
 "Pidgey",
 "Pikachu",
 "Pinsir",
 "Poliwag",
 "Poliwhirl",
 "Poliwrath",
 "Ponyta",
 "Porygon",
 "Primeape",
 "Psyduck",
 "Raichu",
 "Rapidash",
 "Raticate",
 "Rattata",
 "Rhydon",
 "Rhyhorn",
 "Sandshrew",
 "Sandslash",
 "Scyther",
 "Seadra",
 "Seaking",
 "Seel",
 "Shellder",
 "Slowbro",
 "Slowpoke",
 "Snorlax",
 "Spearow",
 "Squirtle",
 "Starmie",
 "Staryu",
 "Tangela",
 "Tauros",
 "Tentacool",
 "Tentacruel",
 "Vaporeon",
 "Venomoth",
 "Venonat",
 "Venusaur",
 "Victreebel",
 "Vileplume",
 "Voltorb",
 "Vulpix",
 "Wartortle",
 "Weedle",
 "Weepinbell",
 "Weezing",
 "Wigglytuff",
 "Zapdos",
 "Zubat"]
```

# 環境

- faker (1.6.6)
- Mac OS X El Capitan









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SDWebImage と PINRemoteImage の速さを比較してみた

## 概要

iOS でよく使用される非同期画像ダウンロードライブラリの [SDWebImage](https://github.com/rs/SDWebImage) と [PINRemoteImage](https://github.com/pinterest/PINRemoteImage)を比較しました。

`SDWebImage` は色々なアプリに使用されていて知っていましたが `PINRemoteImage` は今日知りました。 どっちのほうが良いのかよくわからなかったのでベンチマークを取ってみました。

時間とバッテリー残量が少ないので雑にまとめます。

## 結果

PINRemoteImage の方が高速でした。

下で詳しく下記ますがベンチマークの処理が終わるまでに SDWebImage は 15 ms かかりましたが、 PINRemoteImage では 14ms で終わりました。 微妙な差ですが PINRemoteImage の勝ちです。

また、メモリ使用量が異常に少なかったです。 Xcode のメモリ使用量のところでは正確に計測できていない可能性もありますが、とりあえずメモリは全然使用しませんでした。

## ベンチマークの方法

imagemagick で画像を500枚生成しました。

その画像を nodejs で作ったサーバーをローカルで起動して配信しました。

ベンチマークに使ったアプリはシミュレータで動かしました。

アプリは先程生成した 500枚の画像を4回ダウンロードしてそれにかかった時間を出力するようにしました。

合計で2000枚の画像をダウンロードしていますが、実際はライブラリ側でキャッシュが行われるため501枚目の画像からはネットワーク通信は行われません。

## ソースコード

ベンチマークに使用したプロジェクトはここに公開しました。

https://github.com/mironal/AsyncImageBench

このファイルがベンチマークの全てです。 https://github.com/mironal/AsyncImageBench/blob/master/AsyncImageBench/ViewController.swift


## 詳しい結果

`時間, 終了時のメモリ使用量`

### SDWebImage
 
- 15.459992945194244 ms, 305.4 MB
- 15.180207014083862 ms, 305.9 MB
- 14.194296956062317 ms, 306.4 MB
- 15.525336980819702 ms, 305.5 MB
- 15.591868042945862 ms, 305.4 MB

キャッシュが行われていない状態の時は凄く画面がチラつきました。 その様子は https://youtu.be/8Xu9O-7AmLU にアップロードしてあります。

追記: `SDWebImageDelayPlaceholder` を指定することでチラつかなくなりました。

### PINRemoteImage

- 13.661346018314362 ms, 34.7 MB
- 13.862448990345001 ms, 35.7 MB
- 14.107374012470245 ms, 35.8 MB
- 13.682069957256317 ms, 34.4 MB
- 15.576615989208221 ms, 35.1 MB

SDWebImage のようなチラつきは発生しませんでした。 https://www.youtube.com/watch?v=T0jDrUqnlxU

## まとめ

- PINRemoteImage の方が速くてやけにメモリ使用量が少なかった
- これから選ぶなら PINRemoteImage
- SDWebImage を使ってるプロジェクトも切り替えていきたい
  - API のインターフェースが殆ど同じなので移行は楽そう
MacでRailsアプリケーションをゼロから３分で作る

自分用へのメモを兼ねてMacでRailsアプリケーションをゼロから作る方法を
コマンドベースでシンプルにまとめました。

### XcodeでCommand Line Toolインストール後 Homebrewをインストール
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### Homebrew インストール確認
```
brew -v
```

### rbenvを入れる。rubyのバージョンを管理できるようにするため
```
brew update
brew install rbenv ruby-build
```

### 起動時に自動で初期化できるようにしておく
```
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

### 現在 インストール可能なバージョン等を確認
```
rbenv install -l 
```

### 入れたいrubyバージョンを入れる 
```
rbenv install 2.3.1
rbenv rehash
rbenv global 2.3.1
ruby -v
```

### Powをインストール。railsアプリケーションの動作確認に使用 (WEBrickを使う場合は不要)
```
gem install powder
rbenv rehash
powder install
```

### Railsアプリに必要なgemをインストール
```
gem install bundler
gem install rails
rbenv rehash
```

### Railsアプリケーションを作成。my_rails_appフォルダが作られ、それ以下にファイルが生成されます。
```
rails new my_rails_app
```

### Powを起動し、作ったRailsアプリケーションを動かす。http://my-rails-app.dev　でアクセス可能。 (WEBrickを使う場合は不要)
```
cd my_rails_app
powder link
powder start
```

### WEBrickでRails アプリケーションを動かす localhost:3000で確認可能
```
rails server
```
Railsのmigrationでデフォルト値にbooleanを設定する


# migrationファイルを作るコマンド
```
¥ bin/rails g migration add_default_to_event_hoge_flag
```

# カラムのデフォルト値を変更する方法
```ruby
class AddDefaultToEventHogeFlag < ActiveRecord::Migration
  def change
	change_column_default(:events, :hoge_flag, false)
  end
end
```

ずっとエラーに悩まされた。
`PG::Error: ERROR:  relation "event" does not exist`

Railsのテーブル名は複数形であることを忘れておった。
Eventクラスからコピペしたからテーブル名は絶対に合ってると思ってしまった。

# 変更されたかチェックする
```
¥ bin/rails c
¥ Event.columns
```

2016/8/16日追記しました〜
# rollbackを考慮する
以下を実行すると、一つ前のmigrationの状態まで戻ることが出来るが上の対応だけだとrollbackした時にエラーになる

```
¥ bin/rake db:rollback
==  AddDefaultToEventHogeFlag: reverting ====================================
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

ActiveRecord::IrreversibleMigration
ActiveRecord::IrreversibleMigration: ActiveRecord::IrreversibleMigration

Tasks: TOP => db:rollback
(See full trace by running task with --trace)
```

なので、`up`、`down`を使って処理を書き直します

```ruby
class AddDefaultToEventHogeFlag < ActiveRecord::Migration
  # db:migrateした時に実行される処理
  def up
    change_column_default(:events, :hoge_flag, false)
  end
  # db:rollbackした時に実行される処理
  def down
    change_column_default(:events, :hoge_flag, nil)
  end
end
```

これで上手くいくようになりました。
AngularJS 1.5 componentベースの作業手順まとめ

# 久しぶりに触ると、もう忘れてる

忘れると、動かないのでメモメモ
AngularJSの本家のチュートリアルは1stepずつ教えてくれて親切だが、手順・記法・設計の最終形をまとめてくれると超ありがたいのに…（天下のGoogleさん！お願いします）

### module用のフォルダを作る
- module-name.component.js
- module-name.module.js
- module-name.template.html
- module-name.component.spec.js (unit test)

ファイルの命名は、小文字をハイフンつなぎだ

### moduleを上位のmoduleに登録する

```moduleParent-name.module.js
angular.module('moduleParent', [
    'ngRoute', etc,
    'moduleName'
]);
```
＃ここで、moduleNameは、moduleChildNameと同じ意味

moduleの命名規則はcamelCaseだ


### moduleの呼出タグを、上位のモジュールのhtmlに組み込む

```parentmodule-name.template.html
<module-name></module-name>
```
タグの命名規則は、ハイフンつなぎだ

### module用のフォルダにあるjsファイルを、＜head＞を読み込むindex.htmlのようなレイアウト大元のhtmlで読み込む

```index.html
<head>
  <script src="module-name/module-name.module.js"></script>
  <script src="module-name/module-name.component.js"></script>
</head>
```

これを忘れがちだ（忘れてた）
イベント伝播の知識


デモ：http://codepen.io/mo4_9/pen/LkqJZJ

```html:最下層にdiv3のDOM構造
<div id="div1">#div1
  <div id="div2">#div2
    <div id="div3">#div3</div>
  </div>
</div>
```

```javascript
var div1 = document.getElementById('div1');
var div2 = document.getElementById('div2');
var div3 = document.getElementById('div3');

div1.addEventListener('click', () => {
  console.log('#div1.');
});
div2.addEventListener('click', () => {
  console.log('#div2. stopPropagation()してない');
});
div3.addEventListener('click', e => {
  console.log('#div3. stopPropagation()してる');
  e.stopPropagation(); // イベントの伝播を止める
});
```


## イベント伝播の3フェーズ

海に潜って浮上してくるイメージ

### 1.capture phase

上層から下層へイベントを伝播させていく

`window -> document -> ... -> div3`

### 2.target phase

イベントターゲット＝もっとも下層にある要素 に到達

`div3`

### 3.bubbling phase

下層から上層へイベントを評価していく

`div3 -> div2 -> ... window`


## useCapture

addEventListener()の第三引数
capture phaseでイベントを評価するかどうかの設定

### false

**bubbling phase**（フェーズ3）でイベントが評価される（＝イベント発火が遅い）

`div3 -> div2 -> div1`

これがデフォルト

### true

**capture phase**（フェーズ1）でイベントが評価される（＝イベント発火が早い）

```javascript
div1.addEventListener('click', () => {
    // ...
}, true);
```
なら `div1 -> div3 -> div2` になる


## e.stopPropagation();

capture phaseでイベント伝播を止める


> 参考
[JavaScript再入門](https://app.codegrid.net/series/mastering-javascript)
[UI Events W3C Working Draft, 26 July 2016](https://w3c.github.io/uievents/)
スロークエリログの設定

my.cnfに以下を追記

```
[mysqld]
.
.
.
.


log_slow_queries
long_query_time = 1
slow_query_log_file=mysql-slow.log
log-queries-not-using-indexes

```

datadirに記述されたディレクトリにlogが生成される。
long_query_timeに設定した時間以上に処理に時間が掛かったログが出力される。
※上記は1秒
Cocos2d-x Android build　エラー対処方法

http://lethargysyndrome.blog.fc2.com/blog-entry-38.html

ビルドターゲットをAndroid6（APIレベル23）の状態のまま対応する方法です。

エラーの原因はorg.apache.http.Headerとorg.apache.http.message.BasicHeaderが存在しないため発生しています。
これらのクラスはapacheが提供しているクラスで、Android5.1.1まではandroid.jarの中に同梱されていました。
しかし、Android6.0になったタイミングでapacheのクラスは必要最低限のものしか格納されていません。
Cocos2d-xのライブラリはそれに対応されていないため、自分で対応する必要があります。
対応といってもCocos2dxDownloader.javaを書き換えることはしません。
足りないものを追加するだけです。

org.apache.http.Headerとorg.apache.http.message.BasicHeaderはapacheのHttpCoreライブラリに入っているので
下記のサイトからHttpCoreをダウンロードします。
HttpClientも動作に必要になると思われるので一緒にダウンロードしてください。
http://hc.apache.org/downloads.cgi
（※2016/01/27時点のバージョンはHttpCoreは4.4.4でHttpClientは4.5.1）

ダウンロードしたファイルの中にあるhttpcore-4.4.4.jarとhttpclient-4.5.1.jarを下記の場所に配置。

■プロジェクトの言語が、C++の場合
(※ cocos new TestApp -p com.name.cocos2dx.testapp -l cpp -d xxxxxx このコマンドで、プロジェクトを作成した場合)
[../プロジェクト/cocos2d/cocos/platform/android/java/libs]

■プロジェクトの言語が、JavaScriptの場合
(※ cocos new TestApp -p com.name.cocos2dx.testapp -l js -d xxxxxx このコマンドで、プロジェクトを作成した場合)
[../プロジェクト\frameworks\cocos2d-x\cocos\platform\android\java\libs]
Load Balancer(ELBなど)にぶら下げたDocker Private Registryで、docker pushが`blob upload unknown`になる場合の設定


ほか、症状としてはすぐ`Retrying...`などになっちゃう。

これの解決方法はログにでている。
`http.secret`をコンフィグファイルにセットするか、`REGISTRY_HTTP_SECRET`を環境変数で指定しましょうとのこと。

> level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.6.3 instance.id=xxxx version=v2.5.0


指定がなければ起動時にそれぞれがランダム生成しちゃうのね。なるほど。

そしてセットした。

```
$ docker push reg.example.com/sawanoboly/ubuntu:latest
The push refers to a repository [reg.example.com/sawanoboly/ubuntu]

...

latest: digest: sha256:f92c2bec713942c44219e8bd513c255543c9acda764ccabbe3f940eca696e97e size: 1151
```

Push成功した。
【go】json.Numberからintに変換する

一応以下でできました

```go:main.go
package main

import (
    "encoding/json"
    "fmt"
)

func myfunc(num json.Number) {
    id, _ := num.Int64()
    fmt.Print(int(id))
}
```

int64に変換できるのがポイントです。
数値型にも色々あってちゃんと理解してないとはまりますね。
Go言語のgormでORMしてみた（単純CUD編）

# 前提
- Go言語そのものに慣れていない
- MySQLはVagrantで適当にCentOS6.6に構築
- [単純検索](http://qiita.com/y-kishibata/items/954f13e3beba3851180f)ぐらいはできるようになった

# 今回のTODO
- 登録・更新・削除できるようになる
- トランザクション制御ができるようになる
- 登録時のPKを取得する

## いざ実践！
- 概略は理解した（つもり）なので、サンプルを見ながら実装
	- [Gorm#Transactions](http://jinzhu.me/gorm/advanced.html#transactions)
	- [Gorm#Create](http://jinzhu.me/gorm/curd.html#create)
	- [Gorm#Update](http://jinzhu.me/gorm/curd.html#update)

### 問題点
- 登録時のPKを取得数方法がわからない
	- tx.Create の戻り値の中に Value があるが、interface{} でリフレクションしたくない

## 解決策
- 検索結果をstructに変換するメソッドで解決できた
	- [Gorm#Scan](http://jinzhu.me/gorm/curd.html#scan)

```golang:db_connection2.go
// DBアクセスsample2.go
package main

import (
	"fmt"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	ID    uint64 `gorm:"primary_key"`
	Email string `gorm:"type:varchar(255);"`
	Name  string `gorm:"type:varchar(45);"`
}

func main() {
	db, err := gorm.Open("mysql", "testuser:testuser@/go_sample?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic("failed to connect database")
	}
	// テーブル名が複数系でない場合、これを指定すること
	db.SingularTable(true)

	// 実行ログ出力
	//	db.LogMode(true)

	// 最新のIDを取得してインサートすると見せかけてロールバックする
	var user User
	var id uint64 = lastPrint(db, user)

	tx := db.Begin()

	var sid = fmt.Sprint(id)
	user = User{Email: "sample@" + sid + "test.com", Name: "Name" + sid}
	savePrint(tx, user)

	tx.Rollback()

	// 更新されていないことを確認
	lastPrint(db, user)

	tx = db.Begin()
	id, err = savePrint(tx, user)
	// 本来はエラーならロールバック
	tx.Commit()

	// 更新されていることを確認
	lastPrint(db, user)

	// 更新メソッドが実行されることを確認
	tx = db.Begin()
	user.ID = id
	savePrint(tx, user)
	tx.Commit()

	// レコードが追加されていないことを確認
	lastPrint(db, user)

	// 削除されることを確認
	tx = db.Begin()
	tx.Delete(user)
	tx.Commit()

	// 削除されていることを確認
	user.ID = uint64(0)
	lastPrint(db, user)
}

func lastPrint(db *gorm.DB, user User) uint64 {
	var count int
	db.Last(&user).Count(&count)
	if count == 0 {
		fmt.Println("該当レコードなし")
	} else {
		fmt.Println("id:" + fmt.Sprint(user.ID))
	}
	return user.ID
}

// 本当は Save を使えば事足りるはず
func savePrint(tx *gorm.DB, user User) (uint64, error) {
	// 戻り値用の変数定義
	var rId uint64 = 0

	// PKを設定しないと true を返すらしい
	if tx.NewRecord(user) {
		fmt.Println("\t新規レコードです。")
		result := tx.Create(&user)
		if result.Error != nil {
			return rId, result.Error
		}

		// 追加したIDが欲しい場合、Scanで元の形に変換する
		result.Scan(&user)
		sid := fmt.Sprint(user.ID)
		fmt.Println("\t新規追加したID:" + sid)
		rId = user.ID
	} else {
		fmt.Println("\t更新レコードです。")
		rId = user.ID
		result := tx.Model(&user).Update(&user)
		if result.Error != nil {
			return rId, result.Error
		}
		sid := fmt.Sprint(user.ID)
		fmt.Println("\t更新したID:" + sid)
	}
	return rId, nil
}
```

## 残課題
- 件数をわざわざ取得しないで存在しないチェックを行いたい
	- ID == 0 でも良いけれど、美しくない
- 検索条件の初期化の際に ID = 0 以外の方法を探す

# TODO
- 複雑な検索結果の取得
- リレーションの貼り方、概念的な整理
- ソースの自動生成
node.jsのrequestモジュールでContent-Type: application/jsonのHTTP POSTリクエストを行う

# 背景

FCM (Firebase Cloud Messaging) を利用してプッシュ通知を行う Android/iOS アプリを作成したので、node.js の request モジュールを利用して FCM Server への HTTP POST リクエストを行い動作確認しようとしたところ、期待したメッセージが届かない。。。

# FCM Server リクエストフォーマット

https://firebase.google.com/docs/cloud-messaging/server より

```text:HTTP-header
Content-Type: application/json
```

```json:json-example
{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
```


# 失敗例

```js:bad.js
var request = require('request');

require('date-utils');
var date = new Date();
var dateString = date.toFormat("YYYY-MM-DD HH24:MI:SS");

var url = 'https://fcm.googleapis.com/fcm/send';
var serverkey = 'AIzaSyZ-1u...0GBYzPu7Udno5aA';
var token = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';

// data payload
var data = {
  message: 'Hello!',
  date: dateString
};

// HTTP header
var headers = {
  'Content-Type': 'application/json',
  'Authorization': 'key=' + serverkey
};

// request options
var options = {
  url: url,
  method: 'POST',
  headers: headers,
  form: {
    'to': token,
    'data': data
  }
};

request(options, function (error, response, body) {
  if (body) {
    console.log(body);
  }
  if (error) {
    console.log(error);
  }
});
```

## 実行結果

Anddroid アプリで受け取ったメッセージのdataを確認したところ、下記のようにkeyに```]```がついている。

```
{message]=Hello!, date]=2016-08-12 22:45:45}
```

## 送信したHTTPリクエストの確認

localhost 宛にリクエストを送信しパケットキャプチャで確認したところ、以下のようなリクエストを送信していた。

```http
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: key=SERVER_KEY
host: localhost:3000
content-length: 83
Connection: keep-alive

to=DEVICE_TOKEN&data%5Bmessage%5D=Hello%21&data%5Bdate%5D=2016-08-12%2022%3A39%3A47
```

Content-Type が ```application/x-www-form-urlencoded``` になっており、body も JSON になっていない。。。


# 成功例

request options に ```form``` ではなく、```json``` を利用する。

```js:good.js
var request = require('request');

require('date-utils');
var date = new Date();
var dateString = date.toFormat("YYYY-MM-DD HH24:MI:SS");

var url = 'https://fcm.googleapis.com/fcm/send';
var serverkey = 'AIzaSyZ-1u...0GBYzPu7Udno5aA';
var token = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';

// data payload
var data = {
  message: 'Hello!',
  date: dateString
};

// HTTP header
var headers = {
  'Content-Type': 'application/json',
  'Authorization': 'key=' + serverkey
};

// request options
var options = {
  url: url,
  method: 'POST',
  headers: headers,
  json: {
    'to': token,
    'data': data
  }
};

request(options, function (error, response, body) {
  if (body) {
    console.log(body);
  }
  if (error) {
    console.log(error);
  }
});
```

## 実行結果

```
{date=2016-08-12 22:46:11, message=Hello!}
```

## HTTP リクエスト

```http
POST / HTTP/1.1
Authorization: key=SERVER_KEY
host: localhost:3000
accept: application/json
content-type: application/json
content-length: 78
Connection: keep-alive

{"to":"DEVICE_TOKEN","data":{"message":"Hello!","date":"2016-08-12 22:41:36"}}
```

# おわりに

ちゃんとドキュメントを読みましょう。
https://github.com/request/request
Unity2D: Make a screenshot of any part of your screen 

###Tips:
- set up your camera
  1. Create a camera in your scene
  2. Render Mode of Canvas - Screen Space Camera, choose the camera you just created
- the input of saveImage() is the Gameobject that you want to make screenshot of (e.g. a panel)

<pre>
	public Camera camera;
	RenderTexture renderTexture;

	public void saveImage (GameObject go) {
		float width = Screen.width + go.GetComponent<RectTransform>().offsetMax.x - go.GetComponent<RectTransform>().offsetMin.x;
		float height = Screen.height - go.GetComponent<RectTransform> ().offsetMin.y + go.GetComponent<RectTransform> ().offsetMax.y;
	
		renderTexture = new RenderTexture (Screen.width, Screen.height, 0);
		camera.targetTexture = renderTexture;
		camera.Render ();

		RenderTexture.active = renderTexture;
		Texture2D virtualPhoto =
			new Texture2D((int)width, (int)height, TextureFormat.RGB24, false);
		// false, meaning no need for mipmaps
		virtualPhoto.ReadPixels( new Rect(go.GetComponent<RectTransform>().offsetMin.x, 
			go.GetComponent<RectTransform>().offsetMin.y, 
			width, height), 0, 0);

		RenderTexture.active = null; //can help avoid errors 
		camera.targetTexture = null;
		// consider ... Destroy(tempRT);

		byte[] bytes;
		bytes = virtualPhoto.EncodeToPNG();
		//saveToCloud or
		//File.WriteAllBytes(Application.dataPath + "/img/SavedScreen.png", bytes);
</pre>
XcodeでiPhoneデバイスが認識しなくなった場合の対処法


>ある日急に、iPhoneのデバイスが認識しなくなりXcodeやMacBook本体、iPhone本体などを再起動させても認識してくれなくなり、備忘録も兼ねて対処方法を記載します。


##手順
1. Xcodeを閉じる
2. USBケーブルを抜く
3. 下記のコマンドを実行する

    ```bash
    $ sudo pkill usbmuxd
    ```
    $マークまでコピーすると上手く動きませんのでお気をつけ下さい。

4. Xcodeを起動する
5. USBケーブルを接続する

##参考サイト
[stackoverflow - Xcode doesn't see my iOS device but iTunes does -](http://stackoverflow.com/questions/10087985/xcode-doesnt-see-my-ios-device-but-itunes-does)
MySQL クライアントでコードポイントと文字の相互変換


概要
----

MySQL 組み込みの関数を使ってコードポイントから表示される文字を調べるもしくは文字からコードポイントを調べることができます。MySQL クライアントで照合順序によって文字が一致するかどうかを調べるときに便利です。具体的な例は[こちらの記事](http://qiita.com/masakielastic/items/5559c50632a82da82e26)をご参照ください。

前提
----

ターミナルもしくはコマンドラインの文字集合は UTF-8 とします。

文字集合と照合順序を指定する
------------------------

ターミナルもしくはコマンドラインで表示するために文字集合を指定します。`utf8mb4` は絵文字に対応しています。

```sql
SET NAMES 'utf8mb4';
```

照合順序も一緒に指定できます。

```sql
SET NAMES 'utf8mb4' COLLATE utf8mb4_unicode_520_ci;
```

文字からコードポイントを求める
-------------------------

`CONVERT` 関数で utf32 に変換して `HEX` 関数でバイト列を求めます。

```sql
SELECT HEX(CONVERT("あ" USING utf32));
```

「あ」の場合、`00003042` が得られますので、コードポイントは U+3042 となります。

コードポイントから文字を求める
-------------------------

`CHAR` 関数で `utf32` のバイト列をつくります。表示の際には自動的に変換されます。

```sql
SELECT CHAR(0x3042 USING utf32);
```


文字から UTF-16 のサロゲートペアのコードポイントを求める
------------------------------------------------

UTF-16 の場合、U+10000 とそれ以降の文字はサロゲートペアによって表現されます。U+1F42C (イルカ) を試してみましょう。

```sql
SELECT HEX(CONVERT(CHAR(0x1F42C USING utf32) USING utf16));
```

結果は `D83DDC2C` になるので、上位サロゲート、下位サロゲートのコードポイントはそれぞれ U+D83D と U+DC2C です。

UTF-16 のサロゲートペアのコードポイントから文字を求める
----------------------------------------------

`CHAR`関数を使います。上位サロゲート、下位サロゲートがそれぞれ U+D83D と U+DC2C の場合、次のリテラルを使います。

```sql
SELECT CHAR(0xD83DDC2C USING utf16);
```

次の表記も可能です。

```sql
SELECT CHAR(x'D83DDC2C' USING utf16);
```

文字から UTF-8 のバイト列を求める
----------------------------

UTF-8 のバイト列を求めるのに `HEX` 関数を使います。

```sql
SELECT HEX("あ");
```

結果は `E38182` になりますので、文字リテラルは `0xE38182` になります。

```sql
SELECT 0xE38182;
```

UTF-8 のバイト列からコードポイントを求める
-----------------------------------

U+3042 (「あ」)の UTF-8 のバイト列は 0xE3 0x81 0x82 であらわされるので、文字リテラルは `0xE38182` です。`CONVERT` 関数で UTF-32 に変換して、`HEX` 関数でバイト列を求めます。

```sql
SELECT HEX(CONVERT(CHAR(0xE38182 USING utf8mb4) USING utf32));
```
邊を表示する

[異字体セレクタ](https://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF)を試してみる。

細かく調査するほどの気力もないので[この記事](http://itpro.nikkeibp.co.jp/article/COLUMN/20110124/356398/)や[この仕様](http://unicode.org/reports/tr37/)をざっと眺めて、あとは雑にPythonでUnicodeのvariation selector部分を「邊」のU+908Aに繋げて実際の挙動を見てみる。

```py3
>>> for i in range(0, 17): print("\u908A" + chr(ord("\U000E0100") + i))
```

OS X El Capitan + iTerm2 + Python 3.5.2 + Monaco

<img width="506" alt="スクリーンショット 2016-08-15 15.35.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/14365/9a148578-9877-77d5-f17c-c8306d24d95d.png">

Windows 10 + Python 3.5.2

<img width="718" alt="スクリーンショット 2016-08-15 15.33.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/14365/aedaa2a1-4a7e-4d05-31e1-cd9ac99fa75b.png">

Windows 10 + IDLE (Python 3.5.2)

<img width="568" alt="スクリーンショット 2016-08-15 15.34.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/14365/1fe3b3e6-c377-f8ba-c4c2-76c4451e3f24.png">

Windowsの方はターミナルの設定の関係で論外になってしまったが、どちらにしても適正なエンコーディングを指定し、良いフォント(モリサワのフォントあたりか)を使えば良好な結果を得られるに違いない。
docker を使って nginx.conf の挙動を確認する

nginx のバージョン毎に、nginx.conf の挙動を調べたくて、docker を使ったらとても楽だった、という話

## 前準備

docker が使えるようになっているのは当たり前として、nginx イメージを pull しておく。ここではとりあえず latest 

```
$ docker pull nginx
```

## デフォルトのコンフィグをコピーする

docker image に含まれるコンフィグを手元にコピーする

```
$ docker run -d --name hoge nginx
$ docker cp hoge:/etc/nginx/nginx.conf nginx.conf
$ docker kill hoge
$ docker rum hoge
```

## nginx.conf を指定して nginx を起動する

```
$ docker run --rm -v `pwd`/nginx.conf:/etc/nginx/nginx.conf:ro -p 8080:80 nginx
$ open http://localhost:8080/
```

## 同じコンフィグを他のバージョンで試してみる

```
$ docker pull nginx:1.10
$ docker run --rm -v ./nginx.conf:/etc/nginx/nginx.conf:ro -p 8080:80 nginx:1.10
```
BPM 

WEB内でOSを共有して
設計をもとにしながら話せば、いろいろ変わると思う。

いろんな国の技術者と人と話したいな。
これだと夢ができると思う。

http://bpm999.com/bpm%E3%83%81%E3%83%A3%E3%83%83%E3%83%88/
スクリーンリーダーでのAndroidアプリ開発 = 失敗&惜しかった編

ここでは前回の記事
<dl>
<dt>スクリーンリーダーを使ってのAndroidアプリ開発</dt>
<dd><a href="http://qiita.com/yama_1983/items/0cbfd73a9912009288f6">http://qiita.com/yama_1983/items/0cbfd73a9912009288f6</a></dd>
</dl>
の番外編として残念ながらうまくいかなかった例を紹介します。

JAVA SDKとAndroid SDKは必須になるので、それにプラスして何を使ったかということを記載します。


<h2>Eclipse編</h2>
最も一般的な開発環境かと思われます。
事前の情報の通り、動作が重たいことと、細かな部分での読み上げがないことから使用をやめました。

<h2>Ruby</h2>
RubyモジュールとAndroid SDKの要件がどうしても合いませんでした。
<dl>
<dt>Rubyを利用してAndroidアプリを開発する [Androidアプリのプログラミング] All About</dt>
<dd><a target="blank" href="http://allabout.co.jp/gm/gc/444206/">http://allabout.co.jp/gm/gc/444206/</a></dd>
</dl>

<h2>Monaca</h2>
ウェブ上でもローカルでもHTML5とJavaScriptで開発ができるというのは魅力的でした。
しかし、プロジェクトはなんとか作成できたものの、肝心なエディタが使えませんでした。

<h2>Visual Studio 2015</h2>
こちらは実際に開発を始めるまでに至りませんでした。
インストールの段階でコンポーネントを選択するときに、どれがチェックされたのかがわかりませんでした。
そのため全てをインストールしたのですが、パソコンの容量が足りず環境をととのえることができませんでした。
補足: Visual Studio 2017はコンポーネントを選択できましたので、時間を作って試してみるつもりです。

<h2>Visual Studio Code</h2>
動作も軽くメニュー周りの読み上げもまずまずでした。
しかし、エディタにおいてカーソルで文字を追ったときに読み上げのずれがあり、使用には至りませんでした。
補足: 2018年1月現在の最新バージョンでは改善されています。

<h2>HSP3Dish</h2>
これが一番惜しい方法でした。
HSPは私が普段Windowsのプログラムを開発している言語です。
HSP3Dishはその拡張版で、Android・iOS・JavaScriptのアプリ開発をサポートしています。
Android NDKとApache Antが追加で必要ですが、HSPで開発ができるのが魅力的でした。
開発途中ということもあり、使える機能に制限があります。
2016年8月現在
日本語でのメッセージ表示
入力ボックスの表示
などができません。
実際に.apkを作成して動かしてみました。
ダイアログの表示はできるのですが、printで表示した内容をタッチで読み上げることができませんでした。
これはアクセシビリティ機能の1つで、画面をなぞりその内容を知ることができるというものが、print命令に対して働いていないようでした。
現在も開発が進んでいますので、このHSP3Dishには今後十分期待できると考えています。
<dl>
<dt>HSP3Dishサポートページ</dt>
<dd><a target="blank" href="http://hsp.tv/make/hsp3dish.html">http://hsp.tv/make/hsp3dish.html</a></dd>
<dt>Explore by touch in TalkBack - Android Accessibility Help</dt>
<dd><a target="blank" href="https://support.google.com/accessibility/android/answer/6006598?hl=en">https://support.google.com/accessibility/android/answer/6006598?hl=en</a></dd>
</dl>
Unityのline rendererで絵を描く


###1.set up a default renderer
<pre>
		defaultRenderer = gameObject.GetComponent<LineRenderer>();
		defaultRenderer.material = new Material (shader);
		defaultRenderer.SetVertexCount (0);
		defaultRenderer.SetWidth (0.1f, 0.1f);
		defaultRenderer.SetColors (Color.green, Color.green);
		defaultRenderer.useWorldSpace = true;
</pre>
###2.create a panel to draw on
<pre>
		panel = GameObject.Find ("DrawingPanel");
</pre>
###3.the main code in Update()
<pre>
		if (Input.GetMouseButtonDown (0)) {
			//to check if this line renderer is used. If it is, create a new line renderer(on a new Gameobject)
			//(so that more than 1 lines can be rendered)
			if(!used){
				used = true;
				isMousePressed = true;
				defaultRenderer.SetVertexCount (0);
				pointList.RemoveRange (0, pointList.Count);
			}else if(!newCreated){
				//to draw more than 1 lines, we have to create a new gameObejct
				GameObject newRenderer = GameObject.Instantiate (rendererPrefab);
				newCreated = true;
				newRenderer.GetComponent<DrawLine> ().init(id+1);
			}
		}
		if (Input.GetMouseButtonUp (0)) {
			isMousePressed = false;}
		if (isMousePressed) {
			mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
			mousePos.z = 0;
			if (Input.mousePosition.x < panel.GetComponent<RectTransform>().offsetMin.x || 
				Input.mousePosition.x > (Screen.width + panel.GetComponent<RectTransform>().offsetMax.x)){ 
				return;
			}
			//To draw just in the area of panel
			if (Screen.height - Input.mousePosition.y < (-panel.GetComponent<RectTransform>().offsetMax.y) || 
				Screen.height - Input.mousePosition.y > (Screen.height - panel.GetComponent<RectTransform>().offsetMin.y)){ 
				return;
			}
			if (!pointList.Contains (mousePos)) {
				pointList.Add (mousePos);
				defaultRenderer.SetVertexCount (pointList.Count);
				defaultRenderer.SetPosition (pointList.Count - 1, (Vector3)pointList [pointList.Count - 1]);
			}
		}
</pre>
git逆引きメモ

#gitでバージョン管理を始めたい
```
$ git init
```

#作業履歴を記録したい（commitしたい）
作業履歴のstageへの追加

```
$ git add ファイル名
```
or

```
$ git add .
```

作業履歴の記録

```
$ git commit
```

#ブランチを作成したい
```
$ git branch ブランチ名
```

#ブランチを移動したい
```
$ git checkout ブランチ名
```

#ブランチを作成し、そこに移動したい
```
$ git checkout -b ブランチ名
```



#コミット履歴を見たい
```
$ git log
```

#作業ディレクトリをコミット履歴に反映させたい
```
$ git checkout .
```


#コミット履歴、ブランチを視覚的に確認したい
C#でWebAPI叩いてJson形式の結果を受け取る処理メモ

※C#初心者なのでメモです

### 環境

- .NET Framework 3.5

4.0 からはDynamicJSONが使えるらしい


using追加
----------------------------

```csharp
using System.IO;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Web.Script.Serialization
```


データコントラクト定義
----------------------------

```csharp
[DataContract]
public class RequestResult
{
    [DataMember]
    public string data1 { get; set; }
    [DataMember]
    public string data2 { get; set; }
    [DataMember]
    public string data3 { get; set; }
    [DataMember]
    public string data4 { get; set; }
}
``` 


実処理
-------------------------------

```cs
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://example.com/api/hoge");
    req.ContentType = "application/json";
    req.Method = "POST";

    using (var streamWriter = new StreamWriter(req.GetRequestStream()))
    {
        string jsonPayload = new JavaScriptSerializer().Serialize(new
        {
            hoge = "APIを",
            piyo = "叩く際に渡す",
            foo = "パラメータ"
        });
        streamWriter.Write(jsonPayload);
    }

    HttpWebResponse res = (HttpWebResponse)req.GetResponse();
    RequestResult result;
    using (res)
    {
        using (var resStream = res.GetResponseStream())
        {
            var serializer = new DataContractJsonSerializer(typeof(RequestResult));
            result = (RequestResult)serializer.ReadObject(resStream);
        }
    }
```

参考
-------------------------------------------------

- http://stackoverflow.com/questions/9145667/how-to-post-json-to-the-server
- https://msdn.microsoft.com/ja-jp/library/bb412179(v=vs.90).aspx
- https://msdn.microsoft.com/ja-jp/library/cc668800(v=vs.90).aspx
- https://msdn.microsoft.com/ja-jp/library/system.io.streamwriter(v=vs.110).aspx
- https://msdn.microsoft.com/ja-jp/library/system.net.httpwebresponse.getresponsestream(v=vs.110).aspx
- http://posnum.hatenablog.com/entry/2014/09/19/233255
- http://www.sonnagaya.com/entry/20140704/1404434783
- http://argius.hatenablog.jp/entry/20131113/1384352397
iPhoneをMacに接続した時、自動で写真アプリが開かれないようにするワンライナー

#iPhoneをMacに接続した時、自動で写真アプリが開かれないようにする。

Terminal.appを開いて下記をペースト。
```
$ defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool YES
```

デフォルトに戻すには末尾の"YES"を"NO"に変更してペーストするだけ
```
$ defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool NO
```

以上。
SonarQube を docker-compose で起動する

[SonarQube](http://www.sonarqube.org) の立ち上げは、 `docker-compose` を利用してインストールするのが手軽。

## docker のインストール

まずは `docker` をインストールする。

CentOS の場合

```sh
$ sudo yum -y install docker
```

Mac の場合

```sh
$ brew cask install docker
```

## docker-compose のインストール

`docker-compose` を `pip` からインストールする。

```sh
$ sudo pip install docker-compose
```

## docker-compose の実行

以下のURLに貼られている yml から `docker-compose.yml` を作成する。
https://github.com/SonarSource/docker-sonarqube/blob/master/recipes.md

yml と同じ階層で、以下のコマンドを実行する。

```sh
$ docker-compose up -d
```

オプションの `-d` はデーモンで起動するという意味。
オプションを外すとフォアグラウンドで実行される。

## 動作確認

ブラウザで 9000 番を指定して、 SonarQube のトップページが表示されていれば OK。
TortoiseGitの右クリックメニューに好きなアクションを追加できない時の対処

## はじめに

TortoiseGit（トータスギット）便利で使っているんですが（特にRevision Graphが好き）、Gitリポジトリで

```
右クリック（コンテキストメニュー） → TortoiseGit → Git pull
```

と、「TortoiseGit 」の階層の奥に行くのが微妙に面倒です。

## コンテキストメニューにアクションを追加する

で、TortoiseGitにはコンテキストメニュー（右クリック）に直接Gitのアクションを追加する設定があって、

1. Gitリポジトリフォルダでコンテキストメニューを開く
2. TortoiseGit → Setting → General → Context Menu
3. 好きなアクションにチェックを入れる

を使えば、

```
Gitリポジトリフォルダで右クリック（コンテキストメニュー） → Git pull
```

とか直接呼び出せて便利です。

## 追加できない時がある

気持ち良く好きなアクションを追加してて気づくのですが、一部のアクションだけコンテキストメニューに持ってこれません。

で、これを追加には、サブのコンテキストメニューからアクションを除外してやれば良いです。

例：Git switch/checkout... をコンテキストメニューに追加する場合

1. Gitリポジトリフォルダでコンテキストメニューを開く
2. TortoiseGit → Setting → General → Set Extend Menu Item
3. Git switch/checkout...のチェックを外す
4. TortoiseGit → Setting → General → Context Menu
5. Git switch/checkout...のチェックを入れる

これで

```
Gitリポジトリフォルダで右クリック（コンテキストメニュー） → Git switch/checkout...
```

的な感じでコンテキストメニューに表示されるようになります。
Oracle限定 indexを再ビルドするためのコマンドを自動？作成【ネタ】

# 書いた理由
将来の自分に向けたメモ書き

# 考えた理由
インデックス領域が壊れたのでインデックス全般を再ビルドする必要があったが、コマンドを作るのが面倒だった。

# SQL
status <> 'VALID' 条件を入れると、壊れているもののみが抜き出される。
全部やり直す時はwhere条件は不要。

```sql
select 'alter index ' || INDEX_NAME || ' rebuild tablespace ' || TABLESPACE_NAME || ';' 
from USER_INDEXES 
-- where  status <> 'VALID'
order  by INDEX_NAME
```
node.js + Express ３分でゼロからアプリケーション構築

node.js とフレークワークexpressの開発環境/アプリケーション の構築手順はいろいろあると思いますが、コマンドベースでシンプルにまとめてみました。

### NVM (Node Version Manager)のインストール
```
git clone https://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
```
### Nodeの安定版のインストール(偶数が安定板で 奇数が開発版) 
```
nvm install 0.12.7
node -v
```

### ターミナル起動時に反映されるように
```
nvm alias default v0.12.7
echo 'if [[ -s ~/.nvm/nvm.sh ]];'　>> ~/.bash_profile
echo '  then source ~/.nvm/nvm.sh' >> ~/.bash_profile
echo 'fi' >> ~/.bash_profile
```

### アプリケーションのディレクトリ作成
```
mkdir my_node_app
cd my_node_app
```

### ディレクトリ直下でexpress ジェネレータ導入
```
npm install express-generator -g
```
### express ジェネレータ実行
```
express .
```
### 依存関係インストール
```
npm install
```

### アプリケーションスタート
```
npm start
```

### アクセス
```
http://localhost:3000
```
選択的にテストを実行する

# やりたいこと

テストの部分集合のみを実行したい場合、例えば時間がかかるテストを普段はスキップし、指定した場合のみ実行したい。一つの方法としては、ファイル単位で分割してファイル名で区別できるようにしておき、 unittest モジュールの discovery のオプション

```
% python -m unittest --help
      ...
  -p pattern       Pattern to match test files ('test*.py' default)
```

を使って実現出来るが、ここでは

* ファイル名によらずに制御したい
 * 実行対象の分類が変わったときにテストコードの移動をしたくない
* ファイル単位での分割をしたくない
 * ファイル内の一部のクラス、一部のメソッドのみをスキップできるようにしたい

といったときの対処例を示す。

# やりかた

unittest モジュールの skipIf, skipUnless デコレータを使う。例えば

```py:util.py
import unittest

run_slowtest = False


def slowtest(target):
    return unittest.skipUnless(run_slowtest, "Slow Test")(target)
```

のようにデコレータ関数を定義しておいて、class や method に付与しておく：

```py:test_sample.py
import unittest

from util import slowtest


@slowtest
class TestA(unittest.TestCase):
    def test_a(self):
        pass


class TestB(unittest.TestCase):
    @slowtest
    def test_b(self):
        pass
```

普通に実行すると対象のテストはスキップされる：

```shell-session
% python -m unittest discover .
ss
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK (skipped=2)
```

全部実行したい場合は次のようにする：

```shell-session
% cat runner_full.py
import unittest

import util

util.run_slowtest = True
unittest.TestProgram(argv=['', 'discover'])
% python runner_full.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
```