OmniAICreator/Qiita-1.07M huggingface dataset:
R で BigQuery に接続する

~~https://github.com/hadley/bigrquery を利用します~~
https://github.com/rstats-db/bigrquery に移動しているのでこちらを使用しましょう．

```R
install.packages('httpuv')
install.packages('devtools')
devtools::install_github("rstats-db/bigrquery") # devtools::install_github("hadley/bigrquery")
library(bigrquery)
```

## Google 認証

`httpuv` を併用することで，以下のようにクエリを打つと

```R
query_exec(project = 'twitter2bigquery', 'SELECT COUNT(*) FROM [twitter.timeline];' )
```
一旦ブラウザが立ち上がり Google の認証/認可を行います．
完了すると，ブラウザに `Authentication complete. Please close this page and return to R.` と表示されるので，コンソールに戻ります．

再度クエリを実行すると，

![5da932371095cfb1bd7d841cd80a59d2.png](https://qiita-image-store.s3.amazonaws.com/0/8597/7344fabc-da62-b7c9-b355-645d75e3c723.png)

ちゃんと結果が返ってきています．

## 結果を利用する

http://qiita.com/ckazu/items/d166757ed664ca622ecc のように，BigQuery からのクエリ結果を地図にプロットさせてみます．

ちなみに， http://kototech.i-studio.co.jp/212/ を参考に Twitter Streaming API から BigQuery 流しているデータを使用します．

`query_exec` の結果は dataframe となりますが，値は string なので，座標をすべて数値に変換しておきます．

```r
locations <- query_exec(project = 'twitter2bigquery', 'SELECT geo_coordinates_0 AS lat, geo_coordinates_1 AS lon FROM [twitter.timeline] WHERE geo_coordinates_0 IS NOT NULL;' )
locations <- transform(locations, lat=as.numeric(lat), lon=as.numeric(lon))
```

![c39d6c135acc157982a0d0ce27698279.png](https://qiita-image-store.s3.amazonaws.com/0/8597/b1c47658-3180-599d-d59d-854a31960411.png)

このようなデータが取得できているのでプロットします．

```r
library(ggmap)
center <- geocode('kanazawa')
map <- get_map(c(center$lon, center$lat), zoom = 5, maptype = 'roadmap')
ggmap(map) + geom_point(data = locations, aes(x = lon, y = lat), color = 'red', size = 1)
```

![afc6e30fee1b34942814d04350dd7db4.png](https://qiita-image-store.s3.amazonaws.com/0/8597/42523fa4-959c-c00f-58a5-6f6c3ad5ea34.png)

できました
SynergyでWindowsからMacを操作してみてうまくいかない



MacとWindowsを並べて作業することになったのですが、どちらのマシンを触っていても、ついついキーボードに手が伸びてしまう…

ということで、一つのキーボードとマウスを二台のマシンで使いまわすため、[Synergy](http://synergy-project.org/)を導入してみることにしました。
多少使えるようになるまでも引っかかるポイントが多いです。
そしてまだまともに使えていませんorz

# 実現したいこと

- キーボードとマウスの共有
	- できればシームレスにやりたい

# 環境

- サーバ
	- デスクトップ機
		- ここにキーボードとマウスを繋ぐ
		- キーボードもマウスもWindows用 (FILCOのMajestouchとDellのPC付属マウス)
	- Windows 7 (64bit)
- クライアント
	- MacBook Pro
	- Mac OS X 10.9.5

# 手順
## サーバ側

### インストール

Windows版のSynergyをインストールします。
今回は[Nightly Build](http://synergy-project.org/nightly/)から、バージョン1.6.1をダウンロードしてインストールしました。

### 設定
"Server"にチェックを入れてサーバモードのにした後、
"Configure Server..."から新しいスクリーンを追加します。
（追加したスクリーンが後からつなぐクライアントになります）
Macをつなぐので、スクリーン名はとりあえず"Mac"としました。

追加せずにクライアントから接続を試みると、接続に失敗するので注意。
場合によってはAliasの設定も必要かもです。

お好みで、クライアントの`super`と`alt`を入れ替えます。
この設定をしておくと、共有したいキーボードの`Alt`キーが`Command`キーに、`Windows`(田)キーが`option`キーになるので、Macのキー配列に近くなります。

```
section: screens
	Mac:
		alt = super
		super = alt
```
## クライアント側
### インストール

Mac用の[SynergyKM](http://synergykm.com/)をインストールします。
バージョン1.0.2がリリースされていたので、これを使うことにしました。

インストールする際は、 _Install Synergy for all users_ にしておくのが良いらしいです。

### 設定

"システム環境設定"に"SynergyKM"という項目が増えているので、そこから設定を行います。

クライアントにするので、`Connect to a shared keyboard and mouse`を選択。
`Connect to:`にはサーバー機のIPアドレスをいれます。
`Your Screen Name:`は"Mac"（サーバ側で設定したスクリーン名）にします。

Apply nowを押したら、あとは機能をONにするだけ。

## 結果

マウスはばっちり使えています。
左右クリック、ホイールスクロール、ホイールクリックが正常に使えていますし、タイムラグも全く感じません。

クリップボード共有機能が地味に便利で、URLのコピーなどをしたいときにとても役立っています。

しかし、キーボード周りで以下のような問題が続出。
一番使いたいのはキーボードだというのに…

# 様々な問題（全部未解決）

## クライアントでキーボードが効かない
`Ctrl`や`Shift`など一部のキーのみ効くという面白おかしい状態に。

[こちらの回答](http://superuser.com/questions/751512/key-is-not-on-keyboard-with-windows-server-and-mac-client)を元に、以下の作業を行ったところ、とりあえず動いています。

1. USキーボード以外の入力ソースを全部削除
2. 再起動
3. 入力ソースを元に戻す

この後再起動してないので、再起動後にどう転ぶかが不安ですが。


## 記号の入り方がおかしい
さて、上の問題がどうにかなっても、どうもEnterキー周辺の記号入力がおかしい。
`:`を打っても`;`しか入らないし、`@`を打つと`6`が入る。ｲﾐﾜｶﾝﾅｲ!!

記号類がきちんと入らないと、プログラムを書くのに差し障る…というかもはやまともに書けません。
これは困る。

どうやらUSキーボードとJISキーボードでボタンのコードが異なるのが原因らしいのですが…
どなたか、良い修正方法をご存知でしたらお教え下さい。

## "無変換" "変換"キーが効かない
[どうやらソースをいじればどうにかなるらしい](http://d.hatena.ne.jp/ApplePedlar/20080828/1219941651)のですが、開発環境を整えるのが大変なので、ひとまずは放置。

困るのが入力ソースの切り替え。
とりあえずは`Cmd + Space`でしのいでいます。
both deleted

git でバイナリファイルをmergeしたときに、conflictの解消に悩んだので、メモ。

both deleted:
``` git rm path/to/file```

both modified:
``` git checkout --(ours|theirs) path/to/file```

added by them:
added by us:
 必要な方を ```git checkout --(ours|theirs) path/to/file```
 いらない方を ```git rm path/to/file```

最後に
```git add path/to/file```
```git commit```
Java:整数の桁数の求め方


Androidで使おうと思ってすぐに分からなかったのでメモです。
すごく適当なので、間違いとか勘違いはご指摘いただければと思います。

* 参考

http://hack.aipo.com/archives/4178/
http://d.hatena.ne.jp/kameid/20090313/1236957906


1. BigDecimal.precision()

2. String.length()

3. Math.log10()

4. Integer.stringSize


>

#BigDecimal
	BigDecimal.valueOf(x).precision();

#String
	String.valueOf(x).length();

#Mathのlog10
	Math.log10(x) + 1;

#Integer
IntegerのtoStringで使ってるらしいですが、今は違うかも知れません（調べていなくてすみません）
定数と比較してたんですね。

    final static int[] sizeTable = {
            9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE
    };

    // Requires positive x
    static int stringSize(int x) {
        for (int i = 0;; i++)
            if (x <= sizeTable[i])
                return i + 1;
    }

	int digit = stringSize(x);


#まとめ
どの方法でもあまり変わらないかと思いますが、コストはBigDecimalとStringを使う方法は毎回インスタンスを作るようなので、繰り返し違う値を求める場合はMathを使った方法がいいかもしれません。
GradleでMultiple dex files define


Android Studioにて、build.gradleに書いてライブラリを読み込むとき、複数プロジェクトで同じlibraryを参照しているとmultiple dexと警告が出ます。

本当はmavenなどにあげてどのライブラリからも常に最新のものを参照すればいいと思いますが、とりあえず試したいときは無視してしまいます。

dependenciesにexcludeでライブラリのmoduleロードの部分だけ除外してしまえば回避できます。
compile project(){}からexcludeを呼べないのが、ちょっとわからなかったです。


	dependencies {
		// mavenなどのlibraryロードの時
		compile('com.actionbarsherlock:actionbarsherlock:4.4.0') {
      		exclude module: 'support-v4'
    	}
		// ローカルモジュールのロードの時
    	compile (project(':actionbarsherlock')) {
       		exclude module: 'support-v4'
    	}
	}


- http://qiita.com/akiramuramatsu/items/aa58f72af4c5271febfd
- http://stackoverflow.com/questions/20989317/multiple-dex-files-define-landroid-support-v4-accessibilityservice-accessibility
- http://stackoverflow.com/questions/23172458/unsupported-gradle-dsl-method-found-exclude
Arch Linux で lilyterm を使う(ボツ)

この文章は素人が書いたものであり、間違いが含まれているかもしれないので留意してほしい。また、ボツの理由は後述する。

## about

lilyterm とは、軽量かつ多機能が謳い文句のターミナルエミュレータ。

libvte を使用(X 向けのターミナルエミュレータウィジェット。gnome-terminal などで使われている)。

開発元は

- [Home - LilyTerm](http://lilyterm.luna.com.tw/)
- [Tetralet/LilyTerm · GitHub](https://github.com/Tetralet/LilyTerm)

## install

Arch Linux の公式パッケージを導入する。

```console
$ sudo pacman -S lilyterm
```

## config

雛形をコピーし、既定の値を上書きする形で設定すると楽。設定できる箇所は非常に多い。

```console
$ cp /etc/lilyterm.conf ~/.config/lilyterm/default.conf
```

以下、最小限の設定。

ロケールの設定

```text
default_locale = "ja_JP.UTF-8"
```

lilyterm の起動時に任意のコマンドを走らせる際など、確認のダイアログが一々表示されて鬱陶しい。vim などのよく使うコマンドをホワイトリストへ追加しておく。

```text
execute_command_whitelist = vi vim
```

スクロールバーは非表示に

```text
show_scroll_bar = 0
```

## keybind

vim や zsh とバッティングするので一旦全て無効に。タブ機能やコピー&ペーストなどを使わなければ再設定は不要かも。

## theme

solarized 化する。

[dotfiles/default.conf at master · blueyed/dotfiles · GitHub](https://github.com/blueyed/dotfiles/blob/master/config/lilyterm/default.conf) より

```diff
diff --git lilyterm/default.conf lilyterm/default.conf
index d975269..03e477c 100644
--- lilyterm/default.conf
+++ lilyterm/default.conf
@@ -89,15 +89,15 @@ show_color_selection_menu = 1
 
 # The normal text color used in vte terminal.
 # You may use black, #000000 or #000000000000 here.
-foreground_color = white
+foreground_color = #838394949696
 
 # Sets the background color for text which is under the cursor.
 # You may use black, #000000 or #000000000000 here.
-cursor_color = cyan
+cursor_color = #5555b5b5e7e7
 
 # The background color used in vte terminal.
 # You may use black, #000000 or #000000000000 here.
-background_color = black
+background_color = #00002b2b3636
 
 # Shows [Increase window size], [Decrease window size],
 # [Reset to default font/size] and [Reset to system font/size]
@@ -466,7 +466,7 @@ scroll_down_1_line = Shift Down
 # The main ansi color theme used in vte.
 # Possible values are linux, xterm, rxvt, and tango.
 # or left it blank to use the default settings form libvte.
-theme = 
+theme = solarized
 
 # Invert the ansi colors, like invert the darkred to red, darkblue to bule.
 invert_color = 0
```

## 使うの止めた

vimperator 等の外部エディタとして `lilyterm + vim` を計画。

外部エディタとして起動させる最小限のコマンドは

```sh
lilyterm --separate --execute vim
```

となる。(実際にはラッパースクリプトを用意して、フォーカスの制御なども行っていた。)

- `--separate` は、既存の lilyterm のタブで開かずに新規ウィンドウで開くためのオプション。(Web ブラウザの --new-window 的なアレ)
- `--execute` は、lilyterm の起動時に走らせるコマンド。

当初、問題は無かったと思うのだが、あるときから `--separate` と `--execute` の組み合わせで

- 起動した `lilyterm + vim` 内にて、インプットメソッドの Fcitx が有効にならない
- フォントが期待通りではない(おそらく fontconfig が正しく反映されていない?)

というトラブルに遭遇。環境変数を正常な状態のものと比較してみたが、特に異常は無し。

解決は難しそうだったので利用継続を断念。
噂のjThree.jsを試してみた。


Three.jsをjQueryライクに操れるライブラリです。
２４歳の高校生が作っているらしいです。

## 向いていること
頭のなかにある空間をプロトタイプする用途

- あーこういう世界作りたいけど、簡単にできないかなー
- 初音ミクちゃん動かしたいな―　

って時は便利。

わりとデザイナーに使って欲しいですね。
HTMLとCSSでサイトつくるイメージで３Dモデルが動かせます。


## 向いてないこと
- ジェネラティブなもの
- ちょっと凝ったこと
- ゲーム


イメージとしては、XMLをjQueryで制御する感じなんで、SVGにかなり近くなってると思います。

所詮jQueryなんで、制御系にはかなり問題があります。
Tweenつかってうにゃってアニメーションさせるのが関の山っぽいですね。

それにしても、jThreeっていう字面の悪さ・・・


## 使ってみた。

[サンドボックス](http://editor.jthree.jp/)があるので、それから始めるととっつきやすいかも。（ドキュメント無いのは殺したくなる。）

サンドボックスがドキュメント代わりになってくれて、「こんな機能あるんだ」みたいなことををやってました。
モデルデータのインポートとか配置とか直感的でいいですね。

```
<mmd id="" model="model/miku/index.pmx" motion="motion/kagerou.vmd" style=""></mmd>
```
これで出現。


なんと簡単。

でも、個人的には凝ったことやりたいからお蔵入りかな。
普段ニコニコ見てる暇人は使ってみればいいんじゃないかな。





[作ったもの](http://yohawing.com/exp/jThree2.0.7/yoha/)
Python小技

対話モードで
Python 2.7.6 (default, Sep 30 2014, 11:37:24) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
＞＞＞ print u"\u2605"
★
＞＞＞
とするとなど読める文字で出力される。
Python で Fizz Buzz

今日の成果です。

```py:Python
MAX = 100

i = 1
while i <= MAX:
  result = ""
  if i % 3 == 0:
    result += "fizz"
  if i % 5 == 0:
    result += "buzz"
  if result == "":
    result = i
  print result
  i += 1
```

### 追記

for 文をおぼえました。

```py:Python
MAX = 100

for i in range(1, MAX+1):
  result = ""
  if i % 3 == 0:
    result += "Fizz"
  if i % 5 == 0:
    result += "Buzz"
  if result == "":
    result = str(i)
  print result
```
360度撮影の機材情報

Ladybug2
http://www.viewplus.co.jp/product/camera/ladybug2.html

THETA (RICOH)
3万5000円
https://theta360.com/ja/

PIXPRO SP360　（KODAK）
349ドル（約3万8,000円）
http://kodakcamera.pixpro-sp360.com/

360heros
http://www.360heros.com/

autopano video pro
http://www.kolor.com/ja/.html

AutopanoGiga
※ステッチにやや問題あり。
http://www.kolor.com/image-stitching-software-autopano-giga.html

PTGuiPro
※つなげるのがキレイ
http://panoramania.jp/store/products/detail.php?product_id=104
Coda2.5にしたらEmmetプラグインが使えなくなった


Coda2.5のアップデート通知が来ていたので、わくわくアップデートしたのですが、表題のような有様になってしまいました。

## 環境

* OSX 10.8.5
* Coda2.5

## ググってみた

あびきょーかん。
 [Coda 2.5 Support #23](https://github.com/emmetio/Emmet.codaplugin/issues/23 "Coda 2.5 Support #23")

どうやらβテスト中にEmmetプラグイン起因と思われるクラッシュが出まくっていたようで、Panicの中の人がEmmetプラグインをブラックリスト入り＆強制アンインストールすることにした模様です。
（下記issue内のcabelさんのコメント参照）
[Latests Coda 2 ß Crash on launch if Emmet plugin enable #18](https://github.com/emmetio/Emmet.codaplugin/issues/18 "Latests Coda 2 ß Crash on launch if Emmet plugin enable #18")


## とりあえずの解決策

有志の方によるパッチが上がってます。素敵！
 [http://d.froloff.me/fdgY](http://d.froloff.me/fdgY "http://d.froloff.me/fdgY")


ただ、わたしの環境ではこのパッチはインストールできませんでした。（Yosemiteじゃないと駄目なのかな…）

 [Coda 2.5 Support #23](https://github.com/emmetio/Emmet.codaplugin/issues/23 "Coda 2.5 Support #23")に、懐かしのzen-coding-pluginが使えるとのコメントがあったので、駄目もとで試してみました。
>wingsline commented 6 days ago
>
>I found that the original zen coding plugin still works under Coda, so as a temporary solution it should be good: https://code.google.com/p/zen-coding/downloads/detail?name=Zen.Coding-Coda.v0.7.1.zip


今のところ問題なく使えてます。

おちこんだりもしたけれど、私はげんきです。

## とりあえずじゃない解決策

[Latests Coda 2 ß Crash on launch if Emmet plugin enable #18](https://github.com/emmetio/Emmet.codaplugin/issues/18 "Latests Coda 2 ß Crash on launch if Emmet plugin enable #18")内、cabelさんのコメントより。
>But don't worry — if you fix the issue in the future, and update the plugin, just make sure to update your short version string in your Info.plist so that Coda will allow it to load.

「プラグインを修正・更新したら、Info.plistのshort version stringも忘れずに直してね。そしたらプラグインがロードされるようになるよ」って言ってくれてますが…「if **you** fix the issue」って…。

**すいません、無理です。**

他力本願ですが、だれか救世主が現れないかと祈ってます…。

## 追記：Coda2.5＋zen-coding-pluginが絶望的に重い

その後しばらくzen-codingでがんばってみたのですが、zen-codingの機能には問題ないものの、レインボーカーソル回りっぱなしで死にそうです。 
zen-codingを無効にすると解消されるので、Coda2.5＋zen-coding-pluginの組み合わせに問題がある模様。
途方に暮れていたところ、素敵コメント発見。

[Coda 2.5 Support #23](https://github.com/emmetio/Emmet.codaplugin/issues/23 "Coda 2.5 Support #23")
>FROLoff commented 3 days ago
>
>For 10.9.5 and Coda 2.5 you can use official version of Emmet, just change Emmet's version to 1.0.1 in plist to bypass Panic's black list and everything will work as usual. Patched version needed only for Yosemite, because it doesn't support JSCocoa.

「（Coda2.5がクラッシュするせいで）パッチが必要なのはYosemiteだけ。OS X 10.9.5は（パッチなしの）Emmetがそのまま使えるので、プラグインがブラックリスト入りしないようにInfo.plistのversionを1.0.1に書き換えれば大丈夫」

マジか。

ということで、Emmet.codapluginのInfo.plistでshort version stringを1.0.1に書き換えてみたところ…OS X 10.8.5 ですが、**行けました！**
ということで、Emmet.codapluginの正式パッチが来るまではこの方法で乗り切ろうと思います。
NGUIのスプライトをファイルに保存する

なんとも変わったことをやっていますが、それなりに使いドコロはあるかもしれません。
spr1はUISpriteです。

```lang:
public void ButtonClick()
{
	int width = spr1.GetAtlasSprite().width;
	int height = spr1.GetAtlasSprite().height;
	int sprx = spr1.GetAtlasSprite().x;
	int spry = spr1.GetAtlasSprite().y;
	Texture2D tmptex = new Texture2D(width,height,TextureFormat.RGBA32,false);
	Texture2D srctex = (Texture2D)spr1.atlas.texture;
	for(int y = 0; y < height; ++y) {
		for(int x = 0;x < width; ++x){
			Color c = srctex.GetPixel(x+sprx,y+(spr1.atlas.texture.height-(height+spry)));
			if(c.a == 0){
				c.r = c.g = c.b = c.a = 1;
			}
			tmptex.SetPixel(x,y,c);
		}
	}
	byte[] pngarr = tmptex.EncodeToPNG();
	Debug.Log(Application.persistentDataPath+"/test.png");
	File.WriteAllBytes(Application.persistentDataPath+"/test.png", pngarr);
}
```
web-mode のインデント設定

# tl;dr
html とか twig 書くのに web-mode を使ってたけど、ずっと放置してたので久々にバージョンアップ。
したら、インデントが狂い始めちゃったので、そんときのメモ

# バージョン上げる前
http://qiita.com/elbowroomer/items/30bdf1c062a6ed3fa488
とかにもあるように

````.emacs
(defun web-mode-hook ()
  "Hooks for Web mode."
  (setq web-mode-html-offset   4)
(add-hook 'web-mode-hook 'web-mode-hook)
````

な設定でいける。完璧。パーフェクト。

# バージョン上げた後
上のように記述した .emacs での設定が反映されず、インデントが 2 のまま。
マジ泣ける。

原因は単純明快。**web-mode-html-offset** がなくなって、**web-mode-markup-indent-offset** になってたから。

````.emacs
(defun web-mode-hook ()
  "Hooks for Web mode."
  (setq web-mode-markup-indent-offset   4)
(add-hook 'web-mode-hook 'web-mode-hook)
````

で解決。

# なんというか...
> - Indentation
>
> HTML offset indentation
>
> ````
> (setq web-mode-markup-indent-offset 2)
> ````
>> via http://web-mode.org

ドキュメントにはちゃんと書いてあった...orz
【AWS】オートスケーリングしているIPをAWS SDK for PHPで取得する【API】

世に出てるやつだとcomposerでインストールしてー。。
とか書いてあるの多数だったけど、phpファイルrequireしてするやり方できたので備忘録。

## iAMユーザつくらなきゃいかんぽい。

AWS SDK使うのにアクセスキーとシークレットキーが必要くさい。

[ルートユーザでは取得できない](http://aws.typepad.com/aws_japan/2014/03/important-aws-account-key-change-coming-on-april-21-2014.html)ってどっかの記事でみたので専用ユーザを作るしかないってことでそのとおり作る。

ユーザ作ってアクセスキーとシークレットキー取得した後、権限も与えないといけないので忘れずに（ウチは忘れて数時間さまよった）
参照
http://joppot.info/2014/06/14/1621


## 次には本体ゲット

https://github.com/aws/aws-sdk-php/releases
ここの最新版。（2014/10/23現在で2.7.1）
zipをDL。


## 解凍してよしなにする

解凍フォルダ直下にaws-autoloader.phpってのがあるのでrequire。
後は使いたいライブラリをuseして使用。
参照
http://docs.aws.amazon.com/aws-sdk-php/latest/

## 面倒な人にサンプルコード

```
<?php
require('aws/aws-autoloader.php');

// AWS 接続情報を設定して下さい。
define('KEY' , 'xxxxxxxxxxxxxxxxx'); // アクセスキー
define('SECRET' , 'xxxxxxxxxxxxxxxxxxxx');　// シークレットキー
define('REGION' , 'ap-northeast-1'); // 東京リージョンってことらしいよ

// AWS 対象となるセキュリティグループ。
define('SECURITYGROUPS_NAME', 'default');

// AWS インスタンス ステータス
define('STATUS_running', '16');

use Aws\Ec2\Ec2Client;

$ec2 = new AwstarEc2();
// EC2インスタンスのプライベートIP一覧取得
$ipList = $ec2->getInstanceList();

var_dump($ipList);

/*
 * AwsClass
 */
class AwstarEc2{

	private static $client;

	/**
	 * init
	 * Aws\Ec2\Ec2Client にリージョンをセットして初期化
	 */
	private static function init(){
		$config = array(
			'key'    => KEY,
			'secret' => SECRET,
			'region' => REGION,
		);
		self::$client = Ec2Client::factory($config);
	}

	/**
	 * getInstanceList
	 * 特定リージョンのインスタンス情報をフォーマットを指定して取得する
	 * @param type $rsync_type
	 * @return type
	 */
	public static function getInstanceList(){
		self::init();

		// 対象EC2(runnning)の取得
		$response = self::$client->describeInstances(array(
			"Filter" => array(
				array("Name" => "instance-state-name", "Value" => "running")
			)
		));

		$ipList = array();
		// この時点で情報色々はいってる
		foreach ($response['Reservations'] as $instances_no=>$reservations){
			foreach ($reservations as $key=>$value){
				// インスタンス情報のみにしぼる
				if($key=="Instances"){
					// インスタンス情報軍
					foreach($value as $k=>$v){
						// 必要あらばここでさらにソート、今回はオートスケーリングしてるのがセキュリティグループ「default」のやつだったのでそれを算出
						if($v['State']['Code'] == STATUS_running && $v['SecurityGroups'][0]['GroupName'] == SECURITYGROUPS_NAME){
							$ipList[] = $v['PublicIpAddress'];
						}
					}
				}
			}
		}

		return $ipList;
	}
}

?>

```

いやー、はまったはまった。
本来ならcomposer使ってインストールしつつ依存ライブラリインストールした環境で使う形紹介してるサイトが多かったので。。
ミニマムで使うならこの形で使えるんじゃないですかね。
ソート条件に関してはそれぞれ任意で変えて取得すればいいと思います。
手続き型脳で理解するIOモナド

将軍の困りごと
--
> 将軍「この屏風から毎晩 **現在時刻という定数でない値** が飛び出してくる。関数的にしてみせよ」
> 一休『では捕まえますので、追い出してください』
> 将軍「だから出てきた時点で関数的じゃないってば」
> 一休『えっ』
> 将軍「代わりにお主が飛び込んで中で捕まえるがよい」
> 一休『ええっ!?』

手続き型プログラミングの世界では副作用というと

* **手続きを実行することで実行条件に影響を与えてしまうこと**

などと解釈することが一般的ですが、関数型プログラミングでは

* **関数の戻り値が引数だけで決まらないこと**

を意味します。つまり関数的でない、不確定であるというのと同義。将軍がお困りの現在時刻を返す関数というのは、そういう見方でいうと関数的でなく副作用があります。なにしろ、引数を取らない以上は定数を返すのが関数というものですから。

でも時刻を取ってこないことには仕方がないじゃない
--
関数に不確定さを持たせずに現在時刻を取得して使いたい？ 矛盾しているんじゃないか？
それに対する答が、将軍の「代わりにお主が飛び込んで中で捕まえる」、すなわちコールバックです。そう、取って来れないならこっちからコールバックを渡せばいいんです。

ちょっと手続き型言語でそれっぽく書いてみましょう。C#で書いていきます。Java系の方はちょっと文法のおかしいJava8だと思って読んでください。

```csharp:time_processing.cs
TimeFetcher tf = TimeFetcher.Instance;
tf.Bind(now => {/* 現在時刻に対する処理 */});
tf.Go();
```

TimeFetcherなんてクラスはいまでっち上げたものですが、とにかくTimeFetcher.Instanceプロパティは関数的です。必ずシングルトンのTimeFetcherオブジェクトを返す確定的関数です。

で、時刻を受け取ってそれを画面出力するなどといった処理をコールバックとしてこれに与えてあげれば、それをGoするとき初めて時刻が内部的に取得され、コールバックに引数として与えられます。与える処理というのはもちろんちゃんと関数的なものを書いて渡すことにしておきましょう。

これだったら不確定さはありません。将軍もニコニコしています。

でもコールバックだけで完結する処理ばっかりじゃないじゃない
--
でも普通はそんな単純じゃありません。取得した現在時刻を別の処理に -- 例えばDB書き込みのときに使うかもしれません。つまりは結局、コールバック関数からその不確定な結果を外へ返したいんですよ。やはり矛盾してる？

あるお約束を守れば、矛盾していないことにできます。それは、TimeFetcher.Instanceが「コールバックを受け取るオブジェクト」を返したように、外に返していいのも「コールバックを受け取るオブジェクト」だけということにするのです。

こんな風になります。

```csharp:time_printing.cs
TimeFetcher tf = TimeFetcher.Instance;
StringFetcher result = tf.Bind(
    now => new StringFetcher(now.ToString("yyyy/MM/dd HH:mm:ss")
);
result.Bind(str => System.Console.WriteLine(str));
result.Go();
```

ここでは、StringFetcherというクラスが「文字列を受け取るコールバックを要求するオブジェクト」です。ね、ほら、コールバックから外に結果を返せました。

ここで「resultは、値を取り出せないとは言え、実際には現在時刻を文字列化したものを抱えているのでデータとしては毎回違うものなのではないか？」と疑問をお持ちですか？
いいえ、resultが中に抱えているのは【現在時刻を文字列化したもの】ではなくコールバックです。コールバックは必要になったときに呼び出されます。最後のGoの時点で、表示するのに必要だから時刻を文字列化、それに必要だから現在時刻を取得、という処理が走ることになります。

まとめて言うと
--
外部からの入力は、「取り出せない（コールバックにしか渡してくれない）データコンテナ」という形で受け取り、その「取り出せないデータコンテナ」をコールバックで処理した結果も、やはり「取り出せないデータコンテナ」で返って来るというシステム、これでデータコンテナの外側の世界は不確定さない関数型プログラマニコニコの世界となりました。

では、こういう「取り出せないデータコンテナ」を総称型にしてしまいましょう。

```csharp:time_printing_generified.cs
IO<DateTime> tf = TimeFetcher.Instance;
IO<String> result = tf.Bind(
    now => new IO<String>(now.ToString("yyyy/MM/dd HH:mm:ss")
);
result.Bind(str => System.Console.WriteLine(str));
```

はい、それがまさにIO型なのであります。

普通の値をIO型にすることはできるしIO値からIO値を作ることはできるけどIO値を普通の値には変換できません。そんな一方通行な、IO型のような「自己を再生産できる」型をモナドと呼んでいます。

（筆者のブログ記事 http://cs.hatenablog.jp/entry/2013/08/23/075647 とツイート https://twitter.com/yuba/status/528002501186818048 を改題再編集しました）
日付を日めくりカレンダー風に表示してみよう

## 概要

例えば、アンケートやレポートをユーザに提出してもらうシステムを想定します。

画面上でその提出期限をユーザに示す場合、
`%Y/%m/%d %H:%M` 形式の日付文字列を表示するのは素っ気ないと感じました。

そこで今回、期限日を日めくりカレンダー風に表示するようにしてみました。

## 例

![Himekuri](https://qiita-image-store.s3.amazonaws.com/0/6697/32d29c02-cade-df54-6757-7de0c73772a4.png)

## コード

### CSS (SCSS)

``` scss:himekuri.css.scss
.himekuri-calendar {
  $width: 48px;

  font-weight: bold;
  padding: 0 10px;
  text-align: center;

  .himekuri-calendar__year {
    width: $width;
    font-size: 10px;
  }

  .himekuri-calendar__month {
    border-width: 1px;
    border-style: solid;
    color: #FFFFFF;
    width: $width;
    font-size: 10px;
  }

 .himekuri-calendar__date {
    background-color: #FFFFFF;
    border-width: 1px;
    border-style: solid;
    border-bottom: none;
    width: $width;
    margin-top: -2px;
    font-size: 22px;
  }

  .himekuri-calendar__day {
    background-color: #FFFFFF;
    border-width: 1px;
    border-style: solid;
    border-top: none;
    width: $width;
    margin-top: -4px;
    padding-bottom: 4px;
    font-size: 10px;
  }

  .himekuri-calendar__word {
    background-color: #FFFFFF;
    width: $width;
    font-size: 11px;
  }
}

@mixin himekuri-calendar($color) {
  .himekuri-calendar__year {
    color: $color;
  }

  .himekuri-calendar__month {
    background-color: $color;
    border-color: $color;
  }

  .himekuri-calendar__date {
    color: $color;
    border-color: $color;
  }

  .himekuri-calendar__day {
    color: $color;
    border-color: $color;
  }

  .himekuri-calendar__word {
    color: $color;
    border-color: $color;
  }
}

.himekuri-calendar {
  @include himekuri-calendar(#2C3E50);
}

.himekuri-calendar.muted {
  @include himekuri-calendar(#B4BCC2);
}

.himekuri-calendar.info {
  @include himekuri-calendar(#3498DB);
}

.himekuri-calendar.warning {
  @include himekuri-calendar(#F39C12);
}

.himekuri-calendar.danger {
  @include himekuri-calendar(#E74C3C);
}
```

### Helper

``` ruby:application_helper.rb
def himekuri_calendar(date: nil, status: nil, word: nil)
  calendar_classes = ['himekuri-calendar']
  calendar_classes << status if status

  content_tag(:div, class: calendar_classes * ' ') do
    concat(content_tag(:div, class: 'himekuri-calendar__year') do
      date.try(:strftime, '%Y') || '　'
    end)
    concat(content_tag(:div, class: 'himekuri-calendar__month') do
      date.try(:strftime, '%m') || '-'
    end)
    concat(content_tag(:div, class: 'himekuri-calendar__date') do
      date.try(:strftime, '%d') || '-'
    end)
    concat(content_tag(:div, class: 'himekuri-calendar__day') do
      date ? I18n.l(date, format: '(%a)') : '　'
    end)
    concat(content_tag(:div, class: 'himekuri-calendar__word') do
      word
    end)
  end
end
```

### HTML (Slim)

```slim:usage.html.slim
/ 期限が迫ってるよ！ … 赤色
= himekuri_calendar(date: report1.term, status: 'danger',  word: '締切')
/ 期限が近いよ！ … 橙色
= himekuri_calendar(date: report2.term, status: 'warning', word: '締切')
/ 期限はないよ♪ … 紺色
= himekuri_calendar(date: report3.term, word: '締切なし')
```
CakePHPのSecurity->blackHoleCallBackの設定の基本


```
public function beforeFilter(){
		$this->Security->blackHoleCallback = 'blackhole';
		parent::beforeFilter();
	}
```

```
public function blackhole($type){
		switch($type){
			case 'csrf' :
				$this->Session->setFlash(__('不正な送信が行われました'));
				$this->redirect(array('controller' => 'topics', 'action' => $this->action));
				break;
			default :
				$this->redirect(array('controller' => 'topics', 'action' => 'index'));
				break;
		}
	}
```

参考：http://junichi11.com/?p=1555
【Oracle】テーブル一覧のタイプ, 桁数などのViewの作成方法

### 以下でViewを作成します

```oracle:tableAll.sql
CREATE OR REPLACE VIEW スキーマ.テーブル一覧
	(NO, テーブル名, 論理テーブル名, カラム名, 項目名, タイプ, 桁数, NULL許可) 
AS 
select a.COLUMN_ID NO
	,a.TABLE_NAME テーブル名
	,b.COMMENTS 論理テーブル名
	,a.COLUMN_NAME カラム名
	,c.COMMENTS 項目名
	,a.DATA_TYPE タイプ
	,case when a.DATA_TYPE = 'NUMBER' then DATA_PRECISION else a.DATA_LENGTH end 桁数
	,a.NULLABLE NULL許可
	from USER_TAB_COLUMNS a
	,USER_TAB_COMMENTS b
	,USER_COL_COMMENTS c
	where a.TABLE_NAME = b.TABLE_NAME
	and a.TABLE_NAME = c.TABLE_NAME 
	and a.COLUMN_NAME = c.COLUMN_NAME 
	order by a.TABLE_NAME,a.COLUMN_ID
```
地番の本番が4桁、枝番が3桁になるようにゼロパディング(ゼロ埋め)する

[ソースはGithubで管理しています](https://github.com/kmr-hryk/Chiban-Zero-Padding)。

下記のような変換をするスクリプトです。

```
100-1 → 0100-001
200　 → 0200-000
```

``` Chiban-Zero-Padding.ps1
function Zero-Padding() {
   $str = [String]$ARGS[0]
   $length = $ARGS[1]

   While ( $str.Length -lt $length ) {
      $str = "0$str"
   }
   Return $str
}

$chiban = [String]$ARGS[0] -Split("-")

$oya = Zero-Padding $chiban[0] 4
if ( $chiban.Length -eq 2 ) {
   $eda = Zero-Padding $chiban[1] 3
} else {
   $eda = "000"
}

$chiban = "$oya-$eda"

Write-Output $chiban
```

Docuworks Deskではファイル名が、Excelでは地番名が、それぞれ地番が文字列として認識されて地番順に並べ替えることができないので地番をゼロ埋めしてちゃんと並ぶように変換します。

枝番の無い地番に無理矢理「-000」を追加しているのは、隣接の道路に表示が起こされている土地の中に「920番」と「920番2」があって、それぞれ「0920」、「0920-002」とすると、「0920」より先に「0920-002」が表示されてしまうためです。

逆変換のゼロサプレスもあった方が便利かもしれませんね。
Xcode Organizerのプロキシ設定


このファイルに以下の2行を書いておけばOKです。
/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/net.properties

```
http.proxyHost=your.proxy.host
http.proxyPort=8080
```

Xcodeをアップデートすると元に戻ってしまうようなのでお気をつけください。
これから追加するディレクトリの特定のファイルを無視


```
hoge/
  fuga/
  piyo/
```

とあって、hoge をこれからsvnに登録するが、 piyo はリポジトリにコミットしたくない。

```
$ svn add hoge

$ svn st 

$ svn propedit svn:ignore hoge
```

でエディタ起動し以下のように記述

```
piyo
```

既にAddされたファイルを revert で外す

```
$ svn revert piyo
```
Intellij のキモい import を直したかった

探すの意外と大変だったのでメモ

## import Hoge.{A,B,C,D,E} を import Hoge._ にしたくない

* wildcard import とか
* import on demand とか呼ばれてる文法

基本的に邪悪

##設定場所

Code Style > Scala > Imports > Class count to use import with '_'

##変更前

デフォだと 5 個以上で変換されるようになってるので

![Screen Shot 2014-10-31 at 17.00.06.png](https://qiita-image-store.s3.amazonaws.com/0/7196/051ebde3-b3b4-4179-7dfe-40f0ba7b52ee.png)

##変更後

適当に巨大な値に変えておけばおk

![Screen Shot 2014-10-31 at 17.01.25.png](https://qiita-image-store.s3.amazonaws.com/0/7196/79264587-03e8-06cd-d25f-dbc938ec4f20.png)
コマンドラインからmailmanを操作するメモ

# 下準備

インストールディレクトリへ移動

```lang:bash
cd /usr/lib/mailman/bin
```

# 登録されているリストの一覧

```lang:bash
./list_lists [-V VirtualDomain]
```

[-V VirtualDomain] を指定すると、仮想ドメインを限定して一覧を出力

# 特定のメアドが登録されているリストを探す

```lang:bash
./find_member [mail address] # 全体から探す
./find_member -w [mail address] # オーナーも含む
./find_member --listname=[LIST NAME] #特定リスト内のみ
```

# メンバーの削除

```lang:bash
./remove_members [LIST NAME] [mail address 1] [mail address 2] ...
./remove_members -a [LIST NAME] # 全消し
./remove_members -f [FILE NAME] [LIST NAME] # 削除対象メアドの一覧が含まれるファイルの一覧を使って一括削除
```

# 特定メールアドレスを全メーリングリストから削除

```lang:bash
./remove_members -n --fromall [mail address 1] [mail addres 2] ...
```

# 設定を出力する

```lang:bash
./config_list -o - [LIST NAME] # 標準出力に表示
./config_list -o [FILE NAME] [LIST NAME] # ファイルに出力
```

# 設定を登録する（上書）

上記出力で得たファイルを更新してコマンドに食わす

```lang:bash
./config_list -i [FILE NAME]
```

# 容量が肥大化したのでアーカイブを止める

管理画面から実行する

0. アーカイブ（保存書庫）の設定を無効化
1. まとめ読みを無効にする

# 容量を圧迫してきたのでアーカイブを削除する

0. 上記のアーカイブを停止させる操作を実行
1. 対象ファイルを削除する

```lang:bash
rm -rf /var/lib/mailman/archives/private/(メーリングリスト名) 配下のアーカイブファイル 全て # ディレクトリは消さない！
/var/lib/mailman/archives/private/(メーリングリスト名).mbox/(メーリングリスト名).mbox
```
ScalikeJDBCを使ってMySQLにINSERTやSELECTをしたい


MySQLに対してScalikeJDBCを使ってINSERTやSELECTのクエリーを発行する方法。

```scala:build.sbt
// scalikejdbc
libraryDependencies ++= Seq(
  "org.scalikejdbc" %% "scalikejdbc" % "2.1.2",
  "mysql" % "mysql-connector-java" % "5.1.29",
  "ch.qos.logback"    %   "logback-classic" % "1.1.1"
)
```

```scala
import org.scalatest._
import scalikejdbc._
import com.mysql.jdbc.Driver

case class User(id: Int, name: String, emailAddress: Option[String])

object User extends SQLSyntaxSupport[User] {
  override val tableName = "users"
  // for example 1
  def apply(rs: WrappedResultSet): User = User(rs.int("id"), rs.string("name"), rs.stringOpt("email_address"))
  // for example 2 (case classに無いカラム名を使うとコンパイル時に分かる)
  def apply(u: ResultName[User])(rs: WrappedResultSet): User = User(rs.int(u.id), rs.string(u.name), rs.stringOpt(u.emailAddress))
}

class SandboxSpec extends FunSuite {
  test("scalikejdbc") {
    Class.forName("com.mysql.jdbc.Driver")
    ConnectionPool.singleton("jdbc:mysql://192.168.0.77/testing?characterEncoding=UTF-8", "root", "mypass")

    implicit val session = AutoSession

    // insert example 1: 素のSQLに近い書き方
    val alice = User(0, "alice", None)
    val bob = User(0, "bob", Some("bob@example.com"))
    sql"INSERT INTO users (name, email_address) values (${alice.name}, ${alice.emailAddress})".update.apply()
    sql"INSERT INTO users (name, email_address) values (${bob.name}, ${bob.emailAddress})".update.apply()

    // insert example 2: DSLを使った書き方 (case classに無いカラム名を使うとコンパイル時に分かる)
    val uc = User.column
    withSQL { insert.into(User).namedValues(uc.name -> "carol", uc.emailAddress -> Some("carol@example.com")) }.update.apply()

    // select example 1: 素のSQLに近い書き方
    val users2 = sql"SELECT * FROM users".map(User(_)).list.apply()
    println(users2)

    // select example 2: DSLを使った書き方
    val u = User.syntax("u")
    val users = withSQL { select.from(User as u) }.map(User(u.resultName)).list.apply()
    println(users)

    // select example 3: whereで絞り込む
    val users3 = withSQL { select.from(User as u).where.eq(u.name, "bob") }.map(User(u.resultName)).list.apply()
    println(users3)
  }
}
```

`withSQL { ... }.update.apply()` は `applyUpdate { ... }` と書くこともできるみたい。

```scala
withSQL { insert.into(User).namedValues(uc.name -> "carol", uc.emailAddress -> Some("carol@example.com")) }.update.apply()

applyUpdate { insert.into(User).namedValues(uc.name -> "carol", uc.emailAddress -> Some("carol@example.com")) }
```
CentOSにrpmbuildからRuby環境を構築する

CentOS 7系にRuby 2.7系の環境を構築するニッチな投稿です

# 環境
* CentOS 7.8-2003


# 準備
（必要な方は）
* [プロキシの指定方法](https://qiita.com/tunepolo/items/296c2639e0b750de41c6)


# rpmbuildの導入と環境構築

```bash
yum install rpmdevtools
rpmdev-setuptree
```


# Rubyのインストール

## パッケージの準備

```bash
yum install readline-devel ncurses-devel gdbm-devel glibc-devel gcc openssl-devel libyaml-devel libffi-devel zlib-devel
```

## ソースのダウンロード

```bash
cd ~/rpmbuild/SOURCES
wget https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.gz
```

## specファイルのダウンロード

```bash
cd ~/rpmbuild/SPECS
wget -O ruby-2.7.1.spec https://raw.githubusercontent.com/feedforce/ruby-rpm/master/ruby-2.7.spec
```

specファイル内のバージョンに従ってリネームしている


## リビルドとインストール

```bash
rpmbuild --clean -bb ruby-2.7.1.spec

yum --nogpgcheck localinstall ~/rpmbuild/RPMS/x86_64/ruby-2.7.1-1.el7.x86_64.rpm
```

## Bundlerもインストール

```bash
gem install bundler
```


# 参考

1. [最新のRubyをRPMで入れる - ほとラボ](https://blog.hotolab.net/entry/ruby_rpm)
1. [rpmbuild環境の構築 - Qiita](https://qiita.com/IK12_info/items/bcf695460363bae87eb9)
【Vagrant, CentOS】VagrantでCentOSをインストール


## Vagrantのインストール
### Vagrant公式サイト
https://docs.vagrantup.com/v2/


## Boxファイルのダウンロード
### 参考URL
・VagrantBoxファイルの一覧
http://www.vagrantbox.es/

・VagrantCloudのCentOS64bit版のたぶん最新(2014/10/31現在)
https://vagrantcloud.com/nrel/boxes/CentOS-6.5-x86_64

・CentOSだと今は下記URLからがたぶん最新(2014/10/31現在)
https://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.5-x86_64-v20140504.box

## VagrantにBoxファイルを追加

```shell-session
$ cd [ダウンロードディレクトリ]    # ダウンロードしたディレクトリへ移動
$ vagrant box add centos65 CentOS-6.5-x86_64-v20140504.box
==> box: Adding box 'centos65' (v0) for provider:
box: Downloading: file:///Users/knife0125/Develop/100_NexSeed/	100_vagrant/10_boxes/lxc-centos6.5-2013-12-02.box
==> box: Successfully added box 'centos65' (v0) for 'lxc'!

$ vagrant box list	# Vagrantに保持されているBoxファイルを一覧表示
centos64_ja (virtualbox, 0)
centos65    (virtualbox, 0)
```

## Vagrantで仮想マシンを作成

※ 全てのコマンドをVagrantプロジェクトを作成するディレクトリ直下でやりましょう！

### "vagrant init"でVagrantfileを作成

```shell-session
$ vagrant init centos65
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

### Vagrantfileを編集して仮想マシンの設定を変更

#### プライベートネットワーク内でのIPを固定する

例：IPアドレスを192.168.33.10に固定

```shell-session

$ vim Vagrantfile
+ config.vm.network "private_network", ip: "192.168.33.10"
```

#### 仮想マシンのメモリ容量を設定する

例：メモリ容量を1024MBに変更

```shell-session

$ vim Vagrantfile
+ config.vm.provider "virtualbox" do |vb|
+   vb.customize ["modifyvm", :id, "--memory", "1024"]
+ end
```

#### ホストマシンとゲストOSの間で共有フォルダを設定する

MacローカルのVagrant緑化のhttpdStoreディレクトリと、vagrantログイン後の/var/www/htmlディレクトリを共有フォルダに設定する。
（そうすることで、Macローカルファイルをいじることが、イコールでvagrantサーバのApache配下のファイルをいじることに変更することができる）

```shell-session
$ vim Vagrantfile
+ config.vm.synced_folder "./httpdStore", "/var/www/html/"
```

### Vagrantサーバを起動

```shell-session
$ vagrant up	# vagrantサーバを起動
$ vagrant ssh 	# vagrantサーバへssh接続
```

## その他 Vagrantコマンド

### Vagrantサーバを起動する時

	$ vagrant up

### VagrantへSSH接続する時

	$ vagrant ssh

### Vagrantの設定変更を反映させたい時

	$ vagrant reload

### Vagrantサーバを落とす時

	$ vagrant halt

### Vagrantのサーバを殺したい時
※ 思わずVirtualBox側で削除すると、Vagrant的には良くないことになるので、きちんとdestroyしましょう！

	$ vagrant destroy
[apache] ProxyPreserveHostをOnにしてハマる

apacheによるリバースプロキシを多段構成にしていて、バックエンドでもクライアントがリクエストしたホスト名を取りたい！なんてことがありました。
ProxyPreserveHostを設定すれば解決するじゃん！という答えに行き着いたのですが、ハマることがあったのでメモしておきます。

**参考**

* リバースプロキシの多段構成によるRailsアプリへの影響 [Ruby - Rack::Request#hostがX-Forwarded-Hostの最後のプロキシホストを返す理由 - Qiita](http://qiita.com/mechamogera/items/32db29aa0db91df704ba)
* [ProxyPreserveHostの公式ドキュメント](http://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypreservehost)

## やりたいこと
以下の構成をとったとき、バックエンドでクライアントがリクエストしたホスト名を取りたい。しかし多段プロキシの影響によりlocalhostが取れてしまう。

```
cliant -> proxy1(apache) -> proxy2(apache) -> backend
```

## 単純に対応すると
上記proxy1, proxy2のコンフィグに以下を追記すればclientがリクエストしたホスト名がそのまま渡ってきます。が、他の設定に影響を与えるため注意が必要です。

```apache.conf
  ProxyPreserveHost On
```

## ProxyPassReverseにハマる
リバースプロキシを使う際、リダイレクトの対応としてProxyPassReverseを設定することがよくあります。
しかし、以下のような書き方をしているとProxyPassReverseが効かなくなります。

```apache.conf
## リバースプロキシの設定
  ProxyPass /ja http://localhost:3080/ja
  ProxyPassReverse /ja http://localhost:3080/ja

## リダイレクトでこんな設定があるとして
  redirect /ja/hoge /ja
```
期待ではこうなるはず

```
$ curl -I http://myhost.com/ja/hoge
HTTP/1.0 302 Moved Temporarily
...
Location: http://myhost.com/ja
```
しかし実際は期待しないポート番号付で返ってくる

```
$ curl -I http://myhost.com/ja/hoge
HTTP/1.0 302 Moved Temporarily
...
Location: http://myhost.com:3080/ja
```

これはリクエストヘッダの値がProxyPreserveHostによって変わっているために発生するようです(X-Forwaeded-HostかHostを見てる？)
バックエンドがlocalhost:3080にリダイレクトさせるはずが、myhost:3080で返してくるため、ProxyPassReverseに引っかからなくなっています。
期待通りにリダイレクトのホスト名を書き換えようと思うと以下の対応が必要です
### 解決案1：ProxyPassReverseを書き換える
クライアントがリクエストするホスト名をベタっと書いてしまう

```apache.conf
  ProxyPass /ja http://localhost:3080/ja
  ProxyPassReverse /ja http://myhost.com:3080/ja
```

### 解決案2：バックエンドでServerNameを使う
バックエンド自身にlocalhost、もしくはクライアントがリクエストするホスト名を名乗らせることでも解決します。クライアントがリクエストするホスト名を名乗らせた場合、ProxyPassReverseの設定自体が不要になります

```apache.conf
  ServerName myhost.com:80 または ServerName localhost:3080 とか
  UseCanonicalName on #これをセットで記述しないと有効になりません
```

## SSLProxyにハマる
SSLProxyを利用している場合、プロキシ先の証明書とリクエストのホスト名が不一致となりプロキシに失敗してしまいます。
例えばこんな設定を書いていたとすると、

```apache.conf
  SSLProxyEngine on
  ProxyPass /other https://myhost2.com/other
```

このようなエラーが出ます。

```
[ssl:info] [pid xxxx] [remote x.x.x.x:443] AH02005: SSL Proxy: Peer certificate CN mismatch: Certificate CN: myhost2.com Requested hostname: myhost.com
```

### (暫定)解決案 とりあえず証明書の確認をスキップ
プロキシ先のサーバが信頼できる必要がありますが、証明書の確認をスキップすることで回避できます。そうでない場合は真面目に確認が必要ですが、今回はそこまで調べていません・・・。

```apache.conf
  SSLProxyEngine on
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  ProxyPass /other https://myhost2.com/other
```
ComposerでGitHubのリポジトリをHTTPSで追加したときの認証設定

たとえば下記のように、 `composer.json` に GitHub で管理している自分のプライベートリポジトリを `HTTPS` で登録して `composer install` を実行すると、認証を求められるかと思います。

```json
{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/fivestar/privrepo"
        }
    ],
    "require": {
        "fivestar/privrepo": "dev-master"
    }
}
```

```
% composer install
Loading composer repositories with package information
Your GitHub credentials are required to fetch private repository metadata (https://github.com/fivestar/privrepo)
The credentials will be swapped for an OAuth token stored in /home/fivestar/.composer/auth.json, your password will not be stored
To revoke access to this token you can visit https://github.com/settings/applications
Username: fivestar
Password:
```

これだけならユーザー名/パスワードを入力すればいいんですけど2段階認証を有効にしてたりすると認証コードを求められたりするわけです。

```
Two-factor Authentication
You have been sent an SMS message with an authentication code to verify your identity.
Authentication Code: 
```

で、この表示がでたんですけど SMS がまったく飛んでこなくて、認証できないなーどうしようと調べていたら、GitHub のアクセストークンを Composer に設定すればいいようです。 ([Composer ignores "github-oauth" configuration #1558](https://github.com/composer/composer/issues/1558))

まず GitHub で `Settings` &gt; `Personal access tokens` から適当なアクセストークンを発行しておき、

![image](https://qiita-image-store.s3.amazonaws.com/0/59/b818d047-b93e-de3b-ed84-3512e8d138d4.png)

以下のコマンドを実行します:

```shell-session
composer config --global github-oauth.github.com <access-token>
```

これで無事 `composer install` ができるようになります。ちなみにこの `auth.json` 、 BASIC 認証の設定もかけるようですね。
mosqlのオーバヘッド

## mosql
いわゆるひとつのクエリビルダ
https://github.com/moskytw/mosql

mosql使う用途くらいだったら特に気にすることもないんだろうけど、確かめてみた。

## 測定コード
```py
import slowfast

title = "mosql vs format"
one = "insert('tech', {'id': 1, 'name': 'Hoge'})"
two = """'INSERT INTO "tech" ("id", "name") VALUES ("{}", "{}")'.format(1, 'Hoge')"""
setup = "from mosql.query import insert"
slowfast.compare(title, one, two, setup)

title = "mosql vs mosql(escape)"
one = "insert('tech', {'id': 1, 'name': 'Hoge'})"
two = "escape(insert('tech', {'id': 1, 'name': 'Hoge'}))"
setup = "from mosql.query import insert;from mosql.mysql import escape"
slowfast.compare(title, one, two, setup)
```

## 結果
```bash
$ python example.py
===== mosql vs format =====
(slow) 0.659736[sec]
  insert('tech', {'id': 1, 'name': 'Hoge'})
(fast) 0.008752[sec]
  'INSERT INTO "tech" ("id", "name") VALUES ("{}", "{}")'.format(1, 'Hoge')
75.38 times faster

===== mosql vs mosql(escape) =====
(slow) 0.805398[sec]
  escape(insert('tech', {'id': 1, 'name': 'Hoge'}))
(fast) 0.674377[sec]
  insert('tech', {'id': 1, 'name': 'Hoge'})
1.19 times faster
```
Ubuntu を共有ファイルサーバにする


ファイル共有に使ってた NAS がいきなり死んだので、急遽代替手段を用意した。

使ったマシンは、ThinkPad0T430s。
OS version は、Ubuntu 12.04。

samba をインストール。

```bash
sudo apt-get install samba
```

共有用のディレクトリを準備。
ネットワーク的に隔離されてるので、取り急ぎ認証とか設定せず、ゲストアカウントで使ってもらう想定で。

```bash
sudo mkdir /var/samba
chown nobody:nogroup /var/samba/
sudo chown nobody:nogroup /var/samba/
sudo chmod 777 /var/samba/
```

samba の設定ファイル `/etc/samba/smb.conf` に下記を追記。

```bash
[global]
   dos charset = CP932
   unix charset = UTF-8
   display charset = UTF-8

[share]
   path = /var/samba
   writeable = true
   force create mode = 0666
   force directory mode = 0777
   guest ok = yes
   guest only = yes
```

なお、自分の場合、`global` セクションは元々あったのでそこに設定追記しましたが、`share` セクションは存在していなかったので、まるっとセクションごと新たに追加しました。

ここまで出来たら samba を再起動。

```bash
service smbd restart
```

以上で設定完了。

動作確認として、Mac から `Cmd+k` して `smb://10.xx.xx.xx` みたく IP アドレス指定すると、接続できた。
そこでゲストアカウントを選択すれば、使用可能。お手軽でした。
【覚書】screen のセッションに名前を付ける方法

```bash
screen -S amo.deploying
```

- 他社様のサーバーに入って本番リリースとか不具合調査とかをやることがある。
- 他社サーバーの場合、個人のアカウント(`amo`)が発行されずに、自分の会社で共通のアカウント(`hoge`)が発行されるということが往々にしてある。
- つまり、ひとつのアカウントで複数人が作業することがある。
- この状況で `screen` を作動し、デタッチで作業を中断すると、再開するときに自分が作業していた `screen` がどれだったかわからなくなってしまう。
- `screen` に名前をつけておくと、後で再開する際に `screen -list` で名前を確認することができる。
ActiveRecordの様々なメソッドたち

ActieRecordには様々なメソッドがあります。中にはあまり使わないものもあると思います。以下に個人的な覚え書きの意味もこめて、幾つかのメソッドの使い方や発行されるSQLを載せます。

##uniq
SQLのdistinctに相当します。

```rb
pry(main)> User.where(name: 'test').uniq
  User Load (0.1ms)  SELECT DISTINCT "users".* FROM "users"  WHERE "users"."name" = 'test'
```

##merge
ActiveRecordでJOINを使ってデータを取得する場合、以下のようにjoinメソッドを使って書く事ができます。

```rb
User.joins(:auth_providers).all.where(auth_providers: { provider: 'facebook' })
```
これは次のようなSQLを発行します。

```sql
SELECT "users".* FROM "users" INNER JOIN "auth_providers" ON "auth_providers"."user_id" = "users"."id" WHERE "auth_providers"."provider" = 'facebook'
```

これと同じことをmergeメソッドを使って書く事ができます。
まずscopeを書きます

```rb
class AuthProvider < ActiveRecord::Base
  belongs_to :user

  scope :facebook, -> { where(provider: 'facebook') }
  scope :developer, -> { where(provider: 'developer') }
end
```

mergeメソッドでは、ここで定義したscopeを使います。上で上げたjoinと同じSQLを発行するには次のように書きます。

```rb
 User.joins(:auth_providers).all.merge(AuthProvider.facebook)
```

where(auth_providers: { provider: 'facebook' })と書いていた箇所がスッキリしますね。
最初mergeっていうメソッド名だったので、違う動きを想像していました。

##rewhere
メソッド名から動きを想像出来るでしょうか？百聞は一見に如かずなのでコードを見てみましょう。

```ruby
pry(main)> User.where(name: 'test')
  User Load (0.1ms)  SELECT "users".* FROM "users"  WHERE "users"."name" = 'test'
```

rewhereを使うと

```ruby
pry(main)> User.where(name: 'test').rewhere(name: 'hoge')
  User Load (0.2ms)  SELECT "users".* FROM "users"  WHERE "users"."name" = 'hoge'
```

分かりますでしょうか？where(name: 'test')が上書きされます。
例えばdefault_scopeとかで指定されている条件を変更したい時などに使うのでしょかね。

##reorder
これも名前から想像できるでしょうかね？発行されるSQLを載せます

```rb
pry(main)> User.all
  User Load (0.1ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" DESC
```

default_scopeでorder(id: :desc)を指定ししている場合にreorderを使ってやると

```rb
pry(main)> User.all.reorder(id: :asc)
  User Load (0.1ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC
```

ORDER BYのところが書き変わっていますね。

##reverse_order
習得したデータを並び替えます。

```rb
pry(main)> User.all.order('name')
  User Load (0.4ms)  SELECT "users".* FROM "users"   ORDER BY name
=> [#<User id: 1, name: "naka", email: "naka5313@gmail.com", provider: "developer", nickname: nil, access_token: nil, secret_token: nil, created_at: "2014-11-26 15:36:12", updated_at: "2014-11-26 15:36:12", image_url: nil, uid: "naka5313@gmail.com">]
```

reverse_orderを使うと・・。

```rb
pry(main)> User.all.order('name').reverse_order
  User Load (3.9ms)  SELECT "users".* FROM "users"   ORDER BY name DESC
=> [#<User id: 1, name: "naka", email: "naka5313@gmail.com", provider: "developer", nickname: nil, access_token: nil, secret_token: nil, created_at: "2014-11-26 15:36:12", updated_at: "2014-11-26 15:36:12", image_url: nil, uid: "naka5313@gmail.com">]
```

##take
一件だけデータを取得します。

```rb
[6] pry(main)> User.take
  User Load (0.5ms)  SELECT  "users".* FROM "users"  LIMIT 1
=> #<User id: 1, name: "naka", email: "naka5313@gmail.com", provider: "developer", nickname: nil, access_token: nil, secret_token: nil, created_at: "2014-11-26 15:36:12", updated_at: "2014-11-26 15:36:12", image_url: nil, uid: "naka5313@gmail.com">

```

以上です。また何かあれば追記します。
mysql tips


カラム一覧を取得

```
select * from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA = 'DB名' and TABLE_NAME = 'テーブル名' order by TABLE_NAME;
```


データだけを1行ずつ出力
```
mysqldump -c --skip-extended-insert -t DATABASE_NAME -u USER_NAME > dump.sql
```

エラーが起きた行は無視して取り込む
```
mysql -u root DATABASE_NAME -f < dump.sql
```

utf8を指定
```
 --default-character-set=utf8 
```
UIImageの合成

ある入力フォーム(UIImage)にたいしてUILabelを貼付けたい。
UIImageとUIImageを合成するのが簡単らしい。
※UIImageViewにUILabelをaddしてもだめだった。

段階1) UIView(UILabel)のUIImage化

    //! viewLabelsはclearカラー、複数のUILabelが乗っかっている
    //! opaque引数をNOにすることに注意
    UIGraphicsBeginImageContextWithOptions(viewLabels.bounds.size, NO, 0.0); // opaqueをNOにして背景をクリアにする
    [viewLabels.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    UIImage *imageFromUIView = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

段階2) UIImageの合成

    // グラフィックスコンテキストを作る
    CGSize size = { _imageOriginal.size.width, _imageOriginal.size.height};
    UIGraphicsBeginImageContext(size);

    //元画像を描画
    CGRect rect;
    rect.origin = CGPointZero;
    rect.size = size;
    [_imageOriginal drawInRect:rect];

    //重ね合わせる画像を描画
    [imageFromUIView drawInRect:rect];

    // 合成した画像を取得する
    UIImage* compositeImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
物理サーバにCentOS7インストール(遊び用)

## isoイメージをダウンロード
http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/
CentOS-7.0-1406-x86_64-DVD.iso

## Roxio Burn でDVD焼く＠Windows 7

## CentOS7を入れたいマシンにDVD入れて再起動

## 既存のもの全削除でインストール(最小限)

## スペック確認

* システム情報
`$ uname -a`

* OS 確認 バージョン確認
`$ less /etc/redhat-release`

* CPU情報 
`$ less /proc/cpuinfo`

* メモリ情報
`$ less /proc/meminfo`

* ディスク容量
`$ fdisk -l`

* インターフェイス, IP情報
`$ ip addr show`

## ユーザ作成
`$ useradd {ユーザ名} -s /bin/bash`
`$ passwd {パスワード}`

## SELinux無効に

* SElinuxの状態確認
`$ getenforce`
→ enforcingが返ってきたら、selinux有効

* オフに
`$ sudo setenforce 0`

* 再起動後もオフに
`$ sudo vi /etc/selinux/config`
で、 SELINUX=disabled に変えておく

## firewallオフに
* ファイアウォールオフ
`$ sudo systemctl stop firewalld`

* ファイアウォール自動起動オフ
`$ sudo systemctl disable firewalld`

## 全パッケージのアップデート
`$ sudo yum -y update`

## ホスト名変える
`$ sudo vi /etc/hostname`

************************************************************
# 参考リンク
[CentOS本家](http://www.centos.org/)
全ユーザーのcronジョブ一覧を表示する

サーバーが特定時間に重い時とか変なことしてるユーザーを探す時にcronで実行されてるジョブの一覧が欲しくなったので調べました。


```
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
```

を`root`で実行しましょう。


### 参考

unix - How do I list all cron jobs for all users? - Stack Overflow http://stackoverflow.com/questions/134906/how-do-i-list-all-cron-jobs-for-all-users
Slick: LONGTEXTやTEXT型のフィールドを作りたい


`String`型で定義したカラムはMySQLでは`varchar(254)`になってしまう。

```scala
def html = column[String]("html")
```

これを`TEXT`や`LONGTEXT`型にするには、`O.DBType`で指定すればよい。

```scala
def html = column[String]("html", O.DBType("LONGTEXT"))
```
Selenium-WebDriver に NoSuchElementErrorを出させない

`NoSuchElementError`がめんどくさいので概要の要素がなかったら`nil`を返すようにした。


```ruby
class Selenium::WebDriver::Driver
    def find_element(*args)
        super(*args)
    rescue Selenium::WebDriver::Error::NoSuchElementError
        nil
    end
end
```
Ginq でオブジェクトをグループ分けする

[Ginq](https://github.com/akanehara/ginq) は [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) の PHP 実装の一つ。とてもよい。
Ginq に限らず LINQ 系全般に通じる話です。

PHP で配列内のオブジェクトを条件によってグループ分けする、ということをたまにやりたい場面があります。Ginq では次のように書くことができます。

```php
// 例えばこんなクラスのオブジェクト配列があるとする
class EventSlate {
	/** @type string */
	public $date;
	/** @type string */
	public $title;

	public function __construct($date, $title)
	{
		$this->date = $date;
		$this->title = $title;
	}
}

$events = [
	new EventSlate('2014/10/15', '寿司駆動ハンズオン'),
	new EventSlate('2014/10/15', 'PHPもくもく会'),
	new EventSlate('2014/10/31', 'ハロウィンIT勉強会'),
	new EventSlate('2014/10/31', 'git push -f'),
	new EventSlate('2014/10/31', '仮装サーバ構築勉強会')
];

// ↑ を日付ごとにまとめてキーに日付を設定するには ↓ のようにする

$events_by_date = Ginq::from($events)
	->groupBy(function(EventSlate $es) {
		return $es->date;
	})
	->map(function(GroupingGinq $g) {
		return $g->toList();
	})
	->toArray();

print_r($events_by_date);
```

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

```
Array
(
    [2014/10/15] => Array
        (
            [0] => EventSlate Object
                (
                    [date] => 2014/10/15
                    [title] => 寿司駆動ハンズオン
                )

            [1] => EventSlate Object
                (
                    [date] => 2014/10/15
                    [title] => PHPもくもく会
                )

        )

    [2014/10/31] => Array
        (
            [0] => EventSlate Object
                (
                    [date] => 2014/10/31
                    [title] => ハロウィンIT勉強会
                )

            [1] => EventSlate Object
                (
                    [date] => 2014/10/31
                    [title] => git push -f
                )

            [2] => EventSlate Object
                (
                    [date] => 2014/10/31
                    [title] => 仮装サーバ構築勉強会
                )

        )

)
```

「オブジェクトをグループ化」というと `groupBy` が思い浮かびますが、検索しても「グループ化して集計」とか「グループ化して平均値を計算」とかばかりで、オブジェクトをそのままグループ分けして連想配列にする方法は見つかりませんでした。

要するに、`groupBy` という機能自体は `flatMap` の逆で、複数の集合のシーケンスを作成するものなんですね。さらに `groupBy` は自動的にキーを設定してくれるみたいで、とても使い勝手がよいですね。