OmniAICreator/Qiita-1.07M huggingface dataset:
とりあえずpythonでtermcolorを使ってみた

termcolorを使えば標準出力の色を変えれるみたいで、試しに使ってみた。

インストール

```
pip install termcolor
```

```python3:環境
python==3.5.2
termcolor==1.1.0
```

# 実行結果
<img width="577" alt="qtermcolor.png" src="https://qiita-image-store.s3.amazonaws.com/0/157216/e4b14a03-1269-a9a3-b99c-d79e5ef68f1f.png">

使えるテキストの色
> - grey
> - red
> - green
> - yellow
> - blue
> - magenta
> - cyan
> - white

使える背景色
> - on_grey
> - on_red
> - on_green
> - on_yellow
> - on_blue
> - on_magenta
> - on_cyan
> - on_white

attrs
> - bold
> - dark
> - underline
> - blink
> - reverse
> - concealed
古いPHPをphp-buildでビルドする on El Capitan

新しい環境でPHPの古いバージョンをビルドしようとすると案外ビルドが通らなかったりします。今回、手元の環境（OS X El Capitan）でPHP 5.3系の古めのバージョンが欲しかったので、何個かビルドしてみました。その際の手順を記録しておきます。

## PHP 5.2.17

特に苦労せずビルドできました。

```
$ phpenv install 5.2.17
```

## PHP 5.3.2

下記のように`configure`時にHomebrew版のiconvを明示的に指定する必要がありました。

```
$ PHP_BUILD_CONFIGURE_OPTS="--with-iconv=$(brew --prefix libiconv)" phpenv install 5.3.2
```

## PHP 5.3.3

libeventの場所を明示的に指定してやる必要がありました。`--without-libevent-dir`を指定しても動きそうな気はしますが試していません。

```
$ brew install libevent
$ PHP_BUILD_CONFIGURE_OPTS="--with-libevent-dir=$(brew --prefix libevent)" phpenv install 5.3.3
```

## PHP 5.3.6

特に苦労せずビルドできました。

```
$ phpenv install 5.3.6
```

## PHP 5.3.1

php-buildがサポートしていない古いバージョンもビルドしてみました。

まず`patches`ディレクトリに`php-5.3.1-openssl-1.0.0.patch`を用意します。これは「[Mavericks上での古いPHPのビルドが苦行だった - hnwの日記](http://d.hatena.ne.jp/hnw/20131111)」でも紹介している、PHP 5.3.0および5.3.1用のパッチです。

```
$ cd $HOME/.phpenv/plugins/php-build/share/php-build/patches
$ curl -L https://raw.github.com/hnw/phpall/master/patches/patch-to-php-5.3.0-with-openssl-1.0.0.txt > php-5.3.1-openssl-1.0.0.patch
```

さらに`definitions`ディレクトリに下記のようなファイルを作れば、5.3.2と同様にビルドできます。

```:5.3.1
patch_file "xp_ssl.c.patch"
patch_file "zip_direct.c.patch"
patch_file "php-5.4.6-libxml2-2.9.patch"
patch_file "php-5.3.1-openssl-1.0.0.patch"

install_package "http://museum.php.net/php5/php-5.3.1.tar.bz2"
install_xdebug "2.2.7"
```

```
$ PHP_BUILD_CONFIGURE_OPTS="--with-iconv=$(brew --prefix libiconv)" phpenv install 5.3.1
```

ただし、このバージョンでは拡張モジュールの`make test`の機能が不足していたので`phpize`でコピーされるファイルをPHP 5.3.2と同一にしました。

```
$ cd $HOME/.phpenv/versions/5.3.1/lib/php/
$ mv build build.orig
$ ln -s $HOME/.phpenv/versions/5.3.2/lib/php/build ./
```
他のTeXファイルの内容を読み込む方法

docmuteパッケージを使って、他の$\TeX$ファイルの内容を読み込む方法についてまとめます。

#想定するシチュエーション
* 以下の文書を作成する必要がある
  * 発表用研究要旨 (`abstract.tex`)
  * 論文 (`thesis.tex`)
* これらの文書のアブストラクトは共通している

#docmuteパッケージの使い方
```abstract.tex
\documentclass[uplatex]{jsarticle}

%(省略)

\begin{document}
\maketitle

\begin{abstract}
アブストラクトです。
\end{abstract}
\end{document}
```

```thesis.tex
\documentclass[uplatex]{jsarticle}
%docmuteパッケージ読み込み
\usepackage{docmute}

%(省略)

\begin{document}
\maketitle

% abstract.texの内容(プリアンブルやタイトル除く)を挿入
%(どちらかのコマンドを使う)
\input{abstract}   %挿入する前後の改ページなし
\include{abstract} %挿入する前後の改ページあり

\clearpage
\tableofcontents

\clearpage
\section{はじめに}
%(省略)
\end{document}
```

#参考文献
* [天地有情 [LaTeX] docmute --- 他のTeXファイルのプリアンブルを無視して読み込み](http://konoyonohana.blog.fc2.com/blog-entry-225.html)
* [\input, \includeコマンド: 複数の.texファイルを一つのファイルでまとめてコンパイル · Issue #1 · uribo/LaTeX_tips](https://github.com/uribo/LaTeX_tips/issues/1)
UnityでGoogleVRを実装する

## 前提
### 各ツール・プラグイン等
- Unity 5.5.0f3
- Xcode 8.2.1
- GoogleVR 1.0

### プラットフォーム
- 開発機
    - macOS (MacBookPro)
        - Windowsの場合は大差はないが、適宜読み替えること
- リリース
    - Android
    - iOS

## 内容
### Unityでの開発
1. GoogleVRを利用して、アプリ作成
    - GoogleVRのunitypackageをGitHubから入手してインポート
        - GoogleVR : https://github.com/googlevr/gvr-unity-sdk
1. Unityビルド
    - Androidの場合はAPKをそのまま端末にインストール
    - iOSの場合はプロジェクトが作成されるので、以下手順へ 

### Xcodeでの開発
1. 作成されたプロジェクトをXcodeで開いて各種設定を調整
    - provisioning profileを設定（事前に作成しておく
1. **Info - Custom iOS Target Properties**に以下の値を追加
    - key : Privacy - Camera Usage Description
    - value : Advertisement would like to use Camera.
    - **重要** これがなくてもビルドはできるが、iTunes Connectでアプリを受け付けてくれない
1. Xcodeビルド

以上。

## 補足
GoogleVRのSDKは、Androidのバージョン制限があるため、気をつけること。
GoogleVRにはGaze Inputと呼ばれる、視線をイベントとして登録できるが、その実装方法は情報が少ないため、今後その手順も記載予定。
jsdoでFM変調、復調。　その３

#概要
jsdoでFM変調、復調やってみた。
復調アルゴリズムは、オリジナルです。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/w/K/m/wKm4.jpg?t=1483842837)

#成果物

http://jsdo.it/ohisama1/wKm4

#成果物
音が出ます。

http://jsdo.it/ohisama1/uspw
angular-cliでangular2 TOUR OF HEROESチュートリアルでつまずいた点

angular-cliを使って、[angular2のチュートリアル](https://angular.io/docs/ts/latest/tutorial)でちょっとはまった。
コンポーネントに`moduleId`という記述があり、エラーメッセージからすぐに解決できなかったので備忘録。

```ts:app/dashboard.component.ts
@Component({
  moduleId: module.id,  //←この記述
  selector: 'my-dashboard',
  templateUrl: 'dashboard.component.html',
})
```

## 結論
`moduleId`の記述は`webpack`を利用している時は書かなくていいらしい。
(angular-cliは内部でwebpackを利用している)
[stackoverflow](http://stackoverflow.com/questions/37178192/angular2-what-is-the-meanings-of-module-id-in-component)
iOSで画面上に実寸のViewを表示できるライブラリの紹介

iOSで実寸のCGRect, CGSizeなどを作ることが出来るライブラリ、TrueScaleを公開したので紹介します。

GitHub:[TrueScale](https://github.com/ReoHokazono/TrueScale)

## インストール
###Carthage

```
github "ReoHokazono/TrueScale"
```

### CocoaPods

```
pod 'TrueScale'
```

### ファイルを直接プロジェクトに追加
[`TrueScale.swift`](https://github.com/ReoHokazono/TrueScale/blob/master/TrueScale/TrueScale.swift)をプロジェクトに直接追加してください

## 使用方法

### [mm]からCGRectを作成

```Swift
let frame = TSRect(x: 10, y: 10, width: 20, height: 20, unit: .mm).cgrect
let square = UIView(frame: frame)
square.backgroundColor = UIColor.darkGray
```

[cm],[inch]も使用可能です

```Swift
//[cm]
let frame = TSRect(x: 1, y: 1, width: 2, height: 2, unit: .cm).cgrect

//[inch]
let frame = TSRect(x: 1, y: 1, width: 2, height: 2, unit: .inch).cgrect
```


CGPoint,CGSizeも同様に作成できます。

```Swift
let size = TSSize(width: 30, height: 30, unit: .mm).cgsize
let point = TSPoint(x: 1, y: 1, unit: .inch).cgpoint
```

CGFloat単体で値を取得することもできます。

```Swift
let pointValue = CGFloat(1).toPoint(unit: .cm)
```

## 仕組み
Appleの公式サイトに掲載されている画面のインチと、開発時に使用するポイントの対角線の長さの比率から計算しています。

## 精度について
誤差は1mm以内に収まっていると思います。端末による差異も考えられるのでシリアスな用途での使用は避けてください。
awsで固定管理していない(auto-scaling)サーバーにpecoで選択してsshしたい(.ssh/configの更新はしたくない)

本番のwebサーバー等を適当に選んでsshしたいときがあったのでshellを書きました。

## 概要

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/d9953bc0-f3dc-93b3-53e8-b21569d63f04.png)

`aws-cli`,`peco`,`awk`に依存
webサーバーについている`tag` Name(webB,webC)で絞り込む
web稼働しているやつでも絞り込む(state=running)
iam role等でdescribe-instancesが実行できるようにしておく必要あり
instance-idとprivate-ipを表示しているが、private-ipだけでいい、見た目の問題

```bash:.bashrc

# .bashrcに書き込めば使えるはず
function webssh () {
  host=$(aws ec2 describe-instances --filters "Name=tag-value,Values=webB,webC" "Name=tag-key,Values=Name" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].[InstanceId,PrivateIpAddress]" --output text | peco | awk '{print $2}' | xargs -n 1)
  ssh -i ~/.ssh/hoge.pem $host
}
```

```bash:aws-cli部分
aws ec2 describe-instances \
  --filters \
    "Name=tag-value,Values=webB,webC" "Name=tag-key,Values=Name"\
    "Name=instance-state-name,Values=running"\
  --query \
    "Reservations[*].Instances[*].[InstanceId,PrivateIpAddress]"
  --output text
```





## 参考
[AWS Cli自分用Tips](http://qiita.com/takachan/items/421928dc61c51af97fb1)
[AWS CLIのフィルターとクエリーの使い方についてまとめてみた](http://dev.classmethod.jp/cloud/aws/aws-cli-filter-and-query-howto/)
[AWS CLIを使ってEC2インスタンスの情報を取得する](http://qiita.com/toshiro3/items/37821bdcc50c8b6d06dc)
KyTeaまとめ

KyTeaについてまとめます。

#KyTeaとは
文章の単語分割等を行うことができるテキスト解析器です。
デフォルトでは文章の単語分割, 品詞推定, 読み推定ができるようになっていますが、学習データの素性次第で様々なタスクを行わせることができます。

#インストール方法
Ubuntuの場合は[Ubuntu 18.04 LTSにKyTeaをインストールする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/f5c4118bff616d94c230)に従ってインストールします。

#基本
##解析
以下の文章を解析するとします。

```input.txt
本日は晴天なり。
麻生太郎はコーヒーを買って飲んだ。
```

このとき、解析は以下のようなコマンドで行います。

```bash
$ kytea < input.txt 
本日/名詞/ほんじつ は/助詞/は 晴天/名詞/せいてん な/助動詞/な り/語尾/り 。/補助記号/。
麻生/名詞/あそう 太郎/名詞/たろう は/助詞/は コーヒー/名詞/こーひー を/助詞/を 買/動詞/か っ/語尾/っ て/助詞/て 飲/動詞/の ん/語尾/ん だ/助動詞/だ 。/補助記号/。
```

解析結果の行は元の文章の行と一致しており、各形態素の情報は以下のように表示されます。

```
表層/品詞/読み
```

※タグが付与できなかった箇所には`UNK`タグが付与されます。

##学習
###学習データ
各形態素の素性は以下のように付与します。

```
表層/素性1/素性2/....../素性n
```

なお、どういったタグを付与するのが適切か分からない場合には、その素性の箇所のみ空欄とすることも可能です。
__※タグが付与されないことが分かっている場合には、空欄にするのではなく、タグが付与されないことを示すタグを付与するようにしてください。__

以上のことを留意した上で、解析結果と同様のフォーマットで作成します。

###モデル
KyTeaでは以下の2種類のモデルがあり、素性ごとにどちらのモデルを適用するかを指定することができます。

* __個別タグ付与モデル__<br>形態素ごとにモデルを作成する<br>(読み推定, 語義曖昧性解消等の各単語のタグ同士に明らかな相関がなかったり、タグの数が大きかったりするタスクに向いている)<br>※このモデルを適用する場合、語尾が異なる動詞が異なるモデルとして作成されないよう、動詞の語幹と語尾を分割することをおすすめします。
* __全体タグ付与モデル__<br>文章全体で1つのモデルを作成する<br>(品詞推定, 固有表現抽出等の単語が異なっていてもタグの傾向に明らかな相関があるタスクに向いている)

###学習
ベースとなるコマンドは以下になります。

```bash
$ train-kytea -full {学習データ} -model {出力先のモデル}
```

全体タグ付与モデルを適用したい素性については以下のオプションで指定します (指定しなかった素性には__個別タグ付与モデル__が適用されます)。

```
-global {何番目の素性か(1起点)}
```

なお、このオプションは複数回用いることが可能なので、複数の素性について全体タグ付与モデルを適用することができます。

###テスト
* 平文をテストデータとする場合

```bash
$ kytea -model {モデル} < {テストデータ}
```

* タグを付与したい素性のみを空欄とした、学習データと同様のフォーマットのデータをテストデータとする場合

```bash
$ kytea -model {モデル} -in full < {テストデータ}
```

#参考文献
* [KyTea (京都テキスト解析ツールキット)](http://www.phontron.com/kytea/index-ja.html)
* 新納浩幸, 古宮嘉那子, 佐々木稔, 森信介. (2016). [点推定による日本語 all-words WSD システム KyWSD](http://nlp.dse.ibaraki.ac.jp/~shinnou/papers/IPSJ-NL16227002.pdf). 研究報告自然言語処理 (NL), 2016(2), 1-5.
MSP430 > main memory | information memory > const宣言した値が反映されてない理由と対処

```txt:動作環境
MSP430
```

### 症状

構造体に2つの項目を追加した。
その構造体で初期値用にconst宣言して、値(デバッグ用にpiとnapier数など使用)を設定していたが、プログラム実行時にそれらの値が0.0になっていた。

### はまりポイント

IDEの設定でプログラムダウンロード(MCUに書込み)時に以下のオプションがある。

1. main memoryの消去
2. main memoryとinformation memoryの消去

1の設定を有効としていた場合、上記の症状が発生する。
2の設定を有効としたことで初期値が反映されることを確認した。

このあたり分からずに使っていると、初期値を設定したけど反映されない、という「ハマリ」に遭遇する(した)。
Gradleで古いHadoop (hadoop-core-0.20.2-cdh3u6) を含めたjarを作る方法 : （Could not expand ZIP .. と出るときの対処法）

古いプロジェクトをGradleに移していたときにHadoop周りでうまくいかなかったので、その解決方法のメモ

### ビフォー(失敗)
~~~
dependencies{
    compile group: 'org.apache.hadoop', name: 'hadoop-core', version: '0.20.2-cdh3u6'
}

jar {
    manifest {
        attributes(
	    'Main-Class': 'path.to.Main',
	    'Class-Path' : '.' 
        )
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
~~~

として、gradle jarすると

~~~
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':jar'.
> Could not expand ZIP '...\.gradle\caches\modules-2\files-2.1\com.cloudera.cdh\hadoop-ant\0.20.2-cdh3u6\...\hadoop-ant-0.20.2-cdh3u6.pom'.

~~~

というエラーが出てきてjarが作れなかった。

### アフター(解決)

~~~
dependencies{
    compile (group: 'org.apache.hadoop', name: 'hadoop-core', version: '0.20.2-cdh3u6'){
        exclude group: 'com.cloudera.cdh', module: 'hadoop-ant'
    }
    compile group: 'com.cloudera.cdh', name: 'hadoop-ant', version: '0.20.2-cdh3u6'
}
~~~

とするとビルドできた。

### 原因と思われるもの

hadoop-core-0.20.2-cdh3u6.pom を見ると

~~~
    <dependency>
      <groupId>com.cloudera.cdh</groupId>
      <artifactId>hadoop-ant</artifactId>
      <type>pom</type>
    </dependency>
~~~

とあり、type要素にpomが指定されている。
挙動をみるとGradleはtype要素がpomでもunzipしているようなので、そこでエラーになってしまうようだ。
そこで hadoop-ant については hadoop-core から依存関係を解決されないよう除外して、別途 hadoop-ant をとりにいくことでちゃんとビルドできるようになった。ようだ。

とりあえず課題は解決したのですが、的確な原因やより良い解決策をご存知の方がいらっしゃいましたらご教示ください m(_ _)m

### 補遺
Gradleは以下の動作環境で確認

~~~
------------------------------------------------------------
Gradle 2.14.1
------------------------------------------------------------

Build time:   2016-07-18 06:38:37 UTC
Revision:     d9e2113d9fb05a5caabba61798bdb8dfdca83719

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_77 (Oracle Corporation 25.77-b03)
OS:           Windows 7 6.1 amd64
~~~

~~~
------------------------------------------------------------
Gradle 2.0
------------------------------------------------------------

Build time:   2014-07-01 07:45:34 UTC
Build number: none
Revision:     b6ead6fa452dfdadec484059191eb641d817226c

Groovy:       2.3.3
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_77 (Oracle Corporation 25.77-b03)
OS:           Windows 7 6.1 amd64
~~~
ピーマンとハトと数学を Go 言語で試す

# はじめに

* 先日 NHK ETV で放送された "大人のピタゴラスイッチ" で "ピーマンとハトと数学" と題して "ピーマンの袋がどれもほぼ同じ重さになる仕組み" について解説があり面白かった。

# ピーマンの袋がどれもほぼ同じ重さになる仕組み

* 12個のピーマンを "組み合わせ計量装置" の上に置くと 150g になる組み合わせを計算して排出する仕組みになっている。
* "組み合わせがない場合もあるのでは？" という問に対しては "98% の確率で組み合わせがあることが数学が保証している" ということ。
* "98%" の根拠が知りたかったが確率の計算がわからなかったので、実際に Go 言語で試して検証してみることにした。

# 解法

* とりあえずすぐ思いついたのは愚直に全組み合わせを試すパターン。
* [togetter](https://togetter.com/li/1066394) みてたら "subset sum" というキーワードが出てきたので検索。
* [部分和問題](https://ja.wikipedia.org/wiki/%E9%83%A8%E5%88%86%E5%92%8C%E5%95%8F%E9%A1%8C) というのを知ったのでまた検索して [動的計画法](http://gushwell.ifdef.jp/etude/SubsetSum.html) での解法がわかったので Go 言語に移植してみた。

# 検証コード

* ピーマンの重さは適当に上限と下限を設定してランダムにしてみた。
* [The Go Playground](https://play.golang.org/p/bL-IkwUvd6) で実際に試せる。
  * Playground は現在時刻が固定でこのコードだと rand が正常に効いていないので何度か試すならローカル環境とかの方が良い。

```go
package main

import (
	"fmt"
	"math/rand"
	"sort"
	"time"
)

type SubsetSumProblem struct {
	Nums   []int
	Target int
}

func NewSubsetSumProblem(nums []int, target int) *SubsetSumProblem {
	sort.Ints(nums)
	s := &SubsetSumProblem{Nums: nums, Target: target}
	return s
}

func (s *SubsetSumProblem) Solve() []int {
	work := make([]int, s.Target+1, s.Target+1)
	work[0] = 0
	for i := 1; i < len(work); i++ {
		work[i] = -1
	}
	for _, n := range s.Nums {
		for i := s.Target; i >= 0; i-- {
			if work[i] == -1 {
				continue
			}
			if i+n <= s.Target && work[i+n] == -1 {
				work[i+n] = n
			}
		}
		if work[s.Target] != -1 {
			break
		}
	}
	return s.ToResult(work)
}

func (s *SubsetSumProblem) ToResult(work []int) []int {
	result := []int{}
	if work[s.Target] != -1 {
		for s.Target > 0 {
			result = append(result, work[s.Target])
			s.Target -= work[s.Target]
		}
	}
	return result
}

// 試行回数
const sample = 10000

// 候補になるピーマンの個数
const length = 12

// 最小のピーマンの重さ
const lowest = 20

// 最大のピーマンの重さ
const highest = 60

// 合計の重さ
const target = 150

func main() {
	rand.Seed(time.Now().Unix())
	count := 0
	for i := 0; i < sample; i++ {
		p := make([]int, length, length)
		for i := range p {
			p[i] = rand.Intn(highest-lowest) + lowest
		}
		s := NewSubsetSumProblem(p, target)
		result := s.Solve()
		if len(result) == 0 {
			count++
		}
	}
	percent := 100.0 - (float32(count) / float32(sample) * 100.0)
	fmt.Printf("%d 回成功 (%.1f%%)", sample - count, percent)
}
```

# 結果

* 前記のコードで何度か施行してみると、だいたい 99.7% 前後の結果になった。
* 最大最小の重さを調整すると 98% にすることはできたので前提条件が抜けていると思われる。
* ピーマンは規格があるだろうし、正規乱数とかでランダムな重さを出したほうがいい気がするし。

# おわりに

* 動的計画法がよくできていて感動した。アルゴリズムについてちゃんと勉強しようと思った。
* 部分和問題の動的計画法による解法の解説は [こちら](http://www.dais.is.tohoku.ac.jp/~shioura/teaching/ad09/ad09-08.pdf) の PDF が分かりやすかった。
論文の検索、読み込み、整理からドラフト書きの生産性向上ツール

# はじめに
論文を書くためには、多くの論文を読み、参照しつつ執筆する必要がありますが、その工程の生産性を向上させるツール、Papers 3 と Scrivenerを紹介します。
いずれのツールも Mac/PC版とiOS版があり、Dropbox経由で同期できますので、いつでもどこでも仕事が捗ります。

# Papers 3 
こちらのブログで詳しく紹介されています。
http://lifehacking.jp/2013/12/papers3/

iPad版で論文を読みながらハイライト、メモができ、アノテーションも含めて、Mac版と同期できます。

# Scrivener
書籍が出てます。
「考えながら書く人のためのScrivener入門 小説・論文・レポート、長文を書きたい人へ」
https://www.amazon.co.jp/Scrivener-ebook/dp/B01CZCM53A/

一言で言うと、高機能なアウトラインプロセッサーです。細切れのメモを組み合わせ、並べ替え、推敲するために使います。ScrivenerもMac, iOS版があり同期できます。
raspberry pi 1 model bで、with pixel　その３

#概要
起動時、IPアドレスを表示させてみた。


#写真

![MVC-003S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a0028da3-6378-037a-31f5-13facf47c21c.jpeg)


#環境

Raspberry pi 1 model b(element14)
raspbian 2016-11-25 jessie with pixel
sd_card MF-RUMSD08GL elecom
HDMI to VGA adapter(amazon)
usb keyboard(nec)
usb mouse(nec)

#準備
aptitude install apache2 php5


#設定
ブラウザのアドレスをhttp://localhost/ip.phpにする。

#サンプルコード

```
<HTML>
<BODY>
<h1>

<?php

$cmd = "ifconfig";
$data = `$cmd`;

foreach (preg_split("/\n\n/", $data) as $int) 
{
	preg_match("/^([A-z]*\d)\s+Link\s+encap:([A-z]*)\s+HWaddr\s+([A-z0-9:]*).*" .
			"inet addr:([0-9.]+).*Bcast:([0-9.]+).*Mask:([0-9.]+).*" .
			"MTU:([0-9.]+).*Metric:([0-9.]+).*" .
			"RX packets:([0-9.]+).*errors:([0-9.]+).*dropped:([0-9.]+).*overruns:([0-9.]+).*frame:([0-9.]+).*" .
			"TX packets:([0-9.]+).*errors:([0-9.]+).*dropped:([0-9.]+).*overruns:([0-9.]+).*carrier:([0-9.]+).*" .
			"RX bytes:([0-9.]+).*\((.*)\).*TX bytes:([0-9.]+).*\((.*)\)" .
			"/ims", $int, $regex);
	if (!empty($regex)) 
	{
		echo $regex[4];
	}
}

?>

</h1>
</BODY>
</HTML>


```
raspberry pi 1 model bで、with pixel　その２

#概要
起動時、ブラウザを全画面で表示してみた。
画面スリープも切ってみた。

#写真
![MVC-002S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/cf1ea283-e6e4-e009-6b86-50ea28136316.jpeg)



#環境

Raspberry pi 1 model b(element14)
raspbian 2016-11-25 jessie with pixel
sd_card MF-RUMSD08GL elecom
HDMI to VGA adapter(amazon)
usb keyboard(nec)
usb mouse(nec)

#設定

/home/pi/.config/lxsession/LXDE-pi/autostart

```
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
#@xscreensaver -no-splash
@point-rpi
@xset s off
@xset -dpms
@xset s noblank
@chromium-browser --noerrdialogs --kiosk --incognito http://www.yahoo.co.jp

```
Jupyter > Pythonコードをgitでバージョン管理をするには > jupyter nbconvert --to script [notebook]でpyファイルに変換する

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

Jupyter上でコードを変更している中、コードの変更をgit管理したくなった。

### 関連情報

関連情報を調べて見つけたのが以下。
http://stackoverflow.com/questions/18734739/using-ipython-notebooks-under-version-control

> For Ipython 2 notebook servers, this can be accomplished by starting the server using:

```
ipython notebook --script
```

### 実行してみた (--script)

```
$ jupyter-notebook disp_checkpoint.ipynb --script
[W 07:21:15.940 NotebookApp] 
            `--script` is deprecated and will be removed in notebook 5.0.
    
            You can trigger nbconvert via pre- or post-save hooks:
    
                ContentsManager.pre_save_hook
                FileContentsManager.post_save_hook
    
            A post-save hook has been registered that calls:
    
                jupyter nbconvert --to script [notebook]
    
            which behaves similarly to `--script`.
```

v5.1.0では`--script`は古いということらしい。

とりあえず、この状態でnotebookを保存するとipynbファイルに加えて、pyファイルも保存されるようになった。

```
[I 07:21:56.843 NotebookApp] Saving file at /disp_checkpoint.ipynb
[I 07:21:57.255 NotebookApp] Saving script /disp_checkpoint.py
```

pyファイルは以下のようになっていて、コードのセルの前に`In[]:`のコメントが入る。

```
# coding: utf-8

# In[1]:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

data_1d = np.random.rand(22500)
print(data_1d)
data_2d = np.reshape(data_1d, (150,150))

plt.imshow(data_2d, extent=(0,150,0,150),cmap=cm.gist_rainbow)ko-o-d
plt.show()


# In[17]:

'''
disp_checkpoint.ipynb
'''
...
```

### post-save hook

```
$ jupyter-notebook disp_checkpoint.ipynb --script
[W 07:21:15.940 NotebookApp] 
            `--script` is deprecated and will be removed in notebook 5.0.

            You can trigger nbconvert via pre- or post-save hooks:

                ContentsManager.pre_save_hook
                FileContentsManager.post_save_hook

            A post-save hook has been registered that calls:

                jupyter nbconvert --to script [notebook]

            which behaves similarly to `--script`.
```

を読むと、`jupyter nbconvert --to script [notebook]`を実行すると、その時点でipynbファイルをpyファイルに変換できるようだ。

実行してみた。

```
$ jupyter nbconvert --to script disp_checkpoint.ipynb 
[NbConvertApp] Converting notebook disp_checkpoint.ipynb to script
[NbConvertApp] Writing 7041 bytes to disp_checkpoint.py
```

コードをgit管理したい時点で上記コマンドを実行する、という感じだろうか。
技術英語 > Link > NB: nota bene (note well) / Computer, decrease ambient light by 60 percent.

http://qiita.com/7of9/items/c04b08c5e719dc6f8593#comment-6fe92d641a286a3e59ba
にて @tenfu2tea さんにいただたいコメント

> NB = nota bene (ラテン語) = note well 「注意せよ」

今後も遭遇しそうなフレーズのため、リンク記事とします。

<hr>
bene -> bien (フランス語) -> ambient [発音だけからの連想]

@ Star Trek Voyager > どこかのエピソード
> Computer, decrease ambient light by 60 percent.

Janewayの居室では音声を読み取ってランプ輝度を調整してくれる。
数年後に普通に製品として出回りそうな最近の動向。コストをどれほど抑えられるかが課題だろうか。

<hr>
Nota beneから思い出してしまうのは、「バンビ〜ノ! by せきやてつじさん」２巻などに出てくる Si, va bene!
http://mymemory.translated.net/ja/Italian/English/si-va-bene
> si va bene (イタリア語)
> Yes it's ok (英語)
...
> Va bene (イタリア語)
> Agreed!

vaからはフランス語でaller(英語: go)の活用(il va[英語: you go]など)を連想する。イタリア語でもgoの意味のようだ。
http://www.geocities.co.jp/aromazzi/racucin/20000507.html

記憶を強固にするための連想。
Si, va bene! -> Nota bene -> NB.
MacBook Pro 事始め MacPorts編

#　MacPortsをインストールする

どのくらいの頻度で使用するか不明ですが、MacPortsを入れて使ってみようと思います。

##　MacPortsのダウンロード

[MacPorts](https://www.macports.org/install.php)
から、使用しているOSのバージョンに合ったものを選択してダウンロードしてきます。
このMacBookは「El Capitan」なので*OS X El Capitan v10.11*のリンク。

## MacPortsのインストール

MacPorts-2.3.5-10.11-ElCapitan.pkg がダウンロードフォルダに保存されたので、これをクリックしてインストール開始。
使用許諾にOKしたりインストール先を聞かれたりしますが、今のところMacのお作法に詳しくないのでデフォルトのまま進めています。

## PATHを通す

```zsh
vi .zshrc
```

わたしの場合はすでに下記のPATHで設定しているので、最後に追加してみる。

```
PATH=/sbin:/usr/local/bin:/bin:/usr/local/sbin:/usr/sbin
```

を

```
PATH=/sbin:/usr/local/bin:/bin:/usr/local/sbin:/usr/sbin:/opt/local/bin:/opt/local/sbin(N-/):$PATH
```

こんな具合で。

### `~/.zshrc` を読み込む

```zsh
source　~/.zshrc
```

### `ｐｏｒｔ`コマンドを確認

```zsh
which port
/opt/local/bin/port
```

このように出てくればOK。

###　確認

```zsh
port version
Version: 2.3.5
```

###　更新

FreeBSDで言うところの`portsnap fetch`や`portsnap update`みたいな感じなのかな？

```zsh
sudo port selfupdate
sudo port sync
```
CentOS7 環境に openstack/newton の RDO から openvswitch をインストールする

# CentOS7 環境に openstack/newton の RDO から openvswitch をインストールする

## 目的:

* SDN ことはじめ

## 構成:

* Virtual Box + Vagrant
* CentOS 7 box

## 手順:

### 1. Box 作成


```shell-session:if_needed
vagrant box list | grep "centos/7"
vagrant box add centos/7
vagrant box update --box centos/7
```
```shell-session
mkdir -p ./vagrant/openvswitch/centos7
cd ./vagrant/openvswitch/centos7
vagrant init centos/7 -m
```
```shell-session:insert_lines_to_Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", type: "dhcp"
end
```
```shell-session
vagrant up
vagrant ssh
```

### 2. openvswitch インストール

```shell-session
sudo yum -y update
sudo hostnamectl set-hostname openvswitch-test1
sudo hostnamectl status
exit
```
```shell-session
vagrant ssh
```
```shell-session
RDO_FILENAME=`curl -s https://repos.fedorapeople.org/repos/openstack/openstack-newton/ | grep -oE "rdo-release-newton-[0-9].noarch.rpm" | tail -1`

echo $RDO_FILENAME

sudo rpm -Uvh https://repos.fedorapeople.org/repos/openstack/openstack-newton/$RDO_FILENAME

sudo yum -y install openvswitch
sudo systemctl status openvswitch
sudo systemctl start openvswitch
sudo systemctl enable openvswitch
sudo systemctl status openvswitch
```
```shell-session
$ sudo ovs-vsctl show
f2139d68-bec7-49bb-8ae7-e1ddbed63d4f
    ovs_version: "2.5.0"
```
Prototypeの関数でアロー関数は使わない

#アロー関数は便利！

アロー関数って便利ですよね。``function``っていちいち書かなくて済むし、なんたって通常の匿名関数と違って``this``がその都度定義されたりしませんから。例えば、

```javascript:setTimeoutにおける匿名関数とアロー関数の違い
var value = 'GLOBAL';

const NotArrow = {
  value: 'LOCAL',
  timer: function() {
    setTimeout(function() {
      console.log('NotArrow: ' + this.value);
    }, 1000)
  },
};

const Arrow = {
  value: 'LOCAL',
  timer: function() {
    setTimeout(() => {
      console.log('Arrow: ' + this.value);
    }, 1000)
  },
};

NotArrow.timer(); // NotArrow: GLOBAL
Arrow.timer(); // Arrow: LOCAL
```
こうしたコールバックが存在するときは本当にアロー関数って重宝します。で、今回のお話ですがアロー関数を調子に乗って何でもかんでも使ってしまってえらい目を見たという話です。いや、すでにタイトルでオチてますが。

#アロー関数も万能じゃない！

```javascript:アホな実装の例
var value = 'foobar';

function Foo(value) {
  this.value = value;
}

Foo.prototype.printValue = () => {
  console.log(this.value);
};

const bar = new Foo('テスト');
bar.printValue(); // foobar
```

上の実装ではアロー関数を使ってしまっているため``this``がセットされない、というか``this``がグローバルオブジェクトに固定されてしまっているのですね。例えば、``bar.printValue.call(bar);``などとやっても無駄です。この辺りのことは[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions#Invoked_through_call_or_apply)にも書かれていますね。アロー関数を``function``に改めれば期待通りの動作になります。こんな馬鹿馬鹿しいことをしてしまうのは私だけかもしれませんが、アロー関数も万能じゃないし、使いすぎはよくないぞってことで。
X11 で natural scrolling を使う

xinput を使うと簡単にできます。Arch Linux では `pacman -S xf86-input-libinput xorg-xinput` でインストールしておいてください。

まず xinput に認識されているデバイスを確認します。`xinput list` で表示できます。

```
% xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ ELECOM ELECOM Wireless Mouse              id=8    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ Topre Corporation RealForce Compact       id=9    [slave  keyboard (3)]
```

自分はマウスとして [ELECOM M-BL20DBシリーズ](http://www2.elecom.co.jp/peripheral/mouse/m-bl20db/) を使っているんですが、それが認識されていることを確認して、xinput で設定可能な項目を確認します。

```
% xinput list-props 'ELECOM ELECOM Wireless Mouse '
Device 'ELECOM ELECOM Wireless Mouse ':
        Device Enabled (146):   1
        Coordinate Transformation Matrix (148): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
        libinput Accel Speed (281):     0.000000
        libinput Accel Speed Default (282):     0.000000
        libinput Accel Profiles Available (283):        1, 1
        libinput Accel Profile Enabled (284):   1, 0
        libinput Accel Profile Enabled Default (285):   1, 0
        libinput Natural Scrolling Enabled (286):       0
        libinput Natural Scrolling Enabled Default (287):       0
        libinput Send Events Modes Available (266):     1, 0
        libinput Send Events Mode Enabled (267):        0, 0
        libinput Send Events Mode Enabled Default (268):        0, 0
        libinput Left Handed Enabled (288):     0
        libinput Left Handed Enabled Default (289):     0
        libinput Scroll Methods Available (290):        0, 0, 1
        libinput Scroll Method Enabled (291):   0, 0, 0
        libinput Scroll Method Enabled Default (292):   0, 0, 0
        libinput Button Scrolling Button (293): 2
        libinput Button Scrolling Button Default (294): 2
        libinput Middle Emulation Enabled (295):        0
        libinput Middle Emulation Enabled Default (296):        0
        Device Node (269):      "/dev/input/event0"
        Device Product ID (270):        1390, 163
        libinput Drag Lock Buttons (297):       <no items>
        libinput Horizontal Scroll Enabled (298):       1
```

この中に「libinput Natural Scrolling Enabled」というのがあるので、これを有効化することで natural scrolling にすることができます。

```
% xinput set-prop 'ELECOM ELECOM Wireless Mouse ' 'libinput Natural Scrolling Enabled' 1
```

これは X を起動するときに毎回実行する必要があるので、~/.xinitrc あたりに書いておくといいと思います。
CakePHPのアクセサ/ミューテータの仕様にLaravel常用者がハマった話

普段Laravelを使っていて、CakePHPでデータベースにエンティティを通して値を保存するというシーンでハマったのでそれぞれのフレームワークの仕様の違いを紹介します。
# CakePHPにおけるアクセサ/ミューテータの仕様
```php
Cake/ORM/Table::_processSave()
    => Cake/ORM/Entity::extract()
        => Cake/Datasource/EntityTrait::extract()
        => Cake/Datasource/EntityTrait::get()
```
Cakephp3で`Cake/ORM/Table::save()`を呼ぶと`_processSave()`メソッドが呼ばれますが､この中でエンティティのプロパティをSQL文にバインドする時に､エンティティクラス内にユーザー定義のアクセサがある場合､それによって値がフォーマットされます｡
CakePHPではアクセサとミューテーターは､オブジェクト指向でいうアクセサやミューテータそのもので､エンティティのプロパティの参照時にアクセサが呼ばれ、束縛時にミューテータが呼ばれる仕様です｡
# Laravelにおけるアクセサ/ミューテータの仕様
Laravelでは､モデルの"データベースから取ってきたプロパティ"の参照時にアクセサが呼ばれ､モデルのプロパティをデータベースに保存する際ミューテータが呼ばれるという仕様です｡

すなわちデータベースに値を出し入れする際に､CakePHPとLaravelのアクセサとミューテータは互いに正反対の動作をするということです｡
MacBook Pro 事始め zsh導入編

## zshインストール
デフォルトで入っている事を気付かなかったので、別途インストールしてしまいました。

### Homebrew インストール
自分のアカウントは管理者になっているので、sudoなど使わずにそのまま実行しました。

```zsh
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

ちなみに、すでにそのMacBookに `/usr/local` が存在するケースではエラーで止まるようです。

回避方法については、こちらのページが良いかと思います。

[【El Capitan】Mac OSX 10.11にHomebrewインストール](http://qiita.com/oooaoii/items/c14922eede6a83a750da#%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%9Fel-capitan%E3%81%ABusrlocal%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)

#### zsh を Homebrew でインストール

```zsh
brew install --without-etcdir zsh
```

### `/etc/shells` を編集

```zsh
vi　/etc/shells
```

として、下記の行を追加。

```zsh
/usr/local/bin/zsh
```

## default shell を変更

```zsh
chsh -s /usr/local/bin/zsh
```

`/etc/shells` に `/usr/local/bin/zsh` が追加されていないと

```zsh
chsh: /usr/local/bin/zsh: non-standard shell
```

と怒られてしまうので要確認です。


ターミナルを一旦終了し、再度ターミナルを起動すれば、zshで起動できているはず。

```zsh
echo $SHELL
/usr/local/bin/zsh
```

と表示されます。

## `~/.zshrc` を用意

```
vi　~/.zshrc
```

とする等して自分カスタマイズのzshが利用可能な準備が整いました。

### `~/.zshrc` を読み込む

```zsh
source　~/.zshrc
```

とすればOKです。
reinterpret_castとかを使って構造体をtupleに変換する（追記：できなかった）

#追記
**やらないほうがいいようです**
https://twitter.com/amedama41/status/817934240360763393
※strict aliasing:コンパイラ的に許可されていない型の間でポインタを通じて行ったり来たり弄ったりすると不思議な力で悲しいことになる。詳しくはググって

------追記ここまで------
#目的
構造体をtupleに変換したい
ユーザー定義の構造体に対し、メモリ的に同じレイアウトでtupleに変換可能な構造体を作り、それにユーザー定義構造体をreinterpret_castすることで比較的簡単に自動生成実装できるのではないかと考えてみる
**結論から言うとこの方法はそこまで筋がよいわけではなかった**

# 考え方
```
struct Dog
{
  int age;
  std::string name;
};
```
このような構造体に対し

```
template<class T1,class T2>
struct Foo{
  T1 x1;
  T2 x2;
};

template<class T>
auto to_tie(T&foo){
  return std::tie(foo.x1,foo.x2);
}
```
このような構造体を用意して

DogをFooにreinterpret_castで変換してやれば値を取り出せるのでないだろうか
その際Dogのメンバ型をFooに知らせるために何らかの方法で明記する必要があるだろう

# 実装

```
template<class T1,class T2>
struct Foo{
    T1 x1;T2 x2;
};

template<class T1,class T2>
struct foo_adapter{
    template<class T>
    static auto to_tie(T&x)
    {
        auto &foo= reinterpret_cast<Foo<T1,T2>&>(x);
        return std::tie(foo.x1,foo.x2);
    }
};
struct Dog{
    using adapt = foo_adapter<int,std::string>;
    int age;
    std::string name;
};


int main() {
    Dog dog={12,"abc"};
    auto t=Dog::adapt::to_tie(dog);
    t = std::make_tuple(36,"xyz");
    std::cout<<dog.age<<dog.name;
}
```
http://melpon.org/wandbox/permlink/5m5xvpxkkIBBSq85
このような感じになる
構造体を作る側としてはfoo_adapterの引数にメンバの型を列記して定義することで、つまり
```
    using adapt = foo_adapter<int,std::string>;
```
の一文を追加することで構造体をtupleに変換できるだろう


# ちょっとしたassert
foo_adapterの引数を間違えると悲惨なことになる。
以下のようなassert コードを仕込んでおけばコンパイル時に検出できるかもしれない

```
Dog t={foo.x1,foo.x2};  //型が間違っている場合コンストラクタが正常に働かない
sizeof(Foo) == sizeof(Dog)   // 当然同じサイズになるはず
```
ないよりましだろう


# 結論
Dogに

```
auto tie(){return std::tie(age,name);}
```
を書く方法と比べてやる価値があるかというと疑問が残る
ただ上のちょっとしたassertを仕込んだりfoo_adapter以外のものを使うことで挙動をswitchできたりなどの利点はちょっとありそうだ

ああ、静的リフレクションがほしい
Unity5.5+WebCamTexture(Android Build)に存在する致命的な不具合(修正済み)

普段からUnityを使ってカメラアプリを試作することが多いのですが、**ある時期からUnityで作ったAndroidアプリが実行時に頻繁にクラッシュするようになりました。**
検証した結果、Unity5.5以降のバージョンとWebCamTextureというシンプルな組み合わせで発生することが分かりました。
**この不具合は既にUnity5.5.0p4/5.6.0b3で修正されているのですが、けっこう長い間放置されていたので同じ現象に遭遇した人のために発生条件と回避方法を記事として残しておきます。**

## 不具合の発生条件

以下のようなコードをアタッチしたシーンをロードした状態で、アプリが非活性状態になる（メニューボタンや着信などで）と即落ちます。

```csharp
using UnityEngine;
Public class Test: MonoBehaviour
{
    WebCamTexture webCamTexture;
    void Start ()
    {
        webCamTexture = new WebCamTexture ();
    }
}
```

webCamTextureのインスタンスを作成しただけ！
たったこれだけのコードが不具合の原因になります。

## 回避方法

webCamTextureのインスタンスがPlay()していない状態で存在することが不具合発生のトリガーになるようなので、インスタンス作成時には必ずPlay()をする。

```csharp
        webCamTexture = new WebCamTexture ();
        webCamTexture.Play ();
```

webCamTextureの停止と同時にDestroy()する。

```csharp
        webCamTexture.Stop ();
        Destroy(webCamTexture);
        webCamTexture = null;
```

以上のことに気を付ければとりあえず不具合を回避できることがわかりました。

## 修正バージョン

**Unity5.5.0p4(リリース: 11 January 2017)  / Unity5.6.0b3(リリース: December 23, 2016)**でやっと修正されたようです。
> - Android: Fixed crash when reloading or resuming a scene which uses WebCamTexture. (855603, 859268)
> 
> [https://unity3d.com/jp/unity/beta](https://unity3d.com/jp/unity/beta)
> [https://unity3d.com/jp/unity/qa/patch-releases](https://unity3d.com/jp/unity/qa/patch-releases)
開発環境を手軽に準備する


# IaaS

## 比べてみよう

### AWS

いわずもがな・・・だね。

### Google Cloud Platform

[AWSよりGoogle Compute Engineを選びたくなる10の理由](http://yoshidumi.blogspot.jp/2014/01/awsgoogle-compute-engine10.html)

[他の追随を許さない５つのGCPの優位性](http://yoshidumi.blogspot.jp/2016/05/gcp.html)

### IBM Bluemix Infrastructure (SoftLayer)

[特集　SoftLayerのすべて ［第1弾］](https://www.imagazine.co.jp/ismagazine/ismagazine-4167/)

[特集　SoftLayerのすべて ［第2弾］](https://www.imagazine.co.jp/ismagazine/ismagazine-4179/)

[特集　SoftLayerのすべて ［第3弾］](https://www.imagazine.co.jp/ismagazine/ismagazine-4193/)

[IBMのSoftLayerは他のクラウドサービスとどう違うのか？](https://thinkit.co.jp/story/2014/08/26/5172)


# PaaS

## 比べてみよう

Heroku、Elastic Beanstalk、OpsWorks

[HerokuとElastic BeanstalkとOpsWorksを実際に使って徹底比較した結果](http://webfood.info/heroku-vs-elastic-beanstalk-vs-opsworks/)

[何故私は Heroku から離れたか、および新しい AWS セットアップのメモ](https://gist.github.com/Gab-km/5660808)
tar.xz, tar.bz2, tar.gzをコマンドラインから作る

# コマンド
まずはじめにたたくコマンドを示しておきます。

```bash
# inputDirectory内のファイルをtar.xzに
$ tar Jcvf ./outputFile.tar.xz  ./inputDirectory

# inputDirectory内のファイルをtar.bg2に
$ tar jcvf ./outputFile.tar.bg2 ./inputDirectory

# inputDirectory内のファイルをtar.gzに
$ tar zcvf ./outputFile.tar.gz  ./inputDirectory
```

# ちょっと解説
tarコマンドで指定しているオプションについてまとめておく。

## 基本オプション
|オプション|説明|覚え方|
|:---:|:---:|:---:|
c|書庫(tar)を新規作成する|**c** reate|
v|処理したファイルの一覧を詳細表示|**v** erbose|
f|書庫(tar)のファイル名を指定する|**f** ile

## 圧縮オプション  
オプション|説明|覚え方
|:---:|:---:|:---:|
z|gzipで圧縮|一般的だから、まずgzipの**z**を当てよう
j|bzip2で圧縮|zは使ってしまったから、発音の似ている**j**を当てよう
J|xzで圧縮|圧縮率ではこの中では一番だし、区別する意味も込めて大文字:**J** にしちゃえ
a|利用する圧縮形式を作成される書庫ファイルの拡張子から自動的に判断|**a** uto

## 圧縮レベルの変更
コマンドの前で環境変数を変更してあげるといいみたい。
変更しない場合デフォルトは6で，レベル範囲は1~9まで。

```bash
# inputDirectory内のファイルをtar.xzに*(圧縮レベル:9)
$XZ_OPT=-9 tar Jcvf ./outputFile.tar.xz  ./inputDirectory

# inputDirectory内のファイルをtar.bg2に(圧縮レベル:9)
$BZIP2=-9 tar jcvf ./outputFile.tar.bg2 ./inputDirectory

# inputDirectory内のファイルをtar.gzに(圧縮レベル:9)
$GZIP=-9  tar zcvf ./outputFile.tar.gz  ./inputDirectory
```

## おまけオプション
オプション|説明|
:---|:---|
--exclude|指定したファイルを書庫に含めない

```bash
# 例
$ tar zcvf ./outputFile.tar.gz --exclude .DS_Store ./inputDirectory
```

# 参考
* [tarのオプションをまとめる - Qiita](http://qiita.com/astro_super_nova/items/e7ff4ef5ec9fa253fd61)  
* [Linuxコマンド集 - 【 tar 】 ファイルを書庫化・展開する（拡張子.tarなど）：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230896/)
znc-pushの設定メモ

IRCのハイライト通知をSlackを使ってやりたいので、znc-pushを使った。
忘れそうなのでメモっておく。
※これでクライアント依存のハイライト通知から脱却

# install

```
$ git clone https://github.com/jreese/znc-push.git
$ cd znc-push/
$ make && make install
```

## 補足

zncは、ログインできないユーザ（`znc`）で実行していたので、別のユーザでmakeした。
そのため、soファイルを移動させた。

```
$ sudo cp ~/.znc/modules/push.so /usr/lib/znc/.
$ sudo chmod 644 /usr/lib/znc/push.so
```

# ロード

IRC上で以下のコマンドを実行して、pushモジュールをロードする。

```
/msg *status loadmod --type=user push
```

# 設定(Slack)

Slackに流したかったので、Slackの設定しか調べていない。

```
/msg *push set service slack
/msg *push set secret [SlackのAPIキー]　※URLではなく、Incoming WebhookのTから始まる文字列なので注意
/msg *push set target [SlackのChannel名]
/msg *push set hightlight [反応させたい文字列をスペース区切りで]
```

## テスト

```
/msg *push send test
```

## 設定例

ソースコードを読めば、Slackの設定は大体分かる。
https://github.com/jreese/znc-push/blob/master/push.cpp#L610
ToDoソフトが動き始めた。

####ToDoソフトが動き始めた。
現在、Todo.lyの読み込みと新規作成、更新などができるようになった。
ついでに、当初ChatWorkで考えていたため、ChatWorkへの書き込みなどもできるようになっている。
1本のソフトで、Todo.lyとChatWorkの両方に書けるのは、なかなかいい感じだ。
ブラウザで書くと、だいぶ待たされるのだが、それがないのがいい。

####ぜんぜんコードを整理できていないまま機能を追加している。
Todo.lyには文字コードかなにかの制約があるらしく、そのあたりをなんとかしたい、ということもある。
いくつか課題があるので、それを解決しつつ、という感じ。

####とりあえずしばらくは、自分用として使うつもり。
公開するとしたら、そのあとになりそうだ。最初はシンプルなかたちで2016年末と考えていたのだが…。公開するとなるとアイコンがやっぱり壁になるな～。まあいろいろ壁はあるか。
新春 Ubuntuゆるふわコーデ大会

# あらまし
別に新年関係ないのですが, Ubuntuデフォルトテーマからの脱却を試みましょう.

## 何故に？
デフォルトの外見に飽きました.

## どこを攻める？
`unity-tweak-tool`でテーマを変えることができます. が, テーマだけでは生ぬるい. フォントも変えます. 壁紙も変えます.

## 方向性は？
ゆるふわ.

# テーマ
[Numix Project](https://numixproject.org/)というLinux用のテーマを作っているプロジェクトがあります. 最近流行りのフラットデザインです.

## こーで
`unity-tweak-tool`のインストール:

```bash 
$ sudo apt install unity-tweak-tool
``` 
リポジトリを追加してNumixのテーマとアイコンをインストール:

```bash 
$ sudo add-apt-repository ppa:numix/ppa
$ sudo apt update
$ sudo apt install -y numix-gtk-theme numix-icon-theme-circle
``` 
Ubuntuでなくても工夫すればNumixは使えるようです. 

![figure32.png](https://qiita-image-store.s3.amazonaws.com/0/146775/5ae20329-42c2-2838-eff7-cfe010d1dc95.png)


`unity-tweak-tool`の「外観」欄にある「テーマ」を`Numix`に, 「アイコン」を`Numix-circle`に変更しましょう.

# フォント
ゆるふわ度に於いては[ゆたココ(ゆたぽん)](http://net2.system.to/pc/font.html)が最強です.「ゆたココ」はコーディング用途には向かないので, エディタ等のフォントには「ゆたぽん（コーディング）バックスラッシュ」がおすすめです.

## こーで
![figure33.png](https://qiita-image-store.s3.amazonaws.com/0/146775/bb959504-3cb9-4eee-8003-641a3709fef8.png)

`unity-tweak-tool`の「外観」欄にある「フォント」をぜんぶ「ゆたココRegular」にしてしまいましょう. ご自分のエディタ・端末・ブラウザなどもゆたぽん系に統一しましょう.

# 壁紙
[井上トロ](http://dic.nicovideo.jp/a/%E4%BA%95%E4%B8%8A%E3%83%88%E3%83%AD)さん一択でしょう.

# まとめ
![figure34-2.png](https://qiita-image-store.s3.amazonaws.com/0/146775/2af5d0cb-85bf-130d-a708-0fb89438cda4.png)


心がやすらぎます. みなさんもどうぞ. どこでもいっしょの新作は出ないものか...
phpでGETを利用したデータの受け渡しについての質問

現在XamppのApache環境でphpの練習として、GETのデータの受け渡しの理解を深める途中でうまく表示されず悩んでいます。アドバイスいただけたら幸いです。
内容は、csvファイルからフルーツの商品情報を取得して、３種類のフルーツ情報を一品ごとにブラウザ表示させ、URLのgetパラメータでidを直接指定して、表示内容をかえるというものです。
下記がソースコードです。


    <body>
        <h1>商品情報</h1>
        <?php 
        //ファイル名を取得
        $csv_path = './data/data.csv';
        //dateフォルダにcsvファイルがあるか確認する
        //あればファイルを開く
        if(file_exists($csv_path)){
            //ファイルの内容を読み込む
            $file_read = file($csv_path);
        }
      
        $view_fruits = array();
        foreach ($file_read as $fruits){
            $fruits = mb_convert_encoding($fruits, 'utf-8', 'sjis-win' );
            $fruits = explode(',', $fruits);
            //番号、商品、価格の内容を配列に格納
            $f = array();
            $f['id']      = $fruits[0]; 
            $f['product'] = $fruits[1];
            $f['price']   = $fruits[2];

            if ($f['id'] == $_GET['id']){
                $view_fruits = $f;
            }

        }
        ?>
 
        <table>
            <tr>
                <th>商品</th>
                <td><?php echo $f['product']; ?></td>
            </tr>
            <tr>
                <th>価格</th>
                <td><?php echo $f['price']; ?></td>
            </tr>

        </table>
    </body>


【ブラウザの表示】　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138225/5b7a82a6-89c9-a20a-2040-e7859a71f5f0.png)



【URL】※id=3をid=2またはid=1　に変更しても表示内容が変わりません。
http://localhost/fruits_csv/test.php?id=3

【csvの内容】　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138225/2c968193-5b73-99b2-2f04-511f88cbdd9b.png)
Scala@IntelliJで、不要なauthorコメントを削除する。

社内で毎週実施している輪読会で、チームギークを読む機会がありました。
その内容の中で、不要なauthorコメントを削除すべきという記述もあり、個人的にとても共感できた内容でした。
該当箇所はP56の以下の箇所です。
2章
  2.8 エンジニアリングとしてのコミュニケーション 
    2.8.2 ソースコードに名前を書く(別名:「Authorタグ」問題)
です。
>
ソースファイルに名前を入れると、あくまでも僕たちの意見だが、百害あって一利なしだ。

具体例については、チームギークの中の書籍をご参照ください。

今回は実際にツール作成もしない簡単な手順で、IntelliJ@Macでこのauthorコメントを削除する手順を共有したいと思います。
また、今回対象のプロジェクトはScalaで書かれているものですが、少し応用すれば、他言語でも適用できるはずです。

実施手順としては以下です。

+ IntelliJでshift+command+Rで置き換えダイアログを出す。
+ Generalタブで「Regular expression」にチェックを入れる。
+ Generalタブで「Case sensitive」からチェックを外す。
+ Contextは「in comments」を選択。

以下のパターンをそれぞれ実行。

パターン1

+ [Text to find:]に「^.*created by.*\n」を入力。
+ [Replace with:]に空白を入力。
+ 置換する。

パターン2

+ [Text to find:]に「^.*created with.*\n」を入力。
+ [Replace with:]に空白を入力。
+ 置換する。

パターン3

+ [Text to find:]に「^.*User:.*\n」を入力。
+ [Replace with:]に空白を入力。
+ 置換する。

パターン4

+ [Text to find:]に「^.*Date: 2.*\n」を入力。※2を入れるのは他のものが誤って消されないようにするため
+ [Replace with:]に空白を入力。
+ 置換する。

パターン5

+ [Text to find:]に「^.*Time:.*\n」を入力。
+ [Replace with:]に空白を入力。
+ 置換する。

パターン6

+ [Text to find:]に「^.*Timestamp:.*\n」を入力。
+ [Replace with:]に空白を入力。
+ 置換する。

パターン7

+ [Text to find:]に「^.*To change this.*\n」を入力。
+ [Replace with:]に空白を入力。
+ 置換する。

パターン8

+ [Text to find:]に「/\*\*[\s]*?\*/」を入力。
+ [Replace with:]に空白を入力。
+ 置換する。

パターン9

+ [Text to find:]に「/\*\*[\s]*?\*[\s]*?\*/」を入力。
+ [Replace with:]に空白を入力。
+ 置換する。

IntelliJのバージョンによって、authorコメントの書き方が違うので、上記のような手間のかかる手順となりました。
ぜひ活用してください。

[免責]
この手順の利用は自己責任でお願いします。
この手順を利用して起こったいかなる不都合も作者は保証しません。
SQLで素数列挙を行う

__注意:__ 以下のクエリはPostgresSQLで動作確認を行っています。

```psql
postgres=# select version();
                           version
-------------------------------------------------------------
 PostgreSQL 9.6.1, compiled by Visual C++ build 1800, 64-bit
(1 行)
```
***

いつものように仕事をさぼっていたときのこと。「さぼるにしても何かしら手を動かしておかないと周りから怪しまれるな……」なんて考えていたところ、SQLで素数列挙をしてみることを思いつきました。アリバイ工作というか偽装工作にもってこいということで、さっそく取り掛かることに。

まず自分が思いついた方法から。素数とは「1と自分以外の素数を持たない自然数」です。つまり約数の数を数えることにより素数かそうでないかを判定することができます。以下では「割る数」と「割られる数」の組み合わせを直積により求めたあと、「割る数」を約数としてその個数を数え、素数判定を行っています。

```sql
with recursive numbers (x) as (
        select 1
    union all
        select x + 1 from numbers where x < 50) -- 1..50の自然数を生成している。
select dividends.x as prime
from numbers as dividends, numbers as divisors
where divisors.x <= sqrt(dividends.x) -- 試し割り: 平方根以下まで調べれば十分
and dividends.x <> 1 -- 定義上1は素数ではない
group by dividends.x
having sum(case when mod(dividends.x, divisors.x) = 0
                then 1
                else 0 end) = 1 -- 1以外の約数を持たない
order by dividends.x;

/*
 prime
-------
     2
     3
     5
     7
    11
    13
    17
    19
    23
    29
    31
    37
    41
    43
    47
*/
```

さて意外にも早く書きあがってしまったため、同じことをしている人がいないかどうかを調べるべく、ネットサーフィンを始めたところ――[日本でSQLを書くにあたっては避けては通れないミックさんのウェブサイトに到達](http://www.geocities.jp/mickindex/database/db_puzzle_math_a.html#LocalLink-prime)。そこで示されていた解答がシンプルかつ効率もよさげだったので、自分なりに書き直してみることにしました。

```sql
with recursive numbers (x) as (
        select 2
    union all
        select x + 1 from numbers where x < 50) -- 2..50の自然数を生成している
select dividends.x as prime
from numbers as dividends
where not exists(
    select * 
    from numbers as divisors
    where divisors.x <= sqrt(dividends.x) -- 試し割り: 平方根以下まで調べれば十分
    and mod(dividends.x, divisors.x) = 0 )
order by dividends.x;

/*
 prime
-------
     2
     3
     5
     7
    11
    13
    17
    19
    23
    29
    31
    37
    41
    43
    47
*/
```

素数判定=約数の個数判定を`not exists`を利用することにより、読みやすく、かつ効率のいいクエリになっています。まだまだSQLも奥が深いですね。もっとべんきょうせねば(´・ω・｀)
Wordpress テーマはウィジェット・メニューを使って柔軟に

## 概要

Wordpress で作ったサイトをできるだけ管理画面で編集できるようにすることで、運用を楽にすることができます。
特にサイト構築と運用を別の人が行う場合に便利です。

テーマを作る時の一工夫というか、Wordpress の機能を使ったらよかったねという備忘録です。

## メニューはメニューで作る

header.php にべた書きせず、`wp_nav_menu` を使い、管理画面から編集できるようにします。
個々のページは固定ページとして作成します。

```php:header.php
<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="<?=get_template_directory_uri(); ?>/style.css"></script>
</head>
<body>
<div class="container_12">
  <header class="grid_12">
    <? wp_nav_menu(); ?>
  </header>
  <div id="content">
```

## トップページはウィジェットで構成する

`dynamic_sidebar` を使い、管理画面から編集できるようにします。

テキスト等のウィジェットを組み合わせてトップページを作ることで、一時的な告知をトップページに載せたいときなどに便利です。

また、[Widget CSS Classes](https://ja.wordpress.org/plugins/widget-css-classes/) プラグインを使ってレイアウトを制御します。グリッドシステムを使っている場合は、`grid_6` などと指定してウィジェットだけできれいなレイアウトを作ることが出来ます。

```php:functions.php
<?
add_theme_support('menus');

register_sidebar(array(
  'name' => 'トップページウィジェット',
  'id' => 'index-widget',
  'before_widget' => '<div class="widget %2$s">',
  'after_widget' => '</div>',
));
```

```php:index.php
<? 
get_header();
dynamic_sidebar('index-widget');
get_footer();
```

同様に、footer.php もウィジェットを使います。

```php:footer.php
  </div>
</div>
<footer class="container_12">
  <? dynamic_sidebar('footer-widget');　?>
</footer>
</body>
</html>
```

以下を functions.php に追記します

```php:functions.php
register_sidebar(array(
  'name' => 'ページ下部ウィジェット',
  'id' => 'footer-widget',
  'before_widget' => '<div class="footer widget %2$s">',
  'after_widget' => '</div>',
));
```
JestのwatchがError watching file for changes: EMFILE でコケるときの対処


Jestのwatchモードが下記のようなエラーで落ちてハマったので対処法をメモ。
多分そのうち治る物と思われる

```
$ yarn test -- --watch
2017-01-05 15:18 node[24494] (FSEvents.framework) FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() => (null) (-22)
2017-01-05 15:18 node[24494] (FSEvents.framework) FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() => (null) (-22)
events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: Error watching file for changes: EMFILE
    at exports._errnoException (util.js:1022:11)
    at FSEvent.FSWatcher._handle.onchange (fs.js:1282:11)
```

**（とりあえずの）解決法: watchmanをbrewから入れる**

```
$ brew install watchman
```

[watcnman](https://facebook.github.io/watchman/)はFacebookの作っているファイル監視するツール。jestが内部的に依存している

* [Watch mode stopped working on macOS Sierra #1767](https://github.com/facebook/jest/issues/1767)
    * [#issuecomment-248883102](https://github.com/facebook/jest/issues/1767#issuecomment-248883102)

どうもmacOS Sierraで起きている問題の模様。
node_modulesを消すと治った人もいる模様だったが、自分の場合はうまくいかなかった。
公式MySQLコンテナをDocker for Macで起動した際に外部から接続（リモート）ができないので困った


最近、久しぶりにDockerを触ったら、Docker for Macという便利なものになっていたので、ちょっと色々と試してみた。
そこで、起きたのが公式MySQLコンテナをDocker for Macで起動した際に外部から接続（リモート接続）ができないという問題。

```
$ mysql -u root -p -h 127.0.0.1 --port 3306
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

hostをlocalhost、portを3306としてmysqlに接続しにいこうとしたところエラーが発生。
あまり深く考えていなかったのだが、どのようなport設定で起動されているのか分かっていなかったので、Dockerの状態を確認してみる。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
99999999fac0        mysql               "docker-entrypoint.sh"   8 hours ago         Up About an hour               3306/tcp                 mysql_db_1
```

確認したところ、上記のように起動されており、少し調べたところhostやportがうまく設定されていなかったっぽい。
そこで、以下のようにdocker-compose.ymlでport部分を指定する

```docker-compose.yml
mysql:
  image: mysql
  ports:
    - 127.0.0.1:3333:3306
```
その後、再起動。

```
$ docker-compose up
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
99999999fac1        mysql               "docker-entrypoint.sh"   About an hour ago   Up 6 minutes        127.0.0.1:3333->3306/tcp   mysql_db_1
```

設定した内容で問題なくmysqlに接続することができた。

```zsh
$ mysql -u root -p -h 127.0.0.1 --port 3333
```

ただ、これだとDockerコンテナ同士のlinkに少し不具合が出たので、最終的に以下のようにdocker-compose.ymlを修正。

```docker-compose.yml
mysql:
  image: mysql
  ports:
    - 3333:3306
```

その後、再び再起動。

```
$ docker-compose up
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
99999999fac1        mysql               "docker-entrypoint.sh"   About an hour ago   Up 6 minutes        0.0.0.0:3333->3306/tcp   mysql_db_1
```

hostの部分が修正されたことが分かる。これで、コンテナ同士のlinkも外部から接続も問題なくできた。

今回の原因は色々とあったものの解決方法のみ備忘録として残しておく。
WindowsとPython3でのパケットキャプチャ

Windows環境でパケットキャプチャするための環境について。
（Anacondaで）Python3系をインストールしていることは大前提です。そこから追加でインストールするものについて以下に示します。
私の環境は次の通りです。
・Win10 64bits
・Anaconda 3.5　conda update --all実行済み。


#インストールするもの 
##WinPcap https://www.winpcap.org/
Wiresharkと一緒にインストールすれば楽。どうせWiresharkも使いますよね？登氏のWin10Pcapでもよいかも。http://www.win10pcap.org/ja/

##winpcapy　https://github.com/orweis/winpcapy
ちょっとかわいい感じの名前。pip install winpcapyでOK。なぜか、自分の環境ではうまくそのままでは動作しなかったので、`__init__.py`の`from winpcapy import WinPcap, WinPcapDevices, WinPcapUtils`を、`from . import winpcapy`に書き換えました。ここらへん、なにがどうなっているのか、importの仕様を理解していないのでよくわかっていません。

とりあえず、とにかく、パケットキャプチャをWindowsでやろうとしたときに、Python3系だと、Winpcapyがよさそう。それ以外もいろいろ挑戦しましたがサンプルまで動いたのは、私の場合は、winpcapyだけでした。

importのところを変えているので、`winpcapy.winpcapy.WinPcapDevices`みたいな感じになりますが、とりあえず動きます。

###例を動かす前に
まずは、

```.py
>>> from winpcapy import WinPcapDevices
# Return a list of all the devices detected on the machine
>>> WinPcapDevices.list_devices()
```
でデバイス名を確認するとよいと思います。そうしないと、Ethernet、とか入れても例のプログラムが名前が違っていて、動かなかったりしますので。

##scapy
winpcapyでキャプチャはできたのですが、解析しようとしたときに、どうやっていいのかわからなくなったので、高機能そうなscapyを入れることにしました。scapyの本家？は、Python2系にしか対応していないので、Python3に対応するように書き換えられた
scapy-python3　https://github.com/phaethon/scapy/
を利用します。

ただし、Win8以上では、`__init__.py`の`get_windows_if_list()`をちょっと書き換えないと動きません。これにハマりました。疲れた。scapyの概要は
ここ　http://www.slideshare.net/takahoyo/scapy-53353876
を参照ください。


とりあえずは、以上です。