OmniAICreator/Qiita-1.07M huggingface dataset:
sed による置換で改行\nを出力する

こんにちは。
sed による置換で改行```\n```を出力する方法を調べました。
* ```\n``` をコマンド引数内へ指定する方法がそれほど率直ではないです。
* なお perl ではより率直に実現できます（下記）。

### GNU sed

GNU sed では下記のようにすれば良いです（クォーテーションマークの書き方には変種があります）。

```console
$ echo "aa\nbb\ncc" | gsed "s/\\\\n/\n/g"
$ echo "aa\nbb\ncc" | gsed -r 's/\\n/\n/g'
aa
bb
cc
```

### 一般の sed

一般の sed で動かすためには一手間必要でした。ただし、```\n``` を同様に直接書き入れるために、bash の助けを借りています。

```console
$ echo "aa\nbb\ncc" | sed s/\\\\n/\\$'\n'/g
$ echo "aa\nbb\ncc" | sed s/'\\n/\'$'\n'/g
$ echo "aa\nbb\ncc" | sed 's/\\n/\'$'\n/g'
aa
bb
cc
```

この方法は何度も話題になっているようで、下記で見つけました。

- [Newlines in sed on Mac](http://nlfiedler.github.io/2010/12/05/newlines-in-sed-on-mac.html)
- [BSD sedでのスマートな改行出力](http://rcmdnk.github.io/blog/2014/09/21/computer-bash/#bsd-sed-1)
- [sedコマンドで文字列を改行に置換する、しかもスマートに置換する。](http://qiita.com/richmikan@github/items/3c74212b0d8dec9bd00f)

#### bash の助けを借りない方法
下記は bash の助けを借りない方法による例です。なお上記も参考になりました。

```console
$ echo "aa\nbb\ncc" | sed 's/\\n/\
/g'
aa
bb
cc
```

もしくは、改行を表す文字列変数を一旦作り[^1]、それを用いる方法もあります。

```console
$ LF=$(printf '\n_');LF=${LF%_}
$ echo "aa\nbb\ncc" | sed 's/\\n/'"$LF"'/g'
```

[^1]: 「[シェルの文字列変数に改行を書き入れる方法](https://qiita.com/kkdd/items/6b0534b3b64639ac3e25)」の記事でも bash の助けを借りない方法に触れています。

### perl コマンド
なお perl を使えばより率直に実現できます[^2] [^3]。

[^2]: 参考：「[環境に依存しないワンライナーを書くならsedよりperlの方がいい](https://qiita.com/takc923/items/8654d69008e921c9c9fb)」
[^3]: したがって上記のように苦労して sed を使う必要は無いとも言えます。

```
$ echo "aa\nbb\ncc" | perl -pe 's/\\n/\n/g'
aa
bb
cc
```

### tr コマンド

さらに置換対象が一文字ならば、tr が最も簡素と思います。

```console
$ echo "aa:bb:cc" | tr ':' '\n'
aa
bb
cc
```
Elysia Cron モジュールにて、予期せぬタイミングでバッチがキックされた件

#Elysia Cron モジュールにて、予期せぬタイミングでバッチがキックされた件

##背景/事象
* "0 10 * * * (毎日AM10:00)" にバッチをキックしたい
* cronは毎時で動いている
* 14:01に設定・リリースが完了！明日のAM10:00が楽しみ！
* リリースから1時間後の15:00にバッチがキックされた！？！？なんでｔぅ！？

##原因
Elysia Cron モジュールは、elysia_cron テーブルをcreateして、バッチ(hook_cronの実装)を管理する。
elysia_cron テーブルの"last_run"カラムはその名の通り、最後の実行された時間を保持する。
cronが動くと、"last_run"を見に行いく。
"last_run"が入っていない[^1] または "0 10 * * *"の通り直近で実行されていない場合[^2]、
「やべーよ！AM10:00過ぎてるのにまだ実行できてねーよ！実行せにゃ！」って感じで、
親切にバッチをキックする。

**有難迷惑ですね...**

##対策
リリース時、elysia_cron テーブルに新規で追加したバッチ管理用のレコードをinsertする。
その際、"last_run"カラムを適当な値で更新してあげればよい。


[^1]: last_runカラムはinteger型
[^2]: (例)日次バッチでAM10:00で動くはずが、15:00現在、last_runの値が昨日のAM10:00のまま
AngulerJSで入れ子ループ時の親$indexを取得する


modelにセットされているjsonが入れ子の場合、ループを入れ子にすることがあると思います。
そんなときの親$indexの取得のやり方です。

Angular 1.x系です。


```
<li ng-repeat="thing in things" ng-init="parentIndex = $index">
    <ul>
        <li ng-repeat="value in thing.values">
            {{ value }} 
            {{ $index }} <!-- 入れ子の $index -->
            {{ $parent.$index }} <!-- 親のindex -->
            {{ parentIndex }} <!-- これも親のindex -->
            {{ $parent.$parent.$index }} <!-- 引数にするときの親はなぜかこれだった？ -->
        </li>
    </ul>
</li>
```
コミット履歴の改善に役立つ git rebase -i 5つの使い方


今まで rebase は、基本的に`git rebase origin/master`しか使ってきませんでした。
リモートに push されていると何かと悪さをするやつだと思って、あまり関心がありませんでした。

しかしローカルで作業している限り便利なものだと知ったので、`git rebase -i` の機能の一部分をまとめました。

- git version 2.6.4


# 1.コミット名の編集

`pick` を `r` に変更します


```bash
$ git rebase -i HEAD~~
```

テキストエディタが開いて、HEADからHEAD~~までのコミット表示されるので、以下のように変更します。

```
# 変更前
pick 26ef747 A

# 変更後
r 26ef747 A
```

テキストエディタを終了するとすぐに、コミットの編集画面が表示されるので、コミット名を変更します。

```
  A

  # Please enter the commit message for your changes. Lines starting
  # with '#' will be ignored, and an empty message aborts the commit.
  #
  # Date:      Tue Mar 22 22:49:23 2016 +0900
  #
  # interactive rebase in progress; onto f98d1ca
  # Last command done (1 command done):
  #    r 2f4e52f A
  # No commands remaining.
  # You are currently editing a commit while rebasing branch 'master' on 'f98d1ca'.
  #

```

# 2.コミットの編集

`pick` を `e` に変更します

[6. rebase -i でコミットを修正する【チュートリアル3 コミットを書き換えよう！】 _ サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 _ どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/stepup/stepup7_6.html) 

## 補足

`git  commit --amend`実行時にコミット名も変更することが出来ます。


# 3.コミットをまとめる

`pick` を `s` に変更します


```bash
$ git rebase -i HEAD~~
```

テキストエディタが開いて、HEAD から HEAD~~ までのコミット表示されるので、以下のように変更します。

```
# 変更前
pick 195172f A
pick c064177 B
pick 0a1df4a C
pick 36d169f D

# 変更後
pick 195172f A
s c064177 B
pick 0a1df4a C
pick 36d169f D
```

コンフリクトが起きた場合、コンフリクト部分を修正後に下記を実行

```bash
$ git add path/to/dir path/to/file
$ git rebase --continue
```

## 補足

squash は直前のコミットにまとめます。
上記の rebase では、以下のようなコミットを

```
A---B---C---D
```

コミットBの`pick` を `s`に変更し

```
AB'---C---D
```

のようにします。



###合わせ技
以下の様なコミットがあって、

```
A---B---C---D  master
```

以下のようにしたい時は、

```
AC'---B---D  master 
```

「コミットの順番を変更する」を組み合わせることでできます。

# 4.コミットの削除

`pick` を `d` に変更します

```bash
$ git rebase -i HEAD~~
```

テキストエディタが開いて、HEADからHEAD~~までのコミット表示されるので、以下のように変更します。

```
# 変更前
pick a42f9e0 B

# 変更後
d a42f9e0 B
```

コンフリクトが起きた場合、コンフリクト部分を修正後に下記を実行

```bash
$ git add path/to/dir path/to/file
$ git rebase --continue
```


# 5.コミットの順番の変更
文字通りコミットの順番を変更します。

```bash
$ git rebase -i HEAD~~
```

テキストエディタが開いて、HEADからHEAD~~までのコミット表示されるので、以下のように変更します。

```
# 変更前
pick 26ef747 A
pick a42f9e0 B

# 変更後
pick a42f9e0 B
pick 26ef747 A
```

コンフリクトが起きた場合、コンフリクト部分を修正後に下記を実行

```bash
$ git add path/to/dir path/to/file
$ git rebase --continue
```

#rebase で行った修正を取り消したい場合

rebaseを行った直後であれば以下のコマンドで戻せます。

```bash
$  git reset --hard ORIG_HEAD
```

もっと前に戻したければreflogから、戻したいコミットIDを取得します。

```bash
$ git reflog
$ git reset --hard commit_id
```

# Tips

下記のコマンドはmasterとカレントブランチの分岐点のコミットIDを表示します。

```bash
$ git show-branch --merge-base master HEAD
```

このコマンドと `git rebase -i` を組み合わせて

```bash
$ git rebase -i $(git show-branch --merge-base master HEAD)
```

とやると、作業ブランチのコミットだけを表示できるので便利。
CUPS 印刷システム

http://ayufishing.blog.fc2.com/blog-entry-8.html

Linuxのプリンタドライバについて

Linux上で動くプリンタドライバについて知る

####「CUPS」：Linuxの印刷システム
・CUPSは印刷ジョブを受け取り、プリンタへ印刷データを送信する

####「Postscript」：Linuxの印刷データを扱う形式、ページ記述言語

####「Ghostscript」：Postscript をラスタデータに変換するインタプリタ
openFrameworksをPythonから動かす

# まだ動かせてないです！！参考までに．
Ubuntu14.04を利用
# openFrameworksとは
クリエイティブコーディング向き
processing的なことをC++で出来るようにするライブラリ

# openFrameworksのセットアップ
###ダウンロード
Ubuntu版を想定
安定版でofxPythonと整合性の取れる0.9.0をダウンロード
http://openframeworks.cc/ja/download/older/

###コンパイル
```bash
cd OF/scripts/linux/ubuntu
sudo ./install_dependencies.sh
sudo ./install_codecs.sh
cd OF/scripts/linux
./compileOF.sh -j3
```

###exampleの実行
```bash
cd OF/examples/graphics/polygonExample
make
make Run
```

# ofxPythonのセットアップ
### ダウンロード
```bash 
cd OF/addons
git clone https://github.com/chaosct/ofxPython --recursive
```

### コンパイル
`swig`は3.0を落としてソースからインストールすると動いた。
apt-getで入る2.~ではエラーが出て失敗する。
**generatebindings.sh**内のファイルパス`"~CallBack"`を`"~Callback"`に修正する(Ubuntuでの動作テスがはされていない？)

```bash
cd OF/addons/ofxPython
./generatebindings.sh
```

### exampleの実行
```bash
cd OF/addons/
```
動かない。
どうやら上のステップをこなした後にC++をコンパイルして実行ファイルを生成しなければならないようだが、サンプルはVSのものしか無い。
このバインドはpythonインタプリタを直接呼び出すのではなく、pythonで書いたコードをC++から読み込んでコンパイルするものかもしれない。
[Laravel5] Middlewareで取得した値をControllerで使う方法

## 概要
Laravel5から使える機能にMiddlewareがあります。
Controllerの前処理、後処理を実装する時に使うやつです。

前処理をするMiddlewareで取得した値をviewに渡すのはView::shareを使って簡単にできたのですが、Controllerに渡すのに手こずったので、備忘録として記録しておきます。

## やり方
まずMiddlewareクラスを作成します。
今回はDBから適当な値を取得して、Controllerに渡すようにしています。

Controllerに値を渡すためには、handleに渡ってくるrequestインスタンスに配列を追加しているところがすべてです。
requestインスタンスはController側で引き継がれるのでController側で値を取り出すことができます。

```php:HogeMiddleware
<?php

namespace App\Http\Middleware;

use Closure;

class HogeMiddleware
{

    public function handle($request, Closure $next)
    {
        // オブジェクトを取得
        $hoge = Hoge::find(10);
        $request->merge(['hoge' => $hoge]);
        
        return $next($request);
    }
}
```

作成したMiddlewareを使用できるように、Kernel.phpクラスに、作成したMiddlewareのrouteを追加

```php:Kernel.php
  
    protected $routeMiddleware = [
        // この1行追加
        'hoge' => 'App\Http\Middleware\HogeMiddleware'
    ];
```

最後にControllerで使われるように、コンストラクタでMiddlewareを呼び出します。

```php:HogeController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class HogeController extends Controller
{
    
    public function __construct()
    {
        // 作成したMiddlewareを呼び出し
        $this->middleware('hoge');
    }

    // RequestインスタンスをInject
    public function show(Request $request)
    {
        // Requestインスタンスから、Middlewareでセットした値を取得
        $hoge = $request->hoge;

        return response()->json($hoge);
    }

```

若干分かりづらいかもしれませんが、
このようにして値をMiddlewareからControllerに受け渡すことができました。

## 参考
http://stackoverflow.com/questions/30212390/laravel-middleware-return-variable-to-controller
PHPでNullableなタイプヒントを書く

意外と知られていないような気がしたので。

普通にタイプヒントを書くと、nullを許可しない設定になる。

```php
<?php
function f1(int $i) {
  return $i;
}
f1(null); //エラーが発生する
```

デフォルト引数をnullにしておくと、nullを許可する設定になる。

```php
<?php
function f2(int $i = null) {
  return $i;
}
f2(null); //エラーが起きない
```

この性質はスカラ型, array, callable, クラス, 全部使える。
もちろん受け取った側はnullかどうかチェックした上で操作しなければならない。

ただし、戻り値のヒントの場合は使えない。
Struts2.3.28 ← 2.3.24(.1)のバージョンアップの注意点

# リビジョンのアップだけですが…

一部のセキュリティパッチを含む新バージョンがリリースされましたが、相変わらず裏パッチというか、謎のリファクタリングによって下位互換性が失われているものがあります。

特に変わった使い方をしていなければ動作に支障はありませんが、ドラスティックに変更を入れている個所があります。

## 重大な変更点

セキュリティパッチと、一部の不具合解消です。

セキュリティパッチについては特にいうことはなく、最新バージョンにしましょう、の方針は間違いないです。

## 下位互換性が壊れたところ

xworkパッケージの一部のクラス/インタフェースが **移動** しています。

代表的なところでは、ValidationAware インタフェースです。このインタフェースは基本的にActionSupport継承しているActionクラスであれば独自実装していることはないと思うのですが、Actionクラスに機能追加している場合は、インタフェースの所属しているパッケージが移動しています。

## それ以外の影響について

大きな変更はなく、各種プラグインも問題なく動作しているようです。
Rails4.1から導入されたActionPack  Variantsを使ってviewを切り分ける

自分で実験的に作っているサイトでデバイス毎にviewを切り分けたいなと思い、以前軽く試したActionPack　Variantsを使ってみたので、忘れ無いようにメモを残す

# ActionPack Variantsでviewを切り分ける流れ
ざっくりと流れをいうと
1. uaを見てどのデバイスからのアクセスか判定する
2. 判定して例えばtabletだとしたら、<code>request.variant = :tabletをセット
3. render処理で「app/views/hogehoge/**.html+tablet.slim」の中身をレンダリングする

## 今回使った方法
### ua判定
上記の流れの通りなのだが、1のua判定のところをどうしようかなぁって思っていたら、別の方が[browser](https://github.com/fnando/browser)というgemを使ってやっていたので、そのgemを使うことにした。
これを使うと例えば、

```
request.variant = : tablet if browser.device.tablet?
```

みたいな実装ができるので、これを使うことにした。

## コード例
```hoges_controller.rb

class HogesController  < ApplicationController
  before_action :set_request_variant

  private

  def set_request_variant
     request.variant = :tablet if browser.device.tablet?
     request.variant = :android if browser.platform.android?
  end

end
```

```index.html+tablet.slim
| tablet端末だよ
```

```index.html+android.slim
| Android端末だよ
```

こんな感じのコードになります。
実際は多分ua判定のロジックはconcernに切り出すか、親クラスに書いてやるのが良いかと思います。
今回はconcernに切り出したりしました。
vim初心者が覚えておきたい操作


vim入門レベルの操作をチートシート的にまとめます。

#全般
| 操作 | 概要 |
|:-----------|:-----------|
| v | ビジュアルモードに切り替え |
| x | 一文字削除 |
| dd | 一行削除（先頭に数字で複数行） |
| yy | コピー（先頭に数字で複数行） |
| p | 貼り付け |
| u | 元に戻す |
| ctrl + r | やり直す |
| . | 直前の操作を繰り返す |
| ctrl + n | （変数名など）補完する |
| = | インデントを揃える |

#移動
| 操作 | 概要 |
|:-----------|:-----------|
| gg | ファイルの先頭へ |
| G | ファイルの末尾へ |
| Control + f / b | ページごとに進む／戻る |
| w / b | 単語ごとに進む／戻る |
| ^ | 行頭へ |
| $ | 行末へ |
| f [文字] | 対応する次の文字に移動する（;で次へ） |
| % | 対応するカッコへ |

#検索
| 操作 | 概要 |
|:-----------|:-----------|
| /単語 | 単語を検索する。nで下方向、Nで上方向に検索 |
| * | カーソルのある単語を下方向に検索 |
| # | カーソルのある単語を上方向に検索 |

#置換
| 操作 | 概要 |
|:-----------|:-----------|
| :s/単語A/単語B/ | カーソル行の単語Aを単語Bに置換する |
| :s/単語A/単語B/g | カーソル行の単語Aをすべて単語Bに置換する 
| :%s/単語A/単語B/g | ファイル内の単語Aを単語Bに置換する |
| :%s/単語A/単語B/gc | ファイル内の単語Aを単語Bに(確認付きで)置換する |

# 選択
| 操作 | 概要 |
|:-----------|:-----------|
| V | 行単位で選択 |
| Control + v | 矩形選択 |
| gg + V + G | 全選択 |

# 画面分割
| 操作 | 概要 |
|:-----------|:-----------|
| :sp | 横に分割 |
| :vs | 縦に分割 |
| :close | 分割した画面を閉じる |
| Ctrl + ww | ウインドウ間の移動 |

# タブ
| 操作 | 概要 |
|:-----------|:-----------|
| :tabnew | 新規タブを作成 |
| :tabe ファイルA | ファイルAを新規タブで開く |
| :tabclose | タブを閉じる |
| gt | タブ間の移動 |

# テキストオブジェクト
文字の組み合わせで操作するイメージ。

1. c/d/y (変更/削除/コピー)
1. i/a (中身だけか全体か)
1. t/"/)/} (対象とするテキストオブジェクトの範囲)

| 操作 | 概要 |
|:-----------|:-----------|
| cw| 単語を変更する |
| cit| タグの中身を変更する |
| yi"| ダブルクォートの中身をコピーする |
| da)| 括弧も含めて削除する |

## 設定
| 操作 | 概要 |
|:-----------|:-----------|
| :set nu| 行番号を表示する |


## 参考
http://dotinstall.com/lessons/basic_vim
Mac OSX El CapitanにてDockerを利用してOPeNDAPを起動させる方法

#手順

基本的には以下のインストール方法に従います。
http://www.opendap.org/download/hyrax/1.13#Install

docker-machine, virtualbox, docker等のインストールは他を参照してください。

ホストマシンにて

```terminal 
#docker-machine にて driver を virtualbox にし、 dev 仮想マシンを立てます。 docker-machine create --driver virtualbox dev

#環境変数をexportします
eval $(docker-machine env dev)

# opendap containerを作る 
# Use CentOS:6.6
docker run  -p 8080:8080 -t -i  --name opendap centos:6.6 /bin/bash
```

コンテナにて

```
cd ~/

#update yum and install tools
yum update -y
yum install java-1.7.0 -y
yum install wget -y
yum install tar -y

#install OLFS
wget http://www.opendap.org/pub/binary/hyrax-1.13.0/centos6.6/libdap-3.17.0-1.el6.x86_64.rpm
yum install libdap-3.17.0-1.el6.x86_64.rpm -y

#install BES
wget http://www.opendap.org/pub/binary/hyrax-1.13.0/centos6.6/bes-3.17.0-1.static.el6.x86_64.rpm
yum install bes-3.17.0-1.static.el6.x86_64.rpm -y
/etc/init.d/besd start

#install opnedap
wget http://www.opendap.org/pub/olfs/olfs-1.15.0-webapp.tgz
tar -xvf olfs-1.15.0-webapp.tgz

#install tomcat
rpm -Uvh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install tomcat tomcat-admin-webapps -y

cp olfs-1.15.0-webapp/opendap.war /usr/share/tomcat/webapps/
mkdir /etc/olfs
chgrp tomcat /etc/olfs
chmod g+w /etc/olfs

service tomcat start

```

ホストマシンにて [http://localhost:8080/opendap/](http://localhost:8080/opendap/) にアクセスします。
以下のように表示されれば成功です。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/58613/c495f99c-74a8-4d6a-cc56-03de737d20d7.png "Untitled.png")

後日、実運用について書いていきます。
SwiftでKVO(Key-Value Observing)を行う

#KVOって何？
KVOというものは簡単に言うと、プロパティーの値の変化を通知してくれる仕組みのことです。
#使い方
初めは難しいかもしれないですが、実際に使ってみると簡単です。
まずはコードから

```swift:kvo.swift
import Foundation

class Person: NSObject {
    var my = My()
    let keyName = "level"
    
    override init() {
        super.init()
        my.addObserver(self, forKeyPath: keyName, options: [.New, .Old], context: nil)
        my.level += 2 // 1回目の変更
        my.level += 7 // 2回目の変更
    }
    
    deinit {
        my.removeObserver(self, forKeyPath: keyName)
    }
    
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        print("Lv UP!!")
        print("change:", change) // for Debug
    }
}

class My: NSObject {
    dynamic var level = 1
}

let p = Person()
```
必要なことは
1. My クラスの level というプロパティを監視するために My クラスの中で dynamic をつけて宣言します。
2. addObserver, removeObserver の引数である forKeyPath にはプロパティの名前を渡してあげます。(ここでは "level" となります)

このコードでは addObserver の引数である options に .New と .Old を渡してますが、これらはそれぞれ変更後のプロパティの値、変更前のプロパティの値を辞書として保存ということなります。今回プロパティの変更を2度行っています。それを踏まえて実行結果を見てみましょう。

```
Lv UP!!
change: Optional(["old": 1, "new": 3, "kind": 1])
Lv UP!!
change: Optional(["old": 3, "new": 10, "kind": 1])
```
old をキーとして変更前の値が保存されており、 new をキーとして更新された値が保存されていることが分かりますね！

#もっと簡単に行う
Swift ではプロパティで willSet, didSet を使うことで、もっと簡単にできます。

```swift:kvo2.swift
import Foundation

class Person: NSObject {
    var my = My()
    
    override init() {
        super.init()
        my.level += 2 // 1回目の変更
        my.level += 7 // 2回目の変更
    }
}

class My: NSObject {
    var level: Int = 0 {
        willSet {
            print("Before")
            print("Lv UP!!", level)
        }
        didSet {
            print("After")
            print("Lv UP!!", level)
        }
    }
}

let p = Person()
```
変更前の値を得るのは willSet で、変更後は didSet になります。
実行結果はこのようになります。

```
Before
Lv UP!! 0
After
Lv UP!! 2
Before
Lv UP!! 2
After
Lv UP!! 9
```
感想：
書き方をいくつか知っているとソースコードを読むときに役に立ちますね‼︎
Nginxにサーバ証明書を設定する

**<font color="Red">本記事で紹介している証明書は2018年10月にリリースされる
GoogleChromeで不正な証明書と判定されてしまう予定です。
証明書更新する際は注意してください。</font>**


Webアプリを作っていて、ログインする機能や、ユーザの情報を入れてもらうような機能を作る場合、通信はhttpではなくhttpsで暗号化すべきかと存じます。サーバ証明書を設定する機会は新しいアプリを作るとき、または、証明書の更新時(1年に1回)しかないため、毎回設定の手順を忘れて0から作り直しています。そのため、今回は次の証明書設定時に困らないよう、Nginxにサーバ証明書を設定する手順を以下に残しておきたいと存じます。

#導入するサーバ証明書
国内最安値と有名なSSLBOXのラピッド証明書を選択します。
(企業として公開するものではないため、EVや企業認証ではなくドメイン認証の証明書を利用します)
無料で発行できるものもありますが、不特定多数のユーザが利用する可能性があるため、ある程度実績があって、有料であるものを利用しようと思います。

**これです**
![rapid.png](https://qiita-image-store.s3.amazonaws.com/0/110457/68f68d88-713f-d742-0d0c-307b3fd72b17.png)

#証明書発行の申請
・SSLBOXに会員登録する
・課金
・コモンネーム、CSRの登録画面
　コモンネームは、取得したドメイン名を記入
　CSR作成手順

**Nginxを動かすサーバで実施**

前提
Nginxを以下に配置している
/etc/nginx/

```sh
$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

$ cd /etc/nginx/

#秘密鍵の作成
$ openssl genrsa -des3 -out ./ssl.key 2048
Enter pass phrase for ./ssl.key:
Verifying - Enter pass phrase for ./ssl.key:

#CSRの作成
$ openssl genrsa -des3 -out ./ssl.key 2048
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Otaku
Organization Name (eg, company) [Default Company Ltd]:OtakuIinkai
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server hostname) []:example.co.jp
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

#生成したCSRを開き、フォームにコピーする
$ cat ssl.csr
-----BEGIN CERTIFICATE REQUEST-----
（略）
-----END CERTIFICATE REQUEST-----
```

・メールによるドメイン認証
SSLを発行してもらうドメインのメールアドレスに確認用のメールが
送付されるので、メール本文に記載されたURLを押下する

・管理画面のステータスが「発行済み」に変わる
認証を済ませると、管理画面のステータス項目が変わります。
証明書、中間証明書が画面からダウンロードできるようになります。

・証明書のインストール
証明書をNginxに設定します

**ファイルの準備**

```sh
$ cd /etc/nginx

#証明書を貼り付ける
$ vi ssl.crt
-----BEGIN CERTIFICATE-----
（略）
-----END CERTIFICATE-----
　
#中間証明書を貼り付ける
$ vi cushion.cer
-----BEGIN CERTIFICATE-----
（略）
-----END CERTIFICATE-----

#証明書と中間証明書を合わせる
$ cat ssl.crt cushion.cer > ssl.pem
```

**Nginxに設定追加**

```nginx:nginx.conf
server {
    listen 443;
    server_name  example.co.jp;

    ssl on;
    ssl_certificate ssl.pem;
    ssl_certificate_key ssl.key;

#(略)
}
```

**Nginx再起動**

```sh
$ systemctl restart nginx
```

画面にhttpsでアクセスしてみると。。。
**パスフレーズで参照できないエラー**

```
2016/03/22 22:55:45 [emerg] 10748#0: SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl.key") failed (SSL: error:0906406D:PEM routines:PEM_def_callback:problems getting p        assword error:0906A068:PEM routines:PEM_do_header:bad password read error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
```

**バックアップを取って、パスフレーズを外します**

```sh
$ openssl rsa -in ssl.key -out  ssl.key
$ systemctl restart nginx
```

上記対応のあと、httpsで画面を問題なく表示できました。
【Unity】Standaloneでビルドしたゲームを自分が使いたいアスペクト比で設定する

Unityで作ったゲームをStandaloneで自分のPCにビルドしてゲームを起動するとこんな感じの画面がでます。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/6e9600fe-9830-b39b-3cb1-3dbbf6a7c7e7.png)


ここでスクリーンのアスペクト比を設定できるのですが、自分の好みのアスペクト比を設定することができません。

そこで、自分の好きなスクリーンの幅高さを設定する方法を紹介します。

やり方としては簡単で、Player Settings を少しいじるだけです。

# 手順

今回自分のPCにビルドするので、Standaloneを選択後 **Switch Platform**をクリックし、Unityロゴが下図のように移動しているか確認する。

そして**Player Settings** をクリックする。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/a4d1f9fd-0d98-2c26-31dc-e1715c0ce6f4.png)

最初の状態は下図のようになっている。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/9177f3f2-a012-ace7-267e-f0d64bc7c26f.png)

次のように設定する。

+ Default Is Full Screen のチェックを外す

ここのチェックを外すと、幅と高さを記入できるところがでてきます。

+ Default Screen Width / Height を記入する

Widthが画面の幅、Heightが高さです。

+ Display Resolution Dialog を Disabledに設定する

ここにチェックを入れると、例の画面が出るようになってしまいます。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/c901cc5e-cf28-d09f-cf82-e35bffc7805f.png)

ここまで来たら後はビルドするだけです。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/4548ec06-0256-c6a6-1419-1d1fae80f265.png)
社会人になってからプログラムを始める人へ

私は社会人になってからプログラムをはじめて、4年ほどになります。その経験から、新人だった頃の自分に伝えるなら、こんなことがあるというのがいくつか思いつき、折角なのでまとめることにしました。

# やりたいことがなくても焦らなくていい

よく言われていますが、やるべきこと、やりたいこと、できることの3つが重なるものが取り組むのがよいです。まっとうな会社であれば、やるべきことをある程度提示してくれるはずですし、新人にはそうするのがセオリーです。その中からやりたいと思えることや、とりあえずやってもいいと思えるものをこなしていきましょう。そうしていけば、自分がどういう技術を好むのか、どういう仕事の進め方が良いのかが見えてきて、やりたいことがでてきます。

社会人になってからはじめたのであれば、やりたいことが曖昧なのはしょうがないことです。周りに流されて無理に見つけようとしなくても、仕事をこなす中で探していけばいいことです。

無理矢理、こちらのやりたいことを引き出せようとする時は、ちょっと疑った方がいいかもしれません。会社が迷走中かノープランなのかもしれません。

# エンジニア文化に無理に染まらなくてもいい

気にいったら別のよいですが、そうでないなら無理にあわせようとしなくてもよいです。誰もが、ChatOpsしたり、毎週勉強会いったり、twitterしたり、エンジニア界隈のスラング使ったり、アニメやラノベを嗜んだり、自宅にサーバラックいれたり、ブログ書いたり、しなきゃいけないわけではないです。

自分が必要だなとか、良いなと思ったものを取り入れればいいです。

# 「お金のためにプログラム書いている」というスタンスでもいい

続けていくうちに、趣味としても時間をかけても良いと思えるようになったなら、どんどんやって良いと思います。
ただ、そうでないなら、自分の他のプライベートとの時間配分を考えて取り組んだ方がいいです。職業がら、勉強する時間をとらなければいけないですが、仕事にある程度直結するものを優先した方が、効率うんぬんよりも、精神衛生的に良いです。「食い扶持を稼ぐためにやっているのだから、極力仕事に関連するのだけやる」と割り切った方が、自分の中の一貫性を保ちやすいからです。

一番まずいのが、趣味でやっていることがやりたいことで、仕事のはやりたくないことという方向に進みすぎると、やりたくないことだから、仕事では適当にやっていいと、手を抜く言い訳を自分に与えてしまうことです。そうなるくらいなら、お金のためと割り切った方がいいでしょう。

# 問題解決こそが仕事

作業時間を短くする、コストをさげるなど、なんらかの問題を解決することこそが、仕事です。決して、流行のソフトウェアを導入することや、流行のプログラミング言語を使ったり、新しい技術情報を収集するだけのことではありません。

自分が抱えている問題の解決につながらなければ、もってる知識もやっていることも役立たず、と、時に厳しく見ることも大事です。

# 積極的に作業仮説をたてる

環境構築にしろ、プログラミングにしろ、デバッグにしろ、何かつまることがおおいです。そういうとき、正解を一発でだそうと立ち止まるよりも、具体的な作業ができるような仮説をたてることです。（これは学生時代に研究室の先生に教わったことでもあります。）

例えば、サーバにアクセスしようとしてできなかったときに、「ネットワークに問題がありそう」と仮説をたてます。
そうすると、「アクセスするサーバのファイアウォールではじかれているのか」とより具体的な仮説をたてます。これを検証するには、iptablesの設定値をドキュメントから取得するなり、接続しようとしているポートにアクセスできるかのコマンドを実行したりすることになります。

大雑把には下記のようなフローになります。

1. 方針決めのための仮説をたてる
2. 検証可能な、より具体的な仮説をたてる
3. 仮説を検証する
4. はずれなら、とりあえず2にもどる
5. 2,3,4をなんどか繰り返して、方針が違うと分かったら1に戻る

この過程を踏むことで、たとえ仮説が間違っていたとしても、それが今回の場合はどうして違うかの知見が得られて、あっていたときはその理由を明確にできます。


# 問題の切り分けをする

上述の適用パターンですが、何かエラーがでた時は、必ず問題の切り分けをできる範囲でしましょう。そうすれば、他の人に聴くときも、的確な質問ができるようになります。

サーバ側かクライアント側の問題かどうかがわからないときは、どちらかが問題（例えばサーバ側）と仮説をたてて、それを検証します。検証した結果、サーバ側には問題なさそうと分かれば、クライアント側の方に意識を集中できます。

# 自分の問題を解決するためのアンテナをはる

コピペコードばかりしてしまう、複数台のサーバに、手動で同じ設定してしまう、テストに時間がかかりすぎる、テストの時間がとれない、など、自分の仕事の問題点をなんとなく意識にもっているとよいです。

欲をいえば、こうすれば解決できるのではというのもなんとなくもっていると、twitterやqiitaで流れてくる情報から、その問題を解決するものを拾えたりします。それにつながる本を見つけたり、ぐぐったときに必要なものをピックアップできるようになります。

# ノウハウをさらしてもあなたの価値はさがらない、むしろあがる場合が多い

特許とかそういうものでない限りは、自分のノウハウをさらしていった方がよいです。そのことによって、自分が代替可能な歯車になるような気がしますが、そのことで自分の価値がすぐに下がることは滅多にないです。自分がやってきたことを他の人ができるようにすることで、可用性があがり、自分自身は他のことをする時間がとれるようになり、そのことであらたな価値を自身に追加できます。

他の人に作業を割り振れる能力があることを示すことになり、そのことでチームに貢献できます。

# コードは機械への命令だけでなく、人に読んでもらうもの

昔は機械にどう命令するかという意味合いが強かったかもしれませんが、今となっては人間にとって読みやすいかどうかの方が重要だと思います。

他の人が読んで意味がわかるように書くのをこころがけましょう。明日の自分も、他人だとおもった方がいいです。すくなくとも、一週間もたったら、細かいことやどうしてそう書いたのかなどを結構抜け落ちます。そのためには、DDDやオブジェクト指向などの設計寄りのスキルが重要ですし、ドキュメンテーションコメントなどで補うこともできます。アルゴリズムや言語の使い方ばかりでなく、上のレイヤーのスキルを身につけた方が、効果的に可読性をあげられます。

# よく寝て、よく運動する

寝不足と運動不足が重なると、人生詰みそうです。そこまで体調を崩したことはないですが、寝ないと回復しない、寝てばかりだと体が弱るというのが、30過ぎてから感じるようになってきました... 睡眠時間と運動の時間はちゃんととりましょう。体こそが最大の資本で、投資すべきものです。
ActionMailerのアクションメソッドは遅延評価されるので注意

分かっている方も多いかもしれませんが、以下のコードは一見例外が起こりそうですが起きません。
以下のコードでは、HogeMailerのインスタンスメソッドdaily_summaryの中身は評価されないからです。(irb等だとinspectメソッドあたりが呼ばれるせいで評価されてしまいますが…)

```rb
class HogeMailer < ActionMailer::Base
  def daily_summary(user)
    mail(to: user.email)
  end
end

HogeMailer.daily_summary(nil)
# => #<ActionMailer::MessageDelivery>
```

# メーラーのアクションを呼んだ場合の評価の流れ

http://railsguides.jp/action_mailer_basics.html を見ると書いてありますが、
このHogeMailerクラスのdaily_summaryメソッド(アクションと呼ばれます)を呼んだ場合はActionMailer::MessageDeliveryというMail::Messageをラップしたクラスのインスタンスが返されます。

(内部的にはActionMailer::Baseの[method_missing](https://github.com/rails/rails/blob/v4.2.6/actionmailer/lib/action_mailer/base.rb#L565-L572)メソッドが呼ばれ、ActionMailer::MessageDeliveryクラスのインスタンスが作られます。 )

ActionMailer::MessageDeliveryのコードは以下のように[Delegator](http://docs.ruby-lang.org/ja/2.3.0/class/Delegator.html)になっていて、Mail::Messageのように振る舞うのですが、インスタンスが作られた段階ではまだ`@mail_method`が呼ばれていません。必要になった際に初めて呼ばれて`@mail_method`のメソッドの中身が評価されます。

```rb
class MessageDelivery < Delegator
  def initialize(mailer, mail_method, *args) #:nodoc:
    @mailer = mailer
    @mail_method = mail_method
    @args = args
  end

  def __getobj__ #:nodoc:
    @obj ||= @mailer.send(:new, @mail_method, *@args).message
  end
  # ...
```

(https://github.com/rails/rails/blob/v4.2.6/actionmailer/lib/action_mailer/message_delivery.rb から引用)

# なんでこういう仕様なのか

なぜ、こういう仕様になっているかというと、非同期送信機能(deliver_laterメソッド)との兼ね合いのためでしょう。

言われると確かにという感じですが、意識しないとテストなどで、最初の`HogeMailer.daily_summary(nil)`みたいな、一見テストしているけど実はしてないようなコードを書いてしまうことがあるので気を付けましょう…
テストで使う際は`deliver_now`または`message`を必ず呼ぶようにしましょう。どちらもMail::Messageを返します。

# ちなみに

```
HogeMailer.daily_sumary(User.first) # => NoMethodError
HogeMailer.daily_summary() # => #<ActionMailer::MessageDelivery>
```

1番目のコードはActionMailer::Baseのmethod_missing内で呼ばれたメソッドがアクションとして存在するかチェックされるので例外を起こすのですが、2番目は必要になるまでアクションメソッドが評価されないので、例外が起きません。
Defoldを試す

#Defoldとは
[Defold](http://www.defold.com)はCandyCrashとか有名ゲーム作ってる会社が出したゲームエンジン。
スウェーデンの会社との事。(I love wikipedia)

facebookで知り合いが投稿していたので、
さっそく使ってみた。

俺のメモ書き程度でも、人の役に立てばいいな。

##Installation
[Defoldのサイト](http://www.defold.com)にログインし、開発環境をダウンロード＆インストールする。
後はexeを叩いてログインすればOK。

↓こんな感じの画面が起動する。
![defold01.png](https://qiita-image-store.s3.amazonaws.com/0/42445/98e5bc4f-bcaa-a89f-5a2e-7144b91ad4eb.png)
<span class="red">どこかで見た事ある様な無い様な・・・</span>

##軽く説明
ココでの説明は本家サイトのGet Startedにも同じ事が書いてあります。
尚、ココでの説明は本家サイトのGet Startedにも同じ事が書いてあります。

何故二回書いたかと言うと、英語が苦手な人(俺)の適当翻訳だからだ。

ちなみに、ざっくり説明するとEclipseと同じだ。

![defold02.png](https://qiita-image-store.s3.amazonaws.com/0/42445/40e724ba-a1b1-82c0-f45c-42d81f84209b.png)

# Project Explorer
プロジェクトのリソースとかスクリプトとかを表示してるビュー。

# Main Editor
リソース・スクリプトの編集を行うビュー。

# Outline
atlasとかcollectionとか、複数リソースが合体しちゃってる系リソースの中身を表示してくれるビュー。

# Change files
変更したファイルの一覧を表示するビュー。

# Properties
まんま。プロパティのビュー。

# Console
ログとか出すビュー。Eclipseのログとか出すビューと同じ。

ビュービュー言い過ぎた。
尚、実行は[Project]->[Build and Launch]!!

#まとめ
`go`(だが、go言語ではないGameObjectの略)とか`atlas`とか`collection`とか、業務系には(俺には)馴染みのないものが多いので、
すこしづつ情報追記していきます。
Bitbucketにpushした時にRedmineのチケットをクローズする

Redmineに登録したチケットをBitbucketにgitでcommitをpushした時にクローズする方法です。
以前はgitoliteを使っていたので、環境としてRedmineのプラグインに、gitolite-hookとredmine_bitbucketが入ってます(多分それはなくてOK？) 


1. RedmineでAPI KEYを取得
2. Bitbucketにログイン
3. リポジトリを選択
4. 左下のギアマークから設定に進む
5. INTEGRATIONS内のWebhooksをクリック
6. Add webhookで新規web hook作成
7. URLを http://{Redmine URL}/sys/fetch_changesets?key={API KEY} にして登録


これでgitのcommit メッセージに"ref #1"やら "close #1"を入れたら自動でクローズしてくれます。
underscoreコードリーディング（noop）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##noopとは


###[underscorejs.orgのnoop](http://underscorejs.org/#noop)

こんな説明。
>####_.noop() 
>Returns undefined irrespective of the arguments passed to it. 
>Useful as the default for optional callback arguments.


```javascript
obj.initialize = _.noop;
```

------------- 
渡されるargumetntsに関係なく、undefinedを返す。
defaultのoptionalのcallback argumentとして役に立ちます。

###[underscore.noop](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1293)
コード的にはこのあたり。

```javascript
 _.noop = function(){};

```
underscoreコードリーディング（constant）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##constantとは


###[underscorejs.orgのconstant](http://underscorejs.org/#constant)

こんな説明。
>####_.constant(value) 
>Creates a function that returns the same value that is used as the argument of _.constant.



```javascript
var stooge = {name: 'moe'};
stooge === _.constant(stooge)();
=> true
```

------------- 
_.constantのargumentに使われているvalueとおなじ値を返す関数を作成します。

###[underscore.constant](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1286)
コード的にはこのあたり。

```javascript
  // Predicate-generating functions. Often useful outside of Underscore.
  _.constant = function(value) {
    return function() {
      return value;
    };
  };

```
valueを返す関数を返り値として返す
Swift 2.2 の新機能: SE-0001: (ほぼ全ての)キーワードを引数ラベルとして認める

[Swift 2.2 Released!](https://swift.org/blog/swift-2-2-released/) で Swift 2.2 の新機能が紹介されたので訳してみます。まずは [SE-0001: Allow (most) keywords as argument labels](https://github.com/apple/swift-evolution/blob/master/proposals/0001-keywords-as-argument-labels.md) から。
原文に従ってこの訳は [Apache License 2.0](https://github.com/apple/swift-evolution/blob/master/LICENSE.txt) とします。

# (ほぼ全ての)キーワードを引数ラベルとして認める

* 提案: [SE-0001](https://github.com/apple/swift-evolution/blob/master/proposals/0001-keywords-as-argument-labels.md)
* 著者: [Doug Gregor](https://github.com/DougGregor)
* ステータス: **受理** [Swift 2.2 で実装された](https://github.com/apple/swift/commit/c8dd8d066132683aa32c2a5740b291d057937367) ([Bug](https://bugs.swift.org/browse/SR-344))

## はじめに

引数ラベルは Swift の関数のインターフェースの重要な部分です。ある引数が関数に何をするものかを記述し、可読性を向上させます。時として、ある引数にとってもっとも自然なラベルが `in`, `repeat`, `defer` のような言語キーワードと被ってしまうことがあります。そのようなキーワードは、よりよい関数インターフェースのために引数ラベルとして許容されるべきです。

## 動機

関数の引数にとって最も良い引数ラベルが言語キーワードと被ってしまうことがあります。例えば、コレクションのある値のインデックスを見つけるモジュールスコープの関数について考えてみましょう。このラベルの自然な名前は `indexOf(_:in:)` でしょう:

	indexOf(value, in: collection)

しかし `in` はキーワードなので実際には `in` をエスケープするためにバッククォートを使わないといけないでしょう:

	indexOf(value, `in`: collection)

Swift で新しい API を定義する際、それが理想的な名前ではなくてもキーワードではない別の単語を選ぶ場合が多々あります(この例では `within` など)。それでもこの問題は "不要な名前は省略する" というやり方に従った Objective-C の API を使う時にも出てきます。そのような API を使うにはエスケープする必要があります。例えば次の API があります:

	event.touchesMatching([.Began, .Moved], `in`: view)
	NSXPCInterface(`protocol`: SomeProtocolType.Protocol)

## 提案手法

`inout`, `var`, `let` 以外の全てのキーワードを引数ラベルとして使うことを認めます。これは文法に 3 点影響があります。

* 上の例で挙げたような呼び出し式。この点について、文法上の曖昧さはありません。"\<keyword\> :" はこの他の括弧で囲まれた式リスト中の文法生成には現れないからです。これは最も重要な点です。

* 関数/添字付け/イニシャライザの宣言: この点に関し、上で挙げた 3 つの例外を除くと曖昧さはありません。キーワードには常に識別子、‘:’、‘_’ のいずれかが続くからです。例えば:

```swift
func touchesMatching(phase: NSTouchPhase, in view: NSView?) -> Set<NSTouch>
```

パラメータの前に付いたり修飾したりするキーワード --今のところは "inout" と "let" と "var"-- は元々の意味を引き継ぐ必要があります。もしそのようなキーワードを使う API を発明したとしても、依然としてバッククォートで囲われている必要があるでしょう。

```swift
func addParameter(name: String, `inout`: Bool)
```

* 関数の型: 実際には 2 番目の項目より簡単です。パラメータの名前には常に ‘:’ が続くからです:

```swift
(NSTouchPhase, in: NSView?) -> Set<NSTouch>
(String, inout: Bool) -> Void
```
## 既存のコードに対する影響

この機能は厳密に追加的なものであり、既存のコードを破壊しません: 幾つかのこれまで文法的に正しくなかったコードを正しいものとするだけで、正しかったコードの振る舞いは変更しません。

## 考えられる代替案

ここで考えられる一つ目の代替案は何もしないというものです: Swift の API は引数ラベルにキーワードを使うことを避け続けるでしょう。それが最も自然な単語だったとしてもです。(訳注: Objective-C から)取り込まれた API はバッククォートを使い続けるか、名前を変更する必要があるでしょう。この代替案では非常に多くの取り込まれた API (200近く)がある程度 API 名の変更をするか呼び出し側がバッククォートをつけるかし続けないといけません。

二つ目の代替案は `in` 自体に注目するものです。`in` は取り込まれた API で最も一般的な、キーワードになっている引数です。取り込まれた API をざっと調べたところ、`in` が既存のキーワードとの競合の 90% を占めていました。さらに `in` というキーワードは Swift の文法の 2 箇所だけ--for ループとクロージャ--でしか使われていません。そのためコンテキスト依存にすることができました。しかし、この解決方法はもう少し複雑(もっと多くのコンテキスト依存のキーワードのパースが必要になる)で、一般性に欠けます。
複数セクションがある man ページを peco で一覧から選べるようにする


ほかのセクションに同名の man ページがあるか否かを確認するには、man コマンドに -aw オプションを付けて確認することができます。

[ほかのセクションに同名のmanページがあるか調べるには － ＠IT](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/837otherman.html)

このオプションを利用して peco でセクション一覧を表示し、一覧から目的の man を表示するシェルスクリプトの関数を書いてみました。

```bash:.bashrc
manselect() {
  if [ $# -ne 1 ]; then
    echo 'ArgumentError: wrong number of arguments (expected 1)'
    return 1
  fi
  man $1 > /dev/null 2>&1
  if [ $? -ne 0 ]; then
    echo "ArgumentError: no manual entry for $1"
    return 1
  fi
  selected=$(man -aw $1 | peco)
  args=$(basename $selected | awk -F . '{ printf("%s %s\n", $2, $1) }')
  man $args
}

```

意外に複数セクションがある man ページを発見することができたりして、なかなか楽しいです。

![manselect.gif](https://qiita-image-store.s3.amazonaws.com/0/6915/d0d1d9ef-1a7b-68e9-876f-ed605bfe8b69.gif "manselect.gif")
SimpleDateFormatの月表記、曜日表記をカスタマイズする。

SimpleDateFormatを使って曜日とか(Monday,Tuesday)をオリジナル表記したい時メモ。
[DateFormatSymbols(Javadoc7)](http://docs.oracle.com/javase/jp/7/api/java/text/DateFormatSymbols.html)が文字列リソースを管理しているクラスなので、このプロパティweekdaysとかを上書きすればok
javadocを参考にDateFormatSymbolsを上書きしてみる。

標準で設定されるweekdaysを出力する。

```java:Main.java
		DateFormatSymbols dfs = DateFormatSymbols.getInstance(Locale.ENGLISH);
		String[] weeks = dfs.getWeekdays();

		int i = 0;
		for(String week:weeks){
			System.out.println( i + " :" + week);
			i++;
		}
```

実行結果

```
0 :
1 :Sunday
2 :Monday
3 :Tuesday
4 :Wednesday
5 :Thursday
6 :Friday
7 :Saturday
```

0番目の要素が空なのはCalenderの定数を使用しているから？

weekdaysを上書きしてみる

```java:Main.java
		DateFormatSymbols dfs = DateFormatSymbols.getInstance(Locale.ENGLISH);
		String[] newWeek = {
				"","sunday","monday","tuesday","wedesday","thursday","friday","saturday"
		};
		dfs.setWeekdays(newWeek);

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEEE",dfs);
		String now = sdf.format(new Date());

		System.out.println(now);
```

実行結果

```
2016-03-22 20:29:29 tuesday
```
MonoDevelopのテーマとフォントを変更する

MonoDevelopのデフォルトテーマが見づらかったので変更した。
<img width="1344" alt="スクリーンショット 2016-03-22 21.41.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/3631148b-d624-6e97-959b-98ca47e2167b.png">
#テーマの変更
[Preference] - [Text Editor] - [Syntax Highlighting]
で好きなカラースキームを選ぶ。
<img width="1316" alt="スクリーンショット 2016-03-22 21.41.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/fc933156-2665-e7c3-76ab-977ddb6f8c4e.png">
お好みで新しいのも追加できるみたいだけど、とりあえず用意されてたMonokaiにしてみた。
#フォントの変更
[Preference] - [Environment] - [Fonts]
で好きなフォントを選ぶ。
<img width="723" alt="スクリーンショット 2016-03-22 21.42.43_.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/ccd650ec-d3c6-62d4-11b3-6f6aa4f6acea.png">

お気に入りのRicty Diminishedを指定。あとは適当にサイズデカくした。
<img width="1344" alt="スクリーンショット 2016-03-22 21.42.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/37bd8c6d-3976-55b0-1dd9-6b2f175f7df0.png">
4Kディスプレイだとこれくらいにしないと見えない罠。
winSCPを使って高速にデータ転送する技

###**WinSCPで本気のスピードを出すための設定変更**
***
実はこれ有名な話ですが、最近職場でも数人に教えたので、意外にもまだまだ知らない人いるんじゃないかと思い、情報共有します。IT業界でがりがり働いているSEさんやプログラマーさんならWindows クライアントPCからLinuxサーバーに大きなファイル(数百MB~1G)データ転送することって普通にありますよね。

その場合、社内でのローカルネットワーク間の通信(社外に出ないNW通信)の場合であっても、FTPではなく、**SCPやSFTP**を使ってデータ転送を行っている環境が意外に多いかと思います。

そんな時、多くの方が**WinSCP**なる便利ツールを使っているのではと思います。[WinSCPはこちらからダウンロード可能です。](https://winscp.net/eng/download.php) ではどうやってWinSCPの本気スピードを出すかというと、設定はいたって単純です。**暗号化方式を変えるだけです。**

![Winscp_6.png](https://qiita-image-store.s3.amazonaws.com/0/94920/1c441a96-55bb-d171-0440-3771c0acfdc5.png)


設定はこちらで終了です。暗号化鍵の使用優先度をArcfour(SSH2)を先頭に持ってくるだけです。この設定変更によってファイル転送速度が2倍以上になります。

以前会社のクローズドなNW環境でWindowsクライアントPCから1Gbps NW経由でLinuxサーバーにデータ転送を試した結果、**10MB/secの転送速度が40MB/secまで上がりました。** 社内のローカルネットワークを使用して検証用サーバーにデータを転送をする際、ファイルサイズが数十GBになるとこの転送速度の差は結構ばかになりません。なので知っているとけっこう役に立ちます。

###**WinSCPで本気のスピードを出す際の注意点**
***
紹介しておいてなんですが、暗号化方式を変えて性能がよくなるということは、暗号化のオーバヘッドが小さくなる = 暗号化強度が下がるという話なので、デメリットもあるようです。下記の@ITでも安全について少し暗号化の強度を危惧する記事があるので、使う際にはデータ転送を行う環境とデータの重要度について考慮した上で、スピード or セキュリティどちらを重視するか個々人の責任で選択しないといけませんね。

[これだけは知っておきたいアルゴリズム～共通鍵暗号編] (http://www.atmarkit.co.jp/ait/articles/0605/20/news011_3.html)
画像の形式を統一する

# 目的について

某画像共有SNSに投稿するとき画像の形式を統一しないと怒られるのでimagemagickを使いました。その備忘録

# 環境について

画像の形式の変換にimagemagickを使います。homebrewで管理します。なぜかというとバージョンアップ時に更新がとても楽だからです。そしてバージョンアップはおそらく想像よりはるかに頻繁にされているからです。

homebrewをインストールします。結構時間かかります。

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

homebrewでimagemagickをインストールします。

```bash
$ brew install imagemagick
```

# 本題

画像をどこかのディレクトリにまとめます。twitterにUpした画像はpngかjpgのはずです。pngをjpgにすれば画像形式が統一されます。

前回imagemagickを使ってから間が開いてるなら、とりあえずupdateするのが得策です。

```bash
$ brew update
```

まとめたディレクトリを作業フォルダにします。

```bash
$ cd /Users/username/Desktop/dokoka/no/dir
```

以下の.shファイルでpngをjpgに変換し、もとのpngファイルを削除。

以下のコードをterminal上にペーストでも大丈夫なんじゃないかな。

```bash
#!/bin/bash

for F in *.png
do
  convert $F ${F/.png/.jpg}
done
find ./ -name '*.png' | xargs rm

```

pngとjpgを入れ替えれば逆もできると思います
Tips 複数VMを定義しているVagrant環境で、特定VMに対して vagrantコマンドを実行する方法

# Tips 複数VMを定義しているVagrant環境で、特定VMに対して vagrantコマンドを実行する方法

複数VMを定義している環境で特定のVMをコントロールする場合、[こちら](https://www.vagrantup.com/docs/multi-machine/)の通り、

`vagrant [up | halt | status | destroy | ssh | ssh-config | etc ...] hoge(VagrantfileでのVM定義名config.vm.define hoge)`
としてVMを指定してコマンド実行することができます。

なお、`vagrant up /hoge0[1-9]/`とすることで複数VM（hoge01〜hoge09）指定することもできます。
また、VM名を省力した場合は、Vagrantfileで定義しているすべてのVMに対してコマンドを実行します。
NFCカードをタッチしたときアクティビティを起動する

#はじめに
Manifestファイルに書くインテントフィルタの書き方でハマったので、簡単に整理しておきます。
NDEFレコードを含まないNFCカードの検出方法について書いています。

#NFCカードをタッチしたときにアクティビティが起動する仕組み
Androidがタグディスパッチシステムという機能を持っていて、NFCカードをタッチしたとき、いくつかのインテントを発行します。
これをManifestファイルに記載したインテントフィルタで検出すると、アクティビティを起動することができます。

タグディスパッチシステムの解説はここを参照。
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/nfc.html#dispatching

#インテントフィルタの種類
android.nfc.action.ACTION_NDEF_DISCOVERED
NFCにNDEFレコードが含まれている場合

android.nfc.action.ACTION_TECH_DISCOVERED
NDEFレコードが含まれていないけど、XMLファイルに記載したtech-listの条件に一致する場合

android.nfc.action.ACTION_TAG_DISCOVERED
ACTION_NDEF_DISCOVEREDでもACTION_TECH_DISCOVEREDでもないNFCカードの場合

#Manifestファイルの書き方
起動したいアクティビティに以下のようなインテントフィルタを追記します。
tech-listを記載しているXMLファイルは、nfc_tech.xmlというファイル名にしています。

この例ではMIFARE Classic, MIFARE Ultralight, FeliCaの検出をしています。

[AndroidManifest.xml]

````xml
    <intent-filter>
        <action android:name="android.nfc.action.TECH_DISCOVERED" />
    </intent-filter>
    <meta-data
        android:name="android.nfc.action.TECH_DISCOVERED"
        android:resource="@xml/nfc_tech" />
````

[/res/xml/nfc_tech.xml]

````xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>
</resources>
````

#ハマったポイント
tech-listのファイルを以下のように書いたら、インテントを検出することができませんでした。

````xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>
</resources>
````

#わかったこと
tech-listに書いた条件はAND条件。
複数の種類のカードを検出したいときは、tech-listを分けて書く必要がある。

Android Developersをよく読めば書いてあると思います。たぶん。
よく読まないでハマっちゃった人の参考になれば幸いです。

#参考リンク

Near Field Communication
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/index.html

NFC Basics
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/nfc.html

Advanced NFC
http://developer.android.com/intl/ja/guide/topics/connectivity/nfc/advanced-nfc.html
pyenvを用いたcaffeの導入

### 2016.3.22 
機械学習をする上でよく使用するライブラリを一括導入します.
環境はUbuntu14.04　LTS(これはcaffe,chainerの推奨環境なため)  

### pyenv
```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

### python
```
pyenv install anaconda-2.1.0
pyenv rehash
pyenv global anaconda-2.1.0
echo 'export PATH="$PYENV_ROOT/versions/anaconda-2.1.0/bin/:$PATH"' >> ~/.bashrc
source ~/.bashrc
```
今回はCaffe 推奨のanaconda-2.1.0を使用.またanacondaは数値計算パッケージなので,導入時からnumpyやscipy,scikit-learnが入っているので便利  

次に深層学習のライブラリの中から普段使うCaffe,Chainer,TensorFlowを導入
## Caffe
- cuda

```
## cuda install 
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.0-28_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1404_7.0-28_amd64.deb
sudo apt-get update
sudo apt-get install cuda
```

- BLAS

```
sudo apt-get install libatlas-base-dev
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler g++-4.6
```

- Caffe(本体)

```
## caffe
cd $HOME
git clone https://github.com/BVLC/caffe.git ~/caffe
cd caffe
cp Makefile.config.example Makefile.config
### ※
echo "CPU_ONLY := 1" >> Makefile.config
echo "CXX := /usr/bin/g++-4.6" >> Makefile.config
```

一通り入れ終わったので,実行テストをします

```
make -j4 all
make -j4 test
make -j4 runtest
```

caffeをpythonで用いたいのでpycaffeを導入します.

```
##pycaffe
pip install -r ~/caffe/python/requirements.txt
sudo apt-get install python-dev python-pip python-numpy python-skimage
sudo apt-get install --no-install-recommends libboost-all-dev
echo "export PYTHONPATH=~caffe/python/:$PYTHONPATH" >> ~/.bashrc
source ~/.bashrc
make pycaffe
```

```
import caffe
```
で特にエラーがなければ大丈夫です。  
なお  
ここで

```
make pycaffe
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
touch python/caffe/proto/__init__.py
PROTOC (python) src/caffe/proto/caffe.proto

>>> import caffe
Traceback (most recent call last):
  File "", line 1, in 
  File "/home/yuki/caffe/python/caffe/__init__.py", line 1, in 
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver
  File "/home/yuki/caffe/python/caffe/pycaffe.py", line 13, in 
    from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
ImportError: /home/yuki/.pyenv/versions/anaconda-2.1.0/bin/../lib/libm.so.6: version `GLIBC_2.15' not found (required by /usr/lib/x86_64-linux-gnu/libxvidcore.so.4)
```

のようなエラーが出てきた時は,とりあえず

```
/home/yuki/.pyenv/versions/anaconda-2.1.0/bin/../lib/libm.so.6
```
このファイルを削除すれば一応ライブラリを読み込むようになります(完全に解決したわけではない)
  
caffeの環境構築はやっぱり難しい(´･ω･｀)  

## chainer

```
pip install chainer
```
これで終わり！！いいですねぇ

## Tensorflow
なぜかライブラリ読み込まれていず苦戦なう
[TensorFlow-Download and Setup]
(https://www.tensorflow.org/versions/r0.7/get_started/os_setup.html#pip-installation)

```
sudo apt-get install python-pip python-dev
#CPU
sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
```
Jekyll で es2015 ( babel ) を使う

日本語でそのものズバリの記事がなかったのですが、 [`jekyll-babel`](https://github.com/babel/jekyll-babel) というプラグインを利用して簡単に `babel` だけを導入できます。使っている `jekyll` のバージョンは `3.1.1`　。
`asset-pipeline` をセットアップするのはめんどいけど、 `var` とか書きたくないよって時にどうぞ。

```ruby:Gemfile
gem 'jekyll-babel'
```

```yaml:_config.yml
gems:
  - jekyll-babel
```

```js:script.es6
---
---
// ^^^ those two lines are required by Jekyll

const es6 = "ready!";
let it = "be";
```

1. gemfile に `gem 'jekyll-babel'`を追加
2. `bundle init` を実行
3. `_config.yml` の　`gems:` に `- jekyll-babel` を追加
4. `js` フォルダ内に `*.es6` と拡張子を設定して保存
5. **対象のファイルの先頭に `---(改行)---` を記載**
6. `jekyll build --watch` を実行。 `_site/js` 内に `*.js` と変換されて出力されます

5番がちょっとキモイですが、 `jekyll` に変換対象のファイルだとわからせるために必要な模様。
多分、事前に　`node.js` と `babel-cli` 、　`babel-es2015-preset`　が必要です。

```shell-session
npm install -g babel-cli
npm install -g babel-preset-es2015
```

### 参考

- [babel/jekyll-babel: A Babel converter for Jekyll.](https://github.com/babel/jekyll-babel)
N88-BASIC でズンドコキヨシ

[ズンドコキヨシ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)の N88-BASIC 版を書きました。

```
10 DEFINT R,Z
20 RANDOMIZE (VAL(RIGHT$(TIME$,2)))
30 Z=0
40 R=CINT(RND)
50 IF R THEN PRINT "ｽﾞﾝ " ;: Z=Z+1 ELSE PRINT "ﾄﾞｺ ";: IF Z>=4 THEN GOTO 70 ELSE Z=0
60 GOTO 40
70 PRINT "ｷ･ﾖ･ｼ!"
```
scalaenvとjenvを導入するときにShellまわりで起きた問題を解決した話

##経緯
1. Scalaを始めるためにJavaが必要になった
2. でも依存関係を汚したくない→`jenv`で管理しよう
3. `jenv`入れてみた
4. 【問題その１】`.zshrc`にPATH通してみたけどターミナルを新しく開くと`jenv "~/.jenv/libexec/../completions/jenv.bash:15: command not found: complete"`と表示されてエラーしている
5. scalaを入れるためにscalaenvを使ってみた
6. 【問題その２】`scalaenv global scala-2.xx.x`したのにターミナルで`scala`って打っても`command not found`と言われる

などなどの問題が発生。
`.zshrc`とか、シェル関係のドットファイルにはちゃんとパスを記述してあるのになぜか失敗する、という人向けのメモです。
なんというか、Mac嫌いになるかもっていうレベルで意味不明の解決策でした笑



##scalaenvとjenvの導入方法
`scalaenv`の場合は

- 本家Github：https://github.com/mazgi/scalaenv
- 本家Blog：http://blog.mazgi.net/entry/i-made-scalaenv-sbtenv-and-playenv-based-on-rbenv
- qiitaの記事：http://qiita.com/necojackarc/items/bc2f41d5a00926e9b0c5

`jenv`の場合は

- http://kendik.hatenablog.com/entry/2015/09/02/013207

などを参考に導入しました。

##問題（詳細）
導入のの途中でターミナルで新しいタブを開くと

```shell-session
Last login: Tue Mar 22 18:34:39 on ttys001
[~] askg $ /usr/local/Cellar/jenv/0.4.4/libexec/libexec/../completions/jenv.bash:15: command not found: complete
```

とかって表示されるようになりまして。
これがメインの問題です。
これ(【問題その1】)を解決したらついでに【問題その2】も解決していたって話です。


##解決編
まず、githubにissueが落ちてました。

- https://github.com/gcuisinier/jenv/issues/50

どうやら、ターミナル.appの環境設定でちゃんとzshを設定していても、それはあくまで「bashを読み込んだ上でzshを読み込んでいるだけ」ということらしく、それが問題とのこと。
issueのなかの指示通り、下記サイトに従って「システム環境設定>ユーザとグループ」から、ログインシェルをzshellに変更しました。

- http://apple.stackexchange.com/questions/88278/change-default-shell-from-bash-to-zsh/88296#88296


そうしたら、一気にjenvの問題もscalaenvの問題も全てまるっと解決っ！！
ちゃんちゃん！！
待ち切れずにDartでズンドコキヨシやったった

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

CoffeeScript や TypeScript があるから、
誰かが作ってくれるだろうといつまでも待っているのに・・・
誰も作ってくれないから、ズンドコDartでキヨシってみる。

```dart:zundoko.dart
#!/usr/local/bin/dart

import "dart:math";
import "dart:io";

main() {
    String zzzzdoko = "ズンズンズンズンドコ";
    List<String> target = new List<String>();
    Random ran = new Random(new DateTime.now().microsecondsSinceEpoch);

    while(zzzzdoko != target.join()) {
        sleep(new Duration(seconds:1));
        target.add("${["ズン","ドコ"][ran.nextInt(2)]}");
        if (target.length > 5) target.removeAt(0);

        print("${target[target.length - 1]}");
    }   
    print("キ・ヨ・シ！");
}
```

Dartもっと流行ってくれればいいのになぁ
楽しいのにぃ

DartPadに打ち込んでみた。
どうもDartのバージョンが古いのと、dart:ioライブラリをサポートしてくれていないらしいのとで、
少しだけ改変しておいた。
https://dartpad.dartlang.org/403357f5cd50a1ea8f09
繰り返しの性能の差が戦力の決定的な違いでない事を教えてやれない


** 誤差だよそれは！ **

[ズンドコキヨシで動的型付言語のベンチマーク - Qiita](http://qiita.com/mpyw/items/b9be5c81ef9389c0267d)の処理を元に色々繰り返してみた。

# 実行環境

PHP 7.0.3 (cli)

# 比較処理そのものがオーバーヘッドになるっぽい

殆ど誤差の範囲ですが、なぜかforeachが最速だった。

"while < for"は腑に落ちる所。
forの場合は周回が終わった後にもう一個処理ブロックがあるしね。

gotoとwhileの差はほんとに判定処理そのものの差の予感。

| | foreach | goto | while | for | foreach2 | foreach1 |
|---|---|---|---|---|---|---|
|out | **66.869176** | 66.95782 | 66.97618 | 66.981272 | 67.0028 | 73.343344 |
|real | **0m10.108s** | 0m11.247s | 0m10.733s | 0m10.954s | 0m10.591s | 0m11.565s |
|user | **0m10.090s** | 0m11.231s | 0m10.720s | 0m10.935s | 0m10.556s | 0m11.551s |
|sys | 0m0.013s | 0m0.010s | **0m0.006s** | 0m0.009s | 0m0.009s | 0m0.008s |

# ソース類

## 原点の "while"

```php:while.php
<?php
$i = $total = 500000;
$length = 0;
while ($i--) {
    $z = 0;
    do {
        $length += 2;
        if (mt_rand() < 1073741824) {
            ++$z;
        } else {
            if ($z >= 4) break;
            $z = 0;
        }
    } while (true);
}
$out = $length / $total + 3;
echo "$out\n";
```

## "for"

```php:for.php
<?php
$i = $total = 500000;
$length = 0;
for (;$i--;) {
    $z = 0;
    for (;true;) {
        $length += 2;
        if (mt_rand() < 1073741824) {
            ++$z;
        } else {
            if ($z >= 4) break;
            $z = 0;
        }
    }
}
$out = $length / $total + 3;
echo "$out\n";
```

## foreach

### foreach:50万件一気に配列を作り、変数に入れる

```php:foreach1.php
<?php
$i = $total = 500000;
$length = 0;
$range = range(0, $i);
foreach ($range as $i) {
    $z = 0;
    do {
        $length += 2;
        if (mt_rand() < 1073741824) {
            ++$z;
        } else {
            if ($z >= 4) break;
            $z = 0;
        }
    } while (true);
}
$out = $length / $total + 3;
echo "$out\n";
```

### foreach:5万件の配列を作り、10回回す

```php:foreach2.php
<?php
$i = $total = 500000;
$length = 0;
$range = range(0, 50000);
foreach (range(0, 10) as $n) {
    foreach ($range as $i) {
        $z = 0;
        do {
            $length += 2;
            if (mt_rand() < 1073741824) {
                ++$z;
            } else {
                if ($z >= 4) break;
                $z = 0;
            }
        } while (true);
    }
}
$out = $length / $total + 3;
echo "$out\n";
```

### foreach:50万件の配列を作り、そのまま回す

```php:foreach2.php
<?php
$i = $total = 500000;
$length = 0;
foreach (range(0, $i) as $i) {
    $z = 0;
    do {
        $length += 2;
        if (mt_rand() < 1073741824) {
            ++$z;
        } else {
            if ($z >= 4) break;
            $z = 0;
        }
    } while (true);
}
$out = $length / $total + 3;
echo "$out\n";
```

## goto

```php:goto.php
<?php
$i = $total = 500000;
$length = 0;
start:
    $z = 0;
    inner:
        $length += 2;
        if (mt_rand() < 1073741824) {
            ++$z;
        } else {
            if ($z >= 4) goto break_point;
            $z = 0;
        }
    goto inner;
    break_point:
if ($i--) {
    goto start;
}
$out = $length / $total + 3;
echo "$out\n";
```
Matt-Esch/virtual-dom で Element の focus() を呼び出す

# 問題

[Matt-Esch/virtual-dom][] を使用している状況で、Element の focus() を呼び出したい。

# 解決策

[Matt-Esch/virtual-dom][] の Hook を使う。[公式の FAQ に書いてある](https://github.com/Matt-Esch/virtual-dom/blob/master/docs/faq.md#how-do-i-update-custom-properties)。

以下は例。

```ts
class FocusHook {
  private focus: boolean;

  constructor(focus: boolean) {
    this.focus = focus;
  }

  hook(e: any) {
    if (focus) e.focus();
  }
}

const view = (isFocus: boolean) => {
  const items: { focus: boolean; }[] = [
    { label: 'item1', focus: false },
    { label: 'item2', focus: true }
  ];
  return items.map(item => {
    return h('input', {
      'ev-focus': new FocusHook(item.focus)
    })
  });
};

// ...
```

おそらく `e.focus()` は `nextTick` で呼び出すほうが望ましいだろう。ちなみに [Matt-Esch/virtual-dom][] は  [focus-hook.js](https://github.com/Matt-Esch/virtual-dom/blob/v2.1.1/virtual-hyperscript/hooks/focus-hook.js) を含んでいる (利用方法はなさそう) ので、そういう形で書くほうが良いかも。

[Matt-Esch/virtual-dom]: https://github.com/Matt-Esch/virtual-dom