OmniAICreator/Qiita-1.07M huggingface dataset:
Prestoで100万レコードを生成するクエリ

Presto（に関わらず）で、何百万レコードのデータをとりあえず出力したいときがある。
例えば、100万件からある機能が使えるようになるとか使えないとかそんなのをチャチャッと確かめたいとか。

そんな時は下記のクエリを実行する。

```
SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n + 10000*tensthousands.n + 100000*hundredsthousands.n
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tensthousands(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundredsthousands(n)
ORDER BY 1
```

すると、100万件が生成される。
![](https://i.gyazo.com/19102d346d19d9f50bfe02fc35f5f6e3.png)
PythonでHTTP通信

PythonでHTTP通信する方法のメモ。
(Python3系対象)

#HTTP通信ライブラリ
[Dive Into Python 3](http://diveintopython3-ja.rdy.jp/http-web-services.html)ではPython標準の「[urllib.request](http://docs.python.jp/3.5/library/urllib.request.html)」を使う方法とサードパーティの「[httplib2](https://github.com/httplib2)」を使う方法が紹介されており、httplib2が推奨されているが、自分はなるべく純正を使いたい派で、かつhttplib2でしか使えないような機能を必要としていないので、とりあえずurllib.requestを使って試してみる。

#urllib.requestでGET
urllib.requestモジュールのurlopen関数を使用。引数にURLを指定するだけ。リクエストパラメータはエンコードが必要なければURLの後ろに「?param1=value1&param2=value2」のように書けばOK。

レスポンスは[http.client.HTTPResponse](http://docs.python.jp/3.5/library/http.client.html#http.client.HTTPResponse)オブジェクトが返ってくるので、read()関数でレスポンスボディを取得する。

試しに[株式会社アイビス](http://www.ibsnet.co.jp/)さんが提供している[郵便番号検索API](http://zipcloud.ibsnet.co.jp/doc/api)を叩いてみる。

```lang:http_get.py
import urllib.request

with urllib.request.urlopen("http://zipcloud.ibsnet.co.jp/api/search?zipcode=4200855") as res:
    html = res.read().decode("utf-8")
    print(html)
```

# リクエストパラメータのエンコーディング
リクエストパラメータに日本語などが含まれる場合はエンコーディングをする必要がある。「[urllib.parse](http://docs.python.jp/3/library/urllib.parse.html)」モジュールのurlencode()関数で簡単にできそう。引数は辞書型で、複数項目が格納されている場合は自動的に&でつないだパラメータ文字列になる。(先頭の?は付かない)

前述の郵便番号検索のパラメータをこの方法で指定するように修正。(ASCIIだけなのでエンコードの必要はないのだけれど…)

```lang:http_get2.py
import urllib.request
import urllib.parse

#リクエストパラメータをエンコード
params = {"zipcode":"4200855"}
encodedParams = urllib.parse.urlencode(params)

#エンコードしたリクエストパラメータを付加してAPIコール
with urllib.request.urlopen("http://zipcloud.ibsnet.co.jp/api/search?" + encodedParams) as res:
    html = res.read().decode("utf-8")
    print(html)
```
pingを受け取ったかを確認する

pingを打ってパケットが返ってくるのはわかるけど、このIPアドレスでいいんだっけ？というのを確かめたいので、送信先で確かめたい。
→送信先でtcpdumpを使えばおｋ。

Vagrantで立ち上げたUbuntuにpingを送る例で考える。

ゲストOSでifconfigでIPアドレスを調べる。


```
guest$ ifconfig
:
eth1      Link encap:Ethernet  HWaddr 08:00:27:29:40:3f
          inet addr:192.168.33.10  Bcast:192.168.33.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe29:403f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13041 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7831 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1019013 (1.0 MB)  TX bytes:628251 (628.2 KB)
:
```

192.168.33.10であることがわかる。

ホストOSでpingを打つ。

```
host$ ping 192.168.33.10
PING 192.168.33.10 (192.168.33.10): 56 data bytes
64 bytes from 192.168.33.10: icmp_seq=0 ttl=64 time=0.395 ms
:
```

ゲストOSでtcpdumpする。`-i`でインターフェースを指定しないとループバック(127.0.0.1)を除くもっとも小さい番号で有効になっているものが選ばれるので、なにも来てなかったらインターフェースを確認する。
引数にicmpを指定すると、pingのエコー要求とエコー応答が見られる。

```
guest$ sudo tcpdump -i eth1 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
13:33:32.169761 IP 192.168.33.1 > 192.168.33.10: ICMP echo request, id 45906, seq 0, length 64
13:33:32.169808 IP 192.168.33.10 > 192.168.33.1: ICMP echo reply, id 45906, seq 0, length 64
:
```

ホストOSでtcpdumpすると、エコー応答が見られる

```
host$ sudo tcpdump icmp
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes
22:38:35.319694 IP 192.168.33.10 > 192.168.33.1: ICMP echo reply, id 45906, seq 302, length 64
:
```

こちらもインターフェースを指定するとエコー要求が見られる（指定しない時は何を見ている？）。

```
host$ sudo tcpdump -i vboxnet0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vboxnet0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:42:30.216089 IP 192.168.33.1 > 192.168.33.10: ICMP echo request, id 45906, seq 536, length 64
22:42:30.216375 IP 192.168.33.10 > 192.168.33.1: ICMP echo reply, id 45906, seq 536, length 64
:
```

ちなみに応答だけ見たいときは

```
$ sudo tcpdump 'icmp[0] == 0'
```

要求だけ見たいときは

```
$ sudo tcpdump 'icmp[0] == 8'
```

とすることができる。orで指定することも可能。

```
$ sudo tcpdump  'icmp[0] == 0 or icmp[0] == 8'
```

`tcpdump`を`grep`してもなかなか表示されないので、`-l`オプションを使う。`-l`オプションをつけるとラインバッファになって、行ごとに出力してくれる。

```
$ sudo tcpdump -l | grep echo
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
14:03:51.093896 IP 192.168.33.1 > 192.168.33.10: ICMP echo request, id 45906, seq 1812, length 64
14:03:51.093935 IP 192.168.33.10 > 192.168.33.1: ICMP echo reply, id 45906, seq 1812, length 64
:
```

## 参考資料

* [tcpdumpでicmpをフィルタする - Qiita](http://qiita.com/todanano/items/1991638f7b3ad35ee633)
* [tcpdump でパイプに渡すときは -l する - Qiita](http://qiita.com/albatross/items/0f429a7ffa7fae9b21f2)
* [Man page of TCPDUMP](http://linuxjm.osdn.jp/html/tcpdump/man1/tcpdump.1.html)
* [ICMPタイプ](http://www.asahi-net.or.jp/~aa4t-nngk/ipttut/output/icmptypes.html)
# Webで地球地図データ(標高第1.1版)を使う。－(その２:QGISでGeoTiff化する)

# Webで地球地図データ(標高第1.1版)を使う。－(その２:QGISでGeoTiff化する)

[Webで地球地図データ(標高第1.1版)を使う。－(その１:BILをBMP化する)](http://qiita.com/Helicobacter_pylori/items/e51f2c202d4efefddc19)の続きになります。

先日(その１)を投稿した時点では、大昔の自分の経験から色々自前でやるつもりでしたが、改めて最新の情報を調べていたら以前より環境が整っていることが判明。
今更ですが、現状を調べつつ、少し方向修正して進めます。

|ソフト等|バージョン|備考|
|:------|:--------|:---|
|地球地図データ(標高第1.1版)|gm-jpn-el_1_1.zip|[国土地理院－地球地図日本のデータ](http://www.gsi.go.jp/kankyochiri/gm_jpn.html)よりダウンロード。|
|QGIS|2.14.2-Essen|OSGeo4Wをインストールして使用|

**(2016/5/9 0:00追記：その2投稿後、BILを一括して処理する方法が分かったので大幅に修正しました。)**

## BILをGeoTiffに変換

(その１)の後半でPowerShellを作りましたが、今ならQGISで出来そうなので、ググりながら挑戦。
結果的に前回のPowerShellは不要になりました。

以後、OSGeo4Wの各種ツールを使います。
インストールについては省略しますが、ググれば大体判ると思います。

OSGeo4Wのシェルを起動し、カレントディレクトリをBILファイルがあるフォルダに移動します。
![680134e6-598b-d740-70ec-018fd9c347da.png](https://qiita-image-store.s3.amazonaws.com/0/111541/a5bf6ad0-a94f-2e68-0b74-22c8e212d9dc.png)

次のコマンドで、フォルダ内の全BILファイルからmerged.VRTファイルを作ります。
> gdalbuildvrt --config GDAL_CACHEMAX 1024 merged.vrt *.bil

参考までに、QGISでmerged.VRTを表示したのが以下になります。
![glay.png](https://qiita-image-store.s3.amazonaws.com/0/111541/aa26a496-a21c-1ba6-89e8-b870177eb32e.png)

次にこれをカラー化するための設定を用意します。
OSGeo4Wをインストールしたフォルダ内の、apps\qgis\python\plugins\GdalTools\toolsにある、terrain.txtを、現在のOSGeo4Wシェルのカレントにコピーします。
この内容はデフォルトでは以下のようになっており、高度帯毎の色設定です。見てのとおり単純な設定ですので、好みに合わせて調整が可能です。

```terrain.txt
-11000 0 0 0
-500 0 0 30
-100 0 0 200
-1 150 150 255
0 0 120 0
100 0 150 0
270 90 165 90
300 90 175 90
500 50 180 50
500 70 170 70
1000 70 145 75
1000 70 155 75
2000 150 156 100
2800 220 220 220
3000 255 255 255
8850 255 255 255
nv white
```

先ほど作った、merged.VRTと、用意したterrain.txtから、次のコマンドでmerged.tifを作ります。
> gdaldem color-relief merged.vrt terrain.txt merged.tif -of GTiff

QGISでmerged.TIFを表示したのが以下になります。
![all.png](https://qiita-image-store.s3.amazonaws.com/0/111541/7015114b-1abb-066a-8119-87a094d898d9.png)

## 参考

特に参考になったページ等を以下に挙げさせていただきます。
* [FOSS4Gを利用したWebでの地理空間情報公開入門](http://www.slideshare.net/waigania13/foss4gweb-26222691)
* [大きなラスタファイルをタイル化して画面の拡大縮小を高速化する-Digital Pad](http://kmr-hryk.azurewebsites.net/?p=441)
* [gdal2tiles.pyでコケるパターンの対処法-smellman's Broken Diary](http://smellman.hatenablog.com/entry/2014/10/15/004927)
[AngularJS] ngRepeatとngSrcとimagesLoadedとmasonry

```html:HTML
<ul ng-repeat="item in collection">
    <li item>
        <img ng-src="{{item.src}}" item-img>
    <li>
</ul>
```

```js:AngularJS
.directive('item', function() {
    var container = angular.element('ul');
    return {
        link: function( scope ) {
            if( scope.$last ) {
                container.masonry({
                    /* options */
                });
            }
        }
    };
})

.directive('itemImg', function() {
    var container = angular.element('ul'); // これまとめる方法ないかな
    return {
        link: function( scope, element ) {
            element.imagesLoaded().always( function() {
                container.masonry('layout');
            };
        }
    };
})
```
jupyterで独自moduleをimportするには

sys.pathには以下が入っている

```
import sys
sys.path

['',
 '$HOME/anaconda3/lib/python35.zip',
 '$HOME/anaconda3/lib/python3.5',
 '$HOME/anaconda3/lib/python3.5/plat-linux',
 '$HOME/anaconda3/lib/python3.5/lib-dynload',
 '$HOME/anaconda3/lib/python3.5/site-packages/Sphinx-1.3.5-py3.5.egg',
 '$HOME/anaconda3/lib/python3.5/site-packages/setuptools-20.3-py3.5.egg',
 '$HOME/anaconda3/lib/python3.5/site-packages',
 '$HOME/anaconda3/lib/python3.5/site-packages/IPython/extensions',
 '$HOME/.ipython']

```

なので、上記にimportするpython moduleをおけばimportできる。
一番簡単で最適なのは、

.ipython

なので、そこにcopyする。
Macアプリ NSUserDefaultsリセット出来る defaults コマンド


iOSアプリじゃなくて、Macアプリを開発している時にNSUserDefaultsを使っていて、どうやってリセットすればいいんだ…と悩んでドキュメント見たら `defaults` コマンドなるものがあったのでメモ。これでデバッグがはかどります。

指定アプリの登録されているNSUserDefaultsを見るコマンド。

```
$ defaults read com.example.app（アプリのIdentifier）
{
  "hoge" = "piyo";
}
```

指定アプリの全てのキーを削除するコマンド。

```
$ defaults delete com.example.app
```

最後にキーを指定すれば、それだけ消せます。

```
$ defaults delete com.example.app hoge
```

あまり使うことはないですが、書き込みもできます。

```
$ defaults write com.example.app hoge piyo
```
RaspberryPi2でROSを使う一番楽な方法

#結果だけ知りたい人向け
Raspberry Pi 2にUbuntu Mate 16.04を入れておく．
apt-getでROS Kineticが普通にインストール出来ます(｀・ω・´)

---
#ROSとは
今をときめくロボット制御・分散処理用ライブラリ
https://www.youtube.com/watch?v=uMZ-9CB7mtQ

#環境
Raspberry PI 2
Ubuntu 16.04 Mate
ROS Kinetic Kame

#手順
## Ubuntuのインストール
ラズパイ用のUbuntu Mate 16.04のイメージをmicroSDにリストア
起動後，GUIに従って初期設定
https://ubuntu-mate.org/raspberry-pi/

## ROSの環境構築
ROSのインストール
以下のコマンドをラズパイ上で実行する

```bash
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116
sudo apt-get update
sudo apt-get install ros-kinetic-ros-base
```
http://wiki.ros.org/kinetic/Installation/Ubuntu


`~/.bashrc`の書き換え
外部と通信を行う場合は`localhost`を適宜IPアドレスに書き換える

```bash
echo "source /opt/ros/kinetic/setup.zsh" >> ~/.bashrc
echo "export ROS_MASTER_URI=http://localhost:11311" >> ~/.bashrc
echo "export ROS_HOSTNAME=hocalhost" >> ~/.bashrc
```
変更を適用

```bash
source ~/.bashrc
```

ROSのセットアップ完了！！

## 動作テスト
普通のPCにインストールしたときと同じように使えます．
`roscore`なり`rostopic list`なりでドウゾ

---
---
---
---
### 作業中に発見した謎の書き残し
リポジトリを追加してなくても，何故かROSのパッケージが存在してインストールも出来る

```
$ sudo apt-get install ros-base
```

しかし，入ったけどこれがどのバージョンなのかよく分からない
`debian`とかいう謎バージョンが入っている
(普通はココが`indigo`,`kinetic`とかになる)

```
$ rosversion -d
> debian
```
ESMじゃんけん大会を解いてみた


問題 : https://gist.github.com/kunitoo/76b1d56cc6ffeef9bb62 
経緯とか : http://qiita.com/kunitoo/items/d39c5337d400ad53f224

ruby で解いてみました。35分。

```ruby
def winner(a, b)
  count = a.first.size.lcm( b.first.size )
  w=nil
  ha = a.first * count
  hb = b.first *  count
  count.times do |ix|
    if ha[ix] != hb[ix]
      w=case ha[ix]+hb[ix]
      when "RS", "SP", "PR"; a
      else; b
      end
      break
    end
  end
  w ||= b
  [w[0], w[1]-1]
end

def solve_core(s0)
  s=s0.dup
  loop do
    ix=(s.size-1).times.find{ |x|
      s[x].last==s[x+1].last
    }
    s[ix,2] = [winner( s[ix], s[ix+1] )]
    return s[0][0] if s.size==1
  end
end

def solve_impl(s)
  max_match = Math.log2(s.size).ceil
  min_match = Math.log2(s.size).floor
  rest = (s.size - 2**min_match)*2
  m = [min_match]*(s.size-rest)+[max_match]*rest
  solve_core( s.zip(m).reverse )
end

def solve( s )
  r=solve_impl(s.scan( /\(([^\)]+)\)/ ).to_a.flatten)
  "("+r+")"
end

def test( s, expected )
  actual = solve(s)
  ok = actual==expected
  puts [ ok ? "ok" : "**NG**", s, actual, expected ].join(" ")
end


test("(RSP)(R)(RPS)(SP)", "(RPS)")
test("(RPS)(R)(RSP)(SP)(RSSP)", "(RSSP)")

```

35分経った時点でのコード。 test の大半は省略。
最初方針を間違えてロスしたのがくやしい感じ。

リファクタリング前の状態とはいえ、メソッド名が悲惨。すいません。

やっている処理は：
`"(RPS)(R)(RSP)(SP)(RSSP)"` のような入力を普通に字句解析してから、残り試合数と zip して reverse して、
`[["RSSP", 3], ["SP", 3], ["RSP", 2], ["R", 2], ["RPS", 2]]`のようにする。
reverse はしなくていいかもしれないんだけど、右から戦うほうがわかりやすいかなと思って。

あとは、残り試合数が同じ人同士を戦わせることを繰り返せば良いという寸法。

`a.first * count` のところは長くし過ぎだけどどんまい。剰余で書いたほうがよかったね。


楽しめました。
ありがとうございます。
[deviseのエラー]undefined error 'serialize_from_sessions'

# エラー
ほとんどのdeviseのメソッドが使えなくなった。そのメソッドを使うと
`undefined error 'serialize_from_sessions' for`というエラーが出る。

# 原因
user modelの記述がおかしい。

```lang:user.rb
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
```
の記述がまるまる抜けてた。
ビットマップフォントで遊ぶ：ドット絵用フォントをつくってみる

ビットマップフォントで遊ぶシリーズのさらに続きです。前回まで。

* [フォントに絵文字を入れ込む](http://qiita.com/harayoki/items/b08cb02533497425df04)
* [未定義文字をトウフで埋める](http://qiita.com/harayoki/items/f52217f0401bf4ba9a37)

今回は、扱うすべての文字を絵文字（色つきの四角）に置き換えて、ドット絵パターンを表示してみます。しかし、いったいなんの役に立つのか。。は最後にまとめてます。

<img width="190" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/8302/bfcfc783-1a36-6384-5244-200cce7bef78.png">
さて、これはなんでしょう？ 正解はこれもまた下の方に。

# フォントを0から作る
Bitmap Fontを生成する際には、コンストラクタの引数にXMLが必要です。XMLを書くのは結構めんどいので、自作のUtilクラスでは、そのあたりを隠蔽して簡単にフォントが作れるようにしました。

```sample.as
//BitmapFontUtil.createEmptyFont("フォント名" ,フォントサイズ,
//   lineHeight(任意), スムージングフラグ(任意);
var font:BitmapFont = BitmapFontUtil.createEmptyFont("hoge" ,12, 12, false);
```

lineHeightとスムージング設定はあとから設定可能です。このフォントに前回のように画像を登録してやります。

```sample.as
// Aに画像を登録する場合
var texture:Texture = _assetManager.getTexture("Aのテクスチャ名");
BitmapFontUtil.addBitmapCharToFont(
    font, BitmapFontUtil.createBitmapCharByTexture("A", texture));
```

今回の場合は16色のカラーチップ画像（テクスチャを節約するためによく使われるテクニックで、べた塗り作るときに引き伸ばして使うやつ）をテクスチャに用意してあるので、"0"~"E"までに登録してやります。
<img width="77" alt="スクリーンショット 2016-05-07 20.38.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/fc78c1c2-4bb3-dcdb-ef34-c2327c42a39a.png">

これでできたフォントを先ほどの、文字テキストに適用すると。。

# できあがり

<img width="143" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/8302/140318fc-739e-bdce-92df-c95683f68dd3.png">
あっ！

さらに横の余白とラインハイトを調整して、隙間を0にすると

<img width="144" alt="スクリーンショット 2016-05-07 18.34.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/87a0639b-1970-1083-07eb-a652ff5c0c5e.png">
あっ！

// 一応、キャラパターンのソースは以下になります。

```sample.as
var chara:String = [
	"000888888000",
	"008888888880",
	"00CCCAACA000",
	"0CACAAACAAA0",
	"0CACCAAACAAA",
	"0CCAAAACCCC0",
	"000AAAAAAA00",
	"00CC8CCC0000",
	"0CCC8CC8CCC0",
	"CCCC8888CCCC",
	"AAC8A88A8CAA",
	"AAA888888AAA",
	"AA88888888AA",
	"008880088800",
	"0CCC0000CCC0",
	"CCCC0000CCCC",
].join("\n");
```

#何に使えるのか？

ドット絵表示するには無駄が多くて使えませんね（笑）。0からフォントを作る参考にやってみたのですが、これ、[マップチップ](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E3%83%9E%E3%83%83%E3%83%97%E3%83%81%E3%83%83%E3%83%97)表示には使えるかもしれません。RPGとかシューティングゲームのマップをキストエディタでちゃちゃっと書いて(本格的にやるならTiledとか専用ツールを使うんでしょうが)テ、そのままデータとして使うという。テキスト１発表示でおわので、パフォーマンスも悪くなさげですよ。書き換えが激しい場合は、専用シェーダーとか用意するのがベストですけども。

実際に動くソースはこちらにあります。
https://github.com/harayoki/-qiita1/blob/dot_marix/src/StarlingMain.as

#余談
Starling2.0から組み込みのミニマムビットマップフォント（フォント名MINI)が画像埋め込みでなく、画像データもソース直書きになっています。Embedすると、mx.coreパッケージが必要になっちゃうからとのことです。細かい修正が素晴らしい。
https://github.com/Gamua/Starling-Framework/blob/master/starling/src/starling/text/MiniBitmapFont.as

![title-logo.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e5ec0dbf-fb12-2fde-46d2-3c36f3b9e234.png) ＜たぶん終わるクエー
Pythonでopensslに依存したライブラリでエラーが出た時の対策


# 情報

## Python

```
$ python --version
```

=> `Python 2.7.11 :: Continuum Analytics, Inc.`


## Django

```
$ python -c "import django; print(django.get_version())"
```
=> `1.9.6`

## OSX

```
$ sw_vers
```

=> 

```
ProductName:	Mac OS X
ProductVersion:	10.10.5
BuildVersion:	14F1605
```

# トラブルシューティング

`pip install mysqlclient`したあとに、`python manage.py migrate`を実行した以下のエラーが出た

```
Library not loaded: libssl.1.0.0.dylib
```

また、

`pip install djangorestframework`したときも

```
ImportError: cannot import name HTTPSHandler
```

どちらも、opensslのライブラリのリンクに問題がある

## 解決

ということで、再インストールした

```
$ brew install openssl
$ brew link openssl --force
$ brew uninstall python
$ brew install python --with-brewed-openssl
```

もう一度実行

```
$ python manage.py migrate
```

以下の結果が出ればOK

```
Operations to perform:
  Apply all migrations: admin, contenttypes, auth, sessions
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying sessions.0001_initial... OK
```

djangorestframeworkのほうもう一度

```
$ pip install djangorestframework
```

以下の結果が出ればOK


```
Collecting djangorestframework
  Downloading djangorestframework-3.3.3-py2.py3-none-any.whl (662kB)
    100% |████████████████████████████████| 665kB 542kB/s 
Installing collected packages: djangorestframework
Successfully installed djangorestframework-3.3.3
```

# 参考資料

http://stackoverflow.com/questions/25372911/python-pip-error-on-osx
データサイエンス領域の役立つブログをまとめる（海外 & 日本）

データサイエンス関連の海外の著名なブログたちを蒐集していきます。（随時更新）
他にオススメとかコメントあれば是非下さい

five thirty eight
http://fivethirtyeight.com/

> [シグナル&ノイズ](http://www.amazon.co.jp/dp/4822249808)や選挙予想で著名、ネイト・シルバーさんのブログ。社会的な出来事、特に政治やスポーツなどを統計やグラフを使って解説するブログ。
ちなみにmatplotlibのスタイルには「FiveThirtyEight」というオプションが有るほどで、グラフの色使いなどで注目されている模様。

no free hunch
http://blog.kaggle.com/category/arena/
> Kaggleの公式ブログ
話題は幅広く、手法の話から業界の人材動向の話、Kaggleの宣伝的な話題なども。
   
> 個人的にはこのScikitlearnのチュートリアルシリーズがなかなかよさ気と思っている
http://blog.kaggle.com/tag/scikit-learn-tutorial-series/

Insight Data Science Blog
http://www.insightdatascience.com/blog/
> Insight Data Scienceという、データサイエンティスト養成プログラムで参加者たちのインサイトを集めたブログ。
いろんな人のいろんな切り口の投稿があっておもしろい
多業種のケーススタディ的なものがショートにたくさん載っているので読み物としてもオススメ


KDnuggets
http://www.kdnuggets.com/
> なんとなく気になってクリックしたくなるようなタイトルの記事が満載の、データサイエンス界のロイター通信的存在（適当）

Analytics Vidhya 
http://www.analyticsvidhya.com/blog/
> 話題は雑多


Wes Mckinney
http://wesmckinney.com/
> Pandasの開発者であり、[Pythonによるデータ分析入門](https://www.oreilly.co.jp/books/9784873116556/)の著者でもあるWes Mckinneyさんのブログです

Practical Business Python
http://pbpython.com/
> Pythonについて、プログラミング言語としての側面でなく、データ分析をする際の（タイトル通り）プラクティカルな使い方について触れることが多いブログ。「プログラミング言語としてのPythonはどうでもいいから、ただPythonを使ってデータ分析をしたいんだよハゲ」という人に向いてるかも

FasrML
http://fastml.com/
> タイトル通りカジュアルにML(機械学習)を学ぼうというブログ

Linkedin Data Science Group
https://www.linkedin.com/groups/2013423

> ブログじゃないですが
Linkedinのグループで、データサイエンス系の最新の投稿が色んな人から集まります。

## 日本語編
盆栽日記（元 東京で尻を洗う）
http://d.hatena.ne.jp/dichika/
>日本語でR関連の詳しい情報を知ろうと思ったらこちら

StatsFlagments
http://sinhrks.hatenablog.com/
> Python,Pandas関連が非常に詳しい日本語ブログ
Mac の QuickLook で プラグインをまとめてインストールする

## はじめに
OS X から QuickLook という機能がついたそうだが、今まで知らなかったorz
(専用アプリを開かずとも、ささっと中身が確認できる機能ですね。)
そのままでも十分便利だが、なんとプラグインでマークダウンやjson、CSVも見れるようにできます。

## QuickLook
Finder でファイルにフォーカスを合わせて「スペースキー」でビュワーが開く。
もう一度「スペースキー」で閉じる。
ビュワー開いた状態で、「矢印キー」上下すると次のファイルに進む。

## プラグイン インストール手順

1. homebrew-cask をインストール
「みんなhomebrew-caskって知ってるか？」
http://qiita.com/ryurock/items/1432578d364985f6cb06

    ```
$ brew install caskroom/cask/brew-cask
```

    ```:.bashrc
export HOMEBREW_CASK_OPTS="--appdir=/Applications"
```

1. QuickLook プラグインを、全部まとめて頂いちゃう
「Quick Look plugins」
https://github.com/sindresorhus/quick-look-plugins
ちなみに、starが 6,000 とか、初めてみたわwww
![スクリーンショット 2016-05-07 19.55.15.png](https://qiita-image-store.s3.amazonaws.com/0/69410/ae564ce4-1681-b5fc-e0c9-6eeb2e8c3fca.png)

    ```
$ brew cask install qlcolorcode qlstephen qlmarkdown quicklook-json qlprettypatch quicklook-csv betterzipql qlimagesize webpquicklook suspicious-package
```

1. Finder で スペース しまくる
ファイルの中身が気楽に見えて、仕事がはかどる。
ゴミ箱のファイルも、そのまま見える。

## FAQ
 - プラグインのインストール後、デスクトップのアイコンがしょぼくなった場合  
デスクトップで右クリック → 表示オプション → アイコンプレビューを表示  
これを、いったん OFF → ON にしてください。  
![スクリーンショット 2016-05-09 9.41.11.png](https://qiita-image-store.s3.amazonaws.com/0/69410/26fa8b7d-9eef-0f79-f09c-e451357c4c80.png)
![スクリーンショット_2016-05-09_9_38_33.png](https://qiita-image-store.s3.amazonaws.com/0/69410/60cf41f2-28ef-f4ce-f15c-8239638b6baf.png)
素数判定 in C/C++

[エラトステネスの篩は以前に書いた](http://qiita.com/EqualL2/items/0964832dd7929d4004ad)のだが、このアルゴリズムはある1つの数が素数かどうかを判定するには向いていない。

今回は、試し割りによって数`n`の素数判定を行う関数`bool is_prime(const unsigned n)`を実装する。


#愚直な実装

```cpp
bool is_prime(const unsigned n){
	switch(n) {
		case 0: // fall-through
		case 1: return false;
	} // n > 1 が保証された

	// n より小さい数で n を割って余りを調べる
	// 素数ならば自分より小さい数(1以外)では割り切れない
	for(unsigned i = 2; i < n; ++i) {
		if(n % i == 0) return false;
	}

	return true;
}
```

#「愚直な実装」の問題点
・2～n-1まで試し割りしているが、実は2～$\sqrt{n}$で十分
・奇数・偶数問わず試し割りしているが(2以外の)偶数は素数ではないので、実は奇数のみで試し割りすればよい。

#修正した実装
```cpp
bool is_prime(const unsigned n){
	switch(n) {
		case 0: // fall-through
		case 1: return false;
		case 2: return true;
	} // n > 2 が保証された

	if(n % 2 == 0) return false;

	// 上で i=2 相当は調べたので、i=3から奇数のみ調べる
	for(unsigned i = 3; i * i <= n; i += 2) {
		if(n % i == 0) return false;
	}

	return true;
}
```

#より良い実装
3以上の素数は、6で割ったときの余りが1か5になる[^1]。
別の言い方をすると、3以上の素数は6の倍数の前後にのみ存在する。

```cpp
bool is_prime(const unsigned n){
	switch(n){
		case 0: // fall-through
		case 1: return false;
		case 2: // fall-through
		case 3: return true;
	} // n > 3 が保証された

	if(n % 2 == 0 || n % 3 == 0) return false;
	// n は 2 と 3 のいずれの倍数でもないことが保証された
	// これより n は (6の倍数)-1 か (6の倍数)+1 である

	// 6の倍数前後の数を使って試し割りをする
	for(unsigned i = 5; i * i <= n; i += 6) {
		if(n % i     == 0) return false; // (6の倍数)-1
		if(n % (i+2) == 0) return false; // (6の倍数)+1
	}

	return true;
}
```

[^1]: 自然数 $n$ を用いて、任意の自然数は$6n, 6n+1, 6n+2, 6n+3, 6n+4, 6n+5$のいずれかとして表現できる。このうち、$6n$は6の倍数、$6n+2, 6n+4$は2の倍数、$6n+3$は3の倍数なので、素数である可能性があるのは$6n+1, 6n+5$のみ

6は素数である2と3の積なのでこんなことができる。
次の素数である5を更にかけると30になるが、30で割った余りは役に立つようには思えない。
素数となる数の候補が多すぎるのだ。
$(30n+1,30n+7,30n+11,30n+13,30n+17,30n+19,30n+23,30n+29)$
python pandas でSettingWithCopyWarning A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value insteadを出ないようにする

# 目的

以下のワーニングが出ないようにする！(このWarningが出るコードは以下に示す)

```
aa.py:5: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  d['col3']= d['col2'] * 3
   col1  col2  col3
0     1     2     6
2     1     2     6
```

# とりあえず、書いてあるリンクを見てみる

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

```
dfmi.loc[:,('one','second')] = value
# becomes
dfmi.loc.__setitem__((slice(None), ('one', 'second')), value)
```
とか書いてある。

# 問題のコード

```py3:aa.py
import pandas as pd

data = pd.DataFrame([[1,2],[2,3],[1,2],[2,3]], columns=['col1','col2'])
d = data[data['col1'] == 1]
d['col3']= d['col2'] * 3
print(d)
```
これを実行すると上記のWarningが出る。

問題は、以下の一行にある。

```py3
d = data[data['col1'] == 1]
```

ここを、`d = data`とすれば、うえのWarningがでない。

# 原因＆解決策1

dataはcol1==1以外の値もあるので、col1==1だけ切り取ってきたDFに新しいColumnを追加しようとすると、おかしなことになるので、Copyしたものにして、予めcol1==1しかないDFを作ればよい。


```py3:修正後
d = data[data['aa'] == 2].copy()
```

# 原因＆解決策2

上記のlink内で言っている支持の通り`.loc`を使って、対応するところ部分だけを更新する。

```py3:修正後
# col1が1の条件に当てはまるもののcol3（新しいColumn）にValue（右辺）を入れる
data.loc[data['col1'] == 1, 'col3'] = data['col2'] * 3
# dataからcol1が1の部分だけを取り出す
d = data[data['col1'] == 1]
print('data:\n %s' % data)
print('d:\n%s' % d)
```

```:結果
data:
    col1  col2  col3
0     1     2     6
1     2     3   NaN
2     1     2     6
3     2     3   NaN
d:
   col1  col2  col3
0     1     2     6
2     1     2     6
```
RealmのObjectを簡単にコピーする方法


ReaalmのObject(RLMObject)をコピーするのに手こずったのでまとめました。コピーすればスタンドアロンに戻るのでプロパティを操作できます。

方法は簡単で`NSCopying`のプロトコルに対応するだけです。`copyWithZone`内でObjectを作成しそれを返します。String, BoolはStructなのでそのまま代入すればOKです。NSDateはclassなので参照を外すために`copy()`メソッドを使います。`List`で配列を作っている場合は中身を取り出して再度`List`を作ります。

```swift:RLMObject
class CategoryWrapper:Object{
    dynamic var category:String = ""
}

class HogeObject:Object, NSCopying {
    dynamic var entryID:String = ""
    dynamic var title:String = ""
    dynamic var updated:NSDate? = nil
    dynamic var content:String = ""
    let categories = List<CategoryWrapper>()
    dynamic var isDrafts:Bool = false
    
    override static func primaryKey()-> String? {
        return "entryID"
    }
    
    func copyWithZone(zone: NSZone) -> AnyObject {
        let copy = HogeObject()
        copy.entryID = entryID 
        copy.title = title
        copy.updated = updated?.copy() as? NSDate
        copy.content = content
        let categoriesRow = categories.map{ $0.category }
        let categoryWrappers = categoriesRow.map{
            category -> CategoryWrapper in
            let wrapper = CategoryWrapper()
            wrapper.category = category
            return wrapper
        }
        categoryWrappers.forEach{ copy.categories.append($0) }
        copy.isDrafts = isDrafts
        
        return copy
    }
    
}
```

取り出す際は`copy()`を使います。


```swift:Copy

realm.write{
	realm.add(object, update: true)
	//standalone == false
}

object.title = "hoge" //standloneなので例外発生

let copy = object.copy as! HogeObject

copy.title = "hoge" //standaloneなのでプロパティを変更できる。

```


### 補足
`copy()`だと`AnyObject`が返るので独自にメソッドを作ったほうが型セーフになっていいかもしれません。
Windows10にvagrant + chefdkをインストールして各種開発環境を作る準備

Windows 10 に CentOS 7.1 + PHP7 + mariadbで作るアプリなどの開発環境を作る準備。

* vagrant + virtualbox + chefdk を準備する
* chefdkを使えるようにする
* chef zero, knife zero を準備する
* vagrant が chef によるprovisioning を実行できるようにする

## vagrant + virtualbox + chefdk を準備する

それぞれ公式のダウンロードサイトからインストーラーをダウンロードして実行する

* https://www.vagrantup.com/downloads.html
* https://www.virtualbox.org/
* https://downloads.chef.io/chef-dk/

現在の最新バージョンはそれぞれ以下の通り

* vagrant 1.8.1
* virtual box 5.0.16
* chefdk 0.12.0

## chefdkを使えるようにする

初期状態の Windows 10 PowerShell では 権限設定により外部のスクリプトを実行できないので権限設定を変更する

```
PS > Set-ExecutionPolicy RemoteSigned
```

## chef zero, knife zero を準備する

```
PS > gem install chef-zero
PS > gem install knife-zero
```

## vagrant が chef によるprovisioning を実行できるようにする

```
PS > # vagrant plugin install vagrant-vbguest  # これはパス
PS > vagrant plugin install vagrant-chef-zero
PS > vagrant plugin install vagrant-omnibus
```

vagrant-vbguest をインストールするように書いてある解説が多いが、これによってアップデートされるVirtualBox GuestAddition のバージョンによっては共有フォルダの同期に失敗する可能性があるのでパスする。

あとはVagrantファイルを編集し、cookbooksを追加し、vagrant up すればOK。
【VBS】yyyymmddの形で当日日付を取得するコードサンプル（ゼロパディング）


VBScriptを使って、本日の日付を取得するサンプルです。

内容は大したこともありませんし、裏ワザ的なこともないベーシックなものですが、
ツールとして使えるシーンは多いです。

ケースとしては、Windows環境で、batと連携して使うことが多いです。
batは日付計算が不自由ですので、batからVBSを呼び出して、
戻り値を返す方法が一般的でしょう。

以下コードを実行すると、メッセージボックスで
「yyyymmdd」の形式で結果が表示されます。


```vbnet:VBS
Dim wkYear
Dim wkMonth
Dim wkDay

'年月日を取得します
wkYear=Year(Now())
wkMonth = Month(Now())
wkDay = Day(Now())

'1〜9月の場合、0を付与します。
If wkMonth < 10 Then
  wkMonth= "0" & wkMonth
End If

'1〜9日の場合、0を付与します。
If wkDay < 10 Then
  wkDay= "0" & wkDay
Else

msgbox wkYear & wkMonth & wkDay

end if
```

呼び出す場合は、msgboxの箇所を変更すればOKです。
ElectronでCanvasの描画内容を画像ファイルとして保存する

![201605070205-01.png](https://qiita-image-store.s3.amazonaws.com/0/118889/bf5a0687-fc3e-fe49-8275-35d7e9142abf.png)

ElectronでCanvasの描画内容を画像ファイルとして保存できることを確認するためにサンプルアプリを作りました。

* [jakalada/example-electron-paint-and-save-file](https://github.com/jakalada/example-electron-paint-and-save-file "jakalada/example-electron-paint-and-save-file")

下記のような機能を実装しています。

* Canvasがマウスでドラッグされたら線を描く
* \[クリア\]ボタンが押されたらCanvasを背景色で塗りつぶす
* \[ファイルに保存\]ボタンが押されたらCanavsの描画内容を`~/Desktop/my-canvas.png`として保存する

# 描画内容の保存処理について

`renderer.js`の下記の関数が画像ファイルの保存を行っています([36行目](https://github.com/jakalada/example-electron-paint-and-save-file/blob/master/renderer.js#L36 "36行目"))。

```javascript
function saveCanvas () {
  const canvasDataUrl = myCanvas.toDataURL()
  const decoded = dataUriToBuffer(canvasDataUrl)
  fs.writeFile(imageFilePath, decoded, (err) => {
    if (err) {
      window.alert('ファイルの保存に失敗しました')
      console.log(err)
    } else {
      window.alert('ファイルを保存しました')
    }
  })
}
```

`myCanvas`変数には`<canvas>`要素を含み、`imageFilePath`変数には保存先の画像ファイルパスを含んでいて、下記が処理の流れです。

1. `const canvasDataUrl = myCanvas.toDataURL()`で描画内容を画像データを含むData URIとして取得
2. `const decode = dataUriToBuffer(canvasDataUrl)`取得したData URIを`Buffer`に変換(npmモジュール [data-uri-to-buffer](https://www.npmjs.com/package/data-uri-to-buffer "data-uri-to-buffer")を使用)
3. `fs.writeFile(...)`で保存

下記の情報を参考にさせていただきました。

* [お絵描きアプリと画像の保存処理の実装 : アシアルブログ](http://blog.asial.co.jp/1313 "お絵描きアプリと画像の保存処理の実装 : アシアルブログ")
* [HTMLCanvasElement.toDataURL()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL "HTMLCanvasElement.toDataURL()")
* [Data URI scheme - Wikipedia](https://ja.wikipedia.org/wiki/Data_URI_scheme "Data URI scheme - Wikipedia")
* [data-uri-to-buffer](https://www.npmjs.com/package/data-uri-to-buffer "data-uri-to-buffer")

# 補足

サンプルアプリを作成する上で得られた、描画内容の保存以外の知見を記載しておきます。

## タッチイベントとマウスイベントについて

サンプルアプリではマウスイベントのみ実装しているため、Microsoft Surfaceなどのタッチ入力が可能な端末では動作しないと思われます(手元に端末がないため実際にどうなるかは未確認です)。

下記の情報が参考になりそうでした。

* [HTML5 の Canvas を使用して作成したゲームでユーザー入力を処理する](https://www.ibm.com/developerworks/jp/web/library/wa-games/ "HTML5 の Canvas を使用して作成したゲームでユーザー入力を処理する")
* [Windows8のChromeやFirefoxはタッチイベントとマウスイベント両方考慮すべし - Webtech Walker](http://webtech-walker.com/archive/2013/03/win8_chrome_touch_event.html "Windows8のChromeやFirefoxはタッチイベントとマウスイベント両方考慮すべし - Webtech Walker")
* [タッチイベントとマウスイベントの両方を拾うマシン、ブラウザについて、マウス操作時にh5trackイベントが発火しない · Issue #298 · hifive/hifivemain](https://github.com/hifive/hifivemain/issues/298 "タッチイベントとマウスイベントの両方を拾うマシン、ブラウザについて、マウス操作時にh5trackイベントが発火しない · Issue #298 · hifive/hifivemain")
* [マウス・タッチ・ペンのタッチ操作イベント](https://w3g.jp/blog/touches_events "マウス・タッチ・ペンのタッチ操作イベント")

## Canvasの描画について

`<canvas>`要素のサイズをCSSで指定したことで、描画の位置や線の太さがずれてしまい、原因に気づくまでに時間がかかりました。下記の記事のおかげで気づきました。

*   [Tukaってみよう: [HTML5]簡単なお絵描きサイトを作ってみました。](http://mitublog.blog.eonet.jp/default/2010/08/html5-15b1.html "Tukaってみよう: [HTML5]簡単なお絵描きサイトを作ってみました。")

また、`<canvas>`要素の背景色をCSSで指定した場合、`HTMLCanvasElement.toDataURL()`で取得したデータに背景色が含まれませんでした。あくまでもブラウザ上での背景色の指定として扱われ、Canvasの描画内容には含まれないようです。
[python] JSONファイルのフォーマットを整えてDumpする

あまりにも単純なことなので、書くまでもないかと思ったけど、これから何回も使いそうなので、メモがてらjsonのダンプ方法をまとめておく。

例えば、こんな感じの辞書をjsonとしてdumpしようとした時、幾つかの問題に出くわした。


```py
dict_sample = {'幽助': {'霊丸': {'ショットガン': 30, '霊光弾': 40}}, '桑原': '霊剣', 'Hiei': '邪王炎殺黒龍波', 'Kurama': 'ローズウィップ'}

f = open("output.json", "w")
json.dump(dict_sample, f)

```
上記のような日本語まじりの複雑な辞書をそのままdumpしてしまうと、出力は非常に見にくいものが出てくる。

```json:output.json
{"Hiei": "\u90aa\u738b\u708e\u6bba\u9ed2\u9f8d\u6ce2", "Kurama": "\u30ed\u30fc\u30ba\u30a6\u30a3\u30c3\u30d7", "\u6851\u539f": "\u970a\u5263", "\u5e7d\u52a9": {"\u970a\u4e38": {"\u970a\u5149\u5f3e": 40, "\u30b7\u30e7\u30c3\u30c8\u30ac\u30f3": 30}}}
```

ワンライナーかよ！！asciiコードかよ！！

ということで、

##jsonを綺麗に表示できるようにdumpする
単に、`json.dump`メソッドに幾つかのオプションを加えてあげるだけでいい感じのフォーマットに整形してくれる。

```py
dict_sample = {'幽助': {'霊丸': {'ショットガン': 30, '霊光弾': 40}}, '桑原': '霊剣', 'Hiei': '邪王炎殺黒龍波', 'Kurama': 'ローズウィップ'}

f = open("output.json", "w")
json.dump(dict_sample, f, ensure_ascii=False, indent=4, sort_keys=True, separators=(',', ': '))

```

ensure_ascii: False の場合、文字はそのまま出力されるとのこと
indent: 辞書のKeyやValueの階層を識別するためのインデント数
sort_keys: Keyでソートするか否か
separators:tuppleで1.KeyとValueを識別する区切り、2.要素を識別する区切りを指定できる

結果はこんな感じで帰ってくる

```json:output.json
{
    "Hiei": "邪王炎殺黒龍波",
    "Kurama": "ローズウィップ",
    "幽助": {
        "霊丸": {
            "ショットガン": 30,
            "霊光弾": 40
        }
    },
    "桑原": "霊剣"
}
```
めっちゃ読みやすくなった。


参考
[公式ドキュメント](https://docs.python.org/ja/3/library/json.html)
Neo4jを使ってみた

こういうのはデータ作るのが一番大変で泥臭い作業だと聞きますが、確かにそうでした。

Cypher Queryは使ってみると結構簡単に使えるものなので良かったです。

http://fscoward.hateblo.jp/entry/2016/05/07/171700

4人の共演作品の出し方はもっとスマートなやり方があったりするのだろうか？
ビットマップフォントで遊ぶ：未定義文字をトウフで埋める

前回の記事[フォントに絵文字を入れ込む](http://qiita.com/harayoki/items/b08cb02533497425df04)の続きです。
![title-logo.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e5ec0dbf-fb12-2fde-46d2-3c36f3b9e234.png) ＜続きクエー

#複数の文字として１つの画像をまとめてフォントに登録する
自分の作ったUtilクラスに、サブタイトルのような機能を持たせませした。先に結果とコードを載せます。

<img width="356" alt="スクリーンショット 2016-05-07 17.40.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/f0264334-c724-280e-ad1c-63d4628c840b.png">
英数字フォントで未定義である平仮名・カタカナコード部分に、俗に言う"とうふ画像"を登録して埋めています。

```sample.as
// トウフビットマップ文字の作成
var tofuChar:BitmapChar =
    BitmapFontUtil.createBitmapCharByTexture(
        0 , // charcodeはなんでもいい
        _assetManager.getTexture("tofu"), 0, 4, 12); 

// tofuCharを範囲指定で登録
BitmapFontUtil.fillBitmapChars(
    tofuChar,
    eijiFont, // 対象フォント
    CharCodeUtil.getIdListByCodeRange(0x3000, 0x30ff), //ひらがなとカタカナの範囲
    true, // 上書きしない設定
    true  // BitmapCharを使いまわす設定
);

// 画面に表示(_doHelperはデモ用に画面表示を楽に行うためのインスタンス)
_doHelper.locateDobj(
    _doHelper.createSpriteText(
        "ABCあいうえあ〜ワヲンDEF", eijiFont.name, 200),
    50, 40);
```
BitmapFontUtil.fillBitmapCharsという部分がキモの命令です。フルコードはこちらに（前回の記事のデモも含む。)
https://github.com/harayoki/-qiita1/blob/replaceBitmapCharByTexture/src/StarlingMain.as

トウフ画像とパック済みフォント画像は１つのアトラス画像にパックされています。（前回の記事参照）カナフォント画像やカラーバー画像もアトラス画像に含まれていますが、今回のデモでは使われていません。
![アトラス画像](https://raw.githubusercontent.com/harayoki/-qiita1/replaceBitmapCharByTexture/assets/assets/atlas.png)

#注意
fillBitmapCharsの第五引数、"BitmapCharを使いまわす設定"というのだけ、注意が必要です。BitmapCharインスタンスをフォントに登録する際、本来は１文字１文字別のBitmapCharインスタンスを使わなくてはいけない(BitmapCharは登録されるidのプロパティをもっている)のですが、今回のような目的では無駄にメモリを浪費してしまうので、デフォルトでは１つのインスタンスでまかなう処理になっています。今の所誤動作はしていませんが、利用される方がおり、何か問題が出た場合はここをfalse指定にしてください。

#まとめ
今回の記事のやりかたで、Starlingのテキストフィールドが、未定義文字があってもエラーtraceを書き出すだけでそのまま文字を表示しないでスルーしてしまうのを、目視でトウフ確認できる状態に変更できるので、そのような際に役に立つかもしれません。。まあ、そもそもTextField側のコードを直したい感じではありますね。

![title-logo.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e5ec0dbf-fb12-2fde-46d2-3c36f3b9e234.png) ＜まだ続くクエー
querySelectorAllで帰ってきたNodeListを外部ライブラリを使わずにforEachしたい

## You Don't Need jQuery とは言うものの

[You Don't Need jQuery](http://qiita.com/tatesuke/items/b9548dd484b01b139b74
) をみて気になるのが、forEachの書き方。querySelectorAllで帰ってくるNodeListは配列ではなくオブジェクトなので、JavaScriptのforEachが使えない。


そこで登場するのが
Array.prototype.slice.call
これで、配列っぽいオブジェクトが配列扱いになるらしい。配列っぽいオブジェクトって何？

試しに文字列をいれてみる

```js
Array.prototype.slice.call("ab") 
> ["a", "b"]
```

となる。ただ素のオブジェクトを入れても


```js
Array.prototype.slice.call({0:"value1",1:"value2"}) 
> []
```

にしかならない。

試しに、lengthをもった、数字がキーのオブジェクトを作って、それを配列化してみよう

```js
Array.prototype.slice.call({0:"value1",1:"value2",length:2}) 
> ["value1", "value2"]
```

期待通り。どうも、Length をみて、[0][1]と切り出しているだけっぽい。Lenghと添字アクセスが可能だから文字列が配列に変換できたっぽいね。ということで、手作業で配列っぽいオブジェクトは作れる。

## 本題のNodeListのforEach。

「ページの中のアンカーのhrefを全部出力するってワンライナー」はこうかける

```js
Array.prototype.slice.call(document.querySelectorAll("a")).forEach( function(e){ console.log(e.href)})
```

長い。メソッド深すぎ、タイプ多すぎ。読みづらい。

配列に変換したいのではなく、foreEachを使いたいだけなんだから、一足飛びにforEachをcallしてみよう。foEachをCallすると、第一引数にNodeListを直接ぶち込んで、第二引数でcallbackを指定できる。

```js
Array.prototype.forEach.call(document.querySelectorAll("a"), function(e){ console.log(e.href)})
```

ちょっと短くなった。sliceって単語が出てこないだけ見通しがいい。

いまどきのブラウザは、Arrow Function もサポートし始めているから、スペルミスの多いfunction は省略しちゃおう。

```js
Array.prototype.forEach.call(document.querySelectorAll("a"), e => console.log(e.href))
```

さらに短くなった。Array.prototypeも面倒だ。prototypeが打ちづらい。

```js
[].forEach.call(document.querySelectorAll("a"), e => console.log(e.href))
```

さらに短くなった。

ES6になると、配列化とmapの両方をやってくれる、Array.fromというメソッドがある。まぁ親切。これ最強。

```js
Array.from(document.querySelectorAll("a"),  e => console.log(e.href))
```
手元の Chromeバージョン 50.0.2661.94 (64-bit)では動いている。

ちなみに第二引数で処理されるのはforEachではなくmapなので、returnすれば、配列に変換できる。

```js
Array.from(document.querySelectorAll("a"),  e => {return e.href;})
```

「ページ内のアンカーのhrefを配列にして、それを改行でjoinして出力」くらいが事務用途で便利。
（コンソールからコピペした時に余計なものがついてこない）

```js
console.log(Array.from(document.querySelectorAll("a"),  e => {return e.href;}).join("\n"))
```
サーバー構築してみようとしたもののiptablesを全く知らなかったときに参考にした記事のまとめ

全て敬称略とします。
並び順に意味はありません。
また、この記事によって発生する損害ですとか誤解ですとかその他もろもろの責任は一切とりません。

書式:[番号]著者(記事の作成日)『記事のタイトル』リンク(参照日)

[1]げんちゃん(2014-4-7)『Nmap の前に iptables を知る』<http://ayufishing.blog.fc2.com/blog-entry-23.html>(参照2016-5-7)
[2]Oxy(2013-11-5)『コピペから脱出！iptablesの仕組みを理解して環境に合わせた設定をしよう』<http://oxynotes.com/?p=6361>(参照2016-5-7)
[3]takahiko-takei(2016-4-24)『さくらのVPS 標準OSの環境構築(2) ファイアウォールとシステムの設定』<http://qiita.com/takahiko-takei/items/ee233aac59976ce55f11#_reference-42ba28020eb79073dba1>(参照2016-5-7)
[4]fusagiko(2015-4-22)『Linuxサーバ構築初学者のための頻出iptables』<http://qiita.com/fusagiko/items/bc2e9ae9392a28b73734>(参照2016-5-7)
[5]shimohiko(2013-4-19)『立ち上げ直後のiptablesを設定する。』<http://qiita.com/shimohiko/items/ec672655edb84578a82e>(参照2016-5-7)
[CSS]表單Textbox與Lable調整對齊

https://dotblogs.com.tw/kyleshen/2013/10/02/122245

http://www.florian-hacquebart.eu/?p=201

https://www.zfanw.com/blog/html-form-element-align.html


http://html.cita.illinois.edu/nav/form/text/index.php?example=6

http://www.pixy.cz/blogg/clanky/css-fieldsetandlabels.html

http://stackoverflow.com/questions/4641346/css-to-align-label-and-input

http://stackoverflow.com/questions/9686538/align-labels-in-form-next-to-input
RubyでOSを判別する

OS依存なコードを書く機会があり、OSを判別する必要があったのでメモ


```rb
require 'rbconfig'

def os
  @os ||= (
    host_os = RbConfig::CONFIG['host_os']
    case host_os
    when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
      :windows
    when /darwin|mac os/
      :macosx
    when /linux/
      :linux
    when /solaris|bsd/
      :unix
    else
      :unknown
    end
  )
end
```

[こちら](http://stackoverflow.com/questions/11784109/detecting-operating-systems-in-ruby)のコードほぼそのままです。。。

`RUBY_PLATFORM`を使う例もいくつか見かけたのですが、スクリプトをJRubyで動かした時に`RUBY_PLATFORM`が`'java'`を返すのは具合が悪かったので、今回は上記の方法を採用しました。
[初心者向け] Slack から Hubot を使えるようにする

Slack から Hubot を使えるようにするまでの一連の流れ

# Integration の設定

Slack の Apps から Hubot を検索して、Add Configuration をクリック 

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/2782cfc5-04ed-7ede-3bef-4bfc32f4c111.png)

名前を決めて Add Hubot Integration

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/55c6be26-dc79-aca0-1f89-e618eac781fe.png)

すると、API Token が発行されます。
後から名前やアイコンの設定も可能です。

# ローカルで Hubot を起動

後は [hubot-slack](https://github.com/slackhq/hubot-slack) の README 書かれている通りにすれば動くようになります！

```zsh
% npm install -g hubot coffee-script yo generator-hubot
% mkdir -p hello_hubot
% cd hello_hubot
% yo hubot
                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

? Owner pekepek
? Bot name hello_hubot
? Description Hello Hubot!!
? Bot adapter (campfire) slackgot back false



/usr/local/lib/node_modules/yo/node_modules/rx/dist/rx.js:77
    throw e;
    ^
true
```

あれ、落ちた。
Yeoman の状態を見てみると

```zsh
% yo doctor

Yeoman Doctor
Running sanity checks on your system

✔ Global configuration file is valid
✔ NODE_PATH matches the npm root
✔ Node.js version
✔ No .bowerrc file in home directory
✔ No .yo-rc.json file in home directory
✔ npm version
```

特に問題はなさそう。
ググってみると理由は分からないが、実行時にオプションで渡すと上手く行くとのこと

```zsh
% yo hubot --owner="pekepek" --name="hello_hubot" --description="Hello Hubot!!" --adapter=slack
                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

   create bin/hubot
   create bin/hubot.cmd
   create Procfile
   create README.md
   create external-scripts.json
   create hubot-scripts.json
   create .gitignore
   create package.json
   create scripts/example.coffee
   create .editorconfig
...
```

上手くいった。
hubot-slack 入れて

```zsh
% npm install hubot-slack --save
```

ローカルで動かしてみる

```zsh
% HUBOT_SLACK_TOKEN=[YOUR TOKEN] ./bin/hubot --adapter slack
```

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/a3f751ff-f2ce-f154-6fea-3131287056f6.png)

動いた動いた
AWS 用語

###ポイントインタイムリカバリ
RDSは1日1回バックアップを取得し、５分に一度トランザクションログを取得する。
これらを駆使して特定のポイントへRDSをリカバリすること。
RDSを新規に構築してリカバリすることに注意。そのためエンドポイントが変わる。

###ELB のスティッキーセッション
HTTPレスポンスにELBでCookieを埋め込んで、
そのクッキーを基にバインド先のインスタンスを固定
オプションとして、任意の有効期限指定、アプリケーションのCookie設定がある

###Amazon SQS デッドレターキュー
何らかの理由で正常に処理できなかったメッセージの送信先として他の（送信元）キューが使用できるキュー
同じリージョンのキューにしか送信できない。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/SQSDeadLetterQueue.html
Unityのとあるゲームでメモリ調査した件

## はじめに
- Sceneに設置されている、とあるオブジェクト(以下、Manager)がメモリをかなり食っている

## 環境
- Unity5.0.2p4

## 計測方法
- Xcodeでメモリで計測
- iPhone5

## 特定まで
- ManagerのInspectorで参照しているPrefabを外したところ30MB程減った
- 上記Prefab（以下、親Prefab)が1個当たり0.01~0.6秒、100~200kb程であり、550個程読み込んでいた

## 1個当たりの容量が大きい理由
- 子PrefabがInspectorでデータ量が大きいScriptableObjectを参照していた
- また、子Prefabが同じScriptableObjectを参照している場合でも都度メモリが確保されてしまう

図
親A → 子AA → 孫AAA(ScriptableObject)
親B → 子BB → 孫AAA(ScriptableObject)
孫AAAが100kbあったとした時、合計200kbメモリを確保してしまっている様子


## 改善確認
### 未対応状態
- 起動直後 125MB
- Gameシーン遷移までの時間 35秒程
- Gameシーン遷移安定後 340MB ~ 360MB
- 服屋描画安定後 360MB ~ 370MB
- 親Prefabの読み込み時間 0.01~0.6秒

### 対応状態
- 起動直後 125MB
- Gameシーン遷移までの時間 28秒程
- Gameシーン遷移安定後 320MB ~ 340MB
- 服屋描画安定後 350MB ~ 360MB
- 親Prefabの読み込み時間 0.0001秒以下
ビットマップフォントで遊ぶ：フォントに絵文字を入れ込む

Bitmap Fontの初期化はAssetManagerに任せたままだったり、コンストラクタにXMLが必要で不便だったり、そんな理由で、プログラムで構築する事はあまりされていないかと思いますが、面倒くさいながらも自由にいじる事ができるので、いろいろおもしろい事ができます。そのあたりをいくつか紹介します。

<img width="366" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/8302/5de72606-8c23-5fbe-9aee-a21716d17949.png">
_1のフォントを王冠画像に動的に置き換えてみた例_

# 絵文字を挿入する
ビットマップフォントの１文字はBitmaCharクラスで表されます。普通にテクスチャ(＝サブテクスチャ＝テクスチャアトラスの１パーツ)を指定して既存フォントに登録する事やすでにあるフォントを上書きする事が可能です。

```sample.as
var char:BitmapChar = new BitmapChar(id, texture, xOffset, yOffset, xAdvance); 
someFont.addChar(id, char);
```

サンプルコードをみてみましょう。ここで、idは文字コード番号、xOffsetとyOffsetはテクスチャが余白をトリミングしたものである場合に指定するもの、xAdvanceは次の文字を表示する位置です。textureは普通にテクスチャです。なお、BitmapCharにはカーニングの指定もできますが、ここでは考えません。

以下は、固定幅フォントを指定する場合で、テクスチャに余白がない場合はコードがとても簡単になります。

```sample.as
var char:BitmapChar = new BitmapChar(65, texture, 0, 0, 16); // "A"の文字（コード番号65)の場所に横16ドット固定幅の画像を登録
someFont.addChar(char.charID, bitmapChar);
```

このようにすると、記事の最初の画像のように、１文字を絵文字で後から置き換えるような事が可能です。フォント画像は単色である必要はありません。他の文字と横幅をそろえる必要もありません。縦の位置がずれてしまう場合は、yOffsetの値で調整してください。

最初から絵文字を含んだフォントを用意するのと何が違うのかというと、フォントを書き出しなおす手間がいらないという事と、配布済みフォントもカスタム化ができる、という所です。配布済みのビットマップフォントはそもそも再書き出しが難しかったりしますし。


# 文字化け注意

ただし、Fontに指定してあるテクスチャとBitmapCharで直接登録した文字のテクスチャが別ソース画像である場合、TextFieldでのフォント利用で文字化けしたような状態になってしまいますTextField内のバッチ処理でテクスチャソース画像が２つ以上混在している事が考慮されていないのでしょう。font.createSprite()して文字を表示する場合は文字化けしません。

<img width="149" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/8302/5efd45b9-29b9-6797-923b-3973f2d5b86b.png">
これは、英字フォントに別のかなフォントテクスチャから"あ"の画像を上記の方法で移植した場合で、上がTextField表示、下がfont.createSprite表示です。

# テクスチャ画像をまとめる
文字化けをcreateSpriteで回避したとしても、文字の途中でテクスチャが切り替えがあると、その度にドローコールが増えてしまいます。なので差し込む絵文字画像とフォント画像を合成してしまうと良いです。これは、フォント画像の再書き出しをするという事ではありません。文字をパック済みのフォント画像を、別のテクスチャアトラスの一部として取り込んでしまいます。詳しくは、自分の過去記事を参照してください。
[ビットマップフォント画像を他とまとめて１ドローコールを目指す](http://qiita.com/harayoki/items/90652fab0b8859a9196d)

<img width="453" alt="スクリーンショット 2016-05-07 16.55.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/7c29fc7a-ccf4-275e-5fc5-7653de7fd916.png">
このように、ドローコールの増加が防げます。

#デモ
自分の作ったUtilクラスを通しているので、上記とはコードが異なりますが、実際に同じ事を行っている動作するコードが下記にあります。ご参考まで。（別投稿のデモも含みます。）
https://github.com/harayoki/-qiita1/blob/replaceBitmapCharByTexture/src/StarlingMain.as

```bassui.as
var emoji:BitmapChar = // "1"の文字に[王冠画像]を上書き登録
    BitmapFontUtil.createBitmapCharByTexture(
        "1", _assetManager.getTexture("oukan"),0, 0, 16 + 2);
BitmapFontUtil.addBitmapCharToFont(eijiFont, emoji);
_doHelper.locateDobj(
    _doHelper.createSpriteText(
        "STAGE 1-A", eijiFont.name, 300, 50, 16, 0xffffff),
    50, 20);
```

![title-logo.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e5ec0dbf-fb12-2fde-46d2-3c36f3b9e234.png) ＜続くクエー
CodeCommitにTriggersが追加されてた？ので触ってみた【cloudpack大阪ブログ】

こんちゃ。

# CodeCommitってなに？
AWSのGitサービス。今のところus-east-1でしか使えない。


# Triggersってなに？
いわゆるWebHooks
前調べたときは使えなかった機能だけど3月くらいに使えるようになったらしい
https://aws.amazon.com/jp/blogs/aws/new-notifications-for-aws-codecommit/


# やったこと
* Triggerの受け口のLambdaつくる
* 権限周りコネコネする
* CodeCommitでRepositoryたてる
* CodeCommitでTrigger設定する
* CloudWatchLogs見る


## Triggerの受け口のLambdaつくる
WebHooks動くのか見たいだけなのでとりあえず受け取ったイベント引数を返すだけの存在する価値のないリソースを作成。中身が見れればなんでもいい。

```py
def lambda_handler(event, context):
    print event
    return event
```


## 権限周りコネコネする
aws cliで以下のコマンドをﾎﾟﾁｰ
_${Hoge}は、適宜書き換えてくださいね_

```
aws lambda add-permission \
--region us-east-1 \
--function-name ${LambdaFunctionName} \
--statement-id 1 \
--principal codecommit.amazonaws.com \
--action lambda:InvokeFunction \
--source-arn arn:aws:codecommit:us-east-1:${Account}:${Repository} \
--source-account ${Account} \
--profile default

```

LambdaのRoleはこんな感じに

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1462604551000",
            "Effect": "Allow",
            "Action": [
                "codecommit:*"
            ],
            "Resource": [
                "arn:aws:codecommit:us-east-1:${Account}:${Repository}"
            ]
        }
    ]
}
```

_ぶっちゃけこの辺よくわかってない_



## CodeCommitでRepositoryたてる
Repository名入力して適当につくってください。
**完**


## CodeCommitでTrigger設定する
作成したRepositoryの左メニューから `Triggers` -> `Create Trigger` をポチッ
![AWS_CodeCommit_Management.png](https://qiita-image-store.s3.amazonaws.com/0/73113/3dbc0712-552e-3ab1-4722-159a75a66144.png)

* Trigger name: トリガーの名前。お好きに。
* Events: 引っ掛けたいイベントを指定。以下から選ぶ。  
  + 全イベント
  + 既存ブランチにプッシュ
  + 新規ブランチ・タグの作成
  + ブランチ・タグの削除
* Branch names: 反応させたいブランチを指定。devブランチだけ、みたいな使い方するんちゃうんすかね
* Send to: 今回は `AWS Lambda` を選択。
* Lambda function: さっき作ったLambdaFunctionが出てきてるはずなので、それを選ぶ
* Custom data: 他のTriggerと区別するための識別子やらを任意で入れられるよってやつ。空でヨシ。

疎通確認したいので `Test Trigger` をﾎﾟﾁｰ。


## CloudWatchLogs見る

結果ｗｗｗｗｗｗｗｗｗｗｗｗｗ

```
START RequestId: 5831de43-1424-11e6-a926-b725522dd65d Version: $LATEST 
{
  'Records': [
    {
      'eventId': '2b769d5c-5b57-4356-xxxx-33561479a38a',
      'eventVersion': '1.0',
      'eventTime': '2016-05-07T07:21:41.177+0000',
      'eventTriggerName': 'SampleNotification', 
      'eventPartNumber': 1,
      'codecommit': {
        'references': [
          {
            'commit': '0000000000000000000000000000000000000000',
            'ref': 'refs/heads/TestReference'
          }
        ]
      },
      'eventName': 'TriggerEventTest',
      'eventTriggerConfigId': '2b769d5c-5b57-4356-8d15-33561479a38a',
      'eventSourceARN': 'arn:aws:codecommit:us-east-1:XXXXXXXXXXXXXX:oreno-repository',
      'userIdentityARN': 'arn:aws:iam::XXXXXXXXXXXXXX:root',
      'eventSource': 'aws:codecommit',
      'awsRegion': 'us-east-1',
      'eventTotalParts': 1
    }
  ]
} 
END RequestId: 5831de43-1424-11e6-a926-b725522dd65d 
REPORT RequestId: 5831de43-1424-11e6-a926-b725522dd65d	Duration: 0.57 ms	Billed Duration: 100 ms Memory Size: 128 MB	Max Memory Used: 43 MB
```

**ちゃんと取れてる**



ここまでできればあとは夢広がりますよね。では。
Sublime Textのエディタの下にスペースを作る方法

デフォルトのSublime Textではエティタの下にスペースがなく、下までコードを書くとスクロールできずに、常にエディタの下側で作業しなければいけない。

![スクリーンショット 2016-05-07 16.40.58.png](https://qiita-image-store.s3.amazonaws.com/0/118567/c91c2369-5afe-6ffe-448c-4b9d5be92041.png)

下まできたら、下に改行をたくさんいれてスクロールできるけど、かっこ悪いので設定を変更したメモ。

Preferences -> Settings - User

で以下を追記。
 ```
"scroll_past_end":true
```

他に記述があるとカンマで区切るので最終的にこんな感じ。

```
{
	"ignored_packages":
	[
		"Vintage"
	],
	"scroll_past_end":true
}
```

これで下にスペースができて常に中央で作業ができる。

![スクリーンショット 2016-05-07 16.42.56.png](https://qiita-image-store.s3.amazonaws.com/0/118567/0c79f3ca-8686-2499-8bbf-b15ed71dba36.png)