OmniAICreator/Qiita-1.07M huggingface dataset:
【解説付き】chromeでXMLHttpRequestをローカルのファイルで行う方法

#ローカルのファイルでは、XMLHttpRequestができない
ローカルファイルからAPIでをしようとすると、

```
Access-Control-Allow-Origin 
```
を理由に怒られて、所望のデータが取れない。
開発段階でローカルファイルで扱えないとなると相当不便だ。

#クロスドメイン制約
セキュリティの問題上、その**HTMLファイルが置かれているドメインのサーバとしか通信できないという制約**がある。
XMLHttpRequest  Level 2で別のドメイン間でも通信できるようになった。

しかし、セキュリティ上webサーバがクロスドメイン制約をかけていることが多々ある。
webサービスにおいて、APIはサービス内でしか利用しないはずだし、外部から勝手にAPIを叩かれてデータの閲覧・改変をされては困る。

現状としてクロスドメイン制約はLevel 2が出た今でも意識する必要がある。

![スクリーンショット 2015-06-16 18.55.05.png](https://qiita-image-store.s3.amazonaws.com/0/78136/47005d65-59f8-83e3-4a8d-bcc27b8ec89a.png)


#開発における問題点
本番環境ではHTMLファイルは同一ドメイン上にある場合でも、開発段階ではモックサーバを使ってローカルファイルでAPIを叩くことになる。
そうすると本番環境で動くコードが開発段階では動かない。
![スクリーンショット 2015-06-16 19.01.58.png](https://qiita-image-store.s3.amazonaws.com/0/78136/d33a4fa8-f199-17d6-303d-035f07f423fa.png)
モックサーバのクロスドメイン制約を外しておくこともできるが、できればサーバの設定はそのままがいい。
どうしたものか。
#解決方法
##chromeのセキュリティを外して起動
###Windowsの場合
```
chrome.exe --disable-web-security --user-data-dir
```
###Macの場合
```
open /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir
```

で（ターミナルから）chromeを起動すれば、クロスドメイン制約に引っかからずにAPIを叩くことができる。

####※**chromeを完全に終了させてから**コマンドを叩く。
chromeが起動した状態で叩いても--disable-web-securityオプションは有効にならない。
![スクリーンショット 2015-06-18 10.51.28.png](https://qiita-image-store.s3.amazonaws.com/0/78136/55d315bb-9c5f-8a8a-6a96-fbaca66a638c.png)
のように出ていれば成功。

#なぜchromeの設定でクロスドメイン制約に引っかからなくなるのか
ずばり、クロスドメイン制約でアクセス制限をするのは**ブラウザ**だからである。

##クライアントがアクセス制限を行う
サーバは設定によって、クロスドメイン制約を課すことができる。
その設定したクロスドメイン制約にもとづいてアクセスを制限するのは**クライアント**、すなわち**ブラウザ**である。

サーバはHTTP通信においてアクセス制限は行わない。

なので、chromeのオプションでweb-securityをdisableにして起動すれば、サーバにおいてクロスドメイン制約をかけていてもアクセスができるようになる。

ただし、文字通りweb-securityをオフにしているのでむやみにやるものではない。
あくまで開発時だけの方がいいだろう。
Rails sorceryでモデル名を指定するオプション

railsのgemであるsorceryはデフォルトのユーザクラスはUserになっている。
これを任意のモデル名に変更するには--model=モデル名オプションを使う。

`rails g sorcery:install core --model=Customer`

自動生成のconfig/initializers/sorcery.rbも
`config.user_class = "Customer"`
と変更してくれる。

sorcery:installを使う場面では共通なのでサブモジュールを入れる時とかも使える。
ubuntu14.04 をアクセスポイントにして透過型プロキシ通す

# ubuntu14.04 をアクセスポイントにして透過型プロキシ通す

これの続き。
http://qiita.com/arc279/items/21a3cda14f7dfdb267ca

iptables + mitmproxy の透過型プロキシで、繋ぐ側からは何も設定要らないようにする。

とりあえず 80(http) と 443(https) で。
設定とかは↑の記事のに準じてます。

* 無線NICがアクセスポイント
* 有線NICがインターネッツ

## iptables

```bash:無線で受けた80と443をローカルの8080に繋ぐ
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 80 \
    -j REDIRECT --to-port 8080
sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 443 \
    -j REDIRECT --to-port 8080
```

```bash:確認
sudo iptables -t nat -nL
sudo iptables -S
```

### 戻す

`-t nat` は明示的に指定してやらないとダメらしい。

```bash:flush.sh
#!/bin/sh

sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
```

## mitmproxy

python入れて `pip install mitmproxy` しておく。

```bash:透過型で8080ポートで待ち受け
mitmproxy -p 8080 -T
```

これで、端末側からプロキシ設定とかしなくても、
アクセスポイントに繋いでブラウザとかいじればプロキシを経由するようになる。


iptables とか全然詳しくないので試行錯誤でいじるのけっこう怖かったｗ
そこだけ vagrant で練習すればよかったけど、まぁしょうがない。

## 参考にしたとこ

主にこの辺り。
http://d.hatena.ne.jp/asannou/20130124
uWSGI の spare2 cheaper algorithm を作った


Python だけじゃなくて Ruby, php, Perl も扱えるアプリケーションサーバー [uWSGI](http://uwsgi-docs.readthedocs.org) に、 cheaper というモードがあります。これは負荷などに応じてワーカー数を動的に調整する機能です。

デフォルトでは spare, backlog, busyness という制御アルゴリズムがありました。が、どれも気に入らなかったので spare2 というアルゴリズムを作成して、本家にマージされました。取り込まれたのは master ブランチ (開発版) なので、安定版の [uWSGI 2.0 用にプラグイン](http://github.com/KLab/uwsgi-cheaper-spare2) も用意しました。 

今回追加した spare2 アルゴリズムの解説と、既存の他のアルゴリズムがなぜ採用しにくかったかを説明します。 (他のアルゴリズムの詳細は [ドキュメント](http://uwsgi-docs.readthedocs.org/en/latest/Cheaper.html) を参照してください。)

## spare2

サンプルの設定ファイルを元に解説します。

```
[uwsgi]
...
processes=10
cheaper-algo=spare2

cheaper=2
cheaper-initial=2
cheaper-step=2
cheaper-idle=30
```

`process=10` は最大ワーカープロセス数です。 `cheaper=2` が最小プロセス数になり、この間で調整されることになります。 `cheaper-initial=2` が起動直後のワーカー数になります。

spare2 アルゴリズムは、 cheaper で指定された数の idle 状態のワーカー数を維持しようとします。
例えば idle 状態のワーカー数が 1 つになった場合、 2 - 1 = 1 個のワーカーを起動します。

`cheaper-step=2` は一度に起動するプロセス数の上限です。 `cheaper` が大きいときに、 `cheaper-step` であまりたくさんのプロセスを一気に起動しないように調整することができます。

idle 状態のプロセス数が cheaper よりも大きい状態が `cheaper-idle=30` 秒間続けば、ワーカープロセスを1つ停止します。この値を長く設定することで、細かくワーカーが停止＆再開するのを防ぐことができます。


## spare

```
[uwsgi]
...
processes=10
cheaper-algo=spare

cheaper=2
cheaper-initial=2
cheaper-step=2
cheaper-overload=5
```

spare アルゴリズムは、 idle 状態のプロセスが1つもない状態 (=overload) と、 idle 状態のプロセスが2つ以上ある状態 (=idle) をカウントします。
片方をカウントアップする場合はもう片方がリセットされますが、 idle プロセスが1つだけの状態ではどちらもカウントされません。

overload カウントが `cheaper-overload=5` に到達した場合、 `cheaper-step=2` 個のワーカープロセスを追加します。
idle カウントが `cheaper-overload=5` に到達した場合、1個のワーカープロセスを停止します。

このアルゴリズムは、サーバーを負荷分散配下に追加した場合などに速やかにワーカー数を増やすには、 `cheaper-overload` を小さく、 `cheaper-step` を大きく設定する必要があります。それでも、全部のワーカープロセスが busy になるまで新規ワーカーを立ち上げないので、初期のレスポンスタイムが大幅に悪化しやすいです。

また、 `cheaper-overload=1` にしてしまうと、ワーカー数の小刻みな増減が発生しやすくなってしまいます。例えばワーカー数が40くらいある場合、 idle プロセスが2つあるだけでワーカーが停止されるのは、やりすぎに感じます。


## backlog

spare に似ていますが、 Linux で TCP の backlog に溜まった接続数を監視できるのを利用して、 overload 判定をします。

spare の弱点を引き継いでいる上に、 nginx と uWSGI を unix ソケットで接続している場合に利用できないので、論外です。

## busyness


spare を複雑にしたのが busyness です。

`cheaper-overload` をタイムフレームとして、その間 idle 状態のワーカーがなかった割合を busyness とします。この busyness の最小値と最大値を設定しておいて、最小値を下回ったらワーカーを減らし、最大値を上回ったらワーカーを増やします。

その他、ワーカーを減らしにくくするためのオプションがあったり、 backlog を監視してタイムフレームを待たずにワーカーを追加するオプションがあったりとかなり複雑ですが、これもやはり最初にスムースにワーカー数を増やすのが難しく、突入負荷への対応に難があります。
Pythonの標準ライブラリstatisticsで出来ること


## ```statistics```ライブラリ
Python 3.4から組み込まれた、基本統計量を計算するためのライブラリ

## 出来ること
関数 | 機能
--- | ---
```mean``` | 算術平均を求める
```median``` | 中央値を求める
```median_low``` | データ数が偶数の場合、中央の2値の小さい方を求める
```median_high``` | データ数が偶数の場合、中央の2値の大きい方を求める
```median_grouped``` | 区間を用いてグループ化されたデータから中央値を求める
```mode``` | 最頻値を求める
```pvariance``` | 母標準偏差を求める
```variance``` | 標本標準偏差を求める
```pstdev``` | 母分散を求める
```stdev``` | 標本分散を求める

## 使い方
各関数の引数に、実数のリストやイテレータを指定するだけ。

## 参照
[9.7. ```statistics``` - Mathematical statistics functions](https://docs.python.org/3.4/library/statistics.html)
Atomの設定を同期するsync-settings

# なにができるの？
[sync-settings](https://atom.io/packages/sync-settings)はAtomの設定をクラウド(GitHub)経由で同期します。
(Windows8.1や10～Mac間で動作することを確認しています)

以下のものが同期されるようです。
 * 初期化スクリプト
 * インストールしたパッケージ
 * パッケージの設定
 * キーマップ
 * スニペット ~~(バージョン0.4.0では正しく動作しない模様)~~ v0.6.0で同期を確認

~~執筆時点('15/6/16)では、同期は手動操作で実行します。（自動同期はロードマップには含まれているようです）~~
('16/02/05)v0.6.0では更新のチェックが行われるようです。詳しくは[記事の後ろのほう](#atom起動時のバックアップ更新確認)に追記しました。

# 確認した環境
この記事はWindows8.1、MacOSX10、sync-setting v0.4.0で確認しております。
（'16/2/5に更新された内容についてはWindows10、sync-setting v0.6.0で再確認しました）

# 導入
## 準備するもの
GitHubのgistを経由しているため、GitHubのアカウントが必須になります。

##  インストール方法
Atomの設定画面からパッケージ[sync-settings](https://atom.io/packages/sync-settings)をインストールします。
またはコマンドラインより`apm install sync-settings`を実行します。

## 設定方法
1. GitHubの[New Personal access token](https://github.com/settings/tokens/new)画面からアクセストークンを作成します。Select scopesは`gist`のみチェックを入れれば動くことを確認しています
2. 作成されたトークンをコピーし、Atomの`sync-settings`の設定画面の`Personal Access Token`にペーストします
3. GitHubの[new gist](https://gist.github.com/)画面を開き、(空では作成できないため)適当なテキストを入力のうえ`Create secret Gist`ボタンを押します。
4. 上の操作で遷移した画面のURLからgistのID("ユーザー名/"の後に続く英数字部分)をコピーし、Atomの`sync-settings`設定画面のGist idにペーストします。

# 同期の実行
## 設定のバックアップ（アップロード）方法
設定をバックアップ（アップロード）するには、以下のいずれかを実行します

 * `Ctrl-Alt-U`(Win,Mac共通)押下
 * `Ctrl+Shift+P`(Win)/`Cmd-Shift-P`(Mac) 押下でコマンドパレットを表示したうえ、`Sync Settings: Backup`を実行
 * メニューバーの`Packages > Synchronize Settings > Backup`を実行

アップロードが完了すると、Atom上に通知が表示されるかと思います。
先の手順で作成したGistを開くと、アップロードされた設定を確認することができます。
（先の手順で作成したダミーファイルはもう不要なので消していいです）

## 設定のリストア（ダウンロード）方法
Gistにバックアップしている環境設定を、別環境にダウンロードして設定反映する方法になります。
リストア（ダウンロード）は環境によってはAtomがしばらく固まってしまう場合もあるようなので、なんの作業も行っていない時に行った方がよさそうです。

設定をリストアするには、以下のいずれかを実行します

* `Ctrl-Alt-D`(Win,Mac共通)押下
* `Ctrl+Shift+P`(Win)/`Cmd-Shift-P`(Mac) 押下でコマンドパレットを表示したうえ、`Sync Settings: Restore`を実行
* メニューバーの`Packages > Synchronize Settings > Restore`を実行

しばらく待っていると、Atom上に通知が表示されるはずです。
通知完了後、Atomを再起動して設定画面を開けば、設定やパッケージが同期されていることが確認できるかと思います。

# Atom起動時のバックアップ更新確認

Atom起動時にgistのバックアップの確認が行われ、更新されている場合には以下のダイアログが表示されます。

>  sync-settings: Your settings are out of date.
>  [Backup] [View backup] [Restore] [Dismiss]

* [Backup] バックアップを行う（サーバの設定は上書きされます）
* [View backup] gistのページを開く。ダイアログは開かれたまま。
* [Restore] リストアを行う
* [Dismiss] 無視してダイアログを閉じる。（次回のAtom起動時に再びダイアログが表示される）

## (v0.6.0)「Check of update backup」が動作しない件

v0.6.0時点において、「Check of update backup」メニューは私の環境では動作している様子がありませんでした。
コマンドパレットに`Sync Settings: Check of update backup`が存在しなかったことから、未実装かバグが疑われます。

# 注意点
 * フォント設定も同期されてしまうため、同期先のマシンに存在しないフォント設定にされてしまう恐れがあります。フォントを入れるなりフォント複数指定するなりの対応が考えられます。
 * Atom正規の方法以外でインストールしたパッケージ(例. [pronama-chan](https://github.com/hurumeki/atom-pronama-chan))は、さすがに設定同期後に自動インストールされたりはしません。設定そのものは同期されているので、手動でパッケージをインストールしておけば同期の恩恵は受けられます。
 * ~~執筆時のバージョン`0.4.0`では、スニペットのダウンロード先が誤っており(正:snippets.cson → 誤:snippets.coffee)、正しく動作していませんでした。~~(追記 '16/02/05)`v0.6.0`で正常動作を確認しています

# 残件
 * Gistを作成するためにダミーテキストを使用していますが、もっといい手段があるかも？
 
---
（追記 2016/02/05）
更新が遅れてしまいましたが、v0.6.0より「Upload」「Download」がそれぞれ「Backup」「Restore」と名称変更されていましたので、記事本文を修正しました。
M-ISO様、コメント指摘ありがとうございました。

また、スニペットの同期が正常に行われるようになっていたのを確認し、Atom起動時にバックアップ更新確認が行われるようになっておりましたので、そちらの内容も修正および追記しました。
divについて

#divの枠線と背景をマスターする
##枠線と背景
・枠線の線種、カラー、サイズの指定をする
・上下左右の枠線をそれぞれ指定をする
・背景色と画像、背景画像の繰り返し方、位置を定義する
・背景画像を固定する（〜補講）
〜確認問題～　枠線と背景

```lang:html
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<meta name="description" content="レベルアップ問題です。">
		<link rel="stylesheet" type="text/css" href="css/level3.css">
		<title>レベルアップ練習問題</title>
	</head>
	<body>
		<div class="box1">
		<p>見出しとかでつかえます♪</p>
		</div>
    </body>
</html>
```
```lang:css
.box1 p {
	border:	#FF99CC 1px solid;
	width: 393px;
	height: 18px;
	padding: 2px 0px 0px 5px;
	font-size: 13px;
	font-weight: bold;
	color: #FF6699;
	background: url(haikei3.gif);
	background-position: bottom;
	background-repeat: repeat-x;
}
```

##divのネスト
・divを１つだけネストする
・ネストしたdivの位置を定義する
・ネストしたdiv同士のタテの間隔を定義する
〜確認問題～　divのネスト

```lang:html
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<meta name="description" content="レベルアップ問題です。">
		<link rel="stylesheet" type="text/css" href="css/level4.css">
		<title>レベルアップ練習問題</title>
	</head>
	<body>
		<div class="box1">
			<div class="box2">
			</div>
			<div class="box3">
			</div>
		</div>
	</body>
</html>
```
```lang:css
.box1 {
	width: 180px;
	height: 100px;
	background: url(ichimatsu.gif)
}
.box2 {
	width: 20px;
	height: 20px;
	margin: 0px 0px 0px 120px;
	background-color: #FF9999;
}
.box3 {
	width: 20px;
	height: 20px;
	margin: 40px 0px 0px 60px;
	background-color: #FF9999;
}
```

##divボックスの段組
・divボックスをヨコに２つ段組する
・枠線を定義したdivをつくる
・divボックスをヨコとタテに段組する
・スタイルシートで市松模様をつくる
〜確認問題〜　段組の中に段組していく

```lang:html
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<meta name="description" content="レベルアップ問題です。">
		<link rel="stylesheet" type="text/css" href="css/level5.css">
		<title>レベルアップ練習問題</title>
	</head>
	<body>
		<div class="box1">
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="kaijyo">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="kaijyo">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="kaijyo">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="box1-1">
			</div>
			<div class="kaijyo">
			</div>
		</div>
		<div class="box2">
			<div class="box2-1">
			</div>
			<div class="box2-2">
			</div>
			<div class="kaijyo">
			</div>
			<div class="box2-2">
			</div>
			<div class="box2-1">
			</div>
		</div>
    </body>
</html
```
```lang:css
.box1 {
	width: 200px;
	height: 200px;
	background-color:#FFCCCC;
	float: left;
}
.box2 {
	width: 300px;
	height: 200px;
	background-color: #66CCFF;
	float: left;
}
.box1-1 {
	width: 50px;
	height: 50px;
	background-color: #CC0000;
	float: left;
}
.box2-1 {
	width: 200px;
	height: 100px;
	background-color: #3399FF;
	float: left;
}
.box2-2 {
	width: 100px;
	height: 100px;
	background-color: #666699;
	float: left;
}
.kaijyo {
	clear: left;
}
```
VMware Toolsのバージョン表記

# 概要

VMware Toolsにはのバージョン表記には「9216」のような数値形式の表記と、「9.10.0」のようなx.y.z形式の表記があり、両者の対応は「[VMware version-mapping file](https://packages.vmware.com/tools/versions)」で調べられます。

# 詳細

先日同僚が気づいて教えてくれたことですが、VMware Toolsには「9216」のような4桁の数値でのバージョン表記と、「9.10.0」のような形のバージョン表記があります。だからどうということのないトリビア的な知識ですが、まとめておきます。

## 4桁数値のバージョン番号

VMware version-mapping fileにはVI Client等に表示されるバージョン番号と記載されています。実際には、vSphere Web Clientの仮想マシンのサマリ画面や、仮想マシン一覧画面に表示されています。

![VMwareTools_version_xxxx.png](https://qiita-image-store.s3.amazonaws.com/0/55718/c7ab64a9-c48b-53a4-8161-a800599abce6.png)

## x.y.z形式のバージョン番号

VMware version-mapping fileにはゲスト上でのセットアップやaboutページに表示されるバージョン番号と記載されています。実際には、WindowsゲストOS上の「VMware Toolsについて」ダイアログや、コントロールパネル項目「プログラムと機能」などに表示されています。

![VMwareTools_version_x.x.x-001.png](https://qiita-image-store.s3.amazonaws.com/0/55718/a03ce643-8dfd-4fcd-f7ab-feb7865df72c.png)

## 各形式のバージョンの対応

数値形式のバージョン、x.y.z形式のバージョンは1対1で対応付けられます。またToolsのバージョンが上がることがあるのは、ESXiのパッチを当てたときで、この時ESXiのビルド番号も上がります。

両形式でのバージョン値と、そのバージョンになった時のESXiのパッチレベル（適用状態）およびビルド番号が、「[VMware version-mapping file](https://packages.vmware.com/tools/versions)」にまとめられています。例えば、vSphere 6.0（ビルド2476743）では、以下のようになっています。

    9216        esx/6.0                                9.10.0        2476743

先頭列の`9216`は4桁の数値形式でのバージョン、3列目の`9.10.0`はx.y.z形式でのバージョン表記です。2列目の`esx/6.0`は対応するESXiのバージョンおよびパッチレベル、4列目の`2476743`はビルド番号です。

## このトリビアを使う場面

普段使う場面のない知識ですが、以下の場面で役立つかもしれません。

ESXiへのパッチ適用後に、VMware Toolsの更新（ゲストOSの再起動を伴う）が必要か検討する時。ただし、ナレッジベースにはパッチビルドごとに関連ナレッジ（例：[KB2116125](http://kb.vmware.com/kb/2116125)）が提供されており、こちらの「Virtual Machine Migration or Shutdown Required」の項を見たほうが早いでしょう。

仮想マシンをあるvSphere環境から別のvSphere環境に移動するとき。 ゲストOSに入っているVMware Toolsのバージョンと、移動先のESXiのビルド番号を確かめれば、移動後にVMware Toolsの更新が必要か事前に知ることができます。手順の机上検討時には、役立つかもしれません。

# 参考

* [How do I Correlate VMware Tools Version Numbers to a Corresponding ESX/ESXi Version? | VMware vSphere Blog](http://blogs.vmware.com/vsphere/2013/10/how-do-i-correlate-vmware-tools-version-numbers-to-a-corresponding-esxesxi-version.html)
* [VMware version-mapping file](https://packages.vmware.com/tools/versions)

----

本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
CSVではなくてxlsxファイルから直接データを読み込む

## CSV？ どうせExcelから出してるんでしょ？

CSVデータ読み込み。業務系サーバーサイドアプリケーションの開発をしていると、誰しもが一度は作る機能ではないでしょうか。しかし、ほとんどのCSVファイルはExcelからCSV形式で出力されていることが多いのでは無いでしょうか。だとすれば、直接Excelから読んでしまうというのも１つの手です。特に、RDBMSで複数のテーブルにまたがるデータをzipで固められてアップロードされた複数のCSVファイルから読み込むというような涙ぐましい状況であれば、むしろExcelファイルで上げてもらったほうが楽かもしれません。

そこで、本記事ではCSVファイルではなく、ExcelのワークシートからCSVのようにデータを読み込む方法について書きます。

## RubyXL

[RubyでExcelファイルを扱うgemはいくつかあります](http://qiita.com/Kta-M/items/02a2c41c5624f75498aa)が、ここではRubyXLを使います。RubyXLはread/write共に対応しているgemなので、今回は取り上げませんがxlsxファイルを書き出す場合にも利用できます。

## ワークシートの読み込み

ご存じの通り、ExcelのファイルはCSVとは異なり、複数のワークシートを保持しています。まずはExcelのファイルを読み込みます。

```rb
workbook = RubyXL::Parser.parse '/path/to/foo.xlsx'
```

ワークシートへのアクセスは以下のようにして行います。ここでは、Excelファイルにmembersという名前のワークシートが定義されているとします。配列として先頭からインデックス指定することもできますが、シート名で指定するほうが安全でしょう。

```rb
worksheet = workbook[0] # 一番最初のワークシート
worksheet = workbook['members'] # シート名での指定
```

## 行ベースでシートの情報を取り出す

rubyXLではワークシートに対して、いろいろなアクセス方法があります。たとえば、以下のようにして行と列番号を指定する方法があります。

```rb
worksheet[0][0] 
```

しかし、CSVの代わりにワークシートからデータを読み込む場合、１行ずつデータを取るほうがわかりやすいといえます。以下のように`extract_data`メソッドを使うことで、指定したオフセットに該当する行からデータを取り出して配列で取得できます。

```rb
worksheet.extract_data[0]
```

## ヘッダー行を使って各行をハッシュで受け取る

しかし、上記の方法で配列を受け取ったとしても、一行あたりの情報は配列のままです。できればヘッダー行か、指定したヘッダー情報を使ってハッシュとして受け取れると読み込んだデータの処理が楽でしょう。これは以下のようにして行います。

```rb
headers = worksheet.extract_data[0]
members = worksheet.get_table(headers)[:table]
```

`get_table`メソッドはヘッダー情報を配列として受け取り、行毎の情報と列毎の情報をハッシュで返してくれます。詳細は[rubyXLのREADME](https://github.com/weshatheleopard/rubyXL#table-identification)を見ていただくとしてここでは行毎の情報が含まれている:tableキーを指定し、全行の情報を取ってきています。

仮にmembersのヘッダー行が、`['ID', 'Name', 'Mail']` のようになっていた場合、membersに対しては以下のようにアクセスが可能です。

```rb
member = members[2]
member['ID']
```

これで、各行の値がヘッダー情報をキーとしたハッシュになり、全行の情報が配列に収まっているデータとしてワークシートの情報を取得することができました。ここからは通常のCSV処理と同じように実装できるはずです。
UnityとWindowsアプリケーションの連動

Unite2015の「MEVIUS FINAL FANTASYにおけるUnity開発事例」の講演を見て、UnityとWindowsアプリケーションとの連動がチラッと紹介されていたので、試しに作ってみました。

# 用意するもの

* Visual Studio（ExpressでOKです、今回は2013を使いました）
* Unity（今回は4.6.4p1を使いました）

手順は一番簡単に出来る方法を紹介しています。
そのため色々無駄な部分もあるかと思いますが、ご了承ください。

# DLLを作る

VisualStudioで「新しいプロジェクト」→「Visual C#」→「Windows フォームアプリケーション」を選択します。
Windowsフォームアプリケーションのひな型が作られます。

プロジェクトを選択し、プロパティを開きます。
以下の設定を行って下さい。

* 対象のフレームワークを「.NET Framework 3.5」にする
* 出力の種類を「クラスライブラリ」にする

次に、「プロジェクト」→「参照の追加」で、UnityEngine.dll と UnityEditor.dll の参照を追加します。
それぞれのDLLの場所は以下のページをご覧下さい。

Managed Plugins
http://docs.unity3d.com/ja/current/Manual/UsingDLL.html

最後に、Program.cs を開き、Main関数を削除し、こんな感じの関数を作ります。
（Main関数は起動時のプログラムエントリなので、削除しておかないとUnity起動と一緒にWindowsアプリケーションが立ちあがってしまいます。

```Program.cs
public static void Launch()
{
	Application.EnableVisualStyles();
	Application.SetCompatibleTextRenderingDefault(false);
	Form1 form = new Form1();
	form.Show();
}
```

あと、Programクラスをpublicにしておくのを忘れないようにして下さい。

ここまで出来たらビルドして、dllファイルを作ります。

# Unityに組み込む

作った dllファイルを Assets/Plugins フォルダに入れます。

ボタンを押したらWindowsアプリケーションが起動するようにしてみます。
適当なGameObjectを配置し、適当なスクリプトを割り当て、以下のような関数を用意します。

```Sample.cs
void OnGUI() {
	if (GUI.Button(new Rect(10, 10, 200, 30), "起動")) {
		Program.Launch();
	}
}
```

`using (自作DLLのネームスペース)` を忘れないようにして下さい。

# 起動する

作ったスクリプトを動かしてみます。
画面に「起動」ボタンが現れるので押してみると、DLLで作ったWindowsフォームアプリケーションが起動します。

# 何に使えるの？

Windowsアプリケーション側でUnityEngine及びUnityEditorへの参照を追加しているので、Unityの機能が使えます。例えば、AssetBundleへのアクセスがWindowsアプリケーション側で出来ます。
これを使えば、例えば「WindowsアプリケーションでAssetBundleへのパラメータ入力を行う」といったことも可能です。
前述の「MOBIUS FINAL FANTASY」では、このようにしてWindowsアプリでタイムラインを調整し、AssetBundleに書き戻しているものと思われます。

# トラブル例

作成中に起きたトラブルとその解消方法です。

## DLL側で、UnityEditor.dll 参照するとビルドが通らない

対象のフレームワークが「.NET Framework 3.5」より低い（例えば2.0）と起こるようです。

## Unity側で Unhandled Exception: System.TypeLoadException というエラーが出る

DLL側でFormのメンバフィールドを持つと発生しました。
Unity側の設定で、「PlayerSettings」→「Api compatibility Level」を「.NET2.0」にして下さい。（Subsetの付かない方です）

## Windowsアプリケーションが表示されるとUnityが固まる

Windowsアプリケーションのフォームをモーダルで表示すると固まります。
`Form.Show()` を使い、モードレスで表示すればOKです。

## Macで使えない

そもそも起動しているのがWindowsアプリケーションなので…MonoDevelopで開発すればMacバージョンも出来るかもしれません。

## Windowsアプリケーション表示時に Could not register the window class, win32 error 0 というエラーが出る

原因不明です、Unity起動して１回目は出ないので、何か終了処理が漏れているのでは、と思うのですが…。
何か情報がありましたらお知らせ下さると助かります。
[小ネタ] 文字列のSwitch

##はじめに
C#では、文字列をSwitch文に使用することが可能です。
いつもながら、気になったので中で何をしているのかちょっと調べてみました。

また、@Temarin_PITAさんの検証で、
VS2015RCだと、VS2013とのコンパイル結果に差異が有るようなので、ご留意の程・・・



##とりあえずばらしてみる

要素数が少ないとき（現状要素数がdefault含めて7個以下の時）に、下記のようなコードを書いた場合

```csharp

		static string Sample(string value)
		{
			string ret;


			switch (value)
			{
				case "0":
					ret = "Zero";
					break;

				case "1":
					ret = "One";
					break;

				case "2":
					ret = "Two";
					break;
					
				case "3":
					ret = "Three";
					break;

				case "4":
					ret = "Four";
					break;

				default:
					ret = "N/A";
					break;
			}

			return ret;

		}

```

こいつのコンパイル結果は、以下のように、ifの連接としてコンパイルされていました。

```csharp

		static string Decompile(string value)
		{
			string ret;
			if (value != null)
			{
				if (value == "0")
				{
					ret = "Zero";
					return ret;
				}
				if (value == "1")
				{
					ret = "One";
					return ret;
				}
				if (value == "2")
				{
					ret = "Two";
					return ret;
				}
				if (value == "3")
				{
					ret = "Three";
					return ret;
				}
				if (value == "4")
				{
					ret = "Four";
					return ret;
				}
			}
			ret = "N/A";
			return ret;
		}

```

可読性他は別として、switchのケースを増やした場合、上記をそのまま使い続ければ当然効率が線形的に悪化するのは明かです。
それでは、ケースを以下のように増やした場合、どのようになるか検証してみます。


```csharp

	static string Sample(string value)
		{
			string ret;


			switch (value)
			{
				case "0":
					ret = "Zero";
					break;

				case "1":
					ret = "One";
					break;

				case "2":
					ret = "Two";
					break;
					
				case "3":
					ret = "Three";
					break;

				case "4":
					ret = "Four";
					break;

				case "5":
					ret = "Five";
					break;

				default:
					ret = "N/A";
					break;
			}

			return ret;

		}

```

要素数を増やした場合、CSCは以下のようにコンパイルします（但し、完全に一致はしていません）

```csharp

		//便宜上ここに書いてるけど、本当は別クラスのパブリックフィールドとして存在している。
		volatile private static Dictionary<string, int> _dictionary;
		static string Decompile(string value)
		{
			string ret = null;

			if (_dictionary == null)
			{
				_dictionary = new Dictionary<string, int> {{"0", 0}, {"1", 1}, {"2", 2}, {"3", 3}, {"4", 4}, {"5", 5}};
			}

			int tmp;

			if (value!=null&&_dictionary.TryGetValue(value, out tmp))
			{
				switch (tmp)
				{
					case 0:
						ret = "Zero";
						break;

					case 1:
						ret = "One";
						break;

					case 2:
						ret = "Two";
						break;

					case 3:
						ret = "Three";
						break;

					case 4:
						ret = "Four";
						break;

					case 5:
						ret = "Five";
						break;
				}
			}
			else
			{
				ret = "N/A";
			}

			return ret;
		}

```

このように、ケースが増えた場合、隠しDictionaryを構築して、効率化を図っています。


##まとめ
switch文に文字列を利用した場合、数値を利用した場合に比べて実行効率はなんとなく落ちそうだな位には思っていたのですが、
実際土くらい落ちるのか検証したところ、結構興味深い結果が出てきたのでまとめてみました。

但し、先に述べたとおり、次期Visual Studio2015ではコンパイル結果が大きく変化しているので、あくまでも、現状がこのようなコトになっていると言う点はご留意ください。

また、要素数が少ない場合なぜ辞書を構築しないかは、恐らくオーバーヘッドを嫌ってのことでは無いかなと予測しています。
C++オーバーロードは継承されない。

あれー。ビルド通らないなぁ。。。と思ったソース。

```cpp:
class Base
{
public:
virtual void foo(const char* str) = 0;
void foo(const std::string& str){
  foo(str.c_str());
}
};

class Hoge : public Base
{
public 
 void foo(const char* str){
 }
};

std::string str = "abc";
Hoge h;
h.foo(str); //std::stringを受け付ける定義ないよエラー
 
```

C++がそういう仕様らしい。
http://www.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html

知らなかった。。。

Hogeに

```cpp:
using Base::foo;
```
と記載、または、

```cpp:
Hoge h;
Base* b = &h;
b->foo(str)
```
とすれば、使えるようです。


ただ、この程度であれば、オーバーロードせずに、

```cpp:
std::string str = "abc";
Hoge h;
b->foo(str.c_str())
```

かな。。。
GIT早見表

#Git早見表
##初期化
|コマンド               | 意味                 |
|----------------------|----------------------|
|`$ git init`|初期化|

##コミット
|コマンド               | 意味                 |
|----------------------|----------------------|
|`$ git add .`|全てコミット対象に追加|
|`$ git commit -m "コミットログコメント"`|コメントを指定してコミット|
|`$ git log --graph` | コミットログ（グラフ表示）|
|`$ git reset --heard [リビジョンやブランチ名]|コミットログをもどす|

##ブランチ
|コマンド               | 意味                 |
|----------------------|----------------------|
|`$ git branch`| ブランチを見る |
|`$ git branch [ブランチ名]` |ブランチを作成する |
|`$ git checkout [ブランチ名]`　| ブランチを変更する |

##マージ
|コマンド               | 意味                 |
|----------------------|----------------------|
|`$ git merge [ブランチ名]` | 現在のブランチに[ブランチ名]をマージ  |
Solr(tomcat)のヒープメモリサイズを調整する


Solrを動かしているTomcat(JVM)のメモリが実メモリ以上にメモリを食っている事象が発覚し対応したので簡単なメモ

※JVMの起動オプション意識した事なかったのでいい勉強になった

##原因

JVMの起動オプションである[Xmx]の値が一桁大きく(実メモリ以上に)設定されていて、メモリを食いつぶしていた。。

##対応

JVMの起動オプションである[Xmx]の値を変更し、solrサービスのrestartを実施

|オプション名|意味|
|---|---|
|Xms|ヒープサイズ初期値|
|Xmx|ヒープサイズ最大値|

```
Xms=1024m
Xmx=1024m
```

初期値と最大値を一緒にしておいて、サーバ上のメモリをどれくらい使うかをあらかじめ設計し、アロックしておく運用が良いと思われる。
ちょいと、あせった。。。
canvasなどのDOM要素をタッチされたとき、下の重なりの要素にタッチイベントを起こしたい

canvasでflashを表示して、ユーザーにタッチを促す演出を行っていましたが、いかんせんそのキャンバスが邪魔で重なりの下にあるDOM要素にタッチすることができませんでした。
jQueryのtriggerを使い、無理矢理したの要素にイベントを行うことも出来ますがCSSで解決できることを知りましたので記述しておきます。

```css
pointer-events: none;
```

>https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events

公式では
要素は、マウスイベントのターゲットになることはありません。しかし、子孫要素がpointer-eventsの別の値をセットされていた場合は、その子孫要素自体はマウスイベントのターゲットとなりえます。その場合、マウスイベントはそのイベント キャプチャ/バブル フェーズの過程で必要に応じて親要素のイベントリスナーをトリガーします。
と説明されています。
[Android]Activityのライフサイクル

#はじめに
　　　　javaの基本的な理解はできている
　　　　androidStudioの導入が完了している
同じく、開発初心者による備忘録のような形になります。
[Day1.AndroidStudioにおけるプロジェクトの作り方](http://qiita.com/BD1-FM/items/f9caa43b2d5510ddcfe4)
[Day2.Androidアプリケーションの構成](http://qiita.com/BD1-FM/items/c5ed161feec1fdf92796)
[Day3.アプリケーションのレイアウト](http://qiita.com/Yuki_Yamada/items/eb4a25cedca2ff8078fd)
[Day4.onClickListenerの実装とその後の処理](http://qiita.com/Yuki_Yamada/items/758bcce58801c12cd4d5)


#Activityのライフサイクル
Activityは「ライフサイクル」を持っています。文字の通りですがActivityの一生です。生まれてから（画面が呼び出されてから）死ぬまで（破棄される）までの流れのことです。
ライフサイクルを理解することでバグによる危険を回避することができます。

![activity_lifecycle.png](https://qiita-image-store.s3.amazonaws.com/0/59803/a8482e94-bf0a-9a39-2839-3d3b6cb3e65c.png)

上の画像は[Android Developers](http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle)の物です。
、これらのライフサイクルの状態はcallBackとしてActivityClassにまったく同じ名前で定義されています。
@Overrideで確認してみてください。
では下にそれぞれの特徴を記します。

##onCreate
このメソドの実装は必須です。Activityが一番最初になる状態です。Activityが呼び出された際最初の一回だけこの状態になります。主にはActivityで必須なコンポーネントの初期化をします。また、UIを設置するためのlayoutをここで読み込みます。

```java:.java
setContentView(R.layout.activity_main);
```

##onStart
Activityが画面に呼び出されたとき（度）に呼び出されます。ユーザーがUIを使えるようにするまでの仕事をここで行います。

##onRestart
ActivityがonStop状態の時に再度Activityが呼び出されたときにonRestartは呼び出される。ここの処理が行われたあとにonStartが呼び出される。

##onResume
Activityが前面になるときに呼び出されます。

##onPause
ユーザーがActivityを離れる前に呼び出されます。backGroundで動かす場合や閉じられる前にデータを保存しなければいけない場合はここで実施します。
また、この状態に入ったActivityをユーザーが再度呼び出した場合は、onResumeへと遷移します。
また、これが呼び出されたときに絶対にAcitivityが破棄されるわけではないので、もし破棄された際の処理をしたい場合はonDestoryを呼ぶ必要があります。
しかし、呼び出される可能性が絶対にあるわけではないのでそこはしっかり設計する必要があります。

##onStop
Activityがユーザーから見えなくなったときに呼び出されます。

##onDestory
Acitivytが終わるときに呼び出される。

#Fragment

fragmentも独自のライフサイクルを持っています。
勉強会で必要になった時に加筆します。
エクセルのマクロで秒を時：分：秒に変換する

ユーザーのログをマクロで成形しているときに、とあるアクションに対してどれだけの時間要したかを判断してセルに加算していたのですが。DateDiffの引数"s"を使いログの時間の差分を計算していたので、セルにはいっているのは秒数になっていてパッと見でどれだけ時間が流れたのか分かりませんでした。

なので
>http://www.hanatyan.sakura.ne.jp/vb6/datetime05.htm
を参考に下記の変換を行いました。

```vbnet
Range("A1") = CStr(CDate(Range("A1").Value / 86400#))　
```
86400は一日の秒数です、それを基準にどれだけの時間が経ったかを結果を出して成形しているわけですね。
C# で LitJSON を用いて気軽に JSON データを作る

## 概要
JSON 形式のデータを生成（エンコード）したい。

## LitJSON を使う
LitJSON を使うのが良い。
.NET であれば http://lbv.github.io/litjson/ から LitJson.dll を入手し、参照を追加すると良い。
Unity であれば初めから使えるっぽい。

## 元になるオブジェクトを作る

```csharp:data.cs
var obj = new
{
    hoge = 10,
    fuga = "hello",
    abc = new[] { 10, 20, 30 },
    aaa = new[] { "x", "yy", "zzz" },
};
```

## シンプルな変換
```csharp:sample1.cs
string json = LitJson.JsonMapper.ToJson(obj);
```

### 結果
```text
{"hoge":10,"fuga":"hello","abc":[10,20,30],"aaa":["x","yy","zzz"]}
```

## 人が見やすい形にする
```csharp:sample2.cs
LitJson.JsonWriter writer1 = new LitJson.JsonWriter();
writer1.PrettyPrint = true;
writer1.IndentValue = 4;
LitJson.JsonMapper.ToJson(obj, writer1);
string json = writer1.ToString();
```

### 結果
```text

{
    "hoge" : 10,
    "fuga" : "hello",
    "abc"  : [
        10,
        20,
        30
    ],
    "aaa"  : [
        "x",
        "yy",
        "zzz"
    ]
}
```
xhyve

# 参考

* [ailispaw/boot2docker-xhyve](https://github.com/ailispaw/boot2docker-xhyve)

## 注意点！！

* [xhyve を試してみた - blog.holidayworking.org](http://blog.holidayworking.org/entry/2015/06/15/xhyve_%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)

> VirtualBox を起動中に xhyve を実行すると、カーネルパニックが発生するので気を付ける必要がある。

# Build

```bash:
git clone https://github.com/mist64/xhyve
cd xhyve
make
sudo cp build/xhyve /usr/local/bin
```

# boot2dockerを動かす

```bash:準備
git clone https://github.com/ailispaw/boot2docker-xhyve
cd boot2docker-xhyve
make
```

```bash:起動
$ sudo ./xhyverun.sh
```

* docker / tcuser でログインが出来る。

## メモリ容量を変更

```diff:xhyverun.sh
- MEM="-m 1G"
+ MEM="-m 2G"
```

## CPU数を変更

```diff:xhyverun.sh
- #SMP="-c 2"
+ SMP="-c 2"
```


# Ubuntu Serverを動かす

## 概要

1. 起動にはカーネルとinitrd.imgが必要。Qemuのように指定して起動させる。
2. インストールが終わったら /boot/ をMac側にコピー
3. 起動

## 準備

```bash:
mkdir ~/xhyve/ubuntu/
cd ~/xhyve/ubuntu/
```

* ubuntu-14.04.2-server-amd64.iso をカレントディレクトリに保存しておく。

```bash:UbuntuのISOからインストールに必要なファイルを取得
dd if=/dev/zero bs=2k count=1 of=/tmp/tmp.iso
dd if=ubuntu-14.04.2-server-amd64.iso bs=2k skip=1 >> /tmp/tmp.iso

hdiutil attach /tmp/tmp.iso

cp /Volumes/Ubuntu-Server\ 14/install/vmlinuz .
cp /Volumes/Ubuntu-Server\ 14/install/initrd.gz .
```

```bash:8GBのHDDイメージを作成
dd if=/dev/zero of=hdd.img bs=1g count=8
```

## 起動スクリプト

```bash:~/xhyve/xhyverun_ubuntu_install.sh
#!/bin/sh

KERNEL="ubuntu/vmlinuz"
INITRD="ubuntu/initrd.gz"
CMDLINE="earlyprintk=serial console=ttyS0 acpi=off"

MEM="-m 2G"
#SMP="-c 2"
NET="-s 2:0,virtio-net"
IMG_CD="-s 3,ahci-cd,ubuntu/ubuntu-14.04.2-server-amd64.iso"
IMG_HDD="-s 4,virtio-blk,ubuntu/hdd.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"

xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD \
  -f kexec,$KERNEL,$INITRD,"$CMDLINE"
```

## インストール最後に一手間

1. Installation complete
2. Go back
3. Execute a shell

```bash:
cd /target
sbin/ifconfig
tar c boot | nc -l -p 1234
```

```bash:ホストから先ほどのIPアドレスを指定
nc 192.168.64.XX 1234 | tar x
```

* ゲストの/boot/ を持ってくる

## インストール完了

```bash:~/xhyve/xhyverun_ubuntu.sh
#!/bin/sh

KERNEL="ubuntu/boot/vmlinuz-3.16.0-30-generic"
INITRD="ubuntu/boot/initrd.img-3.16.0-30-generic"
CMDLINE="earlyprintk=serial console=ttyS0 acpi=off root=/dev/vda1 ro"

MEM="-m 2G"
#SMP="-c 2"
NET="-s 2:0,virtio-net"
IMG_HDD="-s 4,virtio-blk,ubuntu/hdd.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"

xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD \
  -f kexec,$KERNEL,$INITRD,"$CMDLINE"
```

## Ubuntu起動

```bash:
~/xhyve/xhyverun_ubuntu.sh
```
c言語でBrainf*ckインタプリタ

#### 2018/09/29 追記
https://qiita.com/kasari/items/043764c4b3ba87a547e3#comment-5d5261c37687129f69a8
実装にバグがあったため一部修正しました。ご指摘ありがとうございました。

```c
#include <stdio.h>
#define CODESIZE 1024
#define MEMSIZE 1024

typedef struct Code {
  char code;
  struct Code *addr;
} Code;

int debug = 0;

Code codes[CODESIZE];
char memory[MEMSIZE];

void step(Code *cp, char *mp) {
  int i;
  char ch;
  printf("code: %c (%p)\nmp: %d(%c) (%p)\n", cp->code, cp, *mp, *mp,  mp);
  printf("memory: ");
  for (i=0; i<8; i++) {
    printf("%d(%c) ",memory[i], memory[i]);
  }
  scanf("%c", &ch);
  printf("\n\n");
}

void getSource(char *fileName) {
  char ch;
  Code *cp = codes;
  FILE *f = fopen(fileName, "r");
  while ((ch=getc(f)) != EOF) {
    switch (ch) {
    case '>':
    case '<':
    case '+':
    case '-':
    case '.':
    case ',':
    case '[': 
    case ']':
      (cp++)->code = ch;
    }
  }
  fclose(f);
}

void analyze() {
  int index = 0;
  Code* stack[20];
  Code *cp = codes;
  for (;cp->code != 0; cp++) {
    if (cp->code == '[') {
      stack[index++] = cp;
    } else if (cp->code == ']') {
      index--;
      stack[index]->addr = cp+1;
      cp->addr = stack[index];
    }
  }

  if (debug) {
    for (cp=codes; cp->code!=0; cp++) {
      printf("%p    code: %c    addr: %p\n", cp, cp->code, cp->addr);
    }
  }
}

void execute() {
  Code *cp = codes;
  char *mp = memory;
  
  while (cp->code != 0) {
    if (debug) step(cp, mp);
    
    switch (cp->code) {
    case '>': mp++; break;
    case '<': mp--; break;
    case '+': (*mp)++; break;
    case '-': (*mp)--; break;
    case '.': putchar(*mp); break;
    case ',': *mp = getchar(); break;
    case '[': if (*mp == 0) {cp = cp->addr; continue;} else break;
    case ']': cp = cp->addr; continue;
    }
    cp++;
  }
}

int main(int argc, char *argv[]) {
  if (argc == 3) debug = 1;
  getSource(argv[1]);
  analyze();
  execute();
  return 0;
}
```
linuxのストアに証明書を登録　～javaでSSL接続をするとPKI PATHの構築に失敗する～

javaのプログラムで証明書をしっかりと登録しておかないと下記のようなエラーが出る

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

ググれば出てくる話だが備忘のため

①対象のサイトから証明書DL
②任意のフォルダに配置
③下記コマンド実行
     keytool -import -alias enetune -keystore [証明書ストアパス] -file [証明書パス]
④確認方法
     keytool -v -list -keystore [証明書ストアパス]

参考 <link>http://www.melange.co.jp/blog/?p=2345</link>
     <link>http://d.hatena.ne.jp/uunfo/20110813/1313242092</link>
Swiftでdatetime型のformatを変換する方法


## 疑問

データベースからdatetime型のデータを持ってきて以下のような形にconvertしたいことがありました。

```swift
yyy/MM/dd HH:mm
```

まず変換前はどういうフォーマットになってるのかなと、
そのdatetime型のデータを出力してみると以下のようになってました。

```swift
println(diary.created_at)

// => 2015-05-02T09:48:36.000Z
```

これどういうformatで書けるのかと、パッと見では分からず困ったわけです。

## 解決

どうやらこれは以下のようなformatで表せる様子。

```swift
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
```

つまり以下のような感じで変換できるということでした。

```swift
let inputFormatter = NSDateFormatter()
inputFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date: NSDate? = inputFormatter.dateFromString(diary.created_at)

let outputFormatter = NSDateFormatter()
outputFormatter.dateFormat = "yyy/MM/dd HH:mm"
let outputDateString = outputFormatter.stringFromDate(date!)
return outputDateString
```
DbNinjaをCentOS6.6にインストールする


# 前提
- すでにApacheのインストールは完了済
- ドキュメントルートは`/var/www/html`

# 手順

## ソースのダウンロード

```
wget http://www.dbninja.com/download/dbninja.zip
```

## 解凍

```
unzip dbninja
```

## 解凍したディレクトリをドキュメントルートへ移動

```
mv dbninja /var/www/html/
```

## ドキュメントルートへ移動

```
cd /var/wwwh/html
```

## dbninjaディレクトリのオーナーを変更

```
chown -R apache:apache dbninja
```

## ブラウザで表示

URLは`http:/example.com/dbninja/index.php`。

## モロモロ承諾

![DbNinja MySQL Manager   Setup.png](https://qiita-image-store.s3.amazonaws.com/0/80923/8a8662b2-95d4-07d6-2594-fc319203db79.png "DbNinja MySQL Manager   Setup.png")

I Agree にチェックを入れてContinueをクリック。

## 認証

![DbNinja MySQL Manager   Setup.png](https://qiita-image-store.s3.amazonaws.com/0/80923/59e2e3fc-56a3-a9bc-4e7d-5c1012d109da.png "DbNinja MySQL Manager   Setup.png")


`dbninja/_users/`に数字5桁のファイルができているので、その5桁の数字をFile nameの欄に入力してContinueをクリック。

## パスワードの設定

![DbNinja MySQL Manager   Setup.png](https://qiita-image-store.s3.amazonaws.com/0/80923/866dbb93-dac6-8d82-ceaf-31c7019d1584.png "DbNinja MySQL Manager   Setup.png")

DbNinjaにログインするためのパスワードを設定。
DBのパスワードとは別のもの。

## 完了画面表示

![DbNinja MySQL Manager   Setup.png](https://qiita-image-store.s3.amazonaws.com/0/80923/d8fbd434-1f93-f2ae-ec0c-d33e2cbfa273.png "DbNinja MySQL Manager   Setup.png")

Continueをクリック

## ログイン

![DbNinja MySQL Manager Login.png](https://qiita-image-store.s3.amazonaws.com/0/80923/f0f6df1c-9ee1-b7ae-498b-976e65d25e07.png "DbNinja MySQL Manager Login.png")

Usernameにadmin、Passwordに先ほど設定したパスワードを入力し、`Submit`をクリック。

## 成功

![DbNinja MySQL Manager.png](https://qiita-image-store.s3.amazonaws.com/0/80923/e46b3d6a-0eae-81bb-59c0-4461d553bb6a.png "DbNinja MySQL Manager.png")

後は`Manage Hosts`をクリックして、接続するDBの情報を設定すれば完了。

## faviconの設定

そのままだとfaviconが読まれないので、`dbninja/index.php`の`<head>`に以下を追記。

```html
<!-- faviconの設定-->
<link rel="shortcut icon" href="favicon.ico">
```
プログラミングと写経、読経そして瑜伽（ゆが）

いわゆるプログラミング言語における写経について、色々な意見があります。色々な意見、を割と幅広くまとめた記事には[こんなの](http://d.hatena.ne.jp/nishiohirokazu/20140905/1409908066)がありますね。大変参考になります。

蛇足に蛇足を加えるのが私のスタイルなので、大ざっぱに「サンプルソースコードを自分でも実行可能な環境で入力してみて習得する」＝「写経」とした時、何が有効なのかを述べます。

先人達も諸々の工夫はしています。しかし、どちらかというと技巧的なレベルの話が多く、例えばAction Learningの知見が活かされていたりするものはあまりないように思います。

#「読む」という行為が持つ曖昧さをどう乗り越えるか？
読書でよく発生する問題は、「分かったつもりなのに、読み終わったところで全然使えない」という問題です。それを乗り越えるために、心ある教科書は「演習」を設けていますが、残念ながら、そうでない書物もあります。しかし、それでもプログラミングの教科書であれば、サンプルソースは載っています。だから、演習が無い場合、演習の代用として「写経」を行うという可能性が生まれます。

その場合、**覚えてから記憶を頼りに書き、間違っていないかを見比べる**、というのが重要です。書見台は要りません。ない方が良いのです。記憶が間違っていないかどうかは、実行してみればある程度分かります。実行してみて動かないようなら読み直して、もう一度記憶を頼りに直しましょう。WEBからサンプルソースをダウンロードできるなら、diffを取っても良いですが、ちょっと易きに流れますね。

ただし、普通IDEの支援機能を使って書くような言語の場合、その支援機能をフルに使って下さい。JavaのコードをEcripse無しで書ける、というような**エクストリームプログラミングができるようになる必要はない**でしょう。

#Action Learningの応用
Revans' FormulaというAction Learningの親玉が定式化した、とても**アバウトな式**があります。

```
Learning = Programming + Questioning
```

というやつです。先の「写経」はRevens' Formulaで言う「Programming」に相当します。このレベルは、教科書の本文中に書かれたコード片くらいで充分です。それ以上の粒度のものを「写経」しても、労多くして実りの少ないものになります。

次は、「読経」です。

コードサイズにして数百～数千行くらいのコードを読んでみるのが、入門書＋写経の次のステップです。本当はロール紙が良いのですが、最近は見かけ無いでしょうから、できればA3サイズくらいにびっしりプリントアウトして、のりで繋げましょう。長い机の上にそれを拡げて、コードリーディングをします。ノートPCとWiFi、お菓子とドリンクも欲しいところです。後は赤ペンとプロッキー2色があると良いですね。

人間の認識上の視野は、不思議と「ワークスペースの広さ」に影響されます。そのコード全体に意識を拡げるには、広い場所で頭を使うのが一番です。

学習目的のコードリーディングは、幅優先探索がオススメです。まず一番表層の流れを理解したつもりになるところまで読みます。構造化プログラミングのパラダイムはあらゆる言語に広まっていますので、関数を適用しているところをブラックボックスとして読み飛ばせば、表層の流れは読めます。ここで、赤ペンで、疑問を書いていきます。「なぜ？何のために？」が主たる問いになります。意味が分かった行に印を付けながら進むと、大体関数呼び出しと内部用の設定値以外の最上層に印が付きます。

そして、今度はもう一段中に踏み込みます。幅優先で理解を深めていきます。かつての自分の疑問に、自分で解答しつつ、適宜遡りながら、読み進めれば良いのです。

疑問の解消の仕方は4通り。

* **コードの中に答えがある**
* **実験用コードを自分で書いてみて答えを明らかにする**（そのためにノートPCがあります）
* インターネットに答えがある
* 先輩や上司の中に答えがある

という順です。仕事の一環として勉強するなら最後のふたつは順序が逆転しますが、いずれにせよ、初めのふたつが本命です。「ぐぐれかす」というのは、ある意味簡略化されすぎた表現で、ぐぐってみれば「質問者はなんで自分で試してみないの？」みたいな模範解答に辿り着くことがままあります。

ちなみに、さっきの「仕事の一環」に関して言うと、インターネットで自分で答えを検索して、変なの拾って、変なドグマに支配されるのは勘弁なので、私だったら「ぐぐる前に俺に聞け」と言います。まあ、結局、後ろに立ってぐぐらせることも多かったですけどね。新人だと記事の目利きがなかったりしますからね。

とゆーわけで、自分の疑問を全て解消できれば、「読経」は完了ですが、改めて全体を見渡すと、「これがこのプログラムの構造だ！」という印を書きたくなってきます。一番大事なブロック、最もトリッキーな制御構造など。それを大胆にプロッキーで書きこみます。これが、成果物です。社内の勉強会で発表するもよし、書き初め風に飾ってもよし、後は好きになさいませ。

#最後は「瑜伽」だっ！
ゆが、と呼びます。いわゆるヨーガ。実践的な修行ですね。「やりたいこと」を設定して「How?」という問いに自分で答えるのです。もう、そこからは無数のやり方があるでしょう。個人でも学びは多いですし、チームでやればもっと濃密になります。ハッカソンなんかも良いですよね。んでもって、チャクラが開きまくって、素敵なプロダクトが生まれますように。
MongoDBで総カウント数とユニークカウント数を知りたい時

いつもここからみたいなタイトルになってしまいましたが、よく忘れるので、備忘も兼ねて。。

## 総数を知りたい時

find()とcount()を使うです。

```
db.コレクション名.find({条件}, {対象フィールド: 1}).count()
```
具体的にはこんな感じ。
（5月に男性がダウンロードしたコンテンツの総数）

```
db.download_histories.find({"sex": "male", "created_at" : { "$gte" : ISODate("2015-05-01T00:00:00+09:00"), "$lte" : ISODate("2015-05-31T23:59:59+09:00") }}, {"contents_id" : 1}).count()
```
## ユニーク数を知りたい時

distinct()とlengthを使うです。

```
db.コレクション名.distinct({対象フィールド}, {条件}).length
```
具体的にはこんな感じ。
（5月に男性がダウンロードしたコンテンツのユニーク数）

```
db.download_histories.distinct("contents_id", {"sex": "male", 
"created_at" : { "$gte" : ISODate("2015-05-01T00:00:00+09:00"), "$lte" : ISODate("2015-05-31T23:59:59+09:00") }}).length
```

**※このクエリはフィクションであり、実在の案件・コレクションとは一切関係ありません**
静的サイトジェネメモ（node.js系）


# Roots
> enlightened static sites
http://roots.cx/

## 使ってみた

中身は超シンプルで、面倒くさいこと考えずにコーディングできて楽しい。

良かった点

- 導入コストが低い。普段gulp/grunt使いだったらいろんな面で楽できる
- なんか[AXIS](http://axis.netlify.com/)とか[Rupture](https://github.com/jenius/rupture)ってのがついてくる。
- 拡張が簡単そう。でも、最低限node.js書けないと辛いかも。

めんどい点

- vimmerは `*.swp` しないと始まらない
- デフォルトで、データとテンプレートが別れてない。
- そいで、jadeがファックなところが眼と鼻につく。（gulp-data的なimportを自前でやんなきゃ。）
- 公式サイトが見づらい。オサレだけども。見づらい。
- 基本変わったことやりたいなら、拡張書けよスタンス。というのも、設定ファイルがjsonベースなんで、gruntを思い出して辛くなる。


# Wintersmith

> Flexible, minimalistic, multi-platform static site generator built on top of node.js.
http://wintersmith.io/

## 使ってみた

最初は独自ルールを覚えないとハマる。ちゃんとドキュメント読みましょう。

```json:config.json
{
  "locals": {
    "url": "http://localhost:4545",
    "name": "project",
    "owner": "yohawing",
    "description": "ws sample"
  },
  "plugins": [
    "wintersmith-less",
    "wintersmith-browserify",
    "wintersmith-yaml-page",
    "wintersmith-livereload"
  ],
  "contents": "./src",
  "ignore": [
    "**/.DS_Store",
    "**/vender"
  ],
  "browserify": {
    "transforms": [
      "babelify"
    ],
    "fileGlob": "common/scripts/*.js",
    "extensions": [
      ".js",
      ".es6"
    ]
  },
  "port": 4545,
  "jade": {
    "pretty": true
  }
}

```
設定はこんな感じが吉。
もろもろ便利なプラグインが用意されてるし、
自前でプラグイン書くこともできる。

[ドキュメント](http://wintersmith.io/docs/)は舐めてるのかってくらい見づらい。
素直に、Githubを回遊するのが吉。

もう一回使いたいかと言われると、もう二度と使いたくない。




# Assemble

> Static site generator for Node.js, Grunt.js, and Yeoman and Gulp.

https://github.com/assemble/assemble/

# metalsmith

> An extremely simple, pluggable 

http://www.metalsmith.io/

# punch

> A FUN AND EASY WAY TO BUILD MODERN WEBSITES

http://laktek.github.io/punch/


# Hexo

> A fast, simple & powerful blog framework

http://hexo.io/
eth0 おまじない

仮想環境のCentOSで起動時にネットワークがうまく接続されない場合があるみたい。
`vi /etc/sysconfig/network-scripts/ifcfg-eth0`
最終行に追記
```check_link_down () {
    return 1;
}```
参考 : [VMware/Redhat系のOSでネットワークの起動に失敗する](http://yakinikunotare.boo.jp/orebase/index.php?VMware%2FRedhat%B7%CF%A4%CEOS%A4%C7%A5%CD%A5%C3%A5%C8%A5%EF%A1%BC%A5%AF%A4%CE%B5%AF%C6%B0%A4%CB%BC%BA%C7%D4%A4%B9%A4%EB)
Meteorを自分のサーバにデプロイする　Meteor-up編

# 忙しい人はこちら
```
npm i -g mup
cd <project_dir>
mup init
edit mup.json
# ホスト名、ユーザ名等を入力
mup setup
mup deploy
```
みなさん、Meteorライフを満喫していますか？angular-meteorにどっぷりな[@endows_takashi](https://twitter.com/endows_takashi)です。今日はMeteorを自分の鯖にアップロードする方法を紹介します。

Meteorは```meteor deploy APPNAME.meteor.com```で簡単にデプロイできることで有名ですが、これで自分のサーバにデプロイすることはできません。いまのとろこは。もうすぐGalaxyなる機能が追加され、自動でDocker+Kubernetes環境を構築してくれるようです。

今回はMeteor-upというライブラリを使ってデプロイしたいと思います。まずはnpmからインストール
```
npm i -g mup
```
次に自分のMeteorプロジェクトに移動して、initします。
```
cd <project_dir>
mup init
```
すると、mup.jsonとsetting.jsonが作成されます。主にmup.jsonをいじっていきます。基本は書いてあるとおりに入力していけばおkです。注意するところだけ書いておきます。

```json:mup.json
  "servers": [{
    "username": "root",
    // rootじゃなくても可。sudoerであれば。
  }],
  "app": "/develop/channel",
  //ここはローカルのプロジェクトディレクトリを指定してください。
```
あとは

```
mup setup
# Node.jsやMongoのインストールをやってくれる
mup deploy
# いよいよデプロイ。デプロイするたびにこのコマンドを叩く
```
Mojoliciousでcssをheaderにjsを最下部に配置する。

ウェブページ表示の高速化手法１つにスタイルシートは上部に、javascriptは最下部に配置するというのがあります。それを実現します。

# 1. コントローラのテンプレート(html.ep)にcontent_forでcss, jsを追加

```pl
# css スタイルシート用
% content_for css_app => begin
%= stylesheet 'app/css/sample.css';
%= stylesheet 'app/css/sample2.css
% end

# js javascript用
% content_for js_app => begin
%= javascript 'app/js/sample.js';
%= javascript 'app/js/sample2.js';
% end

```

# 2. default.html.epに上記を読み込む記述を追加

```html

<head>
%= content_for 'css_app';
</head>

<body>


%= content_for 'js_app';
</body>
```

content_forはすでに登録されているものに関しては、追加書き込みをするので
複数のテンプレートで使用しても大丈夫かと思います。


# 参考
http://mojolicio.us/perldoc/Mojolicious/Plugin/DefaultHelpers#content_for

以上
Vue.js 0.12.1 で使える Prop Binding Types

[Vue.js 0.12.0 "Dragon Ball"](https://github.com/yyx990803/vue/releases/tag/0.12.0) リリースおめでとうございます :tada:

そんなわけで Vue.js 0.12.0 から登場した **Prop Binding** について、ざっくりと見ていこうと思います。どこか勘違いしてるところあったらご指摘お待ちしております。

## 注意 :exclamation: 

本記事はタイトルの通り **0.12.1** に沿ったものとなります。**0.12.0** と **0.12.1** で Prop binding の仕様(構文)が変わっているので注意してください。

See: [Release 0.12.1 · yyx990803/vue](https://github.com/yyx990803/vue/releases/tag/0.12.1)

## そもそも Vue.js でいう Prop とは

http://vuejs.org/guide/components.html#Passing_Data_with_Props

> By default, components have isolated scope. This means you cannot reference parent data in a child component’s template. In order to pass data to child components with isolated scope, we need to use `props`.

雑に言うと、つまりコンポーネント間で値をやりとりする(正確にはプロパティのスコープをコンポーネント間に広げる)ための仕組みです。

## Prop Binding Types

コンポーネント間でスコープのやりとりをできるようになると

- 「親」が持つプロパティを「子」からも変更したい(いわゆる Two-way binding)
- 「子」はあくまでも参照のみ。更新は「親」しかできない(いわゆる One-way binding)

みたいなことを考えるようになります。これを制御するのが、0.12.0 から登場した Prop Binding Types です。

### 例

こんな感じの画面があるとします。

```html
<html>
    <head>
        <meta charset="UTF-8">
        <script src="vue-0.12.1/dist/vue.min.js"></script>
    </head>
    <body>
        <div id="demo">
            Parent: <input type="text" v-model="msg">
            <br>
            Child: <child msg="{{msg}}"></child> <!-- ここが変化します -->
        </div>
        <script>
         var demo = new Vue({
             el: '#demo',
             data: {
                 msg: 'Hello, World!'
             },

             components: {
                 child: {
                     props: ['msg'],
                     template: '<input type="text" v-model="msg">'
                 }
             }
         });
        </script>
    </body>
</html>
```

### 1. One-way binding

```html
<child msg="{{msg}}"></child>
```

Prop のデフォルトの動きは One-way binding になります。

![vuejs-binding-1.gif](https://qiita-image-store.s3.amazonaws.com/0/6635/1dbe1d82-cc47-0140-f79d-2b4ab81df4e8.gif)


親が持つ msg に対する変更は子にも通知されますが、子が持つ msg への変更は親には通知されません。

### 2. Two-way binding

```html
<child msg="{{@ msg}}"></child>
```

Two-way binding にするには `@` を追加します。

![vuejs-binding-2.gif](https://qiita-image-store.s3.amazonaws.com/0/6635/84dcc861-927c-9899-491c-f2a8d9b75eae.gif)


親が変更したら子へ、子が変更したら親へ通知されます。


### 3. One-time binding

```html
<child msg="{{* msg}}"></child>
```

親の変更が子へ **一度だけ** 通知されます。

![vuejs-binding-3.gif](https://qiita-image-store.s3.amazonaws.com/0/6635/290da9b8-fc2c-e23e-fea2-64922319263d.gif)

わかりづらいですが、今回の場合は画面ロードした時に親が持つ msg が子に渡されたタイミングで One-time binding の効果により、以後親子ともに変更が反映されません。

### おまけ

0.12.0 の時は **子の変更だけを親に通知する** みたいな `Oneway up binding` とかもあったらしいですが、0.12.1 ですぐ削除されちゃいましたね。

## まとめ

コンポーネント間の値の受け渡ししたいけどグローバル変数にするのはなー、みたいな時には便利そうですね?多分。

## 参考資料

- [Prop Binding Types - Component System - vue.js](http://vuejs.org/guide/components.html#Prop_Binding_Types)
- [Release 0.12.1 · yyx990803/vue](https://github.com/yyx990803/vue/releases/tag/0.12.1)
オレオレライブラリのMavenレポジトリをGithubに作ってしまう


Mavenセントラルに登録するほどでもなく、自前でMavenレポジトリを構築するほどでもない。そんなオレオレライブラリ達の置き場に困ることがよくある。
これまでは`jar`ごとバージョン管理対象にして`mvn install:install-file`してね。なスタンスだったのだがGithub PagesをMavenレポジトリにすることができるらしいのでやってみた。

##Github Pagesを作成する
Githubでレポジトリを作成。`[ユーザー名].github.io`という名前にするとユーザーページができあがる。

適当な場所にクローンしておく。

##pom.xml設定(オレオレライブラリ側)

オレオレライブラリのデプロイ先をGithub Pagesをクローンした場所にする。

```
<properties>
  <github.repo.directory>/path/to/master-of-sugar.github.io/mvn-repo</github.repo.directory>
</properties>
<distributionManagement>
  <repository>
    <id>internal.repo</id>
    <name>Local Github Pages</name>
    <url>file://${github.repo.directory}</url>
  </repository>
</distributionManagement>
```

##デプロイする

```
mvn deploy
```

`pom.xml`で指定したGithub Pagesのクローンディレクトリに配置される。

##Mavenレポジトリ(Github Pages)に登録する
普通にGithub Pagesにpushするだけ。

```
git push origin master
```

##pom.xml設定(使う側)
オレオレライブラリの取得元であるGithub Pagesを登録する。

```
<repositories>
  <repository>
    <id>github</id>
    <url>http://master-of-sugar.github.io/mvn-repo/</url>
  </repository>
</repositories>
```



これで`mvn install:install-file`しなくても使える。わー簡単。
gitをコマンドラインから使う場合(これだけは覚えておこう)

普段Windows上ではGitExtensionsしか使っていないわたしですが、サーバー上にリポジトリをデプロイするときなどGitをコマンドラインから叩かないといけない機会が時々あります。

そういうときに覚えておかないといけないコマンドを最低限。

# クローンする
まずは基本です。

```bash
$ git clone [リポジトリアドレス] [配置するディレクトリパス(未指定の場合はリポジトリ名と同じ)]
```
具体的には

```bash
$ git clone git@github.com:TakamiChie/Pico-Tags-Plugin.git tags
```

など。
また、クローンするリポジトリ内にサブモジュールが使われているときは、別途サブモジュールも読み込みしてやる。

```bash
$ git clone [リポジトリアドレス]
$ git submodules init
$ git submodules update
```

で、だいたいOK。

## 「Could not open a connection to your authentication agent.」とか「Permission denied (publickey).」とか表示される場合

clone時に上記エラーが表示される場合、リポジトリアクセス用の秘密鍵がサーバに登録されていないのが原因です。秘密鍵(ファイルの先頭が「-----BEGIN RSA PRIVATE KEY-----」から始まっているもの)を`~/.ssh/に保存し、`ssh-add`します。

```bash
$ vi ~/.ssh/github.com.key # ← githubの秘密鍵データ
$ chmod 600 ~/.ssh/github.com.key
$ eval `ssh-agent -s`
$ ssh-add ~/.ssh/github.com.key
```

秘密鍵ファイルのパーミッションが緩いままだとclone時に怒られてしまうので、厳しく(ここでは600)にしておきましょう。


# (リポジトリを最新のものとして)リポジトリの内容を読み込む
リポジトリのデータを読み込む。

```bash
$ git pull
```
どうも「git pullは使うな、git fetchを使え」という意見も多いようですが、とりあえずサーバ上のファイルを更新しない前提では問題が起きていないのでこのまま使っています。

## サブモジュールを更新する

また、サブモジュールも更新した場合は、これだけではサブモジュールが更新されない場合があります（と思ったらされることもあるようで、よくわからない）。その場合以下の処理を足す。

```bash
$ git submodules foreach 'git pull origin master'
```

これで全てのサブモジュールをgit pullします。
本来ならgit submodules updateでもいいようですが、たまにmasterブランチを見ていないモジュールがあったりするので、これで統一しておくと楽です。

# リポジトリに編集したファイルをコミット
いくらWindows上での開発がメインとはいえ、サーバ上のスクリプトの編集など、場合によってはサーバ上のファイルを直接編集→それをコミットすることはあるので・・・


```bash
$ git commit .
```

ここでコミットメッセージエディタが出ます。自環境のせいかもしれませんが日本語は使えませんので英語で記載しましょう。

コミットするファイルを指定する場合は、引数を.ではなく、ファイル名にする。

```bash
$ git commit index.php
```

ついでにリポジトリ未登録のファイルはコミットできません(GitExtensionsあたりだと勝手にAdd→Commitしてくれるので気にならないのですが)。わすれずにaddしておきましょう。

```bash
$ git add config.php
```

# リポジトリのプッシュ

コミットが終わったら、忘れずにpushしましょう。

```bash
$ git push .
```

もし他の環境でリポジトリを編集していたら、事前にpullします。

```bash
$ git pull
$ git push .
```

とりあえずこれだけがあれば最低限の操作はできるかと思います。
SvnXでブランチの切り替え(switch)


Working copy ウィンドウでツールバーの "Repository" をクリック 

![select_repository.png](https://qiita-image-store.s3.amazonaws.com/0/8219/b891f1ce-b609-6c9a-16d4-7460aed1107c.png "select_repository.png")

URLからtrunkの上の階層(太字の部分)をクリック

![select_repository_root.png](https://qiita-image-store.s3.amazonaws.com/0/8219/8c41a857-8d44-9210-8b84-94d0602a21d8.png "select_repository_root.png")

切り替え先のブランチを選択

![select_target_branche.png](https://qiita-image-store.s3.amazonaws.com/0/8219/67a71af3-9023-9e11-4d1e-bd80f9a2bb88.png "select_target_branche.png")

切り替え先のブランチを Working copy ウィンドウに `Ctrl` を押しながらドラッグ&ドロップ

![drag_drop.png](https://qiita-image-store.s3.amazonaws.com/0/8219/c8935a1b-3e45-2c35-02a4-9e84d8496480.png "drag_drop.png")


切り替え先のブランチのURLを確認して[OK]ボタンをクリック

![confirm_switch.png](https://qiita-image-store.s3.amazonaws.com/0/8219/fc8d6140-b3ab-6e06-0a6c-927e136f538c.png "confirm_switch.png")

これで切り替え完了。
最後に Working copy ウィンドウのURLが正しいことを確認。

![working_copy_result.png](https://qiita-image-store.s3.amazonaws.com/0/8219/8d2589be-8e49-5077-d71b-a2e3be0c0bb3.png "working_copy_result.png")