OmniAICreator/Qiita-1.07M huggingface dataset:
githubでネットワーク機器のコンフィグを管理したらこんな感じ

# はじめに

NetOpsCoding Advent Calendar 2015の25日目のエントリーです。
gitを使ってネットワーク構成変更をバリバリやる運用の話をします。
今回はgithubを使った場合を想定して紹介します。
あくまでも例なので、さらに良い方法があると思います。

# どんなことするの？
Github Flowを実践します。
今回の記事ではPull Requestをマージしていません。
これは後で、現状の問題点を記載しようと思います。

具体的には、以下の流れでネットワーク機器を変更します。

- 構成を変更する時に、branchを作って完成系のコンフィグを作りcommitし、pushする
- 差分から作業用コマンドを生成する
- 実際にネットワーク機器に設定する
- masterに最新のコンフィグを保管する

例があった方がわかりやすいと思うので、説明用のリポジトリを作りました。
自作自演しているので、複数の人がいるだろうと思って見ていただけると嬉しいです。
https://github.com/junpei-yoshino/sample-nw-config

# インターフェイスの設定を変える差分の例

## レビューフェーズ

インターフェイスのデスクリプションをつける変更を試しに例としてやってみました
https://github.com/junpei-yoshino/sample-nw-config/pull/1

変更内容に対して、コメントをつけて意味の確認等をします。
関係者が合意できたところで、レビュー終了です。

## 作業フェーズ
````
sample-nw-config junpei.yoshino$ git branch
* add-interface-description
  master
sample-nw-config junpei.yoshino$  git diff 3fabf287f8a781766a7c423449ddd24b85fe5a66 | grep "^+set" | cut -c 2-

set interfaces xe-0/0/0 description hogehoge

sample-nw-config junpei.yoshino$ git diff 3fabf287f8a781766a7c423449ddd24b85fe5a66 | grep "^-set" | sed -e "s/^-set/delete/g"

sample-nw-config junpei.yoshino$
````

ざっくりこれで入力すべき内容は出力できます。
すごく便利！

ただ、問題もあります。
以下のどちらもJunoserでの解析結果を活用する等で解決できると思っていますが、真面目には取り組めていません。

commitする前に事前のレビューの結果と差を確認するには以下のコマンドを実施すると良いです。コンフィグモードでのコマンド例です。
````
show | display set | save ftp://hogehoge/fugafuga
````

これでレビューの完成形とdiffを取れば、設定漏れや以下の問題を確認できます。

### 順序に意味があるもの
diffで追加された行しか表示できないため問題があります。
たとえば、firewall filter等のterm追加は上の手順では作れません。
簡単な内容ならinsertコマンドを作成し、

### 適切なdeleteの実行
````
set a b c d
````
に対して、
````
delete a b c d
````
を実行した結果
````
set a b c
````
という結果になる場合があります。
````
set a b
````
としたかった場合に問題になります。これは文法依存なので、もうちょっと頭良くdeleteコマンドを生成する必要があります。

## マージ方法
Pull Requestをマージしたいところですが、実機に反映されたコマンドの順序とレビュー時の順序が違う場合があります。
実機に入っているもののコンフィグ保存の側面もあるので、Pull Requestをマージではなく、masterに直接、実機から取ったコンフィグを入れてpushします。
コミットメッセージにはPull Requestの番号を含めることで差分とレビューをひも付けます。

https://github.com/junpei-yoshino/sample-nw-config/commit/4d2f3df3207c70f92abeb2f94ccf35718dc3d476

# これをやると便利なこと

## 例1: git grepで大体わかる

これなんのIPだっけとなったときに、以下のコマンドで、どこのどのインターフェイスについているアドレスかわかる。

````
git grep 2001:0DB8::1
````

これでIP表も捨てられます！

## 例2： junoserの活用
junoserはジュニパーネットワークスのJUNOSのコンフィグのPEGパーサーで、コンフィグのtypo等を発見してくれるツールです。
https://github.com/codeout/junoser

gitのフック機能を使って、変更したファイルをcommitする前に勝手にjunoserでチェックしてリポジトリにミスのあるコンフィグを送る前にチェックができるようにできます。
https://github.com/junpei-yoshino/sample-nw-config/blob/master/script/git-hook/pre-commit

一例をリポジトリに入れたので、これを.git/hooks/に置くことでチェックできるようになります。
問題ないコンフィグでもInvalidと警告が出た場合には、junoserにissue報告をお願いいたします。

# まとめ
github使ってコンフィグ管理するといろいろ便利なことがあることを紹介しました。
既存で履歴変更の管理ツールはあっても、変更予定内容のレビュー等まではできなかったと思います。

ネットワーク機器の設定を自動で変えているわけではないですが、この周辺にはいろいろな開発余地が残されているのではないでしょうか。
[Django] Generic editing viewsについて [1]

# はじめに
[Generic display views](http://qiita.com/KamekoKameKame/items/59e15b274084407ac281)に続いて、新規追加、編集、削除を行うGeneric editing viewsについても見てみます。

## Generic editing views
今回は[Generic editing views](https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-editing/#django.views.generic.edit.DeleteView)についてです。

# 最小限で
引き続き、最小限で実装します。[Generic display views](http://qiita.com/KamekoKameKame/items/59e15b274084407ac281)の続きからです。

## CreateView
まずは新規追加です。

veiwには利用modelとfieldを指定します。

```django:polls/view.py
from django.views.generic.edit import CreateView

class CreateQuestionView(CreateView):

    model = Question
    fields = ['question_text', 'pub_date']
```

モデルには追加後に表示するviewをget_absolute_urlに指定します。

```django:polls/model
class Question(models.Model):

    [追加]
    def get_absolute_url(self):
        return reverse('polls:detail', kwargs={'pk': self.pk})
```

formはquestionというmodelの新規追加の場合は[model名]に_formをつけた名前のテンプレートを用意します。

```django:templates/polls/question_form.html
<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Create" />
</form>
```

urls.pyに追加します。

```django:polls/urls.py
from django.conf.urls import url

from . import views

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^add$', views.CreateQuestionView.as_view(), name='add'),
]
```

[http://127.0.0.1:8000/polls/add](http://127.0.0.1:8000/polls/add) にアクセスします。

![add2.png](https://qiita-image-store.s3.amazonaws.com/0/21492/9d861a31-c13c-2123-ea45-92ef9478927d.png)

値を入力し、Createボタンを押します。

![add3.png](https://qiita-image-store.s3.amazonaws.com/0/21492/fa59bf60-0976-75b9-02cb-7d8300f1fee0.png)

追加されたレコードがDetailに表示されます。

# まとめ
長くなったので、続きます。
[\[Django\] Generic editing viewsについて \[2\]](http://qiita.com/KamekoKameKame/items/783db41876c93209f544)

## 最後に
これは[2015 tech-yuruyuru アドベントカレンダー](http://connpass.com/event/22759/)の10日目の記事です。
schrootでchroot

* dcrootはdeprecatedです。 schrootを使う。

## 参考

* [Ubuntu Manpage: schroot.conf - chroot definition file for schroot](http://manpages.ubuntu.com/manpages/wily/man5/schroot.conf.5.html)
* [BasicChroot - Community Help Wiki](https://help.ubuntu.com/community/BasicChroot)
* [DebootstrapChroot - Ubuntu Wiki](https://wiki.ubuntu.com/DebootstrapChroot)
* [Youhei SASAKI's official site: schroot: お手軽コンテナ(?)](https://www.gfd-dennou.org/member/uwabami/cc-env/SChrootEnvironment.html)

chroot他

* [chroot環境をJessie上に構築する - Qiita](http://qiita.com/niwatolli3/items/945a04f84e54226eb9c8)
* [Dockerとchrootを組み合わせたシンプルなコンテナデプロイツール - ゆううきブログ](http://yuuki.hatenablog.com/entry/droot#%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%E8%AA%AD%E3%81%BF%E3%81%9F%E3%81%84)
* [初心者インフラエンジニアがMINCSさわってみた - Qiita](http://qiita.com/mons1225/items/5ef8607d3b926f811363)

## インストール

```bash:
apt-get install schroot debootstrap
mkdir -p /srv/chroot/xenial
debootstrap xenial /srv/chroot/xenial
```

```bash:/etc/schroot/schroot.conf
[xenial]
type=directory
directory=/srv/chroot/xenial
# usersにschroot許可するユーザ一覧を列挙
users=user1
```

## user1にてchroot実施

```bash:sudo不要
cd ~
schroot -c xenial -p bash
```

* `-p`をつけると環境変数を引き継ぎ、X転送可能。
Pythonで順列と組み合わせ


Pythonでは、順列、組み合わせとかを本当に直感的に表示・計算出来て便利。
##参考

* [ここ](http://qiita.com/junkls/items/10384950963056cc8e08)の内容で全て事足りました。

##順列 (P:Permutations)

a,b,c,d,e 5つの要素が会った時の並べ方のパターンは、5!（5の階乗個）。つまり、

```math
_5 P _5 = 5! = 5 * 4 * 3 * 2 * 1 = 120
```

これをPythonで求めるためには、

```py
#coding:utf-8
import itertools

#並べる対象
s = ['a','b','c','d','e']

#list化
p = list(itertools.permutations(s));

#パターン表示
#print p

#パターン数表示
print len(p)
```

とする。
5つの中から、3つを選んで並べる場合、

```math
_5 P _3 = 5 * 4 * 3 = 60
```

となる。これをPythonで求める場合、

```py
p = list(itertools.permutations(s,3));
```

とする（上記、抜粋）。

##組み合わせ (C:Combinations)

次に順列。並べ順を問わず、要素が同じなら１つと数える。例えば、(a,b,c)と(a,c,b)等は1つと考える。
上記と同様、a,b,c,d,eから3つを選らんだ場合の組み合わせは、

```math
_5 C _3 = \frac{_5 P _3}{3!} = \frac{5 * 4 * 3}{3 * 2 * 1} =  10
```
となる。　これをPythonで計算するには、

```py
#coding:utf-8
import itertools

#並べる対象
s = ['a','b','c','d','e']

#list化
c = list(itertools.combinations(s,3));

#パターン表示
#print c

#パターン数表示
print len(c)
```

とする。
MacでPython使う時の最低限のメモ（Homebrew編）


まず、Macには最初からPythonがインストールされています。
これを利用してもいいのですが、homebrew版のを利用してみたいと思います。

その他、pyenvを利用してインストールや使用バージョンを管理することもできます。[こちら](http://qiita.com/zaburo/items/dd1a8323633035614efc)。

###環境

* Mac OSX 10.11.2(El Capitan)

###標準状態


```bash
which python
/usr/bin/python
```

###brew版のインストール

brew版では、Python2.x系とPython3.x系をインストールすることができ、Python3.x系はPython3としてインストールされるので、特に考えなくても共存できます。ここでは、とりあえずPython2.x系を利用してみます。

>brew info pythonとしてみるとわかるが、pipも一緒にインストールされるようです。

```bash
brew install python
```

インストール後、再度which pythonしてみると、

```bash
/usr/local/bin/python
```
brew版(/usr/local/bin/以下）が利用されています。
なお、これは、標準で、/usr/binより、/usr/local/binが優先されているためなので、何かしらの理由でPATHの設定がそのようになっていない場合は、.bash_profile等で優先順位をきちんと定義します。

###モジュール等のアップデート

pipはsetuptoolsをラップしているものらしいので、各ツールをアップデートしておきます。

```bash
pip install --upgrade setuptools
pip install --upgrade pip
```

>標準状態のpythonはpipは入っていないようです。その場合は、easy_install pipでインストールできます。

###インストール済モジュールの確認

一覧は、

```bash
pip freeze
```
で確認できます。各モジュールの詳細は、

```bash
pip show <package_name>
```

で見ることができます。パッケージは、

```
/usr/local/lib/python2.7/site-packages
```

にインストールされるようですが、これは元々のpythonもbrew版のpythonも同じ場所を見るようです。

###モジュールのインストール

必要なモジュールをインストールします。私は、とりあえず下記があれば事足ります。

```bash
pip install numpy
pip install matplotlib
pip install pillow
```

>matplotlibを入れるとnumpyもインストールされるようです。

###Django

とりあえず、Djangoのセットアップも書いておきます。It worked!が出るまで。

####インストール

```bash
pip install django
```

>pip install django==1.9などとして、バージョンをしていすることもできます。

####プロジェクト作成

```bash
django-admin.py startproject django_test
```

####テストサーバの起動と確認

```bash
cd django_test
python manage.py runserver
```

ブラウザでhttp://127.0.0.1:8000/ にアクセスしてみます。It worked!とでればOK。

brewでインストールされる2.7.11にはバグがあり、うまく起動しません。
既に2.7.10が入っていれば大丈夫なようですが。クリーンインストールの場合はダメなようです。
対策については[こちら](http://qiita.com/zaburo/private/802423b0d2d63b0cb456)に書きました。
Apache 設定


# はじめに
apache は初期設定のままではセキュリティ的に甘いところがあるため，その辺を最適化する．

対象: apache 2.4系

# security.conf

```apache
ServerTokens    Prod
ServerSignature Off
TraceEnable     Off
```


```apache
<Directory /var/www/>
        Options FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
```
AWSにLAMP環境を構築する

## はじめに
AWSのEC2にLAMP環境を構築する手順です。
ちょっとした検証にご利用ください。

## 構築するLAMP環境
1. Linux
    - OS : Amazon EC2
    - AMI ID : amzn-ami-hvm-2015.09.1.x86_64-gp2 (ami-383c1956)

2. Apache HTTPD
    - ver. : 2.4.16

3. MySQL
    - ver. : 5.5.46

4. PHP
    - ver. : 5.6.14

## 環境構築手順の流れ
1. EC2のインスタンスを作成します。
2. LAMP（Apache ウェブサーバー、MySQL、PHP ソフトウェアパッケージ）をインストールします。
3. 起動設定をします。

## EC2インスタンスを作成
1. EC2インスタンスを作成します。ポイントは、以下。
    - SSHのキーペアの秘密鍵（pemファイル）をクライアントPCに保存しておく。
    - セキュリティーグループの設定でHTTPポート、HTTPSポートにアクセスできるようにしておく。

## LAMP（Apache ウェブサーバー、MySQL、PHP ソフトウェアパッケージ）インストール
1. [インスタンスに接続します](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-connect-to-instance-linux.html "インスタンスへの接続")。

2. パッケージ情報を最新に更新します。
    
    ```bash
    [ec2-user ~]$ sudo yum update -y
    ```
    
3. Apache ウェブサーバー、MySQL、PHP ソフトウェアパッケージをインストールします。

    ```bash
    [ec2-user ~]$ sudo yum install -y httpd24 php56 mysql55-server php56-mysqlnd
    ```

4. 動作確認のためApacheウェブサーバを起動します。

    ```bash
    [ec2-user ~]$ sudo service httpd start
    Starting httpd:                                            [  OK  ]
    ```

5. ウェブブラウザでアクセスします。「http://パブリック DNS」のURLにアクセスします。EC2のインスタンス生成時に80番ポートをオープンしておく必要があります。以下のウェブページが表示されれば、インストールと起動は成功です。
    
    ![Apache.png](https://qiita-image-store.s3.amazonaws.com/0/107056/2fbda48b-d880-2626-bb58-2372b6a244a8.png)


## Apache ウェブサーバーの起動設定
1. chkconfig コマンドを使用して、システムがブートするたびに Apache ウェブサーバーが起動するように設定します。

    ```bash
    [ec2-user ~]$ sudo chkconfig httpd on
    ```

2. 起動設定を確認します。

    ```bash
    [ec2-user ~]$ sudo chkconfig --list httpd
    httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
    ```

3. EC2インスタンスを再起動して、Apache ウェブサーバーにアクセスできることを確認しておきます。


## おわりに
この後、運用環境にあわせて、Apache, MySQL, PHPの設定を別途行っていきます。
AWSはメンテナンスで停止したり再起動がかかったりすることがあります。
可用性を考慮してAWS上にLAMP運用する話は、また後日。

## 参考URL
[Amazon EC2 ユーザーガイド](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html "install-LAMP")
ns3でradiotap headerを含めたパケットキャプチャ


ns3でradiotap headerを含めたパケットキャプチャ

```
  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
  // ns-3 supports RadioTap and Prism tracing extensions for 802.11
  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
  std::string pfile = std::string(PROG_DIR) + "wifi-capture";
  wifiPhy.EnablePcapAll(pfile);
```
javascriptにおける同期処理と非同期処理

ものすごく基本的な事として、同期処理と非同期処理の違いが理解できていないので、コードを書きながら、理解していきたいと思います。

## はじめに
筆者はjavascriptの基本的な事を理解していない人間です。勉強のために書いていますので、間違いや、このサイト見なさい、などありましたらコメントいただけると非常にありがたいです。

## 同期処理
javascriptは上から順番にプログラムが実行されていきます。forループに入った場合もループ内の処理を順番に実行し、ループが終了後にforループの続きのプログラムが実行されます。

```js:forで何回もループさせる処理
for (i=0; i<30000; i++) {
	console.log(i);
}
console.log('------------');
```

この場合、forループの処理が全て完了してから``------------``が表示されます。


```:Consoleでの表示
1
2
3
4
.
.
.
29997
29998
29999
------------
```

``Array.prototype.map()``なども同期処理となります。

## 非同期処理
上記forループ内で使用した``console.log``も``for``も同期処理のプログラムですが、非同期処理になるプログラムもあります。

```js:非同期処理があるforループ
for (i=0; i<3; i++) {
  setTimeout(function(){
    console.log(i);
  },1);
}
console.log('------------');
```

``setTimeout``によって0.001秒後に変数``i``の値を``console.log``で表示します。これが非同期処理です。

```:Consoleでの表示
------------
10
10
10
```

`ajax`なども非同期処理として扱う事が多いかと思います。

## まとめ

forループ内で、非同期の処理を書かなければ、forループ内の処理が実行されてから、forループに続く処理が実行されます。処理される順番は非常に大切なので、同期処理されるプログラムと非同期処理になるプログラムとを区別・理解してコードを書いていきたいですね！
PhantomJS と CasperJS でスクレイピングして json で保存し GitHub で公開した


# 概要 と 動機

[5374 Official Website](http://5374.jp/) のデータを使ったサービスを作ることになった。

本来はゴミの日を提供するREST APIなどがあればいいのだが、現実にはゴミの日を提示するビューがあるだけ & ゴミの日パターンをJavaScriptでがんばって人間にやさしくしている。

「がんばって JavaScript(jQuery) がゴミの日を計算 & DOMを操作してビューを作ってくれる、その結果が欲しい」という状況であり、このデータを毎朝取得、そのデータをjson化し、GitHubに設置して、みんなに使ってもらおうというもの。

調べた結果、以下のものを使い、PhantomJSでヘッドレスで操作後のDOMを取得することにした。定期実行はjenkins + Docker でやる。

[PhantomJS | PhantomJS](http://phantomjs.org/)

[CasperJS, a navigation scripting and testing utility for PhantomJS and SlimerJS](http://casperjs.org/)


# 成果物

[PharaohKJ/scrape_5374](https://github.com/PharaohKJ/scrape_5374)
[PhalanXware/scraped-5374](https://github.com/PhalanXware/scraped-5374)


# やったこと と ハマりどころ

1. 動作環境の準備
2. コードを書く
3. Publish用のアカウントをGitHubに作る
4. Jenkinsに仕込む

## 1. 動作環境の準備

OSXで PhantomJS と CasperJS を用意したりしたが、全然うまく動かないでドハマリ。

そもそもCasperJSのメンテがアレなのかな？とりあえずそこら中を見まわった結果、動く組み合わせのソースコードHashを推測し用いるようにした。

そもそも最終的にはDocker運用しようと思っているので、Dockerを使う。PhantomJSのLinuxインストールは自前ビルドが推奨らしく、OSXのDocker上でbuildしたら1時間ぐらいかかった！ので、以下の成果物を使って欲しい・・・。

[scrape_5374/Dockerfile at master · PharaohKJ/scrape_5374](https://github.com/PharaohKJ/scrape_5374/blob/master/docker/Dockerfile)

[Docker Hub](https://hub.docker.com/r/pharaohkj/phantomcasper/)

## 2. コードを書く

Node.js/JavaScriptを書き慣れてないのがバレバレな感じでだいぶ苦戦した。特に変数スコープ、シーケンス周り。

### `casper.evaluate` がピンとこない

公式ドキュメントをちゃんと読め。まぁつまり、PhantomJSのページ内でevalということである。

#### デバッグログがでない

[CasperJSのヘッドレスブラウザ内のconsole.logの出力をコンソールに出す - 日々精進](http://anton0825.hatenablog.com/entry/20140717/1412008799)

#### 値を渡したり受け取ったりできない
 
 下記コードな感じ、toValueを指定すると、evalの先の関数に引数としてわたされる。この先の関数のreturn値ret_valueがgotValueとなる。
 
```capture.js
      gotValue = this.evaluate(function(to_value_param) {
        // PhantomJS内でDOM操作
        $('#select_area option').val(index).change();
        return ret_value;
      }, toValue);
```

#### 動作が早過ぎるとスクショとかとれない

ウェイトいれないと、svgのレンダリング前にとれちゃったりしてた。

#### シーケンスがピンとこない

まず、地域一覧を取得して、その数だけループする。1回ごとにwaitを入れたい。ってことが全然できなかった。とりあえず `casper.then` で実行するfunctionを順番に登録していき、最後の `casper.run()` で登録した順に実行する、ということに気づいたらできた。つまり

1. 地域一覧取得
2. 地域一覧分 casper.then をする
	1. 地域指定
	2. 少しまってデータ取得 & キャプチャ 
3. 取得したデータを書く

とやるべきで、thenとrunとwaitの意味を把握していないと、全然思い通りのシーケンスにならないので注意。

## 3. Publish用のアカウントをGitHubに作る

[k8s-bot (Kubernetes Bot)](https://github.com/k8s-bot)ちゃんをみて、弊社も作ろう！とし、 `pxw-bot`ちゃんを用意したところ、「きみ、botだよね？ちゃんとサポートに連絡してね」ってなっちゃった！まーしょうがないよね。ただいまカスタマーサポートをお願いしているところ。

## 4. Jenkinsに仕込む

gitが鍵の指定に対応していないので `~/.ssh/config` に以下のように書く & デプロイキーを用意すること.

```config
Host github-scraped-5374
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/secret-key-for-deploy
  TCPKeepAlive yes
  IdentitiesOnly yes
```

うーん。正直鍵認証より、https + Token のほうがよさそう。つまるろころ、GitHubのアカウント設定を開き **Presonal access tokens** を選んで適なtokenを発行(repositoryアクセスのみとかがよかろう)し、git cloneするときとか .git/config の remote を https://_account_:_token_@github.com/yourname/awesome-app.git とかにするとよい。

# 課題

スクショ、ドロップダウンボックスで地域を指定しているつもりが、ぜったいに末尾になってる・・・。
CentOS, yum でインスコした php で、sqlite3クラス か PDOクラス でアクセスする方法

# SQLite 便利
普段は、Oracle 使いな人なんですけど（といっても管理者じゃないのでたいしたことない）、ちょっとしたデータを扱うときにオッサンSEってシーケンシャルファイルとかcsvが大好きで使うけど（disってますｗ）SQL文書けるSQLite使った方が便利じゃね？って思たしだい。＃自分めも

# sqlite3クラス か PDOクラス 経由でアクセスしてエラーになるのを確認する
どうやら php 素でインスコした状態では、sqlite3クラス か PDOクラス のモジュールがインストールされてない。
PDO クラスは、マニュアルみると [(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)](http://php.net/manual/ja/class.pdo.php) って書いてあるのであれ？って思う。

```
# php -v
PHP 5.3.3 (cli) (built: Oct 30 2014 20:12:53) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

# ls /etc/php.d
curl.ini  fileinfo.ini  json.ini  phar.ini  zip.ini
```

sqlite3クラス か PDOクラス 経由でアクセスするプログラムを実行してみる。※hoge.db は、なくてok

```php:SQLite3.php
<?php
$db = new SQLite3( 'hoge.db' );
```

```php:pdo.php
<?php
$db = new PDO( 'sqlite:/tmp/hoge.db' );
```

を作って。ああ。エラーが出るのね・・って。

```
$ php SQLite3.php
PHP Fatal error:  Class 'SQLite3' not found in SQLite3.php on line 2
$ php pdo.php 
PHP Fatal error:  Class 'PDO' not found in pdo.php on line 2
```

# sqlite3クラス のモジュールをインスコ
PDOも同時にインスコされる、と思う

```
$ sudo yum -y install php-sqlite3
$ ls /etc/php.d
sqlite3.ini  pdo.ini  pdo_sqlite.ini

$ php phpinfo.php | tee | grep SQLite
PDO Driver for SQLite 3.x => enabled
SQLite Library => 3.6.20
SQLite3 support => enabled
SQLite3 module version => 0.7-dev
SQLite Library => 3.6.20

```

# PDOクラス のモジュールがインスコされない場合
何故か ```php-sqlite3``` をインスコしても PDOクラスのアクセスモジュールがインスコされないことがある（なぜ？）

```
$ sudo yum install php-pdo
```
ReactiveExtensionsでpreviousメッセージを一緒に取得する

# この記事について

xxがどれだけ増えたとか差分を取得したい時など、streamの前後の変化を使って何かしたい時って無いでしょうか？

この記事は、そんな時のCodeTipです。
コードサンプルはKotlin x RxJavaで説明します。

# bufferを使うと良いよ

bufferは、特定の条件(emit数/タイムアウト/他streamのemit)で区切ってstreamのメッセージを配列にまとめてくれます。

また、emit数の場合、skipも一緒に指定でき、コレのdefaultはemit数と同じ値です。例えばskip=1にすると、bufferをメッセージが1件通過する毎に下流へemitします。

この、emit数とskipを指定した場合のbufferを利用することで、1つ前のメッセージも同時に取得出来ます。

それでは、実際のCodeTipです。

```kotlin
Observable.just(1, 2, 3, 4)
        .startWith(0)
        .buffer(2, 1)  // count=2, skip=1
        .subscribe {
            Log.d("yashims85", "List[previous, current]: ${it.toString()}")
        }
```

bufferは指定した条件(今回の場合は2件)までたまらないと下流に流してくれないので、startWithで初期値を流すようにします。

```logs:結果
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [0, 1]
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [1, 2]
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [2, 3]
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [3, 4]
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [4]
```

completeの時に1件だけで来る場合もあるので、そこの処理だけ注意が必要そうですが、概ね期待通りの結果です。
zybo > 到着 > 評価ボード | JTAGケーブル | Vivado Voucher

秋月電子に注文していた ZYBO が到着した。

- ZYBO Zynq-7000 評価ボード : 24,700円
- JTAG-HS2 JTAGケーブル : 7,000円
- Vivado Voucher for ZYBO : 1,980円

開発用PCは１月９日に到着とした。

電源はUSB給電でしばらく使う。

現在使用しているMacbook Air上のvmwareではVivadoのライセンスがうまく使えないのと、Macbook AirのSSD容量が厳しいので、PC待ち。

Petalinuxを使う程度はできそうか。
[PostgreSQL 8.4+] WITH RECURSIVEの動作を理解する

# この記事が前提とする環境
PostgreSQL 8.4以上
※PostgreSQLに限らず[WITH RECURSIVEが存在するDBMS](https://ja.wikipedia.org/w/index.php?title=%E5%86%8D%E5%B8%B0%E3%82%AF%E3%82%A8%E3%83%AA&oldid=53379184#WITH_RECURSIVE)ならこの記事の内容は概ね通用すると思いますが、動作確認していないので前提とする環境からは外しています

# この記事が想定する読者
* WITHは知っているが、WITH RECURSIVEは知らない人
* WITHを用いたクエリは書けるが、WITH RECURSIVEを用いたクエリは書けない人

# この記事の目的
PostgreSQL 8.4以上に存在するWITH RECURSIVEは、連番のような、結果の出力にループ処理が必要なものを作るときに便利です。

```sql
WITH RECURSIVE seq(i) AS (
    SELECT 1
    UNION ALL
    SELECT i + 1 FROM seq WHERE i < 3
)
SELECT i FROM seq;
```

|i|
|---|
|1|
|2|
|3|

しかし初見では上のクエリがどのようにして下の結果を出力しているのかよく分からないと思います。そこで、この記事ではWITH RECURSIVEを用いたクエリの動作を説明します。

# WITH RECURSIVEを用いたクエリの動作
WITH RECURSIVEを用いたクエリは、通常のWITHを用いたクエリ同様、まずWITH RECURSIVE句の結果を計算した後、最後のSELECTを実行するという順番で処理されます。

```sql
WITH RECURSIVE seq(i) AS (
    SELECT 1
    UNION ALL
    SELECT i + 1 FROM seq WHERE i < 3
)
SELECT i FROM seq
```

この例の場合、`seq`を計算した後、`SELECT i FROM seq`を実行します。

WITH RECURSIVE句の結果の計算方法が問題なのですが、その説明をする前にまずは用語の定義をしておきます。[公式ドキュメント](https://www.postgresql.jp/document/9.4/html/queries-with.html#QUERIES-WITH-SELECT)によれば、WITH RECURSIVE句は必ず次のような形をとらなければならないとされています。

```
WITH RECURSIVE hoge AS (
    FROM hogeを含まないSELECT
    UNION ALLまたはUNION
    FROM hogeを含むSELECT
)
```

このとき、`FROM hogeを含まないSELECT`のことを**非再帰項**、`FROM hogeを含むSELECT`のことを**再帰項**と呼びます。

WITH RECURSIVE句の結果は次のようにして計算されます。

```
非再帰項を計算し、結果を作業テーブルと呼ばれる一時的な表に格納する
while (作業テーブルが空でない場合) {
    再帰項の「FROM hoge」部分を「FROM 作業テーブル」に置換し、計算結果を作業テーブルに再代入する
}
これまでの作業テーブルの各状態をUNION ALLまたはUNIONしたものをWITH RECURSIVE句の結果とする
```

実際に次の例を計算してみましょう。

```sql
WITH RECURSIVE seq(i) AS (
    SELECT 1
    UNION ALL
    SELECT i + 1 FROM seq WHERE i < 3
)
```

まず非再帰項を計算し、結果を作業テーブルの初期状態とします。

```sql
SELECT 1
```

|i|
|---|
|1|

現在の作業テーブルを元に作業テーブルを更新し、作業テーブルが空になるまでループを続けます。

```sql
SELECT i + 1 FROM 作業テーブル WHERE i < 3
```

|i|
|---|
|2|

↓

|i|
|---|
|3|

↓

|i|
|---|

これまでの作業テーブルの各状態を`UNION ALL`でまとめたものを`seq`とします。

|i|
|---|
|1|
|2|
|3|

これでWITH RECURSIVE句の結果が計算できました。

# まとめ

whileループが出てきたことからも分かるように、WITH RECURSIVE句が実際に行っているのは**再帰と言うよりもむしろ反復**です（[公式ドキュメント](https://www.postgresql.jp/document/9.4/html/queries-with.html#QUERIES-WITH-SELECT)もそう言っています）。この点が理解できればWITH RECURSIVEを用いて複雑なクエリを書くこともできるようになると思います。

# 参考リンク
[sql - How to select using WITH RECURSIVE clause - Stack Overflow](http://stackoverflow.com/questions/18659992/how-to-select-using-with-recursive-clause#18660789)

# おまけ

再帰といえばフィボナッチですが、フィボナッチはこう書けます。

```sql
WITH RECURSIVE fibonacci(i, x, y) AS (
    SELECT 0, 0, 1
    UNION ALL
    SELECT i + 1, y, x + y FROM fibonacci WHERE i < 10
)
SELECT i, x FROM fibonacci;
```

| i  | x|
|----+----|
|  0 |  0|
|  1 |  1|
|  2 |  1|
|  3 |  2|
|  4 |  3|
|  5 |  5|
|  6 |  8|
|  7 | 13|
|  8 | 21|
|  9 | 34|
| 10 | 55|
ESP8266 > system_get_rtc_time() > 正確な時計としての内部RTCがあるわけではなさそう

http://qiita.com/7of9/items/403fc6ac1cfdef7d1922
で見つけた system_get_rtc_time() について。

以下を見つけた。
http://www.esp8266.com/viewtopic.php?f=13&t=1702

> Using deep_sleep and waking automatically, the RTC clock time is being reset at the same time as the system clock

...

> According to specs found at http://bbs.espressif.com/download/file.php?id=520 , there is no internal RTC. So, emulation is all done in software.


RTCがあるわけではないということ。
ESP8266 > restart処理を試してみた

ESP8266でAD取込するときにincludeした user_interface.h を読んでいて気づいた　system_restart()。気になるので試してみた。

## 使用基板
以下のものにフォトトランジスタを実装したものを使用。
http://qiita.com/7of9/items/bc96d1cf17d4d87e1fcd#_reference-246bab51ca7c87b247a9

## プログラム

```.c
extern "C" {
#include "user_interface.h"
}

void setup() {
  Serial.begin(115200);
  Serial.println("\nsetup");
}

void loop() {
  char szbuf[] = "hello";

  for(int loop=0; loop < 3; loop++) {
    Serial.println(szbuf);
    delay(3000);
  }
  system_restart();
}
```

```txt:結果
[読めない文字列]
setup
hello
hello
hello
hello

 ets Jan  8 2013,rst cause:1, boot mode:(3,0)

load 0x4010f000, len 1264, room 16 
tail 0
chksum 0x42
csum 0x42
~ld

setup
hello
hello
hello
```

通常は起動時にシリアルのセットアップのためか読めない文字列が表示されてしまう。
system_restart()を使った時は、最初のセットアップ関連の文字列が表示された。

2013年1月8日はどういう日なのか不明だが興味深い。

restart()をどういう場面で使うかは未定。
[Realm] RealmのDBファイルをコードから削除



## いつ使う？

- 開発初期に頻繁にスキーマを変更する場合などにマイグレーションが面倒
- アプリ内で特定の条件でDBを削除したい
- DBがおかしくなった
- DBが不要になった
- テストのためにDBを初期化したい

## 方法

RealmのメソッドでDBのファイルのパスを取得して`NSFileManager`の`removeItemAtPath()`を使って削除します。

- 例 : 標準のfileURLの場合

```swift
// DBファイルのfileURLを取得
if let fileURL = Realm.Configuration.defaultConfiguration.fileURL {
    try! NSFileManager.defaultManager().removeItemAtURL(fileURL)
}
```

## 環境
- Swift 2.2
- Xcode 7.2
- Realm 0.96.3
Swiftで関数型FizzBuzz

[Swift その2](http://qiita.com/advent-calendar/2015/swift2) の最後の 3 日が投稿されなかったので 3 連投です。

[当初のアナウンス](http://blog.qiita.com/post/133976872844/advent-calendar-2015-ranking)によると

> カレンダーの25日間がすべて埋まっていることです。投稿を予定していた当日中に書けなかったとしても、カレンダーの最終日である12/25までに投稿されていれば条件を満たすものとします。

とあり、今から投稿しても条件を満たせるか未知数ですが、一応できることはやろうかと。

というわけで Swift で小ネタですが、 FizzBuzz を Swift で関数型っぽく書けば、次のように一つの式で書けます。

```swift
(1...100).map { switch ($0 % 3, $0 % 5) {
    case (0, 0): return "Fizz Buzz"
    case (0, _): return "Fizz"
    case (_, 0): return "Buzz"
    case (_, _): return "\($0)"
} }.forEach { print($0) }
```

実行結果は↓です。

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
98
...
Fizz
Buzz
```

しかし、上記のような方法を含め、一般的な方法では本来無限に続くはずの FizzBuzz 列 の最初の方を切り出したものしか作れません。

[ListK](https://github.com/koher/ListK) を使って遅延評価の力を用いれば、次のようにして無限 FizzBuzz リストを得ることができます。

```swift
import ListK

// 無限 FizzBuzz リスト
let fizzBuzz: List<String> = List<Int> { $0 + 1 }.map { i in
    switch (i % 3, i % 5) {
    case (0, 0): return "Fizz Buzz"
    case (0, _): return "Fizz"
    case (_, 0): return "Buzz"
    case (_, _): return "\(i)"
    }
}
```

`$0 + 1` して一度 `map` しているのは、 `0` からではなく `1` から始まるようにするためです。

なお、最初の 100 個の要素を取り出して表示するには次のようにします。

```swift
fizzBuzz.take(100).forEach { print($0) }
```
[Python]Anacondaで仮想環境を作る

#Anacondaで仮想環境を作る方法

とりあえず何でもいいのでAnacondaが入っていること。

## 仮想環境を作る
conda create -n 仮想環境の名前 python=x.x インストールするパッケージを羅列（区切り文字はスペース）

例）

```
conda create -n py27 python=2.7 anaconda
```
Proceed ([y]|n)?って聞かれるのでｙを押す

## 仮想環境の確認

```
conda info -e

# conda environments:
#
chainer                  /home/user/anaconda2/envs/chainer
py27                     /home/user/anaconda2/envs/py27
py35                     /home/user/anaconda2/envs/py35
tensorflow               /home/user/anaconda2/envs/tensorflow
root                  *  /home/user/anaconda2
```

## 仮想環境の削除

```
conda remove -n py27 --all

conda info -e

# conda environments:
#
chainer                  /home/user/anaconda2/envs/chainer
py35                     /home/user/anaconda2/envs/py35
tensorflow               /home/user/anaconda2/envs/tensorflow
root                  *  /home/user/anaconda2
```

## 仮想環境をActiveにする
```
user@MYPC:~$ source activate py27
discarding /home/user/anaconda2/bin from PATH
prepending /home/user/anaconda2/envs/py27/bin to PATH
(py27)user@MYPC:~$ conda info -e
# conda environments:
#
chainer                  /home/user/anaconda2/envs/chainer
py27                  *  /home/user/anaconda2/envs/py27
py35                     /home/user/anaconda2/envs/py35
tensorflow               /home/user/anaconda2/envs/tensorflow
root                     /home/user/anaconda2
```
windowsの場合は`activate py27`でActiveにする

## 仮想環境を非Activeにする
```
(py27)user@MYPC:~$ source deactivate
discarding /home/user/anaconda2/envs/py27/bin from PATH
user@MYPC:~$ conda info -e
# conda environments:
#
chainer                  /home/user/anaconda2/envs/chainer
py27                     /home/user/anaconda2/envs/py27
py35                     /home/user/anaconda2/envs/py35
tensorflow               /home/user/anaconda2/envs/tensorflow
root                  *  /home/user/anaconda2
```
windowsの場合は、`deactivate`で非アクティブにする

詳細は下記ドキュメントに書いてある
[conda document](http://conda.pydata.org/docs/using/envs.html#share-an-environment)

テスト環境：
OS: Ubuntu 14.04 LTE
Emacs で行番号を指定してファイルを開く

:bulb: 以下、`emacs` の部分は、あなたの Emacs 利用形態（新しい Emacs ではなくすでに起動している Emacs 上で開くとか）に合わせて `emacsclient -n` とかにしてください。

## ターミナルから行番号を指定して開く
Emacs のコマンドラインヘルプを見ると…

```bash
$ emacs --help
Usage: /usr/local/opt/emacs-mac/bin/emacs [OPTION-OR-FILENAME]...

Run Emacs, the extensible, customizable, self-documenting real-time
display editor.  The recommended way to start Emacs for normal editing
is with no options at all.

(snip)

Action options:

FILE                    visit FILE using find-file
+LINE                   go to line LINE in next FILE
+LINE:COLUMN            go to line LINE, column COLUMN, in next FILE

(snip)
```

ということで、`/path/to/hoge` ファイルの__20行目__を開くときは

```bash
$ emacs +20 /path/to/file
```

__20行目の40文字目__を開くときは

```bash
$ emacs +20:40 /path/to/file
```

です :exclamation: 


### `/path/to/file:20` で開きたい
- RSpec の行指定
- `grep -n` の出力
- `ag` の出力

と同じスタイルで開きたい場合、同じようにシェル関数を用意しておいて、

```bash
function e {
    local args
    args=`echo $1 | sed -E "s/([^:]+):([0-9:]+)/+\2 \1/g"`
    eval "emacs $args"
}
```

```bash
$ e /path/to/file:20
```

書いてて思ったんですけど、これ ag + peco と組み合わせると超便利コマンドが生まれるのでは… :bulb: 

### `/path/to/file 20` で開きたい
シェルだと補完が効いて、ファイル名の後に半角スペースが1個入ってしまう。じゃあそのまま第二引数で行番号を指定したい。

こういうシェル関数を `.bashrc` とか `.zshrc` に用意しておいて、

```bash
function e {
    local args
    args="+$2 $1"
    eval "emacs $args"
}
```

```bash
$ e /path/to/file 20
```

### どっちでも開けるようにしたい！

自分はどちらのスタイルでも開けるように、以下の様なシェル関数を `.zshrc` に定義してあります。

https://github.com/dtan4/dot.zsh/blob/0df6620f853d6a98de7b17de179dbbe3fc835f09/.zshrc.function#L22-L32

```bash
function e {
    local args

    if [[ $# -eq 2 ]]; then
        args="+$2 $1"
    else
        args=`echo $1 | sed -E "s/([^:]+):([0-9:]+)/+\2 \1/g"`
    fi

    eval "emacsclient -n $args"
}
```

## Emacs 上で行番号を指定して開く
そういうことができるコマンドは Emacs に存在しないので、既存の `C-x C-f` (find-file) を拡張することで対処します。以下のコードを `init.el` なりに追加しましょう。

```el
;; http://stackoverflow.com/questions/3139970/open-a-file-at-line-with-filenameline-syntax/3141456#3141456
(defadvice find-file (around find-file-line-number
                             (filename &optional wildcards)
                             activate)
  "Turn files like file.cpp:14 into file.cpp and going to the 14-th line."
  (save-match-data
    (let* ((matched (string-match "^\\(.*\\):\\([0-9]+\\):?$" filename))
           (line-number (and matched
                             (match-string 2 filename)
                             (string-to-number (match-string 2 filename))))
           (filename (if matched (match-string 1 filename) filename)))
      ad-do-it
      (when line-number
        ;; goto-line is for interactive use
        (goto-char (point-min))
        (forward-line (1- line-number))))))
```

これで、`C-x C-f /path/to/file:20` すればちゃんと20行目で開くようになります。

## REF
- [bash - Open a file at line with "filename:line" syntax - Stack Overflow](http://stackoverflow.com/questions/3139970/open-a-file-at-line-with-filenameline-syntax)
- [コマンドラインから行番号を指定してEmacsでファイルを開く 第1回 | ITEMAN Blog - アイテマンブログ](http://iteman.jp/blog/2009/01/post.html)
僕だってCardboardを使って5分でプロ生ちゃんになりたかった


この記事は[プロ生ちゃん Advent Calendar 2015](http://qiita.com/advent-calendar/2015/pronama-chan)の24日目です。

二日も遅刻して本当にすみませんっした！

***

僕「（朝か・・・）」
僕「（今年のイヴも一人だな・・・）」
僕「（はあ・・・今日も仕事だしそろそろ起きなきゃな・・・）」

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/76172/3eef09d7-a0cb-a790-c54e-cf31703096cc.png "ss1.png")


ん？ここは・・・

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/76172/d96fac0b-e87d-035d-d35c-db8af162e754.png "ss2.png")

え、あれ？

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/76172/5693e0d1-d1af-f95d-c977-f8fe25d6a440.png "ss3.png")

**ンアッー！女の子になっちゃう！**

# 生まれ変わるなら女の子になりたい！

前々から僕は女の子になってみたいと思っていました。いや、別に僕の嗜好はどノーマルで怪しいところは何もないのですが、綺麗じゃないですか、女の子。

そんな折プロ生ちゃんカレンダーを見ていたら[Perception Neuronを使ってプロ生ちゃんになる記事](http://dvorak.hatenablog.com/entry/2015/12/02/080000)を見つけて僕もやってみたい！と思ったわけです。

でも僕の手元にはPerception Neuronなんて無かったので、サンタさん（演：僕）にお願いしたら5分で実現したわけです。
**なお、頭以外は動きません。**

# 実現方法

1. Unityを起動します。
2. Cardboard SDKをインポートして、適当にCardboardMainのPrefabを配置します。
3. プロ生ちゃんのモデルをインポートして、適当にPrefabを配置します。
4. プロ生ちゃんのPrefabの中に、以下の画像のようにCardboardMainをねじ込みます

![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/76172/12769364-e10a-dfc3-f326-96017f20bd1f.png "ss4.png")

最後にCardboarMainとプロ生ちゃんのheadのY座標を調整すれば完成です。5分どころか3分で出来る手軽さ！

# 感想

女の子になった気分だけは味わえましたが、あまりに適当に作ったので向く方向によってはホラー映像が出来上がりました。

![ss5.png](https://qiita-image-store.s3.amazonaws.com/0/76172/ee231982-0799-388d-58b5-4a49d4c9e156.png "ss5.png")

（↑満面の笑顔で首をねじらせるプロ生ちゃんの図）

首がある程度回ったら体の方も回転させるように工夫する必要がありますね。

あと、プロ生ちゃんには適当にUnityちゃんの待機状態のアニメーションを適用しましたが、微妙に呼吸で頭が上下するんですねこれ。このぐらいなら大したことは無さそうですが、ベクションによる酔いに注意する必要がありそうです。

複数キャラ間でカメラを切り替えられるようにすればSIRENみたいなゲームが作れますね。VR空間内での移動方法として活用するのもありかも？何か出来たらまた記事書きます。

# 余談

正直、確認用の反射鏡を作る方が色々としんどかったです。
以下の記事の方法が一番手軽で参考になりました。

[Unity5でReflection Probeを使った反射を試してみた](http://icoc-dev.hatenablog.com/entry/2015/11/16/102718)
babel 6 やってみる

なんかバージョンが上がってやり方が変わったようです。

まずはバベルをグローバルにインストール。

```bash
npm install --global babel-cli
```

とりあえず初期化して、

```bash
npm init
```

プリセットというやつを入れる。

```bash
npm install --save-dev babel-preset-es2015
```

で、エディタで.babelrcなるファイルを作る。

```bash
vim .babelrc
```
中身はこんなの。

```json
{
  "presets": ["es2015"]
}
```

サンプル用のjsを書く。

```bash
vim sample.js
```

とりあえずクラスとかで。

```js:sample.js
"use strict";

class Person {
    constructor(name) {
        this.name = name;
    }

    greet() {
        console.log("Hello, I'm " + this.name);
    }
}

var bob = new Person("Bob");
bob.greet();
```

で、バベル実行。

```bash
babel sample.js -o sample-compiled.js
```

nodeで実行してみる。

```bash
node sample-compiled.js
```

いいんじゃないすかー。
電子工作 > リレータッチボード2455 > 粘着シートの試験 > トンボ鉛筆 WK-14ではタッチが認識された

http://qiita.com/7of9/items/41df6bbbf97568ab008a
にてRPiで動いたリレータッチボード2455.

粘着シートを探して試した。

近所のコーナンで購入できるものを選定。

## 3M CMR2

コマンドタブ CMR2 というもの。
一般にはポスターを貼ったりするのに使われるもの。
16枚入り、338円。

以下が装着の様子。場所を取る。そして、タッチが認識しない。次。

![IMG_0663.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/fbf02949-f71b-c24f-8467-947c6e9fd75f.jpeg)

## トンボ鉛筆 PD-WK14
Lサイズ
「いろんなところに貼ってはがせる粘着グミ」
ペタッツ　シートタイプ

40個入り　188円

以下のように貼ってみる。サイズはタッチボードと同じくらいか。

![IMG_0664.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/d539bd68-35d2-2bc4-e415-be4190a23b1b.jpeg)

動いた。連続動作でも取りこぼしない。

![IMG_0666.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/e4de6a2b-49a2-17b4-36f6-25166fdebc66.jpeg)

![IMG_0667.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/83941aea-b4b4-252c-837b-d83066dac971.jpeg)

粘着は結構しっかりしている。スマホを上下裏返しても取れることはない。

１ヶ月とかの長期使用時に粘着物がきれいにはがせるかは不明だが、ちょっとした試験動作には十分だと思われる。

### はる時の方法

はがすのは簡単。

はる時にシートからはがして対象物にくっつけるために、対象物にあてて力をかけることになる。
これをスマホの画面にするのはあまりよくないかもしれない。

以下のようにするのが良さそう

1. シート付きの粘着グミを2455の接着面にあてる
2. 上から力をかける
3. ゆっくりシートをはがす
4. 粘着グミつき2455をスマホの画面にあてて少し力を入れる

## プログラム

```relayTouchBoard.py
#!/usr/bin/env python

'''
v0.1 2015/12/24
  - add main routine
'''

import RPi.GPIO as GPIO
import time
import os

swio=12
GPIO.setmode(GPIO.BOARD)
GPIO.setup(swio, GPIO.OUT)

while True:
	GPIO.output(swio, True);
	time.sleep(0.1)
	GPIO.output(swio, False);
	time.sleep(2.0)
```

スリープを2.0, 2.0でやるとタッチが失敗する。
0.1, 2.0秒でやるとうまくいく。

人が指で押してすぐに離すイメージ。
php+twig慣れしてるのでpyramid1.5のテンプレートエンジンをjinja2にする

pythonでtwigっぽく書けるテンプレートエンジンってなんだろうと調べたらjinjaがそれに近いっぽかったので入れてみたメモです。

## setup.py書き換え

requiresにjinja2を追加する。

```python:setup.py
# 以下を追加
requires = [
    'pyramid_jinja2',
]
```

## development.ini書き換え

app.mainの下のincludeに追加。
それとjinja2.directories追加。

```development.ini
[app:main]
pyramid.include = 
    pyramid_debugtoolbar
    pyramid_tm
    pyramid_jinja2

# myappのところはアプリケーション名に
jinja2.directories = myapp:templates
```

## setup.py実行

以下を実行して、jinja2入れる

```bash
python setup.py develop
```

### __init__.pyを書き換え

configにいろいろ追加していく。

```python:__init__.py
def main(global_config, **settings):
    # config.scan()の前に追記
    config.include('pyramid_jinja2')
    config.add_renderer(".html", "pyramid_jinja2.renderer_factory")
    # myappはアプリケーション名に
    config.add_jinja2_search_path("myapp:templates")

    config.scan()
```

これであとはデフォルト拡張子がptになってるtemplatesをhtmlにして呼び出してあげればtwigっぽく書けそう！
RxJS 4 の merge の引数の差異 (concurrent 指定) と RxJS 5 での実装

RxJS 4.0.7 の merge の引数には差異があります。

merge* の operator の document は、次の 3 つです。

- [`Observable.merge`](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/core/operators/merge.md)
- [`Observable.prototype.mergeAll`](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/core/operators/mergeall.md)
- [`Observable.prototype.merge`](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/core/operators/mergeproto.md)

これらは次のような引数を取れます。

- `Observable.merge([scheduler], ...observables)`
- `Observable.prototype.mergeAll()`
- `Observable.prototype.merge(observable)`
- `Observable.prototype.merge(concurrent)`

なぜ、このように引数が違うのでしょうか。

# 挙動の確認

## Observable.merge([scheduler], ...observables)

[`Observable.merge(scheduler, ...observables)`](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/linq/observable/merge.js) は `Observable.ofWithScheduler(scheduler, ...observables).mergeAll()` です。

`scheduler` を省略した際は `Scheduler.immediate` が使われます。

最終的には `Observable.prototype.mergeAll` で merge されます。

## Observable.prototype.mergeAll()

[`Observable.prototype.mergeAll()`](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/perf/operators/mergeall.js) は流れてきた値を `Observable` として扱い `subscribe` します。流れてきた値 (`Observable`) に流れてきた値を自身の `Observer` に流します。

## Observable.prototype.merge(observable)

[`Observable.prototype.merge(observables)`](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/perf/operators/mergeconcat.js) は `Observable.merge(Scheduler.immediate, this, observable)` です。

これも `Observable.merge` なので、最終的には `Observable.prototype.mergeAll` で merge されます。

## Observable.prototype.merge(concurrent)

[`Observable.prototype.merge(concurrent)`](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/perf/operators/mergeconcat.js) は `mergeAll` と同様に流れてきた値を `Observable` として扱い `subscribe` します。ただし concurrent で指定された数までしか同時に `subscribe` しません。 

これは上記 3 つとは異なる動作です。

たとえば `this.merge(1)` は [`Observable.prototype.concatAll()`](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/linq/observable/concatall.js) の実装になっています。

# なぜ mergeAll は concurrent を指定できないのか

おそらく他の実装との整合性などの過去のしがらみか何かでしょう。

`Observable.prototype.merge(Number.POSITIVE_INFINITY)` では実装できそうですが、されていません。

# RxJS 5 では

RxJS 5 (5.0.0-beta.0 時点) ではその挙動が変更され [`Observable.prototype.mergeAll(concurrent)`](https://github.com/ReactiveX/RxJS/blob/5.0.0-beta.0/src/operator/mergeAll.ts) に変更されています。省略時は `Number.POSITIVE_INFINITY` です。
Objective-CでState Machine Pattern

##この記事の目的
・理屈はわかったので実装してみよう！
##ソース
https://github.com/y-hakutaku/StatePattern

##ソース解説
###ボタンを押すと春夏秋冬状態が遷移する。
　・状態遷移は各Stateが2秒おきに行う。
　・状態や情報をContextやViewに通知する。
　・View側は現在の状態を知らない。
　・各状態で必要な処理のみOverideする。基本Optional
　・状態遷移中は新たな状態遷移はさせない。

##ポイント
###View側は今の状態を知らずに処理を行える。
　・状態クラスでメソッドの実装(Override)するか否かで処理が分けられる。

##向いてる状況
　・状態によって処理を堅牢に分けたい時。独自プロトコルの通信など。

##向いてない状況
　・膨大な種類の状態がある場合。

##参考URL
https://ja.wikipedia.org/wiki/State_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
http://news.mynavi.jp/column/objc/117/
AlertDialogのボタンを有効・無効は便利！

## AlertDialogのボタンを有効・無効にする
結論から言うとこうです。
alertDialogのインスタンスからButtonを取り出し、setEnabledメソッドを呼びます。

```java
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(true); // NegativeButtonを有効に
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); // PoitiveButtonを有効に

alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false); // NegativeButtonを無効に
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); // PoitiveButtonを無効に
```

## これはどんな時に便利そうなのか？
DialogFrament内で、AlertDialogを使用している時にボタンの有効・無効が切り替えられると中々便利なのではないかと思ってます。

例えば、
DialogFramgne内でAlertDialgを生成して、その中のWebviewでページを表示する時に、loadが終わったらボタンを有効に
表示できてないのにOKボタンなどが押せるのは、おかしいですよね。
エラーじゃなかったらボタンを有効にします。

```java
webview.setWebViewClient(new WebViewClient() {
            // ページ読み込みエラー
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String url) {
                isWebviewError = true;
            }

            // ページ読み込み完了時
            @Override
            public void onPageFinished(WebView view, String url) {
                if (isWebviewError) {
                  alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
　　　　　　　　　　alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
                } else {
                  alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
                  alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(true);
                }
            }
        });
        webview.loadUrl("利用規約ページ");
```

他にも
・ネイティブ側でScrollViewやListViewが一番下までスクロールしたら有効に
・通信が終わり、Dialog内の情報が表示し終わったら有効に
・Webviewの例だと、利用規約などが表示できてたら有効に
などいろいろ使えそうな機能だと思います。
Swiftでクラスのプロパティ名一覧を取得する

RuntimeAPIを使った実装について書いていきます。

## Swiftでプロパティー一覧を取得する
下のようなコードでプロパティー名を取得できます。

class_copyPropertyListでプロパティー情報が取得できるので、property_getNameを使ってプロパティーの名前を取得します。

```swift
class MyClass: NSObject {
    var prop1 = ""
    var prop2 = ""
}

var count: UInt32 = 0
let properties = class_copyPropertyList(MyClass.self, &count)
for i in 0..<Int(count) {
    let prop = properties[i]
    let propName = NSString(UTF8String: property_getName(prop))
}
```

## 取得できるプロパティーの条件
上記方法でも常にプロパティーが取れるわけではありません。
取得できるプロパティーは「そのクラスがNSObjectのサブクラス」「プロパティーにdynamicか@objcが付いている」のどちらかを満たした物だけです。

```swift
class MyClass {
    dynamic var prop1 = "" // これは取得できる
    var prop2 = ""
}
```

privateなプロパティーも取得できませんでした。

```swift
class MyClass: NSObject {
    private var prop1 = "" // これは取得できない
    var prop2 = ""
}
```

## 文字列を使ってプロパティーを呼び出す
NSObjectを継承している場合はvalueForKeyを使えばメソッド名を使ったプロパティー呼び出しができます。

```swift
class MyClass: NSObject {
    var prop = ""
}

let myClass = MyClass()
myClass.prop = "PROP!!"
print(myClass.valueForKey("prop")) // → PROP!!
```

## class_copyIvarListを使ってプロパティー一覧を取得する
class_copyIvarListでもclass_copyPropertyListと同じようにプロパティー一覧を取得できました。
class_copyPropertyListと違ってclass_copyIvarListではprivateなプロパティーも取得する事ができました。

```swift
class MyClass: NSObject {
    private var prop1 = "" // これも取れた
    var prop2 = ""
}

let ivar = class_copyIvarList(MyClass.self, &count)
for i in 0..<Int(count) {
    let prop = ivar[i]
    print(NSString(UTF8String: ivar_getName(prop)))
}
```
VMware vSphere 6.0 環境構築　その4 vCenterにESXi登録

#概要
[その3](http://qiita.com/ToraLin/items/eb8358f90c1cf02a10e6)でESXiを2つ構築したので、
vCenter上で管理するように登録します。

#手順
##vCenterが登録されているか確認
vSphere web clientにログインします。
下のURLでログインします。
https://vcenterのFQDN/vsphere-client/

![SnapCrab_No-0000.png](https://qiita-image-store.s3.amazonaws.com/0/104247/78aab409-68ef-f408-27ae-11ea228a31d6.png)

トップに表示される「vCenterインベントリリスト」をクリックします。
![SnapCrab_No-0001.png](https://qiita-image-store.s3.amazonaws.com/0/104247/a69a47da-a474-e0b0-34fc-506ebc9ff66c.png)

「vCenter Server」をクリックします。
![SnapCrab_No-0002.png](https://qiita-image-store.s3.amazonaws.com/0/104247/ee959d05-eae1-7f1d-f417-701763f7742a.png)

初期インストール時に指定したvCenterが登録されているので、問題なしです。
![SnapCrab_No-0003.png](https://qiita-image-store.s3.amazonaws.com/0/104247/029e58d3-59f4-d1b7-4b3d-37dcfcd76b1a.png)

##データセンター作成
vSphere web clientでは、ホスト(ESXi)の管理を、「データセンター」というカテゴリで管理しています。
データセンターに登録されているホスト間でvMotionしたり、vSphere Fault Toleranceを構成したりするみたいです。
(vMotionは別データセンターでも出来るらしいです)

「vCenterインベントリリスト」から「データセンター」をクリックします。
![SnapCrab_No-0004.png](https://qiita-image-store.s3.amazonaws.com/0/104247/ac0bac28-d1aa-ece3-72c5-8515ba27730f.png)

「新しいデータセンターを作成します。」をクリックします。
![SnapCrab_No-0005.png](https://qiita-image-store.s3.amazonaws.com/0/104247/3cb0ac67-1be6-00c4-bfcb-a2c92a5f8ccb.png)

データセンター名を入力します。
![SnapCrab_No-0006.png](https://qiita-image-store.s3.amazonaws.com/0/104247/89092a33-43b9-2304-2ad1-7b3860a5d535.png)

データセンターが出来上がりました。
![SnapCrab_No-0007.png](https://qiita-image-store.s3.amazonaws.com/0/104247/756faa70-3f5d-0e62-2a2d-efeb7ccc892a.png)

##ホスト(ESXi)登録

「ホストの追加」をクリックします。
![SnapCrab_No-0008.png](https://qiita-image-store.s3.amazonaws.com/0/104247/77b0b3ef-58ff-4423-9012-44237f411eec.png)

追加するESXiのFQDNやIPアドレスを入力します。vCenterは名前解決が重要らしいので、FQDNが良さそうな気がします。
![SnapCrab_No-0009.png](https://qiita-image-store.s3.amazonaws.com/0/104247/5a0783f7-a6ee-4674-68b7-fa6eb4d24b32.png)

ESXiにログインするためのID,PASSを入力します。
![SnapCrab_No-0010.png](https://qiita-image-store.s3.amazonaws.com/0/104247/6bbba01d-9f22-d481-e66e-11488bdd9201.png)

![SnapCrab_No-0011.png](https://qiita-image-store.s3.amazonaws.com/0/104247/6f70c747-e334-8cf5-3aff-6a9cc2861603.png)

![SnapCrab_No-0012.png](https://qiita-image-store.s3.amazonaws.com/0/104247/4be66be2-2c5d-185b-b81f-2c656a5a9f33.png)

![SnapCrab_No-0013.png](https://qiita-image-store.s3.amazonaws.com/0/104247/2ce4ffef-3169-65a7-c28c-b5a66768268a.png)

ロックダウンモードは無効にします。これを有効にすると、ESXiに直接ログイン出来なくする機能になるので、
管理がやりやすくなる機能ではありますが、
Web Clientが使用出来なくなると、操作出来なくなりそうなので無効にしときます。
![SnapCrab_No-0014.png](https://qiita-image-store.s3.amazonaws.com/0/104247/a11e6c37-624e-1dd4-a44b-adbc80f399d9.png)

![SnapCrab_No-0015.png](https://qiita-image-store.s3.amazonaws.com/0/104247/b642a241-142f-7047-cf59-c11a6e87450f.png)

![SnapCrab_No-0016.png](https://qiita-image-store.s3.amazonaws.com/0/104247/5b58bee4-9795-17c7-55dd-fcff95da342f.png)

無事に登録できました。
![SnapCrab_No-0017.png](https://qiita-image-store.s3.amazonaws.com/0/104247/f51b172e-69c8-042e-1db8-b1b6a2962b00.png)

2個目のESXiも同様の手順で登録します。
↓登録完了後のホスト一覧画面
![SnapCrab_No-0031.png](https://qiita-image-store.s3.amazonaws.com/0/104247/d2371b07-6fcd-9c7f-c8c0-86cd6de8bc5c.png)
電子工作 > 電流制限回路 > 抵抗値の計算 > 0.9mA以下の制限には 666Ω の抵抗

http://qiita.com/7of9/items/e7ada5496d2a57ad5b31
のリンク先に紹介されている回路のうち、トランジスタ２個で構成する回路を試してみることにした。

抵抗Rの値をいくらにすればいいのか。

フォトトランジスタの接続時使用しているのは 1.1kの抵抗。
電圧Vを1.0V以下にする場合、

V = IR
1.0 = I * 1.1k
I = 0.9mA

という電流値での制限としたい。

http://www.nahitech.com/nahitafu/mame/mame2/lim01.html
に記載の不等式

I * R > 0.6 
で電流制限をかける場合、

I * R <= 0.6 として制限するとして
0.9mA * R <= 0.6
R <= 0.6 / 0.9mA = 600 / 0.9 = 666Ω

E12系列近いのは 6.8 x 10^2 の抵抗なのだろう。

リンク先のページには「数Ωの抵抗を使います」という記載があり、その点が少し気がかりである。
losetupでパーティションが切られているイメージファイルを扱う

# 参考

* [linux - Creating formatted partition from nothing - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/87183/creating-formatted-partition-from-nothing)

# イメージの準備

```bash:1GBイメージの作成
dd if=/dev/zero of=1gb.img bs=1M count=1000
```

```bash:第一パーティション(vfat)を作成してみる
fdisk 1gb
n p 1 Enter 100M
t b
a w
```

## /dev/loop0pXをパーティション毎に作ってくれるコマンド

```bash:
losetup -P -f --show 1gb.img
```

```bash:
mkfs.vfat /dev/loop0p1
```

```bash:
mount /dev/loop0p1 /mnt
```

## 後片付け

```bash:
losetup -d /dev/loop0
```
使いやすいシンプルな円を描くView

## 円を描きます！
xmlでやったり、Canvasを使うんでしょ・・・大きさの設定や位置の設定とか面倒だな・・・と思いきや、結構簡単なんです。
こんな感じ

```java
public class CircleView extends View {
    private Paint paint;

    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
    }

    public CircleView(Context context) {
        super(context);
        paint = new Paint();
    }

    public void setColor(int color){
        paint.setColor(getResources().getColor(color));
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        paint.setAntiAlias(true);
        canvas.drawCircle(canvas.getHeight() / 2, canvas.getHeight() / 2, (canvas.getWidth() / 2) - 2, paint);
    }
}
```

外からsetColorで色も指定できます！
こんな感じに

```java
circleView.setColor(R.color.white);
```

onDrawでcanvas.drawCircleを使い円を描きます。
これは、自分自身の大きさを取得し、Viewの真ん中に円を描く指定しています。これだけ

そしてこのクラスをlayoutを定義するxmlから以下のように設定し使います。

```xml
<test.ui.widget.CircleView
  android:id="@+id/circle_view"
  android:layout_width="48dp"
  android:layout_height="48dp" />
```

```java
CircleView circleView = (CircleView) view.findViewById(R.id.circle_view);
circleView.setColor(R.color.black);
```

こうすると、48dp*48dpのViewの真ん中に黒い円が描かれます。
シンプルで汎用性高いと思います。