OmniAICreator/Qiita-1.07M huggingface dataset:
python > fileIO > ロギング処理 > utilLogger.py

```txt:動作確認
CentOS 6.5
```

pythonにて文字列のログ保存をしたい。

以下のようなユーティリティーファイルを作成中。

## v0.1

```utilLogger.py
import os.path

'''
v0.1  2015/11/30
	- add save()
	- add add()
	- add __init__()
'''
class CUtilLogger:
	def __init__(self, saveto):
		self.idx = 0
		self.strs = [ "", "", "", "", "", ""]
		self.saveto = saveto
		return

	def add(self,str):
		self.strs[self.idx] = str
		self.idx = self.idx + 1
		print self.idx
	
	def save(self):
		with open(self.saveto, "a") as logfd:
			for idx in range(0, self.idx):
				text = self.strs[idx] + "\r\n"
				logfd.write(text)	

#Usage 
logger = CUtilLogger("151130.log")
logger.add("test")
logger.add("test")
logger.add("test")
logger.save()
logger = None

# TODO: 0m > auto save if idx > 5
```

現状のものは以下で実行できる。

```
$ python utilLogger.py
```

実行後、151130.logファイルが作成され、test<CR><LF>が3行記載されている。

pythonでのself.strs[5]のような初期化がよくわからない。とりあえず上記で動いたが。


## v0.2

5個ずつファイル保存するようにした。
これで数の上限を気にせずadd()し続ければいい。

```utilLogger.py
import os.path

'''
v0.2  2015/11/30
	- update add() to handle auto save feature
v0.1  2015/11/30
	- add save()
	- add add()
	- add __init__()
'''

class CUtilLogger:
	def __init__(self, saveto):
		self.idx = 0
		self.maxnum = 5
		self.strs = [ "", "", "", "", "", ""]
		self.saveto = saveto
		return

	def clear(self):
		for idx in range(0, self.idx):
			self.strs[idx] = ""
		self.idx = 0

	def add(self,str):
		self.strs[self.idx] = str
		self.idx = self.idx + 1
		print self.idx
		if self.idx >= self.maxnum:
			self.save()
			self.clear()

	def save(self):
		with open(self.saveto, "a") as logfd:
			for idx in range(0, self.idx):
				text = self.strs[idx] + "\r\n"
				logfd.write(text)	

#Usage 
logger = CUtilLogger("151130.log")
for loop in range(0, 31):
	logger.add("test")
logger.save() # to save the rest
logger = None
```
C言語のプロトタイプ宣言を楽に追加するVimプラグイン - C-prototype.vim

こんにちは、皆さん。VimでC言語してますか？ 僕は大学でCプログラミングの授業があってやってます。面白いもので、気づけば時間が結構経っているものです。でも、周りにVimmerが全くと言っていいほどいないのです。~~大学が安易に Emacs を勧めやがって・・・~~
それはさておき、僕は大学の授業でもっぱらVimでしてますが、一つ面倒なことがあります。僕は自前の関数を `main` の後に書く派なので、関数プロトタイプ宣言が必要となります。
`:(行数)`→`yy`→`:(main関数の位置)`→`p`→`$`→`r;`
としているのですが、これ、どうにかなりませんかね？？正直面倒です。

そこで、Vim Scriptの乏しい知識を使って自前でプラグインを作ってみました。その名も、`C-prototype.vim`です。

#導入
[shima-529/C-prototype.vim](https://github.com/shima-529/C-prototype.vim) で公開してるのでこちらからどうぞ。
`NeoBundle` を使っている方なら、以下を `.vimrc` やらに追加すれば動くはずです。

```vim:.vimrc
NeoBundleLazy 'shima-529/C-prototype.vim', {
    \ 'autoload' : {'filetypes' : ['c', 'cpp']}
    \ }
```

#使い方・設定
簡単にこのプラグインの使い方を紹介します。いずれもノーマルモードで作動します。
まずは使うためにはキーバインドの設定が必要です。

1. **プロトタイプの追加・更新**  
`nmap <任意のキー> <Plug>(c-prototype-make)` を `.vimrc` に記述してください。デフォルトでは `z` に割り当てられています。
1. **プロトタイプの削除**  
`nmap <任意のキー> <Plug>(c-prototype-delete)` を `.vimrc` に記述してください。デフォルトでは `dz` に割り当てられています。

さらに、デフォルトのキーを利用しない場合(キーバインドの変更をした場合・キーバインドを一切使用しない場合)、`let g:c_prototype_no_default_keymappings = 1` も追加してください。

##1. プロトタイプの追加・更新
関数プロトタイプ宣言を追加できます。追加位置は `main` 関数の直前です。空行 + 関数プロトタイプ宣言  + 空行 が追加されます。上のキーを押して実行してもいいですし、`:CPrototypeMake` を打ち込むことでも実行できます。
e.g.

```c:Before
#include <stdio.h>
int main(void){
    ...
}

void f1()
{
    ...
}

double f2(int param){
    ...
}
```

↓

```c:After
#include <stdio.h>

void f1();
double f2(int param);

int main(void){
    ...
}

void f1()
{
    ...
}

double f2(int param){
    ...
}
```

なお、下の関数自体の引数や型を変更した場合も、このタイミングで `z` を押せば更新されます。

##2. プロトタイプの削除
追加した関数プロトタイプ宣言を削除できます。これは1.のコマンドで作成した関数プロトタイプ宣言だけではなく、手打ちで追加したものも削除してくれます。`:CPrototypeDelete` を打ち込むことでも実行できます。

#動作している様子
![proto.gif](https://qiita-image-store.s3.amazonaws.com/0/74946/613bbc0f-2697-a2b9-9a17-5580e25c9084.gif)
キーボード叩くの遅ぇよ！って感じですがご容赦ください。

#最後に
いやぁ〜、自分の書いたプログラムが動くなんて最高ですね！コードが幼稚でも頭のなかの構想と実際の挙動が一致した時の快感はヤバイです。かくいう僕は進振りで情報系に進む気ゼロですがね。

僕はこの `C-prototype.vim` で色々とコードを書いてますが、今のところ不具合はありません。このプラグインが少しでもあなたのプログラミングの一助になれば、これ以上の幸せはないです。
PocketWiFi GP01でSORACOMのSIMを使う

[SORACOM Advent Calendar 2015](http://qiita.com/advent-calendar/2015/soracom)の1日目です。今年は個人で参加です^_^

# 概要
EMOBILEを解約してからタンスのコヤシになっていた[Pocket WiFi GP01](http://www.ymobile.jp/lineup/old/gp01/)でSORACOMのSIMを使う設定ができたので、その覚え書きです。公式サイトにある一般的なSIMの設定方法については書いていません。

![写真 2015-11-30 0 31 40.jpg](https://qiita-image-store.s3.amazonaws.com/0/20474/d0cb3779-cbd3-2165-e27f-22007e5a7e17.jpeg)

# 経緯
[OMOIKANet](http://www.omoikanet.org/)というIoTプラットフォームを利用するにはWPSに対応した通信機器が必要だったのですが、手持ちのiPhone5やSIM Free iPadはWPSに対応していませんでした。そんなとき、昔使っていたEMOBILEのPocket WiFiがWPSに対応していたことを思い出し、iPad用に購入していたSORACOM SIMがPocket WiFiで使えそうだったので試しにやってみました。


# 事前準備

* [GP01をVersion3.00にアップデートする](http://blog.goo.ne.jp/orangesr/e/18f3b1ee95936585c6a560af78a16f5e)
    * [Version3.00](http://www.eaccess.net/mobile/support/updatetool_GP01.html)にしてSIMフリー化します

* SORACOMのSIMを入手する
    * [公式ページ](https://soracom.jp/start/)を参照
    * iPad第三世代で試すことを想定していたのでmicroSIMを購入
    * PG01は標準(mini)を使うので下駄を用意
* SIM変換アダプタ(下駄)を入手する
    * 秋葉原やネット通販で買う
    * microSIMに下駄を履かせて標準(mini)サイズにする
    * はじめから標準(mini)SIMを購入している場合は不要

![写真 2015-11-29 23 35 48.jpg](https://qiita-image-store.s3.amazonaws.com/0/20474/3335fb74-7759-791a-6f98-a59f457bfb1c.jpeg)



# 作業内容

WiFiに接続後、192.168.1.1にアクセスしてログインする
![79ff30d1-b4d4-2c22-66f8-ae8ddda905fe.png](https://qiita-image-store.s3.amazonaws.com/0/20474/ace756ed-fc32-8906-b39f-d9f98f9a226a.png)


「設定」-> 「3G設定」を押す
![443f736e-162c-a56e-e212-a81f37455f91.png](https://qiita-image-store.s3.amazonaws.com/0/20474/569cf4ac-86b9-5f10-d5d3-08e4b06eb3db.png)


「プロファイル設定」を押す
![スクリーンショット 2015-11-30 0.10.09.png](https://qiita-image-store.s3.amazonaws.com/0/20474/2b1da791-1bac-706e-b1ef-7137a99a982e.png)

SORACOMから送られてきたユーザー名、パスワード、APNを入力して保存する
(プロファイル名は任意の文字でOK)
![スクリーンショット 2015-11-30 0.10.50.png](https://qiita-image-store.s3.amazonaws.com/0/20474/d5a8a1f8-a79c-15a6-07d4-7c7b07d04589.png)

「設定」->「3G設定」->「接続モード設定」を押し
プロファイルリストで先ほど作成したプロファイルを選択し、適用を押す
![スクリーンショット 2015-11-30 0.25.02.png](https://qiita-image-store.s3.amazonaws.com/0/20474/b96a9bd7-461d-9136-9e40-bb73e4e354db.png)

「設定」->「ファイアウォール設定」を押す
![スクリーンショット 2015-11-30 0.11.25.png](https://qiita-image-store.s3.amazonaws.com/0/20474/3466169a-cc9e-c412-1bf7-4790c8d6784f.png)

「DHCP設定」を押す
![スクリーンショット 2015-11-30 0.28.35.png](https://qiita-image-store.s3.amazonaws.com/0/20474/62f83913-cc96-c6b5-60ca-dd116834049e.png)

DNSの設定を入れて適用を押す
![スクリーンショット 2015-11-30 0.28.58.png](https://qiita-image-store.s3.amazonaws.com/0/20474/e9fe3ed6-0f68-00ae-a6e0-12d2c474ab99.png)

ネットに接続できることを確認
![スクリーンショット 2015-11-30 0.55.09.png](https://qiita-image-store.s3.amazonaws.com/0/20474/325c688f-7c9d-700e-b52a-6bdbc0204dce.png)

# 詰まったところ
プロファイルの設定後、IPアドレスへのpingが通るのに名前解決ができていなかったのでDNSの設定をしようとしたのですが、ファイヤーウォール設定の中のDHCP設定の中にあると気づくのに時間がかかりました。
[PHP]正規表現○○から始まる文字列か？○○で終わる文字列か？(preg_match)

忘れそうなので取り急ぎメモっておきます！
なんかこれいっつもググってる気がしますし・・。

## ○○から始まる文字列か？
```php
preg_match("/^○○/",$strhoge));
```

## ○○で終わる文字列か？
```php
preg_match("/○○$/",$strhoge));
```
## まとめ
^　を先頭につけると、○○から始まる文字列
$　を最後につけると、○○で終わる文字列

となります。


### 使用例
```php
// 先頭
if (preg_match("/^○○/",$strhoge)) {
	echo '○○から始まっています';
}
else{
	echo '○○から始まっていません';
}

// 最後
if (preg_match("/○○$/",$strhoge)) {
	echo '○○で終わってます';
}
else{
	echo '○○で終わってません';
}
```

みたいに使えますね。

## 追記
PHPの場合は正規表現の処理は重いらしく、PHPの関数がある場合は使用した方が処理が早いようです。処理速度を気にする方は、こちらをおすすめします。

■strncmp — 最初の n 文字についてバイナリセーフな文字列比較を行う
http://php.net/manual/ja/function.strncmp.php

```php
// 先頭
if (strncmp($strhoge,'○○', strlen('○○')) === 0) {
    echo '○○から始まっています';
}
else{
    echo '○○から始まっていません';
}
```
Use Ricty font with emacs-24.5.8

```elisp
(let ((font-size 14))
  (create-fontset-from-ascii-font
   (format "Ricty-%d:weight=normal:slant=normal" font-size) nil "ricty")

  (set-fontset-font "fontset-ricty" 'unicode
                    (font-spec :family "Ricty" :size font-size) nil 'append))

(add-to-list 'default-frame-alist '(font . "fontset-ricty"))
```

font-size を一カ所で指定できるようにしました。
node.js v5.1をubuntuマシンに入れてみる

時間があるのでnode.jsを触ってみる。ちなみにGoogle Apps上のJavascriptは使っているけどnode.jsは初めて。インストールした先はUbuntu 15.10(wily)です。


#node.jsのインストールにnvmを使用する
node.jsのインストール方法はいろいろあるようだが、[こちらのサイト](http://www.tettori.net/post/1495/)よりnvmを使用する方法を参考にさせていただきました。node.js・nvmと（今回は使用していないけど）npmは密接な関係にあるようです。

##nvmのインストール
node.jsをインストールする前にnvmというものをインストールする。gitのインストールが前提になる。

```
$git clone https://github.com/creationix/nvm.git ~/.nvm
```

これでホームディレクトリの.nvmディレクトリにnvmコマンドがインストールされる。

このあとnvm.shを実行するとnvmコマンドが有効になる。

```
$source ~/.nvm/nvm.sh
```

毎回sourceコマンドを打つのも面倒なので、.bashrcに以下の行を追加しておいた。

```
# set nvm
if [[ -f ~/.nvm/nvm.sh ]]; then
        source ~/.nvm/nvm.sh
        nvm use 5.1 　　　　
fi
```

2015/11/30追記　*nvm use 5.1*を入れないとコマンドラインからいきなりnodeコマンドが使えない。後で使用する*express*コマンドなどで不都合が生じる

## node.jsのインストール
nvmコマンドで取得可能なバージョンのリストを取得する

```
$nvm ls-remote
...
    iojs-v3.3.1
         v4.0.0
         v4.1.0
         v4.1.1
         v4.1.2
         v4.2.0
         v4.2.1
         v4.2.2
         v5.0.0
         v5.1.0
```

たくさんバージョンが出てくるが、最新のv5.1.0を入れてみる。

```
$ nvm install v5.1.0
Downloading https://nodejs.org/dist/v5.1.0/node-v5.1.0-linux-x64.tar.xz...
######################################################################## 100.0%
WARNING: checksums are currently disabled for node.js v4.0 and later
Now using node v5.1.0 (npm v3.3.12)
```

node.jsのバージョン情報を確認

```
$ node --version
v5.1.0
```

ちゃんとv5.1.0が取得できた。

node.jsはコマンドライン（REPL Read eval print loop:対話的実行環境）でも動くので確認してみる。

```
$ node
console.log("Hello world");
Hellw world
undefined
```

console.log自体はreturn valueが無いのでundefinedメッセージが出る。

#まとめ

インストールというとソースをコンパイル、もしくはバイナリを取得して所定のフォルダ(/usr/bin等）にsu権限で格納するイメージがあるが、node.jsはスクリプトなのでそこまでの手続きは要らないようだ。

まだ使い始めたばかりなので誤認等あったらごめんなさい。
楽天APIのWSDLが読み込めない

PHPで楽天APIを利用するときにWSDLを読み込むのですが
「SoapFault: SOAP-ERROR: Parsing WSDL」
とかいうエラーが出てしまう場合。

```lang:php.ini
;extension=php_openssl.dll
```
のコメントアウトを外すだけで解決。
deprecatedになった　[NSDateComponents week]の置き換えについて


メソッドは警告してくれるので、

		[NSDateComponents week]
は

		[NSDateComponents weekOfYear]
などに置き換えるだろうが、近くにある *NSWeekCalendarUnit* を **NSWeekOfYearCalendarUnit** に変更するのを忘れないこと。
※NSWeekCalendarUnitは定数だから、警告してくれないっぽい。




まとめると

【うまく動かない】

	NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit | NSMonthCalendarUnit |NSWeekCalendarUnit | NSYearCalendarUnit fromDate:dateNow];
	[NSDateComponents weekOfYear];


【動く】

	NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit | NSMonthCalendarUnit |NSWeekOfYearCalendarUnit | NSYearCalendarUnit fromDate:aDateNow];
	[NSDateComponents weekOfYear];
Choreonoid講習会用の開発環境構築

# RTMiddleware + Choreonoid
産総研で作られている物理演算＋可視化ソフト？のChoreonoid．
[IREX2015で開催の講習会](http://www.openrtm.org/openrtm/ja/content/openrtm-users-03237-%E5%9B%BD%E9%9A%9B%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E5%B1%95choreonoid%E8%AC%9B%E7%BF%92%E4%BC%9A%EF%BC%882015%E5%B9%B412%E6%9C%885%E6%97%A5%E9%96%8B%E5%82%AC%EF%BC%89%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B)参加のために環境を構築したのでメモ．


## 使用する環境
Macbook Air 2011
Ubuntu 14.04 64bit版

## 関連ソフトのインストール
Choreonoidやこれを動かす際に便利なソフトたちをインストールする．

```
$ sudo add-apt-repository ppa:hrg/dairy
$ sudo apt-get update
$ sudo apt-get install choreonoid libcnoid-dev openrtm-aist
openrtm-aist-dev doxygen hrpsys-base libav-tools
```

## Python版のサンプルをインストール
Pythonを使って開発もしたいので，できればサンプルがほしい．
あと，次に行うOpenRTPを公式のドキュメント通りに入れるには/usr/share/openrtm-1.1というディレクトリが必要で，これはサンプルをインストールした時に作られるので入れておく．

```
$ sudo apt-get install openrtm-aist-python-examples
```

## OpenRTPのインストール
OpenRTM-aistを使用して開発をすると思われるため，[OpenRTP](http://www.openrtm.org/openrtm/ja/download/openrtp/openrtp-110-rc5-ja)もインストールする．こちらは対応するサイトでダウンロードしてきてリンクを貼るだけ．

Javaが必要なので，一応入っているか確認も兼ねてインストール．

```
$ sudo apt-get install openjdk-7-jdk
```
その後，ダウンロードしてリンクを貼る．
wgetする際には[自分の環境にあったものを選択](http://www.openrtm.org/openrtm/ja/download/openrtp/openrtp-110-rc5-ja)するように気をつける！

```
 $ cd /usr/share/openrtm-1.1
 $ sudo wget http://openrtm.org/pub/openrtp/packages/1.1.0.rc5v20150317/eclipse381-openrtp110rc5v20150317-ja-linux-gtk-x86_64.tar.gz
 $ sudo tar xvzf eclipse381-openrtp110rc5v20150317-ja-linux-gtk-x86_64.tar.gz
 $ cd /usr/bin
 $ sudo ln -s /usr/share/openrtm-1.1/eclipse/openrtp .
 $ cd 
 $ openrtp
```

※環境に合っていないもの（今回の場合32bit版）を実行しようとすると No such file or directoryと言われてデバッグに困ります．

とりあえず以上で準備は完了．
Choreonoid, OpenRTM-aist，OpenRTPが使える環境が整ったはずです．
CentOS6にMongoDB 3.2をyumで

[公式ドキュメント](https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/)がまだ追いついてないのか、RHEL系のyumインストールは3.0系までしか書いてません

```ini
[mongodb-org-3.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1
```

が、実は3.2のリポジトリはすでにあるっぽい
話は簡単で3.0のところを3.2にするだけ

```ini
[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=0
enabled=1
```

yum updateするとちゃんと走ってくれます
私はついでにストレージエンジンをWiredTigerにしました

**ヒャッハー！これで$lookupも使えるZE！**
debian 8 にPromox4.4をインストール

## 参考

* [Install Proxmox VE on Debian Jessie - Proxmox VE](https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Jessie)
* [Proxmox VE 4.3 - Qiita](http://qiita.com/tukiyo3/items/b5e0e00f3a8ffd14f391)


## OSインストール

* http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/


## OSインストール後

```bash:bridge設定に必要
apt install -y sudo ifenslave bridge-utils screen
```

* ifenslave : bonding (bond0) に必要
* bridge-utils : bridge (vmbr0) に必要

### ネットワーク設定

* [Proxmox networking : homelab](https://www.reddit.com/r/homelab/comments/3b7goz/proxmox_networking/)

```rb:/etc/network/interfaces
auto lo
iface lo inet loopback

iface eth0 inet manual

auto vmbr0
iface vmbr0 inet static
    address 192.168.100.70
    netmask 255.255.255.0
    gateway 192.168.100.1
    dns-nameservers 8.8.8.8 8.8.4.4
    bridge_ports eth0
    bridge_stp off
```

```bash:もしeth0がdhcp取得する場合
sudo apt purge wicd wicd-daemon
```

### /etc/hosts (必須！)

```diff:/etc/hosts
- 127.0.1.1	proxmox4.local
+ 192.168.100.70	proxmox4.local
```

### install packages

```bash:rootで実施
echo "deb http://download.proxmox.com/debian jessie pve-no-subscription" > /etc/apt/sources.list.d/pve-enterprise.list
wget -O- "http://download.proxmox.com/debian/key.asc" | apt-key add -
apt update && apt dist-upgrade -y

apt install -y proxmox-ve ntp postfix ksm-control-daemon open-iscsi \
 mdadm logwatch sshfs vim screen tig ntp nfs-kernel-server nfs-common
```

* OS再起動し、https://192.168.100.70:8006 にアクセスし応答があることを確認。

----

## ntp client

```
apt install -y ntp
```

```diff:/etc/ntp.conf
- server 0.debian.pool.ntp.org iburst
- server 1.debian.pool.ntp.org iburst
- server 2.debian.pool.ntp.org iburst
- server 3.debian.pool.ntp.org iburst
+ server ntp1.jst.mfeed.ad.jp
+ server ntp2.jst.mfeed.ad.jp
+ server ntp3.jst.mfeed.ad.jp
```

```
systemctl restart ntp
systemctl enable ntp
ntpq -p
```

## 追加パッケージ(自分用)

```bash:
sudo apt install -y vim-gtk screen git
sudo apt remove -y uim uim-anthy anthy
sudo apt install -y fcitx-mozc
```

## 自動ログイン(lightdm)

```diff:/etc/lightdm/lightdm.conf
  [SeatDefaults]
+ autologin-user=user1
```

----

## 再インストール

```
apt purge -y \
  proxmox-ve ksm-control-daemon open-iscsi  pve-firewall qemu-server pve-ha-manager pve-manager pve-container
```

* /boot/pve/が無いと言われたら`mkdir /boot/pve`して再度実施


```
echo "deb http://download.proxmox.com/debian jessie pve-no-subscription" > /etc/apt/sources.list.d/pve-enterprise.list

apt install -y proxmox-ve ntp ssh postfix ksm-control-daemon open-iscsi
```

* `/root/.ssh/authorized_keys`が消える(/etc/pve/priv/authorized_keys)ので注意


----

## lxde

```
apt install -y lxde \
 iceweasel gnome-screenshot xfce4-terminal pinta fcitx-mozc \
 autossh expect rdesktop
```

```
LANG=C xdg-user-dirs-gtk-update
```

```bash:dhcpを抑止
apt purge \
 wicd wicd-daemon
```

```diff:/etc/systemd/logind.conf
- #HandleLidSwitch=suspend
+ HandleLidSwitch=ignore
```

```
sudo systemctl restart systemd-logind
```

## vino

```
apt install -y vino dconf-editor
dconf-editor
/usr/lib/vino/vino-server
```
eZ Publish とは

# eZ Publish

## eZ Publish とは
**eZ Publish** は、ノルウェーに本社を置く eZ Systems 社によって開発されたオープンソースの高機能 CMS である。
開発言語は **PHP** で、5系からフレームワークに **Symfony** が採用された。

商用ライセンスでは、出版、金融、公的機関などでの採用が多い。

#### 最新バージョン
製品版は **eZ Publish 5.4** で、コミュニティ版は **eZ Publish Community Project 2014.11** である。評価版は eZ Platform 15.11 である。

## 主な特徴
コンテンツに対する汎用性が高く、柔軟な構成設計が可能である。
* 多言語コンテンツ管理
* 同一データを複数テンプレートで出力可能
* コンテンツクラス（カスタム投稿タイプ）管理
* フィールドタイプ（カスタムフィールド）管理
* 高度なユーザー権限管理
* 項目単位でのバージョン管理

## システム要件
* Webサーバー
    * Apache 2.2
    * Apache 2.4
    * Nginx 1.4以上
* DB
    * MySQL
    * MariaDB
    * PostgreSQL
* PHP
    * 5.4.4以上
    * 5.5
    * 5.6
* Java ※検索機能に Solr を利用する場合
    * Java JRE 1.7

## 技術概要
### バンドル（エクステンション）
一般にプラグインやモジュールと呼ばれる機能追加は、4系では独自フレームワークの eZ Components により**エクステンション**として作成され、インストールに関しては手動のみとなる。
5系では Symfony の採用によりエクステンションに相当するものは**バンドル**として作成される。5系では4系以前のレガシースタックのエクステンションも利用可能。
6系以降は Symfony のバンドルのみとなる。
### テンプレート
4系のテンプレートは Smarty ライクな独自のテンプレートエンジンが使われていた。拡張子は **.tpl** である。エクステンションの一部として作成する。
5系以降は Symfony が採用された影響でテンプレートエンジンは **Twig** が利用可能になったが、5系ではレガシー・スタックが利用可能なため、セットアップ次第では eZ Ttemplate もそのまま利用可能。6系以降はレガシー・スタックが廃止されるので Twig のみとなる。拡張子は **.twig** である。バンドルの一部として作成する。
### データ構造設計
コンテンツクラス（カスタム投稿タイプ）とフィールドタイプ（カスタムフィールド）は標準の管理画面で追加、編集できる。設計登録されたコンテンツクラスやフィールドタイプはデータベースに保持される。

## eZ Systems AS
eZ Systems社はファスタッド兄弟によってノルウェー王国で1999年に創業された。
#### 概要
* 社員80人
* オフィス所在地
  * ドイツ・ケルン
  * ポーランド・カトビス
  * ポルトガル・リスボン
  * フランス・パリ
  * フランス・リヨン
  * アメリカ・ニューヨーク
  * ノルウェー・オスロ
  * ノルウェー・シーエン
  * 日本・東京
* 450,00人を超えるコミュニティーメンバー
* 250万サイトのインストール
* 500社以上の企業ユーザー
* 200社以上のパートナー
* 500万回の累計ダウンロード
* 160カ国のユーザー
* 米国ブルックリンで設計、ヨーロッパでエンジニアリング

## リンク
1. [eZ Publish とは](http://qiita.com/bezeklik/items/d1cdc65d57e14e0a18d2)
2. [eZ Publish の特徴](http://qiita.com/bezeklik/items/e168f99064a9233353ec)
3. [eZ Publish と他の CMS との比較](http://qiita.com/bezeklik/items/7c07df73fa6f0ddf1203)
4. [eZ Publish のバージョンによる違い](http://qiita.com/bezeklik/items/3c98ae4764199931da86)
Route 53 で設定した DNS レコードをエクスポートする


[稼働率100%](https://aws.amazon.com/jp/route53/sla/) とはいえ、バックアップとっておかないと、オペミス含めてレコード消えたりした際にひじょーにマズい.

# 手順

[barnybug/cli53](https://github.com/barnybug/cli53) なる、CLI で Route 53 を操作するツールを発見したので、これを使う.

## 事前準備

バックアップ目的なので、副作用生まないように Route 53 の Readonly アカウント作って、ACCESS KEY ID と SECRET ACCESS KEY を取得しておく. 適当な profile 名をつけて `~/.aws/credentials` に指定.

```(~/.aws/credentials)
[cli53]
aws_access_key_id = <ACCESS KEY ID>
aws_secret_access_key = <SECRET ACCESS KEY>
```

## エクスポート

以下のようにすれば、BIND フォーマットでのゾーンファイルが取得できる.

```
$ cli53 export example.com --profile=cli53 > example.com.zone
```

# 別解

* [winebarrel/roadworker](https://github.com/winebarrel/roadworker) を使う

# 参考

* [Amazon Route 53 ドキュメント | アマゾン ウェブ サービス（AWS 日本語）](http://aws.amazon.com/jp/documentation/route53/)
chromeで「このウェブページの表示中に問題が発生しました。不要なアプリやタブを閉じると、使用できるメモリが増える可能性があります」が出た時の対処

■入力フォームがあるページで発生した時の対処

設定 > 閲覧履歴データの消去で「自動入力フォームのデータ」にチェックを入れて閲覧履歴データの削除を実行すると見れるようになりました。
AWS EC2 で取得しているグローバルIP(Elastic IP)を CLI で一覧する


# 手順

aws-cli と jq を使えば、以下のように改行区切りで取得できる.

```
$ aws ec2 describe-addresses | jq '.[] | .[] | .PublicIp' | sed 's/\"//g'
xxx.xxx.xxx.xxx
yyy.yyy.yyy.yyy
zzz.zzz.zzz.zzz
```

## 別解

コメント欄で教えてもらった以下の方法だと、 jq を使わないでもいける.

```
$ aws ec2 describe-addresses --query '*[].PublicIp' --output text | tr '\t' '\n'
```


# 参考

* [describe-addresses — AWS CLI 1.9.9 Command Reference](http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-addresses.html)
* [jq Manual (development version)](https://stedolan.github.io/jq/manual/)
OpenCVでアルファマスキング

画像をある形状で切り抜きたいときなどにアルファマスキングと呼ばれる手法が使われます。OpenCVのmixChannelsを使ってこれを実現するためのメモです。

```
// 入力画像（3チャンネル）
cv::Mat src = cv::imread("input.jpg");

// マスク画像（グレースケール）
cv::Mat mask(300, 300, CV_8UC1);

// マスク領域を作成
cv::Point points[] = {
    cv::Point(10, 100),
    cv::Point(150, 20),
    cv::Point(240, 200),
    cv::Point(30, 280)
};
cv::fillConvexPoly(mask, points, 4, cv::Scalar(255), CV_AA);

// 出力画像（※先に領域の確保が必要）
cv::Mat dat(300, 300, CV_8UC4);

// 入力する画像の配列
cv::Mat srcArray[] = { cvSrc, mask };
// チャンネルの変換方法の指定
int from_to[] = { 0,0, 1,1, 2,2, 3,3 };
cv::mixChannels(srcArray, 2, &dst, 1, from_to, 4);
```

![Screen Shot 2015-11-30 at 09.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/54852/8c28da66-0f08-ce74-26e0-11e6ff146fcc.png)

ふつうにcv::copyToなどでマスクを指定すると、マスク画像の黒でない領域を単純にコピーしてしまうのでジャギーが残ってしまうのですが、この方法でやればアンチエイリアスも保持されてきれいな画像になります。
あるある勉強会でオフショア開発の奮闘記で登壇をした話


# 概要

会場: 株式会社ドリコムさま Office
http://www.drecom.co.jp/
【タイムテーブル】
受付開始　18:30
本編　　　19:00 - 20:30
懇親会　　20:30 - 22:00


# 主な内容
ITベンチャー界隈の技術者の交流会として、
テクニカルな課題に向き合うときのあるあるをテーマに技術交換を行う。
全体で10人以上がLTを行い、「あるあるー！！」と声を上げてしまうようなLTがあり、
マニアック過ぎて、「ないないー！！」と声を上げてしまうようなLTもありました。

# 登壇内容

### テーマ: アウトソーシング嫌いのベンチャーが2ヶ月でオフショア開発でサービスをローンチしてみた ~開発リーダー編~

発表の内容は、
###「会社からのむちゃぶり、あるあるー！！」
というテーマで少し内容を変えて発表をしておりました。


開発リーダ編としているので、CTO編もあります。(公開まで今しばらくお待ちを！)

当日は、時間短縮(5分)の内容でLTをさせていただいておりましたので、
slideshareに全編(15分)の内容を公開を致しました。



[![slide.png](https://qiita-image-store.s3.amazonaws.com/0/30490/d01bc67f-3c32-97f4-5c13-7c264da02be5.png "slide.png")](http://www.slideshare.net/KazukiTakahashi/2pl)

http://www.slideshare.net/KazukiTakahashi/2pl


## ちなみに作ったサービスはこれ



[コンバージョン率自動アップサービス ヒキアゲール](https://info.conversion-up.net/pr/)



# あとがき

会場も段取りもご手配頂いた、ドリコムさまにこの場を借りてお礼申し上げます。


# 追記

2015年12月3日 CTO編が公開されたようです。
[アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた ~PJマネジメント編~](http://qiita.com/devopsCoordinator/items/045423010da495dc19de)
Githubでリモートブランチを削除しないようにする


* Githubでdevelop -> masterへのマージをPullRequestでやろうとして、マージ後にうっかり削除してしまった場合があるので、その防止
  * PullRequestマージ後にブランチ削除ボタン(Delete branch)が出るので、featureブランチを削除するときと同じクセでつい消してしまうことがある
![20151130_082312.jpg](https://qiita-image-store.s3.amazonaws.com/0/10862/5c5e34a9-20f0-fec5-f775-45e5831ecbb6.jpeg)
     * 消しても、「Restore branch」ボタンがあるのですぐ戻せるけど。。。

## 手順(例：developを削除しないようにする）
1 リポジトリの「Settings」を選択
2 「Branches」を選択し、「Protected branches」の「Choose a branch」コンボボックスから、削除させたくないブランチ（ここではdevelop)を選択
![20151130_083352.jpg](https://qiita-image-store.s3.amazonaws.com/0/10862/fed1f62a-bf68-74e2-2f98-d16a37289b42.jpeg)
3 「Protected this branch」にチェックを入れて、「Save changes」ボタンを押下する
![20151130_082341.jpg](https://qiita-image-store.s3.amazonaws.com/0/10862/5562e520-c182-04b3-7cda-59e4b5d514a3.jpeg)
4 「Protected branches」にdevelopブランチが入った
![20151130_082351.jpg](https://qiita-image-store.s3.amazonaws.com/0/10862/29a94d31-c156-1d7e-98f9-51c7483e0b94.jpeg)
5 この状態でPullRequestして、develop -> masterへのマージをすると、マージ後にブランチ削除のボタンが出ない
![20151130_082302.jpg](https://qiita-image-store.s3.amazonaws.com/0/10862/2611ab8b-d2e8-0959-ad74-672784d18ce6.jpeg)

* ちなみにgitコマンドでも削除できない

```
git push --delete origin develop

remote: error: GH006: Protected branch update failed for refs/heads/develop.
remote: error: Cannot delete a protected branch
To git@github.com:xxx/hoge.git
 ! [remote rejected] develop (protected branch hook declined)
error: failed to push some refs to 'git@github.com:xxx/hoge.git'
```
python > fileIO > ファイルへの追記 > with open("Log/151130.txt", "a") as logfd: / logfd.write("test\r\n")

```txt:動作環境
CentOS 6.5
```

ファイルへ追記を行いたい。以下を参考にした。

参考 [SO](http://stackoverflow.com/questions/4706499/how-do-you-append-to-a-file-in-python)


```151130a.py
import os.path
import time

if os.path.isdir("Log") == False:
	os.mkdir("Log")

for loop in range(0,3):
	with open("Log/151130.txt", "a") as logfd:
		logfd.write("test\r\n")
	print loop
	time.sleep(5)
```

実行すると、Log/以下に151130.txtができ、その内容は以下となっている。

```Log/151130.txt
test
test
test
```
技術英語 > They [don't] appear to have a digestive system [of any kind]. / track issues [of any kind]

@ Star Trek Voyager > ELOGIUM

新種の生物の調査中Chakotayが

> They <font color=red>don't</font> appear to have a digestive system <font color=red>of any kind</font>.

`not`と`of any kind`の組合せで「どのようなxxxも持っていない」

<hr>

個人的にはSNS(twitter, mixi, facebook, line...)を一切やらない。

I do not use SNS <font color=red>of any kind</font>.

SNSはSNSsだろうか？
こうして見ると、上の例文も"a digestive system"と単数形となっている。
否定形の時に単数形になるのだろうか？ 未消化。

QiitaもSNSの１つと言われれば、唯一のSNS利用になる。

<hr>

githubのコメントでよく見るのは、否定ではなく肯定の方

https://github.com/dannymcc/Support-System
> Simple Rails app to track issues <font color=red>of any kind</font>.
TRAMP経由かどうか判定する

使ってるパッケージにバグがあって、TRAMP経由で開いてるファイルでは動かなくしたいってことがある。

そんなときは、こんな補助函数を定義する。

```init.el
(defun my/buffer-in-tramp ()
  "Return non-nil if buffer file is in TRAMP."
  (and buffer-file-name
       (s-match
        (concat "\\`/" (regexp-opt (mapcar 'car tramp-methods)) ":")
        buffer-file-name)))
```

で、こうする。

```init.el
(defun my/php-mode-hook ()
  (when (require 'php-eldoc nil t)
    (php-eldoc-enable))
  (subword-mode t)
  (setq show-trailing-whitespace t)
  (c-set-style "psr2")

  (unless (my/buffer-in-tramp)
    ;; TRAMPでは実行したくない処理をここに書く
    ...))
```

めでたしめでたし。


*(http://qiita.com/tadsan に書いた通り、記事中の短いソースコードの著作権は主張しません)*
ReactNatvieのflexboxの親要素の高さが子要素によって決まる場合にレイアウトがおかしくなるバグ

ReactNative (0.15.0) でflexboxのheightが子要素のサイズによって決定される場合に、正しいレイアウトを行えなくなるバグがあるようです。

 * [[Layout] Vertical centering fails when container has absolute positioning and no explicit height](https://github.com/facebook/react-native/issues/1234)
 * [Children items are not vertically aligned properly when the height of the parent is undefined](https://github.com/facebook/css-layout/issues/83)

heightに具体的な数値を指定すればこの問題は起きないのですが、それでは自前で寸法を測定しなければならず、flexboxの旨味が喪失してしまいます。

問題は`css-layout`の中にあるようで、一応修正するパッチが出ていていますがまだ取り込まれていません。

* [[Issue facebook/css-layout#127]: content re-layout of stretched items](https://github.com/facebook/css-layout/pull/145)

手元の環境のReactNativeにこのパッチを取り込むには、`css-layout`をcloneしてきて、上記patchを適用し、

```shell-session
npm install
grunt --force
```

すると `src/Layout.c`や`src/LayoutEngine.java` が更新されるので、これを

* `node_modules/react-native/React/Layout/Layout.c`
* `node_modules/react-native/ReactAndroid/src/main/java/com/facebook/csslayout/LayoutEngine.java`

にコピーしてアプリをbuildすればok。

本体にも早晩取り込まれると思いますが、とりあえず応急処置に。
Promiseにはクロージャで値を渡せばよかった

# 追記
例が悪かったので，修正．
fugafugaがグローバル変数になってた

# こんな感じのことがしたい

```js
function hogePromise() {
  return new Promise(function(resolve, reject) {
    var hogehoge = "hogehoge";
    resolve(hogehoge);
 });
}
function hogeResolve(hogehoge) {
  console.log(hogehoge);
  //ここでfugafugaを表示したい
}

function hogefugaPrinter() {
  var fugafuga = "fugafuga"; 
  hogePromise().then(hogeResolve);
}

hogefugaPrinter();
```

# パッと思いついたこと
jsの仕様詳しく知らないけど，
Haskellみたいに勝手にカリー化してくれんじゃないのかな．

```js
function hogePromise() {
  return new Promise(function(resolve, reject) {
    var hogehoge = "hogehoge";
    resolve(hogehoge);
 });
}
function hogeResolve(fugafuga, hogehoge) {
  console.log(hogehoge);
  console.log(fugafuga);
}

function hogefugaPrinter() {
  var fugafuga = "fugafuga";
  hogePromise().then(hogeResolve(fugafuga));
}

hogefugaPrinter();
```

## 結果

fugafugaは表示されたけど，
hogehogeは未定義になってしまった．残念．

```js:出力
undefined
fugafuga
```

# 解決策

**クロージャを使う**

```js
function hogePromise() {
  return new Promise(function(resolve, reject) {
    var hogehoge = "hogehoge";
    resolve(hogehoge);
 });
}
function hogeResolve(fugafuga) {
    return function(hogehoge) {
        console.log(hogehoge);
        console.log(fugafuga);
    }
}

function hogefugaPrinter() {
  var fugafuga = "fugafuga";
  hogePromise().then(hogeResolve(fugafuga));
}

hogefugaPrinter();
```

## 結果

```js:出力
hogehoge
fugafuga
```

できた


#雑感
二時間ぐらいここで悩んだ……

Promiseがいいといろんな記事が紹介してるけど，
ここら辺のことはあんまり書いてなかった（自分の見た限りでは）
と思ったので，記事にしました．

js最近少しずつ書けるようになってきたので，
ようやく面白みがわかってきた感じです．
Androidの実機試験をするときのチェック項目

Androidアプリの実機試験を行う際に気をつけている事に関するメモです。
試験端末の選び方を示した「試験端末の選び方編」と、実際のテスト方法に関する「実機試験編」に分けて記述します。

この記事は「実機試験編」となります。

# 基本的な考え方

単体試験はすでにした、あるいはテストコード書いているということを前提に、実機でしかできない点を中心に触っていきます。

ここではソフトウェア工学などの小難しい理論ではなく、もっと取り組みやすいテスト方法について述べていきます。
わりとモンキーテストに近い部分がありますが、これは開発者が普段やらない操作をして思わぬ不具合を見つけるのが目的です。

# テスト方法について 

## ネットワーク関連の試験

ネットワークに接続するアプリの場合、ネットワーク状況が良くない場合(通信エラー等)の状況を考えて試験します。
開発時に通信エラーの場合にエラーダイアログを表示する、キャッシュを利用するなどのエラー処理のポリシーを開発時に決めておくと、テストの際に確認する項目がはっきりしやすくなります。

会社や家の中で開発していると快適なwifiだったりするのでわりと気が付きにくいのですが、外で使う場合は回線が混んでて通信速度が遅かったり、地下で電波が入らないケースもあり、そういった場合にアプリが思わぬ不具合を起こす場合があります。
また、ネットワークがつながらない時に何も表示されない、先に進まない、延々と待たされるというのはユーザーにとって不親切だと思います。

お手軽ですがよくやるのが、機内モードにしてアプリを動作した場合に適切な処理がなされているかというテストです。
しかし、実際はこれだけでは不十分で、timeoutも考慮に入れた試験をします。
例えば、サーバーからの応答がなくてタイムアウトとなった場合(connect timeout)、サーバーに接続できたけれども負荷が高いなどでレスポンスが帰ってこない場合にタイムアウトになった場合(read timeout)などです。

具体的にはread timeoutの時はサーバーにsleepを入れたり、間にプロキシ的なものを介してコントロールします。

iPhoneのデベロッパーメニュ－はよくできていて、OSレベルで通信速度を遅くできるのですが、Androidにはそういう機能はないんでしょうかね。
違和感ありますが、Androidから通信速度を遅くしたiPhoneにテザリングして接続すると割と楽です。。

## ボタン連打

onClickイベントが設定されたボタンを何度も連打した時に通信が何度も走らないとか、フラグが変わって整合性が取れなくなってしまわないかなどを確認します。

## バックキーの処理

各画面でバックキーを押した場合の動作を確認します。
だいたい画面が１つ戻ったり、ダイアログが閉じたりなどするはずですが、それぞれについて期待した動きとなっていることを確認します。

iOSにはバックキーという概念がないのですが、Androidにはあるので、両方のプラットホームで開発する場合もバックキーに関する動作を決めておく必要があると思います。

## アクティビティを保持しない

Androidの開発者オプションの「アクティビティを保持しない」オプションを利用することで、メモリが逼迫してアクティビティが破棄された場合の動作を確認できます。
アクティビティにstaticな変数を書いてほかのアクティビティから参照するような怪しいコードは、アクティビティの破棄や再生成を考慮していないので、おかしくなります。
また、onSavedInstanceが予想通り機能しているかのチェックにも利用ができます。

バックグラウンドプロセスの上限と合わせて調査に使います。

## 画面を電源ボタンでON/OFFしまくる

少し過激かもしれませんが、アプリ起動中に電源ボタンをひたすらON/OFFして動作を確認します。
イベント処理が適切で無い時や、onResumeで重たい処理を行っていると思わぬ不具合が起きる時があります。

## エミュレータやroot化した端末で/data/data/[パッケージ名]/以下を覗く

Androidの開発者であれば /data/data/[パッケージ名]/ を覗いてみましょう。
一部メーカーの機種では
```adb shell```
で接続した後に
```run-as [パッケージ名]```
でデバッグ中のアプリに限り、Emulatorやroot端末でなくともファイルを見ることもできます。

adb shellで入っても使えるコマンドは限られているので、adb pullでファイルを引っこ抜いてくるか、catコマンドでファイルの中身を参照します。

確認するチェックポイントとしては、SharedPreferencesのパーミッションです。
デフォルトはMODE_PRIVATEという自分のアプリからしか読み込めないのですが、MODE_WORLD_READABLEなどにしていると他のアプリから読み取れてしまいます。

また、実際のファイルをcatコマンドなどで開くことによって、不要なキーや設定値が保存されていないか、見られたり書き換えられてこまるような値は保存されていないかを確認します。

SQLiteファイルも同様にadb pullでファイルを持ってきて、SQLiteコマンドで参照するか、エミュレータならsqlite3コマンドで表示可能、改変可能ですが、実機テストのチェック項目というテーマからズレてきたので、方法についてはここでは割愛します。
きょうは何の日～ データセンターの日


# はじめに
今日12月1日は、世の中的に[いろんな記念日](http://www.nnh.to/12/01.html)になってますが、IDCフロンティアでは「 :sparkles: データセンターの日 :sparkles: 」と定めて、データセンターしばりなイベントを色々やってます。

ということで、今日はそれにちなんで「勝手に選んだデータセンターあるある10選」を選んでみました。

# （勝手に選んだ）データセンターあるある10選

1. 「センターいってきまーす」は、直行直帰で自己メンテナンスの合図

1. 女性の受付は列ができていて、男性の警備員さんの受付の方はガラすきな光景をたまに見る

1. サーバルームで作業中、気付かれずに照明を全部消されてしまっても、LEDの光を頼りにけっこう出入口までたどり着ける

1. 作業中、寒くなると排気側で暖をとる
（今どきは冷気がラックから逃げない仕組みが整ってきた）

1. ラックマウントで指ケガ。バンソウコウも数枚忘れずに

1. LANケーブルは意外と頑丈なので1Uスイッチくらいなら2，3台縛って持ち運べる

1. ブレードサーバー設置の時は、なぜか毎回必ず呼ばれている

1. 障害中のwebサービスがあると、とりあえずAS番号を調べる

1. 今どきのTop of Rackスイッチは、集約率がすさまじすぎて、ケーブリングに匠の技が必要になる

1. うっかり床板落としたら断線

# 最後に

インフラエンジニア忘年会のネタにでもしてください。
きっと年末年始もこの人たちが寝ないで監視してくれるはず。皆さんメリークリスマス！
  ※某G社データセンターツアーより
![googledc_01.png](https://qiita-image-store.s3.amazonaws.com/0/95161/f6584e8b-a0ea-dfb5-3fbc-b8ff34e0927a.png)
ConoHaオブジェクトストレージをownCloudにマウントするメモ

後学のためにメモとして残しておきます。

ConoHa API Documentationのトークン発行のところを眺めててやっと回答に辿りついた。
(参考) https://www.conoha.jp/docs/identity-post_tokens.html
***
- ownCloud側で予め「アプリ」の「 External storage support 」を有効にしておく
- 「管理」の「外部ストレージ」の各項目を下記の要領で埋めていく
***

    - フォルダー名：適当に付けておく
    - 外部ストレージ：「ストレージを追加」の中から「OpenStack ObjectStorage」を選択
    - ユーザー名：APIのユーザ名(gncuで始まるやつ)
    - バケット名：予めオブジェクトストレージ内に作成しておいたコンテナ名
     - ※Owncloud上でコンテナは作れないのでCyberduckとかで事前に作っておくこと
    - リージョン：tyo1
    - APIキー：空白
    - テナント名：APIのテナント名(gnctで始まるやつ)
    - パスワード：APIのパスワード
    - サービス名：Object Storage Service
    - 識別用エンドポイント：https://identity.tyo1.conoha.io/v2.0
    - HTTP接続タイムアウト：空白
***
ConoHaオブジェクトストレージをCyberduckにマウントするメモ

Cyberduckのブックマーク設定メモ。

    種類：Swift(Openstack Object Storage)
    ニックネーム：適当につける
    サーバ：identity.tyo1.conoha.io
    ポート：443
    ユーザ名：「テナント名:ユーザ名」のように並べて入力(gnct********:gncu********)
    パス：/v2.0
自分用技術系RSSのまとめ

# 説明

主に自分用で、まだ作成途中ですが、
技術系サイトのRSSをまとめていきたいと思います。


# 使っているプラグイン

RSS Feeds Reader Plugin for jQuery 1.20
http://qiita.com/selious/items/c82e3deac0bd838795b5


## 公開先

https://jsfiddle.net/selious17/z6hkvx3s/40/

# 全画面用
https://jsfiddle.net/selious17/z6hkvx3s/40/embedded/result/
Swiftでcocoapodsの導入や、導入してあるプロジェクトのリンク復旧的な作業

プログラミング初心者の私ですが、書いていきます。


（１）GitHubでダウンしたコードがエラーで実行できない、原因はCocoapodらしい
GitHubでとてもリスペクトしているアプリ
（Wantedlyのコード
https://github.com/wantedly/swift-rss-sample）

のコードが公開されていたので、勉強のためにダウンロードして開いてみましたが、よくわからないエラーメッセージがたくさん出たので、とりあえずググっていたらココアポッド？ココア？CocoaPodsというが関係しているらしい、とわかった

（２）簡単にインストールできないらしい
インストールしようと思ったら、ターミナル？とかいうDOSみたいな難しいやつ使わないとできないらしい

（３）わかりやすいブログ記事を発見するのに３時間
https://nekosoftware.wordpress.com/category/ios/cocoapods/

３時間格闘した結果、こちらの方のブログが一番わかりやすかったです。
詳しくはそちらを見ていただきたいのですが、特につまづいた点を少しメモすると

・前提としてXcode Line ToolsとかなんとかっていうやつをAppleの公式からダウンする必要があります
・ダウンロードしてきたプロジェクトファイルにはもともとPodfileというものが存在しています（なのでそれを入れる所から始めて全行程作業する必要はない）
・ただし、それらの再リンク処理的なことが必要なようです。ターミナルで少し頑張って打ち込む必要があります。
（ターミナル初心者にとって、”ファイルの場所まで移動する”とかいうのが超むずいです。$ cd パスの名前、って打つと、移動できる...んですね）

（４）podfileのリストも添付してあるので、ターミナルでの作業は展開してインストールするだけ
結局重要なpodfileというものははすでに組み込み済みので、それらを展開してインストールする的な作業とアップデートが必要みたいですね
イラレのリンク貼り忘れみたい感じですね

※あまりにあやふやな文体ですいません、筆者は情報系出身ではないためこういった言い回しや説明が仕様となっています

（５）開く時は、projectname.xcworkspaceから開く
ファインダーからこちらのファイルをクリックして始めないといけないみたいです
なんか細かいっすね

（６）breakpointをエラー指摘される
breakpointがいまいちよくわかっていないのですが、右クリックでdeleteさせていただきました

（７）これで開けました。
WiiリモコンでKeynoteを操作するHack


プレゼンのスライド操作を、Wiiリモコンで行う方法です。
動作環境は以下の通りです。

|項目|内容|
|-----------|------------|
|OS|MacOS X EI Capitan|
|プレゼンテーションソフト|Keynote バージョン 6.6.1|
|Wiiリモコン連携ソフト|DarwiinRemoteOSC Version 0.6|


## DarwiinRemoteOSCのダウンロード

http://www.bricklife.com/weblog/000714.html から、DarwiinRemote0.5_keymod.dmgをダウンロードしてインストールする。


## DarwiinRemoteOSCの設定


![preference.png](https://qiita-image-store.s3.amazonaws.com/0/11476/20728886-b5bd-a8b3-bd2f-826050395f51.png "preference.png")


## MacとWiiリモコンの接続

1. MacのBluetoothをONにする。
1. Wiiリモコンの電池ボックス付近にあるSYNC.ボタンを押す。
1. [Find Wiimote]をクリック。

![WiiRemote_Event_Log.png](https://qiita-image-store.s3.amazonaws.com/0/11476/90fead12-8677-393c-bcc6-9772db499ee4.png "WiiRemote_Event_Log.png")
MacでDockの出てくる速度を変える

Macの画面を広く使うためにDockが自動的に隠れるようにしているけど、カーソルを合わせてから出てくるまでがなんか遅い。

この時間を変えるには、

```bash:shell
defaults write com.apple.dock autohide-delay -float [出てくるまでの時間] && killall Dock
```

0にすると一瞬で出てくるようになって満足。


アニメーションの時間も、  

```bash:shell
defaults write com.apple.dock autohide-time-modifier -float [アニメーションの時間] && killall Dock
```

とすると変えられるけど、これはデフォルトが一番しっくりきた。
1.0がデフォルトっぽくて、0.5だとちょっと焦ってる感じ。


元の設定に戻すには、  

```bash:shell
defaults delete com.apple.dock autohide-delay;killall Dock
defaults delete com.apple.dock autohide-time-modifier;killall Dock
```

とすれば良い。
公開リポジトリにプロジェクトファイルをコミットする場合に気をつけたいこと（例：Xcode）

+ 自分用メモになります

# 概要

個人で実装したソースを（例えばGithubなど）に公開したい。個人アカウント情報が含まれるXcodeなどのプロジェクトファイルをコミットする際には情報の取り扱いには十分に気を付けたい。Xcodeを例にとって設定方法をまとめてみた。

# 前提

+ Xcode
+ パブリックな公開リポジトリに実装ソースを公開する

# 注意点

下記設定などが漏れると個人アカウント情報がリポジトリ上に公開されてしまうため、アカウント情報が晒されてしまい危険である。セキュリティの観点からすると望ましくない。

# 設定内容の確認

+ Bundle Identifer：空欄にする
+ Version：空欄が望ましい
+ Build：空欄が望ましい
+ Team：Noneに設定する
+ finderから、{projectFile}.xcodeproj > xcuserdata　←これを削除しておく

以下はprojectファイルの設定例

![print.png](https://qiita-image-store.s3.amazonaws.com/0/90301/93bb9541-60f4-ad81-a4a1-47650a8ff8f4.png)

# 補足

公開リポジトリに限らず、受託業務などでプロジェクト内でソースを共有しながら開発する手法をとっている場合は、納品するときに不要な情報を削除する、ということも必要になってくる。ソース管理は品質にも関わってくるため、配慮が必要。
Ethereumまとめメモ②


Contract info (metadata)

参考
https://github.com/ethereum/go-ethereum/wiki/Contracts-and-Transactions

```
source = "contract test {
   /// @notice Will multiply `a` by 7.
   function multiply(uint a) returns(uint d) {
       return a * 7;
   }
}"
contract = eth.compile.solidity(source).test
MyContract = eth.contract(contract.info.abiDefinition)
contenthash = admin.saveInfo(contract.info, "~/dapps/shared/contracts/test/info.json")
MyContract.new({from: primary, data: contract.code}, function(error, contract){
  if(!error && contract.address) {
    admin.register(primary, contract.address, contenthash)
    // put it up on your favourite oldworld site:
    admin.registerUrl(contentHash, "http://dapphub.com/test/info.json")
  }
});
```


* contentHash
デプロイしたContractの情報(mete data)を含むinfo.jsonファイルのハッシュ値。
　これを登録する(admin.reister)

* contentUrlを登録する
 - Urlは他の人が見れるサイト。info.jsonをアップロードしておく。
 - admin.registerUrlでそのUrlを登録する

疑問

* なぜわざわざ情報を登録するのか？jsonをアップロードとかめんどくさいしdecentralizedと言えない。ブロックチェーンで完結しないのか？

参考サイト（上記）にこのような文言があった。

```
Note that if we use content addressed storage system like swarm the second step is unnecessary, since the contenthash is (deterministically translates to) the unique address of the content itself.
```

つまり、Swarmなどの分散データベースが実装されれば、contractにきちんと一意性のあるcontentHash値が得られるようになるが、いまはまだ実装できていないので、それまでは一意性が保てない。なので、どこかにmeta dataをアップロードしておかないと、そのcontractが信頼できるかわからない。metadataからハッシュ計算でcontentHashが得られるので、それと一致すれば良い。
　なのでcontentUrlは単にファイルが見れる場所であればどこでもよい（はず）


##Create and deploy GlobalRegistrar, HashReg and UrlHint
きちんとデプロイするための方法が書いてある？（未読）

####admin.setGlobalRegistrar();
実装されてないとの書き込みが１０月の段階であったので今使えるか不明。以降の課題。
Ethereumまとめメモ①



Gasについて
参考
https://github.com/ethereum/go-ethereum/wiki/Contracts-and-Transactions

* Gas
contractを動かすために必要な量の単位(etherとは異なる）


* GasPrice
その時々で変化するgas価格
例）
gasprice= 0.001etherの時
10000gasが必要なら
0.001*10000=10etherを送金する必要がある

contractに必要なgasの量は
"web3.eth.estimateGas"
でわかる
（実際に実行はされないが、必要なgas量を算出する関数）

* GasLimit

	- contractのaddressに送信できるGas量の限界値
	- contractの発行者が決めて良い。

GasLimitが必要な理由
　	- contractにバグがありループが発生してしまう場合、それを止められなくなる。しかし、Gasが無くなるまでしかプログラムが動かないという制約を作ることで、無限ループなどでもgasがなくなれば実行が止まってくれる。送れるGasに限界量を設定するのはそのためである。
　	- ちなみに、gasが切れてしまった場合、ブロックチェーン上では、すべての処理はロールバックされ元の状態と変化しないで記録される。

* 結局contractに必要なetherの量は

（必要なgas量） × （その時のgasPrice）

で算出

Contract info (metadata)

参考
https://github.com/ethereum/go-ethereum/wiki/Contracts-and-Transactions

```
source = "contract test {
   /// @notice Will multiply `a` by 7.
   function multiply(uint a) returns(uint d) {
       return a * 7;
   }
}"
contract = eth.compile.solidity(source).test
MyContract = eth.contract(contract.info.abiDefinition)
contenthash = admin.saveInfo(contract.info, "~/dapps/shared/contracts/test/info.json")
MyContract.new({from: primary, data: contract.code}, function(error, contract){
  if(!error && contract.address) {
    admin.register(primary, contract.address, contenthash)
    // put it up on your favourite oldworld site:
    admin.registerUrl(contentHash, "http://dapphub.com/test/info.json")
  }
});
```


* contentHash
デプロイしたContractの情報(mete data)を含むinfo.jsonファイルのハッシュ値。
　これを登録する(admin.reister)

* contentUrlを登録する
 - Urlは他の人が見れるサイト。info.jsonをアップロードしておく。
 - admin.registerUrlでそのUrlを登録する

疑問

* なぜわざわざ情報を登録するのか？jsonをアップロードとかめんどくさいしdecentralizedと言えない。ブロックチェーンで完結しないのか？

参考サイト（上記）にこのような文言があった。

```
Note that if we use content addressed storage system like swarm the second step is unnecessary, since the contenthash is (deterministically translates to) the unique address of the content itself.
```

つまり、Swarmなどの分散データベースが実装されれば、contractにきちんと一意性のあるcontentHash値が得られるようになるが、いまはまだ実装できていないので、それまでは一意性が保てない。なので、どこかにmeta dataをアップロードしておかないと、そのcontractが信頼できるかわからない。metadataからハッシュ計算でcontentHashが得られるので、それと一致すれば良い。
　なのでcontentUrlは単にファイルが見れる場所であればどこでもよい（はず）
stringifyを使ってテンプレートへhtmlファイルをrequireできるようにする


Vue.jsを触っていたときに、componentに指定するtemplateでhtmlファイルを直接requireしたいと感じた。こんなときがbrowserifyの使いどころ（？）だと思ったはなし。

```JavaScript
...

// template: <div>Hello!</div>ではなくて
// 下みたいな感じにファイル名指定でテンプレートをrequireしたい

var components = {
  root: Vue.extend({
    template: require("./main.html")
  }),
  entrance: Vue.extend({
    template: require("./entrance.html")
  })
};

...
```
いろいろ調べたところ、**stringify**というパッケージを使うとコンポーネントのテンプレートへ渡すために文字列化したhtmlをjsファイルにbundleすることができて、結果requireできるようになるらしい。

## Gulpfile

自分のプロジェクトでは下のような感じで`js/`ディレクトリ以下に入っているソースを一旦`application.js`にまとめて`dist/`ディレクトリに放り込んでいる。

```JavaScript:gulpfile.js
var targets = [
  ...

  js: [
    "./js/*.js",
    "./js/**/*.js"
  ],
  
  ...
]

var concatJS = "application.js"
var destDir = "./dest/";
...

gulp.task("concat-js", function() {
  return gulp.src(targets.js)
    .pipe(plumber())
    .pipe(concat(concatJS))
    .pipe(gulp.dest(destDir))
});

...
```
テンプレートエンジンにはjadeを使っているのでもちろんjadeをトランスパイルするタスクもある

```JavaScript:gulpfile.js
var targets = [
  ...
  
  jade: [
    "./jade/*.jade",
    "./jade/**/*.jade",
    "./jade/**/_*.jade"
  ],
  
  ...
]

...

gulp.task("jade", function() {
  return gulp.src(targets.jade)
    .pipe(plumber())
    .pipe(jade({
      pretty: true
    }))
    .pipe(gulp.dest(destDir))
});
```
つまりjadeのタスクが終わるときにはjsのタスクで生成される`application.js`と同じ`dest/`以下にhtmlファイルがjadeファイルと同じ数だけ生成されることになっている。

さて、こういう環境を前提にした上でのbrowserifyのタスクがこちら。

```JavaScript:gulpfile.js
...

var stringify  = require("stringify");
var browserify = require("browserify");
var source     = require("vinyl-source-stream");

...

gulp.task("browserify", function() {
  return browserify({
      entries: [destDir + concatJS]
    })
    .transform(stringify([".html"]))
    .bundle()
    .pipe(source(concatJS))
    .pipe(gulp.dest(destDir))
});
```
stringifyはテキストファイルなどをrequireできるようにしてくれるパッケージで、`.html`以外にも何でもいけるとのこと。ちなみにminifyオプションやらrequireするときの拡張子を省くextensionsオプションやら、stringifyにはいろいろあるらしいのでnpmのページを見に行くとよさそう（https://www.npmjs.com/package/stringify）

ファイルパスの指定はなにが何なのか一瞬混乱したけれど、とりあえずは`entries: [...]`へ指定したファイルにbrowserifyが適用されて`source(...)`へ出て行くみたいな、そんな感じ。（ちなみにentriesにはワイルドカード指定ができなかった）

## まとめ

ここまでやって生成されたapplication.jsを開いてみると、ソースの中にhtmlの中身がstringify（文字列化）されたものが埋め込まれているのがわかる。requireするファイルがソースの中に埋め込まれているってのは若干不思議な気がしたけれど、今回のケースではbrowserifyがgulpのタスクとして予めrequireをパースして処理していると考えれば、requireは実際はただのマークみたいなものだと考えていいのかもしれないと思った。
JavaScript入門(個人メモ)

JavaScript入門
個人メモとなります。

1.はじめてのJavaScript
2.変数
3.数値を使う
4.文字列を使う
5.条件分岐
6.真偽値と三項演算子
7.switch文を使う
8.繰り返し(while)
9.繰り返し(for)
10.alert,confirm,prompt
11.関数
12.ローカル変数
13.即時関数
14.setInterval、setTimeout
15.配列
16.オブジェクト
17.メソッド
18.Stringオブジェクトを使う
19.Arrayオブジェクトを使う
20.Math、Dateオブジェクトを使おう
21.DOM
22.DOMを操作する
23.イベント
Google Tag Manager の命名規則に沿って実装してみた [変数の実装編]

[Google Tag Manager の命名規則を考えてみた [設計編]](http://qiita.com/tokuda109/items/18ff36097ec6eee0460e) の記事で策定した命名規則の実践編として、今回は実際に実装した変数をいくつか紹介します。

### Variable - Domain

###### 種類を選択

定数

###### 値

example.com

### Variable - Page Title

###### 種類を選択

カスタム JavaScript

###### カスタム JavaScript

```js
/**
 * ページタイトルを返す
 *
 * @return {String}
 */
function() {
  return document.title;
}
```

### Variable - User Agent

###### 種類を選択

カスタム JavaScript

###### カスタム JavaScript

```js
/**
 * ユーザーエージェントを返す
 *
 * @return {string}
 */
function() {
  return navigator.userAgent;
}
```

### Variable - Click URL Hostname

###### 種類を選択

自動イベント変数

###### 変数タイプ

要素 URL

###### 要素タイプ

ホスト名

###### 「www.」を削除

真

### Variable - Search Query

設定した検索結果ページのクエリパラメータを取得するために定義しています。(クエリキーはサイトに合わせて修正して下さい)
以下の設定だと `http://example.com/?query=test` でアクセスされた時に値として `test` が入ります。

###### 種類を選択

URL

###### 要素タイプ

クエリ

###### クエリキー

query

### Variable - Social Action - Like

ソーシャルタグを追加する際に指定するアクションの値を定数化したものを用意しました。タグの編集ページで直接入力してもいいですが、定数にすることで、値の一括置換や補完候補に出すことができるようになり、入力間違いもなくなるので、何回も使う値に関しては定数にしています。似たようなものとして、`Variable - Social Action - Fan`, `Variable - Social Action - Tweet` もあります。

###### 種類を選択

定数

###### Configure Variable

Like

### Variable - Social Network - Facebook

ソーシャルタグを追加する際に指定するネットワークの値を定数化したものを用意しました。

###### 種類を選択

定数

###### Configure Variable

Facebook

### GA - Variable - Tracking ID - Production

本番用のトラッキングコードを定義しています。

###### 種類を選択

定数

###### 値

UA-12345678-9

### GA - Variable - Tracking ID - Staging

ステージング環境用のトラッキングコードを `GA - Variable - Tracking ID - Production` と同じ要領で定義しています。

### GA - Variable - Tracking ID - Develop

デベロップ環境用のトラッキングコードを `GA - Variable - Tracking ID - Production` と同じ要領で定義しています。

### GA - Variable - Tracking ID

###### 種類を選択

ルックアップ テーブル

ルックアップ テーブルは入力に対して、マッチしたものを出力として返すので、環境ごとのGAトラッキングコードを自動で設定されるようにしています。
例として、あるタグに設定したトラッキングコードは `example.com` では `GA - Variable - Tracking ID - Production` で定義した値が展開されて設定されて配信されます。

###### 変数を入力

{{Page Hostname}}

###### ルックアップ テーブル

Input               | Output
--------------------|----------------------------------
example.com         | {{GA - Variable - Tracking ID - Production}}
staging.example.com | {{GA - Variable - Tracking ID - Staging}}
develop.example.com | {{GA - Variable - Tracking ID - Develop}}

### GA - Variable - Virtual Page View

SPA等で仮想ページビューを計測する必要がある場合に `dataLayer` に `push` してGTMが受け取るために定義しています。ページングとかでページ遷移が発生せずにページが切り替わる場合以下のようにします。

```
dataLayer.push({
  virtualPageView: '/page/2'
});
```

###### 種類を選択

データレイヤーの変数

###### データレイヤーの変数名

virtualPageView

### GA - Variable - Utm Source

###### 種類を選択

URL

###### 要素タイプ

クエリ

###### クエリキー

utm_source

### GA - Variable - Utm Campaign

###### 種類を選択

URL

###### 要素タイプ

クエリ

###### クエリキー

utm_campaign

### GA - Variable - Utm Content

###### 種類を選択

URL

###### 要素タイプ

クエリ

###### クエリキー

utm_content

### GA - Variable - Utm Medium

###### 種類を選択

URL

###### 要素タイプ

クエリ

###### クエリキー

utm_medium

### GA - Variable - Utm Term

###### 種類を選択

URL

###### 要素タイプ

クエリ

###### クエリキー

utm_term
統計学入門メモ（第1章）

## データの種類
- 質的データ
	- 「好き」「嫌い」、「男」「女」など、数字で表現が出来ないもの
	- 上記は二値変数、「大好き」「好き」「普通」「嫌い」「クソ嫌い」は5値変数となる
- 量的データ
	- 身長、体重等の数字で表せるもの
- 多次元データ
	- 1つの観測対象に対して1つのデータの場合、1次元データという
	- 1つの観測対象に対してn個のデータの場合、主1次元以上のデータについて、多次元データという
		- 多次元データでは属性値の分析だけではなく、属性間の相互関係分析が行われる事が一般的
- 時系列データ
	- 同じ調査項目を一定時間毎に同じ場所で計測し、取得できるデータ
	- 前後の値に相関があるため、個々のデータを独立したものとして扱うと分析を誤る可能性があるので注意。
- クロスセクションデータ
	- 同じ調査項目を異なる場所で計測し、取得できるデータ（例：各国の人口）	 
- パネルデータ
	- 同じ調査項目を一定時間毎に異なる場所で計測し、取得できるデータ（例：各国の人口の年推移とか？）

##統計学（頻度主義）における分析プロセス
- まずやる事

>*何を対象にどのようなことを分析するか考えることでなければならない*
>*分析を行うべき仮説を考えることである*
>*仮説がないままに、むやみにデータを集めてそれを分析しても何の意味もない*

- データ収集してから事後分布を考える様なベイズ推論になるとこの限りでなさそうだが・・・・一旦受け入れる

###業務に使うには・・・統計データの定義に注意！
##### 以下の項目は常に明確にせよ。
- [ ]誰がそのデータを集めたのか？
- [ ]全数調査か？標本調査か？
- [ ]だれ（何）を対象にした物か？
- [ ]いつ収集したデータか？
- [ ]地域は限定されているか？
- [ ]分類がある場合、それはどんな定義か？

####得られた結果の表現は正確に、誤解が無いようにすべき

## 今日使ったRコマンドまとめ

#### ワーキングディレクトリを知りたい！
**getwd()**

```R:実施結果
getwd()
[1] "/Users/hirudai/Documents/rwork/yasaR"
```

#### ワーキングディレクトリを変えたい！
**setwd("path")**

```R:実施結果
setwd("../")
getwd()
[1] "/Users/hirudai/Documents/rwork"
```

#### ファイル読みたい！
**read.csv("file_path")**

```R:実施結果
read.csv("tes.csv")
    name height weight
1 bababa    179     70
2 gagaga    140     50
3    vsi    250    120
```

## 参考資料
[統計学入門 (基礎統計学)][1]
[Rによる優しい統計学][2]
[岩波データサイエンスvol1][3]

[1]:http://www.utp.or.jp/bd/978-4-13-042065-5.html
[2]:http://shop.ohmsha.co.jp/shop/shopdetail.html?brandcode=000000001781
[3]:https://www.iwanami.co.jp/.BOOKS/02/8/0298510.html
Macでのssh/sshdあれこれ。


# 概要
最近自室にMac環境が加わったので、OS Xでssh/sshdを運用するうえでのあれこれをまとめました。

※検証環境は OS X Yosemite です。

※まだ運用し始めたばかりなので、何か気付き次第またここに追加で綴っていく予定です。


# あれこれ
## sshd_configの場所
`/etc/sshd_config`

<br>
## .bashrc と .bash_profile
SSHログインした際に自動的に処理を走らせたい場合に書くやーつですね。

ユーザーのホームに `.bash_profile` を作成すればOKみたい。

```
$ vim ~/.bash_profile
```
<br>
`.bashrc` も走らせたい場合は、 `.bash_profile` に、

```
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```
を記述すればOKとのこと。(便利！)

### 参考
- [Mac(OSX)で.bashrcを編集する · GitHub](https://gist.github.com/disktnk/4104284)

<br>
## sshdを再起動
```
$ sudo launchctl stop com.openssh.sshd
```

### 参考
- [SSHサーバ(sshd)再起動の方法（OS別） | 俺的備忘録 〜なんかいろいろ〜](http://orebibou.com/2014/10/ssh%E3%82%B5%E3%83%BC%E3%83%90sshd%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%AE%E6%96%B9%E6%B3%95%EF%BC%88os%E5%88%A5%EF%BC%89/)

<br>
## 日本語が文字化けする或いは入力できない

`.bash_profile` に `export LANG=ja_JP.UTF-8;` を追記で解決！

```bash:.bash_profile
export LANG=ja_JP.UTF-8;
```

### 参考
- [ Macからssh接続するときの文字化け - En blanc et noir](http://d.hatena.ne.jp/t_mimori/20110212/1297498681)

<br>
# その他
- [MacにSSH接続を試みると"Connection refused"。](http://qiita.com/sango/items/6075cc6ba97b40e51619)
（不具合？）SQLite3／インポート前後で結果出力の改行コードが変わる

[PowerShell with SQLite3 サンプル集](http://qiita.com/minr/items/6ea7c48e651c9334eae4)のコードをテストした際に、SQLite3の不具合と思われる現象により、期待した結果が得られずハマったので記載しておきます。

## 実行環境
Windows 10
SQLite3（sqlite3.exe/version 3.9.2）

## 現象
インポート前後で、SELECT文の結果出力の改行コードが変わる。
インポート前：CR+LF
インポート後：LF

なお、一旦SQLite3を抜けて再度SQLite3に接続し、
SELECT文を発行すると、改行コードはCR+LFで出力される

## 問題
SQLite3問い合わせ後、後続の処理でCR+LFを行区切り文字としてテキスト処理を行った場合、行が正しく区切られず、予期せぬ動作をする可能性がある

## 回避策
・改行コードが、CR+LFでもLFでも問題ないように後続のテキスト処理を行う
・インポート後は一旦SQLite3を抜け、再度接続を行ってから結果出力を行う

## 再現例

importfile.csv（テストデータ）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49502/51c58b28-6fc9-b4bd-7ce2-6139e5bddc52.png)

```cmd:コマンド
c:\minr>sqlite3 test.db
sqlite>.mode csv
sqlite>.output result.csv
sqlite>create table try(id,name);
sqlite>insert into try values(4,'四朗');
sqlite>insert into try values(5,'五郎');
sqlite>select * from try;
sqlite>.import importfile.csv try
sqlite>select * from try;
sqlite>.exit
```

result.csv（結果出力ファイル）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49502/54e16dea-4e4a-0076-f360-52d8a9bc0504.png)

2行目までが、インポートする前に出力した結果（改行コード：CR+LF）、3行目以降がインポート後に出力した結果（改行コード：LF）

## まとめ
~~もういっそのこと、Windowsが改行コードをLFだけにしてしまえよ~~ 処理対象のテキストファイルの改行コードが何か、ということを気を付けてプログラムを組まないといけない、と改めて感じました。