OmniAICreator/Qiita-1.07M huggingface dataset:
pythonの配列は、添字の有無によって参照がどう変わるのか


今回は変数が何を指しているかというところを深く見るための実験です。pythonのバージョンは3.4.3です。

### 別の変数からオブジェクトを変更する

変数の中身を別の変数に代入しても、同じオブジェクトを指しています。これをオブジェクトidを比較して確認します。

```python
mylist = [[0, "mike"], [1, "jane"]]
person1 = mylist[0]

print("mylist = %s" % mylist)
print("person1 = %s" % person1)
# =>
# mylist = [[0, 'mike'], [1, 'jane']]
# person1 = [0, 'mike']

# 2つの変数が同じオブジェクトを指していることを確認
print("mylist[0] id = %s" % id(mylist[0]))
print("person1 id = %s" % id(person1))
print(id(mylist[0]) == id(person1))
# => True

# 後に確認するために現在のオブジェクトidを保存
person1_id = id(person1)
```

別変数を通して配列の要素を変更してみます。添字を指定した時だけ

```python
# personがmylist[0]のエイリアスになっていることを確認
person1[0] = 100
print("mylist = %s" % mylist)
print("person1 = %s" % person1)
# =>
# mylist = [[100, 'mike'], [1, 'jane']]
# person1 = [100, 'mike']
```

要素の変更に成功しました。しかし、添字を使わない場合は要素の変更ができずに、新しいオブジェクトが代入されてしまっています。

```python
# pesron1を通して、mylist[1]の配列の変更を試みる
person1 = [5, "michel"]
print("mylist = %s" % mylist)
print("person1 = %s" % person1)
# =>
# mylist = [[100, 'mike'], [1, 'jane']]
# person1 = [5, 'michel']

person1 = 5
print("mylist = %s" % mylist)
print("person1 = %s" % person1)
# => 
# mylist = [[100, 'mike'], [1, 'jane']]
# person1 = 5
```

前の配列の要素が入っていた時のオブジェクトidと比較すると、確かにオブジェクトが変わってしまっていることが確認できます。

```python
# オブジェクトを変更する前のidと比較
print(person1_id == id(person1))
# => False
```

### 変数が何を指しているのか

上記の現象を図解してみます。まずは添え字を使った場合です。添え字を使った場合は配列（今回はlist)を指しているのではなく、その要素を指していることに注意しましょう。配列の要素の参照（矢印）を変更しただけなので、配列を参照していた変数は変わらず配列を参照したままです。

![python_index_01_150702.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/e2ebeb8c-3414-66f7-c568-13bc6c6ef12b.jpeg "python_index_01_150702.jpg")



次は添え字を使わなかった場合です。先ほどの実験で、この場合は別の変数から値を変更した場合に、もとの変数に影響がでなかったですよね。これは配列への参照を新しいオブジェクトへの参照に変更したのが原因です。

![python_index_02_150702.jpg](https://qiita-image-store.s3.amazonaws.com/0/62881/c47731ed-2951-6e9e-a529-f553fb382650.jpeg "python_index_02_150702.jpg")
How to update process-locked files Windows


# Why?
- Service prcess locked dll file.
- Other user's process locked ...

# How?

## Rename Current file
1. Rename (e.g hoge.dll => hoge.dll.old
2. Copy new file as same filename. (e.g /tmp/hoge.dll => /system32/hoge.dll

## Use registry


http://itpro.nikkeibp.co.jp/free/NT/WinReadersOnly/20040414/5/


helper = inuse.exe

```
まず，レジストリ・エディタ（regedt32.exe）を起動し，HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet
\Control\Session Managerキーの配下にPendingFileRenameOperationsという値を追加します。データ型はREG_MULTI_SZで，そのデータとして上段に置き換える新しいファイル名，下段に置き換えられる古いファイル名を入力します。

　例えば，c:\winnt\system32\test.sysのファイルをc:\temp\test.sysで上書きする場合は図3のように設定します。設定を変更したら，レジストリ・エディタを終了し，コンピュータを再起動すればファイルが置き換えられた状態となっているはずです。詳細は，マイクロソフト技術情報（JP181345）を参照してください。
```
SparseMatrixについてまとめてみた


この記事は、「Machine Learning Advent Calendar 2015」の15日目の記事になります。
Machine Learningの実装を行う場合によく利用される「Sparse Matrix」について簡単ですがまとめてみました。

## SparseMatrix

SparseMatrixとは一般的なDenseMatrixとは異なり、Non-zero Value(0以外の数値)の数がベクトルの長さに対して極めて小さい場合に利用されることが多いです。
SparseMatrixは以下の点でDenseMatrixより優れています。

* 消費するメモリの量が少なくなる
* 行列・ベクトル演算のスピードが高速になる

これらのメリットは行列、またはベクトルが十分に大きいサイズであり、なおかつNon-zero Valueの数が小さいときに非常に大きな効果を発揮します。
例えば、複数の質量変数を1-of-Kで表現している場合などが挙げられます。
今回は説明の簡略化のため、行列ではなくベクトルの演算を例に各種ライブラリを見ていきます。

## scipy.sparse

おそらくここで説明する中では最も有名なものだと思います。Pythonの機械学習ライブラリでは最も有名であるscikit-learnでも利用することが可能です。
例えば、sklearn.clustering.KMeansの場合、[ここ](http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans.fit)に書かれている通り、

>X : array-like or sparse matrix

というようにSparseMatrixをXに利用することが可能になっています。
SparseMatrixを定義する方法は様々なものがあります。
詳しくは[公式ドキュメント](http://docs.scipy.org/doc/scipy/reference/sparse.html)の方を見てください。

### Examples

実際に演算する上でDenseとSparseでどれくらい差があるかを見てみましょう。

``` ipython
>>> import scipy.sparse as sp
>>> import numpy as np
>>> # 長さ1,000のベクトル
>>> x1=np.zeros(10**3)
>>> x1[10]=5; x1[100]=10;
>>> y1=sp.lil_matrix(x1).tocsr()
>>> %time x1 * x1 % 要素積
21 μs

>>> %time y1.multiply(y1)
249 μs

>>> # 長さ1,000,000のベクトル
>>> x2=np.zeros(10**6)
>>> x2[10]=5; x2[100]=10;
>>> y2=sp.lil_matrix(x2).tocsr()
>>> %time x2 * x2 % 要素積
4.15 ms

>>> %time y2.multiply(y2)
250 μs
```

上の例のようにベクトルの長さが大きくなると明らかに計算時間が異なってます。
ちなみに上の例では要素積ですが足し算の場合もDenseVectorに比べて高速になります。

### 注意点
* 処理が高速になるのはmultiply()で計算するときのみです
* ベクトル積を行う場合は次のようにする方が良いです

``` ipython
# これだとSparseのOperationが行われない
%time y2 * y2.T
3.41 ms

# こちらはSparseのOperatioが行われる
%time y2.multiply(y2).sum()
447 µs
```

## scipy以外の他のライブラリ
### Theano
theano.sparseパッケージをロードして使うことができます。
scipy.sparseで言うところのcsr, cscが用意されてます。

``` python
>>> from theano import sparse
```

簡単ですが、上と同じ例をTheanoでもやってみます。

``` python
>>> import theano
>>> from theano import sparse
>>> x = sparse.csr_matrix(name='x', dtype='float64')
>>> f = theano.function([x], sparse.basic.mul(x, x))
>>> %time f(y1)
312 µs
```

もちろん普通のベクトルで演算した場合は、

``` python
>>> import theano.tensor as T
>>> x = T.dvector(name='x')
>>> f = theano.function([x], x * x)
>>> %time f(x1)
4.74 ms
```

のように演算に時間がかかってしまいます。
Theanoのように柔軟に関数が利用でき、微分なども簡単に計算できるライブラリでは覚えておくと便利になると思います。

ただし、注意として

* sparse.basicにある演算をfunctionには利用する
* theano.sparseはGPUには対応していないようです

### TensorFlow
話題のTensorFlowSparseTensorというものを提供しています。

``` python
>>> import tensorflow as tf
>>> tf.SparseTensor(values=[1, 2], indices=[[0, 0], [1, 2]], shape=[3, 4])
[[1, 0, 0, 0]
 [0, 0, 2, 0]
 [0, 0, 0, 0]]
```

こちらは少し調べてみたのですが、利用方法については詳しくわかりませんでした。（後日更新しようと思います）

## おわりに
簡単ではありますが、SparseMatrixについてまとめてみました。
自分もまだ勉強中の身で、わからないこともいいので何かご指摘などありましたらコメントいただけると嬉しいです。
機械学習を実装する場合、特にオンライン学習などの場合には有効なので実装する際はDenseMatrixだけでなく、SparseMatrixの実装も考えてみてはいかがでしょうか！？
フィボナッチ数

[コマンドプロンプト（cmd.exe）Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cmd)

の 12/4 の記事を読んでおもしろかったので、昼やすみを利用して自分なりに書きなおしてみました。

```bat:fibonacci.bat
@echo off

setlocal
  set n=%~1
  
  if "%n%" == "" (
    >&2 echo %~n0 NUMBER
    exit /b 1
  )
  
  set /a a=1,b=0,s=0
  :BOL
    if %n% equ 0 echo 0 & goto :EOF
    if %n% equ 1 echo %a% & goto :EOF
    set /a n-=1
    set /a a=a+b
    set /a b=a-b
  goto BOL
endlocal
```

ちなみに

> 普通に作ってしまうと再帰呼び出しになってしまってアレなので

も書いてみたのですが

```bat:fibonacci.bat
@echo off

setlocal
  set n=%~1
  
  if "%n%" == "" (
    >&2 echo %~n0 NUMBER
    exit /b 1
  )
  
  call :fibonacci %n%
  
  echo %ERRORLEVEL%
  
  exit /b 0
endlocal
goto :EOF

:fibonacci
setlocal
  set n=%~1
  
  if %n% equ 0 exit /b 0
  
  if %n% equ 1 exit /b 1
  
  set /a n1=%n%-1
  call :fibonacci %n1%
  set r1=%ERRORLEVEL%
  
  set /a n2=%n%-2
  call :fibonacci %n2%
  set r2=%ERRORLEVEL%
  
  set /a r=%r1%+%r2%
  exit /b %r%
endlocal
goto :EOF
```

指定する値が 10 くらいだと数秒で終了しますが、 20 では…（ぜんぜんダメですね）
brew upgradeしたらrails sでエラーになった

Macのローカル開発環境でbrew upgradeしたらrails sでエラーになった。

エラー確認
```rake rails:update:bin```

エラー
```mysqlがゴニョゴニョ.... Library not loaded: /usr/local/lib/libmysqlclient.18.dylib```

ネットではlibmysqlclient.18.dylibにリンクを貼ればOKとあるが動かない。

今回の環境はこれで固定されてます
ruby 2.2.0
rails 4.2.0
mysql2 0.3.18

原因はbrew upgradeでmysqlのバージョンが5.6系から5.7系に上がったため。
### homebrewの場合
```ln -s /usr/local/Cellar/mysql/5.6.25/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib```
上記のリンクの貼り直しのみで上手くいくmacもあったが、ダメなmacはmysqlを入れ直した

### 5.6系に戻す
1. brewで5.6系を探す  
```brew search mysql```
2. バックアップ  
```mv /usr/local/var/mysql /usr/local/var/mysql_buckup```
3. uninstall  
```brew cleanup mysql```  
```brew uninstall mysql```
4. 5.6系インストール  
```brew install homebrew/versions/mysql56```
5. mysqlユーザー作成  
```mysql root -u```  
```mysql> create user
    -> 'hoge'@'localhost' identified by 'hoge';```
6.   
```rails s```
【Google日本語入力】Windows10 使ってみて気になったメモ　その１

先日、メイン機をwindows7から10に切り替えてみたので、そこで気になった点をメモっていく。

##Google日本語入力とEdge
この組み合わせの場合、アドレスバーを始め、フォームのテキスト入力欄にも日本語入力が出来ない模様。
Microsoft IMEに切り替えると問題なし。
Edgeのバージョン情報は以下の通り。

- Microsoft Edge 25.10586.0.0
- Microsoft EdgeHTML 13.15086

##既定の日本語入力
全部のアプリで試したわけではないが、Google日本語入力が既定のIMEにならない模様。
IMEを切り替えるたびに出てくるわけではないが、アプリを起動してからIMEを切り替えると、以下のようなダイアログが出る。
![GoogleIME.png](https://qiita-image-store.s3.amazonaws.com/0/94543/efbe768e-4063-996a-e09c-a3977e8040c1.png)

とりあえず、今日はこんなもんで。
凸多角形の角を丸める

![Screen Shot 2015-12-15 at 15.49.47.png](https://qiita-image-store.s3.amazonaws.com/0/54852/17b86835-af7c-50f1-68e9-57615dfa1bd8.png)

任意の凸多角形の角を丸くするために使ったコードです。
頂点列が時計回りに格納されていることが条件です。

```cpp:ofApp.cpp
void ofApp::getRoundedCornerPolygon(const vector<ofVec2f> &polygon, float r, ofPath &path) {
    path.clear();
    int n = polygon.size();
    for (int i = 0; i < n; i++) {
        // 線分AP, PBで作られる角を丸くする
        ofVec2f a = polygon[(i - 1 + n) % n];
        ofVec2f p = polygon[i];
        ofVec2f b = polygon[(i + 1) % n];
        
        // 角APBのなす角度
        float th = (b - p).angleRad(a - p);
        // 2辺に接する円の中心から頂点Pまでの距離
        float d = r * tan(PI / 2.0 - th / 2.0);
        // 線分APの長さ
        float paDist = a.distance(p);
        // AP上における円の接点C1
        ofVec2f c1 = a.getInterpolated(p, 1.0 - (d / paDist));
        // 円の中心C
        ofVec2f c = c1 + (p - a).getPerpendicular() * r;
        // 円弧の開始角度と終了角度
        float angleBegin = ofVec2f(1, 0).angle(p - a) - 90;
        float angleEnd = ofVec2f(1, 0).angle(b - p) - 90;
        
        if (i == 0) {
            path.moveTo(c1);
        } else {
            path.lineTo(c1);
        }
        path.arc(c, r, r, angleBegin, angleEnd);
    }
}
MacでMarkdownを書きたい人向け

## Markdownってなに？

　markdownは，文書を記述するためのマークアップ言語のひとつです。基本的にはhtml形式の文書を吐き出してくれます。でもご存じの通り，生のhtmlって可読性はそんなに高くないですよね。そこでmarkdownを使うと，可読性が高く，覚えることも最小限に，質の高いhtml文書を作成できます。
　有名なところだと

+ Qiita
	+ 投稿にMarkdownが使える
+ GitHub
	+ さまざまなところでMarkdownに対応
	+ レポジトリの説明として使われる`readme.md`はmarkdown書式を採用している
+ はてなブログ
	+ markdownでの投稿に対応

　と，さまざまなところでmarkdownが使われています。markdownを覚えておくことは，非常に意味のあることだといえるでしょう。
　
## なんのために使うのか？

　markdownは非常に軽量なマークアップ言語です。そのため利用できるシチュエーションは多数存在します。以下にぼくのmarkdownの利用法について簡単に書いておきます。

+ メモアプリとして
+ 文書を書くために
+ ブログ投稿のために
+ マニュアル作成

などなど。最近はmarkdownにどっぷり浸かってしまったので，markdownでなにかを書かない日はないくらいです。

## markdownのいいところ

　ぼくが日常的にmarkdownを使っている理由をいくつか挙げておこうと思います。

+ **すべてがキー操作で完結する**

markdownとそのエディタには，ごてごてしたGUIは存在しません。究極的にはメモ帳アプリやただのテキストエディタでも書くことが可能です。

+ **動作が非常に軽快である**

markdownエディタは動作が非常に軽快です。ざくざくざくっとメモを仕上げることができます。

+ **覚えることが少ない**

markdown記法は覚えることが圧倒的に少ないです。さまざまな記法が直感的であるため，すぐに覚えられることでしょう。

+ **コードブロックが優秀**

なんだかんだこれがいちばん大きい気がします。少し囲むだけで，美しいシンタックスハイライトが適応されたコードブロックを簡単に生み出すことができます。

そんなこんなで，覚書とかメモを取るのに，markdownはすごくいいと思います。

## なにでmarkdown書くの？

Macでmarkdown書く方法はたくさんありますが，ここでは代表的なものをいくつか挙げておきます。

+ [MacDown](http://macdown.uranusjr.com)
+ [Kobito](http://kobito.qiita.com)
+ [Atom](https://atom.io)

でもここでは **MacDown** をオススメしておきます。

## MacDownのいいところ

+ **リアルタイムプレビュー**

左にmarkdownのソースコードを書くと，右側でほぼ瞬時にレンダリングした結果を返してくれます。

+ **CSSカスタマイズ**

デフォルトでGitHubなどのCSSを利用できます。加えて，自身でCSSをカスタマイズすることが可能です。

+ **PDF,HTMLへのエクスポート**

ソフト自身の機能でPDF,HTMLへのエクスポートがサポートされています。

+ **すべてがキーボードで簡潔**

ご覧のとおりMacDownは全画面表示にするとテキスト画面しか表示されません。文書作成に集中することができます。

+ **数式入力もできる**

あんまりくわしくないのですが，LATeX形式の数式を共存させることができるみたいです

その他，ワードカウンタやシンタックスハイライトなど，かゆいところに手が届く機能がいくつもあります。

## 実際の使い方

ぼく自身の使い方を述べておきましょう。

+ とにかくMacDownでメモする

最初の方はとにかく慣れるために，あらゆる文書をMacDownで作ってました。

+ Dropboxと連携する

MacDownは`.md`ファイルを生成するので，作業フォルダをDropboxの管理下に置いています。これでバックアップを取ったつもりになっています。

## おわりに

なんかだらだらと書いてしまいましたが，ぼく自身はMacDownを使うことで非常に優秀なメモ環境を手に入れることができました。QiitaではKobitoを勧めておく方がいいような気もしましたが，ぼくはKobito→MacDownに乗り換えました！いいmarkdownライフを！
mackerel-agentでhost idの重複を避ける

[Mackerel Advent Calendar 2015](http://qiita.com/advent-calendar/2015/mackerel) 15日目の記事です。

mackerel-agentを起動すると、`/var/lib/mackerel-agent/id` というファイルにMackerel側でホストを識別するための ID が書き込まれます。

このファイルが残ったままイメージファイルを作成して別のホストを立てた場合、Mackerel側ではホストの識別ができず、実際には複数ホストのホストが存在していても1ホストとして認識されてしまいます。

イメージ作成前に削除する手はありますが、そうするとそのホストで mackerel-agent を起動し直した場合に別ホストとして登録されてしまうので困りますね。

ということで、id ファイルが残っていても「自分のものではない」と判断できる場合には id ファイルを削除した上で mackerel-agent を起動する方法を考えてみました。

- [mkr](https://github.com/mackerelio/mkr)
- [jq](https://stedolan.github.io/jq/)

を使用して、以下のような script を使います。

```bash
#!/bin/bash
export PATH="/usr/local/bin:$PATH"
id_file="/var/lib/mackerel-agent/id"
self_addr=$(ip -4 addr show eth0 | awk '/inet /{ split($2, addr, "/"); print addr[1] }')
if [ -f "$id_file" ]; then
  host_id=$(cat $id_file)
  other_addr=$(mkr hosts | jq -r ".[] | select(.id == \"${host_id}\").ipAddresses.eth0")
  if [ "$self_addr" != "$other_addr" ]; then
    echo "host_id: ${host_id} ip_addr:${other_addr} is already registered on Mackerel server. Removing ${id_file}"
    rm -f "$id_file"
  fi
fi
```

`mkr hosts` で Mackerel 側に存在するホストを一覧し、

- 同じ host id の eth0 の IPアドレスを取得
- 自分の eth0 の IPアドレスと異なる場合は `/var/lib/mackerel-agent/id` を削除

という動作をします。
これを mackerel-agent 起動前に実行すれば、idの重複を事前に検知して新ホストとして登録できますね。

……というユーザ側の対処なしで agent が自動で判別できる仕組みがあると一番いいので、どういう設定ができると嬉しいか考えてみました。

- mackerel-agent.conf に、ホストを一意に識別する key (を取得するためのコマンド) を定義できる
- Mackerel サーバでは、同一 host id で一意の key が異なる agent が接続してきた場合に新しい id を発行し、agentは以後それをファイルに保存して使用する

「一意に識別するkey」というのは、たとえば AWS なら instance-id などが考えられますが、そこは環境特有の事情があるでしょうから、コマンドで取得できると柔軟かなと。

```
# mackerel-agent.conf
host_unique_id_command = "curl -s http://169.254.169.254/latest/meta-data/instance-id"
```

ということができると嬉しいなというエントリを書いてみました。

明日は @tkuchiki さんです！
New Relicを使って手軽にローカル開発環境のrailsアプリのプロファイル


いまのところRailsで動かしたNew Relic Ruby Agentでしか確認していないのですがNew Relicのプロファイラがlocalで利用できます。

まずはスクリーンショットを確認してみます。

![pro_1.png](https://qiita-image-store.s3.amazonaws.com/0/30079/9634b93a-6356-da42-0e43-9ef45622fd07.png "pro_1.png")
![pro_2.png](https://qiita-image-store.s3.amazonaws.com/0/30079/4aeb8a28-7ad4-d706-8157-41da4d9a0fdf.png "pro_2.png")
![pro_3.png](https://qiita-image-store.s3.amazonaws.com/0/30079/e0b60b90-853c-43c4-6b7c-b60deb68f48b.png "pro_3.png")
![pro_4.png](https://qiita-image-store.s3.amazonaws.com/0/30079/3ee8e9f7-6c3b-4bfa-ac94-37b6ed800687.png "pro_4.png")

初めてみたとき **すげー** と思いました。
いままでNew RelicのWeb上でしか確認できなかったものが、ローカルで手軽にできます。
ただ、注意として直近の100リクエストしか履歴がありません。

使い方としては以下があるかなと思います。

* ローカルの開発環境で使用し、開発中のAPIなどのプロファイラとして使う。パフォーマンス改善に役立つ
* 新しくメンバーに入った人にプロファイラみてもらって関数呼び出しなどを確認してもらう
* ステージング環境（MySQLのサーバがAppサーバと分かれているとよりパフォーマンスがわかりやすい)で使用し、SQL文とそれぞれのパフォーマンスを確認
* ローカルでのみ実行(New RelicのWebにはパフォーマンスを送らないように設定できる)

# Developer Modeの設定の仕方

newrelic.ymlで、以下の項目が含まれている事を確認
    
    monitor_mode: false
    developer_mode: true

rails sなどでサーバを起動し、 http://example.com/newrelic など通常のURLの下に、/newrelicでアクセス

便利です。pythonのAgentには無いのかな。。。
Railsははほかにもそれっぽいgemがありそうな気はします。

# 参考
* [Contents » Agents » Ruby Agent » Developer Mode](https://docs.newrelic.com/docs/agents/ruby-agent/developer-mode/developer-mode)
PhaserのAPIドキュメント

2015年12月15日現在、よさ気な日本語のPhaser関連のドキュメントは、なさそうです。なので、英語のドキュメントをある程度理解できることが、前提となります。

# phaserchainsは、APIの検索をするため使いやすい
[http://phaserchains.boniatillo.com/](http://phaserchains.boniatillo.com/)
PhaserのドキュメントのWeb検索ページ。
使用例が右カラムに、ドキュメントの内容が下に、それぞれ表示されます。
インターフェースの定義とユースケースが同時に確認できるため、非常に便利です。
![phaserchains.boniatillo.com_.png](https://qiita-image-store.s3.amazonaws.com/0/29233/c6c3cde5-fef8-5fa4-fa34-4c0fccf3f5aa.png)

# Phaser API Documentation は、全体把握するために使う
[http://www.phaser.io/docs/](http://www.phaser.io/docs/)
公式ページにある、APIドキュメント。
クラスの一覧が分類ごとに一覧になっているため、全体を把握するのにはちょうど良いです。
Unityなどでゲームプログラミングをやったことがあれば、だいたいの雰囲気とかはわかるんじゃないかと思います。
![www.phaser.io_docs_2.4.4_index.png](https://qiita-image-store.s3.amazonaws.com/0/29233/814c5b05-7bd1-5487-69f2-2effc4eb2eea.png)
JAVA clone()によるインスタンスの複製

▪️Test65.java

```java
public class Test65 {
	public static void main(String[] args) {
		Hero65 h1 = new Hero65("ミナト");
		Sword65 s = new Sword65("はがねの剣");
		h1.setSword(s);
		System.out.println("装備:" + h1.getSword().getName());
		System.out.println("clone()で複製します");
		Hero65 h2 = h1.clone();
		System.out.println("コピー元の勇者の剣の名前を変えます");
		h1.getSword().setName("ひのきの棒");
		System.out.println("コピー元とコピー先の勇者の装備を表示します");
		System.out.println("コピー元:" + h1.getSword().getName() + "/コピー先:" + h2.getSword().getName());

	}

}
```

▪️Hero65.java

```java
public class Hero65 implements Cloneable {
	private String name;
	int hp;
	Sword65 sword;

	public Hero65 clone() {
		Hero65 result = new Hero65();
		result.name = this.name;
		result.hp = this.hp;
		result.sword = this.sword;
		return result;
	}

	Hero65(String name) {
		this.hp = 100;
		this.name = name;
	}

	public Hero65() {
		// TODO Auto-generated constructor stub
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		if (name == null) {
			throw new IllegalArgumentException("名前がnullである。処理を中断。");

		}
		if (name.length() <= 1) {
			throw new IllegalArgumentException("名前が短すぎる。処理を中断。");
		}
		if (name.length() >= 8) {
			throw new IllegalArgumentException("名前が長すぎる。処理を中断。");
		}
		this.name = name;
		System.out.println(this.name);
	}

	public void setSword(Sword65 sword) {
		this.sword = sword;

	}

	public Sword65 getSword() {
		return this.sword;
	}

}
```

▪️Sword65.java

```java
public class Sword65 {
	private String name;
	int damage;
	Sword65 sword;

	public Sword65(String name) {
		this.name = name;

	}

	public String getName() {
		// TODO Auto-generated method stub
		return this.name;
	}

	public void setName(String string) {
		// TODO Auto-generated method stub
		this.name = name;

	}

}
```

▪️Test65.java
装備:はがねの剣
clone()で複製します
コピー元の勇者の剣の名前を変えます
コピー元とコピー先の勇者の装備を表示します
コピー元:はがねの剣/コピー先:はがねの剣
EC2 Windowsでローカルのドメインに参加

- VPCにDHCP Options Setを作成
    - Domain Name, Domain name serversを設定
- VPCに適用
- EC2起動時、User Dataに下記を設定

```ps1
<powershell>
$password = ConvertTo-SecureString -AsPlainText -Force "Password"
$credential = New-Object System.Management.Automation.PSCredential "Administrator",$password
Add-Computer -DomainName mydomain.org -OUPath "OU=myOU,DC=mydomain,DC=org" -Credential $credential
</powershell>
```
http://aws.typepad.com/sajp/2014/08/ec2-user-data_active-directory.html
デスクトップを録画するアプリを書いた

* 手軽にデスクトップ（or ウィンドウ）を録画できるアプリが欲しかった
* [Photon](http://photonkit.com) を使ってみたかった
* [Electron](http://electron.atom.io) 楽しい

以上の動機で書いてみました。Rec って名前です（てきとー）。[レポジトリはこちら](https://github.com/k0sukey/Rec)。Mac であればバイナリを置いてあります。Windows は試していないです。

<img width="912" alt="capture.png" src="https://qiita-image-store.s3.amazonaws.com/0/47686/8740a77e-f2b8-b402-5b45-8875b9b68775.png">

## 使い方

アプリを起動するとデスクトップとウィンドウの一覧がサイドバーに並ぶので、録画したいものをクリックしてから、カメラアイコンをクリックで録画開始です。止めるときは停止アイコンですね。仮想デスクトップをお使いの場合は、対象のデスクトップにアプリを移動して、右上のリフレッシュボタンをクリックです。

停止アイコンをクリックで録画された webm がダウンロードできますので、あとはご自由にどうぞ。

## 中身

Electron v0.36.0 から desktopCapturer モジュールが使えるようになりました。これを利用しています。

```js
var desktopCapturer = require('electron').desktopCapturer;

desktopCapturer.getSources({
  types: [
    'window',
    'screen'
  ]
}, function(error, sources){
  if (error) {
    return;
  }

  console.log(sources);
});
```

```sources``` の中にデスクトップ（or ウィンドウ）の ID、名前、サムネイルが入っています。録画で必要になるのは ID です。

```js
navigator.webkitGetUserMedia({
  audio: false,
  video: {
    mandatory: {
      chromeMediaSource: 'desktop',
      chromeMediaSourceId: sources[n].id,
      minWidth: 580,
      maxWidth: 580,
      minHeight: 545,
      maxHeight: 545
    }
  }
}, function(stream){
  var video = document.createElement('video');
  document.body.appendChild(video);
  video.src = window.URL.createObjectURL(stream);
  video.play();
});
```

```chromeMediaSourceId``` へ ```sources``` に入っているデスクトップ（or ウィンドウ）の ID を渡してあげます。で、コールバックでストリームが返却されてくるので、```<video/>``` を作ってあげて src へ流し込めば OK です。

ちなみに、この録画アプリ自体を選択すると合わせ鏡になりますので注意してください。

```js
// frames に canvas で描いた画像が入っている
var webm = Whammy.fromImageArray(frames, 1000 / 60),
  a = document.createElement('a'),
  click = document.createEvent('MouseEvents');

a.href = window.URL.createObjectURL(webm);
a.download = Date.now() + '.webm';
click.initEvent('click', false, true);
a.dispatchEvent(click);
```

ファイルへの書き出しは [Whammy](https://github.com/antimatter15/whammy) を使っています。```<video/>``` で再生しながら、```<canvas/>``` へ書き出して、それを一枚一枚配列に格納しています。録画が停止されたら、最後に Whammy で webm にします。あとは ```<a/>``` 作って href へ window.URL.createObjectURL してあげた webm を入れれば OK ですね。

## まとめ

手軽に録画できるようになりました。まだまだ録画サイズの指定など、細かい所ができていないのでちょこちょこ手を加えていこうと思います。おしまい。
iOSに自機のhosts設定を適応する

iOSのhostsを書き換えるには脱獄が前提となるので、
簡易的にDNSを立てて代用します

簡易DNSサーバー「dnsmasq」を利用する(Mac)
ターミナルにて作業します
##インストール
`$brew update
$brew install dnsmasq`
設定ファイルをコピーします(デフォルト)
`$cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf`
*パッケージ管理はhomebrewを使用します

サービス起動
`$sudo brew services start dnsmasq`
サービス停止
`$sudo brew services stop dnsmasq`

##テスト
iOSを同じネットワークに接続し
Wifi設定を開きDNS項目から自機のIPアドレスを指定します

自機のhosts設定がiOSから使えるようになります。
デザイナーがAvocodeを使ってみた

こんにちは。
みなさんは `Avocode`（アボコード） をご存知でしょうか。
日本語の記事やドキュメントが少ないので知らない方も多いかもしれません。

この記事は、まだAvocodeを知らない方や興味があるけど使ったことがない、というデザイナーさん向けの記事です。


# Avocodeって？
とりあえず簡単に主な機能を紹介をします。

## [Avocode](http://avocode.com/)
![Avocode](https://qiita-image-store.s3.amazonaws.com/0/92897/bcec57e3-f031-1f57-7938-cbcd66a24846.png)

- PSDのプレビューをPSDを持っていなくてもだれでも閲覧ができる
- プレビュー時にコメント追加ができる
- Web版&アプリ版
- アプリではPSDのスライスや、レイヤーの操作、テキストのコピーなどが容易
- PSDのリビジョン管理
- URL生成機能で簡単にシェア
- Slackで更新通知
- Photoshopからワンクリックでアップロード
- 英語版のみ
- 有料版のみ（2週間のお試し期間あり）


# 導入の経緯
導入前、デザイン確認がある際はExcel上で行っていました。
Excelでの共有はファイル作成から相手へ連絡等、かなり時間がかかります。
社員の時間コスト削減とスピーディな共有ツールが求められていました。

その時に見つけたのがAvocodeです。

- PhotoshopがなくてもPSDの確認がWeb上ででき、コメントも可能なのでデザイン・文言チェックが簡単そう
- 通知はメール・Slackで飛ぶので、より共有が早くなりそう
- アプリがフロントエンド側で使えそう

以上の3点が、業務の改善となると判断し導入しました。


# 実際につかってみた
いざ使用スタート！

デザイナーは作成したPSDをPhotoshopからワンクリックでアップロード。（プラグインが要ります）
わざわざPDFやpngなどに変換しなくていいので、ストレスがないです。
アップロード通知が飛び、確認側はWebでデザインを確認。
気になるところはコメントを残す。コメントも通知が飛ぶので、作業テンポがはやい！
文言等の修正依頼なら、通知が飛んできてから修正完了→再アップロードまでが劇的なはやさです。

アプリはPhotoshopなしでスライスができるし、pxの確認も簡単！
個人的にはPSD上のテキストを一発でコピーできる機能に感動しました。
Photoshopを持っていない人の強い見方ですね！


すっごい便利！Avocodeすごいなー！すごいなー.........


# 3ヶ月後
**Avocodeを使わなくなりました。**

ここまで紹介しておいてごめんなさい...。
それには理由があるのです。

- あまり使わない機能があった（リビジョン管理など）
- 有料ユーザーしかコメント機能が使えなかった
- コメントの修正ができない、コメント内で改行ができない
- slackの通知内容が微妙でわかりにくい

あと最大の理由として、別ツールの台頭がありました。
それは **Marvel**（マルヴェル）です。

[Marvel](https://marvelapp.com/)
![Marvel](https://qiita-image-store.s3.amazonaws.com/0/92897/2b72ac7b-e7ab-88c2-c05d-e2208a5d5bdd.png)

Marvelはプロトタイピングツールです。
Avocodeより前から使用しており、英語版ではありますが直感的に使えるほどUIがしっかりしています。
プロトタイピング機能しか使っていませんでしたが、実はPSDもアップロードできたり、チーム内でAvocodeでやっていることがMarvelでも十分できるということに気付きました。

AvocodeとMarvelはサービスの性質はまったく違いますが、Marvelの方がよりチームに合っていることと、Avocodeがあまり浸透しなかったことで、Avocodeをやめる結果となってしまいました。

# おわりに
チームやプロジェクトとの方向性が合わずAvocodeはいったん辞めることになりましたが、なんだかんだいってAvocodeはすごい便利です。
PSDを確認するマークアップエンジニアさんにもオススメできます。
改善して欲しいところもちらほらありますが、今後のアップデートに個人的には期待しています。
AWS LambdaのSNSとの連携について



Lambdaは今年の4月のアップデートでSNSと連携できるようになりました。
今回、下記のようなLambdaとSNSとの連携方法について、説明します。

![Untitled (1).png](https://qiita-image-store.s3.amazonaws.com/0/3225/5caac6f0-e9dd-5515-f202-d0034612ed89.png)



## LambdaとSNSの連携の流れ

LambdaとSNSの連携は下記の流れになります。

1. Lambdaの登録
2. SNSのSubscriptionのEndpointとして、1で登録したLambdaを指定

わずか2ステップで連携できるので、簡単ですね。

## 1. Lambdaの登録

まずは何はともあれ、Lambdaに登録しましょう。
下記はSNSのイベントを取得して、topicARN毎に処理を行うサンプルです。


```scala:lambda.scala
import com.amazonaws.services.lambda.runtime.{ Context, RequestHandler }
import com.amazonaws.services.lambda.runtime.events.SNSEvent

import scala.collection.JavaConverters._

object LambdaFunctionHandler extends RequestHandler[SNSEvent, String] {

  //SNSとの連携はinputとして、SNSEventを指定するだけでOK
  def handleRequest(input: SNSEvent, context: Context): String = {

    // SNSのtopicArnを取得
    val snsRecordHead = input.getRecords.asScala.headOption
    val topicArn = snsRecordHead.get.getSNS.getTopicArn

    //取得したtopicArn毎に処理を何か処理を行う
  }
}
```

```scala:build.sbt
//kinesis sdkを追加
libraryDependencies ++= Seq(
  "com.amazonaws" % "aws-java-sdk-kinesis" % "1.0.0",
)

```

SNSと連携する際の注意点として、inputとして、SNSEventを指定しましょう。
後はsbt assemblyしてLambdaに登録するjarファイルを作成するだけです。

```
$ sbt clean assembly
```

Lambdaの登録画面にて下記の内容にて登録

<img width="942" alt="スクリーンショット 2015-12-15 14.32.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/3225/88eacf55-87af-64c0-845f-6fe002e9345e.png">


* Name: < lambdaの名前 >

* Description: SNS連携用Lambda

* Runtime: Java8

* Code entry type: Upload a .ZIP fileを選択し、上記で作成したjarファイルを指定


* Handler: com.hoge.LambdaFunctionHandler::handleRequest

* Role：< Lambda用のrole >

* Memory: 512MB

* Timeout: 1min


これでLambdaの準備は完了です。

## 2. SNSの作成

SNSでsubscriptionのEndpointを1で作成したLambdaに指定して作成します。
SNSの管理画面で下記の内容で作成します。

<img width="889" alt="スクリーンショット 2015-12-15 14.29.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/3225/b76adc51-ab8b-c4f6-2601-a9ad4094ebe0.png">


* create new topicを選択
	* Topic name: Lambda
	* Display name: Lambda

<img width="891" alt="スクリーンショット 2015-12-15 14.36.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/3225/a74e9434-9974-5cca-b85b-e1c43219eb9b.png">


* create subscriptionを選択
	* Protocol: AWS Lambda
	* Endpoint: < 1で作成したLambdaの名前を指定 >
	* version: default


作成したTopicにメッセージを送信すると、登録したLambdaが実行されます。

## まとめ

SNSとの連携が可能になったことにより、他のAWSサービスとLambdaとの連携がさらに容易になりました。
例えば、あるサービスをCloudWatchで監視し、特定の閾値を超えた際にSNSに通知、SNSがLambdaを実行といった事が可能になります。
いっそう便利になったLambdaでより楽しいAWS生活がおくれそうですね。
Swift では Protocol を積極的に使おう

# これはなに
Swift ではクラスベースの開発よりもプロトコルベースの開発にしていきましょう。という提案です。
もうサブクラスとはお別れです。

### 環境
- Swift 2.2

# Protocol とは
Objective-C では `@interface` と書いていたものといえばイメージがしやすいと思いますが、 Swift ではこれの機能がかなり拡張されています。
特に Swift 2.0 以降では Protocol Extension の機能が追加され、 Protocol がデフォルト実装をもてるようになったのでさらに便利になりました。

# 使用例
とりあえず、犬猫をわんわんニャーニャー鳴かせてみましょう。

```swift
protocol Animal {
    var name: String { get }
    var age: Int { set get }
    func bark() -> String
}
```

動物のインターフェースをこのように切ります。 `name` は読み取り専用、`age` は読み書きできます。

```swift
struct Cat: Animal {
    let name = "Tama"
    var age = 2
    func bark() -> String {
        return "にゃ〜ん"
    }
}

let cat = Cat()
cat.name          // "Tama"
cat.age           // 2
cat.bark()        // "にゃ〜ん"
```

猫を鳴かせるにはこうです。Protocol で宣言した変数、関数を実装すればよいですね。

ただ毎回鳴き声を実装するのが大変な場合があります。基本的に動物が「ぼえ〜」と鳴くならばデフォルトで「ぼえ〜」と鳴かせておけばいいですね。

```swift
extension Animal {
    func bark() -> String {
        return "ぼえ〜"
    }
}
```

Protocol を拡張しました。これで `bark()` のデフォルト実装がもてました。

```swift
struct Dog: Animal {
   let name = "Pochi"
   var age = 3
}

let dog = Dog()
dog.name        // "Pochi"
dog.age         // 3
dog.bark()      // "ぼえ〜"
```

はい、実装しなくても関数を呼ぶことができました。デフォルト実装を使わない場合は `Dog` で `bark()` を実装すればよいです。

# なにがいいか
### 構造体で使える
Swift の構造体は構造体を継承できないのでプロトコルを実装することになります。
構造体は値型ゆえクラスよりも取り扱いがしやすい（と個人的に思っている）ので UI 部分はともかくロジック部分では多用していることでしょう。実際のアプリケーション開発では似たような部品を作ることが多いので、それがひとつのプロトコルにまとまっていると大変スッキリするかと思います。

### 実体とインターフェースを切り離せる
Protocol は最初に述べたようにインターフェースなので、他から参照するのを実体ではなく Protocol を参照するようにすれば依存性を減らすことができます。

```swift
struct Owner {
   let pets: [Animal]
}

let owner = Owner(pets: [Dog(), Cat()])
```

この例だと初期化のところがまだ面倒ですが、Dog がいなくなったり、新しく動物が増えたりしても Owner 構造体には影響しません。

### Override がない
Protocol には Override はありません。デフォルト実装を使うか、1から実装するかです。
これはバグを減らせると私は考えています。同じ関数名で異なる動きをする関数は混乱を招きます。
それに、UIView のサブクラスの `override func layoutSubviews()` 内で `super.layoutSubviews()` を何気なく呼んだために期待通りの動作にならなかった経験のある人は多いとおもいます。

### 宣言をしないと使えない
Protocol をもつクラス・構造体はその Protocol の実装をするのが必須になっています。Protocol の実装を明示することで動作をわかりやすくする働きがあると思います。基底クラスを作るために `extension UIViewController` をするよりも各クラスに Protocol を実装したほうがブラックボックス化を防げるでしょう。

# まとめ
もちろんサブクラスでも同じ実装はできるのですが、Swift では Protocol を使うとよりスッキリした、読みやすいコードが書けると思いました。
また、例では Protocol の基本的な実装しか紹介しなかったので公式ドキュメントや他の記事で参考にされるとよいかと思います。

## 参考
- [If You're Subclassing, You're Doing It Wrong. — KrakenDev](https://krakendev.io/blog/subclassing-can-suck-and-heres-why)
- [Swift 2で提唱されているProtocol Oriented ProgrammingをWWDCセッションから学ぶ - Qiita](http://qiita.com/mono0926/items/bb52e657df6978713334)
- [swiftでprotocolでのgenericsに型制約を付ける - Qiita](http://qiita.com/masaichi/items/7599a45e32cba018d357)
- [SwiftのProtocolについての簡単な整理 - Qiita](http://qiita.com/tajihiro/items/fdbf83209b8eaa0e791b)
iPhoneのアプリ内WebViewのUAまとめ(2015/12/15時点)とjsでの判定方法

追加したい人はUAをコメントに貼って下さい。

ここで確認出来ます。
http://nabettu.github.io/sua/


こんな感じでUA判定してしまえばと思います。

```判定.js
if(/iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase()) && /twitter|fbav|line/.test(navigator.userAgent.toLowerCase()))
```

#TwitterアプリWebView
Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13C75 Twitter for iPhone

#FacebookアプリWebView
Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13C75 [FBAN/FBIOS;FBAV/45.0.0.45.96;FBBV/18289579;FBDV/iPhone7,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/9.2;FBSS/2; FBCR/ドコモ;FBID/phone;FBLC/ja_JP;FBOP/5]

※Facebookアプリはキャリア情報をUAに乗せてます

#LineアプリWebView
Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13C75 Safari Line/5.8.0


#Safari
Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13C75 Safari/601.1
DistinguishedNameのEscapeとUnescape処理(RFC1779)

DistinguishedNameのEscape、Unescape処理作成が必要だったのでここにメモ。
動作はdotnetfiddleで確認済み

https://dotnetfiddle.net/elcvrr

```csharp
using System;

public class Program
{
  public static void Main()
  {
    Test("Hello World");
    Test("Hello, World");
    Test("Hello,, World");
    Test("Hello\\, World");
    Test("\"Hello, World");
    Test("Hello\"\", World");
    Test("\"Hello\"\", World");
    Test("\"H<<#ello\"\", W+or@ld");
    Test("\\\\\\\\\\\\\\\\\\\\\\");
    Test("\\=<<;;;,#\"\\\\+*>>");
    Test("        ttt       ");
  }
  
  public static void Test(string source)
  {
    Console.WriteLine("======================\n" + source);
    string escaped = EscapeRFC1779(source);
    Console.WriteLine("\t escaped : " + escaped);
    string unescaped = UnescapeRFC1779(escaped);
    Console.WriteLine("\t unescaped : " + unescaped);
    Console.WriteLine( source.Equals(unescaped) ? "OK" : "ERROR");
  }
  
  public static readonly string[] RFC1779SpecialCharacters = { @"\", ",", "+", "=", "\"", "\n", "<", ">", "#", ";" };

      public static string EscapeRFC1779(string str)
    {
        bool bQuoting = false;
        var sb = new StringBuilder();
        // if str contains tailing spaces or special characters then do quoting.
        foreach (char s in str.ToCharArray())
        {
            if (RFC1779SpecialCharacters.Contains(s))
            {
                bQuoting = true;
                sb.Append('\\');
            }
            sb.Append(s);
        }
        if (bQuoting)
            sb.Insert(0, '"').Append('"');

        return sb.ToString();
    }

  public static string UnescapeRFC1779(string str)
    {
        bool bEscaping = false;
        var sb = new StringBuilder();

        // unquoting
        if (str[0].Equals('"') && str[str.Length - 1].Equals('"'))
            str = str.Substring(1, str.Length - 2);

        foreach (char s in str.ToCharArray())
        {
            if (!bEscaping && s.Equals('\\'))
            {
                bEscaping = true;
                continue;
            }
            if (bEscaping)
            {
                if (RFC1779SpecialCharacters.Contains(s))
                {
                    sb.Append(s);
                    bEscaping = false;
                }
                else
                {
                    // invalid escaping
                    throw new ArgumentException("invalid escaped character : " + s);
                }
            }
            else
                sb.Append(s);

        }
        return sb.ToString();
    }

  public static string QuoteString(string str) {
    return "\"" + str + "\"";
  }
}
```
スマホの画面の上下端でビヨーンってスクロールしちゃうのは嫌だ

すぐに忘れるだろうから自分用のメモ。

Cordovaを使ってスマホネイティブっぽいアプリを開発すると、表示される画面が固定されていて欲しいのに、上下にビヨーンってスクロールしてしまいカッコ悪い。このビヨーンってのがそもそもなんと言うのかわからなくて、google先生になかなか答えを教えてもらえなかった。

答えはここにありました：
https://cordova.apache.org/docs/en/latest/config_ref/index.html
> - DisallowOverscroll (boolean, defaults to false): set to true if you don't want the interface to display any feedback when users scroll past the beginning or end of content.
>
> ```xml
<preference name="DisallowOverscroll" value="true"/>
```
>
> Applies to Android and iOS. On iOS, overscroll gestures cause content to bounce back to its original position. On Android, they produce a more subtle glowing effect along the top or bottom edge of the content.

ありがとうございます。

ではまたね。
EPUB書籍の内部に足を踏み入れる

この記事は[ePub Advent Calendar](http://qiita.com/advent-calendar/2015/epub)15日目の記事です。

電子書籍はKindleなどによって今かなり流行っているので、利用している人も多いと思います。
そんな電子書籍の内部がどうなってるかって気になりませんか？今回は電子書籍のファイルフォーマット規格の一つである**EPUB**を取り上げ、その内部構造に足を踏み入れていこうと思います。

#そもそもなんでEPUBなの
電子書籍に複数のフォーマットが存在していることはご存知でしょうか。
EPUBを始め、XMDF、.book、AZW(Kindleはこれ)などがあり、PDFも含まれます。

[EPUB](http://idpf.org/epub/30)は、[IDPF](http://idpf.org/) (International Digital Publishing Forum)が策定した**オープンフォーマット**な規格です。
さらに、xhtmlやcssといったWeb標準規格に対応していることから、多くのアプリケーションに用いられ、標準フォーマットとなっています。
(Wikipediaから持ってきました。https://ja.wikipedia.org/wiki/EPUB)

要は使いやすくて人気だからってことです。

#EPUBの中身を拝見...
それでは、EPUBについて理解したところで、中身を見ていきましょう。
**ババーン！**

![スクリーンショット 2015-12-02 14.01.39.png](https://qiita-image-store.s3.amazonaws.com/0/52234/fe721bb1-0698-b0c4-4d7e-9c721b273436.png)

これが、EPUBの中身です。
順番に見ていきましょう。
##EPUB container
これはEPUB書籍を構成するファイルをすべて含むフォルダです。「EPUB container」というのは仮称で、実際はこのフォルダの名前がEPUB書籍のタイトルになっています。

###mimetype
これはEPUBのメディアタイプが記述されています。標準では"application/epub+zip"と書かれています。

###META-INF
このフォルダにはcontainer.xmlが入っています。

####container.xml
このファイルには、ルートファイルの場所と、そのメディアタイプが記述されています。
ルートファイルは標準ではpackage.opfのことを指します。

###package.opf
このファイルはEPUB書籍のタイトルや著者などのメタデータが記述されています。さらに、章ごとに分かれたそれぞれのコンテンツ文書の読み順も記述されており、これをもとに並び替えられます。

###nav.xhtml
このファイルはナビゲーションドキュメントで、書籍の特定の場所にジャンプできたりするなど、利便性を向上させるためのものです。

###その他
上記の他に、章ごとの内容が書かれたコンテンツ文書や、CSSファイル、画像ファイルなどが入っています。
CSSや画像などが含まれているのが、電子書籍の特徴ですよね。

#最後に
EPUBの内部構造を見てきましたが、どうでしたでしょうか。
普段読んでいる電子書籍の内部はあまり気にしないかもしれませんが、気にしてみると案外面白いものです。

自分もけっこう知ったばかりであるので、なにかおかしな点などありましたら、ご指摘いただきたいと思います。
R MarkdownでBootstrapのAlert書式を当てる

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## R MarkdownにはBootstrapが組み込まれている

色々なところで触れられていますが、R MarkdownにはBootstrapが組み込まれています。具体的には`Bootstrap.css`と`Bootstrap.js`が組み込まれていて、各種テーマ・機能が利用可能です[^1]。この辺りの流れについては、[こちらの記事](http://qiita.com/kazutan/items/27aaf29d09d4ddb1b80f)をご覧ください。

[^1]: 正確にはそれ以外の書式なども組み込まれているため、たまに打ち消されてしまっているのもあります。このため使える機能と使えない機能があります。

## Alertメッセージ
Bootstrapには警告や注意をひきたいメッセージなどのためにAlertメッセージの書式が準備されています。あのパステルカラーできれいなアレです。cssが組み込まれていますので、以下のようにさくっと作ることができます:

```
<div class="alert alert-success">
**success**のメッセージ
</div>
<div class="alert alert-info">
**info**のメッセージ
</div>
<div class="alert alert-warning">
**warning**のメッセージ
</div>
<div class="alert alert-danger">
**danger**のメッセージ
</div>
```

ようするに、`<div class="alert alert=*">`のタグで括ったエリアがその書式となります。なおこの内部にRコードチャンクも組み込むことができます(コードチャンク前の"\"は無視してください):

```
<div class="alert alert-info">
**info**のメッセージ
\```{r}
knitr::kable(head(iris))
\```

</div>
```

ちょっと面白い感じになりますので、ぜひ試してみてください。

### Alertと関連する他の書式
Bootstrapには[Panels](http://getbootstrap.com/components/#panels)機能もあり、これも使えそうなのです<del>が、残念なことにうまくいきません。残念です。対処法は浮かんでいるのですが、そこまでして実装するものでもないと判断しました</del>[^2]。すみません普通に使えました。

以下のように記述すると、パネルが使えます(コードチャンク前の"\"は無視してください):

```
<div class="panel panel-info">
  <div class="panel-heading">iris dataset</div>
  <div class="panel-body">
hogehoge.

\```{r}
knitr::kable(head(iris))
\```

  </div>
</div>
```

詳細の説明は割愛しますが、上記Bootstrap本家の説明をちょっと読めば理解できるかと思います。なおこれはおそらく`<div>`タグ部分のhtml直打ちじゃないと厳しいはずです。あまりこういうのを多用し始めると、せっかくのR Markdownの良さが損なわれるので難しいところです…。

[^2]: コメントにより指摘を受けテストしたところ、普通に使えました。失礼しました…。

Enjoy!
CircleCIでbuild-toolsを23.0.2にした際にビルドが失敗する場合の対処方法

この記事は[AndroidのCI環境をCircleCIからWerckerにした話](https://speakerdeck.com/horie1024/androidfalsecihuan-jing-wocirclecikarawerckernisitahua)に関連した投稿です。

# 概要
build-toolsのバージョンを23.0.2に上げた際に、CircleCIのdependenciesで以下のようなエラーが発生し、ビルドが失敗するようになった。

```bash
Error: Ignoring unknown package filter 'build-tools-23.0.2'
```

# 対処方法

`build-tools-23.0.2`をダウンロードする前に`tools`のアップデートを行うと解決した。

```bash
dependencies:
  override(もしくは pre):
    - echo y | android update sdk --no-ui --all --filter "tools"
    - echo y | android update sdk --no-ui --all --filter "build-tools-23.0.2"
```


# 参考
* https://discuss.circleci.com/t/installing-android-build-tools-23-0-2/924
VPC内にbindを構築し、ProvidedDNSをforward先に指定する

##したいこと
Route53（PrivateDNS）の設定をした後に、
オンプレの環境からVPC内のProvidedDNSに対して名前解決を行い回答をもらう。

##直接はできないんです
オンプレの環境からVPC内のProvidedDNSに対して名前解決を行いたい！とAWSに聞いてみた。
AWSサポートからの回答
・オンプレミス環境からVPC内のデフォルトDNSサーバに対して名前解決することはできない
・必要な場合には、VPC内のEC2インスタンスにDNSサービスを構築し、forwarder先としてVPC内のデフォルトDNSサーバとすれば実現可能


#DNSを構築しよう@BIND

##前提
対象のVPCに対してRoute53(PrivateDNS)で正引き/逆引きのZone設定を行っていること
※PrivateDNSについては時間が有れば書きます。

##環境
VPC：192.168.0.0/16
→ProvidedDNSはVPC+2の「192.168.0.2」ということになる。
AmazonLinux：amzn-ami-hvm-2015.09.1.x86_64-gp2 (ami-383c1956)

SecurityGroupは適宜設定をお願いします。

##インストールなど
```bash
sudo yum update -y
sudo yum install bind -y
sudo cp /etc/named.conf /etc/named.conf.org
chkconfig named on
```

##設定ファイル

```bash:/etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
        listen-on port 53 { 127.0.0.1; XXX.XXX.XXX.XXX; };　//privateIPを追加
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        //allow-query     { localhost; };　　　　　　　 //コメントアウト
        allow-query     { any; };　　　　　　　　　　　　//localhost→anyに変更
        recursion yes;

        dnssec-enable no;　　　　　　　　　　　　　　　　//yes→no
        dnssec-validation no;　　　　　　　　　　　　　　//yes→no
        //dnssec-lookaside auto;　　　　　　　　　　　　 //コメントアウト

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

//zone "." IN {　　　　　　　　　　　　　　　　　　 　//コメントアウト
//      type hint;　　　　　　　　　　　　　　　　　　//コメントアウト
//      file "named.ca";　　　　　　　　　　　　　　 //コメントアウト
//};　　　　　　　　　　　　　　　　　　　　　　　　　　//コメントアウト

zone "." {　　　　　　　　　　　　　　　　　　　　　　//以下4行追加
        type forward;　　　　　　　　　　　　　　　　　　
        forwarders { 192.168.0.2; };　　　　　　　　　//ProvidedDNSのIPを記載
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

```


```bash:/etc/reslve.conf
以下に変更
nameserver 127.0.0.1
```

```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
以下に変更
PEERDNS=no
```

##起動

```bash
service named start
```


##テスト
nslookup 「Route53のレコードに登録してあるホスト名」
を実行し回答が帰ってくるか確認
【Swift2.0でMetal入門】2.Metalの描画フェーズ


この投稿は、[Swift2.0でMetal入門](http://qiita.com/s_s_k/items/b1a1f793afb470b03fd2)にたしての解説です。

[前回の投稿](http://qiita.com/s_s_k/items/db4c711f7c5be7ed70ab)はこちらです。

### 目的
Metalの使用用途がGameというイメージが強すぎるので、通常のアプリや表現としても使えることを探っていきます。

### 注意
MetalはiOS8以上の固有機能です。Metalを動かすにはA7チップ以上のデバイスが必要です。Macで開発する場合は
シュミレーターではなく、実機で確認するようにしてください。

# 描画ステージ
今回は描画フェーズについてです。

### レンダーパスデスクリプタを作成
レンダリングをするためにレンダーディスクリプタが必要です。テクスチャの設定、クリアカラーの設定などを行います。
クリアカラーとは描画するレイヤーを毎フレーム塗りつぶす色で、スクリーン上では
グラフィックスライブラリでは"塗りつぶし->描画ー＞塗りつぶし-＞描画"を常に繰り返しています。

```swift
let renderPassDescriptor = MTLRenderPassDescriptor()
renderPassDescriptor.colorAttachments[0].texture = drawable?.texture
renderPassDescriptor.colorAttachments[0].loadAction = .Clear
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(
    red: 1.0,
    green: 1.0,
    blue: 1.0,
    alpha: 1.0
)
```

### Commandバッファを取得
Commandバッファはレンダリングするための処理やモデリング情報を持った構造体みたいなものです。
このバッファを順番にGPUに渡します。GPU受け取った順に処理を実行します。動画のバッファを想像して貰えばよいかもしれませんが、バッファは次々とGPUに渡されますが、一つのバッファ処理が終わるまでは次のバッファにはとりかかれないので、前回作成したCommandキューにバッファを格納します。GPUはキューから順番にバッファを取り出して処理を進めます。

```swift
let commandBuffer = commandQueue.commandBuffer()
```

### 描画開始
描画の処理情報はCommandバッファー内にありますがそのままではGPUでは扱えません。
これを利用するにはコマンドバッファーをエンコードする必要があります。
MTLRenderCommandEncoderを作ります。

```swift
let renderEncoder: MTLRenderCommandEncoder = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
```

GPUが実行できるレンダリングコマンドを作ります。

```swfit
renderEncoder.setRenderPipelineState(pipelineState)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.setVertexBuffer(colorBuffer, offset: 0, atIndex: 1)
```

これでGPUが処理できる準備が整いました。
描画処理を実行します。

```swift
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 6, instanceCount: 1); // 描画
renderEncoder.endEncoding()
```

GPUの処理完了しました。最後に処理内容を画面上に表示します。

```swift
commandBuffer.presentDrawable(drawable!) // drawableはCAMetalLayerです。
commandBuffer.commit()
```


以上で描画が完了です。
まだもやもやしますね。この辺りはAppleの[Metal Reference](https://developer.apple.com/library/ios/documentation/MetalKit/Reference/MTKFrameworkReference/index.html#//apple_ref/doc/uid/TP40015356)をもう熟読する必要がありそうです。

引き続きMetal入門の記事で探ってみます。
xrandrで解像度設定

サスペンドから復帰時、解像度がおかしくなることがあったのでメモ

* [xrandr, dual monitor, openbox - setting the main monitor? / Applications & Desktop Environments / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=57593)

## 状態確認

```bash:状態確認
$ xrandr 
Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 32767 x 32767
LVDS1 connected (normal left inverted right x axis y axis)
   1280x800      60.24 +
   1024x768      60.00  
   800x600       60.32    56.25  
   640x480       59.94  
   640x400       60.00  
DP1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 528mm x 297mm
   1920x1080     60.00*+  50.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1680x1050     59.88  
   1600x900      60.00  
   1280x1024     60.02  
   1280x720      60.00    50.00    59.94  
   1024x768      60.00  
   800x600       60.32  
   720x576       50.00  
   720x576i      50.00  
   720x480       60.00    59.94  
   720x480i      60.00    59.94  
   640x480       60.00    59.94  
   720x400       70.08  
VGA1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
```

## 1920x1080に設定

```bash:
sudo xrandr --output HDMI1 --mode 1920x1080

## virtualboxだと以下
xrandr --output VGA-0 --mode 1920x1080
```


## 1280x1024に設定

```bash:
sudo xrandr --output HDMI1 --mode 1280x1024
```
CのfscanfによるCSV(カンマで区切られたファイル)の読み込みメモ

初心者によるメモ


fscanfにおいて，%sは空白文字(スペース，改行，タブ，改ページ…)で自動的に区切られる．
カンマは文字列の一部として読み込んでしまうので，カンマで区切られた文字列を読みこむときには%[^,]を用いる．
>fscanf(fp, "%[^,],&[^,],%s", buf1, buf2, buf3);

(行末はカンマでなく改行で区切られる点に注意)


```text:sample.csv
label1,label2,label3
0.1,1.5,1.7
0.2,1.7,2
0.3,2.1,2.6
```

```c:read_sample.c

#include <stdio.h>

int main(){
  FILE *fp;
  char *fname = "sample.csv";
  int ret;
  char buf[3][10];
  double data[3];

  fp = fopen( fname, "r" );
  if( fp == NULL ){
    printf( "%sファイルが開けません\n", fname );
    return -1;
  }
    
  printf("\n");
  
  fscanf(fp, "%[^,],%[^,],%s", buf[0], buf[1], buf[2]);
  printf("%s %s %s\n",buf[0], buf[1], buf[2]);


  while( (ret=fscanf(fp, "%lf,%lf,%lf", &data[0], &data[1], &data[2])) != EOF){
    printf("%lf %lf %lf\n", data[0], data[1], data[2]);
  }

  printf("\n");
  fclose( fp );
}

```


```text:出力結果
label1 label2 label3
0.100000 1.500000 1.700000
0.200000 1.700000 2.000000
0.300000 2.100000 2.600000
```
Raspberry Piにシリアル接続してEmacsを使うときC-x C-sでファイル保存ができない場合

　Rasbianを再インストールしたので以前書いた[Raspberry PiでEmacs 24.5とCaskを使う](http://qiita.com/masato/items/d6b35db6d63222d67812)を読みながらEmacsのインストールをしました。Emacsでプログラムを書いてファイルを保存しようと`C-x C-s` (コントロールを押しながらx,sの順にキーを押す)をしたところEmacsが反応せずファイルの保存ができません。


## X-ON/X-OFFフロー制御

　調べていると[Problem with GNU Screen when using Emacs C-x C-s (save-buffer)](http://superuser.com/questions/251446/problem-with-gnu-screen-when-using-emacs-c-x-c-s-save-buffer)に原因が書いてありました。`C-s`は送信を中断 (XOFF)するフロー制御文字のため、Emacsで`C-x C-s`を押してファイルを保存しようとするとScreenがフロー制御してしまうようです。

　今回の環境はOSXから[USBシリアル変換アダプター](https://www.switch-science.com/catalog/1032/)とScreenからRaspberry Piにシリアル接続しています。Screenデフォルトのエスケープ文字は`C-a`です。このままEmacsを使うと行頭に移動できなくなるので`.screenrc`を書いてエスケープ文字を`C-t`に変更しています。

```bash:~/.screenrc
escape ^Tt
```

### :flow off

　ScreenからRaspberry Piに接続した後に`C-t`を押してエスケープシーケンスから`:flow off`を入力します。

```bash
:flow off
```

<img width="400" alt="flow-off.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/cac9dc84-3be1-b2d3-2b4f-01cdc2efac46.png">


　`-flow`と表示されフロー制御がオフになります。
```
-flow
```

<img width="400" alt="-flow.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/ede29af3-f2a1-9692-1dcd-7b966a45d8a6.png">


### defflow off

　Raspberry Piに接続する度にエスケープシーケンスを入力するのも面倒です。OSXの`.screen`に`defflow off`を書いておくと設定が保存されます。

```bash:~/.screenrc
escape ^Tt
defflow off
```
WordPressテーマ作成でハマった件

# WordPressテーマ作成でハマった件
WordPressテーマ作成の黙示録的なものです。
ハマったら更新していきます。

## テーマ名
はい、いきなりハマりました。
_と数字はダメです。

## テーマのタグ
勝手に設定したらダメです。
下記の「Feature Filter」に表示される中から選びます。
https://wordpress.org/themes/

## 知らないstyle
知らないstyleが指定されていて、コメントウィジェットの表示が崩れる問題が発生。
調べてみると .recentcomments の style が勝手にインラインで入っている。しかも !important 付きvip待遇。
functions.php で、wp_head をフックして削除。

```lang:php
function remove_recent_comments_style() {
    global $wp_widget_factory;
    remove_action('wp_head', array($wp_widget_factory->widgets['WP_Widget_Recent_Comments'], 'recent_comments_style'));
}
add_action('widgets_init', 'remove_recent_comments_style');
```

via <a href="http://www.webopixel.net/wordpress/23.html" target="_blank">WordPressのhead要素を整理してみる</a>

## Bootstrap対応
Bootstrap対応のWordPressテーマ作成が簡単じゃなかった件
http://blog.lqd.jp/cms/001020.html

## jQuery

To Be Continued...


---

作ったテーマはこちらで配布しています。
https://lqd.jp/wp/
どのthreadが何をやっていて、どれぐらいCPUを使っているか

# 基本的なアイデア

/proc/\*/task/\*/stat から、各threadのcpu使用時間をもってくる。
pstack(gstack)で、各threadのstackをもってくる。sedで一行にするのが肝


# コード

```bash:thstat
#!/bin/bash
pid=$1
pstack ${pid} | sed -e ":a;N;s/\n\([^T].*\) .* in \(.*\)/ \2/;t a;P;D" | sed "s/Thread .* (Thread .* (LWP \(.*\))): \(.*\)/\1 \2/; s/ from [^ ]*\($\| \)/ /g; s/@@GLIBC[^ ]*//g; s/ ()\($\| \)/--/g; s/([^)]*)/()/g; s/ \[[^]]\+\]/\[\]/g; s/<[^<>]*>/{}/g; s/<[^<>]*>/{}/g; s/<[^<>]*>/{}/g;s/<[^<>]*>/{}/g;s/{}/<>/g; s/ /-/2g " | sort -nk1
while true ; do echo "time $(date +%H:%M:%S)"; cat /proc/${pid}/task/*/stat; sleep 2; done | awk '{if ($1=="time") {times=$2; printf ("\n%s ",times)} else {if ($1 in etime) printf("%d:[%s] ",$1,$14+$15-etime[$1]); etime[$1]=$14+$15}}'
```

# 出力例

```
$ thstat 22930
22930 runtime.futex--runtime.futexsleep--runtime.notesleep--stopm--findrunnable--schedule--runtime.park_m--runtime.mcall--runtime.g0--runtime.mstart--runtime.rt0_go--??--??--??--??--??--
22932 runtime.futex--runtime.futexsleep--runtime.notetsleep_internal--runtime.notetsleep--sysmon--mstart--runtime.mstart--crosscall_amd64--??--??--
22933 runtime.futex--runtime.futexsleep--runtime.notetsleep_internal--runtime.notetsleepg--runtime.signal_recv--os/signal.loop--runtime.goexit--??--
22934 runtime.futex--runtime.futexsleep--runtime.notesleep--stopm--findrunnable--schedule--runtime.park_m--runtime.mcall--??--runtime.mstart--crosscall_amd64--??--??--
22935 runtime.futex--runtime.futexsleep--runtime.notesleep--stopm--findrunnable--schedule--runtime.park_m--runtime.mcall--??--runtime.mstart--crosscall_amd64--??--??--
22936 runtime.futex--runtime.futexsleep--runtime.notetsleep_internal--runtime.notetsleepg--runtime.timerproc--runtime.goexit--??--
22939 runtime.futex--runtime.futexsleep--runtime.notesleep--stopm--findrunnable--schedule--runtime.park_m--runtime.mcall--??--runtime.mstart--crosscall_amd64--??--??--
22940 runtime.epollwait--runtime.netpoll--findrunnable--schedule--runtime.park_m--runtime.mcall--??--runtime.mstart--crosscall_amd64--??--??--

12:41:52
12:41:54 22930:[0] 22932:[0] 22933:[0] 22934:[0] 22935:[0] 22936:[0] 22939:[0] 22940:[0]
12:41:56 22930:[0] 22932:[0] 22933:[0] 22934:[0] 22935:[0] 22936:[0] 22939:[0] 22940:[0]
12:41:58 22930:[0] 22932:[0] 22933:[0] 22934:[0] 22935:[0] 22936:[0] 22939:[0] 22940:[0]
```