OmniAICreator/Qiita-1.07M huggingface dataset:
ACAccountStore周りのメモ


Social.frameworkを使うときに使うACAccountStoreの挙動がわかりにくいので備忘録として残したいと思います。
注:Twitterのみで検証

##デバイスにアカウントが登録されているか否か

```objc
//SLComposeViewControllerクラス
+ (BOOL)isAvailableForServiceType:(NSString *)serviceType;
```

登録されてるとYES
登録されていないとNOが返ります。
アカウントへのアクセスをユーザーが許可していなくても、デバイスにアカウントが登録されてるとYESが返ります。

##デバイスに登録されているアカウントの取得

```objc
//ACAccountStoreクラス
- (NSArray *)accountsWithAccountType:(ACAccountType *)accountType;
```

デバイスにアカウントが登録されていても、アクセスを許可されていない場合はゼロObjectになります。
もちろん、デバイスにアカウントが登録されていない場合も内容はカラになります。


##認証確認
AccountStoreにアクセスしようとすれば自動的に認証確認画面になるが呼ばれない時は

```objc
- (void)requestAccessToAccountsWithType:(ACAccountType *)accountType
                                options:(NSDictionary *)options
                             completion:(ACAccountStoreRequestAccessCompletionHandler)completion;
```

等を呼べば確認画面になる。
しかし一度でも認証を拒否すれば、確認画面は出てこなくなる。
その場合は「設定-プライバシー-Twitter」から、ユーザー自身が設定を変更する必要がある。

---

認証確認画面が出てくる条件とかイマイチ把握できていませんので、もしよければツッコミお願いします。
Calculating ROC curve for TK11_B12X1\beta10

```matlab

clear all;

width  = 800;
height = 600;
set(gcf,'PaperPositionMode','auto');
pos=get(gcf,'Position');
pos(3)=width-1;
pos(4)=height;
set(gcf,'Position',pos);

hold off;

model = {'TK11_B12X1\beta10'}
sigtype = {'SNT'};
distscale = {'50','100','150','200','400'};
legendlst = {'50kpc','100kpc','150kpc','200kpc','400kpc'};
colortype = {'k-','b-','g-','r-','c-','m-'};


for ind_sigtype = 1:length(sigtype)
    for ind_dist = 1:length(distscale)
        jbname =    sprintf('SN_%sburst_%skpc_2048_injallsky',...
        sigtype{ind_sigtype},distscale{ind_dist});

        resultsdir = [jbname,'_results'];
        stats_filename   = fullfile(resultsdir,['stats_',jbname]);
        indxdmaps_filename=fullfile(resultsdir,['indxdmaps_',jbname]);
        vetofile = fullfile(resultsdir,['vetoatstar_',jbname]);
        %stattype ='corrsmap';
        stattype='radialdist';

        roc_filename     = ['roc_',jbname,'.mat'];
        genroc(indxdmaps_filename, stats_filename, ...
        roc_filename, stattype, vetofile,10000);
    end
end


for ind_sigtype = 1:length(sigtype)
    figure;
    hold on;
    for ind_dist = 1:length(distscale)
        jbname =    sprintf('SN_%sburst_%skpc_2048_injallsky',...
        sigtype{ind_sigtype},distscale{ind_dist});
        roc_filename     = ['roc_',jbname,'.mat'];

        load(roc_filename);
        loglog(falseprob,detprob,colortype{ind_dist});
        axis([0 1 0.4 1]);
    end
    
    jbname2 = sprintf('SN_%sburst_2048_injallsky',...
        sigtype{ind_sigtype});
    roc_plotfilename = ['PlotROC_',jbname2];
    xlabel('false alarm probability');
    ylabel('detection probability');
    mkplotbold(3);
    legend(legendlst{1},legendlst{2},legendlst{3},legendlst{4},legendlst{5},'Location','SouthEast');
    grid on;
    
    print('-depsc',roc_plotfilename); 
    hold off;
end  



```

```
Xamarin.MacでMvvmCrossを使う際のWorkaround #1

##Overview
　Xamarin.MacではDebugビルドではうまく動作しても，いざReleaseビルド，AppStoreビルドにすると突如動かなくなることはよくあります。
　たいていはリンカーのせいなので，MvvmCrossに限らず，うまくいかないときに見ておくべき設定をまとめておきます。

##Problem
初期設定ではパッケージング設定はこのようになっています。
![kobito.1393989268.424867.png](https://qiita-image-store.s3.amazonaws.com/0/34563/341503a3-6e43-aef8-c514-92eb188481ea.png "kobito.1393989268.424867.png")

このままビルドしても，`MissingMethodException`でまず動きません。
![kobito.1393989392.144748.png](https://qiita-image-store.s3.amazonaws.com/0/34563/fa5c40cc-b6cb-5ace-ae4f-b50155a9abef.png "kobito.1393989392.144748.png")

まずはLinker Behaviorを`Link Framework SDK Only`に変更します。
![kobito.1393989459.549425.png](https://qiita-image-store.s3.amazonaws.com/0/34563/01fbdb33-2c53-b1d4-d71d-dede5261ef01.png "kobito.1393989459.549425.png")

うまく実行できるように見えますが，バインディング周りが非常に怪しいことがわかります。テキストを入力する，ボタンをクリックするなどなにかするとApplication Outputが火を噴きます。
![kobito.1393989776.702154.png](https://qiita-image-store.s3.amazonaws.com/0/34563/6cfafac2-3bfd-3670-cdc3-7c68f07724d2.png "kobito.1393989776.702154.png")

##Solution
うまく動作する設定は下記の通りです。
![kobito.1393989878.834891.png](https://qiita-image-store.s3.amazonaws.com/0/34563/280c6d83-813e-856d-cf7c-20ae8f0aebcb.png "kobito.1393989878.834891.png")
要は
・フレームワークSDKのみ
・SGenガベージコレクタを使う
の2設定を行うことで正常に動作します。AppStoreビルドでも同様です。

##Conclusion
転んでも泣かない。
きっと#2が出てくるはず。（NSSecureTextField->SecureStringとか･･･）
fluentd elasticsearch　送信と受信でログ行数に差異がある時

かなり、感覚的な表現で申し訳ないですが参考程度に。。。。orz


fluent plugin elasticsearch

で

detached forwarding server
とかゆー送信サーバでエラーが出て

retryとか勝手に何回かされると

ログが重複する。。。orz

300万行ぐらい送って、elasticsearch側では330万行ぐらいになってた。。。orz



fuluentdのバッファメモリをバッファファイルへ変更

・送信先のバッファファイルが3個以上になったら送信を待つ　
・送信元のバッファファイルが2個を超えたら処理を待つ

みたいな監視をこさてゆっくりゆっくりと送ってあげる。

送信元のfluentDのchank limitあたりを調整

300万行を90分かけて送ってあげたらドンピシャだったぜ。



【追記】
fluentDが買ってにリスタートしやがった。

しかも送信行数と受信行数にも差異が。。。リスタートでもずれる模様。。。


【追記2】
送信元のchank limitを512kで、かなり調子よく送信できた。

2500万行を10時間程度で送信完了。

受信側、送信側ともログ行数もドンピシャ！☆-(ノﾟДﾟ)八(ﾟДﾟ　)ノｲｴｰｲ

ちょっとずつの方が、早く処理できて調子よさげ。



【追記3】
送り元のchank limit 512kでも送り先のbufferファイル数が15近くになってた。

検証初期の段階でbufferファイル数が20近くなると、

detached forwarding server

が出て、errorとtryを繰り返して送信ログ数が合わなかったので

送り元のchank limit 512k → 256kに変更。

2500万行を10時間程度と、前回とほぼ同じ時間で処理完了。

受信側、送信側ともログ行数の一致を確認！☆-(ノﾟДﾟ)八(ﾟДﾟ　)ノｲｴｰｲ

送り側のbuffer数もmaxで8個とかなりいい感じ。(ﾟ∀ﾟ)ｷﾀｺﾚ!!
よく作業するDirをBookmarkするshellスクリプト


はじめに
==========

zshやbashで作業しているとよく移動するDirというのがあると思います。
また、久しぶりにLoginしたサーバでは、どこが大事なDirかを忘れてしまうこともあるかと思います。

そういうときに、よく使うDirをBookmark?しておくと便利です。

追記： 2014/3/20
-----------------

@mollifier さんが作成したzshによるPluginは補完が効くので更に便利です！
[よく使うディレクトリをブックマークする zsh のプラグイン](http://qiita.com/mollifier/items/46b080f9a5ca9f29674e)



準備
=======

下記のようなものを `.zshrc`や`.bashrc`に書いておきます。
書いたら `source ~/.zshrc` などして読み込んでください。

```bash:.zshrc
BMRC=~/.bmrc
touch $BMRC

bmls() {
  cat $BMRC | sort -n
}

bmvi() {
  # open BMRC with EDITOR.
  ${EDITOR:-vi} $BMRC
}

bmadd() {
  local bmdir=$PWD
  local newid=$1

  if __bm_path_list | grep -F -x "$bmdir" > /dev/null; then
    echo "$bmdir is already in bm list" 1>&2
    return 2
  fi

  if [ -n "$newid" ]; then
    if __bm_id_list | grep -F -x "$newid" > /dev/null; then
      echo "$newid is already used as bm id" 1>&2
      return 3
    fi
  fi

  if [ -z $newid ]; then
    local maxid
    maxid=$(__bm_id_list | grep '^[0-9][0-9]*$' | sort -n -r | head -1)
    if [ -n "$maxid" ] && [ "$maxid" -ge 1 ]; then
      newid=$((maxid + 1))
    else
      newid=1
    fi
  fi

  echo "$newid|$bmdir" >> $BMRC
}

bm() {
  local bmid=$1
  if [ -z "$bmid" ]; then
    bmls
    return
  fi

  local bmdir=$(__bm_get "$bmid")
  if [ -z "$bmdir" ]; then
    echo "$bmid is not in bm list" 1>&2
    return 1
  fi

  cd "$bmdir"
}

__bm_get() {
  escaped_bmid=$(echo "$1" | sed -e 's/[^a-zA-Z0-9<>]/\\&/g')
  cat $BMRC | grep -E "^${escaped_bmid}\\|" | cut -d '|' -f 2 | head -n 1
}

__bm_path_list() {
  cat $BMRC | cut -d '|' -f 2
}

__bm_id_list() {
  cat $BMRC | cut -d '|' -f 1
}
```

使い方
=======

## 現在のDirをBookmark?に登録
`bmadd <name>` で登録します。

```bash:例
% bmadd idea
```

## Bookmark登録されているDirの一覧を表示
`bm`とだけ打つと一覧が表示されます。

```bash:例
% bm
doc|/Users/k_morishita/Documents
down|/Users/k_morishita/Downloads
idea|/Users/k_morishita/IdeaProjects
```

## そのDirに移動
`bm <name>` で移動します。

```bash:例
% bm doc
```

## Bookmarkを編集

仕組みは単に ~/.bmrc にテキストファイルとして保存してあるだけです。
`bmvi`と打つとそのファイルを編集する vi が起動します。何をどうすれば良いかは見ればわかると思います。

```bash:例
% bmvi
```


さいごに
-------

１０年以上前に書いたShellスクリプトなので拙い感じがアリアリですが、動くには動くのでお試し下さい。
MySQLのデータインポート・エクスポート

## エクスポート
mysqldump -u[ユーザー名] -p[パスワード] -r [バックアップファイル名] --single-transaction [データベース名]

```
「sample」データベースを「sample.bakcup」としてバックアップしたい場合

mysqldump -usample_user -psample_password -r sample.bakcup --single-transaction sample

データベースの状態
データベース名:sample
ユーザー名:sample_user
パスワード:sample_password
```

### オプションの解説

#### --single-transaction
ダンプ中にテーブルをREADロックしないように付与する。
(ただしテーブルのエンジンがMyISAMの場合はテーブルが変更されている場合があるので注意)

## インポート

mysql -u[ユーザー名] -p[パスワード] [インポートするデータベース名] < [インポートするファイル名]

```

mysql -usample2_user -psample2_password sample2 < sample.bakcup

データベースの状態
データベース名:sample2
ユーザー名:sample2_user
パスワード:sample2_password
```
色の違いを数値で求める


N次元の距離を求めるのと同じであり、色をN次元化すればよい。色をRGBとして扱う場合、R、G、Bのそれぞれの成分を次元として扱う。

```ActionScript3
package
{
	import flash.display.Sprite;

	public class Test extends Sprite
	{

		public static function distance(rgb1:uint, rgb2:uint):Number
		{
			var r1:uint = (rgb1 & 0xff0000) >> 16;
			var g1:uint = (rgb1 & 0xff00) >> 8;
			var b1:uint = rgb1 & 0xff;

			var r2:uint = (rgb2 & 0xff0000) >> 16;
			var g2:uint = (rgb2 & 0xff00) >> 8;
			var b2:uint = rgb2 & 0xff;

			return Math.sqrt((r2 - r1) * (r2 - r1) + (g2 - g1) * (g2 - g1) + (b2 - b1) * (b2 - b1));
		}
	}
}
```

真っ黒(#000000)と真っ白(#ffffff)の差は、Math.sqrt(255*255 + 255*255 + 255*255) => 約411となる。
真っ青(#0000ff)と真っ赤(#ff0000)の差は、Math.sqrt(255*255 + 0 * 0 + -255 * -255) => 約360となる。

RGBを一旦HSVに変換した上で明度差、彩度差、色相差で距離を求めた方が人間の間隔に近いかもしれない。
２つの色の中間色を求める


アニメーションなどで背景を赤から青へ変化させるときなどに使う関数。開始色、終了色、係数を指定して色を得る。

係数は0なら開始色と同じになり、1なら終了色と同じになり、0.5ならちょうど中間の色となる。Tweenなどで係数を0から1へ変化させるよい。

```ActionScript3
package
{
	import flash.display.Sprite;

	public class Test extends Sprite
	{

		public static function interpolateRGB(fromRGB:uint, toRGB:uint, interpolation:Number):uint
		{
			var fr:uint = (fromRGB & 0xff0000) >> 16;
			var fg:uint = (fromRGB & 0xff00) >> 8;
			var fb:uint = fromRGB & 0xff;

			var tr:uint = (toRGB & 0xff0000) >> 16;
			var tg:uint = (toRGB & 0xff00) >> 8;
			var tb:uint = toRGB & 0xff;

			if (interpolation < 0)
			{
				interpolation = 0;
			}
			else if (interpolation > 1)
			{
				interpolation = 1;
			}

			var r:uint = Math.round(fr + (tr - fr) * interpolation);
			var g:uint = Math.round(fg + (tg - fg) * interpolation);
			var b:uint = Math.round(fb + (tb - fb) * interpolation);

			return (r << 16) | (g << 8) | b;
		}
	}
}

```
fluentdが読み込むtd-agent.confのパース結果を調査する

追記: もっと手軽に確認できるものとして[fluent-format](https://github.com/sonots/fluent-format)という便利gemがあると@sonotsさんに教えていただいた。

# fluentdが読み込むtd-agent.confのパース結果を知りたい。

```/var/log/td-agent/td-agent.log``` を読んで、
```<ROOT>``` から始まる行を探して確認する、ということはせず、
```fluent-debug``` コマンドを利用し確認する。

確認した環境は以下のとおり

- Ubuntu 13.04 (カノニカル様が提供してくださってる[Vagrantイメージ](http://cloud-images.ubuntu.com/vagrant/raring/current/)を利用)
- [td-agent deb パッケージ](http://docs.fluentd.org/ja/articles/install-by-deb)

[td-agent deb パッケージ](http://docs.fluentd.org/ja/articles/install-by-deb#step1-apt)、公式ではUbuntu 13.04をサポートしていないので、
Ubuntu 12.04 LTSを利用しましょう

# fluent-debug

[fluent-debugと戯れる](http://qiita.com/tatsu-yam/items/1f882e27865739fb5af2) を参考にしました。

以下のような形でtd-agent.confを作成する。
includeなど外部ファイルの読み込み指定もテストを兼ねて入れている。

td-agent.confのパスは```/etc/td-agent/td-agent.conf``` とする

```apache:td-agent.conf
include test.conf

<source>
  type forward
</source>

<source>
  type http
  port 8888
</source>

include test2.conf

<source>
  type debug_agent
  bind 127.0.0.1
  port 24230
</source>
```

td-agent.confでincludeしている```test.conf``` , ```test2.conf``` については
以下のような形にしている

```apache:test.conf
<match hoge.fuga.**>
  source file
  path /var/log/td-agent/test.log
</match>
```

```apache:test2.conf
<match huge.muga.*>
  type copy

  <store>
    type mongo
    database huge
    collection muga
  </store>

  <store>
    type file
    path /var/log/td-agent/test2.log
  </store>
</match>
```

準備はできた。

# fluent-debugを立ち上げ、確認する

```/usr/lib/fluent/ruby/bin/``` 以下に、fluent-debugコマンドが展開されているので、立ち上げる。

```
> /usr/lib/fluent/ruby/bin/fluent-debug
Connected to druby://127.0.0.1:24230.
Usage:
    Engine.match('some.tag').output  : get an output plugin instance
    Engine.sources[i]                : get input plugin instances
    Plugin.load_plugin(type,name)    : load plugin class (use this if you get DRb::DRbUnknown)

irb(main):001:0>
```

fluentdの設定ファイルを読み込んでパースしているのは
[ここの箇所](https://github.com/fluent/fluentd/blob/8636c3a7b4441b61cbe0265ae0cd05b0385ba771/lib/fluent/config.rb#L146)で、Parser.readを呼び出しているのは[ここだ](https://github.com/fluent/fluentd/blob/8636c3a7b4441b61cbe0265ae0cd05b0385ba771/lib/fluent/config.rb#L92)。

...ということで、```Fluent::Config.read``` を呼び出し、
readメソッドに対して```/etc/td-agent/td-agent.conf``` ファイルを指定する。

```apache
> irb(main):001:0> puts Fluent::Config.read '/etc/td-agent/td-agent.conf'
<ROOT>
  <match hoge.fuga.**>
    source file
    path /var/log/td-agent/test.log
  </match>
  <source>
    type forward
  </source>
  <source>
    type http
    port 8888
  </source>
  <match huge.muga.*>
    type copy
    <store>
      type mongo
      database huge
      collection muga
    </store>
    <store>
      type file
      path /var/log/td-agent/test2.log
    </store>
  </match>
  <source>
    type debug_agent
    bind 127.0.0.1
    port 24230
  </source>
</ROOT>
```

include順序についても、途中で```include test2.conf``` と差し込んだところについて
きちんとparseされてる。

fluent-debugをきちんと使いたい。

# 検証環境を用意するのがだるい場合

[このVagrantfile](https://gist.github.com/futoase/9343025)を利用すると良いかも。
そして、以下のコマンドを叩く。(要Vagrantインストール)

```
> vagrant up server
> vagrant ssh server
> sudo su - anoonna
> fluent-debug
```
Running jobs

```matlab
clear all;
load SN_SNTburst_50kpc_2048_injallsky_param
RIDGEtrigg('SN_SNTburst_50kpc_2048_injallsky',s);

clear all;
load SN_SNTburst_100kpc_2048_injallsky_param
RIDGEtrigg('SN_SNTburst_100kpc_2048_injallsky',s);

clear all;
load SN_SNTburst_150kpc_2048_injallsky_param
RIDGEtrigg('SN_SNTburst_150kpc_2048_injallsky',s);

clear all;
load SN_SNTburst_200kpc_2048_injallsky_param
RIDGEtrigg('SN_SNTburst_200kpc_2048_injallsky',s);

clear all;
load SN_SNTburst_400kpc_2048_injallsky_param
RIDGEtrigg('SN_SNTburst_400kpc_2048_injallsky',s);


```
calculatinig ROC curve for KK+9_model_A_p

```matlab
clear all;

width  = 800;
height = 600;
set(gcf,'PaperPositionMode','auto');
pos=get(gcf,'Position');
pos(3)=width-1;
pos(4)=height;
set(gcf,'Position',pos);

hold off;

model = {'KK+9_model_A_p'}
sigtype = {'KKp'};
distscale = {'2','2_5','3','3_5','4','10'};
legendlst = {'2kpc','2.5kpc','3kpc','3.5kpc','4kpc','10kpc'};
colortype = {'k-','b-','g-','r-','c-','m-'};


for ind_sigtype = 1:length(sigtype)
    for ind_dist = 1:length(distscale)
        jbname =    sprintf('SN_%sburst_%skpc_2048_injallsky',...
        sigtype{ind_sigtype},distscale{ind_dist});

        resultsdir = [jbname,'_results'];
        stats_filename   = fullfile(resultsdir,['stats_',jbname]);
        indxdmaps_filename=fullfile(resultsdir,['indxdmaps_',jbname]);
        vetofile = fullfile(resultsdir,['vetoatstar_',jbname]);
        %stattype ='corrsmap';
        stattype='radialdist';

        roc_filename     = ['roc_',jbname,'.mat'];
        genroc(indxdmaps_filename, stats_filename, ...
        roc_filename, stattype, vetofile,10000);
    end
end


for ind_sigtype = 1:length(sigtype)
    figure;
    hold on;
    for ind_dist = 1:length(distscale)
        jbname =    sprintf('SN_%sburst_%skpc_2048_injallsky',...
        sigtype{ind_sigtype},distscale{ind_dist});
        roc_filename     = ['roc_',jbname,'.mat'];

        load(roc_filename);
        loglog(falseprob,detprob,colortype{ind_dist});
        axis([0 1 0.4 1]);
    end
    
    jbname2 = sprintf('SN_%sburst_2048_injallsky',...
        sigtype{ind_sigtype});
    roc_plotfilename = ['PlotROC_',jbname2];
    xlabel('false alarm probability');
    ylabel('detection probability');
    mkplotbold(3);
    legend(legendlst{1},legendlst{2},legendlst{3},legendlst{4},legendlst{5},legendlst{6},'Location','SouthEast');
    grid on;
    
    print('-depsc',roc_plotfilename); 
    hold off;
end  



```
VirtualBoxでポートフォワーディングの設定をコマンドラインから追加、削除、表示

# ポートフォワーディングの追加

[OSX上のdockerでCentOS 6.5にnginxを公式レポジトリからインストールするサンプル - Qiita](http://qiita.com/hnakamur/items/41072b188b0370e2aaf8#1-4)にも書きましたが、ポートフォワーディングの追加は以下のようにします。

```shell-session
VBoxManage controlvm "boot2docker-vm" natpf1 "nginx,tcp,127.0.0.1,8080,,80"
```

この例ではlocalhostの8080番ポートをboot2docker-vmの80番ポートにフォワーディングします。

# ポートフォワーディングの削除

削除するには追加した時の名前を指定してdeleteします。
参考: [VBoxManage controlvmのマニュアル](http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm)

```shell-session
VBoxManage controlvm "boot2docker-vm" natpf1 delete nginx
```

# ポートフォワーディングの変更

すでに登録済みの名前を再度追加しようとすると

```
VBoxManage: error: A NAT rule of this name already exists
```

というエラーが出ます。

ということで、変更するには一旦削除してから追加します。

# ポートフォワーディングの確認

```shell-session
VBoxManage showvminfo boot2docker-vm | grep '^NIC'
```

以下の様な出力が出ます。

``` 
NIC 1:           MAC: 080027AB2BD4, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: virtio, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny, Bandwidth group: none
NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
NIC 1 Rule(0):   name = docker, protocol = tcp, host ip = 127.0.0.1, host port = 4243, guest ip = , guest port = 4243
NIC 1 Rule(1):   name = nginx, protocol = tcp, host ip = 127.0.0.1, host port = 8080, guest ip = , guest port = 80
NIC 1 Rule(2):   name = redis, protocol = tcp, host ip = 127.0.0.1, host port = 16379, guest ip = , guest port = 6379
NIC 1 Rule(3):   name = ssh, protocol = tcp, host ip = 127.0.0.1, host port = 2022, guest ip = , guest port = 22
NIC 2:           MAC: 0800270F0BE8, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny, Bandwidth group: none
NIC 3:           disabled
NIC 4:           disabled
NIC 5:           disabled
NIC 6:           disabled
NIC 7:           disabled
NIC 8:           disabled
```
ユーザ権限の確認・追加

しょっちゅう忘れるのでメモ。

### mysqlに切り替え
``USE mysql``

### 登録されているユーザを確認
``SELECT user, host FROM user;``

### 権限を表示
``SHOW GRANTS for 'hoge'@'%';``

### ユーザを作成
``CREATE USER user_name;``
``CREATE USER user_name IDENTIFIED BY [PASSWORD] 'password';``

※ユーザ指定の書式例
``user_name@host_name``

※ワイルドカードをホストに使うときはシングルクォートでくくる
``user_name@'%'``
``'username'@'192.168.128.%'``

### 権限付与
``GRANT ALL PRIVILEGES ON `DB名`.テーブル TO 'ユーザ名'@'ホスト名';``
``GRANT SELECT,UPDATE,INSERT,DELETE ON `DB名`.テーブル TO 'ユーザ名'@'ホスト名';``

など

### 権限の反映
``FLUSH PRIVILEGES;``

※ご指摘いただき、公式ドキュメントを確認したところ、下記のような記載がありましたので、
この手順で権限を付与した場合、``FLUSH PRIVILEGES;``は実行する必要が無いようです。

>GRANT, REVOKE, or SET PASSWORD などのステートメントを使用して、間接的に権限テーブルを変更する場合は、サーバがこれらの変更を認識し、その変更があった直後に権限テーブルをメモリへリロードします。

>INSERT、UPDATE、DELETE などのステートメントを使用して、直接に権限テーブルを変更する場合は、サーバを再起動するか、またはテーブルのリロードを行なうまでその権限チェックは施行しません。手動で権限テーブルをリロードするには、FLUSH PRIVILEGES ステートメントを発行するか、mysqladmin flush-privileges または mysqladmin reload コマンドを実行します。
PSR-2のファイルの最後に空行を入れるという事について考えた



## きっかけ

PSR-2では、ファイルの最後に空行を入れるという事になっている。

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md#22-files

という事なので、僕はファイルの最後に空行を愚直に入れるようにしてた。
以下のような感じだ。

```php
<?php
echo 'hello world!'

```

見た目はわかりにくいが最後に空行が入っている。
（ソース上は空行を入れているのですが、実際に表示させた時には空行は自動的に消えてしまうようです。。。）

<br>

でも、[PHP Coding Standards Fixer](https://github.com/fabpot/PHP-CS-Fixer)というPSRに沿う形でソースを自動整形してくれるツールを使ってみたところ、この空行が毎回削除されてしまっていた。

このツールで整形すると以下のようになる

```php
<?php
echo 'hello world!'
```

diffだとこんな感じ

```diff
$ diff -u before.php after.php         
--- before.php
+++ after.php
@@ -1,3 +1,2 @@
 <?php
 echo 'hello world!'
-
```

とまぁ、ファイルの最後の空行が削除される。


## 調べた事

いろいろググってみたところ、以下の辺りが参考になった。

- https://github.com/fabpot/PHP-CS-Fixer/issues/122

- https://github.com/squizlabs/PHP_CodeSniffer/pull/42
- https://groups.google.com/forum/#!topic/php-fig/PSzmcFVQst0


僕が今まで行っていた行為は、ファイルの末尾に`\n\n`を入れていた。
たぶん、ファイルの最後は改行コード`\n`を入れるという流れでいこうという事だと思います。。。

## 改行コードつきでcatしてみる
先ほど作ったファイルを改行コードつきでcatしてみる

```sh
$ cat -e before.php
<?php$
echo 'hello world!'$
$

$ cat -e after.php
<?php$
echo 'hello world!'$
```


今まではあまり深く考えて来なかったのだが、僕が普段使っているvimだとデフォルトでファイルの最後に改行コードが入る。
エディタによってこれが入らなかったりするため、ちゃんと入れるように！という意味なのかなー。


## 結論
僕の英語力が足りなくてふわっとしている部分があるのですが、
ファイルの最後は改行コードが１つ入っていればいいと考えます。
つまり、

```sh
$ cat -e after.php
<?php$
echo 'hello world!'$
```

このイメージ、before.phpのスタイルをやめてafter.phpのスタイルにしようと思った今日この頃です。
Rails(ActiveRecord)でN:Nの自己結合を実装する

Twitterみたいなユーザ同士をフォローする仕組みを実装するにあたり、ActiveRecordでN:Nの自己結合を実装するのにちょっとハマったので書いておきます。

## 前提

* usersテーブルがある
* User同士のフォロー関係を登録するfollowsテーブルがある

具体的なmigrationは以下。

```rb:20130825021654_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name, null: false
      t.string :email
      # :
      # :
      t.timestamps
    end
  end
end
```

```rb:20140303134930_create_follows.rb
class CreateFollows < ActiveRecord::Migration
  def change
    create_table :follows do |t|
      t.integer :from_user_id, null: false
      t.integer :to_user_id, null: false

      t.timestamps

      t.index :from_user_id
      t.index :to_user_id
      t.index [:from_user_id, :to_user_id], unique: true
    end
  end
end
```

## やりたいこと

下記のようなインターフェイスで実装したいとします。

```rb
User.find(1).following # フォローしているUserの配列が返る
User.find(1).followed  # フォローされているUserの配列が返る
```

## ハマりポイント

* リレーションがN:N
* Railsのデフォルトでは `user_id` を結合に使うが、今回は同じテーブルを結合するので使えない

## 実装

まずUserからFollow、FollowからUserに1:Nのリレーションをはります。

```rb:user.rb
has_many :follows, foreign_key: :from_user_id
```

```rb:follow.rb
belongs_to :from_user, class_name: User, foreign_key: :from_user_id
```

こうすると、 `User.find(1).follows` でFollowが、　`Follow.find(1).from_user` でフォロー元のUserというリレーションができます。次に、これら1:Nのリレーションを結合する設定をUserに追加します。

```rb:user.rb
has_many :follows, foreign_key: :from_user_id
has_many :following, through: :follows, source: :to_user # ← 追加
```

これで、 `User.find(1).following` でフォロー先のUserの配列が取得できるようになりました。followed側も同様に実装できます。

## 最終形

最終的に下記のようになりました。条件の異なる2つの `has_many :follows` が必要になるのでリネームしました。

```rb:user.rb
has_many :follows_from, class_name: Follow, foreign_key: :from_user_id, dependent: :destroy
has_many :follows_to,   class_name: Follow, foreign_key: :to_user_id,   dependent: :destroy
has_many :following, through: :follows_from, source: :to_user
has_many :followed,  through: :follows_to,   source: :from_user
```

```rb:follow.rb
belongs_to :from_user, class_name: User, foreign_key: :from_user_id
belongs_to :to_user, class_name: User,   foreign_key: :to_user_id
```

## おまけ

下記のようなインターフェイスを追加したくなりました。

```rb:user.rb
user.following?(User.find(1))
user.followed_by?(User.find(1))
```

最初は下記のように `any?` にブロックを渡して評価していました。

```rb:user.rb
def following?(user)
  self.following.any? { |u| u.id == user.id }
end
```

しかしこれでは普通にSELECT文が走って全件インスタンス化しているようだったので下記のようにしてみたところ、 `SELECT COUNT(*)` が走るようになったのでこちらのほうがパフォーマンスがよいでしょう。

```rb:user.rb
# 指定ユーザをフォローしているかどうかを返す
def following?(user)
  self.following.where(id: user.id).any?
end

# 指定ユーザにフォローされているかどうかを返す
def followed_by?(user)
  self.followed.where(id: user.id).any?
end
```
JPAのCriteria QueryでIN句を指定する


```java
final EntityManager em = getEntityManager();
final CriteriaBuilder builder = em.getCriteriaBuilder();
final CriteriaQuery<EPet> query = builder.createQuery(EPet.class);
final Root<EPet> root = query.from(EPet.class);
query.where( //
    root.get(EPet_.category).in(categories) //
);
```


これははまる。```CriteriaBuilder```を使わないってところに。
[ここ](http://stackoverflow.com/questions/10732970/jpa-criteria-api-in-expression-parameter-list)を見て解決。
photoshopを英語版で起動する方法(macの場合)


たまたま今後、英語圏の海外で現地のphotoshopを使う可能性が出てきたので、「英語表記」になれておいた方が良いかと思い英語版で起動出来る様にしてみました。
※これはオフィシャルな方法ではなく、あくまで暫定的に英語表記で立ち上げる方法である事をご了承ください。

## 1、変更方法
`/Applications/Adobe Photoshop CS5/Locales/ja_JP/Support Files`に`tw10428.dat`というファイルがあります。

「このファイル名を変更する」事によって日本語表記から英語表記に変更出来ます。

若干推測ですが、photoshopは起動時に、この`tw10428.dat`という日本語ローカライズ用のファイルを探しにいって、結果日本語で起動します。
つまり、上記のファイル名が一文字でも違えば、photoshopはローカライズ用ファイルが無いと認識してネイティブの英語表記で起動する仕組みだと思います。

下の図は変更前の状態です。

![photoshop_01.png](https://qiita-image-store.s3.amazonaws.com/0/35975/1632cd39-17cc-4e61-4368-86db6bbfb152.png "photoshop_01.png")

私の場合はファイル名を以下の様に`tw10428_back.dat`に書き換えました。

下が変更後の状態です。
![photoshop_02.png](https://qiita-image-store.s3.amazonaws.com/0/35975/2d7e82f6-c2f7-0076-bf67-d230224b001f.png "photoshop_02.png")

これはたまたま後ろに`_back`を足しただけで、ぶっちゃけ「全然違うファイル名」に変えてもOKですし、「ファイル自体を消去」しても同様に英語版で立ち上がります。

## 2、なぜ英語表記に変わるのか

ポイントは`Locales/ja_JP/Support Files`フォルダに`tw10428.dat`という名のファイルが存在しない状態にする事です。

これによってphotoshopは「ローカライズ用ファイルは無い、よってデフォルトの英語表記で起動しよう」と判断するわけです。


## 3、日本語表記に戻すには

変更したものをもとの状態に戻せば日本語で立ち上がります。

つまり↓

•ファイル名を変更したならもとの`tw10428.dat`に直す。

•ファイルを削除したなら、消したファイルをもとの場所に戻す(ですので消す前に必ずバックアップを取っといて下さい)


## 4、検証環境
OS、、、mac OS10.9.2

photoshop、、、mac版の「CS5」と「CCの14.2.1」で検証してどちらともOK。(ファイル場所、変更方法ともに同じでした)

## 5、まとめると

日本人の私が無理して英語版で使う事は本来無いのですが、以下の事が私の環境で確認出来ました。

•今回の方法で、「日本語版」「英語版」を行き来する事が出来る。

•英語版にて４時間ほどWebのボタン等のパーツ作りをしたが、動作に問題は起こらなかった。


以上、、mac版のphotoshpのローカライズの変更方法でした。
TextViewにHTMLのSRCタグを使って画像を載せる

ドキュメント眺めてたら気になって探してみたらタイトルみたいな事が出来る方法を見つけました。

###イメージ
![Screenshot](https://qiita-image-store.s3.amazonaws.com/0/37274/f2fe8170-ed23-d6a7-43a1-a0ccacdb89af.png)


```java:MainActivity.java
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		TextView tv = (TextView) findViewById(R.id.textView);
		Html.ImageGetter imageGetter = new Html.ImageGetter() {
			@Override
			public Drawable getDrawable(String source) {
				Log.d(TAG, "source:" + source);
				int resId = 0;
				if (source.equalsIgnoreCase("droid")) {
					resId = R.drawable.ic_launcher;
				} else {
					throw new IllegalArgumentException();
				}
				Drawable drawable = getResources().getDrawable(resId);
				drawable.setBounds(0, 0, 40, 40);
				return drawable;
			}
		};
		String origString = "Hello world<img src='droid'>";
		Spanned spanned = Html.fromHtml(origString, imageGetter, null);
		tv.setText(spanned);
	}
```
Html.fromHtmlにコールバックを渡して、htmlタグから渡されたsrc名に応じてDrawableを返すだけです。

####注意
drawable.setBounds()忘れると何も表示されないです。
C++で配列の内容を出力するを3種

> vector<int> array{0,1,2,3}; 

を

> 0
1
2
3

みたいに表示したい。

1. 普通にforで

```cpp
   for ( vector<int>::iterator i=begin(array); i!=end(array); ++i ) {
      std::cout << i << std::endl;
   }
```

2. C++11のラムダ式とeachで

```cpp
   std::each(begin(array), end(array), [&](int i){ std::cout << i << std::end }
```

3. std::copyとstd::ostream_iteratorを使う。

```cpp
   std::copy(begin(array), end(array), std::ostream_iterator<int>(std::cout, "\n"));
```

こんな書き方あるんだ、へーって思ったけど直感的じゃないから使わないかな…。

ostream_iterator、istream_iterator 覚えたら便利そう…（たぶん覚えない）。
http://en.cppreference.com/w/cpp/iterator/ostream_iterator
アノテーションの練習がてらバリデーターを自作


アノテーションの使い方は理解してたが、自作したことなかったので、バリデータを自作してみた。
ネーミングだったり細かいエラーなどは省略。

####作成して分かったのは
とりあえず作って分かったのは、@interfaceをつぶしの効くものにしないと@interfaceだらけになってしまうこと。

####作りながら考えたのは
Validator.java内で各Annotationのバリデーションロジックを書くのではなく、Annotationクラス自体が自分のバリデーションロジックを持たせて、Validator側を少し書き直せばValidatorとAnnotationが互いに意識せず、かつAnnotationだけを追加すればValidatorに追加しなくても動くみたいな疎結合になるかもしれないと思った。

だけど、Annotationはメソッドに制限があったし、以前見かけたValidatorではそんな事してなかったので、きっと別の理由でダメなのだろう。



```java:MainActivity.java
	@Override
	public void onClick(View v) {
		if (v.getId() == R.id.registerButton) {
			Weight weight = new Weight(measureEditText.getEditableText().toString(), weightEditText.getEditableText().toString());

			ValidateResult result = Validator.validation(weight);
			if (result.isOk()) {
				Toast.makeText(this, "登録成功", Toast.LENGTH_SHORT).show();
			} else {
				String msg = result.getMessage();
				Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
			}
		}
	}
```

```java:Validator.java
public class Validator {

	public static ValidateResult validation(Object target) {

		try {
			Class<?> clazz = target.getClass();
			Field[] fields = clazz.getDeclaredFields();
			for (Field field : fields) {
				NotEmpty notEmpty = field.getAnnotation(NotEmpty.class);
				if (notEmpty != null) {
					field.setAccessible(true);
					Object object = field.get(target);
					if (object instanceof String) {
						String fieldObject = (String) field.get(target);
						if (TextUtils.isEmpty(fieldObject) == true) {
							return new ValidateResult(false, notEmpty.value());
						}
					} else {
						Object fieldObject = field.get(target);
						if (fieldObject == null) {
							return new ValidateResult(false, notEmpty.value());
						}
					}
				}
			}

		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

		return new ValidateResult(true);
	}
}
```


```java:NotEmpty.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface NotEmpty {
	String value();
}
```

```java:Weight.java
public class Weight {

	public Weight(String date, String weight) {
		measurementDate = date;
		this.weight = weight;
	}

	@NotEmpty("日付を入力してください")
	private final String measurementDate;

	@NotEmpty("体重を入力してください")
	private final String weight;
}
```
node.jsを試した(EコマースAPI)

昔、気になっていたnode.jsでマッシュアップサイトってやつを作ったんですが、色々あって放置してた。
最近PHPに書き直そうと思ってるんだけど、しゃくだから、当時のコード内容を晒そうと思う。

構成として
node.js + mongodb + express
という感じ

正直、保守性は意識した書き方がわからなくて、書き方戸惑った。

今回の対象としているapiは以下です。
http://webservice.rakuten.co.jp/  楽天ＷＥＢサービス
http://developer.yahoo.co.jp/ yahoo  デベロッパーネットワーク

まず、楽天関係の通信モジュールは以下のように作りました。

```js:common.js

var https        = require('https');
var querystring  = require('querystring');
function common(path){
  this.host = 'app.rakuten.co.jp';
  this.path = path;
  // 共通リクエスト（登録ＩＤとか）
  this.options = function(){
    return {applicationId: 'アプリケーションＩＤ'
    ,affiliateId:'アフィリエイトＩＤ'
    ,format: 'json'};
  };
}
common.prototype = {
  generateURL: function (addOptions) {
    var options = this.options();
    for(var key in addOptions){
      options[key] = addOptions[key];
    }
    var url = 'https://' +this.host + this.path + '?' +
    require('querystring').stringify(options);
    console.log(url);
    return url;
  },
  get: function (options, callback) {
    var req = https.get(this.generateURL(options), function(res){
        res.setEncoding('utf8');
        var data = '';
        res.on('data', function(str) {data += str;});
        res.on('end',function(){
            callback(JSON.parse(data));
        });
    });
  }
};
module.exports = common;

```

・・・的な
これを親にして、各用途のAPIを拡張していきやした。
例：商品検索

```js:ichibaitemsearch.js

var rakuten = require('./common.js');
function api () {
//　ここのパスをＡＰＩごとに変える
  rakuten.apply(this, ['/services/api/IchibaItem/Search/20130424']);
}
api.prototype = Object.create(rakuten.prototype);
api.prototype.constructor = api;
api.prototype.execute = function(obj, callback){
  this.get(obj, callback);
}
module.exports = api;

```

それで下記のように検索条件を渡して使う

```js

var api = require('./lichibaitemsearch');
new api().execute({category: '0'},function(res){console.log('%j',res;});

```

長らく放置してたこのサイトをやり直そうと思った記事がこれ
http://www.find-job.net/startup/api-2013
いい時代になりましたね。余裕みて、色々作って行きたいっす。
[MAC]間違ったsparkをインストールしてみた


# 本当はこれを調べてた

http://spark.incubator.apache.org/downloads.html

夜中にビッグデータとか調べ始めるもんじゃないな。
brewでインストールできるかな、なんて軽い気持ちで

```bash:コマンド
brew install spark
```

とか打った。


# 違う違う。そうじゃ、そうじゃない。


```bash:
$ brew install spark
==> Downloading https://github.com/holman/spark/archive/v1.0.1.tar.gz
######################################################################## 100.0%
?  /usr/local/Cellar/spark/1.0.1: 5 files, 20K, built in 3 seconds
$ 
```

なんだ？なんか怪しいURL。

https://github.com/holman/spark/


# なんじゃこりゃぁ！

```
$ spark 0 30 55 80 33 150
▁▂▃▄▂█
$ 

```

グ、グラフだと！
ワンライナーグラフだとぉ！？





おわり。
OSXのdockerを使ってCentOS 6.5でnginx + lua-nginx-moduleをビルドするサンプル

全体の流れは[OSX上のdockerでCentOS 6.5にnginxを公式レポジトリからインストールするサンプル - Qiita](http://qiita.com/hnakamur/items/41072b188b0370e2aaf8)と同様です。

nginx + lua-nginx-moduleをビルドする部分は[Cent OS(6.4)にNginx + lua-nginx-moduleをインストール - エンジニアになりたい](http://jsoizo.hatenablog.com/entry/2013/08/25/214920)と[Mac OS X (10.8) での nginx + lua-nginx-module インストール - Qiita](http://qiita.com/futoase/items/4185432667569b6b3f35)を参考にしました。ありがとうございます。

Dockerfileは以下の通りです。luajitは/usr/local/luajit/, nginxは/usr/local/nginx/以下にインストールするようにしました。

```text:https://github.com/hnakamur/docker-nginx-lua/blob/d450a41fb0160b206532a84566d2857870ca998d/Dockerfile
FROM tianon/centos:6.5
MAINTAINER Hiroaki Nakamura <hnakamur@gmail.com>

RUN yum update -y

# install LuaJIT
RUN yum install -y curl tar make gcc && \
    cd /usr/local/src && \
    curl -O http://luajit.org/download/LuaJIT-2.0.2.tar.gz && \
    tar xf LuaJIT-2.0.2.tar.gz && \
    cd LuaJIT-2.0.2 && \
    make && \
    make PREFIX=/usr/local/luajit install

# install nginx with lua-nginx-module
RUN yum install -y git curl tar bzip2 make gcc-c++ zlib-devel && \
    export LUAJIT_LIB=/usr/local/luajit/lib && \
    export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0 && \
    cd /usr/local/src && \
    git clone git://github.com/simpl/ngx_devel_kit.git && \
    git clone git://github.com/chaoslawful/lua-nginx-module.git && \
    curl -LO http://downloads.sourceforge.net/project/pcre/pcre/8.34/pcre-8.34.tar.bz2 && \
    tar xf pcre-8.34.tar.bz2 && \
    curl -O http://nginx.org/download/nginx-1.4.6.tar.gz && \
    tar xf nginx-1.4.6.tar.gz && \
    cd nginx-1.4.6 && \
    ./configure --prefix=/usr/local/nginx \
      --with-pcre=/usr/local/src/pcre-8.34 \
      --add-module=/usr/local/src/ngx_devel_kit \
      --add-module=/usr/local/src/lua-nginx-module \
      --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" && \
    make && \
    make install

ADD nginx.conf /usr/local/nginx/conf/nginx.conf

EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
```

DockerfileでADDしているnginx.confはソースパッケージのデフォルトの設定に以下の設定を追加したものになっています。

```text:https://github.com/hnakamur/docker-nginx-lua/blob/3695996b8444540acfc998020a0ccf7b09dcf096/nginx.conf#L48-L51
        location /lua_test {
            default_type 'text/plain';
            content_by_lua "ngx.say('Hello, World!')";
        }
```

差分は https://github.com/hnakamur/docker-nginx-lua/commit/3695996b8444540acfc998020a0ccf7b09dcf096#diff-1 を参照してください。

```shell-session
docker build -t hnakamur/nginx-lua .
```

でビルドして、

```shell-session
VBoxManage controlvm "boot2docker-vm" natpf1 "nginx,tcp,127.0.0.1,8080,,80"
```

でOSXのlocalhostの8080番ポートをVirtualBoxのboot2docker-vmの80番ポートにフォワードするように設定して、

```shell-session
docker run -d -p 80:80 hnakamur/nginx-lua
```

でdockerコンテナを起動します。

あとは、

```shell-session
curl http://localhost:8080/lua_test
```

でアクセスを試し```Hello, World!```と表示されることを確認できました。

# nginxを起動せずbashを起動する手順

上記のDockerfileではENTRYPOINTではなくCMDでnginxを起動するようにしたので、以下のコマンドで起動すればnginxを起動する代わりにコンテナ内でbashを使えます。

```shell-session
docker run -i -t -p 80:80 hnakamur/nginx-lua /bin/bash
```
gitのコマンドにエリアス（別名）を用いる方法

# 背景
驚くほど英語力が無いので、よく`git branch`を`git brunch`と書いてしまったり、`git merge`を`git marge`と書いてgitに怒られることが多かった。そのため場当たり的な解決方法を考えた。

# 解法
英語力を高めるという根本的な解決方法は置いておくとして、gitのコマンドにはエリアスを使用できるらしいので次のようにした。

```bash:
$ git config --global alias.eda branch
```
`branch`を`eda`というエリアスにした


```bash:
$ git config --global alias.mix merge
```
`merge`を`mix`というエリアスにした。


※うん、ダサいのはよくわかってる。

# TODO
* エリアスの削除の仕方を調べる。
* 英語力をつける。

# 参考リンク
* [http://www.backlog.jp/git-guide/intro/intro2_2.html](http://www.backlog.jp/git-guide/intro/intro2_2.html)
OSX上のdockerでCentOS 6.5にnginxを公式レポジトリからインストールするサンプル

# dockerのインストール

dockerとboot2dockerは
[OS X をサポートした Docker 0.8 を試す - Qiita](http://qiita.com/kanekoa/items/cf3cabb23da69c609002)の手順でインストールしました。

~/.bashrcには以下の1行を追加します。

```~/.bashrc
export DOCKER_HOST=tcp://localhost:4243
```

# nginxをインストールするDockerfile

[Dockerでnginxサーバー立ててみた。あとDockerの使い方とか。 - Less is Best](http://yss44.hatenablog.com/entry/2013/12/27/150920)を参考にしつつ、好みに応じて改変しました。
改変の内容は以下の通りです。

* rpmの署名を検証する公開鍵をインストール
* nginx公式レポジトリはrpmをyumでインストール
* nginx.confはそのままで、nginxを起動時に"daemon off;"を引数で指定

```https://github.com/hnakamur/docker-nginx-lua/blob/16d7065c2c80fedfabd3568950775b588186dc55/Dockerfile
FROM tianon/centos:6.5
MAINTAINER Hiroaki Nakamura <hnakamur@gmail.com>

RUN yum update -y && \
    rpm --import http://nginx.org/keys/nginx_signing.key && \
    yum install -y http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm && \
    yum install -y nginx

EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
```

ちなみに http://stackoverflow.com/a/21468956 で知ったのですが、AUFSを使う場合のRUNの個数制限は昔は42個だったのがdockerのバージョン0.7.2以降は127個に増えたそうです。[docker/CHANGELOG.md at master · dotcloud/docker](https://github.com/dotcloud/docker/blob/master/CHANGELOG.md#072-2013-12-16)

とはいえ、節約した方がいいので1つのRUNで複数のコマンドを&&で繋いで実行するようにしています。1行が長くなるので行末にバックスラッシュを入れて改行しています。

# イメージのビルド

Dockerfileのあるディレクトリで以下のコマンドを実行します。

```shell-session
docker build -t hnakamur/nginx .
```

[最速Docker研究会(DockerのTipsを20個上げていくぜ編) - Happy New World](http://d.hatena.ne.jp/mainyaa/20140203/p1)の「3. docker build時には必ずタグを付ける。」を参考に、タグを付けてbuildするようにしました。

# VirtualBoxのポートフォワーディングの設定

[DockerをBoot2dockerで動かした際のポートフォワードをCLIから設定する - Qiita](http://qiita.com/ikuyamada/items/3f12de859a87d51fdd79)や
[Docker on OSX: Port Forwarding | FogBlog](http://fogstack.wordpress.com/2014/02/09/docker-on-osx-port-forwarding/)を参考に以下のコマンドで設定しました。

私の手元の環境ではOS Xでnginxを80番ポートを使用していたので、OS Xの8080番ポートをVirtualBoxの80番ポートにフォワーディングするようにしました。

```shell-session
VBoxManage controlvm "boot2docker-vm" natpf1 "nginx,tcp,127.0.0.1,8080,,80"
```

# 起動方法

```shell-session
docker run -d -p 80:80 hnakamur/nginx
```

で起動します。-p 80:80でVirtualBoxの80番ポートをdockerのhnakamur/nginxコンテナの80番ポートにフォワーディングしています。

# OSXからcurlで確認

ポートフォワーディングは
OSX 8080 ---> VirtualBox 80 ---> hnakamur/nginx 80
という状態になっていますので、

```shell-session
curl http://localhost:8080
```

と実行すれば、OSXからdockerコンテナのnginxにアクセスできました。
SVGSVGElement

SVG要素を表すDOMオブジェクトにSVGSVGElementがあります。
取得する方法は、ownerDocumentのdocumentElementを取得する方法と、
各要素のownerSVGElementから取得する方法があります。

(下記の例では、evt.targetがそもそもSVGSVGElementですが、あえて別な方法で取得しています。)

```xml:svgsvgelement.svg
<svg xmlns="http://www.w3.org/2000/svg" onload="func(evt)">
<script><![CDATA[
function func(evt) {
    var ns = "http://www.w3.org/2000/svg";
    var doc = evt.target.ownerDocument;
    alert(doc.documentElement); //documentElementから取得する方法
    alert(doc.getElementById("r1").ownerSVGElement);  //ownerDocumentから取得する方法
}
]]></script>
<rect id="r1" x="10" y="10" width="100" height="100" fill="red" />
</svg>
```

SVGSVGElementはいろんな情報をもっており、
またいそんなメソッドが用意されています。

たとえば、pauseAnimation()でアニメーションを停止し、unpauseAnimation()でアニメーションを再会できます。

```xml:animation.svg
<svg xmlns="http://www.w3.org/2000/svg">
<script><![CDATA[
function pause(evt) {
    var svg = evt.target.ownerSVGElement;
    svg.pauseAnimations();
}

function unpause(evt) {
    var svg = evt.target.ownerSVGElement;
    svg.unpauseAnimations();
}
]]></script>
<rect id="r1" x="10" y="10" width="100" height="100" fill="red">
  <animate attributeType="XML" attributeName="x"
           from="10" to="100" dur="10s" />
</rect>
<rect id="r2" x="10" y="110" width="20" height="20" fill="blue" onclick="pause(evt)" />
<rect id="r3" x="40" y="110" width="20" height="20" fill="blue" onclick="unpause(evt)" />
</svg>
```

下の青の矩形の左はアニメーションを停止、右はアニメーションを再会させます。

またsetCurrentTimeで現在の時間を秒数で指定できます。
下記の例は青の矩形をクリックするたびにアニメーションの２秒後の状態から再生されます。
アニメーションが終わっても、時間が戻ってしまって、開始から２秒後の時点からのアニメーションになります。

```xml:animation2.svg
<svg xmlns="http://www.w3.org/2000/svg">
<script><![CDATA[
function func(evt) {
    var svg = evt.target.ownerSVGElement;
    svg.setCurrentTime(2);
}

]]></script>
<rect id="r1" x="10" y="10" width="100" height="100" fill="red">
  <animate attributeType="XML" attributeName="x"
           from="10" to="100" dur="10s" />
</rect>
<rect id="r2" x="10" y="110" width="20" height="20" fill="blue" onclick="func(evt)" />
</svg>
```
Sass 3.3.0.rc.1で実装された#{&}-hogeの記法は廃止になった。

Sass 3.3の新機能の一つとして予定されていた、`#{}`と`&`を組み合わせることでBEM等の記法を簡潔に表現できる機能ですが、3.3.0.rc.1の時点で一旦実装されたものの、仕様上の問題があり廃止になっていたようです。

https://github.com/nex3/sass/commit/cbd07dac56028e2216972e1c009d7bf24027b588
https://github.com/nex3/sass/commit/3f1498a55d89f50c343368dbd012313bf9c5ae16
https://gist.github.com/nex3/8050187

3.3.0.rc.6の時点では、代わりに単純に`&`をprefixとして使うことで、親の名前を展開できるようになりました。ドキュメントの例を借りれば、従来は以下のような記法だったのが、

```
#main {
    #{&}-sidebar { border: 1px solid; } // #main-sidebarとして出力される
}
```

以下のような記法に変わったということです。

```
#main {
    &-sidebar { border: 1px solid; } // 効果は同様
}
```

なお、現状では`&`をprefixとしてのみ使えるようです。
alphaやrcと銘打たれたものに手を出すと、こういう思わぬ仕様変更につまづきかねないといういい例ですね。
Selenium IDE でテストを実行中の URL を取得する

Selenium IDE では `storeEval` で Javascript の実行結果を変数に保存できることを知り、下記の方法で URL を取得しようとしました。

|コマンド|対象|値|
|---|---|---|
|open|https://qiita.com/||
|storeEval|document.location|url|
|echo|${url}||

ですが下記の実行結果のとおり、変数 url に入っているのは欲しい URL ではありません。

```
[info] echo: chrome://selenium-ide/content/selenium-ide.xul 
```

テストを実行中の URL を取得するには下記のようにする必要があります。

|コマンド|対象|値|
|---|---|---|
|open|https://qiita.com/||
|storeEval|this.page().getCurrentWindow().document.location|url|
|echo|${url}||

実行結果です。

```
[info] echo: https://qiita.com/
```

下記を参考にしました。ありがとうございます。
http://colo-ri.jp/develop/2008/04/seleniumjavascript.html
外部ブラウザからアプリ起動を実装する際の注意点


所用により必要になり、以前読んだJSSECのPDFに書いてあったのを思い出したので改めて備忘録としてまとめた。

##元々の機能として
Androidの機能としてWeb上のリンクに対応してアプリを起動することが可能。
アプリ側がタップされたリンクのURIスキーマを対応しているとURLに含まれる情報と一緒にアプリを起動することができる。

##危険性

###乗っ取り
同一URIスキーマに対応した悪意あるアプリがインストールされていると、URLに含まれる情報を盗まれる可能性がある。

URIスキーマに対応したアプリが複数あると暗黙Intentによる起動のためアプリ選択画面になる。その際にユーザが誤って悪意あるアプリ側を選ぶと、センシティブデータを盗まれる。

####対策
センシティブな情報をパラメータに含めない

###URLに含まれるパラメータ経由でXSSまがいな攻撃を食らう
URIスキーマに対応したリンクは比較的簡単にできる。
URLのパラメータが想定したWebページから送られてくるとは限らないし、送り元も判断できない。

そのままパラメータの値を実行や表示、利用などすると悪意あるデータをそのまま利用することになる。

####対策
URLパラメータを利用するためにバリデーションチェックを実施すること


##今回参考した情報
http://www.jssec.org/dl/android_securecoding.pdf
dockerのENTRYPOINTとCMDの書き方と使い分け、さらに併用

# 2019-06-01 追記

この記事より [DockerfileのCMDとENTRYPOINTを改めて解説する - Qiita](https://qiita.com/uehaj/items/e6dd013e28593c26372d) のほうがお勧めです。

# 元記事

[Dockerfile reference](https://docs.docker.com/engine/reference/builder/)や[Dockerfile Best Practices](http://crosbymichael.com/dockerfile-best-practices.html)にENTRYPOINTとCMDの書き方と使い分け、さらに併用について書かれていました。

# ENTRYPOINTとCMDの引数の書式

[ENTRYPOINTの書式](https://docs.docker.com/engine/reference/builder/#entrypoint)は以下の2種類があります。

* ENTRYPOINT ["executable", "param1", "param2"] \(シェルを介さずに実行。この形式を推奨)
* ENTRYPOINT command param1 param2 (シェルを介して実行)

シェルを介して実行するほうは/bin/sh -cを使って実行するそうです。

[CMDの書式](https://docs.docker.com/engine/reference/builder/#cmd)は以下の3種類です。

* CMD ["executable","param1","param2"] \(シェルを介さずに実行。この形式を推奨)
* CMD ["param1","param2"] \(ENTRYPOINTのデフォルト引数として利用する場合)
* CMD command param1 param2 (シェルを介して実行)

# ENTRYPOINTとCMDの併用

[Dockerfile Best Practices](http://crosbymichael.com/dockerfile-best-practices.html)の"5. CMD and ENTRYPOINT better together"にENTRYPOINTとCMDを併用する例があります。

```
ENTRYPOINT ["/usr/bin/rethinkdb"]

CMD ["--help"]
```

のように書きます。

すると、docker runのときに

```
docker run crosbymichael/rethinkdb
```

のようにイメージの後に引数無しで実行した場合は、CMDの--helpが使われて、/usr/bin/rethinkdb --helpが実行されることになります。

一方、

```
docker run crosbymichael/rethinkdb --bind all
```

のようにイメージの後に引数有りで実行した場合は、CMDの値は使われず、/usr/bin/rethinkdb --bind allが実行されることになります。

## docker run --entrypoint="" で変更も可能

[docker runのリファレンス](https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime)によると ```--entrypoint``` オプションを使えば ```Dockerfile``` の ```ENTRYPOINT``` の値を上書きすることも可能です。
[ruby] method_missing を利用して パラメータをメソッド名に取り込んだメソッドを定義する

* 引数値をメソッド名の交換。

課題：
=====
   一桁の整数の掛け算 x * y  の結果を返すメソッド calculate(x, y) が既に定義済みとする。
   この時 mult_1x1(), miut_1x2(), ... mult_9x9() というメソッドで呼び出しを可能にしたい。

以下に２つに対処例を示す。

対処１：
＝＝＝＝
   　律儀に  81 個のメソッドを定義する。

```ruby:9x9.rb
        def mult_1x1
           calculate(1, 1)
        end 
        ...
        def mult_9x9
           calculate(9, 9)
        end
```

これは初心者の対応。
中級者は次のようにして、類似コードの記述を避けるだろう。

対処２：
＝＝＝＝
　以下に そのままで実行可能なコードを以下に示す。
  method_missing を利用して、動的にメソッドを定義するという方法を使っている。

```ruby:9x9.rb
# -*- coding: utf-8 -*-

class Calc
  instance_methods.each do |m|
    undef_method m unless m.to_s =~ /^__|^send|^method_missing|^object_id|^methods/
  end

  # cals_XxY() を動的に実装する。
  def method_missing(name, *args)
    /^mult_(\d)x(\d)$/ =~ name
    throw NoMethodError.new "undefined method #{name} for Calc" if $1.nil? || $2.nil?
    calculate($1.to_i, $2.to_i)
  end

  def mult(x, y)
    self.send "mult_#{x}x#{y}"
  end

  def calculate(x, y)
    x * y
  end
end

calc = Calc.new

# 呼び出し動作の確認
(1..9).each do |y|
  (1..9).each do |x|
    # calc.multi(x,y) の呼び出し
    throw "Error" if calc.mult(x, y) != x * y

    # calc.mult_XxY() の呼び出し
    val = eval "calc.mult_#{x}x#{y}"
    throw "Error" if val != x * y

    # calc.mult_XxY() の呼び出し
    val = calc.send "mult_#{x}x#{y}"
    throw "Error" if val != x * y
  end
end

# calc のメソッド一覧
# puts calc.methods

# ２桁の数字のメソッドは undefind になる。
# puts calc.mult_10x10
 
 ```

この方法を流用すれば、 mult9(y) として  calucualte(9, y) を呼び出せるようにといったこともできる。

上のコードでは、mult_XxY() を  mult(x, y) で呼び出す方法も参考として入れてある。

これは、書籍  
  Metaprogramming Ruby: Program Like the Ruby Pros 
   http://www.amazon.com/Metaprogramming-Ruby-Program-Like-Pros-ebook/dp/B00A376YAK/
を読んで得た知識の利用である。
ファイルを読み込む

Emacs Lispでファイルを文字列として読み込んで加工ー、なんてことがしたいとする。

「Emacs ファイル 読み込み」でぐぐると [GNU Emacs Lispリファレンスマニュアル: ファイル - 24.3 ファイルの読み込み](http://www.bookshelf.jp/texi/elisp-manual-20-2.5-jp/elisp_25.html#SEC374) が出てきて、試してみると「<em>これ、ファイルの中身が直接バッファに出てきちゃうじゃーん</em>」と絶望することになる。

## 愚直

だが待ってほしい、ここはEmacsの世界だ。郷に入っては郷を従へといふ名セリフを知らないのかよ。

```el
(with-temp-buffer
  (insert-file-contents "./input.txt")
  (buffer-substring-no-properties (point-min) (point-max)))
```

`with-temp-buffer`は実にべんりなマクロで、見えないところに一時的なバッファを作ってくれる。
[Current Buffer - GNU Emacs Lisp Reference Manual](http://www.gnu.org/software/emacs/manual/html_node/elisp/Current-Buffer.html)を参照のこと。

`(buffer-substring-no-properties (point-min) (point-max)`はバッファの中身を全部文字列として得られるいかしたイディオムだぞ!

## `f`の時代

[`f.el`](https://github.com/rejeep/f.el)はいかしたファイル操作ライブラリだよ。

```el
(f-read-text "./input.txt")
```

この一行で済むのでした。ちゃんちゃん♪

[El-Get](https://github.com/dimitri/el-get/)を使ってるなら
`(el-get 'sync 'f)` とかでインストールできるよ。タブンネ。<sub>([Pull Request #1595 · dimitri/el-get](https://github.com/dimitri/el-get/pull/1595)がマージされてれば…!)</sub>
godeb で Debian Wheezy(x86/amd64)でGolang 1.1以上を使う(メモ)

Deiban Wheezy(x86またはamd64)で Go を使おうと思ったら標準とパッケージ golang を入れることになるが、これは go 1.0になってしまう。Debian testingとかだと1.2があるんだけど。

これは古すぎて困るなーと思ったら [In-flight deb packages of Go](http://blog.labix.org/2013/06/15/in-flight-deb-packages-of-go) で godeb というものが公開されていた。

32bitなら上記エントリ本文中にある x86 32-bit binary のリンクにあるファイルを、64bitなら x86 64-bit binary を取得して展開すると godeb というバイナリが現れる。

godeb は、自動的に golang の公式リポジトリの配布tarballを取得して go という名前の deb にしてさらにインストールしてくれる。しかもその取得するリポジトリは各種バージョンが選べるっていう。

まず入れる前に、 Debianで配布されているほうの golang が衝突するので削除する。

```bash
apt-get --auto-remove remove golang
```

godeb でどんなことができるか見る。

```bash
./godeb
Usage: godeb <command> [<options> ...]

Available commands:

    list
    install [<version>]
    download [<version>]
    remove
```

インストール出来るバージョン一覧を見る。

```bash
./godeb list
1.2.1
1.2
1.2rc5
1.2rc4
1.2rc3
1.2rc2
1.2rc1
1.1.2
1.1.1
1.1
1.1rc3
1.1rc2
1.1rc1
1.1beta2
1.1beta1
1.0.3
1.0.2
1.0.1
```

一杯あるね。では go 1.2 を入れよう。

```bash
sudo ./godeb install 1.2
processing https://go.googlecode.com/files/go1.2.linux-amd64.tar.gz
package go_1.2-godeb1_amd64.deb ready
(データベースを読み込んでいます ... 現在 145776 個のファイルとディレクトリがインストールされています。)
(go_1.2-godeb1_amd64.deb から) go を展開しています...
go (1.2-godeb1) を設定しています ...
```

どれどれ...

```bash
go version
go version go1.2 linux/amd64
```

やったね!
Dockerfileのインストラクションは大文字で書くのが慣習だそうです

http://docs.docker.io/en/latest/reference/builder/#format
にDockerfileのフォーマットについて説明があります。

```
# Comment
INSTRUCTION arguments
```

INSTRUCTIONの部分は大文字小文字の違いは区別されませんが、argumentsの部分と区別しやすくするためINSTRUCTIONの部分は全て大文字で書くのが慣習だそうです。
PDFの印刷時に日付を入れる方法

PHPの場合、TCPDFで既存のPDFファイルに出力時の日時を入れるっていう方法もあるけど、日付入れるためだけにTCPDFの環境をつくるってのも面倒。

PDFそのものに自動で入力する方法がないものかと検索するもののなかなか見つからない。けっこう需要あると思うんだけどな…

そしたら、ADOBE公式の[Acrobat JavaScript Scripting Guide](http://kb2.adobe.com/jp/cps/511/511235/attachments/511235_AcroJSGuideJ.pdf)にちゃんと載ってるんですね。こういうのを探してたんですよ。引用

>#自動日付フィールドの作成
フォームでは、追跡調査を行えるように、日付を使用することがよくあります。ここでは、文書
を開いたときに現在の日付が自動的に表示されるテキストフィールドの作成手順を説明します。 
文書が開いたときに現在の日付を表示するスクリプトは、文書レベルのスクリプトとして作成し
ます。 
##自動日付フィールドを作成するには： 
1. テキストフィールドツールを選択して、テキストフィールドを作成します（詳細は、Acrobat 
オンラインヘルプの「フォームフィールドの作成」の項を参照してください）。「一般」タブ
を選択して、フィールドに「Today」という名前を付けます。 
2. 「フォーマット」タブを選択し、フォーマット分類で「日付」を選択し、年月日の書式オプ
ション（「mmm d, yyyy」など）を選択します。このフィールドは計算フィールドですので、
「一般」タブでフィールドを読み取り専用にし、「閉じる」をクリックします。 
3.  文書が開かれるたびに実行される文書レベルスクリプトを作成します。アドバンスト／
JavaScript ／文書レベル JavaScript の編集を選択します。スクリプト名に「Today」と入
力して、「追加」をクリックします。
4.  スクリプトウィンドウに、Today 関数を定義するテキストが自動的に生成されますが、これ
をすべて削除します。次のテキストを、この体裁のとおりに入力して（行が折り返されるか
もしれませんが、それは問題ありません）、「OK」をクリックします。 
``var f = this.getField("Today"); 
f.value = util.printd("mm/dd/yyyy", new Date());``
このスクリプトでは、Today フィールドを変数 f にバインドした後、その値を計算しています。
new Date() は、初期値として現在の日時を持つ日付オブジェクトを新規作成します。util 
オブジェクトは、日付を月 /日 / 年の書式にするために使用しています。 
5. JavaScript エディタダイアログボックスで「OK」をクリックし、JavaScript 関数ダイアログ
ボックスで「閉じる」をクリックします。 
フィールドの日付は、util.printd で生成した書式ではなく、テキストフィールドのプロパ
ティで選択した書式で表示されることに注意してください。

けっこういいかも