OmniAICreator/Qiita-1.07M huggingface dataset:
R　ダミー変数からオッズ比を一気に求め、目的変数に対して有意に影響する要因のみ抽出する

##オッズ比が役立つ事例とは？
顧客ごとに広告を見たか見ていないかという説明変数群と、キャンペーンに応募したかどうかという目的変数（＝アウトカム）からなるデータがあります。オッズ比は、「キャンペーンに応募」したのはどの広告を見た顧客なのか、どの広告がキャンペーン応募に影響を与えたのか、センサーとなる広告を見つけるために有効な指標の１つといえます。

参考）[ダミー変数からオッズ比を求める時の解釈](http://qiita.com/ytakeda/items/3b686ff22b996b2ebad9)


##入力データセット
1.ダミー変数のデータセット
- 目的変数、説明変数ともダミー変数
- 目的変数となる変数を最終列に配置し、それ以外は説明変数からなるデータセット。

testdataset.txt
![image](https://qiita-image-store.s3.amazonaws.com/0/114127/97bed5a5-e2f6-89eb-2821-f10ba6f1d24d.png)


2.変数ラベルデータ
対象とする広告の種類が膨大な場合、変数のラベルは別のファイルにします。idは列の番号です。
var_list.txt
![image](https://qiita-image-store.s3.amazonaws.com/0/114127/346a1d63-b674-1768-b75e-c3dabd094519.png)



##アウトプットイメージ
 - オッズ比の降順に並び替えています。
 - 有意と判定された説明変数（要因）のみを抽出しています。
 - オッズ比1以上、オッズ比の下限が１以上、かつp値が0.05以下。
 - [Epiパッケージのtwoby2関数](https://oku.edu.mie-u.ac.jp/~okumura/stat/2by2.html)を使っています（有意性検定はWald検定、有意水準は5％）。
 
![image](https://qiita-image-store.s3.amazonaws.com/0/114127/ac823d85-59b5-0c74-9c93-2ef8a97e302b.png)



##結果の解釈
- オッズ比が2.631の広告：「無料サービス」で、この「無料サービス」を見なかった人に対して見た人は、2.63倍キャンペーンに応募した。
- 「無料サービス」のオッズ比は2.631と最も高いが、その信頼区間は1.19〜5.802と広い。信頼区間の幅が最も狭い（1.595-1.060=0.012)「モバイルゲーム」の広告のほうがオッズ比の値としては信頼できる（サンプルを別のものに変えても95％の確率でオッズ比が信頼区間内に収まる）。
- オッズ比が高く信頼区間の幅が狭い指標は、安定したセンサーとして活用できる。

##解釈上の注意
- オッズ比の値だけでなく、オッズ比の信頼区間にも注意を払う必要があります。信頼区間の幅が広い変数のオッズ比は、その広告を見た人数が少ないことによって影響され過大に大きくなるためです。
- オッズ比が1は、その広告を見た人も見ていない人も、キャンペーンの応募率は同じであることを意味します。オッズ比が１以下は、広告を見た人は、見なかった人よりもキャンペーンに応募しなかった（負の相関がある）ことになります。ここで問題にしてるのは「応募した人」の特徴なので、負の相関となる１未満のケースは抽出対象から除きました。


##Ｒスクリプト
```R:calc_sig_or.R
#データの読み込み
df<-read.table("testdataset.tsv",header=T)
#列の数をnに保存
n<-ncol(df)

#変数名データの読み込み
var_list<-read.table("varname.txt",header=T)

#Epiパッケージを読み込みます。
library(Epi)

#アウトプットのマトリクスを用意.
out<-matrix(0,nrow=n,ncol=5)
k<-0
#new_planと他の変数との全てのオッズ比を求め、下限が1以上、有意なオッズ比のみ抽出する　
for(i in 1:(n-1)){
  #念のため、df3[,i]のカテゴリが１つだけではないことをチェック
  #カテゴリが１つだけだと、2×2のクロス表にならないため。
  if(length(table(df[,i]))==2)
    {
      #twoy2(要因となる変数、結果変数)
      #結果変数は、campaign
       res<-twoby2(df[,i],df$campaign)
      #オッズ比
      oddsr<-res$measures[2,1]
      #信頼区間の下限
      CI_l<-res$measures[2,2]
      #信頼区間の上限
      CI_U<-res$measure[2,3]
      #p値
      pval<-res$p.value
      #オッズ比１以上、下限が1以上、p値が5％以下の場合、記録する
      if(is.finite(oddsr) )
      {
          if( oddsr>=1 & CI_l >=1 & pval<=0.05){
             k<-k+1
             out[k,1]<-i
             out[k,2]<-oddsr
             out[k,3]<-CI_l
             out[k,4]<-CI_U
             out[k,5]<-pval
          }
      }
    }  
}

#余計な列を削除
out<-out[1:k,]

#出力用にデータフレームにする
out<-data.frame(out)
colnames(out)<-c("col_no","オッズ比","信頼区間下限","信頼区間上限","p値")

#変数連番から変数名を紐付ける
out2<-merge(out,var_list,by.x="col_no",by.y="id",all.x=TRUE)

#オッズ比の降順に並べ替える
out3<-out2[order(out2$オッズ比,decreasing=T),]

#出力する
write.table(out3,"目的変数_有意なオッズ比.txt",sep="\t",fileEncoding = "CP932",row.names = F)

```

##参考になるページ
 -[オッズ比の95%信頼区間の求め方](http://www.stat.go.jp/koukou/trivia/careers/career4.htm)
nodeのバージョンをnで管理する

node.jsのバージョン管理は`nvm`がよく知られていますが、npmパッケージの`n`も使えます。
https://github.com/tj/n

## 前提
環境はmac前提です。

## インストール
まず、node.jsがインストールされていなければ、homebrewでインストールします。

```
brew install node
```

次にnpmでnをインストール

```
npm install -g n
```

## nを使ってみる
### バージョンの一覧表示

```shell-session
☁  ~  n list

    0.0.1
    0.0.2
省略
    5.7.1
    5.8.0
  ο 5.9.0

☁  ~
```

### 最新バージョンへ切替え

```shell-session
☁  ~  n latest
☁  ~  node -v
v5.9.0
☁  ~
```

### 特定のバージョンへ切替え

```shell-session
☁  ~  n 5.7.1

     install : node-v5.7.1
       mkdir : /usr/local/n/versions/node/5.7.1
       fetch : https://nodejs.org/dist/v5.7.1/node-v5.7.1-darwin-x64.tar.gz
######################################################################## 100.0%
   installed : v5.7.1

☁  ~  node -v
v5.7.1
☁  ~
```

## しめ
楽ちんですね。
快適なnodeライフを。
Squeak Smalltalkでズンドコキヨシ

- [ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)


```smalltalk
| zundoko last5 set |
zundoko := #(ズン ズン ズン ズン ドコ) asOrderedCollection.
last5 := zundoko copy.
set := zundoko asSet.
Transcript countOpenTranscripts isZero ifTrue: [Transcript open] ifFalse: [Transcript clear].
[Transcript show: (last5 removeFirst; add: set atRandom); space. last5 = zundoko] whileFalse.
Transcript show: 'キ・ヨ・シ！'
```
</br></br>
[日本語Squeak](https://osdn.jp/projects/squeak-ja/releases/59208)など、日本語表示が可能な Squeak Smalltalk 環境でワークスペースなどに貼り付けて do it すると動かせます。以下、各行でやっていることを簡単に解説。
</br>
```
| zundoko last5 set |
```
テンポラリ変数（zundoko、last5、set）の宣言。
</br>
```
zundoko := #(ズン ズン ズン ズン ドコ) asOrderedCollection.
```
 #(ズン ズン ズン ズン ドコ) 配列（#ズン 4つと #ドコを要素に持つ）を asOrderedCollection で可変長配列へ変換して zundoko に代入。
</br>
```
last5 := zundoko copy.
```
zundoko をコピーして last5 に代入。
</br>
```
set := zundoko asSet.
```
zundoko をセット（重複を許さない順不同集合）に変換して set に代入。
</br>
```
Transcript countOpenTranscripts isZero ifTrue: [Transcript open] ifFalse: [Transcript clear].
```
トランスクリプト（標準出力もどき）のウインドウがひとつもなければ新たに開いて、あれば中身を消去。
</br>
```
[Transcript show: (last5 removeFirst; add: set atRandom); space. last5 = zundoko] whileFalse.
```
last5 の最初の要素を除いてから、set（#ズン と #ドコ を要素に持つ）のどちらか（atRandom）を追加。追加した要素（#ズン か #ドコ）が返値になるので、それをトランスクリプトに出力（show:）。続けてスペースを出力準備。last5 が zundoko に一致するまで繰り返し。
</br>
```
Transcript show: 'キ・ヨ・シ！'
```
「キ・ヨ・シ！」を出力して終了。
SubGitでSubversionからGitへ移行

以前に、[逆パターン](http://qiita.com/n_slender/items/fe7a35d4f754b6db8cfb)の記事を書いたのですが、SubGitの日本語情報もあまりないので、この通常パターンについてもとりあげます。

[SubGitのpricing](https://subgit.com/pricing.html)をみると、subversion（svn）からgitへの移行（import）については、無料で使用でき、特に制限もありません。移行のための選択肢に十分になりうるでしょう。

[SubGitのサイトにはgit-svnとの比較ページ](https://subgit.com/documentation/gitsvn.html)もあります。Gitに移行するにあたって、情報が落ちない、時間がかからないなどの利点をあげています。

# 手順

## SubGitのインストール

java7以上が必要です。yumなど最新のjavaをインストールします。

[公式サイト](http://www.subgit.com/download.html)からダウンロードして、その中にあるbin/subgitにパスを通せばOKです。面倒ならパスを通さずに、そこを直接見にいくので可です。

## Subversionからインポート

このケースはそのためのコマンドが用意されているので簡単です。
`/var/www/svn`にリポジトリがあるとします。

```
$ subgit import --svn-url file:///var/www/svn/[repo_name]
```

上記で、`[repo_name].git`という、gitのベアリポジトリが、subversionのリビジョンを引き継いで作成されます。リビジョンが1000くらいあっても、数分で終わりました。

subversionリポジトリが、Redmineなどの別サーバにある場合は、下記のようになります。

```
$ subgit import --svn-url https://[redmine_server]/svn/[repo_name]
```

あとは、できあがったベアリポジトリで運用するか、その内容をGitHubなどのホスティングサービスに移行するだけです。

[SubGitのサイト](https://subgit.com/github.html)ではGitHubへの移行の仕方がでています。
こちらではSubGitでsvnリポジトリと同期するgitリポジトリをつくり、そのgitリポジトリのリモートにGitHub上のリポジトリを追加するという手順です。

移行するための微調整（subversionのレイアウトが通常と違うなど）の設定は公式サイトにあります。
https://subgit.com/import-book.html


# 他の移行ツール

* [git-svn](https://www.kernel.org/pub/software/scm/git/docs/git-svn.html)
* [svn2git](https://github.com/nirvdrum/svn2git)
* [svnからgitへの移行関連の記事まとめ](http://qiita.com/n_slender/items/c55a5a11976c67936676)

## 参考サイト

* [Subversionを使用し続けているプロジェクトがGitに移行することを考えてみた](http://qiita.com/sh-ogawa/items/0bac2516d85e3db4dfd8)
* http://www.slideshare.net/matthewmccullough/migrating-from-subversion-to-git-and-github
* http://peccu.hatenablog.com/entry/2015/11/08/000000
* http://posaune.hatenablog.com/entry/2014/02/04/005014
* http://vg.skr.jp/2013/08/subgit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/
* https://osdn.jp/magazine/12/09/27/0438209
* http://tracpath.com/works/development/subversion_vs_git/
VDI環境構築時にBGPとIPSec VPNを併用する場合の落とし穴

# はじめに
「インターネット分離」を目的に仮想デスクトップ（VDI)環境を導入する場合などで、下記のようにオンプレミス環境と仮想デスクトップ環境の間にCloud環境を挟むような構成をとることがあります。このような構成で環境同士の接続にBGPとIPSec VPNを併用することがあります。
![qiita-n1.png](https://qiita-image-store.s3.amazonaws.com/0/113341/2a3ba277-bc9d-70d4-491f-88274f91f706.png)
# BGPについて
BGPについては以下のURLを参照してください。
http://www.atmarkit.co.jp/ait/articles/0112/06/news002.html
# BGPとIPSec VPNを併用する場合の落とし穴
「はじめに」で紹介した構成に限ったことですが、以下の2つの落とし穴がありました。
## Cloud環境のNSX Edgeでダミーのルーティング設定が必要
BGPではお互いのルーター間でそれぞれが知っている全ての経路情報を交換します。ここで問題となるのはCloud環境のNSX EdgeではIPSec VPN越しの仮想デスクトップ環境上のネットワークへの経路情報を流しません。結果としてオンプレミス環境上のRouterはCloud環境の先にある仮想デスクトップ環境のネットワーク経路がわからず、正しくルーティングしてくれません。
回避策として、Cloud環境上のNSX Edgeでダミーのスタティックルーティング設定が必要です。この際、IPSec VPNのリモートネットワークで設定したPrefixとスタティックルーティングで設定するPrefixが被るとエラーとなるため、以下のようにPrefixを変える必要があります。

仮想デスクトップ環境上のネットワークは以下の２つです。
192.168.10.0/24
192.168.20.0/24

上記の場合、ダミーのスタティックルーティング設定では以下のように指定します。なお、このときのネクストホップ設定ではどのアドレスを入力しても構いません。
192.168.10.0/23
192.168.20.0/23

この場合の注意点として、192.168.11.0～192.168.11.255および192.168.21.0～192.168.21.255のアドレス帯がオンプレミス環境では使われていないことをご確認ください。
## （VDIのインターネット通信をオンプレミス環境上のRouter経由でのみ許可する場合）ローカルネットワークとして0.0.0.0/0の設定が必要
下記の図のようにインターネット通信をオンプレミス環境上のRouter経由でのみ許可する場合、BGPとIPSec VPNでそれぞれ以下の設定が必要です。
![qiita-n2.png](https://qiita-image-store.s3.amazonaws.com/0/113341/cebadd83-f2c6-ee7d-7d16-3f56723f0470.png)

### BGP
オンプレミス側のRouterで0.0.0.0/0のネットワークをredistributeするように設定します。
### IPSec VPN
Cloud環境のNSX Edgeではローカルネットワークとして「0.0.0.0/0」を設定します。また、仮想デスクトップ環境のNSX Edgeではリモートネットワークに「0.0.0.0/0」を設定し、更にExtensionとして以下の設定を追加します。
passthroughSubnets=192.168.10.0/24,192.168.20.0/24
securelocaltrafficbyip=0
#### passthroughSubnetsの説明
ここに記載したネットワークへの通信はVPN設定対象から外れます。
#### securelocaltrafficbyip=0 の説明
この設定で仮想デスクトップ環境上のポータルにインターネットからアクセスした場合でも戻りの通信がVPNを経由せずにインターネットに戻ります。逆にこの設定がないと戻りの通信がVPNへ向かい、正常に通信できなくなります。
リサイズマネージャを作って使う

サイトを作っていると、JavaScriptでウインドウのリサイズ時になにか処理をしたくなったりします。例えば、アイキャッチをブラウザのウインドウいっぱいにする、とか。

そういうときに、今までは普通に`$(window).on('resize', () => { (ここに関数書く) });`という感じで書いていました。が、「リサイズマネージャ的なものを作っとくと便利やで」と教えてもらったので、ちょっとやってみました。


## 考え方
* リサイズ用の関数をつくり、リサイズ時にその関数を実行する
* 関数の中に、リサイズ時に実行したい関数を入れる
* メインのJSでは、関数の追加と初期化しかおこなわない


## ResizeManager.js
`ResizeManager.js`がリサイズマネージャ本体です。コンストラクタ関数をのぞくと、`init`関数、`add`関数、`remove`関数、`update`関数があります。

`add`関数では、引数から受け取った関数を`this.functions`という配列に追加します。
`remove`関数では、関数を配列から削除します。
`update`関数では、`this.functions`に入れた関数をすべて実行しています。
そして、`init`関数で、ウインドウのリサイズ(と画面回転)時に`update`関数を実行しています。リサイズイベントが発生しまくるのを防ぐため、`window.requestAnimationFrame`を使ってイベントを間引いています。`window.requestAnimationFrame`が使えない古いブラウザなどでは`setTimeout`を使うようにしています。

参考：[高頻度で発生するブラウザイベントのイベントリスナー呼び出し最適化 - kitak.blog](http://kitak.hatenablog.jp/entry/2015/11/22/125315)

```js:ResizeManager.js
'use strict';

window.jQuery = window.$ = require('jquery');

export default class ResizeManager {
  constructor() {
    this.$window = null;
    this.windowWidth = 0;
    this.windowHeight = 0;
    this.functions = [];
    this.length = 0;
    this.fps = 60;
    this.isRunning = false;
  }

  init() {
    this.$window = $(window);
    this.update();

    this.$window.on('resize orientationchange', () => {
      if (!this.isRunning) {
        this.isRunning = true;

        if (window.requestAnimationFrame) {
          window.requestAnimationFrame(() => {
            this.update();
          });
        } else {
          setTimeout(() => {
            this.update();
          }, 1000/this.fps);
        }
      }
    });
  }

  add(func) {
    this.functions.push(func);
    this.length = this.functions.length;
  }

  remove(func) {
    this.functions.splice(func, 1);
    this.length = this.functions.length;
  }

  update() {
    this.windowWidth = this.$window.width();
    this.windowHeight = this.$window.height();

    for (let i = 0; i < this.length; i++) {
      let func = this.functions[i];
      func();
    }

    this.isRunning = false;
  }
};
```


## main.js
`main.js`が名前の通りメインのJSファイルです。これをBrowserifyなどでコンパイルして、ブラウザで実行します。  
このファイルでは、前述した`ResizeManager`クラスをimportして`resizeManager`インスタンスを生成し、あらかじめ定義した`add`関数と`init`関数を実行しています。`add`関数の引数に、リサイズ時に実行させたい関数をセットします。

```js:main.js
'use strict';

window.jQuery = window.$ = require('jquery');
import ResizeManager from './ResizeManager';
const resizeManager = new ResizeManager();

(() => {
  $(() => {
    // 関数の追加と初期化
    resizeManager.add(resized01);
    resizeManager.add(resized02);
    resizeManager.init();
  });

  // 関数の定義
  // ファイルを分けてimportしてもいいですね
  const resized01 = () => {
    console.log('is resized! 01');
  };
  const resized02 = () => {
    console.log('is resized! 02');
  };
})();
```

また、リサイズマネージャの中でウインドウの幅と高さを変数にセットしています。なので他の箇所でウインドウの幅と高さを取ってなんかやりたい場合は、`resizeManager.windowWidth`などとするとサイズが取得できます。


## まとめ
リサイズの処理はリサイズマネージャにまかせて、肝心の処理内容は別に記述することで、コードが綺麗になった気がします。な、なってるよね……。

「ブラウザの動き」といった画面全体の処理を外部化するのが目的だったので、同じ考え方でブラウザのスクロールを監視する「スクロールマネージャ」のようなものも作れると思います。

「もっと良い書き方があるぞ」という場合は是非教えていただければ幸いです。
VirtualBox + Vagrant  + Ansinble + 

# VirtualBox + Vagrant  + Ansinble + Movable Type

## 私の環境
Mac OS X El Capitan

## サーバーのOSは何がいいの？

> 必要インストール環境と、ブラウザ動作環境
> http://www.movabletype.jp/documentation/system_requirements.html

の

> Linux、Solaris / Unix、BSD

とりあえず無料のを入れたいのでここらへんかなと

それでも迷って・・・

> UbuntuとCentOSどっちがいいの？正しいサーバOSの選び方Add Starjun-kun
> http://d.hatena.ne.jp/lamich/20150330/1427731857

CentOSを採用

## Vagrantの公式のCentOSのVirtualBoxのboxてあるのかな？

> https://atlas.hashicorp.com/centos

# 忘れたｗのでメモ

https://github.com/devdrops-com/VVAM

## これが僕が作ってみたやつ

### 注意
事前にVagrantとVirtualBoxを最新版にすること。

1. zipをダウンロード
1. 解凍
1. 「VVAM-master」フォルダを適当にリネーム
1. 「www/public_html」を作る
1. 「www/public_html」の下に「mt」を入れとく
1. vagrant up
1. 途中で管理者のパスワードを聞かれたら入力
2. provisioning/hostsがなんちゃらと怒られたらchmod 644 provisioning/hosts
1. 今度は　vagrant provision
1. 何かしらどんどんインストールするのでとにかく待つ
1. 192.168.33.10にブラウザからアクセス
1. 192.168.33.10/mtにアクセス
1. ウィザート実行してmysqlの設定は  
サーバー：localhost  
データベース名：databasename  
ユーザー名：username  
パスワード：password
4. あとは適当

はい、できあがり
ズンドコキヨシ with ChucK


ズンドコキヨシまとめ
http://qiita.com/shunsugai@github/items/971a15461de29563bf90

オーディオプログラミング言語ChucKでズンドコキヨシを実装してみました。
音は鳴りません。ごめんなさい。でも、`=> now;`による待ちでリズムは合わせています。

[ChucK =&gt; Strongly-timed, On-the-fly Music Programming Language](http://chuck.cs.princeton.edu/ "ChucK =&gt; Strongly-timed, On-the-fly Music Programming Language")

```text
fun void zundokobushi()
{
    0 => int zunCount;
    while ( true )
    {
        if ( Math.random2( 0, 1 ) )
        {
            1 +=> zunCount;
            <<<"ズン","">>>;
        }
        else
        {
            <<<"ドコ","">>>;
            if ( zunCount >= 4 )
            {
                0.8::second => now;
                <<<"キ・ヨ・シ！","">>>;
                break;
            }
            0 => zunCount;
        }
        if ( zunCount <= 1 ){ 0.9::second => now; }
        else { 0.8::second => now; }
    }
}
zundokobushi();
```
ちなみに、ChucKのIDEであるminiAudicleだと日本語が文字化けしてしまいます。
Promiseでalwaysする方法

簡単で、`catch`以降に処理を書くとエラー発生の有無に関わらず実行される。[jsbin](https://jsbin.com/kosutu/edit?js,console)

```js
Promise.resolve()
  .then(() => console.log('通常時: 1'))
  .catch(err => {})
  .then(() => console.log('通常時: 2'))

// -> 通常時: 1
//    通常時: 2

Promise.reject(new Error())
  .then(() => console.log('エラー時: 実行されない'))
  .catch(err => {})
  .then(() => console.log('エラー時: 1'))

// -> エラー時: 1
```

## どのようなケースで使うか

あるスコープで発生したゴミをそのスコープ内で掃除したいというケースなどに有用。[jsbin](https://jsbin.com/miyelul/edit?js,console)

```js
const example = () => {
  const p = Promise.resolve()
    .then(() => console.log('ゴミが発生'))
    .then(() => {
      console.log('エラーが発生')
      return Promise.reject(new Error)
    })
    .then(() => console.log('通常なら実行される'))  // スキップされる
    .catch(err => {})
    .then(() => console.log('ゴミを処理'))          // エラーの有無にかかわらず実行される
  return p
}

example()
```

## 捕捉したエラーを変数に確保し、共通処理後にリジェクトするパターン

`example()`の呼び出し元でエラーハンドリングを行いたいことがある。
スコープ内で`catch`したエラーを共通処理後にもう一度`reject`してあげると、以降の`then`はスキップされ次に現れる`catch`でエラーを捕捉できる。[jsbin](https://jsbin.com/qoyifu/edit?js,console)

```js
const example = () => {
  let error
  const p = Promise.resolve()
    .then(() => console.log('ゴミが発生'))
    .then(() => {
      console.log('エラーが発生')
      return Promise.reject(new Error)
    })
    .then(() => console.log('通常なら実行される'))  // スキップされる
    .catch(err => error = err)                      // キャッチしたエラーを変数に格納
    .then(() => {
      console.log('ゴミを処理')                     // エラーの有無にかかわらず実行される
      if (error) {
        return Promise.reject(error)                // エラーがある場合はrejectする
      }
    })
  return p                                          // Promiseインスタンスを返却
}

example()
  .then(() => console.log('exampleが通常なら実行される'))       // スキップされる
  .catch((err) => console.log('exampleがエラーなら実行される')) // 実行される
```

### 捕捉したエラーを共有処理に渡し、共通処理後にリジェクトするパターン

次のように、`catch`で捕捉したエラーを`return`し、次の`then`に渡すというエラーを変数に確保しないパターンもある。[jsbin](https://jsbin.com/viteha/edit?js,console)

```js
const example = () => {
  return Promise.reject(new Error())
    .catch(err => err)
    .then((err) => {
      if (err) {
        return Promise.reject(err)
      }
    })
}

example()
  .catch((err) => console.log(err)) // 実行される
```

一時確保用の余計な変数がなくなって良さそうに見えるけど、`catch`前のチェーンで何かを渡している場合は、エラーが起こらないと`catch`後の`then`にその値が渡ってしまい、エラーではないのに`reject`してしまう。[jsbin](https://jsbin.com/qunave/edit?js,console)

```js
const example = () => {
  return Promise.resolve('エラーではない何か')
    .catch(err => err)
    .then((err) => {
      console.log(err)              // -> 'エラーではない何か'
      if (err) {
        return Promise.reject(err)
      }
    })
}

example()
  .catch((err) => console.log(err)) // -> 'エラーではない何か'
```

これは意図しない挙動で、`catch`後の`then`に渡ってくる引数がエラーなのかを判定しなければならない。[jsbin](https://jsbin.com/kutigu/edit?js,console)

```js
const example = () => {
  return Promise.resolve('エラーではない何か')
    .catch(err => err)
    .then((arg) => {
      console.log(arg)              // -> 'エラーではない何か'
      if (arg instanceof Error) {
        return Promise.reject(arg)
      }
    })
}

example()
  .catch((err) => console.log(err)) // 実行されない
```
Machine Learning (Andrew Ng) の宿題を提出する


現在 Homebrew でインストールされる Octave のバージョンは 4.0.0 なのだけれども、Coursera の Machine Learning [[1]] の宿題を提出できない。

```bash
% octave
GNU Octave, version 4.0.0
Copyright (C) 2015 John W. Eaton and others.
```

**追記**: 現在は バージョン 4.0.1 以降になっており、この問題は修正されているそうなので、Octaveをアップデートするほうがよさそうです。

```octave
submit
== Submitting solutions | Linear Regression with Multiple Variables...
Login (email address): ...
Token: ...
!! Submission failed: unexpected error: urlread: HTTP response code said error
!! Please try again later.
```

Course Forum [[2]] から `ML_Octave_400_patch.zip` を拾ってくる:

> Are you using Octave 4.0.0? You will need to install this <patch>.

zip の中にある lib で ex1/lib を上書きすればOK.




```octave
octave:1> submit
== Submitting solutions | Linear Regression with Multiple Variables...
Login (email address): ...
Token: ...
==
==                                   Part Name |     Score | Feedback
==                                   --------- |     ----- | --------
==                            Warm-up Exercise |  10 /  10 | Nice work!
```

[1]: https://www.coursera.org/learn/machine-learning/
[2]: https://www.coursera.org/learn/machine-learning/discussions/vgCyrQoMEeWv5yIAC00Eog
Markdown (マークダウン)チュートリアル

# はじめに

会社や学校などに入り、Markdownで記録することが、たまに...あると思います。
Markdownは覚えてしまえばすごく簡単です！是非この機会に覚えてみてはどうでしょうか？

#Markdownとは何か？
Markdown（マークダウン）は、文章の書き方です。デジタル文書を活用する方法として考案されました。

#### Markdownメリット
* 手軽に文章構造を明示できること
* 簡単で、覚えやすいこと
* 読み書きに特別なアプリを必要としないこと
* 対応アプリを使えば快適に読み書きできること
* Githubでも使用ができる

##### Markdownの書き方は様々存在します。そのため今回はその一部を紹介します。

---
## 1. 見出し
\#を増やしていくことにより文字の大きさが小さくなっていきます。
htmlだと`Hダグ`と同じ感覚です。

#### 入力

```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
```

#### 出力

# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6

## 2.イタリック、太文字
基本的には `*` `_` で囲った場合はイタリック表記
 `**` `__` で囲った場合は太文字表記
イタリックと太文字を併用したい場合は `***` `___` で囲うことで表示されます。

####入力 

```
*イタリック*
_イタリック_
**太字**
__太字__
***イタリックx太字***
___イタリックx太字___
```

#### 出力
*イタリック*
_イタリック_
**太字**
__太字__
***イタリックx太字***
___イタリックx太字___

## 3.取り消し線
チルダ(~)を２つ入力することにより取り消し線が表示されます。
#### 入力
```
~~取り消し線です~~
```
#### 出力
~~取り消し線です~~

## 4. 箇条書き(リスト)
主にハイフン`-`、アスタリスク`*`、プラス`+`を用いることで箇条書き表記にできます。

上記で挙げた３つ同じ表示となります。


```
- リスト１
  - リスト1-1
     - リスト1-1-1
* リスト１
  * リスト1-1
     * リスト1-1-1
+ リスト１
  + リスト1-1
     + リスト1-1-1
1. リスト１
2. リスト２
3. リスト３
```

#### 出力
- リスト１
  - リスト1-1
     - リスト1-1-1
* リスト１
  * リスト1-1
     * リスト1-1-1
+ リスト１
  + リスト1-1
     + リスト1-1-1
1. リスト１
2. リスト２
3. リスト３

## 5.リンク
\[タイトル](リンク)`[]`はタイトルとし、`()`はURLと覚えると簡単だと思います。
入力：`[Google](google.co.jp)`
出力：[Google](google.co.jp)

## 6.コード
ブロックの開始と終わりにバッククォートを３つ入力(  \```  )またチルダを３つ入力(\~~~)することでコードが表示されます。
全体表示

```
#include <stdio.h>
int main(void)
{
  printf("Hello, World!¥n");
  return 0;
}
```

一部のみを表示したい時はバッククォート(  \`  )を１つで囲むことで表示ができます。

#### 入力
```
ディレクトリ移動コマンドは`cd hoge`です
```
#### 出力
ディレクトリ移動コマンドは`cd hoge`です

## 7. 水平線
  `---`もしくは`***`で表示が可能です。
#### 入力
```
---
***
```
#### 出力
---
***

## 8.引用
引用は、行頭に半角不等号 (>) を入力することで表示できます。
#### 入力

```
Markdown歴史は以下の通りである。
>Markdownはジョン・グルーバー（John Gruber）によって2004年に開発された。
>最初は Daring Fireball: Markdown で公開されました。その後、多くの開発者の手を経ながら発展してきました。
```
#### 出力
Markdown歴史は以下の通りである。
>Markdownはジョン・グルーバー（John Gruber）によって2004年に開発された。
>最初は Daring Fireball: Markdown で公開されました。その後、多くの開発者の手を経ながら発展してきました。

##9.表（テーブル）
####入力

```
|ID|Name|Password|
|:--|--:|:--:|
|111|山田太郎|hoge|
|122|山田二郎|hoge|
|133|山田三郎|hoge|
```
#### 出力
|ID|Name|Password|
|:--|--:|:--:|
|111|山田太郎|hoge|
|122|山田二郎|hoge|
|133|山田三郎|hoge|

##10.チェックボックス
####入力

```
- [x]    チェックあり
- [ ]    チェックなし
```

#最後に

今回紹介した書き方は**あくまでも一部**です。自分にあった書き方を探してみてください。
Qiitaランキングを調べた


なんか 100 Contribution超えたので自分がどれくらいの位置なのかなーと思ってQiitaサイトをクロールして順位調べてみました。こういうことすると規約違反でBANされるのかなぁと思いながらやっちゃいました。運営さんごめんなさい。


# Qiita API

QiitaはちゃんとAPIを公開していて、そこからデータを取得できるようになっています。
当たり前ですが基本はスクレイピングなどはせずにこちらを使いましょう。

https://qiita.com/api/v2/docs

ただこのデータで各ユーザのContribution数は取得できません。

ランキングを競うのはQiitaの運営方針と違うんでしょうね。素敵です。

とはいえ自分の位置を知りたかったのでクロール＆スクレイピングで全ユーザのContribution調べてみました。

# だいたいの数値

運営方針（おそらく）に則りランキングは全公開はしませんが、せっかく調べたので目安だけ公開。
ちゃんとクロールできてる保証はないので参考程度にお願いします。

10,000 Contribution以上: 0.01%
1,000 Contribution以上: 0.39%
100 Contribution以上: 3.4%
10 Contribution以上: 9.8%
1 Contribution以上: 13.7%

86%以上のユーザはROM専ですね。1記事書いて自分でストックするだけで上位14%に入るチャンスががが。


# 自分の順位知りたい

順位を確認できるやつ

http://qiita-ranker.sacra.co/

（クロールした3/6~7のときのデータ）
MybatisでOracleにList<Object>を一括update

mybatisを利用して、OracleDBにList<Object>を一括update方法を紹介します。

# mapperメソッド定義

引数：insert対象リスト
itemListを一括DBにupdateします。

```
int updateitemPassword(@Param ("itemList" ) List<ObjectClass> itemList);
```

# mapper.xmlのSQL定義

## NGパターン

```
<update id ="updateBatch" parameterType= "java.util.List" >
	 <foreach collection ="itemList" item="item" separator= ";">
		  update TABLEAAA
		   <set >
				C1 = #{item.c1},
				C2 = #{item.c2}
		   </set >
		  WHERE ID = #{item.id}
	 </foreach >
</update >
```
書き方は大丈夫そうな感じですが、実はエラーが発生します。
Oracleの場合は特別です。

## OKパターン

```
<update id ="updateBatch" parameterType= "java.util.List" >
	begin
	 <foreach collection ="itemList" item="item" separator= ";">
		  update TABLEAAA
		   <set >
				C1 = #{item.c1},
				C2 = #{item.c2}
		   </set >
		  WHERE ID = #{item.id}
	 </foreach >
	;end;
</update >
```
使ってる開発ツールやエディタなど

自分のスキルの棚卸にもなるので、これまでつかってきたツールやエディタなどをさらしてみます。

# バージョン管理

## Git

* [SourceTree](https://www.sourcetreeapp.com/)

## Subversion

* [TortoiseSVN](tortoisesvn.net)

# エディタ

## テキスト

* [サクラエディタ](http://sakura-editor.sourceforge.net/)
* [mi](http://www.mimikaki.net/)

## markdown

* [Atom](https://atom.io/)
* [Kobito](http://kobito.qiita.com/win)

## CSV

* [Cassava Editor](http://www.asukaze.net/soft/cassava/)

# IDE

* [Eclipse](https://eclipse.org/ide/)
* [IntelliJ IDEA](https://www.jetbrains.com/idea/)

# ターミナル

* [Tera Term](https://ttssh2.osdn.jp/)
* [Cygwin](https://www.cygwin.com/)
* [Git Bash(Git for Windows)](https://git-for-windows.github.io/)

# DB・SQL

* [A5:SQL Mk-2](http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/)
* [QueryBook](http://www.querybook.gamaguti.jp/)
* [MySQL Workbench](https://www-jp.mysql.com/products/workbench/)
* [pgAdmin](http://www.pgadmin.org/)

# 仮想環境

* [Vagrant](https://www.vagrantup.com/)
* [VirtualBox](https://www.virtualbox.org/)

# ブラウザの開発者ツール

リクエストしたURLや、レスポンスまでの時間、スクリプトの動きなどを見るために。

* chrome：デベロッパーツール
* firefox: firebugs

# その他

## 画面キャプチャ

* [Rapture](http://www.geocities.jp/knystd/rapture.html)

## PDF出力

* [CubePDF](http://www.cube-soft.jp/cubepdf/)

# まとめ

あまり凝った使い方もしてないし、広く浅くという感じですね。普段使いしているものとなると、それほど多くはないですね。
MybatisでOracleに一括insert（id自動増加）

mybatisを利用して、OracleDBに一括insert方法を紹介します。
id自動増加パターン
OracleではID自動増加できないので、シーケンスを利用して、ID自動増加を実現できます。

[ID自動増加ではないパターン](http://qiita.com/yang1005/items/05488893fb3d4cfc58c0)

# mapperメソッド定義

引数：insert対象リスト
itemListを一括DBにinsertします。

```
int insertBatch(@Param ("itemList" ) List<ObjectClass> itemList);
```

# mapping.xmlのSQL定義

シーケンスを利用する

```
< insert id= "insertList" parameterType = "java.util.List">
      insert into TABLE_AAA (ID, C2, C3,C4
      ) select TABLE_AAA_SEQ.NEXTVAL, A.* from(
       <foreach collection = "itemList" item= "item" index= "index" separator = "UNION ALL">
          SELECT
            #{item.c2}as C2, #{item.c3}as C3, #{item.c4}as C4
          from dual
       </foreach >
      ) A
</ insert>
```

# 作成されるSQL

```
insert into TABLE_AAA(ID, C2, C3,C4)
select TABLE_AAA_SEQ.nextval, A.* from(
   select 22 as C2,33 as C3,44 as C4 from dual
   union all
   select 222 as C2,333 as C3,444 as C4 from dual
)A
```
MybatisでOracleに一括insert（ID自動増加なし）

mybatisを利用して、OracleDBに一括insert方法を紹介します。
ID自動増加ではないパターン

[ID自動増加パターン](http://qiita.com/yang1005/items/951cb8bc5aff23e6355e)

## mapperメソッド定義
引数：insert対象リスト
itemListを一括DBにinsertします。

```
int insertBatch(@Param ("itemList" ) List<ObjectClass> itemList);
```

## mapping.xmlのSQL定義
##　NGパターン

```
<insert id ="insertBatch" parameterType="java.util.List">
  insert into TABLEAAA (C1, C2)
  values
    <foreach collection ="itemList" item= "item"
      index= "index" separator =",">
      (#{item.c1},#{item.c2})
    </foreach >
</insert >
```
書き方は大丈夫そうな感じですが、実は下記エラーが発生します。
Cause: java.sql.BatchUpdateException : ORA-00933: SQLコマンドが正しく終了されていません。
; bad SQL grammar []; nested exception is java.sql.BatchUpdateException: ORA-00933: SQLコマンドが正しく終了されていません。
Oracleの場合は特別です。
##　OKパターン1
INSERT ALLを利用します。

```
<insert id ="insertBatch" parameterType="java.util.List">
  INSERT ALL 
  <foreach collection ="itemList" item= "item">
    INTO TABLEAAA (C1, C2) values (#{item.c1},#{item.c2})
  </foreach >
  SELECT * FROM dual
</insert >
```

##　OKパターン2
union allを利用します。

```
<insert id ="insertBatch" parameterType="java.util.List">
  insert into TABLEAAA (C1, C2)
   <foreach collection ="itemList" item= "item" separator= "union all">
    (select #{item.c1},#{item.c2} from dual)
   </foreach >
</insert >
```
nkfで文字コード変換したいときはこうする!!

CUI上で文字コードを変換するときにかなりお世話になるのがlvとnkfですね(自分は、ですけど
たまに、やり方を忘れるので、覚え書きを作りました、参考になれば
ちなみにCentOS 6.xのターミナル上で実行しているので、環境によっては使えないオプションもあるかも知れません

- インストール

yumの場合

```
yum install lv nkf
```

aptの場合

```
apt-get install lv nkf
```

- よく使うオプション

```
オプション一覧
-j(省略可能) : JISコード(ISO-2022-JP)を出力
-b           : バッファリング出力を行う。(デフォルト)
-u           : 出力時に、バッファリングしない
-e           : EUCコードを出力
-s           : Shift-JISコードを出力
-w           : UTF-8コードを出力（BOM無し）
-w8          : UTF8 コードを出力する。
-w16 -w16B0  : UTF16 コードを出力する。 (Big Endian / BOM 無し)
-w16B        : UTF16 コードを出力する。 (Big Endian / BOM 有り)
-w16L        : UTF16 コードを出力する。 (Little Endian / BOM 有り)
-w16L0       : UTF16 コードを出力する。 (Little Endian / BOM 無し)
-mB          : MIME base64 stream を解読する。ISO-2022-JP (B encode)
-mQ          : MIME quoted stream を解読する。ISO-8859-1 (Q encode)
-mS          : MIME のチェックを厳しくする (デフォルト)
-mN          : MIME のチェックを緩くする。改行で切られた MIME なども解読する。
-m0          : MIME を解読しない。
-mS          : 宣言の内容と、その後に続く encoded-text の整合性をチェックする。
-M           : MIME に変換する。ヘッダ形式に変換する
-MB          : MIME に変換する。base64 stream に変換する
-MQ          : MIME に変換する。Quoted stream に変換する
-g           : 自動判別の結果を表示
-x           : 半角カナを維持する
-X           : 半角カナを全角カナに変換する
-B           : JISコード(エスケープ無し)
-B1          : エスケープを問わない
-B2          : 改行後強制的にASCIIにする
-f[m[-n]]    : 一行 m 文字になるように、マージンを n として簡単な整形をおこなう。
-Z0          : Convert X0208 alphabet to ASCII.
-Z1          : JIS X 0208 和字間隔を ASCII space 一つに変換する。
-Z2          : JIS X 0208 和字間隔を ASCII space 二つに変換する。
-Z3          : ＞、＜、”、＆、を >、<、"、& に変換する。
-I           : ISO-2022-JP 以外の漢字コードを〓に変換。
-i[@B]       : JIS 漢字を指示するシーケンスを指定する。 (デフォルトは、ESC-$-B)
-o[BJH]      : 1 バイト英数文字セットを指示するシーケンスを指定する。 (デフォルトは、ESC-(-B)
-r           : ROT13/47 の変換をする。
-Lu          : unix改行形式(LF)に変換
-Lw          : windows改行形式(CRLF)に変換
-Lm          : macintosh改行形式(CR)に変換
--overwrite  : 引数のファイルに直接上書き
--version    : バージョン情報を表示

他にも文字コードを指定したりする-icとかありますが、あまり使わないので割愛w
```

# よく使う使い方

- SJISからUTF-8にする、ついでに改行もCR+LFからLFに

```
nkf -Lu -w --overwrite sample.txt
#パイプで使うなら
ls -al | nkf -Lu -w > sample.txt
```

- UTF-8 からSJISにする、ついでに改行もCR+LFにする

```
nkf -Lw -s --overwrite sample.txt
#パイプで使うなら
ls -al | nkf -Lw -s > sample.txt
```

- メールで使われるiso-2022-jpにする

```
nkf -j --overwrite sample.txt
#パイプで使うなら
ls -al | nkf -j > sample.txt
```
番外編：fess webクロール 認証

# 環境
fess-server-9.4.2

# ログイン画面のあるサイトのクロール方法
## 1.FESS管理画面～リクエストヘッダー
名前、値およびウェブ設定名を決定し、新規作成。
(例)
名前：FESS_TEST
値：1
ウェブ設定名：test

## 2.FESS管理画面～WEBクロールの設定
URLの項目にログインの次のページを設定する。

## 3.プログラム修正
※JScriptの例

```
if(Request.ServerVariables("HTTP_FESS_TEST") == "1"){
  ...
　※セッションにユーザー情報の値を自動セットするなど、シングルサインオンさせるように修正する
}
```

HTTP_名前の形式
※1で設定したリクエストヘッダーの名前に HTTP_の接頭辞を付与
番外編：SVNからGitへのソース移行

※branchやTagのある移行についてはまた別の機会に説明していく。
# 環境
Gitbucket 3.9
Git for Windows2.6.3 

# 前準備
## 1.Git-2.6.3-64-bit.exeよりGit for Windowsのインストール
インストール手順については省略

## 2.Git Bashの起動
すべてのプログラム→Git→Git Bash

## 3.作業フォルダーの作成(デフォルト=C://Users/(ユーザー名)/)
例：D:\gitwork

## 4.作業フォルダーにauthors.txtを作成

```text:authors.txt
(svnユーザ名)=(Gitユーザ名) <(Gitメールアドレス)>
```

# Git Bash
## 1.作業フォルダにcd

```
cd D://gitwork
```

## 2.SVNリポジトリの複製

```
git svn clone -A authors.txt svn://(サーバー名)/(プロジェクト名)
```

## 3.ローカルリポジトリにcd

```
cd D://gitwork/(プロジェクト名)
```

## 4.ローカルリポジトリ内のmaster確認

```
git branch -a
```

例：*master
     remotes/git-svn

※masterはSVNで言うところのtrunk

## 5.リモートリポジトリのパス登録

```
git remote add origin http://(サーバー名):8080/gitbucket/git/gp_(グループ名)/(プロジェクト名).git
```

※http～はリモートリポジトリのパス
　 originは何の名前でも良い。

## 6.ユーザーとEMAIL設定

```
git config user.name "(ユーザー名)"
git config user.email "(ユーザーメールアドレス)"
```

## 7-1.(4でmasterがある場合)リモートリポジトリへの登録

```
git push -u origin master
```

## 7-2.(4でmasterがない場合)リモートリポジトリへの登録

```
git branch local-trunk refs/remotes/git-svn
git push -u origin local-trunk:master
```

※remotes/git-svnは4の結果。それにrefs/を付与
　 refs/remotes/git-svnをlocal-trunkという名のローカルリポジトリのブランチで作成
　 ローカルブランチlocal-trunkをリモートリポジトリのmasterとしてpush
番外編：grails.config.locationsの設定 

# 環境
grails 2.3.11
groovy 2.1
GGTS3.6.4 

# grails.config.locationsとは
メイン設定にマージされるべきプロパティファイルや追加のGrails設定ファイルの場所である。

初期に生成されるConfig.groovy中には、以下のようにある。

```groovy:Config.groovy
// grails.config.locations = [ "classpath:${appName}-config.properties",
//                             "classpath:${appName}-config.groovy",
// "file:${userHome}/.grails/${appName}-config.properties",
// "file:${userHome}/.grails/${appName}-config.groovy"]
```

${appName}-config.groovyと書いてあったので、.classでなく.groovyでないと 読み込めないと
思いこんでしまい、Tomcatのwarデプロイ時にうまくいかなかったが、普通 に.classを読み込んだのでメモ。

以下ソース 

```:grails.config.locations
if (Metadata.getCurrent().isWarDeployed()){

    //log.warn 'warデプロイ'

    def path = getClass().getProtectionDomain().getCodeSource().getLocation()
    .getFile().replace(getClass().getSimpleName() + ".class", "").substring(1);

    grails.config.locations = ["file:" + path + "add-config.class"]

}else{

//log.warn 'eclipse起動'

grails.config.locations = ["file:buildターゲットフォルダ名/classes/add-config.class"]
```
Pythonで、SkypeとChatworkへメッセージを送る

```py:filename.py
# coding: utf-8

import sys
import Skype4Py
import pycurl
import urllib
import json
from io import BytesIO

argv1 = unicode (sys.argv[1], 'utf-8', 'ignore')
	
def GetChat (skype, topic):
	for ct in skype.Chats:
		if ct.Topic == topic:
			return ct

def callSkype ():
	skype = Skype4Py.Skype ()
	skype.Attach ()
	message = txt + argv3
	chat = GetChat (skype, u"Skype chanel name")
	chat.SendMessage (message)
	
def callCW ():
	roomId = '123123123'  # room id
	url_message = 'https://xxxxxxxxxxxxxxxxrooms/' + roomId + '/messages'
	url_members = 'https://xxxxxxxxxxxxxxxxrooms/' + roomId + '/members'
	token = 'X-ChatWorkToken: 123123123123123123'

	curl = pycurl.Curl()
	curl.setopt(pycurl.HTTPHEADER, [token])

	def getAllMembers ():
		curl.setopt(pycurl.URL, url_members)
		b = BytesIO()
		curl.setopt(pycurl.WRITEFUNCTION, b.write)
		curl.perform()
		members = json.loads(b.getvalue())
		msg = ""
		for member in members:
			msg += "[To:" + str(member["account_id"]) + "]"
		return msg
	
	txt = "[title]" + getAllMembers () + "[/title]" + argv1
  	

	message = "[info]" + txt + argv1 + "[/info]"
	option = {'body': message}

	curl.setopt(pycurl.URL, url_message)
	curl.setopt(pycurl.POST, 1)
	curl.setopt(pycurl.POSTFIELDS, urllib.urlencode(option))
	curl.perform()
	
if __name__ == '__main__':
	callSkype ()
	callCW ()

```
HTML5とCSS3でズンドコキヨシもどき

[ズンドコブーム](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)にのって、HTML5とCSS3で挑戦しました。
入力欄に「ズンズンズンズンドコ」というフレーズが入力されると「キ・ヨ・シ！」します。

<p data-height="265" data-theme-id="0" data-slug-hash="VaPPjO" data-default-tab="css,result" data-user="anchoor" data-embed-version="2" data-pen-title="HTML5とCSS3でズンドコ" class="codepen">See the Pen <a href="https://codepen.io/anchoor/pen/VaPPjO/">HTML5とCSS3でズンドコ</a> by anchoor (<a href="https://codepen.io/anchoor">@anchoor</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>


##せいいっぱいの実装
* input要素のpattern属性で入力値バリデーションする
* 入力値がvalidな場合、:valid疑似クラスを利用して「キ・ヨ・シ！」を出す
  * input要素には::after疑似要素を使えないため、「キ・ヨ・シ！」用にspan要素を配置する
* 入力値がvalidな場合、入力欄より一回り大きいspanを上にかぶせて以降の入力を不可とする（美しくないしフォーカスがそのままだと入力できてしまう…:astonished:）
ズンドコキヨシ with Python ワンライナー

なんか流行っているみたいなので便乗します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
http://qiita.com/shunsugai@github/items/971a15461de29563bf90




Pythonのコードは結構掲載されていたのですが、Pythonのワンライナー枠が空いてそうだったので書きました。

```
$ python3 -c'import random as r;z,d,p="ズン","ドコ",lambda v:print(v) or v;t=[z,z,z,z,d];_=lambda s:s==t or _((s+[p(r.choice([z,d]))])[-5:]);_([]);p("キ・ヨ・シ!!")'
```

実行結果

```
$ python3 -c'import random as r;z,d,p="ズン","ドコ",lambda v:print(v) or v;t=[z,z,z,z,d];_=lambda s:s==t or _((s+[p(r.choice([z,d]))])[-5:]);_([]);p("キ・ヨ・シ!!")'
ドコ
ズン
ドコ
ドコ
ドコ
ズン
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ズン
ドコ
ズン
ドコ
ズン
ズン
ドコ
ドコ
ズン
ドコ
ドコ
ズン
ズン
ドコ
ズン
ドコ
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ!!
$
```

[追記]

ゴミが表示されるよとのご指摘をいただいたのでちょっとだけ修正したのも載せておきます。

```
python3 -c'import random as r;z,d,p="ズン","ドコ",lambda v:print(v) or v;t=[z,z,z,z,d];_=lambda s:s==t or _((s+[p(r.choice([z,d]))])[-5:]);n=_([]);n=p("キ・ヨ・シ!!")'
```
Python Https 認証

```py:filename.py
# -*- coding: utf_8 -*-  
import urllib,urllib2
import sys

def test ():
	sys.argv.pop(0)
	ids = sys.argv[0]
	branchName = sys.argv[1]
	resourceId = sys.argv[2]
	filesId = sys.argv[3]

	txt = "hello world"
	print 'txt:', txt

	mydata=[('ids',ids),('txt',txt)] 
	mydata=urllib.urlencode(mydata)
	path='https://xxxx.xx.xx.php'
	password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
	password_mgr.add_password(None,path,"username","password")
	opener = urllib2.build_opener(urllib2.HTTPSHandler(),urllib2.HTTPBasicAuthHandler(password_mgr))
	urllib2.install_opener(opener)

	req=urllib2.Request(path, mydata)
	req.add_header("Content-type", "application/x-www-form-urlencoded")
	page=urllib2.urlopen(req).read()

	print page

if __name__ == '__main__':
	test()
```
DOMDocumentを使ってViewのテスト



# Sample

```
// DOMDocumentを使う準備
		$dom = new DOMDocument('1.0', 'UTF-8');

// View（HTML出力）をロード
		$dom->loadHtml($this->view);

// タグ検索はXPath使う
		$xPath = new DOMXPath($dom);

// この例は<input id="BlockPublishStart" />なタグを検索
// queryにヒットした結果が全て返ってくるのでヒットするのが1つでも  ->item(0) で指定して何個目をとるか指定必要
		$inputPublishStart = $xPath->query('//input[@id="BlockPublishStart"]')->item(0);

// ->getAttributeで属性が取れるので属性テスト
		$this->assertEquals('yyyy-mm-dd hh:nn', $inputPublishStart->getAttribute('placeholder'));
		$this->assertContains('=\'2014-01-01 09:00:00\'', $inputPublishStart->getAttribute('ng-init'));
		$this->assertEquals('text', $inputPublishStart->getAttribute('type'));
		$this->assertEquals('2014-01-01 09:00:00', $inputPublishStart->getAttribute('value'));
		$this->assertEquals('data[Block][publish_start]', $inputPublishStart->getAttribute('name'));
```

# 参考
- [[PHP]DOM, XPathを使ったスクレイピング(HTMLのタグ内容取得) | PHP Archive](http://php-archive.net/php/dom-scraping/)を
なにかが邪魔するズンドコキヨシ with PowerShell

[ズンドコキヨシまとめ - Qiita](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)
[ズンドコキヨシ with PowerShell(One-liner) - Qiita](http://qiita.com/shoooo/items/37482ebd8c6e2c451a91)

やすが邪魔するヤツ

```ps1
$res="";do{"ズン","ドコ","ずん"|Get-Random|%{if($_ -eq "ずん" ){$res+="${_}のやす！"}else{$res+=$_}}}while(!$res.EndsWith("ズンズンズンズンドコ") ) Write-Host $res "キ・ヨ・シ！"
```

> ずんのやす！ずんのやす！ずんのやす！ずんのやす！ズンドコずんのやす！ドコずんのやす！ドコズンずんのやす！ずんのやす！ドコズンドコズンズンズンズンドコ キ・ヨ・シ！

ヽ(・ω・)/が邪魔するヤツ

```ps1
$res="";do{"ズン","ドコ","ズ","コ"|Get-Random|%{$res+=$_;if($res.EndsWith("ズコ") ){$res+="ーヽ(・ω・)/ "}}}while(!$res.EndsWith("ズンズンズンズンドコ") ) Write-Host $res "キ・ヨ・シ！"
```

> ココズズズンズンズンココドコココズンコズンココドコズズンズコーヽ(・ω・)/ ドコドコズコーヽ(・ω・)/ ズコーヽ(・ω・)/ ココドコドコズンズズンコズンズズンズンコ
ズコーヽ(・ω・)/ ドコココズドコズンドコズズドコズンコドココズンココズコーヽ(・ω・)/ ズンドコドコズズンドコドコズズンズンズンコズンドコズンズドコズンズズンド
コドコズズズズンズンズコーヽ(・ω・)/ ズコーヽ(・ω・)/ ココドコドコドココドコズズズドココズコーヽ(・ω・)/ ドコズズンドココズンドコズズンココドコドココドコズ
ンズコーヽ(・ω・)/ ドコズンズンズンズンズンズズズンコズンココドコズコーヽ(・ω・)/ ズンコズドココドココズンコズンドコズンズンコドココズズドココズンコズズンズ
ンズンズンズズンズンズンズンドコ キ・ヨ・シ！
Android Studio 2.0のInstant Runを使いたいけどmultiDexEnabledだからムリだと諦めていたアナタへ

まあ、私なんですけど。


## 背景事情など

別に好き好んでmultiDex環境にしているわけではなく、Androidアプリのメソッド数の制限65536個に引っかかったためです。

そのへんの対応方法はこちら

> **ビルド時に Unable to execute dex: method ID not in [0, 0xffff]: 65536 が出た場合の対処**
http://qiita.com/furu8ma/items/6cb4b08c423da6a74299



multiDexEnabled=trueじゃなければビルドできない。しかもビルドはメチャクチャ遅い。
救世主になるかと期待していたInstant RunはmultiDexEnabledでは有効にならない。


> ちなみにInstant Runとは
> **Androidアプリの開発を爆速化させるInstant Runを今日から使おう**
http://qiita.com/tnj/items/970febffcb3518c5a3c3


正確にいえば、APIレベルを21以上にすればOKだけど、まだまだKitkatは切り捨てられませんて。

私のプロジェクトではCrossWalkを使用していたのでそのせいかと思っていました。

> CROSSWALK PROJECT
https://crosswalk-project.org/

が、どうもそれだけではないみたい。


## 対応方法

> Google Playサービスを必要なだけAndroidStudioプロジェクトに追加する
http://qiita.com/niusounds/items/f9a0ab3cbe07878ed8f6


これに従って、Google Playサービスを最低限に変更

```build.gradle
dependencies {
.
.
.
//    compile 'com.google.android.gms:play-services:8.4.0'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'    //GCM使ってるんで
    compile 'com.google.android.gms:play-services-appindexing:8.4.0'
}
```

appindexingも外したかったんですが、これを外すとAndroid Studioが勝手に追加したコードの部分がエラーになります。
あれの正体はなんだろう？ggってもよくわからなかったのでこれは将来の課題ということで。

で、これでmultidex関係の設定を外してもビルド成功！
やった、爆速だー！


~~にしてもGoogle..オマエだったのか...~~
初心者向けのシンプルで汎用的なコードレビューガイド

開発言語や開発手法に依存せず、初心者が使えるシンプルで汎用的なコードレビューガイドがみつからなかったので、つくってみました。

# 1. 集中（60分以内）
集中力の波は15分周期と言われています。
この周期の繰り返しも数回が限界で、60分を超えてレビューし続けてもよいレビューはできません。
60分以内の短い時間で集中してレビューしましょう。

# 2. リズム
レビューには時間がかかります。
毎朝はじめの60分はレビューにあてるなど、習慣化しましょう。
1回60分以内とすると、多くても500LOCが限界です。
テクニカルリーダーに集中しすぎないように、対象コードの難易度などを考慮して適切にレビュアを割り振ることも重要です。

# 3. セルフチェック
レビューを依頼する前に、セルフチェックをしましょう。
仕様のとおりに正しく動作することはもちろん、静的コード解析チェックをパスし、自分なりに読みやすく、保守性の高いコードになっているか再確認しましょう。

# 4. レビューリクエストコメント
レビューを依頼するときに、次のようなレビュアのための補足を伝えましょう。
(プル/マージリクエストのコメントに書くとよいでしょう。)

* 特に確認してほしいところ
* 悩んだところ
* 参照するとよいドキュメント

# 5. チェックリスト
## (1) 網羅性
仕様のとおりに正しく動作することが最重要です。

* コードに明らかなロジックエラーがない
* 要件の観点から、すべてのケースが完全に実装されている

## (2) 規約
規約はツールを使って確認しましょう。
自動テスト対象については、テストコードのカバレッジをツールで確認したうえで、内容も含めて十分かどうか判断しましょう。
(自動テストの範囲は事前に決めておきましょう。)

* スタイルチェックや静的コード解析チェックをパスしている
* 適切なコメントがつけられている（コメントをつけるのは美しいコードをかけていない証拠だという人もいますが、それほど我々は優秀でしょうか。）
* テストコードが十分に書かれている

## (3) 名前重要
Rubyのまつもとゆきひろさんは、「プログラマが知るべき97のこと」で次のように述べています。

> 適切な名前をつけられると言うことは、その機能が正しく理解されて、設計されているということで、逆にふさわしい名前がつけられないということは、その機能が果たすべき役割を設計者自身も十分理解できていないということなのではないでしょうか。

パッケージ、クラス、メソッド、変数、これらのすべてが簡潔かつ適切に内容を言い表しているのであれば、オブジェクト指向、DDD(ドメイン駆動設計)のよいコードになっていると思ってよいでしょう。

## (4) DRY
"Don't Repeat Yourself"の略で、要はコピペ禁止ということです。
コピペコードがあると、変更があったときに修正対象が散在しているので困ります（保守性が低い）。
DRYはチーム開発のマナーです。

## (5) 単一責務
1つのクラスは1つの責務を持つという原則ですが、「 クラスに変更が起こる理由は、一つであるべき」という具体的な指針がわかりやすいでしょう。
もし、変更の理由が2つあ る場合、そのクラスは2つに分割すべきだし、もし1つの変更が2つのクラス にまたがるなら、そのクラスは1つに統合すべきです。

## (6) 疎結合かつ高凝集
疎結合は、プログラム間の依存性を弱め、再利用性を高めるということです。
高凝集は、同じ責務のものが集まっていて分散していないということです。

MVCなどのレイヤー分けをしているのであれば、最低限、レイヤー間は疎結合にしましょう。
クラスやメソッド間もできるだけ疎結合になるように注意しましょう。
呼び出し側が呼び出し先の仕様を知らなくてもよいのが理想です。

## (7) シンプル
シンプルとは、手続き型で一直線に書くという意味ではありません。また、高度なテクニックを駆使して短いコードにするという意味でもありません。
標準の仕様、標準のAPIを適切に使って、簡潔でわかりやすいということです。

保守性は大事ですが、過度に柔軟な設計は不要です（YAGNI ”You Aren’t Going to Need It"（わからないことを予想して複雑にしない））。

デザインパターンや流行りの技術を「ただ使いたいから」という理由で使ってしまうのもよくありません（モチベーション維持のために多少は必要かもしれませんが）。

# 6. 完璧を求めない
我々に与えられた時間は有限です。
美しいコードにしたいという気持ちは重要ですが、仕様通りに正しく動くものを短い時間でつくりあげることが、仕事では求められます。
後になって、運用・保守の担当者に「なんだ、この××コード」と言われないように、エンジニアとしてのプライドが許すレベルに、健康で文化的な生活ができる範囲で、スピード感をもって、コードを美しくしましょう。

# 7. 問題vsわたしたち（批判ではない）
今さらですが、レビューは批判ではありません。よりよいものをつくりだすためのプロセスです。このことはいくら強調しても協調しすぎることはありません。
レビュアは客観的に理由を明示して指摘しましょう。
レビュイは問題の事実だけを受け止め、落ち込んだり、バカにされていると思わないようにしましょう（昔から「傍目八目」というものです）。
問題vs誰かではなく、問題vsわたしたちの姿勢でレビューしましょう。

# 参考にしたサイト

* [人間の集中力の限界](http://comesmile.net/cons/05.html)
* [Best Practices for Code Review](https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/)
* [コードレビューが重要な理由](https://ja.atlassian.com/agile/code-reviews)
* [Giving better code reviews](https://medium.com/@mrjoelkemp/giving-better-code-reviews-16109e0fdd36#.z8k5prypc)
* [名前重要](http://プログラマが知るべき97のこと.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%90%8D%E5%89%8D%E9%87%8D%E8%A6%81)
* [SRP(Single Responsibility Principle)](http://www.objectclub.jp/technicaldoc/object-orientation/principle/principle03)
* [GRASP](  http://qiita.com/Yahagi_pg/items/0bb484f3c25fb9f84be8)
* [何かのときにすっと出したい、プログラミングに関する法則・原則一覧](http://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63#dry)
ズンドコキヨシでコードゴルフ with Ruby

なるべく短く出来るように知恵を絞った結果

```rb
z,d=zd=%w(ズン ドコ);p loop.inject(''){|a|break a+'＼キ・ヨ・シ！／'if/#{z*4+d}$/=~a;a+zd.sample}
```
Common LispでURLからページタイトルを取得する

# 動機
URLをメモするときに、ページタイトルがあったら便利だなと思ったので作りました。これまでは、javascriptでpukiwiki用に出力するbookmarkletを自作していたのですが、ページごとにbookmarkletを起動させないといけないのが億劫になりました。

このごろCommon Lispにハマっているのでその練習も兼ねて。

# 環境
- Mac OS X El captain(10.11.3)
- SBCL 1.3.2

# 必要ライブラリ
- quicklisp
- drakma
- plump
- clss
- babel
- guess([インストール方法](http://d.hatena.ne.jp/fu7mu4/20140901/1409583865))

# gistへのリンク
Gistにコードをまとめました。

https://gist.github.com/tamanobi/746f550c60f890960d40#file-take-title-lisp

# httpレスポンスを文字列として取得
Drakmaで帰ってきたhttpレスポンスのbodyは、vectorの場合と文字列の場合があります。`:force-binary`を使うことで、vectorで返してもらいます。

`(drakma:http-request url :force-binary t)`

ここで得られたvectorをguessというライブラリで文字コード判別します。

`(guess:CES-GUESS-FROM-VECTOR input-vector :jp)`

文字コードが判別できたら、babelというライブラリで、文字列に変換します。ここで判別された文字コード名と、babelで指定するシンボルは異なる場合があるので注意が必要です(例 EUC-JPなら:eucjp)。

`(babel:octets-to-string input-vector :encoding encoding)`

# DOMに変換
titleタグの中に入っている文字を取得したいので、plumpというライブラリで、文字列をDOMに変換します。

`(plump:parse html-body)`

# DOMからタイトルを取得
plumpのDOMオブジェクトから、clssというライブラリでtitleタグを抽出します。

`(clss:select "title" dom)`

抽出されたオブジェクトはvectorですので、`map 'list`で変換しつつ、各要素に`plump:text`で文字列を取得します。

`(map 'list (lambda (val) (plump:text val)) (clss:select "title" dom))`

# 実行例
上記で説明したものを組み合わせた、`get-title`という関数を使ってみます。下の例はUTF-8のサイトのみに適用していますが、Shift-JIS、EUC-JPのサイトでも無事取得できました。

``` lisp:get-title.lisp
(get-title "https://ja.wikipedia.org/wiki/Common_Lisp")
;;=>("Common Lisp - Wikipedia")
(get-title "http://www.sbcl.org/")
;;=>("About - Steel Bank Common Lisp")
(get-title "http://tips.cddddr.org/common-lisp/")
;;=>("逆引きCommon Lisp")
```

## 複数のURLを渡す
`mapcan`を使って、複数のURLを処理することができます。

```lisp:get-titles.lisp
(mapcan #'get-title '("https://ja.wikipedia.org/wiki/Common_Lisp" "http://tips.cddddr.org/common-lisp/")))
;;=>("Common Lisp - Wikipedia" "逆引きCommon Lisp")
Xcodeのテンプレートを自分ごのみにアレンジする

Xcodeのインデントはデフォルトで4ですが、これを2に変えたりしても新規に作成したUIViewControllerのファイルは4で生成されます。
他にも、UIViewControllerにprepareForSegueのコメントアウトやdidReceiveMemoryWarningが最初から直書きされていたりして毎回生成時に自分ごのみに整頓している人も多いのではないでしょうか。

Xcodeのソースコードテンプレートは

`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/`

に配置してあります。

例えばUIViewControllerのSwiftのテンプレートは
`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/Source/Cocoa Touch Class.xctemplate/UIViewControllerSwift`
にあります。

```swift:___FILEBASENAME___.swift

//
//  ___FILENAME___
//  ___PROJECTNAME___
//
//  Created by ___FULLUSERNAME___ on ___DATE___.
//___COPYRIGHT___
//

import UIKit

final class ___FILEBASENAMEASIDENTIFIER___: ___VARIABLE_cocoaTouchSubclass___ {
 
  override func viewDidLoad() {
    super.viewDidLoad()
  }
  
}

```

こんな感じに書き換えておけば次回から

```swift:ViewController.swift
//
//  ViewController.swift
//  NightFox
//
//  Created by noppefoxwolf on 2016/03/17.
//  Copyright © 2016年 noppelab.com All rights reserved.
//

import UIKit

final class ViewController: UIViewController {
 
  override func viewDidLoad() {
    super.viewDidLoad()
  }
  
}

```

こんな感じで生成されます。
場所的にXcodeを上書きすると消える感じがするのでエイリアス貼るなりgitで管理するなりすると良いと思います。

いじょ
【AWS】各サービスのめも

各サービスの内容を全て記憶するのは困難なので、注意点等をまとめたいと思いました。
調べた時にメモしていきます。（公式ドキュメントを読みながらまとめていく感じです）


# AMI
## ストレージの種類

- **Amazon EBS-Backed**

    - Amazon EBSにデータを保存
    - データ永続化可能

- **Amazon Instance Store-Backed**

    - インスタンスストアにデータを保存
    - インスタンス存続中のみデータが利用可能
    - インスタンスを削除するとデータも削除される（停止という概念はない）

現在AWSではEBS-Backedを推奨している。


## 仮想化の種類

- **HVM AMI**

    - 完全仮想化
    - 拡張ネットワーキングと GPU※1 処理を利用する事が可能


- **PV AMI**

    - PV-GRUB と呼ばれる特別なブートローダーを使用して起動
    - 昔はHVMよりパフォーマンスが良かったが、HVM AMI で PV ドライバが利用可能になったことによりそれはなくなった。


※1 高度な並列処理機能を必要とする場合は、GPU インスタンスを使用するのが適している。

提供されている現行のインスタンスは全てHVMで提供されている。

## コピー

- **暗号化**

    - 暗号化されたままでコピーされる
    - 暗号化されていないEBSを暗号化してコピー可能（KMS）
        - instance store-backed の場合は暗号化ステータスの変更は不可能
    - 復号化コピーは不可能
    - 複数の暗号化されたEBSを持つ状態でもコピー可能
    - 暗号化されているEBSと暗号化されていないEBSが同居していてもコピー可能


- **リージョンをまたがるコピー**

    - 可能

# インスタンス

## サイズ変更

- **互換性**
    - 仮想化タイプ PV -> HVM は変更不可能
    - EC2-Classic -> VPC でのみ利用可能なインスタンスタイプに変更不可能 ※デフォルト以外の VPC がない場合
    - 32bitの場合は以下のタイプのみ
        - t2.nano、t2.micro、t2.small、t2.medium、c3.large、t1.micro、m1.small、m1.medium、c1.medium

- **EBS-Backed**
    - Instance Id はそのまま
    - Public Ip は変更されてPrivate と Elastic はそのまま ※EC2-Classic の場合は Elastic の関連付けが解除される
    - Auto Scaling グループに設定されている場合は死活監視で異常とみなされるため、Auto Scaling を中断してから実行すると良い

- **Instance Store-Bascked**

# リザーブドインスタンス

**購入**

**適用**

- 購入したリザーブドインスタンスとパラメータ（AZ、タイプ等）が一致した既に起動済み又は起動されるインスタンスに自動で適用される
- 購入したリザーブドインスタンスの数を起動したインスタンスの数が超える場合は一番安くなる割引計算をする

**変更**

- activeでないリザーブドインスタンスへの変更リクエストは送信できない
- サイズ変更の場合はAWSで定義されている「正規化係数」を元に変更可能かどうかを判断する
    - 例）micro=0.5 small=1 なので、micro2台をsmall1台に変更ができる
- 前の変更リクエストが保留状態での追加変更リクエストは送信出来ない
- 変更リクエスト送信後の取り消し又は変更は出来ない
Nutanix Community Edition - Version ce-2016.03.13-stableが出ました

今週はもう3月も半ばだというのに、インフルエンザB型陽性との診断を受けてしまいました。
自宅の普段使ってない部屋に布団を敷いて、食事もそこで摂り、一日中定位置で過ごすという引きこもらー生活です(´・ω・`)

寝モバ状態でちょこちょこ仕事をこなしているのですが、数日前にce-2016.03.03-stableに上げたばかりの自宅CE環境にアクセスしたところ、下記の表示が出てきました。
![01-validation.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/fe73138a-2b34-0030-5a4a-f6c63490e2d1.png)
はい、UpgradeするまでPrism(Web GUI)を使えないみたいです…。
(※当たり前ですが、商用版だとこういった強制はないです）

というわけでUpgradeメニューに進みましょう。
アップグレード手順はいつもどおり、クリックするだけです。
![02-upgrade.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/fb340c46-024b-95f7-e345-01955cceda07.png)

で、このバージョンはどういうものかといいますと、残念ながらバグフィックス版です。
下記のIssueが修正されたものですので、機能的にはce-2016.03.03-stable(商用版Acropolis 4.6 相当)と同じです。
**[Discussion forum] Upgrade finished but no access to Web Console**
http://next.nutanix.com/t5/Discussion-Forum/Upgrade-finished-but-no-access-to-Web-Console/td-p/8202
ダウンロードページでもce-2016.03.03-stableとの差し替えの形で公開されています。

そんなこんなで、この短い記事を書いている間にUpgradeも無事完了しました。
![03-done.PNG](https://qiita-image-store.s3.amazonaws.com/0/76398/14e0cdd2-eba1-f261-db7c-25ded0ca6ab6.png)

※そういえば、ce-2015.11.05-stableで発生していた「SandyBridge以前の古いCPUだとCVMが上がらない」というIssueも直ってました。
ズンドコやってみた

```zundoko.rb
def zundoko
  k = String.new
  loop do
    k << [0,2].sample.to_s
    k =~ /00002\z/ && break
  end
  k.split('').each do |i|
    print 'ズンドコ'[i.to_i, 2]
  end
  
  puts 'キ・ヨ・シ'
end
```

```ruby:ワンライナー
k = String.new; loop { k << [0,2].sample.to_s; k =~ /00002\z/ && break };k.split('').each { |i| print 'ズンドコ'[i.to_i, 2] }; puts 'キ・ヨ・シ'
```

```
ンズンドコズンドコズンズンドコズンドコドコズンズンドコドコドコズンズンドコドコズンドコズンドコドコズンズンズンズンズンズンドコキ・ヨ・シ
```
AD2 > Link >  Analog Supplies > 3.3V | 1.8V | -3.3V | 5.5V | -5.5V

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#internal_power_supplies) 6.5 Internal Power Supplies

> The 3.3V (Fig. 27) and 1.8V Fig. 28 analog power supplies are implemented around an ADP2138 Fixed Output Voltage, 800mA, 3MHz, Step-Down DC-to-DC converter.

3.3Vと1.8Vがあるとのこと。

> The -3.3V analog power supply (Fig. 29) is implemented with the ADP2301 Step-Down regulator in an inverting Buck-Boost configuration.

-3.3Vもあるようだ。

> The 5.5V and -5.5V supplies Fig. 30 are created with a Sepic-Cuk topology, built around a single ADP1612 Step-Up DC-to DC converter.

加えて 5.5V / -5.5V。


これらの電圧出力がAD2内部でどのように使われ、ユーザ側でどのように提供されているかは未学習。