OmniAICreator/Qiita-1.07M huggingface dataset:
'ABC'を含むファイルだけをさっと'git add'

# 入力が面倒

この状態で

```zsh
$ git status
# On branch master
# Changes not staged for commit:
#
#       modified:   sub/testABC.txt
#       modified:   sub/testDEF.txt
#       modified:   testABC.txt
#       modified:   testDEF.txt
#
```
`ABC`を含む２ファイルのみ追加したい。

* sub/testABC.txt
* testABC.txt

`git add *ABC*`とした場合はカレントディレクトリのみが対象となる。
→ `sub/testABC.txt`は追加されない (場合によっては便利)

```zsh
$ git add *ABC*
$ git status
# On branch master
# Changes to be committed:
#
#       modified:   testABC.txt
#
# Changes not staged for commit:
#
#       modified:   sub/testABC.txt
#       modified:   sub/testDEF.txt
#       modified:   testDEF.txt
#
```

正解は`git add "*ABC*"`なのだが

* そもそも`*`で囲むのがめんどくさい
* `"`や`'`で囲むのもめんどくさい

# aliasで解決

以下のようにaliasを追加する。

```.gitconfig
[alias]
    ad = "!f() { git add \"*${1}*\" ${@:2};};f"
```

ファイルパスに`ABC`を含むファイルをさっと追加できるようになる。

```zsh
$ git ad ABC
$ git st
# On branch master
# Changes to be committed:
#
#       modified:   sub/testABC.txt
#       modified:   testABC.txt
#
# Changes not staged for commit:
#
#       modified:   sub/testDEF.txt
#       modified:   testDEF.txt
#
```

後ろならオプション指定も使える。

```zsh
$ git ad ABC -p
```

## ついでにresetにも

```.gitconfig
[alias]
    re = "!f() { git reset HEAD \"*${1}*\" ${@:2};};f"
```

`git re ABC`でステージングされたファイルをさっと戻すのに使用している。
frameとboundsの理解をちょっとだけ深める

UIViewのframeとbounds、どちらもViewのサイズや位置を決めるものですが、結構適当にframeを使っている方が多いのではないでしょうか？
いろんなサイトで解説されていますが、frameは親からの座標 / boundsは自分の座標といわれても？？？な感じでした。
差がよくわからない、そもそもなぜ2個あるんだと。

自分もまだ完全ではないですが、コードを書いて動かして理解した範囲でまとめてみます。

とはいうものの、frameとboundsだけでは理解しづらいです。
ここに **center、transform** を加えるとぐっと理解しやすくなります。

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

それぞれの関係を図にまとめるとこんな感じです（数値は座標のイメージで正確じゃないです）

![ios_view_position.png](https://qiita-image-store.s3.amazonaws.com/0/25944/90062a93-5e2d-ccb6-e290-3a8d0f799794.png)

親Viewにグレーの子Viewを配置して、適当にtransformで位置・スケール・回転をずらしたイメージです。
左上のグレー枠が描画抜きで親からみた子Viewの場所、右下のななめになっているグレー枠がtransformの結果、実際に描画された子Viewです。

**center/boundsはtransform前の配置座標、frameはtransform後の描画座標** 　というイメージです。
(※孫Viewまで考えると実描画位置という言い方はちょっとまずいのですが...)

Android的にいうと、 center/boundsがlayout座標、transformがAnimationでの移動、frameがAnimationで移動した結果描画される座標　というところでしょうか。

------------------------------
よって、自分の半分のサイズの子Viewを追加したい　というときにframeを使うとまずいです。
もしtransformが変更されていて大きさが変わっていた場合意図した動作になりません。

仮に(100,60)のViewがあり、大きさ半分(50,30)の子Viewを追加したいとします。
このとき、transformで描画サイズが倍になっていたとすると...?

```objc
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 60)];
view.transform = CGAffineTransformMakeScale(2, 2);   //2倍に

//さぁこのviewに大きさ半分のView(幅50, 高さ30)を追加するぞ

//だめな例。frameを使う
CGFloat childW = CGRectGetWidth(view.frame) / 2;
CGFloat childH = CGRectGetHeight(view.frame) / 2;
childView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, childW, childH)];
[view addSubview:childView];
//transformでviewの描画サイズが倍なので、childW=100,childH=60となり意図しない結果になる

//正しい例。boundsを使う
CGFloat childW = CGRectGetWidth(view.bounds) / 2;
CGFloat childH = CGRectGetHeight(view.bounds) / 2;
//この方法ならtransformに関わらずchildW=50, childH=30で意図通り
```

これは極端な例ではありますが、frameとboundsで明確に結果に差が出ます。
**transform前のサイズがほしいのか、後のサイズがほしいのか** を明確に意識して使い分けましょう。

centerも同様です。
transformで位置を動かす前の場所がほしいときはcenter、
実際の描画位置を見たいときは frame をもちいましょう。


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

また、適当にframeを設定するのも注意です。
特に回転がかかっている場合、viewのboundsがどう変わるのか予測が難しいです
試しに45度回転がかかった状態で適当にframeを設定したとしましょう。
frameが変わる、ということはそれに関連するcenter/boundsが変わることを意味します。

このとき、次のような問題が発生します

![qiita_image.png](https://qiita-image-store.s3.amazonaws.com/0/25944/2624679a-5aed-8a20-3a79-89b5937e3b40.png)

赤線が新しいframeです。ではそのときboundsはどういう値になればいいのか。
青い３つの線がboundsのイメージです。

でも３つの青線の四角形、すべてが設定したframeを満たしてますよね？
条件を満たす値が複数存在するということは、 **どうなるかよくわかりません**。

自分がこういうコードを書いて実験したときは、frame操作のたびにboundsがゆがみ、最後にはboundsの高さが0になり見えなくなりました。
内部的にはちゃんと逆行列のような計算が走ってるとは思いますが、結果が予測困難です。

よって、frameで大きさを変えるときは要注意です。
もちろん、transformが変わっていないことが分かっている状態ならOKです。

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

まだよくわかっていないのがboundsのoriginを(0, 0)以外にしたときです。
左上の座標というより、centerからのオフセットという印象を受けます。
ただ子Viewは一切オフセットされなかったので、ややトリッキーな印象です。
（使うシーンはあるのだろうか...詳しい人教えてください...）
Peco & Pecrant が素晴らしい

Simplistic interactive filtering tool
https://github.com/peco/peco

Vagrant global-status controller for peco
https://github.com/gongo/pecrant

[pecrant =$(vagrant global-status | peco) - Thanks Driven Life]
(http://gongo.hatenablog.com/entry/2014/06/19/232538)

> - vagrant global-status 便利
> - 便利だけど id をコピペして vagrant up $id とかしないといけないのがめんどい
> - peco かっこいい

素晴らしさが言葉で上手く表現出来ないので、各ページを参照して下さいw

コマンドラインから vagrant の各 VM に対してどこからでも簡単にコマンドを発行出来る！

![](https://github.com/gongo/pecrant/raw/master/images/pecrant_up.gif)

私もちょっと弄ってみました。
Mac の iTerm2 専用のパッチではありますが、SSH と Open Terminal Here を入れてみました。
https://github.com/YungSang/pecrant/tree/iterm

たぶん本家は Mac でも Windows でも動くように作ってあるので、
このパッチを Pull Request するのはダメかも。

おまけ：pecrant だと peco と３文字もかぶるので、

```bash
alias veco="pecrant"
```

追記：
`vagrant box list | peco` を使って box の管理も出来るようになりました。

```bash
$ pecrant box
Usage: pecrant box <command>

  update  Update the selected vagrant box
  remove  Remove the selected vagrant box
  list    List vagrant boxes for this user
  help    Show this message
```
配列の要素を展開して関数の引数にする


配列`args = [1, 2, 3]`と、
関数`hoge = function(){console.log(arguments);}`があって、
argsの要素をhogeの引数として`hoge(1, 2, 3)`って渡したい。

普通に`hoge(args)`ってやると`{ '0': [ 1, 2, 3 ] }`ってなる。

## Function.apply
`hoge.apply(this, args)`
→`{ '0': 1, '1': 2, '2': 3 }`
GitHubでアサインされたIssueを忘れないようにする

以前に作った[GitHub Checker](https://chrome.google.com/webstore/detail/github-checker/dejgifcjoefbogdjpjokobdlddjhbich)のバージョン0.2.0をリリースしました。

# GitHub Checkerとは

GitHubでレビュー依頼やIssueの修正依頼をされていたけど、後でやろうと思ったら忘れてた、なんてことはよくあることですねw
心当たりのある方は、このChrome Extension入れましょう。
自分が対応すべきIssue数が常にアイコン上に表示されているので、忘れてましたなんて言わせません。

# 0.2.0の変更点

## Issuesの各種フィルターに対応

Assigneeに指定されたIssue(Pull Request)だけでなく、自分が作ったIssueやmentionされているものも表示できるようにしました。

![github_checker.png](https://qiita-image-store.s3.amazonaws.com/0/22653/09bf5bc2-3fbc-fd10-2cdd-171aa17c4fac.png)

## デフォルトフィルターの設定

デフォルトフィルターにセットしてるIssuesの数がバッジとしてChrome Extensionのアイコンに表示されます。

![Screen Shot 2014-06-21 at 2.27.00 AM.png](https://qiita-image-store.s3.amazonaws.com/0/22653/1aebd554-f3bd-6c64-10b1-1af3bf0243d0.png)

是非是非使ってみてフィードバックください！
Eclipse 4.3 Kepler導入+日本語化

4日後に最新の4.4がリリースされるのに、タイミング悪く入れ替えてしまった...

http://tigawa.github.io/blog/2013/07/27/eclipse-4-dot-3/
http://d.hatena.ne.jp/replication/20130628/1372349579
この２つのサイトを参考にすればできます。
Strategyパターン

やってみた

```pl
use strict;
use warnings;
use 5.10.1;

my %strategy = (
   "孫悟空" => {
      "必殺技" => sub{ say " かめはめ波"     },
      "しっぽ" => sub{ say " しっぽ生えてる" },
   },
   "天津飯" => {
      "必殺技" => sub{ say " 気功砲" },
      "飛行"   => sub{ say " 舞空術" },
   },
);

foreach my $man ("孫悟空","天津飯") {
   say "$man";
   foreach my $action ("必殺技","しっぽ","飛行") {
     next if (! exists $strategy{$man}{$action} && say " $actionは未実装");
     $strategy{$man}{$action}->();
   }
}
__END__
孫悟空
 かめはめ波
 しっぽ生えてる
 飛行は未実装
天津飯
 気功砲
 しっぽは未実装
 舞空術
```
R言語でマンデルブロ集合のGIFアニメーション作成

## マンデルブロ集合

マンデルブロ集合（Mandelbrot Set）とは次の漸化式で定義される複素数列{Zn}n∈Nがｎ→∞の極限で無限大に発散しないという条件を満たす複素数ｃの集合です。
ここでは、フラクタル図形として描画してGIFアニメーションにします。

## 必要パッケージのインストール

あらかじめ、GIFアニメーション画像を作成するためのRパッケージをインストールします。

```r
install.packages("caTools")
```

## マンデルブロ集合(R言語ソースコード)

```r
library(caTools)
j.colors = colorRampPalette(c("#000022", "#110066", "#3366AA", "#2200FF", "#55DDFF", "#6622FF", "#0022DD", "#22AAFF", "#00FFFF")) #統計グラフ用のパレットを使用します。色は適当に付けます。

m = 350 #画像のサイズ

C = complex(real=rep(seq(-1.8,0.6, length.out=m), each=m), imag=rep(seq(-1.2,1.2, length.out=m), m ) ) 

C = matrix(C,m,m)
Z = 0 
X = array(0, c(m,m,15)) #15枚の発散を格納する配列

for (k in 1:15) { 
  Z = Z^2+C #漸化式
  X[,,k] = exp(-abs(Z)) #発散を配列に格納する
} 

write.gif(X, "mandelbrot_anime.gif", col=j.colors, delay=25)
```

![mandelbrot_anime.gif](https://qiita-image-store.s3.amazonaws.com/0/34365/37b58da0-dd1a-ad9b-61fc-813e8aca2766.gif)
自然数の対を自然数に写像する関数（ビット演算バージョン）を作ってみた

# 目標

[自然数の対を自然数に射影する関数（全単射）それとRubyで九九を作ってみた](http://qiita.com/irxground/items/89ef7eea954d6df4cae8) を受け、逆写像が容易に作れる写像を考えました。

# ビット演算

二つの非負整数を2進数で表し、各ビットを交互に並べていけば、どんな組合せでも必ず一意な結果が得られます。

例えば、0x9 と 0x35 という整数の組を考えたとき、前者は 001001、後者は 110101 です。これらを交互に並べた 101001100011 が結果となります。

この方式であれば、逆変換も自明です。

# コード

とりあえずCで書いてあります。

普通の再帰で実装していますが、容易に末尾再帰にもできるし、単純なループにもできます。ビット長がわかっていれば、各ビットを取り出してそれぞれシフトして、すべての論理和をとるという単一の式でも書けます。

ただ、ハードウェアなら配線一発かと思うと、ソフトウェアでのビット操作は本当に効率悪いですね。

```c:twoint2one.c
#include <stdio.h>

// y=110101, x=001001 => 10 10 01 10 00 11
int
twoint2one(int x, int y) {
  if (x == 0 && y == 0) {
    return 0;
  } else {
    return twoint2one(x>>1, y>>1)<<2 | (y&1)<<1 | x&1;
  }
}

// 10 10 01 10 00 11 => y=110101, x=001001
void
oneint2two(int *x, int *y, int n) {
  if (n == 0) {
    *x = 0;
    *y = 0;
  } else {
    oneint2two(x, y, n>>2);
    *x = *x<<1 | n&1;
    *y = *y<<1 | (n&2)>>1;
  }
}

int
main(void) {
  int x, y;

  printf("0x%x\n", twoint2one(0x09, 0x35)); // = 0xa63
  oneint2two(&x, &y, 0xa63);
  printf("0x%x, 0x%x\n", x, y); // = 0x9, 0x35

  printf("   ");
  for (x = 0; x < 10; x++) {
    printf("%3d ", x);
  }
  printf("\n");

  for (y = 0; y < 10; y++) {
    printf("%2d ", y);

    for (x = 0; x < 10; x++) {
      printf("%3d ", twoint2one(x, y));
    }
    printf("\n");
  }

  return 0;
}
```

出力は次のようになります。

```
0xa63
0x9, 0x35
     0   1   2   3   4   5   6   7   8   9
 0   0   1   4   5  16  17  20  21  64  65
 1   2   3   6   7  18  19  22  23  66  67
 2   8   9  12  13  24  25  28  29  72  73
 3  10  11  14  15  26  27  30  31  74  75
 4  32  33  36  37  48  49  52  53  96  97
 5  34  35  38  39  50  51  54  55  98  99
 6  40  41  44  45  56  57  60  61 104 105
 7  42  43  46  47  58  59  62  63 106 107
 8 128 129 132 133 144 145 148 149 192 193
 9 130 131 134 135 146 147 150 151 194 195
```
キウイジュース2

　さてさて、ここから２週目です。ここからは中々進歩しない俺の成長記録付けみたいな事をするので、結構途方も無いかもしれないです（笑）いつも見守ってくださる方に感謝の気持ちを捧げながらコードを書き上げたいと思います。とりあえずは、全探索ってイメージが直ぐに浮かぶ様なコードが書ければいいのかな・・・？

```java:
public class Main {
	
	int[] thePouring(int[] capacities, int[] bottles, int[] fromId, int[] toId) {
		for(int c = 0; c < fromId.length; c++) {
			if(capacities[toId[c]] < bottles[fromId[c]] + bottles[toId[c]]) {
				bottles[fromId[c]] -= capacities[toId[c]] - bottles[toId[c]];
				bottles[toId[c]] = capacities[toId[c]];
			} else {
				bottles[toId[c]] += bottles[fromId[c]];
				bottles[fromId[c]] = 0;
			}
		}
		return(bottles);
	}
	
	
	void doIt() {
		int[] capacities = {700000, 800000, 900000, 1000000};
		int[] bottles = {478478,478478,478478,478478};
		int[] fromId = {2,3,2,0,1};
		int[] toId = {0,1,1,3,2};
		int[] ans = thePouring(capacities, bottles, fromId, toId);
		for(int r = 0; r < ans.length; r++) {
			System.out.print(ans[r] + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}
```

　いやー見事にきったないコードですね〜。でも、最初書いたのよりはまだ効率が良い気がする。だって、インクリメント方式だったから処理回数多いもんアレ。こっち繰り返し＋分岐だからまだ全探索っぽい雰囲気保ってる・・・と信じてる。
Debian系でPostgreSQLのロケールを変更する

本家のやり方だと初期のロケール設定は`initdb -e UTF-8 --no-locale`とかするわけですが、Debian系だとインストールしたら勝手にこれが実行されるので困ったもんだという話。

# Debian系でのローカルルール

* 設定は/etcに、データは/varに置かれます。それに伴い独自のコマンド群が用意されています。
* apt-get installすると自動的にinitdb相当の処理が行われます。

元のinitdb等は`/usr/lib/postgresql/9.1/bin/`とかに置かれてますが、Debianのコマンド群を使うなら直接触らない方がよいでしょう。

# 最初から任意のロケールにする

initdbのデフォルト値として、ロケールは実行時のLANG環境変数等が、エンコーディングはロケールから推測するかSQL_ASCIIが使われます。

ので、`apt-get install`を実行するときに、目標のロケールをLANG環境変数に入れておけばOK。

ただしロケールなしにしたい時はエンコーディングが推測できずにSQL_ASCIIになってしまうので、この場合は作り直すしかないようです。

# 作り直す

バージョン番号(9.1)は適宜読み替えてください。

```bash
# 勝手に入れられたクラスタを削除
# pg_ctl stopとデータファイルの削除に相当
pg_dropcluster --stop 9.1 main

# 作り直し
# initdbとpg_ctl startに相当
pg_createcluster -e UTF-8 --no-locale --start main
```

# 参考

http://askubuntu.com/questions/371737/install-postgresql-why-is-initdb-unavailable
https://wiki.debian.org/PostgreSql
http://lets.postgresql.jp/documents/technical/text-processing/2
【C言語】systemでdirコマンドを実行する win7 32bit


```c:C言語
#include <stdio.h>
#include <stdlib.h>

int main (){

    int ret=0;
	char *cmdline="cd C:\\2014 & dir";

    ret=system(cmdline);
	
	if(ret!=0)
	{
	 printf("error ! \n");
	}

 	return 0;
}

```

##環境
OS:windows7 32bit (自作機)
コンパイラ:Borland C++ 5.5.1 for Win32

##解説
systemでdirコマンドを実行する。

##コンパイルと実行結果
上記ソースをC:\2014\0620\003.cとしてコンパイルして実行する。

```
C:\2014\0620>bcc32 003.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
003.c:
警告 W8004 003.c 7: 'ret' に代入した値は使われていない(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\2014\0620>003.exe
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は XXXXXXXXXX です

 C:\2014 のディレクトリ

2014/06/20  23:44    <DIR>          .
2014/06/20  23:44    <DIR>          ..
2014/05/15  22:29    <DIR>          0425
2014/05/14  07:09    <DIR>          0514
2014/05/16  07:22    <DIR>          0515
2014/06/03  07:16    <DIR>          0601
2014/06/08  23:48    <DIR>          0608
2014/06/19  23:45    <DIR>          0619
2014/06/20  23:45    <DIR>          0620
2014/05/14  07:09    <DIR>          java
               0 個のファイル                   0 バイト
              10 個のディレクトリ  17,056,096,256 バイトの空き領域

C:\2014\0620>
```

##関連
【C言語】_popenでdirコマンドを実行する win7 32bit
http://qiita.com/kyoshiro-obj/items/b406f54d82786c2b190a
Prologカットについて

#Prologのカットの使い方
大学の講義でprologをやっているのですがカット「！」について最初悩んで苦悶したので備忘録として投稿しようと思いました.
##カットの基本的な使い方
以下のルールに従ったprologプログラムをカットを使う場合とカットを使わない場合で

ルール1:X<2ならY=0
ルール2:2 $\leq$ XかつX<4ならY=2
ルール3:4 $\leq$ XならY=4

カットを使わない場合

```prolog:ex1
f(X,0) :- X<2.
f(X,2) :- 2=<X,X<4.
f(X,4) :- 4=<X.
```

カットを使う場合

```prolog:ex2
f(X,0) :- X<2,!.
f(X,2) :- 2=<X,X<4,!.
f(X,4) :- 4=<X.
```

カットを使わないex1の方では例えばf(1,Y)という目標を実行したときにYは0に具体化され後の文は実行しなくともfailすることは確定ですがPrologの性質上のバックトラックによって後の2文も実行されます.
カットを使うex2の方ではf(1,Y)という目標を実行したときにYは0に具体化されバックトラックをせずに文末のピリオドで終わります


カットは一度バックトラック制御と多くの教科書に書いてありますが,私の個人的な考えではカットの前までの節がfalseな場合のみ「!」以降の文を行うと考えた方がいいと思いました.

##カットの応用的な使い方
これは講義で問題として出された問題を使用したいと思います
fを項のファイルとする．
    findallterm(Term)
が，f中の項でTermとマッチする全てのものを端末に表示するように
手続きfindalltermを定義せよ．
Termがその過程で値の具体化を受けないようにせよ

```prolog:ex3
findallterm(Term):-
read(Term0),process(Term0,Term).

process(end_of_file,_):- !.

process(Term0,Term):-
(not(Term0=Term),!;
write(Term0),nl),
findallterm(Term).
```

###プログラムex3の使い方
see('読み込むファイル名'),findeallterm(探したい単語),seen.

###説明
read,writeに関しては組み込み述語であるので説明しません
ここではファイルの中にfindalltermに渡す引数が存在しているかどうかを調べます.
ここで重要なのが

```prolog:ex4
(not(Term0=Term),!;
write(Term0),nl),
findallterm(Term).
```

のところでnot(Term0=Term)がtrueであればfindallterm(Term)が行われ,falseであれば「；」によってもう一度process(Term0,Term)を行い今度は前項を行わずwrite(Term0),nlの項を実行されます.
別の問題を仮定して,検索したい文字がファイルに存在した場合にfalseを返し、それ以外はファイルの文字を出力するプログラムを作ってみます.ex3の抽出したex4の部分を下記のプログラムに入れ替えることでできます

```prolog
(not(Term0=Term),!,write(Term0),nl),
findallterm(Term).
```

これはnot(Term0=Term)がtrueであればカット以降の分を行いfalseであればfindallterm(Term)を行うというプログラムが出来上がります.

この使い方をすればprologの中でまるで他言語で言うif文が使えるようになります
PHPでLINQ

[Ginq](http://qiita.com/rana_kualu/items/2022739d8559272640bc) / [PHPLinq](http://qiita.com/rana_kualu/items/5f358536b2b7d269a96a)

PHPでLINQを再現するライブラリ、[PHPLinq](https://phplinq.codeplex.com/)を試してみます。

そもそもLINQって何よ。
http://ja.wikipedia.org/wiki/%E7%B5%B1%E5%90%88%E8%A8%80%E8%AA%9E%E3%82%AF%E3%82%A8%E3%83%AA
> データ集合に対して標準化された方法でデータを問い合わせることを可能にする

http://msdn.microsoft.com/ja-jp/library/bb308959.aspx
> .NET Framework に汎用クエリ機能が追加され、リレーショナル データや XML データだけでなく、あらゆる情報ソースにクエリ機能が適用されます。

何のこっちゃ。
平たく言うと、配列やらオブジェクトやらその他諸々の集合に対してSQL(っぽいもの)でSELECTできちまうぜ、という代物らしい。
さっそく試してみましょう。

```php
<?php
	// Linq include_path設定が必要
	set_include_path(get_include_path() . PATH_SEPARATOR . 'path/to/phplinq/Classes');
	require_once 'path/to/phplinq/Classes/PHPLinq/LinqToObjects.php';
	
	$sample1 = ['John', 'Peter', 'Joe', 'Patrick', 'Donald', 'Eric', 'Joe'];
	
	// SELECT name FROM sample1 WHERE LENGTH(name) < 5
	$result = from('$name')->in($sample1)
		->where('strlen($name) < 5')
		->select('$name');
	
	// SELECT DISTINCT name FROM sample1 ORDER BY id DESC
	$result = from('$name')->in($sample1)->reverse()->distinct('$name')->select();
	
	// Employee サンプルのコピペ
	class Employee {
		public $Id, $DepartmentId, $ManagerId, $Name, $Email, $Age;
		public function __construct($id = 0, $departmentId = 0, $managerId = 0, $name = '', $email = '', $age = '') {
			$this->Id				= $id;
			$this->DepartmentId 	= $departmentId;
			$this->ManagerId 		= $managerId;
			$this->Name 			= $name;
			$this->Email 			= $email;
			$this->Age				= $age;
		}
	}
	$employees = [
		new Employee(1, 1, 5, 'Maarten', 'maarten@example.com', 24),
		new Employee(2, 1, 5, 'Paul', 'paul@example.com', 30),
		new Employee(3, 2, 5, 'Bill', 'bill.a@example.com', 29),
		new Employee(4, 3, 5, 'Bill', 'bill.g@example.com', 28),
		new Employee(5, 2, 0, 'Xavier', 'xavier@example.com', 40)
	];
	
	// SELECT Email, SUBSTR(Email, INSTR(Email,'@')+1) FROM employees WHERE LENGTH(Name) = 4 ORDER BY Age DESC LIMIT 2 OFFSET 1
	$result = from('$employee')->in($employees)
		->where('$employee => strlen($employee->Name) === 4')
		->orderByDescending('$employee->Age')
		->skip(1)->take(2)
		->select('new {
			"EmailAddress" => $employee->Email,
			"Domain" => substr($employee->Email, strpos($employee->Email, "@") + 1)
		}');
```

コメントで書かれているSQLとほぼ同じ処理を、メソッドチェーンでSQLっぽく書くことができるようになりました。
SQLそのものではありませんが、同じようなかんじで使えます。
いちいちarray_filter()してforeachで抽出して、といった面倒な処理を書かなくて済みます。

一見便利ですが、欠点としては、対応しているのが配列とZend_Dbだけという点です。
ソースにはAdapter/MysqliやAdapter/Pdo/Mysqlなんてものがあるので、PDOを突っ込めるのかと思いきや、何故かZend_Db_Adapterを要求されます。
またArrayObjectなんてほぼ配列なのですが、これも対応していません。
サンプルではRSSのXMLを処理している例も載っているのですが、単に[SimpleXMLElement::xpath()](http://jp1.php.net/manual/ja/simplexmlelement.xpath.php)で配列にしてから突っ込んでるだけでした。
対応がもっと広がればどんどん便利になるかと思われましたが、2009年あたりで開発が停止しています。
残念。
proxmoxでWebUIが表示されない時はデータをバックアップし諦めるしかない

キャッシュが悪さすることがあるので、シークレットモードでアクセス。

![スクリーンショット 2014-06-20 21.20.23.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f7a0e3a6-d679-f2ee-a828-0e510e21637c.png)

## pvecm delnodeした後になる場合

[Proxmox VE 2.0 Cluster - Proxmox VE](https://pve.proxmox.com/wiki/Proxmox_VE_2.0_Cluster#Troubleshooting)のTroubleshootingで解決した。

```bash:
service pvestatd stop
service pvedaemon stop
service cman stop
service pve-cluster stop
# /var/lib/pve-clusterをバックアップ、あとで復元する。
rm -rf /var/lib/pve-cluster
mkdir /var/lib/pve-cluster
```

cman startで止まるので
/etc/cluster/cluster.conf をザクザク編集

```bash:
service pve-cluster start
service cman start
service pvestatd start
service pvedaemon start
pvecm updatecerts
pvecm expected 1
```

これで治るかと思ったがだめだった。
RuboCop | Style/BracesAroundHashParameters EnforcedStyle

# RuboCop | Style/BracesAroundHashParameters EnforcedStyle

## 概要

RuboCopの「Style/BracesAroundHashParameters EnforcedStyle」警告について。

メソッドの最後の引数にハッシュを利用した際のブレースの有無をチェックします。
デフォルトではブレースありを有効とします。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|EnforcedStyle|braces|ブレースあり|○|
|EnforcedStyle|no_braces|ブレースなし|--|

## BracesAroundHashParameters EnforcedStyle

各設定値（braces, no_braces）での検証結果をまとめます。

### 検証プログラム

enforced_style.rb

~~~ruby
def some_method(options = {})
  print options
end

some_method({ key1: :value1, key2: :value2 })
some_method(key1: :value1, key2: :value2)
~~~

### 実行結果 braces の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
BracesAroundHashParameters:
  EnforcedStyle: braces
~~~


~~~bash
$ rubocop enforced_style.rb
Inspecting 1 file
C

Offenses:

enforced_style.rb:6:13: C: Missing curly braces around a hash parameter.
some_method(key1: :value1, key2: :value2)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 no_braces の場合

.rubocop.yml

~~~yaml
BracesAroundHashParameters:
  EnforcedStyle: no_braces
~~~

~~~bash
$ rubocop enforced_style.rb
Inspecting 1 file
C

Offenses:

enforced_style.rb:5:13: C: Redundant curly braces around a hash parameter.
some_method({ key1: :value1, key2: :value2 })
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

## 補足
この警告は `rubocop -a` で修正可能です。
proxmoxでDRBD試した

[公式wikiのdrbd](http://pve.proxmox.com/wiki/DRBD)の通りにやってできた。

# 注意点

* すでに/dev/sdbにLVMを作っている場合、vgreduceとかしないといけない。
  よくわからない場合はOS再インストールがよい。
* LVMだとkvmのみ格納できる。
    * mkfs.ext4 /dev/drbd0してmountすればOpenVzでも使える。
* HA構成でfailover時、drbdを組んでいないサーバに移ると起動できないので注意。

```diff:/etc/fstab
+/dev/drbd0 /srv ext4 noauto 0 0
```

* /dev/drbd0 と /var/lib/vz/images/ 間の移動は`Move disk`から可能。
  サイズが大きいので時間かかります。

![スクリーンショット 2014-06-20 18.43.34.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9a1ca2c9-500b-8c71-55b8-0410c1ac3112.png)


# セットアップ

```bash:
# apt-get install -y drbd8-utils
```

```bash:/etc/drbd.d/global_common.conf
global { usage-count no; }
common {
        syncer { rate 30M; verify-alg md5; }
        handlers { out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; }
}
```

```bash:/etc/drbd.d/r0.res
resource r0 {
        protocol C;
        startup {
                wfc-timeout  0;     # non-zero wfc-timeout can be dangerous (http://forum.proxmox.com/threads/3465-Is-it-safe-to-use-wfc-timeout-in-DRBD-configuration)
                degr-wfc-timeout 60;
                become-primary-on both;
        }
        net {
                cram-hmac-alg sha1;
                shared-secret "my-secret";
                allow-two-primaries;
                after-sb-0pri discard-zero-changes;
                after-sb-1pri discard-secondary;
                after-sb-2pri disconnect;
                #data-integrity-alg crc32c;     # has to be enabled only for test and disabled for production use (check man drbd.conf, section "NOTES ON DATA INTEGRITY")
        }
        on proxmox-97 {
                device /dev/drbd0;
                disk /dev/pve/pve-drbd;
                address 192.168.100.97:7788;
                meta-disk internal;
        }
        on proxmox-62 {
                device /dev/drbd0;
                disk /dev/sdc1;
                address 192.168.100.62:7788;
                meta-disk internal;
        }
	disk {
		# no-disk-barrier and no-disk-flushes should be applied only to systems with non-volatile (battery backed) controller caches.
		# Follow links for more information:
		# http://www.drbd.org/users-guide-8.3/s-throughput-tuning.html#s-tune-disable-barriers
		# http://www.drbd.org/users-guide/s-throughput-tuning.html#s-tune-disable-barriers
		no-disk-barrier;
		no-disk-flushes;
	}
}
```

```bash:リソースの初期化
# drbdadm create-md r0
md_offset 98213818368
al_offset 98213785600
bm_offset 98210787328

Found some data

 ==> This might destroy existing data! <==

Do you want to proceed?
[need to type 'yes' to confirm] yes

Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
```
vba、UTF-8・BOMなしでファイル出力

excelのシートのセルにあるデータを元に、utf-8、BOMなしファイルを出力するために実装したもの。

# こーど
```vbnet:
Public Function writeFile(in_filpth As String, in_buf As String) As Boolean
    writeFile = False
    On Error GoTo Err
    Dim st As New ADODB.Stream
    With st
        .Type = adTypeText
        .Charset = "UTF-8"
        .Open
        .WriteText in_buf
        .Position = 0
        .Type = adTypeBinary
        .Position = 3
        Dim buf As Variant
        buf = .Read()
        .Position = 0
        .Write buf
        .SetEOS
        .SaveToFile in_filpth, adSaveCreateOverWrite
    End With
    st.Close
    Set st = Nothing
    writeFile = True
Err:
    If Err.Number <> 0 Then
        Debug.Print　"writeFile(): " & Err.description
    End If
End Function
```
# こーどのせつめい
* ADODB.Streamを使用
* 始めにタイプadTypeText、Charset "UTF-8"で、ファイルに出力する内容を書き込む
* 次に、タイプをadTypeBinaryにして、BOMを飛ばして、書き込んだ内容を変数bufに設定する
* BOMを潰すために、Positionを0にして、変数bufの内容を書き戻す
* BOMを潰した分、後ろにゴミが残るので、SetEOSで取り除く
* SaveToFileでファイルに出力
OS Xをアップデートしたときに困ったこと覚え書き

## gcc
### 概要
MarvericksにアップデートしてC言語のプログラムをgccでコンパイルしようとしたら、stdio.hのファイルが見つかりませんみたいなエラーが出た
### 対処法
Xcodeのコマンドラインツールというものが勝手にアンインストールされてしまったのが問題らしい。ターミナルから下記のコマンドを実行して無事解決。

```
$ xcode-select --install
```

なおMarvericksからはXcodeのpreferenceからインストールできなくなったらしい。

## tuareg-mode
### 概要
ocamlをGNU Emacsのtuareg-modeを使って実行したりしてたのだが、こちらも以下のエラーが出てしまった。

```
M-x tuareg-ocaml
Cannot open load file: tuareg
```

### 対処法
ロードパスが通ってなかったことが原因。.emacsに以下のコードを書いて解決。(パスは環境毎に変わるけど)

```.emacs
(add-to-list 'load-path "~/tuareg-2.0.6/")
```

## まとめ
初OSアップデートで戸惑いが多かった。アップデートしたら設定をし直す必要があるんだね。
ビット演算 (WIP)


メモ中...

# 2 進数フラグ

| a | b  | c   | d    | e     | f      | g       | h        |
|--:|---:|----:|-----:|------:|-------:|--------:|---------:|
| 1 | 10 | 100 | 1000 | 10000 | 100000 | 1000000 | 10000000 |
| 1 | 2  | 4   | 8    | 16    | 32     | 64      | 128      |

例えば `a`, `c`, `e` のフラグが `true` である状態を表すと;

**2 進数**では;

```
10101 = 1 + 100 + 10000
```

**10 進数**では;

```
21 = 1 + 4 + 16
```

このように合計値からフラグの `true` 項目を知る事ができる。

## 10 進数から 2 進数を得る

```javascript
function curry2 (func) {
  return function (arg2) {
    return function (arg1) {
      return func.call(arg1, arg2);
    }
  }
}
```

```javascript
var parseDecimalToBinaryString = curry2(Number.prototype.toString)(2);
```

```javascript
parseDecimalToBinaryString(7);

// => '111'
```

## 2 進数から 10 進数を得る

```javascript
function curry2 (func) {
  return function (arg2) {
    return function (arg1) {
      return func(arg1, arg2);
    }
  }
}
```

```javascript
var parseBinaryString = curry2(parseInt)(2);
```

```javascript
parseBinaryString('111');

// => 7
```
[enchant.js]ajaxを利用してゲームスコアをファイルとかDBに保存する。

enchant.jsでゲームを作ってスコア集計してランキングにしたい場面とかあると思うので簡単に方法をメモします。

**利用するもの**
=================
・enchant.js
使用するゲームエンジン

・jQuery
enchant.jsにはajaxをサポートするものがないので別のライブラリを使うか自前でajaxを実装する必要があります。
一番楽なのでjQueryを使います。

・PHP
ファイルやDBへの書き込みを今回PHPを使って行います。

**やること**
=================
「Let's Ajax!」と書かれたラベルをクリックした時に現在のスコアがtxtファイルに保存されるようにする。txtファイルに書き込まれたのを確認できたらおｋ。

**実装**
=================

htmlの解説
--------------------------------------------------------

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>ajax</title>
<script src="http://code.jquery.com/jquery.js"></script>
<script src="enchant.js"></script>
<script src="testajax.js"></script>
</head>

<body>

</body>
</html>
```
jQueryとenchant.js本体とゲームファイルを読み込みます。(今回はtestajax.js)

ゲームファイルの解説(enchant.js + jQuery)
--------------------------------------------------------

```js:testajax.js
enchant();

window.onload = function(){

var core = new Core(320,320);
 
 

core.onload = function(){

var score = new Label();
score.text = 100;

var button = new Label();
button.text = "Lets Ajax!";
button.y = 100;

core.rootScene.addChild(score);
core.rootScene.addChild(button);


var action = function(){

 //ここにajax処理
$.ajax({
    type: "POST",
    url: "post.php",
    async: true, 
	data:"score="+score.text
  });
 
score.text -= 1;

}

//ボタンを押した時にscoreの値をPHPに送り付ける
button.addEventListener("touchstart",action);

 }//core.onload
 
 core.start();
	
}//window.onload
```

```js:
var score = new Label();
score.text = 100;
```
ゲームのスコアに相当する部分です。この数値がファイルに書き込まれるようにします。

```js:
var button = new Label();
button.text = "Lets Ajax!";
button.y = 100;
```
ajax発動用のボタン(ラベル)です。これをクリックした時にスコアをPHP側にPOSTするようにします。

```js:
var action = function(){

 //ここにajax処理
$.ajax({
    type: "POST",
    url: "post.php",
    async: true, 
	data:"score="+score.text
  });
 
score.text -= 1;

}
```
ajaxを利用してスコアをPHP側に送るイベントです。
ここでjQueryを利用しています。
scoreという変数名でscore.textの中身を送ります。
スコアの変動とクリック確認のためにクリックするたびにscore.textの中身が1づつ減算されていくようにしています。

```js:
button.addEventListener("touchstart",action);
```
buttonラベルがクリックされたときにactionイベントが実行されるようにします。

PHPの解説
--------------------------------------------------------
```php:post.php
<?PHP

/*
enchantからのscoreの値を取得しログファイルに保存する。
*/

//ajaxで取得した値
$score = $_POST["score"];

//書き込むログファイル名
$filename = "log.txt";

//書き込み
file_put_contents($filename,$score);
```
ゲームファイルから送られてきたscoreを変数scoreに格納しfile_put_contents関数をつかってlog.txtにスコアの書き込みを行います。

log.txtにスコアが書き込まれていれば成功です。確認用なので粗いです。
log.txtはスコアが書き込めるようにパーミッションの設定をおこなってください。


**あとがき**
=================
マークダウンとか細かい解説は追々編集していきます・・・。
いつの間にやら変わっていたSpring STS Update site

以前は、Spring STSのEclipse pluginのGroovy fpluginとGradle pluginのupdate siteのURLが別だったのが、いつの間にやら、下記ページの最後の方のupdate siteに統合されていた。

http://spring.io/tools/ggts/all

このupdate siteに切り替えると、Keplerでgroovy featureのJava8 supportが使えるようになる(それまでは競合して使えなかった)
高速なhtml / cssコーディングのコツ5選

# はじめに

私主観で書いていることは予めご了承ください。
私はタイピングがウルトラアメージング速いので、それが助けになっている場合もあります。

また、自動化などは昨今話題として頻繁に出てくるので、
そこにはフォーカスしません。
とにかく速く手を動かすコツを書きます。

あ、「お前だれだよ本当に速いのかよ」と勘ぐる方がいるかと思いますが、
スーパー速いです。

# まず列挙します

- emmetを使おう
- タイピングを速くしよう
- ショートカットキーを上手く使おう
- 知見を増やそう
- 時間を止めよう

そないな感じになっとります。

# じゃあ各項目について語りましょう

## emmetを使おう

大分表面的な話題になって本位ではないのですが、
これによってコーディングが速くなったのは紛れもない事実です。

4年ほど前、「zen coding」という名前で世に出た素晴らしい
仕組みなのですが、いつだかにemmetという名前に変わり、
機能も拡充されました。

出た当初は「コーディングが3倍速くなる」とか言われていましたが、
3倍はさすがにウソです。本当は5倍から8倍ぐらいです。

emmetについての詳しいことは、説明したくないのでどこかをご参照ください。
[これとか (Emmetを始めるのに、とりあえずこれだけ覚えておけば大丈夫)](http://leko.jp/archives/442)

### だがしかし

大変魅力的で抱かれても良いぐらいのemmetではありますが、
気を付けてほしいのは、全部の機能を使いこなせるからといって必ずや幸せにはなれなかったということです。(個人差はもちろんあるかもですが)

どういうことかと言うと、例えばemmetを使えば

``` html
div+div>p>span+em^^^bq
```

と書いて展開すると

``` html
<div></div>
<div>
    <p><span></span><em></em></p>
</div>
<blockquote></blockquote>
```

となりますね。
しかしですね。

これは本当にお得ですか?

私はひとつのタグにクラスを付けて展開をするなどの、
粒度を細かくした使い方しかしません。

全てを使おうとして、結局学習コストだけかかった経験があるから話しています。
ただ、一度使ってみて、どういうものかを実感するのは良いかもですね。

## タイピングを速くしよう

これは非常に単純明快ですね。もうこれ以上説明できない!
私は小学生のころからウルトラアメージング速かったので、
ブラインドタッチができない人の気持ちにはなれません。

昔から利用していた練習道具としては、[e-typing](http://www.e-typing.ne.jp)があります。

カルテを残せるし、レベルアップも目に見えやすいです。
おすすめです。

## ショートカットキーを上手く使おう

何事も、マウス操作が省ければ幸せになれます。(デザインは別と思っています)
ウィンドウの切り替えやページのリロード、
ディレクトリの移動、各ツールのショートカットなどなど。
Windowsだとメニューの項目にAlt+うんちゃらでフォーカスできるので、
これも非常に便利です。(Macは同等の機能がありません、ツールを使うなりコロ助なりしてください)

ショートカットについても、一個一個説明していたら大変なので、
下記をご参照ください。

### おすすめショートカットキーの紹介記事集

- [Macでの作業効率アップ！初心者が覚えておくべきMacショートカット42個](http://www.danshihack.com/2011/09/20/junp/mac_shortcut.html)
- [テキスト入力が死ぬほどはかどるMacショートカットキー15個](http://www.find-job.net/startup/mac-shortcut)
- [「ショートカットキー」が身につく覚え方](http://www.724685.com/weekly/qa090128.htm)
- [仕事でPCを使うなら、ショートカットは覚えろ！特にAltキーは使える！](http://tolitorey.com/archives/732)

2つめに至っては、死ぬほどなので、実践したら死にます。

## 知見を増やそう

これも見たままなのですが、重要な点が一点。
私が会社などで教育の際に口すっぱく言っていることがあります。

- できなかった事に対して、どんな課題点があるかを必ず見直す
- 次の作業で絶対に課題をクリアする
- 上手くできても無理矢理反省点を見付ける

人間、慢心すると成長しないもので、反省しつづける、成長に意欲のある人が
成長していきます。

漫然と仕事をして成長ができるなんて、そんなチートはありません。

この精神でコーディングに向き合ってきて、私は多くの知識を得ることができました。
これで上手くいかなかったらすみません。

でも一番書きたかったのはこれかもしれないです。

## 時間を止めよう

これも見たままです。必要な要素として

- スタープラチナ
- ザ・ワールド
- お酒

があります。
これがないと難しいですよね。

# 最後に

色々書きましたが、私もいつまでも勉強中の身で、
これからもっと速くなります。

素敵なコーダーの皆様にとって、成長の助けに少しでもなれればと思い、
今回の記事を書かせていただきました。

助けにならない場合もあります。
その場合は、あなたの方法を私にも教えていただけますと幸いです。

是非とも、よろしくお願いします。
Kinectプログラミングのための環境準備

とあるきっかけで、Kinectをさわる機会に恵まれました。
プログラミングを1から学びながら…になりますが、何か面白いことができればと。

というわけで、最初は環境準備から。
特に大変なことはなく、Windows7 SP1、.NET Framework 4.5の環境に、以下のものを一通りインストールしました。

・Visual Studio 2013
・Kinect for Windows SDK 1.7
・Kinect for Windows Developer Toolkit 1.7
・Kinect for Windows Language Packs v11.0

これらは全て、ここから入手することができます。
http://www.microsoft.com/en-us/kinectforwindowsdev/Downloads.aspx

他にも一般で公開されているライブラリが色々とあるそうですが、今後必要に応じて利用していこうと思います。

なお、Visual Studioに関して、自分の環境ではPremium版を使用していますが、無償で利用できるExpress版でも問題はない模様。

さて、これらのインストールが終わった後にKinect本体をUSBで接続すると自動でドライバーが用意され、利用可能になります。

これで最低限の準備は整ったはずです。

試しに、インストールしたKinect for Windows SDKに付属している「Developer Toolkit Browser」
を起動すると、いくつかのサンプルを動かしてみることができます。

まずはサンプルにあるような画像取得、深度情報取得、人体認識を自前でできるよう、コツコツ進めて行きたいと思います。
CentOS6でNTFSマウントする

外付けHDDをCentOSで使う際に、NTFSだったときのマウント方法

```console
# fdisk -l
ディスク /dev/sdx: ...
...

デバイス       ..........　　　　システム
/dev/sdx1    ..........   HPFS/NTFS
```

標準ではNTFSサポートしてないのねー。


```console
# mount -t ntfs /dev/sdx1 /mnt/usb
mount: 未知のファイルシステムタイプ 'ntfs'
```

NTFSサポートはepelリポジトリ内のパッケージにあるので、epelリポジトリを有効にする。

```console
# rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

[ntfs-3g](http://www.tuxera.com/community/ntfs-3g-download/)をインストール。


```console
# yum -y install ntfs-3g
```

あとは普通にマウント

```console
# mount -f ntfs /dev/sdx1 /mnt/usb
The disk contains an unclean file system (0, 0).
The file system wasn't safely closed on Windows. Fixing.
```

↑正規の手順でアンマウントしてなかったからでしょうか、特に問題なく中身が見えたのでOKです。
SwiftではCGColorSpaceReleaseなどを手動で呼んではいけない


※ちょっと自信ありません。

Objective-CのソースからCoreGraphics系の処理を移植したら、関数を抜けるタイミングで何故か`EXC_BAD_ACCESS`が発生したのですが、どうやら手動で`CGPathRelease`や`CGColorSpaceRelease`などを呼んでいた部分が原因のようです。

どういうカラクリかはちょっと判りませんが、SwiftではCF Objectsは勝手にReleaseされるようになったようですね。
（`CGPath`の`deinit`でreleaseしてるとかそんな感じなのかな？）

参考：

* http://stackoverflow.com/questions/24176481/cannot-release-path-created-by-cgpathcreatemutable-in-swift
* WWDC video Swift Interoperability In Depth の50分あたりから
地図系ウェブサービスの（PC向け）UIまとめ


地図系のサービスと言えばモバイルアプリというイメージがありますが、今回はPC向けのデザインを見ていきます。全て画面遷移させて見ていくのは時間がかかってしまうので、マップ画面のみを観察してみました。

# Google Map

![google_map.jpg](https://qiita-image-store.s3.amazonaws.com/0/11316/5615abaf-680b-6167-05c6-f5882edb81cb.jpeg "google_map.jpg")

Google Mapは検索が最重要機能という印象。左上に検索バーがあり、ページを読み込んだタイミングでフォーカスが当てられる。

右下にいくつかボタンっぽいものがある。何かが開きそうなボタンを押すと、何か開いた。

![google_map_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/11316/df28f5ac-7093-dc0d-d628-469d5b04ded5.jpeg "google_map_1.jpg")

表示している地域の周辺のストリートビュー画像が出てきた。これにカーソルを合わせると、その画像とマップ上のスポットが線で結ばれる。これはわかりやすい。

あと、人っぽいアイコンを地図上に落とすことができる。何かで見たことあったけど、自分でやってみたの初めてだったので感動した。

![google_map_explore](http://i.gyazo.com/f3e7922040e101c4c2fc48bafdc6ffe6.gif)

うわー、すごい。直感的で良い。ストリートビューはちょろっと真似できるものではないけど、人のアイコンをドラッグしてるときのぶらーんと揺れる感じとかも細かくて素晴らしい。

まとめると、左上に検索バー、右下に機能ボタン、下からタブが現れてストリートビュー画像が表示出来て、さらに人も落とせる。というUIだった。

# Foursquare

老舗ロケーションサービス。

![Foursquare-navi](http://i.gyazo.com/c707faafd66c27582aad6b9b2a6e3f22.gif)

ウィンドウの左半分が文字情報、右半分が地図。

使う流れは「検索 -> 表示 -> 口コミを閲覧」という感じ。
文字情報にカーソルを合わせると、マップ上にポップアップが現れてとてもわかりやすい。

Google Mapは地図そのものだったけど、Foursquareは地図よりも口コミ情報に重きが置かれている印象を受けた。というかそういうサービスなんだから当たり前か。画面に占める地図の割合が丁度いいと感じた。

# ロケタッチ

かわいらしい。

![loc_touch.jpg](https://qiita-image-store.s3.amazonaws.com/0/11316/7f3f9886-1758-94b3-0f63-69d0a03ae87c.jpeg "loc_touch.jpg")

雰囲気は違うけど、ユースケースはFoursquareと一緒っぽい。
左サイドバーに文字情報、右に地図。Foursquareよりも若干、地図が大きい。

# Blogopolis

![blogpolis.jpg](https://qiita-image-store.s3.amazonaws.com/0/11316/98e0fad7-1976-6648-96aa-abc94ae3d205.jpeg "blogpolis.jpg")

http://blogopolis.jp/

ロケーションサービスでは無いけど、地図っぽいUIなので。Smartnewsの方が2009年ごろに作ったらしい。

ブログに対してはてなブックマーク数などに応じた領地が割り振られ、記事が見つけられる。現在は検索やペインター機能は停止している。

http://d.hatena.ne.jp/kaiseh/20090827/1251406675

![](http://i.gyazo.com/3f0ac3c5b4cb75ecbb6fe2be2a720899.gif)

領地をクリックすると下部に記事の情報が出てくる。

# まとめ

地図系のウェブサービスはとにかく直感的にした方が良さげです。ボタンをクリックして処理が始まるみたいな使い勝手よりかは、地図上に自分がいるような感覚からスタート出来た方がいい。

あとは、文字情報がどれくらい重要なのかによって、UIも変わってくるのかなーと感じました。

とりあえず記事を公開していますが、ちょっとサンプルが少ないので、「こんなサービスあるよー」というのがあれば教えてください。
画像がhover時に1px程度広がってしまう現象の対処方

下記のような状態の時にhoverすると、
chromeで画像が1px程度大きくなり、動いて見えることがある。

・画像の幅を%指定にしている
・hover時にopacity設定をしている

このとき、下記スタイルを画像に指定するとなおる。

`-webkit-backface-visibility: hidden;`
■phpMyAdmin設定

#公式サイトからダウンロードして設置。

```
# cd /opt/httpdocs/
# yum install unzip
# unzip phpMyAdmin-4.2.0-english.zip
# mv phpMyAdmin-4.2.0-english phpmyadmincd 
# chown -R オーナ:グループ phpMyAdmin
```

```
$cfg['blowfish_secret'] = 'midas'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
$cfg['Servers'][$i]['extension'] = 'mysqli’;
```

```
PMA Database ... NG [ ドキュメント ]
```


```
mysql に root でログイン
```

```
MariaDB [(none)]> source /(略)/phpmyadmin/examples/create_tables.sql
MariaDB [(none)]> use phpmyadmin;
```

```
MariaDB [phpmyadmin]> show tables;
MariaDB [phpmyadmin]>  GRANT ALL ON phpmyadmin.* TO pma@localhost IDENTIFIED BY "パスワード";
```



###config.inc.php の以下コメントアウトをはずし

```
/* User used to manipulate with storage */
$cfg['Servers'][$i]['controlhost'] = '';
$cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'pma';
/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
/* Contrib / Swekey authentication */
$cfg['Servers'][$i]['auth_swekey_config'] = '/etc/swekey-pma.conf';
```

#yumアップデート等で動かなければ

```
chmod 777 /var/lib/php/session
```
■さくらのVPS基本設定


▼さくらのVPSにSSHで接続します。
$ ssh root@[IPアドレス]

▼システムを最新の状態に。
# yum update

▼日本語化
# vim /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"

▼作業用ユーザ作成
# useradd [作業用ユーザー名]
作業用ユーザのパスワードを設定
# passwd [作業用ユーザー名]
wheelグループに追加
# usermod -G wheel [作業用ユーザー名]
wheelグループのユーザーがsudoコマンドを使えるように設定
# visudo
#%wheel ALL=(ALL) ALLという文を探し、コメントアウトを解除
%wheel ALL=(ALL) ALL
scp 
クライアント側（自分のパソコン）に戻り、作成したユーザーでログインできるか確認
$ ssh [ユーザー名]@[IPアドレス]

▼鍵認証を設定
☆さくらVPSのホームディレクトリに鍵の保管場所
$ pwd
/home/[ユーザー名]
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

★クライアント側（自分のパソコン）での作業
鍵のペアを生成（秘密鍵、公開鍵）
> ssh-keygen -t rsa -v
質問にはすべてエンターキーでOK

公開鍵のパーミッションを変更
> chmod 600 ~/.ssh/id_rsa.pub

scpコマンドで公開鍵をauthorized_keysというファイル名でさくらのVPS側に転送
> scp ~/.ssh/id_rsa.pub [ユーザー名]@[アドレス]:~/.ssh/authorized_keys

☆さくらVPS
公開鍵がきちんと転送できているか確認
$ ls -la .ssh

★クライアント側
公開鍵でログインできるかを確認
> ssh -i ~/.ssh/id_rsa [ユーザー名]@[IPアドレス]
パスワードを聞かれずにログインできれば成功！

▼SSHの設定
設定ファイルをバックアップ
# cp /etc/ssh/{sshd_config,sshd_config.bk}

編集
#vim /etc/ssh/sshd_config
# ポート番号をデフォルトから変更[設定範囲：22 - 65535]
Port 10022
# パスワードログインの禁止
PasswordAuthentication no
# rootログインの禁止
PermitRootLogin no

設定を反映
# service sshd restart

★クライアント側
ログインできるかを確認
> ssh -p [ポート番号] [ユーザー名]@[IPアドレス]

▼ファイアーウォールを設定
iptablesファイルを作成
# vim /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

設定を反映する
＃ service iptables start

設定を確認する
# iptables -L

自動起動の設定を確認
$ chkconfig iptables --list
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off

”3:off”という表示だった場合、自動で起動するように設定
# chkconfig iptables on
おみくじプログラムの改造

次のレッスンの[JavaScriptで作るスロットマシーン (全7回)](http://dotinstall.com/lessons/slot_js_v2)に挑戦したのだがレベルが急に上がっていて、ほとんど理解できなかった。ここは一度、最初のレッスンに戻ってみる。どうやらプログラミングは既存のプログラムを改造する経験を積むことでもスキルが上がるらしいので、自分なりにチャレンジしてみた。

#おみくじプログラムの改造
配列の中身を増やすだけでは芸がないので、いくつか変えてみたい。
##修正、追加する機能
+ ランダムで生成される要素をおみくじとは別に、おみくじに対応するコメントも追加する
+ おみくじ表示を画像にする

日頃からQiitaで活動されているプログラマーの方々には呼吸するくらい簡単なことかもしれませんが、この2つには苦しめられました。現在進行形です。

##技術がともなってなかった
[JavaScriptでつくるおみくじ](http://codeprep.jp/ja/editor?id=9&chapter=43&section=295)を参考にすれば作れるかと思ったのだが、そのレッスンではランダムで作成される要素同士は連携しておらず、それぞれがランダムで表示されるため参考にはならなかった。要素A（おみくじ）と要素B（対応するコメント）を連携させるにはどうすればいいのか。要素Aの結果を要素Bに監視させればいいような気がするが、具体的にどうすればいいのか発想がない。とりあえずスルー。

##画像の表示はどうするの？
とりあえずローカルでテスト。ボタンを押しても何も表示されない。おかしい。どうやら``<p>``タグにidを振っても表示されないようだ。そこでデフォルトとして``<img>``を置いてみる。動いた。しかし、パスがそのまま表示されてしまう。画像を置き換えるにはどうすればいいのかわからないのでググる。どうやら``document.getElementById('xxx').src``と書けばいいらしい。``innerHTML``だと文字列という認識になるのだろうか。ひとまず壁を乗り越えた。脳みそをフル回転させているので頭がボーっとしてくる。だが、まだまだ道のりは長かった。

``<p>``にidを振るのをやめ初期値として画像を置いてidを振った。
``<div class="stage">
<p class="result_img"><img src="http://xxx" id="result"></p>
</div>``

##GIFアニメのループの問題
画像をぽんと置いてもつまらないのでGIFアニメを作り、それを表示させることにしたのだがループが止まらない。調べてみると、どうやらGIFアニメを作る段階で設定するらしい。しかし、どんなに目をこらしてもそんな設定はない。これはソフトの問題なので仕方がない。次へ進もう。

##JavaScriptを動かす場所と画像置き場
Qiitaではソースは書けても動かすことができないので無料で使える[WordPress](https://wordpress.com/)を利用することにした。しかし通常、WordPressではJavaScriptを動かすことはできないらしい。そこでプラグインを導入しようと考えたのだがWordPress.comではプラグインの利用が不可だった。途方に暮れていると[jsdo.it](http://jsdo.it/)を見つけた。ここならば、煩わしい作業もないだろうと思っていたのだが画像をアップロードする場面で問題が起きた。どうやら容量に1M程度の制限があるらしい。GIFアニメは1つ1.5Mほどあるので、ここも断念。早くJavaScriptの勉強がしたいのに、なぜ関係ない部分で苦労しているのか笑ってしまう。すると同じようなサービスで[jsbin](http://jsbin.com/)を見つけた。しかし今度は画像のアップロードそのものができない。

こういう使い方はNGなのかもしれないが、とりあえずWordPress.comに画像をアップロードしておいてjsbinから参照させてみた。先輩方はいったいどうやっているのだろうか。満身創痍でプログラムの動作を確認。今日は疲れたのでここまでで終了。

##問題点
###要素Aと要素Bの連携
お互いをランダムで表示させては連携が取れないので要素Aに対してだけランダム作成をさせ要素Bはそこにくっつけたい。そんなことができるのだろうか。せっかく思いついた機能なので実現させたいが、どうすればいいのかアイデア全く浮かばない。

###ボタンを押すたびにJavaScriptが動いてしまう
一度押したらページをリロードしないと動かないようにしたい。何度もクリックできてしまうのは格好悪い。更に言うと占いなので1日に1回だけ動かせるようにしたい。IPアドレスが変わったら、うんたらかんたらというところまで掘り下げるつもりはないが可能ならば実現させたい。今は手も足も。

##総評
疲れた。プログラミングは本当に難しい。仕事で使う脳みそとは全く違う部分を使っている気がする。だけど、これが超楽しい。ああしたい、こうしたいというアイデアを考え、動かないプログラムに四苦八苦させられ、それを乗り越えて動いたときの喜び。積み木のおもちゃで遊んでた子供の頃を思い出した。

今回、挑戦したプログラムは下にあります。GIFアニメのため、ボタンを押すと一瞬読み込みます。気長に待ってください。

##リンク
[未完成の占いプログラム](http://jsbin.com/zudagume/3)
Android標準ブラウザで要素をタップしたときに出る枠を消す

備忘録。
Android標準ブラウザで要素をタップしたときに出る謎の枠を消すためのSASS。

```sass
body {
   -webkit-tap-highlight-color: rgba(0,0,0,0);
}
```

これでタップしても白い枠が出なくなる。
【備忘録】AppController.mm の openURL が呼ばれない！！！

####openURLが呼ばれる条件
* didFinishLaunchingWithOptionsの返りがYES
* アプリ起動中にURLスキームによる起動を行った時

####今回やりたかったこと
* URLスキームのQueryを取得してAPIの引数にしたい

####やった事

```objc:AppController.mm

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
//
          なんかテキトウな処理があるはず
//

    if ((launchOptions != nil) && ([launchOptions valueForKey:UIApplicationLaunchOptionsURLKey] != nil)) {
        // launchOptionsからNSURLの取得
        NSURL *clickedURL = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];

        // NSURLがとれるのでopenURLでやりたかった事をこの辺でやる。今回はNSURLからqueryを取得してuserdefaultsに保存
        NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
        [ud setObject:[clickedURL query] forKey:@"Query"];
        [ud synchronize];

        return YES;
    } else {
        return NO;
    }
}
```
【Unity】terrainを繰り返して、無限に続く地面を作る


Run系のゲームとかを作るにあたり、無限に続く地面を作りたくなりました。
そこで2つの地面を繰り返し表示することで、無限に地面が続くようにしてみました。

##地面の準備

まずは地面と、目印のCubeを作ります。

GameObject > Create Other > Terrain
で地面を追加します。お好みで適当にテクスチャを貼り付けて下さい。

GameObject > Create Other > Cube
で目印のCubeを追加します。
Cubeの設定は以下のようにして、Terrainの真ん中に置きました。

![kobito.1403248293.177540.png](https://qiita-image-store.s3.amazonaws.com/0/29775/0389da56-ba19-ef0c-9f7e-eff59b6eb137.png "kobito.1403248293.177540.png")

Terrainを動かすために以下のようなスクリプトをTerrainにアタッチしておきます。

```cs:MoveTerrain.cs

using UnityEngine;
using System.Collections;

public class MoveTerrain : MonoBehaviour {
	public float speed;

	// Update is called once per frame
	void Update () {
		transform.Translate (0, 0, speed);
	}
}

```

CubeはTerrainと連動して動くようにTerrainの配下にドラッグしておきます。
そしてそのTerrainは、再利用しやすいようにプレファブ化しておきます。

![kobito.1403248446.611057.png](https://qiita-image-store.s3.amazonaws.com/0/29775/d3585618-fec5-d48f-4f23-18794eb396f9.png "kobito.1403248446.611057.png")


##地面の配置
プレファブ化したら元のTerrainは削除して、
Terrainプレファブを2つドラッグして設置します。
座標は(0, 0, 0)と(0, 0, 2000)にしてｚ方向に2つ並べます。

![kobito.1403249501.880606.png](https://qiita-image-store.s3.amazonaws.com/0/29775/4a132c95-af67-7bc9-fc3b-622199f603b5.png "kobito.1403249501.880606.png")


MainCameraの位置を(1000, 30, 0)あたりに置いて、実行してみます。

2つの地面がスクロールしてきますが、2つめが過ぎ去ったら終わっちゃいます。

##繰り返し処理の実装
1つめのTerrainが画面外に過ぎ去ったら、2つ目の奥にサッと移動させる、、、
という処理を繰り返すことで、地面が無限に繰り返されるようにします。

先ほどのスクリプトを以下のように変更します。

```cs:MoveTerrain.cs
public class MoveTerrain : MonoBehaviour {

	public float speed;
	float size = 2000;  //NOTE!

	// Update is called once per frame
	void Update () {
		transform.Translate (0, 0, speed);

		if (this.transform.position.z + size < 0) {
			Debug.Log("out of display");
			this.transform.Translate(0, 0, size * 2);
		}
	}
}

```

注）``` float size = 2000;  ``` terrainのサイズ、スクリプトで取得できる？？誰か教えてください ><

実行してみると地面が無限に繰り返されるはずです。
Atomで快適な生活を送る方法

以下自分用のメモを兼ねて書いておきます。お気に入りの設定が見つかり次第追記していきます。

# Atomとは
AtomはGitHubで開発されているエディタです。どうやらChromiumベースらしく、編集画面はWebページとしてレンダリングされているらしい。

# ソフトタブを使う
タブにはハードタブとソフトタブがあります。ハードタブは通常のタブでソフトタブはスペースを複数入れることでタブの代わりとするものです。僕はソフトタブ派なのでまずソフトタブにします。ちなみにソフトタブ/ハードタブの設定は下のEditorConfigを使うことでも設定できます。EditorConfigを使えば言語ごとにソフト/ハードの設定ができるので、EditorConfigを使う人はわざわざAtomの設定を変える必要はないかもしれません。

設定は環境設定を開き、(Macなら`⌘`+`,`)下の方にある`Soft Tabs`のチェックボックスをチェックするだけです。確か再起動しないと設定が反映されないので再起動してください。ソフトタブが有効になっているはずです。ですがハードタブで書かれたファイルを開くとハードタブの文章だと認識してくれるらしくハードタブになってしまいます。ハードタブ/ソフトタブの変換をしてくれるパッケージで全てソフトタブにするとその後はソフトタブで入力できます。

# Soft Wrapなど…
`Soft Tabs`の下に`Soft Wrap`などの項目があります。`Soft Wrap`はウィンドウの幅が1行の文字列よりも短くなった時に折り返してくれる機能です。Webページでは閲覧する人の環境に合わせて1行の文字数を自動で変えてくれますがまさにそれです。
`Soft Wrap`をオンにしたらAtomを再起動してください。長い行を打ってからウィンドウの幅を短くすると折り返して表示してくれるはずです(折り返されて1行が複数行になりますがあくまで見た目だけであってテキストファイルとしては1行のままです)。
`Soft Wrap At Preferred Line Length`は1行が指定した文字数に達するとそこでSoft Wrapしてくれる機能です。文字数の指定は上の方に`Preferred Line Length`というフィールドがあります。初期値は80のようです。
`Show Indent Guide`はタブがいくつ入っているかを教えてくれる機能です。オンにするとタブとタブの間に`|`(縦線)が入るのでタブ幅2のタブが2つなのかタブ幅4のタブが1つなのかがわかるというわけです。
`Show Invisibles`はスペースやタブ、改行などの文字としては見えない制御コードを記号として表示してくれます。
`Show Line Numbers`はもちろん行番号の表示設定です。

# EditorConfigを使う
EditorConfigはあらゆるエディタで共通のコーディングスタイルを提供してくれる素晴らしいプラグインです。
>[EditorConfig](http://editorconfig.org)

これは本来プロジェクトに自分の設定を付けて、それを他の環境や他の人が開いた時に同じように表示されることを目的としているっぽいですが、うまく使えばAtomのコーティングスタイルの設定に使えます。
EditorConfigは開いたファイルのディレクトリとそれより上のディレクトリにEditorConfigの設定ファイルがあるかどうかを探し、一番上層にある設定ファイルの設定が適用されるようです。または設定ファイルに` root=true` が書いてあるとそこで捜索を中止するようです。
そこで、ホームディレクトリに` root=true` が書いてある設定ファイルを置いておけばホームディレクトリ以下にあるファイル全てに設定が適用されるので実質エディタの設定になります。.bash_profile的な感じですかね。

## EditorConfigのインストール
Atomで設定を開いてパッケージからEditorConfigで設定をかければでてきます。

## EditorConfigの設定ファイル
設定ファイルは`.editorconfig`というファイル名です。設定の書き方は調べてください。
一応ページに載っているサンプルを引用しておきます。

```
# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# 4 space indentation
[*.py]
indent_style = space
indent_size = 4

# Tab indentation (no size specified)
[*.js]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2
```
SINGLE_TOPで起動したAcitivityでgetIntentしてもセットした情報が取り出せない

`FLAG_ACTIVITY_SINGLE_TOP`のフラグを付けて`startActivity`で起動すると、スタック最上位でActivityを起動している場合は新しいインスタンスを作らないようにできますが、起動後のActivityで`getIntent`してintentの情報を取り出そうとしても、セットしたはずの情報が取り出せません。

***

```java:A_Activity.java
@Override
protected void onResume() {
  Intent intent = getIntent();
  intent.getStringExtra(...);   // ②
}
```
```java:B_Acitvity.java
button.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
    Intent intent = new Intent(this, A_Activity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    intent.putExtra(...);   // ①
    startActivity(intent);
    finish();
  }
}
```
※ A_Activity→B_Activity→A_Activity と呼び出されたとき、①でセットした値が②で取り出せない

***

この場合、`onNewIntent`メソッドを使えばセットした情報を取り出すことができます。
参考：[Activity#onNewIntent](http://developer.android.com/reference/android/app/Activity.html#onNewIntent%28android.content.Intent%29)

```java:A_Acitivity.java
@Override
protected void onNewIntent(Intent intent) {
  intent.getStringExtra(...);   // セットした値が取り出せる
}
```

Activityの`launchMode`に`singleTop`、`singleTask`、`singleInstance`を指定した場合も同様だそうです。

こちらの情報を参考にさせていただきました：http://into.cocolog-nifty.com/pulog/2011/12/android048onnew.html