OmniAICreator/Qiita-1.07M huggingface dataset:
mysql-build で複数バージョンの MySQL とプラグインを同一ホストにインストール

最近 MacOSX (El Captain) 上で `brew upgrade mysql` を行って MySQL を 5.7.11 にバージョンアップしました。
が、その後 MySQL 5.6 で Q4M プラグインを有効にしたサーバがほしくなりました。

調べたところ、[mysql-build](https://github.com/kamipo/mysql-build) という @kamipo さんのツールでそれができるとわかりました。
下は YAPC Asia 2013 での LT スライドです。

* [mysql-buildでQ4Mやmroongaもビルドしたい](http://kamipo.github.io/talks/20130921-yapcasia2013-lt/#/title)

以下は MySQL 5.6.29 をビルドし、DB の初期化スクリプトを実行して、Q4M プラグインをインストールするまでのコマンドです。

```bash
git clone git://github.com/kamipo/mysql-build.git ~/mysql-build
mkdir -p ~/opt/mysql
# インストール可能なバージョンを確認
~/mysql-build/bin/mysql-build --definitions
# ビルド実行
~/mysql-build/bin/mysql-build -v 5.6.29 ~/opt/mysql/mysql-5.6.29 q4m-0.9.14
cd ~/opt/mysql/mysql-5.6.29
# mysqld の初期化スクリプト実行
scripts/mysql_install_db --datadir=./data --basedir=./ --user=mysql
support-files/mysql.server start
# Q4M プラグインのインストール
cat support-files/install-q4m.sql | mysql -uroot
```

ビルドには、core i7, メモリ8G のマシンで30分ぐらいは掛かったかと思います。

ちなみに、その後ついでに同じく mysql-build を使って MySQL 5.7.10 で Q4M をインストールできるか試してみたのですが、ビルドに失敗してしまいました。

詳しく追ってはいませんが、少しだけログを貼っておきます。

```bash
%~/mysql-build/bin/mysql-build -v 5.7.10 ~/opt/mysql/mysql-5.7.10 q4m-0.9.14
:
Last 10 log lines:
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmysqlpump_lib.a(i_data_formatter.cc.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmysqlpump_lib.a(i_data_formatter_wrapper.cc.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmysqlpump_lib.a(i_data_object.cc.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmysqlpump_lib.a(i_object_reader.cc.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmysqlpump_lib.a(i_object_reader_wrapper.cc.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmysqlpump_lib.a(i_output_writer.cc.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmysqlpump_lib.a(i_output_writer_wrapper.cc.o) has no symbols
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmysqlpump_lib.a(i_progress_watcher.cc.o) has no symbols
[ 93%] Built target mysqlpump_lib
make: *** [all] Error 2
```

以上です。
AGPLライセンスのiText5系を用いたオープンソースを公開するまで

#iText5系を用いたソースを公開するまでのメモ
[iTextのライセンスについて](http://qiita.com/toshi71/items/bc05d6e15edd645c8f46)
[iText(Java PDF ライブラリ) のライセンスについて](http://qiita.com/takudo/items/e2b37b659c9143db730c)
こちらの記事にある通り、iText5系はAGPLのライセンス形態を取っています。
会社で取り扱っているソースはiText2系を使用しているのですが、
iText5系にバージョンアップするまでのメモを残します。

##iTextAsianの取得
###java
[iText5用のiTextAsian.jar](http://takezoe.hatenablog.com/entry/20110224/p1)を参考に、
iTextAsianを取得

###vb.net
[ダウンロードページ](http://osdn.jp/projects/sfnet_itextsharp/downloads/extras/iTextAsian-all-2.1.zip/)より、
iTextAsianを取得。

##iText2系からの相違点
###java
・名前空間が変わっている。
　[こちらを参考にしました](http://d.hatena.ne.jp/mocchun/20140223/1393163246)
　import com.lowagie.text.pdf.BaseFont;
　を、以下のように変更した。
　import com.**itextpdf**.text.pdf.BaseFont;

・Color を BaseColorに変更
###vb.net
・AddToResourceSearchの名前空間変更が必要。
　[こちらを参考にしました](http://ukezara.net/hueho2013/?p=109)
　Imports iTextSharp.text
　BaseFont.AddToResourceSearch("iTextAsian.dll")
　を、以下のように変更した。
　Imports iTextSharp.text.**io**
　**StreamUtil**.AddToResourceSearch("iTextAsian.dll")

##githubにリポジトリ作成
追記予定でしたが、以下のページで詳しく説明ありました。
 [gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](http://qiita.com/shizuma/items/2b2f873a0034839e47ce)

##Readmeを書く
README.mdには
`BSDライセンスに準拠します。改変・再配布は自由です。利用した場合の報告は必要ありません。`
の記述があったのだが、削除した。
`AGPLライセンスに準拠します`
の記述にした。
DB内のテーブルを一括でCSV出力する

```一括CSV出力.sql
DECLARE @TableName NVARCHAR(31)
DECLARE @Counter INT
DECLARE @ServerName as char(256)
DECLARE @User as char(256)
DECLARE @Pass as char(256)
DECLARE @DBName as char(256)
DECLARE @OUTPass as char(256)
DECLARE @sqlTex as char(1024)

--接続情報・出力先--
set @ServerName = ''		--サーバ名
set @User = ''				--ユーザ名
set @Pass = ''				--パスワード
set @DBName = ''		--DB名
set @OUTPass = ''		--出力パス

DECLARE TableName CURSOR FOR
SELECT t.name as TABLE_NAME
FROM [DB名].sys.tables t order by TABLE_NAME

SET NOCOUNT ON

--メイン処理
OPEN TableName 

FETCH NEXT FROM TableName
INTO @TableName

WHILE @@FETCH_STATUS = 0
	BEGIN
	
	select @sqlTex = 'bcp "SELECT * FROM ' + @DBName + '.dbo.'+ @TableName + ' '
	+ '" queryout "' + @OUTPass + ''+ @TableName + '.csv" -c -t "," -S ' + @ServerName + ' -U '+ @User + ' -P ' + @Pass + ''
	EXEC master..xp_cmdshell @sqlTex

FETCH NEXT FROM TableName
INTO @TableName
END

--終了処理
CLOSE TableName
DEALLOCATE TableName

SET NOCOUNT OFF


```

```xp_cmdshell許可.sql
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1;
GO
-- To update the currently configured value for advanced options.
RECONFIGURE;
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1;
GO
-- To update the currently configured value for this feature.
RECONFIGURE;
GO
```
ipset と iptables で日本以外のIPアドレスからのアクセスを拒否する


## やりたいこと
日本以外のIPアドレスは全部拒否したい。（今回は Pingdom も許可する）

##

iptables で DROP のルールを作成します。
ルールが増えるとパフォーマンスが劣化するらしいので、ipset を使います。

## 手順

### ipset のインストールと初期化

yum で入れるとinitスクリプトとかがインストールされなかったので、こちらから。

```
rpm -ivh ftp://fr2.rpmfind.net/linux/centos/6.7/os/x86_64/Packages/ipset-6.11-4.el6.x86_64.rpm
```

初期化します。

```
ipset create -exist WHITELIST hash:net
ipset create -exist PINGDOM hash:ip
```


### JPのみをホワイトリストに入れる
国別のリストはこちらから取得できるのでありがたく使わせていただく。

```
wget 'http://nami.jp/ipv4bycc/cidr.txt.gz'
gunzip cidr.txt.gz
sed -n 's/^JP\t//p' cidr.txt | while read i ; do ipset add WHITELIST $i ; done
```

### PingdomのIPアドレスをホワイトリストに入れる
監視で Pingdom を使っている都合でこちらもホワイトリストへ。

```
curl -s -o pingdom.txt 'https://my.pingdom.com/probes/ipv4'
cat pingdom.txt | while read i ; do ipset add PINGDOM $i ; done
```

### 設定の保存
OS を再起動すると消えちゃうので保存。自動起動の設定。

```
/etc/init.d/ipset save
(/etc/sysconfig/ipset に保存される）
chkconfig  ipset on
```

IPアドレスのリストは変更する可能性があるので、シェルスクリプトとかにして cron で定期的に実行しておきます。こんなかんじ。

```
#!/usr/bin/env sh

set -ue

NOW=$(date +%Y-%m-%d-%H-%m)
MAILTO='you@example.com'
CIDR_LIST='http://nami.jp/ipv4bycc/cidr.txt.gz'
PINGDOM_LIST='https://my.pingdom.com/probes/ipv4'

alert () {
  echo $1
  echo $1 | mail -s "ERROR: ipset failed (${NOW})" ${MAILTO}
  exit 1
}

TEMP_DIR=/tmp/$$
mkdir -p ${TEMP_DIR} ; cd ${TEMP_DIR}

# clean if trapped or finished
trap "echo Trapped ; rm -rf ${TEMP_DIR}" 1 2 3 15
trap "echo Finished; rm -rf ${TEMP_DIR}" EXIT

# update ipv4
wget -nv -O - http://nami.jp/ipv4bycc/cidr.txt.gz | gunzip -c > cidr.txt || alert "Download failed: CIDR"
ipset create -exist WHITELIST hash:net
ipset flush WHITELIST
sed -n 's/^JP\t//p' cidr.txt | while read i ; do ipset -q add WHITELIST $i ; done
echo "Added $(ipset list WHITELIST | grep -v : | wc -l) to WHITELIST"

# update pingdom
wget --no-check-certificate  https://my.pingdom.com/probes/ipv4 || alert "Download failed: Pingdom"
ipset create -exist PINGDOM hash:ip
ipset flush PINGDOM
cat ipv4 | while read i ; do ipset -q add PINGDOM $i ; done
echo "Added $(ipset list PINGDOM | grep -v : | wc -l) to PINGDOM"

# save
echo "Total $(ipset list | grep -v : | wc -l) added"
/etc/init.d/ipset save

exit 0
```

## iptablesのルールを追加
sshの場合。こんなかんじ。

```
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -m set –match-set WHITELIST src -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -m set –match-set PINGDOM src -j ACCEPT
```

hashlimitと組み合わせてもいいぞ。
捗れ〜。
JavaScript高速化への道 - ループの処理を高速化

# ループの処理を高速化

* ループ処理を選ぶ
* 処理の実行時間を把握する

## ループ処理を選ぶ
* while
* for 
* for in

不規則な配列を処理する場合

```js
var arr = [];
arr[0] = 1;
arr[500] = 1;
arr[1000] = 1;
arr[5000] = 1;
arr[100000] = 1;
arr[500000] = 1;
```

## while
```js
console.time("while");
var sum = 0;
var i = 0;
var length = arr.length;
while(i < length) {
    if (!(i in arr)) {
        i++;
        continue;
    }

    sum += arr[i];
    i++;
}
console.timeEnd("while");
```

結果
* Chrome: 107.318ms
* FireFox: 43.08ms
* Safari: 41.323ms

## for
```js
console.time("for");
var sum = 0;
var length = arr.length;
for(var i = 0; i < length; i++) {
    if (!(i in arr)) {
        continue;
    }

    sum += arr[i];
}
console.timeEnd("for");
```

結果
* Chrome: 101.069ms
* FireFox: 42.45ms
* Safari: 40.033ms

## for in
```js
console.time("for in");
var sum = 0;
for(var i in arr) {
    if (!arr.hasOwnProperty(i)) {
        continue;
    }

    sum += arr[i];
}
console.timeEnd("for in");
```

結果
* Chrome: 0.060ms
* FireFox: 0.39ms
* Safari: 0.053ms

## 不規則な配列を処理する場合
プレーンなArrayが条件であれば、不規則な配列をループで処理をしたい場合
for inが一番高速に処理をしてくれた。

## 処理の実行時間を把握する

```
console.time("while");
while(total < 30) {
    console.time("for in");
    var sum = 0;
    for(var i in arr) {
        if (!arr.hasOwnProperty(i)) {
            continue;
        }

        sum += arr[i];
    }
    console.timeEnd("for in");
    total++;
}
console.timeEnd("while");
```

結果
* Chrome: for inの平均値: 0.02ms, while: 2.836ms
* FireFox: for inの平均値: 0.2ms, while: 16.81ms
* Safari: for inの平均値: 0.02ms, while: 3.257ms


method単位の実行時間を計測して気付いたのが
ループ処理に複数のmethodをのせると、ループ自体が重くなるので
役割を分担させることで高速化を試みる。

* ループ処理は、ループを完了することに集中する。
* 各methodは非同期で処理する

```
console.time("while");
while(total < 30) {
    setTimeout(function()
    {
        console.time("for in");
        var sum = 0;
        for(var i in arr) {
            if (!arr.hasOwnProperty(i)) {
                continue;
            }

            sum += arr[i];
        }
        console.timeEnd("for in");
    },0);
    total++;
}
console.timeEnd("while");
```

結果
* Chrome: for inの平均値: 0.02ms, while: 0.203ms
* FireFox: for inの平均値: 0.2ms, while: 1.41ms
* Safari: for inの平均値: 0.02ms, while: 0.226ms

methodの順番を担保したい場合は別途考慮が必要だけど
速度を上げるだけであればこれもいいかもしれない。
Linuxで透過プロキシ、プロキシサーバーを設置する

面倒な明示を必要としない透過プロキシの使い方など

透過プロキシは、SHELL変数とかに依存しないので便利です。

例えば、ここでは、`privoxy`を使います。

```bash:
$ sudo pacman -S privoxy
```

これは、主に、cookie無効化とかuser agent偽造とか広告ブロックとかアクセス制限とか、そういうのを常時有効にしたい人が使いますね。

```bash:/etc/privoxy/config
## all network
# listen-address 192.168.1.X:8118
## local network
# listen-address 127.0.0.1:8118
## tor socks5
#forward-socks5 / 127.0.0.1:9050 .
# transparent proxy
accept-intercepted-requests 1
```

`listen-address`は、デフォルトでは、`localhost:8118`になります。これは、ローカルで使う場合ですね。

他のパソコンから当該プロキシサーバーを経由したい場合は、`ifconfig`で調べたサーバーのアドレスを記述すればいいです。

```bash:
$ sudo systemctl start privoxy
$ sudo systemctl enable privoxy
```

`iptables`を使う場合は以下のような感じ。簡単ですね。

```
# iptables
$ sudo iptables -t nat -A PREROUTING -s 192.168.1.X -p tcp --dport 80 -j REDIRECT --to-ports 8118
```

各種デバイスで上記で立ち上げた`privoxy proxy server`を経由する場合は、通常、各種OSのネットワーク設定からプロキシ設定を`192.168.1.X:8118`にすればいけます。Xはサーバーのアドレス。

ネットワーク設定で一括指定できるので、面倒ではないですね。

通常のローカルネットワークというのは、このようにローカルネットワーク内に設置された一つのプロキシサーバーを経由して、WANとのやり取りをするようになっており、これによって一括してログ監視やアクセス制限が可能な仕組みが一般的です。

`/etc/privoxy/config`は、デフォルトで`/etc/privoxy/user.*`を読み込んでいて、それに追記することでユーザー設定が出来ます。cookieを強くすると、認証が失敗することもあるので弱めに。

```bash:/etc/privoxy/user.action
## UA
{ +hide-user-agent{ Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/1718; U; en) } }

## Cookie
# { +crunch-incoming-cookies +crunch-outgoing-cookies +filter{content-cookies} }
{ +session-cookies-only }

## Other
{ \
+change-x-forwarded-for{block} \
+hide-from-header{block} \
+hide-referrer{conditional-block} \
+hide-accept-language{en-us} \
+hide-if-modified-since{-60} \
+overwrite-last-modified{randomize} \
+crunch-if-none-match \
+session-cookies-only \
+fast-redirects{check-decoded-url} \
+hide-user-agent{ Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/1718; U; en) } \
}
/
```

広告ブロックはファイルを自動ダウンロードして設定するものがありますので、[そちら](https://github.com/Andrwe/privoxy-blocklist)を。

```bash:
$ git clone https://github.com/Andrwe/privoxy-blocklist
$ cd privoxy-blocklist
$ chmod +x privoxy-blocklist.sh
$ sudo su
$ ./privoxy-blocklist.sh

# コメント削除
$ vim /etc/conf.d/privoxy-blacklist
"PRIVOXY_USER=xxx"
"PRIVOXY_GROUP=xxx"
"PRIVOXY_CONF=xxx"
# 再実行
$ ./privoxy-blocklist.sh
# 再起動
$ systemctl restart privoxy
```

参考

http://blog.asial.co.jp/1076

https://wiki.archlinuxjp.org/index.php/Privoxy
Deisを外向きに公開する時に必須の設定

# 要約

[Deis](http://www.deis.io/) で構築した web アプリを外向けに公開するときには、下記の設定を行いましょう。

## 作業

### Deis v1

`deisctl` コマンドを使って controller に設定を行います。

```
deisctl config controller set registrationMode="admin_only"
```

### Deis Workflow (v2)

`kubectl patch` コマンドを使って、controller pod に与える環境変数を追加します。

```
kubectl --namespace=deis patch deployments deis-controller -p '{"spec":{"template":{"spec":{"containers":[{"name":"deis-controller","env":[{"name":"REGISTRATION_MODE","value":"admin_only"}]}]}}}}
```

(追記: さすがに本家も危険だと思ったようで，[デフォルト設定を admin_only とするプルリク](https://github.com/deis/workflow/pull/758)が作られマージされました。次の Workflow v2.12.0 よりも新しい版では作業の必要はなくなるはずです。)

# 理由

これを怠ると、誰でも `deis register` の実行が可能になり、つまりアプリケーションのデプロイも可能になります。悪いことがいろいろできるわけです。登録時のメールアドレスの詐称は簡単にできますし。

なお、上記設定は、自分をユーザとして登録してから行います。そうしないと自分さえも登録できなくなります。[^1]

[^1]: Deis では、最初に登録したユーザに限り、管理者権限が自動的に付与されます。)

# もっと安全に

`REGISTRATION_MODE` には `disabled` も指定できます。この場合、管理者権限があってもユーザの追加はできません。チームの構成が流動的ではないときは `disabled` でもよいかもしれません。
IntelliJ系IDEでエディタタブを最大化するショートカットを変更する

IntelliJ 2016.1で検証していますが、PhpStormやAndroid Studioでもいけるはずです。

IDEで作業している時間の99%はエディタとにらめっこしているので、ここを最大化するのですがデフォルトのショートカットは

```
[Shift]+[Command]+[F12]
```

どうもなじめないので、変える方法を探してましたが、ようやく見つけたので共有

```
Preference > Keymap > Window > Active Tool Window > Hide Active Tool Window
```

<img width="955" alt="Screen Shot 2016-04-07 at 11.31.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/79e25fce-deb8-b046-a7e3-dbb4364ec006.png">



てっきりMaximizeとかToggleとかで検索に引っかかると思っていたんですが、Hideとは。アクションをなんでも検索できるのがIntelliJ系エディタのいいとこなんですが、そもそもキーワードをわかってないと探せない問題。

ちなみに私は

```
[Ctrl]+[Shift]+W
```

にバインドしてます。
快適〜。
WindowsでPython環境構築


windowsでchainerを使いたくて、でもpipでインストールできなくて...って困ってる方（私）用です。
OSはwindows10を想定

やることは2つだけ

* Anacondaのインストール
* Visual Studioのインストール

私はこれで動きました


##Anacondaのインストール
windowsではNumpyとかScipyとかインストールに手間取ってしまうひとが多いと思うので、そういった主要ライブラリを全て網羅しているAnacondaをインストールするのが手っ取り早いです

[Anacondaのインストーラ](https://www.continuum.io/downloads)

自分の使うPythonのversionに合わせたものをインストールしましょう。
インストール設定は私はデフォルトなので飛ばします

##Visual Studioのインストール

まずはインストーラのダウンロード

[Visual Studio 2015](https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs#DownloadFamilies_2)

次にインストールに移るわけですが、ここが一番大事

###インストール設定で、必ずカスタムを選択
カスタムを選択した後、プログラミング言語から

* Python Tools for Visual Studio

にチェックを入れる事。その後は自分好みの設定でインストール

##
ここまできたら、先ほど入れたAnacondaの"conda prompt"を起動して、

``conda update anaconda``でモジュール群のアップデートをし、

``pip install chainer``

で終了です。chainerのインストールも弾かれないと思います
OP動画のあるスライドにBGMを入れる方法

#はじめに
発表を行う際に最初から最後まで動画だとトラブルがあった時に対応しづらいため、私はスライド(Keynote)での発表をすることが多いです。またOPに動画を入れることが時折ありますがその場合、動画の音声とBGMが被ってしまうという現象が発生します。スライドにBGMを入れる方法を知らず手間どったのでここに共有します。


#スライド1枚だけにBGMを入れる
スライド一枚だけにBGMを入れる場合、ツールバーにあるメディア→ミュージック　を選択し、曲を選択することでBGMを入れることができます。<img width="2560" alt="スクリーンショット 2016-04-07 11.11.36.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95928/51c5bcab-40c4-5946-da4d-5bf5138acec6.jpeg">

このやり方ではスライドを次のページに切り替えた際、BGMが止まってしまいます。なので各スライドにこの作業を行わなくてならず、非常に効率が悪いです。

#複数スライドに渡ってBGMを流す
何枚ものスライドに渡ってBGMを流したい場合、はツールバーの右端にある書類→オーディオ　を選択します。<img width="2558" alt="スクリーンショット 2016-04-07 11.22.11.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95928/9b0227a3-a7a7-cc91-5f86-1a012447b931.jpeg">

このサウンドトラックにオーディオファイルを追加することでスライドが次のページに進んでもBGMが止まらず再生されます。複数のオーディオファイルを追加できる他、1回だけ再生なのか連続再生かを選択することができます。BGMが再生されるタイミングは再生ボタンを押した直後となります。

#OP動画があるスライドにBGMを入れる
OP動画がある場合にはOP動画終了後にBGMをスタートさせる必要があります。この場合、**何も録音されていないオーディオファイル**をOP動画の時間だけ最初に入れてやることで解決できます。 編集ソフトは何でもいいですが、私はPremire proのオーディオのみの書き出しをよく使っています。

#注意点
再生ボタンを押してからすぐに動画を再生させないと、動画が流れている最中にBGMが始まり、悲惨なことになります（やらかした経験あり）。スライドの途中に音声入りの動画を流す場合、BGMと被ってしまうことが考えられます。その場合このやり方は使えないです。


これよりよい方法があれば是非コメント等で教えていただけるとありがたいです。
[cocos2d-x] デバッグビルドの時だけログを出力する

## 背景
cocos2d::log()では、リリースビルドでもログが出てしまうので、
リリース時には不要なログを出力しないようにしたい。

## 使い方
単純にcocos2d::logをcocos2d::log_dに置き換えるだけ。

```cpp
#include "LogSupport.h"

USING_NS_CC;

log(...);
↓
log_d(...);
or
cocos2d::log_d(...); 
```

## 実装
可変長引数の対応のところは、StringUtils::fomart()の中身をそのまま持ってきた。

```cpp:Classes/LogSupport.h
#ifndef __LogSupport__
#define __LogSupport__

#include "cocos2d.h"

// ログ出力
namespace cocos2d {
    void log_d(const char* format, ...);
}

#endif
```

```cpp:Classes/LogSupport.h
#include "LogSupport.h"

static const int MAX_STRING_LENGTH = 1024 * 100;

void cocos2d::log_d(const char* format, ...) {
#if COCOS2D_DEBUG
    std::string ret;

    va_list ap;
    va_start(ap, format);

    char* buf = (char*)malloc(MAX_STRING_LENGTH);
    if (buf != nullptr) {
        vsnprintf(buf, MAX_STRING_LENGTH, format, ap);
        ret = buf;
        free(buf);
    }
    va_end(ap);

    cocos2d::log("[DEBUG] %s", ret.c_str());
#endif
}
```
nodebrewユーザーがTypeScriptの最新版をWebStormで使う方法

@clockmaker氏のQiita記事「[TypeScriptの最新版をWebStorm (IntelliJ IDEA)で使うときの設定方法](http://qiita.com/clockmaker/items/d573cce0e55f2990aa02)」において、WebStormでTypeScriptの最新版を使う方法が紹介されていました。Node.jsのバージョン管理ツール「[nodebrew](https://github.com/hokaccha/nodebrew)」のユーザー向けのパスの通し方は少々異なるのでまとめました。

# nodebrew導入時のnpmモジュールのインストール場所
プロジェクト毎にNode.jsのバージョンを切り替えたい時など、Node.jsのバージョン管理に便利なnodebrew。使い方は @sinmetal氏 の記事「[node.jsのversionを管理するためにnodebrewを利用する - Qiita](http://qiita.com/sinmetal/items/154e81823f386279b33c)」にわかりやすくまとまっています。記事で紹介されているように、下記コマンドでグローバル環境にインストールされているnpmモジュールを、カレントバージョンにも適用できます。

```bash
$ nodebrew migrate-package v(現在使用中のNode.jsのバージョン)
```

**macOSの場合、TypeScript等の各npmモジュールへは下記パスでアクセスできます。**

```
/Users/(ユーザー名)/.nodebrew/current/lib/node_modules/
```

TypeScriptも上記フォルダにあるので、WebStormではここにパスを通します。

#WebStormの設定
WebStormではデフォルトでTypeScriptのコンパイラーが内蔵されています。そのコンパイラーを切り替え、最新版のTypeScriptを使うように設定します。

[WebStorm]→[Preferences]→[Languages & Frameworks]→[TypeScript]を選択し、TypeScriptの設定画面を開きます。[Enable TypeSCript Compiler]にチェックを入れ、TypeScriptのコードが自動でコンパイルされるようにしておきます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/47924d3a-cebb-8662-8588-c9888f5cd357.png)

[Compiler version]の箇所で、[Edit]を選択し、コンパイラーの設定画面から[Custom directory]にチェックを入れ、下記のパスを指定します。

```
/Users/ユーザー名/.nodebrew/current/lib/node_modules/typescript/lib
```

![](https://qiita-image-store.s3.amazonaws.com/0/67884/4431bf02-0eee-73db-2452-c832fc717487.png)

[OK]を押して設定画面に戻り、[apply]を押すと設定終了です。これでNodebrewユーザーも、最新版のTypeScriptがWebStormで使えます。
Rubyで、CやJava風のenumを実装する

# 参考
- [[Ruby] ちゃんとしたCみたいなenum](http://blog.aotak.me/post/39930126098/c-like-enum-more)

# 実装

## enumeration.rb

ほぼ、参考記事のコードのコピペですが、value_ofメソッドを追加しました。

```ruby
# @see: http://blog.aotak.me/post/39930126098/c-like-enum-more
module Enumeration
  @@__class = nil
  @@__value = 0

  def self.generate(klass, &bloc)
    @@__class, @@__value = klass, 0
    @@__class.tap {|c|
      c.class_variable_set(:@@__mod, self)
      c.class_eval(<<-EOS, __FILE__, __LINE__)
        def self.const_missing(name) @@__mod.const_missing(name) end
        def self.value_of(name) @@_mod.__send__(name) end
      EOS
      module_eval(&bloc)
      c.class_eval(<<-EOS, __FILE__, __LINE__)
        def self.const_missing(name) super end
        def self.value_of(name) __send__(name) end
      EOS
      c.remove_class_variable(:@@__mod)
    }
    @@__class = nil
  end

  def self.respond_to?
    @@__class != nil
  end

  def self.method_missing(name, *args)
    @@__value = args.first unless args.empty?
    @@__value.tap {|value|
      return @@__class.__send__(name) if @@__class.respond_to?(name)
      define_enum(name, value)
    }
  end

  def self.const_missing(name)
    return super unless @@__class
    @@__value.tap {|value|
      return @@__class.__send__(name) if @@__class.const_defined?(name)
      define_enum(name, value)
    }
  end

  def self.define_enum(name, value)
    @@__class.instance_eval(<<-EOS, __FILE__, __LINE__)
      def #{name}() #{value} end
    EOS
    @@__class.class_eval(<<-EOS, __FILE__, __LINE__)
      def #{name}() #{value} end
    EOS
    @@__value += 1
  end
end

class Module
  def enum
    Enumeration.generate(self, &proc)
  end
end
```

## 使い方

```ruby
require 'enumeration'

module KeyCode
  enum {
    UNKNOWN
    SOFT_LEFT
    SOFT_RIGHT
    HOME
  }
end

p KeyCode.UNKNOWN #=> 0
p KeyCode.SOFT_LEFT #=> 1
p KeyCode.value_of('UNKNOWN') #=> 0
p KeyCode.value_of('SOFT_LEFT') #=> 1
```
LTO6テープの中身をオンザフライでMD5チェック

LTO6テープにちゃんと書き込めたかどうかmd5sum -cでチェックする場合、何も考えずにテープからディスク上にいったん全部書き出してmd5sum -cでチェックしてもよいのだけど、場所と時間がかかるのでオンザフライでチェックだけ行って、ディスク上には何も書き出さないプログラムを作成してみた。

また、我々の目的としてはアーカイブ内の本当に大事なファイルだけチェックできればいいので、それだけチェックして、他のファイルは読み飛ばす仕組みにしたかった。

最初はApache Commons のCompressも試してみたんだけど、ブロックサイズの問題なのか、読み飛ばしできないのか、DigestInputStreamを併用できないのか、ファイルでは動くけどテープでは失敗しちゃうのか、詳しい理由は忘れてしまったけど、Apache Commonsの中の実装がよく分からなくてどうもうまく行かないので、自分で生のテープ内のデータ構造にアクセスして直接読み出すようにしてしまった。

https://github.com/OberonTheWizard/TarChecker

作成したプログラムは、このURLのTarChecker2.java

プログラム内のBLOCK_SIZE は今回は512バイト、blocking factorは128(BUFSIZEの64KB=512バイト*128個)にしてあるけど、LTO6以外のテープやドライブによっては設定を変えなきゃいけないかもしれない。

読み出したデータはストリームでMD5の計算をしていくので、大きなファイルでもメモリは食わない。ただし、チェック対象のファイルのリスト、つまりMD5値のリストのファイルはメモリ上に持ってしまうので、チェックするファイル数が膨大な場合はメモリを食うかもしれない(我々の用途では数百個程度なので問題にはならない)。
Atom-runnerでrbenvが上手く動かない（未解決：暫定回避策あり）


ターミナル上で実行する分には問題なく動く。
Atom-runnerで実行すると

```

`require': cannot load such file -- xxxxxxxxx

```

となり、Gemが見つからないようなので調べてみた。
ちなみにrubyはrbenvで入れています。

# 【原因】rbenvにPATHが通ってない

普段はzsh使いなので、rbenvの設定はbashには入れていない。
そのため、OSX標準のrubyが読み込まれていると思われる。

確認には下記のスクリプトをAtom-runnerで実行してみた。

``` test.sh
rbenv version
ruby -v
which ruby
echo $PATH
```

```
/Users/dancho/.homesick/repos/dotfiles/home/.atom/packages/atom-runner/examples/test-bash.sh: line 1: rbenv: command not found
ruby 2.0.0p645 (2015-04-13 revision 50299) [universal.x86_64-darwin15]
/usr/bin/ruby
/usr/bin:/bin:/usr/sbin:/sbin
```

# 試行錯誤

## 1. .bashrcにrbenvの設定を入れてみる

``` ~/.bashrc
eval "$(rbenv init -)"
```

ネットで調べると、Atom-runnerはbashで動いているらしいので、.bash_profileに設定をしてみた。

```
2.1.5 (set by /Users/dancho/.rbenv/version)
ruby 2.0.0p645 (2015-04-13 revision 50299) [universal.x86_64-darwin15]
/usr/bin/ruby
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

一歩前進。rbenvのPATHは通ったが、rubyは相変わらずOSX標準。

## 2. Atomの設定ファイルを書き換えてみる

``` init.coffee
process.env.PATH = "#{process.env.HOME}/.rbenv/shims:#{process.env.HOME}/.rbenv/bin:#{process.env.PATH}"
```

ここで不思議な事態に。
Atom再起動直後はrbenvのPATHは通らなかったが、rubyはrbenvのものを向いている。

```
/Users/dancho/.homesick/repos/dotfiles/home/.atom/packages/atom-runner/examples/test-bash.sh: line 1: rbenv: command not found
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]
/Users/dancho/.rbenv/shims/ruby
/Users/dancho/.rbenv/shims:/Users/dancho/.rbenv/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

何度か繰り返しているとrbenvのPATHが通ったが、PATHの順番が入れ替わってしまった。

```
2.1.5 (set by /Users/dancho/.rbenv/version)
ruby 2.0.0p645 (2015-04-13 revision 50299) [universal.x86_64-darwin15]
/usr/bin/ruby
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/dancho/.rbenv/shims:/Users/dancho/.rbenv/bin
```

## 継続調査中。。。

もう少しAtom-Runnerのソースを追ってみたい。

# 暫定回避策

```
#! /Users/xxxxx/.rbenv/shims/ruby
```

シバンで逃げた（汗
ちょっとしたスクリプトならこれでなんとかなるかも。
【VB.NET】TypeScript with AngularJSをASP.Net MVCで使う

# 内容
- 環境：Visual Studio Community 2015
- TypeScript×AngularJS×ASP.Net MVCのサーバサイドがvb.netのお話です。
- [この記事](http://qiita.com/tomoko523/items/1d4ed13e5e3fc1eafe23#_reference-cf3c39cf2deebc2bb047)の続きです。

# 参考元記事
- [環境構築](http://qiita.com/laco0416/items/3d8083647c8f70a68597) / [DEMO](http://qiita.com/laco0416/items/1d2d587fe6d5b89a5990)
- ⇒Visual Studio 2015からはデフォルトでTypeScriptを使用したHTMLアプリケーション」が選択できます。

# サーバーサイドのAPI(vb.net)

- サーバーサイドのAPI以外は参考記事のソースと同じです。
- C#→vb.netに書き換えました。

```ValuesController.vb

Imports System.Data
Imports System.Net
Imports System.Net.Http
Imports System.Web.Http

Namespace TypeScriptHTMLApp.Controllers

    Public Class Value
        Public Property Text As String
    End Class

    Public Class ValuesController
        Inherits ApiController

        Private Shared _Value As Value
        Public Property Value() As Value
            Get
                Return _Value
            End Get
            Set(ByVal val As Value)
                _Value = val
            End Set
        End Property

        ' GET: api/Values
        Public Function GetValues() As Value
            Return Value
        End Function

        ' POST: api/Values
        Public Function PostValue(<FromBody()> ByVal value As Value) As HttpResponseMessage
            _Value = value
            Return Request.CreateResponse(HttpStatusCode.Created)
        End Function
    End Class
End Namespace
```

# 余談

Namespaceを最初`Namespace Controllers`のままにしていたらPOSTのValueが受け取れず半日ほど悩みました…
`Namespace TypeScriptHTMLApp.Controllers`にしたらあっさり解決しました。
Namespace大事！！
チャットツールやSNSで一瞬で画面キャプチャーを送る方法

[Slack](https://slack.com/)や[ChatWork](http://www.chatwork.com/ja/)といったチャットツールは、開発時のコミュニケーションに欠かせないものです。「このHTML、レイアウトが崩れているようなのですが見てくれませんか？」と画面キャプチャーを送る時等、**相手に一瞬で画面キャプチャーを送信する方法**を紹介します。

# 画面キャプチャー手順
macOSでの手順です。

1. [command] + [shift] + [4] を同時に押し、画面キャプチャー撮影モードにします。（押し続ける必要はありません）
2. [スペース]キーを押すと、ウインドウ撮影モードになるので、マウスを動かして撮影したいウインドウを選択します。
3. ここがポイント。**[control]を押しながらマウスをクリックして、クリップボードに画像をコピー**します。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/370042bf-f753-810d-811e-dbac4f00fdf8.jpeg)

▲ キャプチャー送信したいウインドウを選択している様子

※ 他にも選択範囲でキャプチャーを撮ることもできます。詳しくは記事「[macOSの一歩進んだ画面キャプチャテクニック](http://qiita.com/tonkotsuboy_com/items/f8e98697456a1d2a7ebe)」を参照してください。
※ Windowsの場合は[PrintScreen]を使うとよいでしょう。 

# チャットツールやSNSでの送信手順
**送信したい相手とのチャットルームで、[Command] + [V]を押すだけ**です。自動でクリップボードの画像を送信するモードになります。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/f36e21e3-e8bf-fee3-5d40-ad20db192cc2.png)

▲ 画面キャプチャーを送信している様子（チャットワーク）

[チャットワーク](http://www.chatwork.com/ja/)・[Slack](https://slack.com/)・[Skype](https://www.skype.com/ja/)と言ったチャットツールの他、[Facebook](https://www.facebook.com/)（※）・[Twitter](https://twitter.com/)のようなSNSサービスでも対応しています。ちなみQiitaでは、投稿画面でクリップボードから画像を貼り付けることで、画像のアップロードが可能です。画面キャプチャーをネット上の相手に送信したい時に便利ですので是非ご利用ください。

※ Facebookは貼り付けを実行した瞬間に画像を送信するのでご注意を
EclipseでXMLをハイライトされたエディタで編集する

Eclipseを新規にインストールした時に、一瞬戸惑ったのでメモ。

#EclipseでXMLを更新しようとすると辛い

Eclipse上でXMLを開くと、デフォルトではXMLエディタが利用されます。
しかし、これが余計な構造化のせいで見慣れず扱いにくい。
普通にハイライトされたテキストエディタで見たい。

![2016-04-07_10h33_44.png](https://qiita-image-store.s3.amazonaws.com/0/115076/2f3acabe-ab2f-f366-3b74-d20feda849de.png)

*なんやねんこれ・・・

#ハイライトされたエディタで開く

[window]=>[設定]から
[一般]=>[エディター]=>[ファイルの関連付け]

ファイル・タイプから[追加]で[*.xml]を追加する。
その後、関連付られたエディタから好きなエディタを選択する。

[XSLエディタ]を設定。

これでハイライトされたエディタで見られます。めでたし。
J-1ビザでアメリカへインターンに行く流れ

# 概要

J-1ビザを取得してアメリカへインターンへ行く際の流れを整理しておきます。
基本的には、`弁護士`と`スポンサー`からの指示にしたがっていればいいのですが、全体の流れや必要期間を最初うまく理解できなかったので、今後、同じ境遇の人の手助けになれば。

また、ビザに関係なんく、海外へ長期仕事へ行く時に必要になることもめもとして残しておきます。

# 注意事項

2016年にJ-1ビザを取得した際の経験談です。
申請年や人、ビザの種類によっては変更されることがあるとおもいますので、最新情報は各自、調べていただければと思います。

# J-1ビザについて

詳細は下記を参照ください。

- http://www.ustraveldocs.com/jp_jp/jp-niv-typej.asp (アメリカ大使館サイト)
- http://www.acojob.com/services/visa_j1.htm

# 関係者一覧

J-1ビザ取得の際の関係者一覧です

- 受け入れ企業

> インターン生として自分を受け入れてくれる企業

- 弁護士

> ビザ申請に伴う資料の用意、全体の流れの説明など手続きをサポートしてくれます。
> 受け入れ企業が申請の事務手続きサポートで雇っていました。

- スポンサー

> 米国非営利教育団体（NPO）
> あくまでインターン（研修）ですので、研修の目的、ゴールが存在します。
> インターン生がその研修を受けるに値するか、研修内容が妥当かを個別にアメリカ大使館が判断できないので、代わりに管理、審査権限を与えられている団体

- アメリカ大使館

> 弁護士に必要資料を提出　→　スポンサーがそれを元に大使館提出用書類を作成　→　スポンサーが作成した資料を持って最後大使館で面接を行います。問題なければ、VISAが発行されます。

# STEP1 : 会社を探す

直談判、知り合いからの紹介などを利用して現地の会社を探します。
J-1ビザは取得のためにもろもろ、80万程度かかるようです。基本的に、その費用は会社持ちになるので、しっかりアピールします。

ただし、最近では、「アメリカで経験をつめるなら、ある程度、低賃金でもいい！」という意気込みを逆手にとる現地法人もあるようですので、給料面では妥協しないほうがいいと思います。

- 参考：[邦人インターンらの未払い給与支払い命令　米労働省、ＶＣに ](http://www.nikkei.com/article/DGXLASGM25H53_V20C16A2000000/)

# STEP2 : 弁護士へ必要書類提出

※資料はすべて英語

- Resume（経歴書みたいなもの）
- 大学の成績証明書、卒業証明書
- パスポートのコピー
- 前職の雇用証明書

# STEP3 : スポンサーからの指導

スポンサーからの指示で簡単なオリエンテーションを専用サイト（動画）を通しで行います。（スポンサーによると思います）

- 今後の流れ
- 現地での注意点
- 大使館面接での注意点

# STEP4 : 弁護士との面接練習

弁護士との大使館面接（英語）練習

- 現地での業務とその目的
- 日本に戻ってから何をする予定か　など

# STEP5 : アメリカ大使館面接予約

STEP3が終わった時点でスポンサーから下記資料が郵送されます

- DS-2019 (Certificate of Exchange Visitor Eligibility)
- DS-7002 (Training/Internship Placement Plan)
- I-94 card

それらを利用して、大使館へ面接予約します。その際、専用フォームに記入することで下記資料が手に入ります。

- DS-160
- SEVIS 領収書

`DS-160`記入の際に、ビザを取得してアメリカに長期入国することを理解している親族以外の2人の署名が必要になりますので、どなたかにお願いをしておきます。

# STEP6 : アメリカ大使館面接（英語）

おおかた、面接練習どおりです。
9:30の面接を予約しましたが、待ち時間が長かったので、大使館を出たのは12時頃でした。

問題なければ、提出資料に大使館の署名とパスポートにVISA（紙）を貼り付けてもらい後日郵送されます。
VISA取得までの流れは以上です。

# 申請から取得までの期間

約2ヶ月


# その他やっておくといいこと。

[海外長期滞在する場合にしておくといいこと](http://qiita.com/Tkashiro/items/c078b8e01767a5699052)

こちらにまとめました。
NUnitでTestCaseSourceを複数指定する方法

testcaseを大量に書くときにTestCaseSourceを使用して別ファイルにTestCaseを書くが、
そのTestCaseも複数指定したいときの方法がよくわからなかったので、試した。
以下の記法で実行できる。

```
    public class TestSuite2
    {
        public static Object[] one =
        {
            new object[]{"100"},
            new object[]{"101"},
        };
        public static Object[] two =
        {
            new object[]{"200"},
            new object[]{"201"},
        };
    }

    [TestFixture]
    public class Class1
    {
        [Category("list")]
        [Test, TestCaseSource(typeof(TestSuite2), "one"), TestCaseSource(typeof(TestSuite2), "two")]
        public void testCaseSource(string suite)
        {
             // test code
        }
    }
```
Xserver（エックスサーバー）でSSH接続して確認環境を作る

ウェブサイトをバージョンアップしたい時に、ftpでダウンロード=>アップロードして確認環境を作るのはめんどくさいので。

# 私の環境

Mac OS X El Capitan

# 登録されている一覧を表示
とりあえず、昔SSHしてるかもしれないので確認

`ssh-add -l`

# マニュアルを読む

## SSHの設定
> SSH設定
> https://www.xserver.ne.jp/manual/man_server_ssh.php

サーバー上で公開鍵認証用鍵ペアの生成したほうが簡単。
> サーバー上で公開鍵認証用鍵ペアの生成を行う場合

### 公開鍵を自分で作りたいときは

`ssh-kyegen`

## 秘密鍵の置き場所

どこでも良いのだろうけど・・・わからないのでとりあえずここ

`/Users/***yourname***/.ssh/`

## パスフレーズの登録

`ssh-add /Users/***yourname***/.ssh/***example***.key`

## バーチャルボックス使いたいときは キーチェンに登録

VCCWとかVagrantでローカル環境でsshしたい時に捗る

`ssh-add -K /Users/***yourname***/.ssh/***example***.key`

## ターミナルでssh

> SSHソフトの設定(Tera Term)
> https://www.xserver.ne.jp/manual/man_server_ssh_connect_tera.php

を参考に・・・

`ssh ***yourname***@***example***.xsrv.jp -p 10022`


# 開発環境を作る

`cd`で該当のディレクトリへ移動して

`cp -a public_html public_html_new`でまるごとコピーする。

あとは、ｆｔｐソフトで好きな所に移動したりリネームしておわり。
Object#tapでログ出力のためだけにローカル変数を使う人生にサヨナラを告げよう

概要
----

下記のようなコードで `foo` の戻り値をログ出力する際、どうしてますか？

```rb
def foo(opts)
  if opts
    "BAR"
  else
    "FOO"
  end
end
```

こうやってローカル変数を使って出力していた時期がありました

```rb
def foo(opts)
  r = if opts
        "BAR"
      else
        "FOO"
      end
  p r
  r
end
```

いまわかってるのは３つの方法
------------------------

- `Object#tap`
- tapp (gem)
- `Object#display`

Object#tapでローカル変数を排除する
------------------------------

結論、こんな感じに書き換えできます

```rb
def foo(opts)
  if opts
    "BAR"
  else
    "FOO"
  end.tap{|r| p r}
end
```

if..endの末尾に `.tap{|r| p r}` を加えるだけ

これで動く理由は参考資料でご確認ください（まるなげ

tapp (gem)なるもの
-----------------

コメントで [tapp](https://github.com/esminc/tapp) を紹介いただきました (thx! [yancya](http://qiita.com/yancya))

```rb
require "tapp"
def foo(opts)
  if opts
    "BAR"
  else
    "FOO"
  end.tapp
end
```

まさにこれ。

`Object#display` なるもの
------------------------

コメントで [`Object#display`](http://docs.ruby-lang.org/ja/2.3.0/method/Object/i/display.html) を紹介いただきました (thx! [riocampos](http://qiita.com/riocampos))

```rb
def foo(opts)
  if opts
    "BAR"
  else
    "FOO"
  end.display
end
```

標準メソッドにこんなものがあったとはっっ！

使い分け
-------

- `Object#tap`: Loggerで出力するとき。わりと本番用？
- tapp (gem): ともかく仕掛けておいて、あとで全部削除したいとき。grepしやすい
- `Object#display`: 出力先を一時的にfileにするとか、手軽に変えられるようにしたいとき

`Object#tap` はロギングが要件に組み込まれてる時にも使えます

```rb
require "logger"
$logger = Logger.new($stderr)
$logger.level = :debug
def foo(opts)
  if opts
    "BAR"
  else
    "FOO"
  end.tap{|v| $logger.debug v}
end
foo(true)
#=> D, [2016-04-08T08:00:45.572860 #13340] DEBUG -- : BAR
```

`Object#display` は標準出力とかに出しにくいバイナリデータを出力するのに良さそうです

```rb
$to_file = open(Time.now.to_i.to_s, "wb")
def foo(opts)
  if opts
    "BAR"
  else
    "FOO"
  end.display($to_file)
end
foo(true)
#=> UNIXタイムなファイルが作成され、中身はBAR
```


参考資料
-------

- [Object#tap](http://docs.ruby-lang.org/ja/2.3.0/class/Object.html#I_TAP)
- [Object#tapでローカル変数を減らす。](http://qiita.com/shunsugai@github/items/f010189b8993fe6dd81d)
- [tapかわいいよtap](http://d.hatena.ne.jp/rubikitch/20080502/tap)

あとがき
-------

[Qiitaのエントリー](http://qiita.com/shunsugai@github/items/f010189b8993fe6dd81d)に対する、具体的なユースケースという名のパクりエントリーでした、ごめんなさい
あと、エントリー名を "tapかわいいよ、tap" にしようとおもったら、[完全に一致するブログ](http://d.hatena.ne.jp/rubikitch/20080502/tap)があったので変更
node.jsでターミナルのリサイズを監視する

nodeでcliツールをつくってるとき、ターミナルの幅が変更を監視したいことがあります。
以下で監視できます。

```js
process.stdout.on('resize', () => {
	console.log(process.stdout.getWindowSize());
});
// => [ 103, 27 ]
// => [ 103, 25 ]
// => [ 103, 16 ]
```
Fink の特徴

Fink は、 MacOSX/Darwin 用のパッケージ管理ツールで、Unix 用のソフトウェアをインストールすることができます。Fink の特徴は、以下のとおりです。

#1. 安定性
Fink は、非常に安定している枯れたパッケージ管理システムです。ドキュメントも頻繁には更新されませんが、それは書き換える必要がほとんどないからです。枯れてはいますが、各パッケージは最新のものに更新され続けています。

#2. 依存性を解決
Unix ソフトウェアは、多くの場合他のソフトウェアに依存しています。依存関係を調べ、必要なソフトウェアを依存します。

Fink は、3つの依存関係があります。

- <b>依存</b> ビルド時、実行時ともに依存します。 
- <b>実行時依存</b> 実行時にのみ依存します。ビルド時にはなくても構いません。 
- <b>ビルド時依存</b> ビルド時にのみ依存します。ビルド終了後はアンインストールしても構いません。 


#3. バイナリ配布
Fink では、多くのパッケージがコンパイル済みのバイナリとして提供されます。このため、インストール時間を大幅に短縮することができます。

もちろん、自分でビルドすることも可能です。バイナリインストール後にビルドすることも可能です。

#4. 複数バージョンのインストール
Fink は、複数バージョンをインストースできることが前提となっています。

これは少し複雑な仕組みとなっています。例えば、GDAL は、gdal (version 1) と gdal2 があります。他のソフトウェアは、libgdal.1.dylib に依存しているかもしれませんし、libgdal.20.dylib に依存しているかもしれません。

- <b>gdal-dev</b> gdal-dev にビルド依存する時だけ臨時にインストールされる。 
- <b>gdal2-dev</b> gdal2-dev にビルド依存する時だけ臨時にインストールされる。 
- <b>gdal-shlibs</b> libgdal.1.dylib 
- <b>gdal2-shlibs</b> libgdal.20.dylib 
- <b>gdal</b> 旧バージョンのバイナリ。gdal2 がインストールされると自動的にアンインストールされる。 
- <b>gdal2</b> 最新のバイナリ 

-dev について、なぜこうなるかというと、ビルド時に必要なヘッダファイル (gdal-dev と gdal2-dev) は、同じファイル名のものが多いため、両方あると不適切だからです。まちがってインクルードされないように、ヘッダファイルをアンインストール/インストールできる仕組みを備えています。

gdal の場合、バイナリは同じファイル名のため複数バージョンはインストールできません。しかし、ほかの多くのパッケージはバイナリも複数バージョンに対応しています。

Python であれば、python27, python34, python35 など。Ruby であれば、ruby20, ruby21, ruby22, ruby23 があります。モジュールや gems などもそれぞれにあります。ファイル名は、それぞれ /sw/bin/python2.7 や /sw/bin/python3.5 となっているだけなので、モジュールの開発などにも便利です。

#5. ライブラリの指定
自分でビルドしたり、他のパッケージ管理システムを使用する場合、リンクは柔軟です。例えば、foo は、libbar.dylib に依存しています。しかし、libbar.dylib は実際には libbar.1.dylib へのシンボリックリンクです。libbar.dylib がアップデートされ、libbar.2.dylib にバージョンアップされたとします。これにより、foo が機能しなくなることもありえます。

この問題を避けるため、Fink では、 foo は libbar.dylib ではなく、libbar.1.dylib にリンクします。これにより、libbar.1.dylib と libbar.2.dylib が両方あっても、変わることなく使うことができます。

foo が libbar.2.dylib でも問題なく動作することが確認されたら、あらためて foo のリビジョンがアップされます。



この他にも、Fink には多くの魅力があります。
node.jsでターミナルの幅を取得する

node.jsでcliツールをつくってるとき、ターミナルの幅を知りたい時があります。
以下で取得できます。

```js
// 幅と高さ
process.stdout.getWindowSize()
// => [ 103, 27 ]

// 幅
process.stdout.columns
// => 103

// 高さ
process.stdout.rows
// => 27
```
GolangでJSONをデコードする


APIにリクエストしてjsonを受け取ってクラスにマッピングしたい。
Golangだと`json.Unmarshal`でやってくれる。

```example.go
package main

import (
    "encoding/json"
    "fmt"
)

type compilationsAPI struct {
	SourceCode string
	Langid     int
}

func main() {
    var s compilationsAPI
    str := `{"sourceCode":"puts \"hello world\"","langid":1}`
    json.Unmarshal([]byte(str), &s)
    fmt.Println(s)
}
```

## 参考
* [JSON and Go](http://blog.golang.org/json-and-go)
* [7.2 JSONの処理](https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/07.2.md)
DBaaSのPostgreSQLで最新バージョンが使えるようになったみたい(Compose.io)

これまで象さん（PostgreSQL)色々と試してきましたが、、、↓、そのPostgreSQLで最新バージョンの9.5が使えるようになったそうで。
http://qiita.com/azzeten/items/b1efc046deb448bc7ca5
http://qiita.com/azzeten/items/126c4730b6f8d15ae039
http://qiita.com/azzeten/items/a7a786701cf25ef1a087
http://qiita.com/azzeten/items/e9e09c3586c153916332



## PostgreSQL 9.5 now on Compose
https://www.compose.io/articles/postgresql-9-5-now-on-compose/

![p.png](https://qiita-image-store.s3.amazonaws.com/0/119378/9c70f15b-5578-eb30-6379-b7de559c0661.png)

やっぱり象さん...正確には9.5.2のようです。

pg_dumpが使えるみたいなことも書いてあるので（知らなかった・・！）、今度試してみよう。
git push `--force-with-lease`はいつも安全？

`git push --force-with-lease`は`git push --force`と違って、他の人がpushしていたら良い感じにコケてくれるので安全、という話を聞き、さっそく使っています。

* [git push --force でなく git push --force-with-lease を使う - valid,invalid](http://ohbarye.hatenablog.jp/entry/2016/04/04/235819)
* [--force considered harmful; understanding git's --force-with-lease - Atlassian Developers](https://developer.atlassian.com/blog/2015/04/force-with-lease/)

ただ、ちょっとだけ注意しないとな、と思ったところがあるので書き残しておきます。

## 前提

git 2.6.4で確認

## 最後にfetchしたタイミングでの一致を保証する

`man git-push`を見るとこんな記述があります。

> --force-with-lease alone, without specifying the details, will protect all remote refs that are going to be updated by requiring their current value to be the same as the remote-tracking branch we have for them.

つまり`--force-with-lease`はremote refsとローカルのremote-tracking branchのrefsの間に違いがないかどうかで、正否を判定しているわけですね。

ちなみにrefsというのはコミットへのポインタみたいなもので、ブランチやタグなどの単位で`.git/refs`配下に保存されているものです。
remoteのrefsは`git ls-remote`で見られて、多分これと一致判定をしている様子です。

なので、remote-tracking branchのrefsが、`push --force-with-lease`時のremote refsと一致しているときは通る、ということです。

## 普通に上書きされちゃうパターン

ということは、`push --force-with-lease`前に`fetch`をしていると、refsが一致して問題ないって勘違いしちゃう。

```bash
git checkout dev

# いくつかの変更をコミット & 同時にremoteに他の人がpush

git fetch origin dev
git push --force-with-lease origin dev
```

これが通っちゃうということですね。
こんなことをわざわざすることはあまりないとは思いますが、例えば次のように`origin/master`に対してrebaseするような場合はあり得るかなあと思います。

```bash
git checkout dev

# ↓ここ
git fetch origin
git rebase origin/master
git push --force-with-lease origin dev
```

`git fetch origin`とすると全部のブランチがfetchされるのですが、現在いるトピックブランチもfetchされてしまうので、結果的にさっきの例と同じ状況になってしまう、というわけですね。

僕はよくこういうことやるので、しっかりと`git fetch origin master`としたうえでrebaseしないとな、と思った次第です。

※もしくは、remote-tracking branchの`origin/master`に対するrebaseではなく、ローカルへmasterをpullしてからrebaseすればこの問題は起こりません
Sublime text で markdown だけ trim_trailing_white_space_on_save で効かないように。




`trim_trailing_white_space_on_save` を `true` にしていると、.md ファイルでも最後のスペースが削除されてしまうので、それの回避。 

----

Mac OS X:  `Sublime Text 2 > Preferences > Settings - More > Syntax Specific - User` を開く

作成された `Markdown.sublime-settings`にリネーム

```
{
    // Which file extensions go with this file type?
    "extensions":
    [
        "md",
        "mdown",
        "mdwn",
        "mmd",
        "txt"
    ], 

    // Sets the colors used within the text area
    // "color_scheme": "Packages/Color Scheme - Default/Dawn.tmTheme",

    // Set to true to removing trailing white space on save
    "trim_trailing_white_space_on_save": false
}
```



参考
http://www.granneman.com/webdev/editors/sublime-text/configuring-sublime-text/#markdown
ラズベリーパイ　固定IP　ポート番号　設定　

端末からraspberry pi 2+ (raspbian)へsshする際のカスタマイズ。

# 固定IPの設定
/etc/network/interfaces と /etc/resolv.conf を編集する。

ここに非常に丁寧な解説がある。
http://readwrite.jp/develop/6900/

```
raspberrypi$ sudo vi /etc/network/interfaces

.....
#iface eth0 inet manual
iface eth0 inet static
address 192.168.100.xxx
netmask 255.255.255.0
gateway 192.168.100.1
.....

```

iface eth0 のところを上記のように、staticに書き換え
3行追加する。
addressに、固定して使いたいipアドレス
netmaskはifconfigで調べられる。
gatewayは、 `netstat -nr` で 0.0.0.0 じゃない方、たぶん。

/etc/resolv.conf を見てみる。

```
raspberrypi$ sudo vi /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.100.1
```

nameserverがゲートウェイのipアドレスと一致してたらOK。してなかったら書き換える。

rebootして、ifconfigなどで指定したipアドレスに割り振られているか確認する。

# ポート番号指定
sshdの設定ファイルを書き換える

```bash
raspberrypi$ sudo vi /etc/ssh/sshd_config

......
# What ports, IPs and protocols we listen for
#Port 22
Port 2222
......

```

以上のようにデフォルトでは22になっているポート番号をコメントアウトして
新たに"Port 3141"を追記する。
ポート番号は65000ぐらいまで利用できる。

変更後は
`raspberrypi$ /etc/init.d/ssh restart`
でsshdを再起動する。

これで、このラズパイにssh接続する際には、ポート番号2222の指定が必要になった。
試しに、
`cygwin$ ssh -p 2222 -l pi 192.168.xxx.xxx`
で接続できるか確認する。

ラズパイのIPアドレスは、ラズパイのコマンドラインで
`ifconfig` または `ip addr show` で調べる。
有線ネットワークならeth0、無線（wifi）ならwlan0のとこのinetアドレスを見ればよいと思う。
ポート番号をデフォルトから変更することで、セキュリティがよくなる、たぶん。

*注意*
/etc/ssh/ssh_config　と間違えない。こっちはsshクライアント用

#グローバルIPアドレスとポートフォワーディングの設定
この設定は、ルータ側の設定で行う。
グローバルipを有効にする。
LAN側（ルータ側）のipアドレス（デフォルトゲートウェイ）とは別に、
WAN側のIPアドレスが取得できる。

外部のネットワークから、このWANのアドレスへアクセスがあったときに、指定されたポート番号によって、内部ネットワークのマシンへ接続を転送することができる。これがポートフォワーディング。

`outside$ ssh -l pi -p 2222 <global ip address>`

ポート2222を指定してssh接続された場合は、たとえば内部アドレスの192.168.100.xxxのラズパイに、転送するように設定できる。
ルータによって設定方法が違う。

#参考
固定IP
http://readwrite.jp/develop/6900/
ポート指定
http://www.obenri.com/_ntp_sshserver/sshdconfig401.html
技術英語 > they would withdraw [at the last minute]. / [Count me in] if you're going to play baseball.

@ LOE > February 28, 2003
http://loe.org/shows/shows.html?programID=03-P13-00009
> they would withdraw <font color=red>at the last minute</font>. 

http://ejje.weblio.jp/content/at+the+last+minute

<hr>
ドタキャンを英語で言うと以下のようになるだろう。

He canceled at the last minute.

cancelの後ろに目的語なり動作なしをいれるのもいいかもしれない。

> If you need to cancel a reservation at the last minute,
http://www.linguee.jp/日本語-英語/search?source=英語&query=canceled+at+the+last+minute



<hr>
ドタキャンから関連して思い出したのは

> <font color=red>Count me in</font> if you're going to play baseball.

http://ejje.weblio.jp/content/count+__+in

何か催しものがあり「参加するか」と尋ねられた時に`Count me in.`で参加の意思を表す。
Fink パッケージをローカルで最新にする

Fink パッケージを使っていると、使いたいバージョンより古いバージョンしかないパッケージがあります。自分で更新してしまいましょう。

例として、Ruby モジュールの sqlite3-rb22 を使用します。　

# ローカル環境を準備
まず、公式ディストリビューションではなく、自分のパッケージ記述ファイルを保存する場所を準備します。


書類フォルダーのなかに、 finkinfo というフォルダへのシンボリックリンクを作ります。

`$ sudo chmod o+w /sw/fink/dists/local/main/finkinfo`
`$ ln -s /sw/fink/dists/local/main/finkinfo ~/Documents/`

# 現在のパッケージ記述ファイルをローカル環境にコピー
つぎに、現在のパッケージ記述ファイルを探し、自分の場所にコピーします。

`$ fink dumpinfo -finfofile sqlite3-rb22`

`Information about 9119 packages read in 2 seconds.`
`infofile: /sw/fink/dists/stable/main/finkinfo/libs/rubymods/sqlite3-rb.info`

`$ cp /sw/fink/dists/stable/main/finkinfo/libs/rubymods/sqlite3-rb.info ~/Documents/finkinfo`

# パッケージ記述ファイルを更新
この sqlite3-rb.info を、テキストエディタで開きます。

変更するのは、２〜３点です。

```
Version: 1.3.10

Source-MD5: 68db47dc14ebb00f27f77fab346a6ce2
Source-Checksum: SHA1(6bbe47c3e690568b9aaf2c7d9aca59a069608b1e)
```

まず、 Version を最新のもの (1.3.11) にします。

この状態で、いちど fink でダウンロードしてみましょう。


```
$ fink fetch sqlite3-rb22

Downloading the file "sqlite3-1.3.11.gem" failed.

(1)	Give up
(2)	Retry the same mirror
(3)	Retry another mirror from your country
(4)	Retry another mirror
(5)	Retry using original source URL
```

ここで、(5) を選択します。


```
Expected: 68db47dc14ebb00f27f77fab346a6ce2
Actual: MD5(1cb7c23bbb8890bffc9d4467c3b58eac)
        SHA1(c6e8cc2ddf94824321a86923e8aae71e1f7ee1a6)
```

これは、旧バージョンの MD5 なので、異なるのは当然です。

この MD5 と SHA1 の値を、先ほどのファイルにコピペします。

もちろん、これではチェックしたことにならないので、本来はホームページ等に書かれている MD5 や SHA1 をコピペします。

# 最新バージョンをインストール
これでバージョンが更新されたので、

`$ fink install sqlite3-rb22`

とします。

# 本家へアップロード

作成した最新パージョンは、[Fink/Package Submissions](https://sourceforge.net/p/fink/package-submissions/)にアップロードしましょう。

SourceForge のアカウントが必要です。

Fink は、github に移行途中です。

# 参考

Fink は、ドキュメントがしっかりしており、日本語版もほぼ最新です。マニュアルを読みましょう。

[パッケージの作成方法](http://www.finkproject.org/doc/packaging/index.php)
JVM言語のGitHubリポジトリ数を調べてみた(2016/04/06)

[JVM言語](https://en.wikipedia.org/wiki/Category:JVM_programming_languages)のGitHubのリポジトリ数を調べてみました。比較用に他言語の数も追加しています。

##調査方法
[GitHubの検索ページ](https://github.com/search/advanced)で、言語を指定検索しています。検索条件の「Written in this language」でPopularとされている言語は全部含まれていると思いますが、それ以外は好みで選んでいます。


##プログラミング言語のGitHubリポジトリ数(2016/04/06調べ)

| language | repository | JVM言語 |
|:---------| ----------:|:-------:|
| JavaScript | 2,114,927 |(Nashorn,Rhino)|
| Java | 1,849,852 |yes|
| Python | 1,022,380 |(最新Jythonが、CPython 2.7.相当)|
| Ruby | 993,783 |(最新JRubyが Ruby2.2相当)|
| PHP | 837,020 |
| HTML | 749,259 |
| CSS | 663,824 |
| C++ | 550,597 |
| C | 472,629 |
| C# | 466,324 |
| Shell | 327,454 |
| Objective-C | 282,391 |
| R | 137,758 |
| Swift | 118,430 |
| Go | 116,974 |
| Perl | 114,047 |
| VimL | 82,274 |
| Scala | 66,766 |yes|
| CoffeeScript | 59,103 |
| TeX | 56,554 |
| Lua | 49,634 |
| Matlab | 47,193 |
| Haskell | 46,839 |
| Arduino | 43,159 |
| Clojure | 37,961 |yes(Lisp)|
| Emacs Lisp | 30,272 |
| Groovy | 25,009 |yes|
| ActionScript | 22,031 |
| Visual Basic | 21,636 |
| Processing | 17,376 |
| Puppet | 16,990 |
| Rust | 16,713 |
| TypeScript | 16,646 |
| Erlang | 16,279 |
| Assembly | 16,075 |
| Pascal | 11,507 |
| Common Lisp | 10,635 |
| Elixir | 10,197 |
| Ocaml | 7,474 |
| Scheme | 7,397 |
| D | 7,018 |
| FORTRAN | 6,802 |
| Dart | 6,742 |
| F# | 6,165 |
| Racket | 5,424 |
| Prolog | 5,288 |
| Kotlin | 3,341 |yes|
| PLSQL| 2,487| 
| Ada | 1,254 |
| Smalltalk | 1,217 |
| Awk | 663 |
| Xtend | 535 |yes|
| Eiffel | 457 |
| AspectJ | 387 |
| COBOL | 288 |
| Ceylon | 194 |yes|
| Frege | 144 | yes(Haskell風)|

##JVM言語の順位
Scala >> Clojure > Groovy >>>>>> Kotlin >> Xtend > Ceylon,Frege
こんな感じですかね。上位3言語は安定。Kotlinは今年もっと上がる予感。

##ところで
Delphiはどこにいった
HTTPのLinkヘッダがFirefox以外全滅な件

# 概要

スタイルシートといえば`<link>`要素を使うのが一般的ですが，実はRFC的にはHTTPヘッダに`Link: `を使うことも出来るようになっています．ところがブラウザの対応状況が意外にも芳しく無く…

バグ報告もありますね．

- [Issue 120104 - chromium - The http header "Link" is not properly processed (rfc5988) - Monorail](https://bugs.chromium.org/p/chromium/issues/detail?id=120104)

`rel=stylesheet`だけならまだしも，`rel=preload`な場合に正しく処理されていないとなるとかなり致命的な気がします．[こういう自動プリロード付加処理](http://qiita.com/mpyw/items/9d73e94e83730e6c8190)をやろうとするとだいたいHTTPヘッダを使う方法になりがちなので．

# 検証用コード

```css:test.css
h1 { color: red; }
```

```html+php:test.php
<?php

$style = base64_encode('h2 { color: red; }');

header("Link: <test.css>; rel=stylesheet", false);
header("Link: <data:text/css;base64,$style>; rel=stylesheet", false);
header('Content-Type: text/html; charset=UTF-8');

?>
<!DOCTYPE html>
<title>Example</title>
<h1>HTTP URIのスタイルシート</h1>
<h2>DATA URIのスタイルシート</h2>
```

反映されればその文字列が赤くなります．

# 結果

||HTTP URI|DATA URI|
|:---:|:----:|:----:|
|Firefox 45| ◯ | ◯ |
|Chrome 49| ✕ | ✕ |
|Safari 9| ✕ | ✕ |
|Internet Explorer 11 | ✕ | ✕ |
|Edge 25 | ✕ | ✕ |

#### 協力

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/mpyw">@mpyw</a> Edge/IE11ダメです <a href="https://t.co/Msu1K7olsH">pic.twitter.com/Msu1K7olsH</a></p>&mdash; sudosan (@sudosan) <a href="https://twitter.com/sudosan/status/717792833206226944">2016年4月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
gulpでのgit操作 commit messageをコマンドライン引数で渡そう

gitの操作をgulpで行うにはgulp-gitを使えばいいのだけど、commit messageを都度入力したい時には自前で書く必要がある。

gulpでコマンドライン引数を受けとれるようにするにはminimistを使う。

## インストール

1. ```npm install gulp-git --save-dev```
2. ```npm install minimist --save-dev```

## gulpfile.js
```js
var gulp        = require('gulp');
var git         = require('gulp-git');
var minimist    = require('minimist');

// parse command line argument
var argv = minimist(process.argv.slice(2));

// git manipulation
gulp.task('push', function(){
    return gulp.src('.')
        .pipe(git.add())
        .pipe(git.commit(argv['m']))
        .pipe(git.push('origin','master', function(err){
            if (err) throw err;
        }));
});
```

## コマンド
```gulp push -m "コミットメッセージ"``` 

## 解説
### minimist(process.argv.slice(2));

> process.argv

nodeの用意しているプロパティ。文字列の配列。

> slice(2)

配列の2番目を取り出す。

0番目にはNodeの実行ファイル、1番目には自分の作ったjsファイルが格納されているので、
```gulp push "コミットメッセージ"```というコマンドは
```(0)gulp (1)push (2)"コミットメッセージ"```と見ることができる。

#### minimistとは

本来、gulpでは引数を渡すことはできない。それを可能にするのがminimistである。
前述の「process.argv」でコマンドライン引数を受けとって、それをgulpで使えるカタチにパースしてくれるのだそうな。

### var args = minimist(process.argv.slice(2));

これまでの解説を要約すると、上記のコードは__コマンドライン引数をargsという配列に格納している__ってことになる。

### 引数の呼び出し方
コマンドライン上で```-m "メッセージ"```とした場合は```args['m']```で呼び出せる。

冒頭のgulpfile.jsのように

```js
.pipe(git.commit(argv['m']))
```

とすれば好きに呼び出すことができる。
Perlの正規表現でgrepしたい

pcregrepで複数行の文字列をマッチさせる - Qiita
http://qiita.com/biatunky/items/30bd07d7c9384d0c7895
に触発されて。

# Perl病でもPerl正規表現grepがしたい

Perlの正規表現に慣れると、grepの正規表現では満足できない身体になってしまいます。

```bash
$ cat a.txt
123
aaa
345
bbb
a5a
$ cat a.txt  | grep -e '\d+'
(何も出力されない)
```

# Perlワンライナーを使う

ワンライナーに投げてしまう方法です。
デメリットはperl実行処理コストぐらい？

```bash
$ cat a.txt  | perl -nlE 'say if /\d+/'
123
345
a5a
```

こんな置換も簡単

```bash
$ cat a.txt | perl -nlE 'say if s/(\d+)/[$1]/g'
[123]
[345]
a[5]a
```

| オプション  | 意味        | 
|:-----------|:------------|
| -n         | whileループにする "while (<>) { }" |
| -l         | 改行を取り除く(chomp)、print関数の場合は'\n'をつける|
| -E         | sayを使えるように |


# grepの-Pオプションを使う

grepにも実はPerl正規表現拡張を使うオプションがあります。（未確認、PCRE？）
デメリットはmanページにあるように実験的なので将来的に削除される可能性があります。
>       -P, --perl-regexp
              Interpret  PATTERN as a Perl regular expression.  This is highly
              experimental and grep -P may warn of unimplemented features.

```bash
$ cat a.txt  | grep -P '\d+'
123
345
a5a
```