OmniAICreator/Qiita-1.07M huggingface dataset:
Media Queriesの効率的な書き方

Sassを使う前提です。

## ブレイクポイントは変数で管理する

以下の理由で、すべてのブレイクポイントを変数で管理しておくのをおすすめします。

* サイト内で定義されているブレイクポイントが一目でわかる
* 後からブレイクポイントを修正する場合も一か所の修正で反映させることができる

自分は下記のように変数定義しています。

```vars.scss
$breakpoint-tablet: 980px;
$breakpoint-mobile: 640px;
```


## メディアクエリは要素ごとに記述する

メディアクエリはまとめて書いたり外部ファイル化することもできますが、要素ごとに記述するほうが効率がいいです。

離れた場所にメディアクエリの記述があると、修正のたびにあっちこっち行ったりきたりして手間がかかります。
また、見通しが悪くなるのでメディアクエリごとのルールの影響が把握しづらく、修正漏れが発生する確率が高くなります。


## メディアクエリの記述はmixinで書く

自分は以下のようなmixinを定義して、

```mixins.scss
@mixin max-screen($break-point) {
  @media screen and (max-width: $break-point) {
    @content;
  }
}

@mixin min-screen($break-point) {
  @media screen and (min-width: $break-point) {
    @content;
  }
}

@mixin screen($break-point-min, $break-point-max) {
  @media screen and (min-width: $break-point-min) and (max-width: $break-point-max) {
    @content;
  }
}
```

こんな感じで使っています。

```style.scss
.hoge {
  font-size: 20px;
  @include max-screen($breakpoint-tablet) {
    font-size: 18px;
  }
  @include max-screen($breakpoint-mobile) {
    font-size: 16px;
  }
}
```

mixinを使うことで、セレクタ（例でいうと`.hoge`）を複数回書かなくてすみますし、どこまでがひとつのルールセットかがわかりやすくなります。

また、メディアクエリ適用外のルールを修正したらタブレットやモバイルのルールにどのような影響があるかが一目で把握できると思います。


## メディアクエリを最終的にまとめる

上記のルールでメディアクエリを書いているとメディアクエリの記述がいたるところに出てくるので、ファイルサイズが大きくなりがちです。
ファイルサイズが気になる場合は、メディアクエリをひとつにまとめるプラグインの使用を検討しましょう。

実際に使用したことがないのでどれがデファクトスタンダードかがわからないのですが、以下のようなプラグインがあるようです。

[grunt-combine-media-queries](https://github.com/johncashmore/grunt-combine-media-queries)
[gulp-combine-media-queries](https://github.com/konitter/gulp-combine-media-queries)

[grunt-combine-mq](https://github.com/frontendfriends/grunt-combine-mq)
[gulp-combine-mq](https://github.com/frontendfriends/gulp-combine-mq)

[node-css-mqpacker](https://github.com/hail2u/node-css-mqpacker)
unity > uGUI > Panel > Active状態のトグル > panel.SetActive (!panel.activeSelf);

https://www.youtube.com/watch?v=0L-Y8dPJHDM&list=WL&index=35
の39:10あたり。

```csharp
public void TogglePanel (GameObject panel) {
  panel.SetActive (!panel.activeSelf);
}
```

http://d.hatena.ne.jp/nakamura001/20120827/1346069172
> activeSelf は GameObject 自身がアクティブかどうかの値であり、そのGameObjectの親の activeSelf の状態の影響は受けません。
centos6 + ffmpeg でHLS形式のストリーミングを作成


最新版のffmpegでhlsを作成する環境構築方法をまとめてみました。

ライブラリ群をgitから取得するので、最新のffmpegの実行環境をつくれます。
AWSのElastic Transcoderもべんりですが、こちらも使えると選択肢が広がると思います。

###yumアップデート
```
sudo yum update
sudo yum install autoconf automake cmake freetype-devel gcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel
```

###作業ディレクトリ作成
```
mkdir ~/ffmpeg_sources
```

###yasmインストール
```
cd ~/ffmpeg_sources
git clone --depth 1 git://github.com/yasm/yasm.git
cd yasm
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install
make distclean
```

###x264インストール
```
cd ~/ffmpeg_sources
git clone --depth 1 git://git.videolan.org/x264
cd x264
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
make
make install
make distclean
```

###fdk-aacインストール
```
cd ~/ffmpeg_sources
git clone --depth 1 git://git.code.sf.net/p/opencore-amr/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install
make distclean
```

###ffmpegインストール
```
cd ~/ffmpeg_sources
git clone --depth 1 git://source.ffmpeg.org/ffmpeg
cd ffmpeg
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --bindir="$HOME/bin" --pkg-config-flags="--static" --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libfreetype --enable-libx264
make
make install
make distclean
hash -r
```

###ffmpegでhls用動画変換コマンド
```
ffmpeg -i {{inputファイル名}} -c:v libx264 -c:a libfdk_aac -f segment -segment_format mpegts -s:v 1280x720 -b:v 256k -segment_time 10 -segment_list {{m3u8ファイル名}} {{tsファイル名}}
```

参考URL: https://trac.ffmpeg.org/wiki/CompilationGuide/Centos
LinuxサーバにVNCサーバを構築する手順

# 前提
- VNCサーバの詳しい設定等は説明しません。（というかできません）
	- 便利な設定ご教示いただけると幸いです。
- とりあえずLinuxサーバをGUIで操作したくなったのでVNCが使いたいという人向けです。
- セキュリティの機密性・完全性の観点からはあまりよろしくないことをしています。（rootユーザ使うなど）
	- あくまで可用性重視です。ご了承ください。
	- セキュリティ上こうしたほうが良いなどありましたらご教示いただければ幸いです。




# 環境
- SV：RedHat Enterprise Linux Server release 6.5
- CL：Windows8.1、Ultra VNC Viewer
	- CLの設定はググってください

# パッケージのインストール
以下のコマンドを実行

```
yum install tigervnc*
```

# ファイルの設定
- /etc/sysconfig/vncserversの末尾に以下の行を追加

```:/etc/sysconfig/vncservers
VNCSERVERS="1:username"
VNCSERVERARGS[1]="-geometry 1024x768 -nolisten tcp"
```

- usernameには任意のLinuxユーザ名を記載してください
- 1024x768はVNCクライアントで接続した時の画面の解像度です

# パスワードの設定
- ファイルで設定したユーザ（username）でログインし以下のコマンドを実行

```
vncpasswd
```


# VNCサーバの起動
- 以下のコマンドを実行（rootで）

```
/etc/rc.d/init.d/vncserver start
```

# OS起動時にVNCサーバを起動するようにする
- 以下のコマンドを実行（rootで）

```
chkconfig vncserver --level 35 on
```
c++ builder XE4, 10.2 Tokyo > IPアドレスかどうかのチェック > 自作関数

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

String文字列がIPアドレスかどうかのチェック。

IndyのIsNumeric()を使用。

```cpp
#include <IdGlobal.hpp> // for IsNumeric()
#include <memory> // for unique_ptr<>
...
bool __fastcall TForm1::IsValidIPadr(String ipadr)
{
	std::unique_ptr<TStringList> list(new TStringList);
	list->StrictDelimiter = true;
	list->Delimiter = L'.';
	list->DelimitedText = ipadr;

	if (list->Count != 4) {
		return false;
	}

	for(int idx=0; idx < 4; idx++) {
		String each = list->Strings[idx];
		if (IsNumeric(each) == false) {
			return false;
		}
		int num = each.ToInt();
		if (num < 0 || num > 255) {
			return false;
		}
	}

	return true;
}
```

Indyの関数にもこういうチェックがあるかもしれないが、マニュアルを探して見つからなかったので、上記を実装した。

キーワード: invalid
ディレクトリ下にあるすべてのテキストファイルから、文字列hogeを含むファイルを抜き出す

いつも忘れる

    find ./ type f -name "*.txt" | xargs grep "hoge"

findコマンドで拡張子が"txt"のファイルを探す。
type -f で、実体ファイルを対象とする。
./ で、ディレクトリ配下を検索する。

findコマンドで検索した結果をxargsに引き渡す
先に検索した結果「ディレクトリ以下の "*.txt" ファイル」の中からhogeという文字列を含むものを、grepでピックアップする。
c++ builder XE4, 10.2 Tokyo > 二重起動の防止 > Mutex使用

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

以下のリンクで紹介されている。
http://kwikwi.cocolog-nifty.com/blog/2006/03/bcb_05d7.html

こちらもでも紹介されているが、こちらの場合`ReleaseMutex()`がコールされていない。
http://owlsperspective.blogspot.jp/2008/11/avoiding-multiple-instance.html
HerokuでRidgepoleを動かす(PostgreSQL)

## はじめに

RidgepoleをHerokuとPostgreSQLで動かすサンプルを作ってみました。

githubのソースはこちら
https://github.com/yoshioota/ridgepole-sample

## Ridgepole移行への流れ

### 既存のDBからSchemafileを作成する

```
# database.yml の development情報を元にして db/Schemafile を作成する
$ bundle exec ridgepole -c config/database.yml -E development --export -o db/Schemafile
```

これは通常一回やればOK。これ以降はdb/Schemafileを変更し開発を進めていく。

## 定常開発

### db/Schemafile にテーブル(カラム)の変更を記載する

```
# db/Schemafile

# articlesテーブルを追加
create_table "articles", force: :cascade do |t|
  t.string   "title"
  t.text     "text"
  t.datetime "created_at"
  t.datetime "updated_at"
end
```

### Schemafileの情報をDBに適用する

実際の適用の前に --dry-run にて確認

```
bundle exec ridgepole -c config/database.yml -E development -f db/Schemafile --apply --dry-run
```

LGTMならDBに適用する

```
bundle exec ridgepole -c config/database.yml -E development -f db/Schemafile --apply
```

TESTの兼ね合いもあるので、schema.rbを作成する。

```
# schema.rbを作る
rake db:schema:dump
```

※ ちなみに直接test用DBを作成する場合はこちら(testの時はschema.rbから読む設定になってるからいらないかな)

```
# test用のDBに直接適用
bundle exec ridgepole -c config/database.yml -E test -f db/Schemafile --apply
```

### HerokuのDBに適用する

Herokuへdeploy後以下のコマンドでHerokuのpostgreSQLに設定を適用する。

```
heroku run 'bundle exec ridgepole -c config/database.for.heroku.ridgepole.yml -E production -f db/Schemafile --apply' --app YOUR_HEROKU_APP_NAME
```

※ちなみに今回のサンプルではこんな感じでHerokuのENV['DATABASE_URL']を取得できるようにしてあります。楽。

```rb
# https://github.com/yoshioota/ridgepole-sample/blob/master/config/database.for.heroku.ridgepole.yml

production:
  url: <%= ENV['DATABASE_URL'] %>
```

### その他

■ PostgreSQLの外部キーをつけてるDBはうまく読み込めないので外しておく

どうもfkのnameが取ってこれないようなエラーが出てる。

## まとめ

なんとかやっていけそう。

## 参考URL

https://github.com/winebarrel/ridgepole
PHP+テキストデータで擬似キャッシュを作る

### やりたいこと

負荷の高いphpコードの実行回数を減らし、負荷を抑制したい。
Cache::Lite も memchaced　も使えない環境で、テキストデータで擬似キャッシュファイルを生成し、負荷の軽減を試みる。


### やろうとすること

* PHPの実行結果をテキストファイルにデータを保存する
* テキストファイル生成後、1分以内にアクセスがあったら、テキストの内容を出力する
* テキストファイル生成後、1分経過したあとにアクセスがあったら、再度処理を行い、結果を出力後テキストデータを書き換える


### 書いてみた

```php
<?php

// 処理速度の開始時間を記録
$time_start = microtime(true);

// 擬似キャッシュファイルを定義
$cache = "cache.txt";

// 擬似キャッシュファイルが存在しない場合、ファイルを生成する
if(!file_exists($cache)){

  touch($cache);
  echo("擬似キャッシュファイルを生成しました。\n");

}

// 擬似キャッシュファイルの中身を読み込み、生成時間が60秒以内かを確認する
// 60秒以上経っている場合、フラグを立てる

$genTime = filemtime($cache);
$cacheTime = 60;

if(($genTime + $cacheTime) < time() ){

  $cacheFlag = 1;

}

// 擬似キャッシュファイルがNullの場合、もしくは擬似キャッシュが生成後1分経っていた場合、関数genCacheを実行する。生成後の時間確認には関数checkTimeを使う。擬似キャッシュファイルの内容が存在する場合、その内容を表示する。

$cachedata = file_get_contents($cache);

if ( !isset($cachedata) || isset($cacheFlag) ){

genCache();

}  else  {

print ($cachedata);
print ("キャッシュデータが存在したため、その内容を出力しました。\n");

}

// 関数genCacheを定義。
// 日付データを生成してその内容を出力後、擬似キャッシュファイルへ内容を書き込む


function genCache(){
  $cache = "cache.txt";
  $currentDate = date("Y年m月d日 H時i分s秒");

  echo $currentDate;
  echo ("関数genCacheからデータを出力");

  file_put_contents($cache, $currentDate, LOCK_EX);
  echo("擬似キャッシュファイルへの書き込み完了");

// 実際の処理。ここではテスト用にループを回す

for( $i=0; $i<10000; $i++ ){
 
}

}

// 処理速度の終了時間を計測
$timelimit = microtime(true) - $time_start;
echo $timelimit . ' seconds';

?>
```

### 実行してみた

    2015年08月25日 10時13分54秒
    関数genCacheからデータを出力擬似キャッシュファイルへの書き込み完了
    0.010881900787354 seconds
    
    2015年08月25日 10時13分54秒
    キャッシュデータが存在したため、その内容を出力しました。 
    0.00022101402282715 seconds

    2015年08月25日 10時13分54秒
    キャッシュデータが存在したため、その内容を出力しました。 
    0.00016689300537109 seconds

    2015年08月25日 10時15分01秒
    関数genCacheからデータを出力擬似キャッシュファイルへの書き込み完了
    0.00077390670776367 seconds


少しはキャッシュの役割を果たせているでしょうか。
簡単な地図をMapViewで表示するコード


iOSでMkMapViewを使用して簡単な地図を表示するコードを書いたのでメモ。


### するつもりだったけど、これ本当はSwiftコード書かないでも地図だけ出すのはできたので、地図を表示するときの最低限の設定についてのメモになりました。
 

1. MapKitを使用するための前準備
 BuildPhases>Link Binary With Librariesより、+ボタンをクリック
 ![スクリーンショット 2015-08-25 12.58.50.png](https://qiita-image-store.s3.amazonaws.com/0/66681/37266cd4-c082-16e1-2e75-7cdbb5b43084.png)
  BuildPhases>Link Binary With Librariesより、+ボタンをクリック

2. 検索欄にmapと入力するとMapKitが出てくるのでこれを選択して追加する
  ![スクリーンショット 2015-08-25 13.00.01.png](https://qiita-image-store.s3.amazonaws.com/0/66681/52cf82de-8128-f30e-1480-b568f9af0711.png)

これでひとまずの準備はOK。

あとはstoryboardで、ViewにMapViewをいれておく。
これだけで表示はできます。

カスタマイズする場合
--------------------

いつものように`@IBOutlet MKMapView`をstoryboardに関連付けておくこと。

```swift:ViewController.swift
import UIKit
import MapKit

class ViewController: UIViewController, MKMapViewDelegate {
    @IBOutlet weak var mkMapView: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //緯度、経度を皇居で決め打ちにしてる
        let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(35.68154,139.752498)
        //MapViewに表示する座標を設定
        mkMapView.setCenterCoordinate(location, animated: true)
        
        var region: MKCoordinateRegion = mkMapView.region
        //表示するマップの中心座標を設定
        region.center = location
        
        //地図の拡大状態の設定
        //設定しないと地図の表示が最縮小された状態でマップが表示されるので、理由がない限りは設定した方がいい
        region.span.latitudeDelta = 0.2
        region.span.longitudeDelta = 0.2
        
        //regionに設定したマップの表示設定をMapViewに反映
        mkMapView.setRegion(region, animated: true)
        
        //地図の形式
        //デフォルト値はStandard:地図
        mkMapView.mapType = MKMapType.Standard
    }
    
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```

次は位置情報に合わせてマップを表示するものを作る予定
VisualStudioCodeでのコード整形 

Windows版でのVisualStudioCodeでのコード整形のショートカットキー。
Shift + alt + f

File > Preference > KeyboardShortcutsからショートカットキーの確認ができます。

```json:DefaultKeyboardShortcuts
//120行目
{ "key": "shift+alt+f",           "command": "editor.action.format",
                                     "when": "editorTextFocus" },
```
CakePHPのControllerとComponentの実行順序

CakePHPのコントローラとコンポーネントのcallbackは以下の順で実行されるようです。

1. Controllerの`initialize()`
2. Componentの`beforeFilter()`
3. Controllerの`beforeFilter()`
4. Componentの`startup()`
5. Controllerのaction
6. Componentの`beforeRender()`
7. Controllerの`beforeRender()`
8. Componentの`shutdown()`
9. Controllerの`afterFilter()`

Authコンポーネントの認証処理は、4番目の`startup()`に書かれているので、5番以降じゃないと認証済かどうか等の確認はできないので注意。
バッチでRDP起動

```bat
@Echo off
Set SERVER=IPアドレス
Set USERNAME=ユーザ名
Set PASSWORD=パスワード
 
Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD%
Start mstsc /v:%SERVER%
Timeout 1
Cmdkey /delete:TERMSRV/%SERVER%
```

### 追記&注意

- 上記のバッチは実行するOSインスタンス上に実行するユーザーのログインセッションがないと動作しません。（たとえばタスクスケジューラなどで実行するときは注意）

- パスワード(ry
Androidブラウザ(2系？)でCSSでrotate等を記載するとz-indexを無視してくる


```CSS
transform: rotate(0deg);
```
等があたっている要素にz-indexを当てても機能しなかったりする。

仕方ないので上にしたい要素等にすべて下のCSS等を当てて無理やり３次元の世界に連れてくることで解決

```CSS
transform: translateZ(0px);
```
gccとclangのラムダ式に関する最適化具合の違い

gccとclangでclangの方が顕著に最適化してくれてる例を見つけたのでメモがてら。

環境は

* GCC 4.9.2 20150212 (Red Hat 4.9.2-6)
* clang 3.5.0 (tags/RELEASE_350/final)

です。

テストコード

```test.cpp
class S
{
private:
	int a;
	int b;
	int c;
	
public:
	S(const int aa, const int bb, const int cc)
	: a(aa), b(bb), c(cc) {}

	int A() const
	{
		return a;
	}

	int B() const
	{
		return b;
	}

	int C() const
	{
		return c;
	}
};

template<typename F, typename G>
int Func(const S& s, const G& g, const F& f)
{
	return f((s.*g)());
}
template<typename F, typename G>
int Func(const S& s, const G& g1, const G& g2, const F& f)
{
	return f((s.*g1)(), (s.*g2)());
}

int P(const S& s)
{
	return Func(s, &S::A, [](int a)
	{
		return a*5;
	});
}
int p(const S& s)
{
	return s.A()*5;
}

int Q(const S& s)
{
	return Func(s, &S::A, &S::C, [](int a, int c)
	{
		return a+c;
	});
}

int q(const S& s)
{
	return s.A()+s.C();
}

```

を、まずclang++でコンパイルしてasmにします。

```
clang++ -std=c++11 test.cpp -S -O3
```

すると、

```
# P
imull	$5, (%rdi), %eax
retq
```

```
# p
imull	$5, (%rdi), %eax
retq
```

```
# Q
movl	8(%rdi), %eax
addl	(%rdi), %eax
retq
```

```
# q
movl	8(%rdi), %eax
addl	(%rdi), %eax
retq
```

うん、ちゃんとP=pでQ=qですね。最適化してくれてます。

一方、gccで

```
g++ -std=c++11 main.cpp -S -O3
```

とコンパイルすると

```
# P
subq	$8, %rsp
call	_ZNK1S1AEv
addq	$8, %rsp
leal	(%rax,%rax,4), %eax
ret
```

```
# p
movl	(%rdi), %eax
leal	(%rax,%rax,4), %eax
ret
```

```
# Q
pushq	%rbp
pushq	%rbx
movq	%rdi, %rbx
subq	$8, %rsp
call	_ZNK1S1CEv
movq	%rbx, %rdi
movl	%eax, %ebp
call	_ZNK1S1AEv
addq	$8, %rsp
addl	%ebp, %eax
popq	%rbx
popq	%rbp
ret
```

```
# q
movl	8(%rdi), %eax
addl	(%rdi), %eax
ret
```

なんか律儀にcallしちゃってくれてますね・・・。

というわけでgccよりclangの方が良く最適化してくれてるという結果でした。

なお、*5の計算にclangはimulを使っている一方でgccはleaを使ってるという違いも面白いですね。[某命令セット表](http://www.agner.org/optimize/instruction_tables.pdf)を見てると、確かにimulよりはleaの方が速いっぽいので、その点ではgccの方が勝ってる気もします。
MacにWindows10を入れるメモ

iMac(Late 2009)にWindows10を入れたメモ

まず、BootcampはこのバージョンのiMacでのWindows10インストールのサポート外である。

BootCampで、Windows7用のサポートファイルを落としておく
Windows 8.1から、普通にバージョンアップをかけてWindows10をインストール
インストールは成功するので、かたっぱしからSupportファイルのドライバ群を入れる

Apple Magic Mouse - ドライバを入れたら動作した
iMac(Late 2009) - Cirrius Logic CS4206がサウンドドライバなので、これ関連のドライバを入れたら音が鳴った
Mac Proでは、全部いれたらSKype for BusinessやVisual Studioなど、Microsoft系のアプリがクラッシュして起動しなくなった（ので、上書き再インストールを試みている）

--
追加メモ

まず、Windows10を入れたあとに、bootcamp5.1の入ったフォルダの中から、x64向けのbootcamp.msiを、コマンドプロンプトを管理者モードで起動した状態から、直接たたいて起動する。（setup.exeだと、対応していないとはじかれてしまうため）。bootcampが無事インストールされたら、NVIDIAのグラフィックドライバを利用している場合は輝度が変えられないので、レジストリエディタを開き、NVidiaで検索して、[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video]あたりにあるGuidのフォルダのなかの、0000というフォルダの中に、

RMBrightnessControlFlags"=dword:00000800
EnableBrightnessControl"=dword:00000001

この二つをいれてPCを再起動。キーボードの輝度変更は聞かなくなるが、bootcampから輝度変更できるようになる。bootcamp6.0では試していない。

http://nobordersca.blogspot.jp/2013/10/macbook-brightness-control-in-windows-8.html
【Go】 go fmt でコード整形

goには標準でコードを整形してくれる機能があるようです。そこで、実際にどうフォーマットされるのか試してみました。

## go fmt 実行前後のコード比較

### 元のコード
```go:test.go
package main
import(
"strings"
"fmt"
)
type T struct{
name string // オブジェクトの名前
value int // その値
}
func main(){
sum := 0
for i:=1;i<=10;i++{
if (i > 5) {
s := "iが6以上です"
fmt.Printf("%d\n", s)
fmt.Printf("%v\n", strings.Fields(s))
}
sum += i
}
fmt.Printf("%d\n", sum)
}
```
読み辛い…けど、一応動きます。（コードに意味はありません。笑）

### go fmt の実行
```bash
go fmt test.go
```

### フォーマット後のコード
```go:test.go(フォーマット後)
package main

import (
    "fmt"
    "strings"
)

type T struct {
    name  string // オブジェクトの名前
    value int    // その値
}

func main() {
    sum := 0
    for i := 1; i <= 10; i++ {
        if i > 5 { 
            s := "iが6以上です" 
            fmt.Printf("%d\n", s)
            fmt.Printf("%v\n", strings.Fields(s))
        }   
        sum += i
    }   
    fmt.Printf("%d\n", sum)
}
```

## 何が変わった？


### 行間
packageステートメント、importステートメントなどの間に1行空行が挿入されています。


### インデント
インデントが挿入されています。また、インデントはデフォルトでハードタブを用います。
https://golang.org/doc/effective_go.html#formatting

>Indentation
We use tabs for indentation and gofmt emits them by default. Use spaces only if you must.


### import順
パッケージのインポート順が「"strings", "fmt"」から「"fmt", "strings"」に変わっています。
※何順か調べられていないので、ご存知の方ご教授ください><

【追記(2015/09/05)】
以下記事で詳細に触れました。
[【Go】go fmt でフォーマット化された後のimportの順番について](http://qiita.com/taji-taji/items/91559e2b5b6c22631535)


### 構造体のフィールド、コメントのカラムの整列
name, valueの型の縦位置、コメントの縦位置が揃っています。
https://golang.org/doc/effective_go.html#formatting


### ifの構文の()
元のコードではifの条件を記述する構文に()が付いていますが、フォーマット後は()が取れています。
https://golang.org/doc/effective_go.html#formatting

>Parentheses
Go needs fewer parentheses than C and Java: control structures (if, for, switch) do not have parentheses in their syntax. Also, the operator precedence hierarchy is shorter and clearer, so


### 開始括弧の前のスペース

|    fmt 前    |     fmt 後    |
|:------------:|:-------------:|
|  `import(`   |   `import (`  |
|`func main(){`|`func main() {`|

のように、フォーマット後は各ブロックの開始括弧の前に半角スペースがつきました。


## 参考
https://golang.org/doc/effective_go.html#formatting
http://www.slideshare.net/nakaji-s/gophergolanggo-fmt
http://okisanjp.com/archives/4900
ci-phpunit-testでsingletonなクラスを呼び出してるメソッドをテストする

最近テストで使ってるCodeIgniterとPHPUnit、ci-phpunit-testの組み合わせがいいので
CodeIgniterとPHPUnit、ci-phpunit-testを使ったテストについて書いてみたいと思います。

インストール方法や使い方に関しては「[イマドキのCodeIgniterでPHPUnit入門 - Qiita](http://qiita.com/kenjis/items/afb9757ac21b6324d25b)」や「[イマドキのCodeIgniterでPHPUnit入門（Composer不使用編） - Qiita](http://qiita.com/kenjis/items/db3d1db35c9d9af305af)」を参考にして頂ければと思います。

# 実行環境

* Mac OS X 10.10
* PHP 5.5.26
* CodeIgniter 3.0.1
* PHPUnit 4.8.5
* ci-phpunit-test 1.0.x@dev

# レガシーなコードと戦う

singletonなクラスを呼び出してるメソッドをよく目にすると思うのですが（俺だけ？）、メソッドの中で呼び出してると、とてもテストしずらいですよね。

Mockery等でも一応静的メソッドのモックはできますがクラスが読み込まれてると使えない等制限がありますね。

そこでPHPUnitとci-phpunit-testの組み合わせです。

さっそくコード見てみましょう。

```php:application/libraries/DateTimeManager.php
<?php

class DateTimeManager
{
    static private $instance = null;
    protected $timestamp;

    public static function singleton()
    {
        if (! empty(self::$instance)) {
            return self::$instance;
        }

        return self::$instance = new self();
    }

    private function __construct()
    {
        $this->timestamp = time();
    }

    public function getTimestamp()
    {
        return $this->timestamp;
    }

    public function getDateTime()
    {
        return date('Y/m/d H:i:s', $this->timestamp);
    }
}
```

こんな時間を扱うクラスがあったとしてそれを呼び出す`Hoge`クラスの`getFuga()`メソッドをテストするとします。
※適当でごめんなさい

```php:application/libraries/Hoge.php
<?php

class Hoge
{
    public function getFuga()
    {
        $dateTime = DateTimeManager::singleton()->getDateTime();
        return $dateTime;
    }
}
```

テストクラスはこうなります。

```php:application/tests/libraries/Hoge_test.php
<?php

class Hoge_test extends TestCase
{
    public function test_getFuga()
    {
        MonkeyPatch::patchMethod(
            'DateTimeManager',
            ['getDateTime' => '2014/04/02 23:00:00']
        );

        MonkeyPatch::verifyInvokedOnce('DateTimeManager::singleton');
        MonkeyPatch::verifyInvokedOnce('DateTimeManager::getDateTime');

        $hoge = new Hoge();
        $this->assertSame('2014/04/02 23:00:00', $hoge->getFuga());
    }
}
```

テストメソッドの中でやってることは以下です。

* `MonkeyPatch::patchMethod()`メソッドで、`DateTimeManager`クラスの`getDateTime()`メソッドの返り値を設定
* `MonkeyPatch::verifyInvokedOnce()`メソッドでメソッドの呼び出し確認
* テストメソッドを呼んでassertion

でいざテストするとちゃんとテストが成功します。

```shell-session
$ cd application/tests/
$ ../../vendor/bin/phpunit --debug　libraries/Hoge_test.php
PHPUnit 4.8.5 by Sebastian Bergmann and contributors.


Starting test 'Hoge_test::test_getFuga'.
.

Time: 845 ms, Memory: 6.25Mb

OK (1 test, 3 assertions)

Generating code coverage report in Clover XML format ... done

Generating code coverage report in HTML format ... done
```

すごいですね。
こんな感じでレガシーコードと戦えます。

みなさん、CodeIgniterとPHPUnit、ci-phpunit-testに移行しましょうw
ではでは。

# 参考文献

* [AspectMockでsingletonなクラスを呼び出してるメソッドをテストする - Qiita](http://qiita.com/nagodon/items/837ebc38c20ca178a66d)
arduinoでメモリー

秋月で購入した24lc64をarduino unoにつないで見ました。
##写真
![MVC-001S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/9265e071-1ddd-8a70-dc40-f51aacbe3375.jpeg)
##回路図
![24lc64.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/6f124221-873e-36c7-1c2d-45d3c549416e.png)
##ハイパーターミナル
![h24lc64.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/59a319ab-5bae-92c1-ffee-1c044da5db5c.png)

##サンプルコード
```
#include <Wire.h>
#include <stdint.h>

#define chipAddress 		0x50
void i2c_eeprom_write_byte(int device, unsigned int addr, byte data)
{
	int rdata = data;
	Wire.beginTransmission(device);
	Wire.write((int) (addr >> 8));
	Wire.write((int) (addr & 0xFF));
	Wire.write(rdata);
	Wire.endTransmission();
	delay(10);
}
byte i2c_eeprom_read_byte(int device, unsigned int addr)
{
	byte rdata = 0xFF;
	Wire.beginTransmission(device);
	Wire.write((int) (addr >> 8));
	Wire.write((int) (addr & 0xFF));
	Wire.endTransmission();
	Wire.requestFrom(device, 1);
	if (Wire.available()) rdata = Wire.read();
	return rdata;
}
void test()
{
	byte v;
	Serial.println("Writing test data");
	i2c_eeprom_write_byte(chipAddress, 0x0, 0x2a);
        Serial.println(0x2a, HEX);
	i2c_eeprom_write_byte(chipAddress, 0x1, 0x3a);
        Serial.println(0x3a, HEX);
	i2c_eeprom_write_byte(chipAddress, 0x2, 0x4a);
        Serial.println(0x4a, HEX);
	i2c_eeprom_write_byte(chipAddress, 0x3, 0x5a);
        Serial.println(0x5a, HEX);
	i2c_eeprom_write_byte(chipAddress, 0x4, 0x6a);
        Serial.println(0x6a, HEX);
	i2c_eeprom_write_byte(chipAddress, 0x5, 0x7a);
        Serial.println(0x7a, HEX);
	i2c_eeprom_write_byte(chipAddress, 0x6, 0x8a);
        Serial.println(0x8a, HEX);
	Serial.println("Read data");
	v = i2c_eeprom_read_byte(chipAddress, 0x0);
	Serial.println(v, HEX);
	v = i2c_eeprom_read_byte(chipAddress, 0x1);
	Serial.println(v, HEX);
	v = i2c_eeprom_read_byte(chipAddress, 0x2);
	Serial.println(v, HEX);
	v = i2c_eeprom_read_byte(chipAddress, 0x3);
	Serial.println(v, HEX);
	v = i2c_eeprom_read_byte(chipAddress, 0x4);
	Serial.println(v, HEX);
	v = i2c_eeprom_read_byte(chipAddress, 0x5);
	Serial.println(v, HEX);
	v = i2c_eeprom_read_byte(chipAddress, 0x6);
	Serial.println(v, HEX);
}
void setup()
{
	Serial.begin(9600);
	Wire.begin();
	pinMode(13, OUTPUT);
	digitalWrite(13, HIGH);
	test();
}
void loop()
{
}

```
ECCUBE3をXAMPPにインストール後、編集を加えた後、さくらレンタルサーバーにアップする方法。wondaの備忘録

XAMPPへのインストール方法は他の方の
投稿等を検索してください。

その後、本番環境へアップしなおす方法が
見つからなかったので、いろいろやって成功した結果をここに記しておきます。
何かのお役に立てば。

phpMyAdminにて　MySQLのデータベースからeccube3用のデータベースを選択
エクスポートから実行をクリックしてsql文のかかれたファイルを保存する。
さくらレンタルサーバーで作ったデータベースにインポートしておく。

次に、FFFTPで　編集済みのフォルダをwww以下にアップロード
（xammp\htdocsの中のフォルダをまるごと）
eccube-3.0.2\app\config\eccube　のなかのdatabase.yml path.ymlを編集します。
直接編集できないと思いますので一度ダウンロードしてからアップしなおすなど。
面倒なら先に編集しておいてもOKです。

:bell: 変更箇所は

database.ymlの
host:
dbname:
user:
password:
です。

hostはデータベースの設定で確認
データベースサーバをチェックしてください。（初期ドメインとは違います）

次にpath.ymlを変更します。
xamppにインストールした時点で

root_dir: C:\xampp\htdocs\eccube-3.0.2
などと自動的に自身のPCに結び付けてPathがかかれているかと思います。
これをすべて変更しないとさくらサーバー上で動作しません。

書き換え方は
root_dir: C:\xampp\htdocs\eccube-3.0.2

→root_dir: /home/アカウント（サーバコントロールパネル左上に表示されてます）/www/eccube-3.0.2

これは別でサーバに直接ECCUBE3をインストールしたときにできていたPath.ymlを参考にしたものです。
その他該当箇所（C:\xampp\htdocs\と書かれた場所）はすべて書き換えてください。/（スラッシュ）を
使ってください。

これで
http://初期ドメイン/wwwに投げ込んだフォルダ名/html/ にアクセスしてみてください。


:sweat_smile: この記事は自身の経験不足から
メモ用、初心者用として書かれています。

設定に問題点等ありましたら
ご指摘いただけるとありがたいです。
ECCUBE3をさくらレンタルサーバーにインストールする方法。ECCUBE3ダウンロード後すぐにインストール編

※重要

:unlock: まずさくらサーバーのコントロール画面から
PHP設定編集を開く。

magic_quotes_gpc = Off
date.timezone = "Asia/Tokyo"

の2行を追加し、保存するをクリック。

（magin_quotes_gpc = Off とは

クライアントより<form>フォームで送られた文字列データが全てエスケープされ、 「" → ¥"」「¥ → ¥¥」など変換処理が行われる。

この設定がないとinstall.phpにアクセスしてもエラーが出る。
初心者はここでつみますよね。）

データベースの設定　から
データベースの新規作成を選び
任意の名前でデータベースを作る。

このとき、データベース一覧が表示されているので
チェック。（インストール時に必要になります。）

FFFTPというソフトをインストールし
https://osdn.jp/projects/ffftp/

ホストの設定をする。
サーバ情報の表示からFTP設定に関する情報をチェックしておく

ホストの設定名：FTPサーバ（初期ドメイン）のことです
ホスト名（アドレス）(N)：FTPサーバ（これも初期ドメイン）のことです。ホストの設定名と
同じで大丈夫です。紛らわしい
ユーザー名：FTPアカウント
初期フォルダ：www

接続できたらwww以下にダウンロード後解凍したECCUBE3フォルダを
そのままアップロード。

http://初期ドメイン(~.sakura.ne.jpなど)/wwwいかにアップしたフォルダ名（ダウンロードしたままならeccube-3.0.3など）/html/install.php　にアクセス

無事インストール用の画面が表示されればそれに従う。

 :bulb: ちなみに、
インストール後すぐに　管理画面へのログインボタンが表示されますが
ログインできるようになるまで数分の時差がある可能性があります。
すぐにログインしようとしてエラーがでて困惑することもありますので
ひとまず時間をおいて再トライしてみてください。
WiredTigerのキャッシュサイズを確認する

mongodbでwiredTigerを使っている場合に、現在の設定を確認するには

```
db.serverStatus().wiredTiger
```

を確認すれば良い。
キャッシュサイズの設定は以下の通り。

```
db.serverStatus().wiredTiger.cache["maximum bytes configured"]
```
c++/stl > 継承用に設計されたクラスもある > std::exception | iostreamライブラリ

引用: C++のためのAPIデザイン by マーティン・レディ
12.2 継承による拡張

> とはいえ、STLには継承用に設計されたクラスもある。最も明白なのはstd::exceptionだ。
...
> STLのiostreamライブラリも継承による拡張が可能だ。

http://stackoverflow.com/questions/8152720/correct-way-to-inherit-from-stdexception

http://stackoverflow.com/questions/1669514/should-i-inherit-from-stdexception

http://stackoverflow.com/questions/772355/how-to-inherit-from-stdostream
c++/stl > STLコンテナクラスは仮想デストラクタを提供していない > このクラスから継承してはいけない

引用: C++のためのAPIデザイン by マーティン・レディ
12.2 継承による拡張

> だが、すでに述べたとおり、仮想デストラクタを定義するクラスからのみ派生すべきだ。STLコンテナクラスは仮想デストラクタを提供していない。実際、オーバーライドする仮想メソッドはまったくない。つまり、このクラスから継承してはいけないことを明示しているのだ。


関連して
http://stackoverflow.com/questions/1647298/why-dont-stl-containers-have-virtual-destructors

> I think Stroustrup answered this question indirectly in his fantastic paper: Why C++ is not just an ObjectOriented Programming Language:
...
> A virtual destructor is only useful for inheritance scenarios. STL containers are not designed to be inherited from (nor is it a supported scenario). Hence they don't have virtual destructors.
c++ > 拡張が安全にできるかどうか > クラスが仮想デストラクタを持つかどうか

引用: C++のためのAPIデザイン by マーティン・レディ
12.2 継承による拡張

> 基本クラスが元々継承できるように設計されている場合のみ、この拡張が安全にできることに注意してほしい。これは、<font color=red>このクラスが仮想デストラクタを持つかどうか</font>で分かる。CPathStringのコード例では、MFCのCStringクラスには仮想デストラクタがない。これは、次のように、CPathStringにデストラクタが呼び出されない場合があることを意味する。

```cpp
CString *str = new CPathString();
delete str;
```

(余談)原書でなく和訳版で読んでいるので分からないが、

> 次のように、CPathStringにデストラクタが呼び出されない場合があることを意味する。

は正しくは以下の訳ではないだろうか? (コードの説明を考えて、そう思った)

> 次のような(実装の)場合、CPathStringにデストラクタが呼び出されない場合があることを意味する。
csharp > dynamic(動的型付け) > コンパイル時に型チェックを行わず、実行時にメソッドの呼び出し方などを解決する変数を宣言できる

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
3 手続きの記述

動的型付け変数の利用例

```
static void Main(string[] args)
{
  DynamicAdd(1,2);
  DynamicAdd("abc", "def");
  DynamicAdd(DateTime.Today, TimeSpan.FromDay(5));
}

static void DynamicAdd(dynamic x, dynamic y)
{
  // +演算子さえ持っていれば型は問わない
  Console.WriteLine(x + y);
}
```

以下に詳しい。
http://ufcpp.net/study/csharp/sp4_dynamic.html
csharp > internal > 同一アセンブリ内からのみアクセス可能 > .EXEやDLL一つ一つがアセンブリ

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
2 プログラミング構造

> internal: 同一アセンブリ内からのみアクセス可能
> アセンブリというのは、.NET Frameworkで動くプログラムの基本単位で、ほとんどの場合、実行可能ファイル(EXE)やDLLファイル１つ１つがアセンブリになります。
>...
> アクセス修飾子を指定しなかった場合, internalアクセスレベルになります。


https://msdn.microsoft.com/ja-jp/library/ms173099.aspx
> アセンブリは実行可能 (.exe) ファイルまたはダイナミック リンク ライブラリ (.dll) ファイルであり、.NET Framework のビルド ブロックとして機能します。
csharp > /// > ドキュメンテーションコメント > /docオプションで生成されるドキュメントにコメントの内容が反映される

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
2 プログラミング構造

> C#の場合、///から始まるコメントは特殊な意味を持っています。///から始まるコメントは、ドキュメンテーションコメントと呼び、コンパイラに/docオプションを付けることで生成されるドキュメントにコメントの内容が反映されます。

以下がわかりやすかった。
http://ufcpp.net/study/csharp/sp_xmldoc.html
技術英語 > Three of us / The three of us

引用: 冠詞マスター教本 by 石井隆之さん

> (37) a. Three of us attended the party. (我々のうち3人がパーティに出席した)
> b. The three of us attended the party. (我々3人がパーティに出席した)

> (37b)では同格のofが用いられています。

theがつくと全員が３名しかいないことになっているようだ。

<hr>
関連して思い出したもの

> There are 56 of us now. (現在(我々は)56名だ。)

Star trek Voyagerにて使われていたフレーズ。

上記ではtheはついてない。
全員が56名のはずだが。

> There were 56 of us. (我々は56名だった)
というフレーズだったかもしれない。
Android端末でposition:fixedしたら画像がボヤける

一部のAndroid端末のブラウザで、
`position:fixed`した空のbox要素に背景画像を設定すると何故か画像がボヤける件。

**(※)半年くらい前に遭遇した現象です。**
下書きを整理していたら投稿をすっかり忘れていたので今更ですが放流しました。
**(※)未解決です。とりあえず応急処置まで**
コメントお待ちしております... |ω・`）chira

## バグを確認した環境
・端末: Xperia SOL21
・標準ブラウザ＆chrome
・バージョン: 4.2

・端末: SUMSONG optima(機種不明)
・標準ブラウザ＆chrome
・バージョン: 4.1

## 応急処置
背景画像を敷いた**空のbox要素**を`position:fixed`すると
このバグが発生するらしいことがわかったので、``:after``擬似要素で``content``を挿入し、
挿入した``content``は``corlor: transparent;``しておく。
根本的には解決していないが、とりあえずその場はしのげる。

以下、サンプル

```css
.box {
  position:fixed;
  background-image: url(...);
}
.box:after {
  content:".";
  color:transparent;
}
```

おわり
tmuxで表示するウィンドウ名の長さを制限する

tmuxでウィンドウ名がやたら長くなってしまったときに、ステータスラインに表示する文字数を制限する方法です。

```
$ tmux -V
tmux 2.0
```

manページを見てみるとFORMATSの項に書いてありますが、`'#{=10:pane_tilte}'`のようにすれば、`pane_title`の最初の10文字のみを含むようにできます。

- [OpenBSD manual pages](http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1?query=tmux&sec=1#x464f524d415453)

ということで、自分の場合は

```
setw -g window-status-format "#[fg=white] #I:#{=20:window_name} "
setw -g window-status-current-format "#[fg=colour234,bg=colour248,bold] #I:#{=20:window_name} "
```

のようにすることで、ウィンドウ番号と、ウィンドウ名の最初の20文字をステータスラインに表示するようにしました。
音質のわかるマイク/ヘッドセットレビュー動画

MrGlossyBoxの↓の動画が素晴らしく、見つけたらまとめて行きたい。
https://www.youtube.com/watch?v=9XYNgQOb_Ts

podcastとか録音する前にどうぞ。

## 発端
PCで録音しやすいワイヤレスのマイクを探していたが、マイク単独の製品があまりない。
録音時の音質もきになるが、店頭では試し録音ができるところが知ってる範囲にはなかった。

そこで製品の音質がわかるレビューを探していたところ、冒頭の動画に出会った。

冒頭の動画のすばらしいところは１つの動画に二つのマイクで録音した音声が収録されていることで、録音環境の差を抑えた状態での比較ができる。
購入する前にマイクの音質を具体的にイメージすることができます。

他にもないか探してまとめたのが以下になります。


## MrGlossyBox
Huhd Wireless Headset
https://www.youtube.com/watch?v=9XYNgQOb_Ts



## randomfrankp
この人は結構な量のヘッドセットレビューをあげていてどれにもマイクテストが含まれている

Razer Kraken 7.1とGold Wireless Stereo Headset for PS4/PS3両方の音声が録音されている
https://www.youtube.com/watch?v=-igkGV-WQbg

Razer BlackShark PC Headset Review & Mic Test- AWESOME!!!
https://www.youtube.com/watch?v=U3EZ6y3Inkc


## DiGiTiLsOuL
Afterglow Prismatic Headset
https://www.youtube.com/watch?v=lka8h2jl0dQ



## iPod Style
とんでもない量のマイクテストが聞ける

Bluetoothヘッドセットテスト　第６弾
https://www.youtube.com/watch?v=DDt312jTXY4

Bluetoothヘッドセットテスト　第７弾
https://www.youtube.com/watch?v=OzbIyzUyyR4


## fonimu426
ゼンハイザー pc310 と ゼンハイザー e835
https://www.youtube.com/watch?v=Nd93_MY08-Q


## ImpressWatchChannel
HyperX Cloud II ヘッドセット と PS4付属マイク
https://www.youtube.com/watch?v=rfuQaHewbIE


## CazuaLLUK
Logitech G430
https://www.youtube.com/watch?v=_KltATCJ-p8


## ferretguy9
Razer Kraken neon
https://www.youtube.com/watch?v=eMUZS_iXjcM


## まとめ
目に付いた範囲で音質がわかるヘッドセットレビュー動画を幾つか挙げました。
まだまだ他にもあると思います。
検索するときは`mic test`とか`headset test`とか`マイク テスト`とか`ヘッドセット テスト`で検索すると見つけやすいかと思います。

ちなみにレビューをいろいろみて RazerのKraken neonにしました。
WebRxのwx.propertyを使った本当のリアクティブプログラミング

WebRxは、RxJSでDOM操作ができるというMVVMライブラリで、ViewModelにおいてViewとbindするために使うwx.propertyというプロパティはDOM操作以外の使い方もできるということを紹介しようと思う。

wx.propertyの使い方
------------------

`wx.property`メソッドは引数に渡された値を初期値とするプロパティを生成して返すメソッドだ。

```javascript
var hoge = wx.property('hoge');

// プロパティを読み取る
console.log(hoge());

// プロパティを変更する
hoge('fuga');
```

ここまでは特にViewModelで使うぐらいしか意味の無いものだ。ViewModel以外で使うにはアクセスの面倒さやコストを考えるとただの無駄でしかない。

changed
-------

プロパティの強みを決定づけるのがchangedである。

```javascript
hoge.changed.subscribe(function(s){
    console.log('changed: ' + s);
});

hoge('fuga');
```

プロパティに新しい値が入るたびにストリームには新しい値が流れることになる。もちろんこのストリームはRxJSの様々なオペレータを使うことができる。

wx.whenAny
----------

`wx.whenAny`はプロパティの変更を受けて再計算されるプロパティを定義できる。

```javascript
var piyo = wx.whenAny(hoge, function(hoge) {
    return 'hoge is ' + hoge;
}).toProperty();

piyo.changed.subscribe(function(s){
    console.log(s);
});

hoge('ほげい');
// hoge is ほげい
```

wx.list
-------

`wx.list` は、Observableなリストを生成する。

```javascript
list = wx.list();

list.listChanged.subscribe(function(list){
    console.dir(list);
});

list.push('hoge');
// ['hoge']

list.push('fuga');
// ['hoge','fuga']

console.log(list.get(1));
// 'fuga'
```

まとめ
-----

実のところ、`wx.property` も `wx.list` もさほど使い勝手がいいわけでもないが、RxJS単体とはまた違ったリアクティブプログラミングが楽しめるので、RxJS使いの人は是非とも WebRx に触れてみてほしい。
【Swift】2つの配列から辞書を作る

# これまで（〜Swift3）

```swift

let romanStrs = ["M", "D", "C", "L", "X", "V", "I"]
let romanNums = [1000, 500, 100, 50, 10, 5, 1]

let strToNum = zip(romanStrs, romanNums).reduce([String: Int]()) { (dic, t) in
    var dic = dic
    dic[t.1] = t.0
    return dic
}

print(strToNum)
// ["X": 10, "V": 5, "D": 500, "C": 100, "L": 50, "I": 1, "M": 1000]
```

・`var`がポイント。

# これから（Swift4〜）

```swift

let romanStrs = ["M", "D", "C", "L", "X", "V", "I"]
let romanNums = [1000, 500, 100, 50, 10, 5, 1]

let strToNum = zip(romanStrs, romanNums).reduce(into: [String: Int]()) { $0[$1.0] = $1.1 }
print(strToNum)
// ["X": 10, "V": 5, "D": 500, "C": 100, "L": 50, "I": 1, "M": 1000]
```

5行が1行になりました。

### 追記

@koher さんからのコメントを記事にも追記します。

```swift
let romanStrs = ["M", "D", "C", "L", "X", "V", "I"]
let romanNums = [1000, 500, 100, 50, 10, 5, 1]

let strToNum = Dictionary(uniqueKeysWithValues: zip(romanStrs, romanNums))
print(strToNum)
// ["M": 1000, "I": 1, "X": 10, "D": 500, "C": 100, "L": 50, "V": 5]
```

## 参考

* [Swift 4の新しいreduceが素晴らしいので紹介する - Qiita](https://qiita.com/koher/items/17636e95e18e529e5b9b)
Mustache のコマンドラインツールを Go で作った

# Musta

Go の習作で、前から欲しかった小さなツールを作ってみました。
https://github.com/shiwano/musta
リポジトリはここ。

# インストール

Mac の人は brew でインストールできます。

```bash
brew tap shiwano/formulas
brew install musta
```

それ以外の環境の人は、 [releases](https://github.com/shiwano/musta/releases) のバイナリを直接ダウンロードするか、`go get` で。

# 使い方

使い方はシンプルで、テンプレートファイルがある場合は、

```bash
$ cat template.mustache
foo: {{foo}}
$ musta -t template.mustache foo=bar
foo: bar
```

こんな感じでテンプレートファイル名と `key=value` の引数を与えてあげることで、文字列を生成できます。

```bash
$ musta -t template.mustache foo.bar=1 qux=1,2,3
```

引数はこんな感じのも OK で、

```bash
$ cat args.json | musta -T 'foo: {{foo}}' >> result.txt
```

テンプレート文字列を `-T | --template-data` オプションで直接渡したり、JSON データをパイプで渡したりもできます。

いろいろ凝った文字列生成をシェル芸でやるのに疲れた人とか、マルチプラットフォームで同じツールで文字列生成したいみたいな人に試してもらえたらいいかなーという感じのツールです。
git pullを対話的に実行する


## 使い方

どういうことかというと、`git pull -i`を打てば、shellと対話しながらpullできるというシロモノです。
こんな感じ。

```shell
$ git pull -i
Please input remote (default: origin) upstream
Please input branch (default: master) master

# file diff
.gitignore                                            |      1 +
app/assets/javascripts/hoge.coffee                    |      7 +
app/controllers/hoge_controller.rb                    |      2 +-
3 files changed, 9 insertions(+), 1 deletions(-)

Are you sure you want to run? (y/N)
```

リモートリポジトリとローカルブランチを入力すると試しにdiffし、yesを入力すればpullを、noを入力すればpullがキャンセルされます。

## やり方

githubから該当リポジトリをcloneします。
[ファイル自体](https://raw.githubusercontent.com/shibukk/git-extensions/master/pull_interactive.sh)をコピペして置くだけでも大丈夫です。

```git
git clone git@github.com:shibukk/git-extensions.git
```

`.bashrc`や`.zshrc`に下記を記述します。
設置したshellのパスにするのと、shellの再起動を必ずしてください。

```zsh:.zshrc
function git() {
    sh ~/git-extensions/pull_interactive.sh $@
}
```

あとは`git pull`するときに`-i`をつけるだけで対話的にpullしてくれます。

## 説明など

gitコマンド全体をラップしてshellに渡します。

```zsh:.zshrc
function git() {
    sh ~/git-extensions/pull_interactive.sh $@
}
```

`getopts`だとpullの後にオプションが続く場合に取得できなかったので、`$*`をループして取得しています。

```shell:~/git-extensions/pull_interactive.sh
# -iオプションがあるかどうか確認する
i_option_flg=0
for opt in $*
do
  case $opt in
    '-i' )
      i_option_flg=1
      ;;
  esac
done
```

`git diff --stat`を利用して、`git pull`を擬似的にdry-runします。

```shell:~/git-extensions/pull_interactive.sh
# dry-runをする
command git fetch $remote
command git diff --stat-width=500 $branch..$remote/$branch
```

yes/noの確認メッセージは[こちらのサイト](http://tohka383.hatenablog.jp/entry/20111227/1324979198)を参考にしました。分かりやすい解説ありがとうございました。
AWS Route53のFailover機能を利用したSorry Pageの実装

# 目的

ELBで運用しているEC2上のWebサーバーがなんらかの理由でアクセス負荷になりサーバーすべてが切り離されてしまい、その後サービス続行になってしまうような状況が訪れてしまった場合に、自動的にいわゆるSorryPage（「現在サービスに不具合があります」みたいな）を表示することができるようにします。

# 利用するサービス

- Route53によるDNSフェイルオーバー機能
- ElasticBeanstalk
- EC2
- S3によるWebホスティング

# 構成

ElasticBeanstalkで構成した以下のような簡単な構成で実験してみます。
ElasticBeanstalkによる環境の構成手順は省略します。

```
           ↓
+-----------------------+
| Elastic Load Balancer |
+-----------------------+
  ↓                   ↓
+-----+            +-----+
| EC2 |            | EC2 |
+-----+            +-----+
```

ELBにぶらさがったEC2が両方ともfailしてしまいELBからアクセスを振り分けられなくなる障害を想定します。

# 準備

## Webドメイン

```radioboo-example.xyz``` というドメインを想定します。

## S3静的ウェブホスティング上にSorryページ設置

- S3上にradioboo-example.xyzという名前のバケットを作成します
 - Webサイトホスティングを有効化
 - 適当なindex.htmlなどを配置しそれをSorryPageとします
 - ```http://radioboo-example.xyz.s3-website-ap-northeast-1.amazonaws.com/``` のようなURLでアクセスできることを確認しておきます。


## Route 53の設定

### Primaryホストゾーンの設定

以下のようにPrimaryホストゾーンを設定しておきます。

- Nameはアクセスドメインを設定。この場合、```radioboo-example.xyz``` を設定します。
- Alias TargetはELBのドメインを指定
- Evaluate Target Healthを"Yes"にしておくことでELBのヘルスチェックと連携してFailoverを実行してくれます。

![スクリーンショット 2015-08-25 1.00.07.png](https://qiita-image-store.s3.amazonaws.com/0/30355/4eb2696c-a04f-82ab-e4d3-ad2fc94e67b3.png)


### Secondaryホストゾーンの設定

以下のようにSecondaryホストゾーンを設定しておきます。

- Nameはアクセスドメインを設定。この場合、Primaryと同様に、 ```radioboo-example.xyz``` を設定します。
- Alias TargetはS3で建てたウェブホスティングのドメインを指定

![スクリーンショット 2015-08-25 1.21.27.png](https://qiita-image-store.s3.amazonaws.com/0/30355/c0512495-af2b-6a2b-77a7-8b74616d3398.png)


# 挙動テスト

## 障害をシミュレート

- 挙動を確認するため、EC2をELBからわざと切り離してみます。EC2のコンソールから主導で切り離してみます。
- しばらく待つとS3から配信しているSorryPageに切り替わりました。

![スクリーンショット 2015-08-25 1.35.08.png](https://qiita-image-store.s3.amazonaws.com/0/30355/9c2ef720-9601-0e38-087f-0b16d05c3fce.png)

## 復帰をシミュレート

- 障害からの復帰を想定して、ELBにEC2を主導で復帰させます。
- しばらく待つと勝手にEC2から配信している通常のサービスページに切り替わりました。

![スクリーンショット 2015-08-25 1.43.29.png](https://qiita-image-store.s3.amazonaws.com/0/30355/d013e990-a145-d06b-66e3-f89b3ca15db5.png)


以上です。
Route53のfailover機能を使えば、非常に簡単に実装できました。
SocketIOでdisconnectを瞬時に取得

私は、アプリとNodeJSでチャットのアプリケーションを作成している者です

私が開発中に気づいたSocketIOについてメモしたいと思います。

<h2>デバックしている時に下記のことがわかりました</h2>

サーバ側で<strong>disconnect</strong>イベントが発生する時にタイムラグがある。</h1>

クライアント側でsocketを閉じてからサーバ側でdisconnectを取得するまで<strong>約30秒</strong>あることが分かりました。

<h2>解決方法模索</h2>
stackoverflowで解決方法を探しました

これを見つけました。
http://stackoverflow.com/questions/32089796/i-want-to-detect-disconnect-event-as-soon-as-app-user-close-the-socket


どうやら、クライアント側で明白にsocket.disconnect()でソケットをクローズしないとサーバ側でdiscconectを即座に取得できないみたいです。



<h2>解決方法</h2>
・ソケットを閉じる場合は必ず<strong>socket.disconnect()</strong>をする。
・socket.io の heartbeatsを用いて設定された時間で生存確認をする

上記の2つを実装することにしました。

<h2>実装</h2>
今回、下記のように設定しました。

```socketServer.js

var io = require('socket.io').listen(port);

io.set('heartbeat interval', 5000);

io.set('heartbeat timeout', 15000);

io.sockets.on('connection', function (socket) {
    //イベント処理...
});
```

以上、ご参考になれば幸いです。
WisReedとは


2015/8/6 
[IoT 実現に向けた無線センサーネットワークの評価キットを提供開始 ～富士通のスマートネットワーク技術をモジュール化～](http://www.fujitsu.com/jp/group/fei/resources/news/topics/2015/20150806.html) 
こんなニュースを見かけた。

WisReed? 何それ？

ということで、ちょっとだけ調べてみた。
以下、WisReedを中心に調べたため、いいことばっかり並んでいる感じでフェアじゃない気がするので、そのつもりで眺めるのがよいと思います。

#いつからの話？

どうも2009年からFUJITSUで研究している自立分散型のスマートネットワークの仕組みらしい。
ググった中で最も古いと思われるのは[こちら](http://blogs.yahoo.co.jp/hose_solar/25325050.html)の富士通フォーラム2010。

#どんな内容？
[インテリジェントソサエティを支えるネットワーク技術：WisReed](http://img.jp.fujitsu.com/downloads/jp/jmag/vol62-3/paper15.pdf)
これによれば、

- 設定不要でネットワークを自動構築する
- 障害発生の際にも自己修復する

通信技術のこと。らしい。

OSI参照モデルでいうと、Layer2 とLayer3の一部とのこと。無線への適用に適しているが、有線への適用も可能らしい。

#ZigBeeと比べて
[この資料](http://www.metering.com/wp-content/uploads/Hitoshi_Tanaka.pdf)のp21によれば、こんな感じらしい。

| 　 | WisReed | ZigBee |
|:--:|:-------:|:------:|
|Routing| Proactive | Reactive |
|Scalability| 1000 nodes |  10 nodes |
|Flexibility | Wire/Wireless | Wireless only |
|Security    | different key coding in each node | Based on Internet technology |


#ルーティングプロトコル

経路を決定してからデータを配送するのではなく、データを近くの人にバケツリレーしながら宛先に届くまで回し続ける、という感じで、深さ優先探索というようだ。
メリットとして

- 経路探索用のパケットが不要
- 通信路に障害が発生した時に冗長経路へ迂回しやすい
というのは、わかる気がする。

デメリットについては、、書いてないw。
それぞれの端末からのたくさんのデータがうまくルーティングできるのかは、ちょっと予想がつかないけど、どんなもんなんだろうね？

#実績
実際、[関西電力の200万台で採用](http://www.kankyo-business.jp/news/006271.php)とあるからうまくいっているということなんだろうか。
すごいなぁ。

2013年には、村田製作所がET2013で[WisReedを用いた展示](http://www.murata.com/ja-jp/about/newsroom/news/event/japan/2013/1114b)をしていたんですね。

#IETF
[RFC 6971](https://tools.ietf.org/html/rfc6971)として採用されたらしい。Experimentalとして。

#特許
このあたりが関係ありそうな気がするけど、どうなんでしょう？


- [ノード装置およびデータ送信方法](http://astamuse.com/ja/granted/JP/No/5477462)
- [ノード装置及びプログラム](http://astamuse.com/ja/granted/JP/No/5569604)



#まとめ
残念ながら、技術の肝の部分はよく理解してません。
まぁいいや。ここまで。

おわり。
Phoenix アプリケーションを作成する

Mac で Phoenix アプリケーションを作成してみます。

## 環境

* Mac OSX 10.10.3
* elixir 1.0.5
* node 0.12.7
* npm 2.12.1

Phoenix はコンパイル時に node と npm を使います。これらのバージョンが古いとうまくいかないことがありますので、忘れずにバージョンを上げておきましょう。

## Phoenix のインストール

インストールはとても簡単で、[公式サイトの Installation](http://www.phoenixframework.org/docs/installation) にある通り、以下のコマンドを実行するだけです。

```bash
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.17.0/phoenix_new-0.17.0.ez
```

version 表記は適宜[最新のもの](https://github.com/phoenixframework/phoenix/releases)に書きかえてください。

## Phoenix アプリケーションの作成

以下のコマンドでアプリケーション *sample_app* を作成します。

```bash
$ mix phoenix.new sample_app
```

途中、依存関係インストールに関する問いかけがありますが、`Y` もしくは `Enter` で応えておきます。

## とりあえず動かす

作成が終わったらすぐに動かせます。

生成されたディレクトリに移動し、サーバを立ち上げてみましょう。

```bash
$ cd sample app
$ mix phoenix.server
```

コンパイルに少し時間がかかるかもしれませんが、以下のように表示されたら完了です

```bash
...
Compiled lib/sample_app/endpoint.ex
Generated sample_app app
[info] Running SampleApp.Endpoint with Cowboy on http://localhost:4000
25 Aug 01:50:23 - info: compiled 5 files into 2 files, copied 3 in 5770ms
```

さっそくブラウザで確認してみます。

![スクリーンショット 2015-08-25 1.51.07.png](https://qiita-image-store.s3.amazonaws.com/0/77513/2d8e58b5-17fe-acab-08fb-705b6b0f5e2c.png)

無事に立ち上がりました。

DB の設定やらなにやらも簡単にできるようなのですが、今回はとりあえずここまでの動作確認とします。
module Kernel.#requireを簡単に正確に理解する。


# 定義

module Kernel : http://docs.ruby-lang.org/en/2.0.0/Kernel.html#method-i-require

![スクリーンショット 2015-08-25 0.20.58.png](https://qiita-image-store.s3.amazonaws.com/0/71616/f116cb93-d772-fe4e-2c01-05ff58db8341.png "スクリーンショット 2015-08-25 0.20.58.png")


まとめると、gemを含むパスの先にファイルが存在すれば読み込みます。
しかし、一度読み込まれたファイルの場合falseを返します。


# 実践

## fileの読み込み
sample/hoge.rb

```

require './fuga.rb'


```


sample/fuga.rb


```

p 'fuga'

```

terminal

```

geshi@localhost:(master*) $ruby hoge.rb
fuga

```

## requireの戻り値
sample/hoge.rb

```

p require './fuga.rb'
p require './fuga.rb'

```


terminal

```

geshi@localhost:(master*) $ruby hoge.rb
true
false

```

# 補足


## パスについて
パスを指定しないとgemファイルを参照します。例えば、
![スクリーンショット 2015-08-25 1.06.19.png](https://qiita-image-store.s3.amazonaws.com/0/71616/1f7f99aa-84d3-46f4-6ea9-ec6f7a54f6f8.png "スクリーンショット 2015-08-25 1.06.19.png")


gemにhoge.rbという適当なファイルを作成し、デスクトップにあるfuga.rbに

```
require 'hoge'
```
と呼び出すと、gemファイルのhoge.rbを読み込んでくれます。



## 拡張子について
拡張子は基本的につけなくても補完してくれます。
つまり

```
require './hoge'
```

でも、hoge.rbを読み込んでくれます。
【R】ソース呼び出し・インポート

Rであーる(駄洒落)ソースから呼び出しをかけたいときに使う。
同じworking directoryでないと使えない小技。
決まった処理とかある場合にくっそ便利だったり。

PHPでいったら

```lang:import.php
<?php include("honoka.php"); ?>
```

Pythonでいったら

```lang:import.py
import honoka
```
みたいな感じ。


```lang:import.R
source("honoka.R")
```

これでOK。単純。

---------------------

# 追記

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/wonder_zone">@wonder_zone</a> ふつうにsource(&quot;~/hoge.R&quot;)とか。あと、たとえばここの「ソース」にあるようにwebだったらURL指定しても呼び出せる <a href="http://t.co/rDnclPRhzV">http://t.co/rDnclPRhzV</a></p>&mdash; リラク (@dichika) <a href="https://twitter.com/dichika/status/635837689036607488">2015, 8月 24</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

R界の素敵なおじさまから素敵なアドバイスを受けました。
こちらで確認(MacOSX, Windows10, Fedora)してみたところ、相対パス・絶対パスともにOKでした。
ただ、絶対パスはOS間で移動させた場合にあまりよろしく無いので、相対パスで指定するのが一番多そうですね(たぶん)。
C#でスリープソート書きました

#スリープソートとは
海外掲示板4chanのユーザーにより発表された究極のソートアルゴリズム。
具体的な手順は以下のように超シンプルなもの。

1. 配列から値を読み込み、その値だけの時間スリープする
2. スリープし終わったらその値を出力する

これを配列の全ての値に対して並列処理してやると、値の小さい方から順に出力される。
比較回数0回、計算量ほぼ0という驚愕の事実に加え、安定ソートであるという優れもの。
（実行時間とメモリに目をつぶれば）
#実装してみた
自分のようなひよっこ入門プログラマーにはちょうどいい練習だと思ったので、n番煎じを気にせずやってみた。

```csharp
    public static class Extensions
    {
        public static IEnumerable<T> SleepSort<T>(this IEnumerable<T> source, Func<T, int> selector)
        {
            var list = new List<T>();
            var sync = new Object();
            var tasks = source.Select(async item =>
            {
                //System.Threading.Thread.Sleep(100); //これをつけると安定ソートとなる
                await Task.Delay(TimeSpan.FromSeconds(selector(item)));
                lock (sync) { list.Add(item); }
            }).ToArray();
            Task.WaitAll(tasks);
            return list;
        }

        public static IEnumerable<int> SleepSort(this IEnumerable<int> source)
        {
            return SleepSort(source, i => i);
        }
    }
```

LINQっぽくIEnumerable\<T\>の拡張メソッドに。また、引数にセレクタを使うことで汎用性を高めておく。（そのため、普通のint配列のソートを後でオーバーロードした）
##実行
```csharp:実行例
        static void Main(string[] args)
        {
            var list = new[] { "Alice", "Bob", "Cate", "David", "Eve" };
            foreach (var item in list.SleepSort(s => s.Length))
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
            return;
        }
```

```:結果
Bob
Eve
Cate
David
Alice
```
どうもC#で並列処理すると各タスクの実行順序がまちまちで、安定ソートにならない模様。
どうしても安定させたい場合は、Thread.Sleepを用いて各タスクの実行開始をわずかにずらすことで解決する。
#まとめ
わかってはいたが、実行に時間がかかりすぎる。
実はこれが初めての並列処理で、自分にとってはとても素晴らしい練習問題になったと思う。
同じくらいの入門者の方は是非とも挑戦してほしい。
lsofコマンド

#lsofコマンドとは
 "list open files"の意味。
オープン中のファイルやそのファイルをオープンしているプロセスのリストを出力するコマンド

#ファイル名を指定
`lsof <ファイル名>`

#ポートを指定
・9000ポートをオープンしているプロセスを調べる
`lsof -i:9000`

・9000ポートと8080ポートをオープンしているプロセスを調べる
`lsof -i:9000,8080`

#プロセス名を指定
`lsof -c ssh`

#ユーザ名を指定
`lsof  -u ユーザ名`
kickstartで作業用アカウントを設定する

クラウドサービス/ローカルな仮想マシンを利用していると起動イメージ作成時点ですでにユーザーなどの環境は作成済みの場合も多く…というかほとんどそうなので今更感があるのですが、素のISOイメージから起動して作成する際に役立つと思っている(役立った)設定です。
作業用アカウントを作成し、必要なときはsudoで一時的に権限を使用することで作業中の安全性を高めることが出来ます。

このエントリーの内容を盛り込んだkickstartを行えば、起動後の構築時にssh経由での作業を行う場合の準備などに使えると思います。[packer](https://www.packer.io)などで構成される際にいかがでしょう。

# kickstartにおける先人の知恵

以下の情報は非常に有用でした。ありがとうございます。

- 実例として [時雨堂 packer-templates](https://github.com/shiguredo/packer-templates)
- 公式として [RedHat Customer Portal Chapter 23. Kickstart installations](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/chap-kickstart-installations.html)

kickstartはバージョンが違っても大枠は同じです。 `%end` の扱いなどでハマりましたが…
それにしてもRedHatのドキュメントはkickstartにかぎらず非常に有用です。

# アカウント追加の方針・実施内容

`cloudpack` というアカウントを追加する前提で進めます。
このアカウントはsudoが可能で、パスワードは `cloudpack` とします。
構築を済ませてssh公開鍵設定などが終わり次第、パスワードは抜く・sshd_configを調整する、は最低限実施しましょう。

## アカウントを追加する

以下1行にてアカウントを追加します。rootpwの後あたりに入れます。

```
user --name=cloudpack --uid=500 --groups=cloudpack,wheel --password=cloudpack
```

## sudoにかかるバイナリ導入および事前作業を自動で実施する

`%post` の中に入れます。ひと通りの校正が終わった後の処理として実行されます。
shellで解釈できる内容であれば問題なく実行されます。

### sudo導入
- yumにてsudoを導入する(その前のpackagesで実施してもよい)

### sudoers.d/ 以下へアカウント別設定ファイルの作成
- sudoers.d/cloudpack を作成し、cloudpackアカウントでのsudo権限を設定する
- sudoers.d/cloudpack のファイル権限を `0440` とし、正しくsudoが認識するようにする

### リモートからの自動作業に支障をきたさないための設定
- リモートからの作業に支障を来さないようにrequirettyをコメントアウトする

### 設定例
```
%post
/usr/bin/yum -y install sudo
echo "cloudpack        ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers.d/cloudpack
chmod 0440 /etc/sudoers.d/cloudpack
sed -i.bak "s/^.*requiretty/#Defaults requiretty/" /etc/sudoers
%end
```
git branchの備忘録

#ローカルリポジトリにブランチの作成
`git branch <branchname>`

#リモートリポジトリにブランチを追加
`git push origin <branchname>`

#ブランチ一覧表示
`git branch`
※ -a オプションを付けると、リモートブランチも含めたブランチの一覧表示

#ローカルブランチの切り替え
`git checkout <branchname>`

#リモートブランチの切り替え
`git checkout -b <branchname> origin/<branchname>`

#ブランチの削除
`git branch -d <branchname>`

#ブランチ名の変更
`git branch -m <oldbranch> <newbranch>`