OmniAICreator/Qiita-1.07M huggingface dataset:
SeleniumのセレクタでCSSに:containsは使えない？

# やろうとしたこと
* 以下のようなHTMLのページにSeleniumでブラウザ操作を試みた
* :containsを使ってCSSのセレクタで要素を指定したら以下のようなエラーがでたので記録
 * An invalid or illegal string was specified (Selenium::Webdriver::Erorr::UnknownError)

```html:sample.html
...
<a class='support' href='support/'>
  <h2>Support</h2>
</a>
...
```

```rb:features/step_definitions/sample_steps.rb
...
# エラーが出るコードの一部
find("a:contains('Support')").click
...
```

* CaoybaraのfindをCSSで要素指定してクリックするだけです
 * SeleniumIDEでセレクタのうっかりミスなどがないかは確認済

# 解析、そして結論
## はじめに
* どうしても疑似セレクタ:containsを使わないといけない場面は遭遇しないと断言できるため、深くは追っていません

## いや、そもそも使わなくていいでしょw
* ご丁寧に\<a\>タグにはclassもhrefもあるので、他の指定いくらでもできるます！
 * そうですよ、以下のように指定すればいいんです(けど、:containsで書きたくなったからなのですw)

```rb
# classで指定した全く問題ないの例
find("a.support").click

# hrefで指定した全く問題ないの例
find("a[href='support/']").click
```

## 解析
#### 1. まさかコロン(：)がだめ？？
* エスケープ？とか頭によぎったが、全く問題なかった。。
* :first-childは問題なく解釈されてる、コロンがだめなら同じように怒られるので

#### 2. click_linkではどうか
* 全く問題ない

```rb
click_link('Support')
```

#### 3. その他にも試したけど、結局あえて書くならこれかなという結論に

```rb
find("a", :text => 'Support').click
```

* 結局、:containsがただ単に非対応なんじゃないかなと。。予想
* ちなみに検証したcapybaraのバージョンは2.1.0
* 沢山ぐぐってみたけど、XPATHで回避するように促されている記事が多かった
* ここでは、私がCSSが好きなためだけにこのような無駄な抵抗をしてしまったorz... 
* 実際に、テストコード書くとしたならば、上記のようなご丁寧なHTMLが与えられていたとすると:containsなど使わない
 * (必要に応じてwithinと)click_linkで書くのが一番良いと思う
 * ついでに、要素指定にCSS,XPATHを両方ばらばらと使うと読みづらい

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Go の導入と Revel 導入手順

# 初めに
検証環境は Mac のみで、 brew コマンドが入っているのを前提に進めます。

# インストール
Homebrew が入っているのでそれを使ってインストールします。

```console
brew install go
```

次に revel のインストールで mercurial が必要なので、同時にインストールします。

```console
brew install mercurial
```

# 設定
まずは GOPATH という go の環境やアプリケーションが入るディレクトリを指定する必要があるようです。
.zsh-profile や .bashrc などに以下の記述を追加します。


```console
export GOPATH=~/Programming/go/
export PATH=\$PATH:$GOPATH/bin
```

※ ~/Programming/go を go のファイルを設置したい場所へ変更します。

# revel のダウンロード
公式にあるとおりにサンプルをダウンロードします。

```console
go get github.com/revel/cmd/revel
```

# revel サンプルアプリケーションを実行

```console
revel run github.com/revel/revel/samples/chat
```

これで、ブラウザで localhost:9000 にアクセスするとサンプルのチャットアプリケーションが実行されます。
PHPの$_GETと$_POST


## $_GET

*(PHP 4 >= 4.1.0, PHP 5)*

- $_GET -- $HTTP_GET_VARS [非推奨] — HTTP GET 変数
- URLパラメータで現在のスクリプトに渡された変数の連想配列です。
- リンク先のパスに「?」以降の内容
- [&]で複数受け渡し

## $_POST
*(PHP 4 >= 4.1.0, PHP 5)*

- $_POST -- $HTTP_POST_VARS [非推奨] — HTTP POST 変数
- HTTP POST メソッドで現在のスクリプトに渡された変数の連想配列です。
- フォームの名前に『[]』を使うと、PHP上では配列として格納される
- SQLインジェクションを防ぐが可能
nagiosのpassive checkとfreshness checkの組み合わせ

Nagiosでポーリングではなく外部トリガによるステータス変更をするにはpassive checkを使う。トリガによって異常状態にするだけならpassivce checkだけでよいが、トリガが来ている間は正常、来なくなったら異常状態、にするにはfreshness checkを組み合わせる。


```nagios.cfg
accept_passive_service_checks=1
check_service_freshness=1
service_freshness_check_interval=60
```

```service.cfg
define service{
       host                    hostname
       service_description     sample_service
       active_checks_enabled   0
       passive_checks_enabled  1
       check_freshness         1
       freshness_threshold     600
       check_command           send_alert!message
}
```

```commands.cfg
define command {
        command_name send_alert
        command_line $USER1$/check_dummy 2 $ARG1$
}
```
リアルタイム入力チェック exValidation 導入時に注意する点


# exValidation とは

リアルタイムで入力チェック（バリデーション）を付けられるjQueryプラグインです。

* ソースコード
https://github.com/5509/exValidation


* 使い方・紹介
http://blog.gti.jp/post-2586/
http://aver-ats.com/wordPress/jquery/exvalidation/


[jquery validation engine](https://github.com/posabsolute/jQuery-Validation-Engine) など、他にも優れたプラグインはありますが、exvalidation は日本人の方が作られたということで、全角チェックなど日本語まわりの処理が充実しています。

使い方はあまりに簡単なので、注意点からはじめます。

# 注意点

## サンプルソースコピペだと送信できない
github からダウンロードしたサンプルファイルのソースコピペで大抵動きますが、index.html のソースをコピペだと送信できない現象が発生します。

原因はページ下部のここ。

```index.html
<script type="text/javascript">
	var validation = $("form")
		.submit(function() {
			return false;
		})
		.exValidation({
			firstValidate: true,
			rules: {
				name: "chkrequired",
				kana: "chkrequired chkkatakana",
				//省略//
			},
			stepValidation: true
		});
	var selectable = $('#pref').selectable({
		callback: function() {
			validation.laterCall('#pref');
		}
	});
</script>
```

この中で、下のコードを消せば送信できます。

```
		.submit(function() {
			return false;
		})
```

## チェックボックス、ラジオボタンは span id="xxx" で囲む

入力ボックスには input type="xxxx" の値を下の箇所で指定すればチェックが効きます。

```
.exValidation({
            firstValidate: true,
            rules: {
                name: "chkrequired",
                kana: "chkrequired chkkatakana",
                //省略//
            },
```


ただ、チェックボックスとラジオボタンは type=""の値を指定してもチェックが動きません。

input の前後を、 span id="xxx" で囲み、xxxの値をscriptで指定します。id名は、typeの値と一致していなくても大丈夫です。

```
<span id="checkbox_chk">
								<label for="f1"><input type="checkbox" id="f1" name="fav" value="f1">books</label>
								<label for="f2"><input type="checkbox" id="f2" name="fav" value="f2">music</label>
								<label for="f3"><input type="checkbox" id="f3" name="fav" value="f3">game</label>
								<label for="f4"><input type="checkbox" id="f4" name="fav" value="f4">study</label>
								<label for="f5"><input type="checkbox" id="f5" name="fav" value="f5">fishing</label>
							</span>
```

```
.exValidation({
            firstValidate: true,
            rules: {
                name: "chkrequired",
                kana: "chkrequired chkkatakana",
				  checkbox_chk: "chkcheckbox"
                //省略//
            },
```


あと、カスタマイズはいろいろ出来るので試してみましょう。
軽くて非常に使いやすいです。
ggplot2で棒グラフを作る時に下のスペースをなくす

## 経緯
棒グラフを描くときは、下にスペースがない方がよいと思う。

## 方法
#### 最大値を直接入力する方法
```r
ggplot(mtcars, aes(x=as.factor(carb)))+
     geom_bar()+
     scale_y_continuous(expand = c(0,0), limits = c(0,10.3))
```

### 最大値を入力しない方法（でも汚い）
```r
ggplot(mtcars, aes(x=as.factor(carb)))+
     geom_bar()+
     scale_y_continuous(expand = c(0,0))+
     geom_blank(aes(y=1.1*..count..), stat="bin")
```

## 参考
- [r - ggplot2 bar plot, no space between bottom of geom and x axis keep space above - Stack Overflow](http://stackoverflow.com/questions/20220424/ggplot2-bar-plot-no-space-between-bottom-of-geom-and-x-axis-keep-space-above)
Yosemiteでbrewが壊れた


Yosemiteに上げたらbrewがこんなエラー吐くようになりました。

```
/usr/local/bin/brew: /usr/local/Library/brew.rb: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
/usr/local/bin/brew: line 23: /usr/local/Library/brew.rb: Undefined error: 0
```

どうやらYosemiteからrubyの1.8が消え去った模様で、下記のようにbrewの実行ファイルにあるrubyへのパスを1.8からcurrent変更してあげるといいみたいですね。

```/usr/local/Library/brew.rb(変更前)
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -W0
...
```

```/usr/local/Library/brew.rb(変更後)
#!/System/Library/Frameworks/Ruby.framework/Versions/current/usr/bin/ruby -W0
...
```

参考：http://stackoverflow.com/questions/24225959/how-to-get-ruby-homebrew-rvm-to-work-on-yosemite

## 追記 - brew updateできない

brewのupdateをしようとしたら上記編集したせいでupdateの途中で行われるリモートとのマージが出来ないと怒られたので、変更分をコミットする必要があるみたいです。

```
cd $(brew –repository)
git add .
git commit -m 'some comment' 
brew update
```

解決！
CentOS6.4 Perl RRDtool のインストール

CentOS6.4にmonitorixを入れるときに、RRDtool が読み込めなくて、インストールし直したら動いたのでメモ

## 1. monitorix を動かしてログ見てるみるとなんかエラー、パス通ってないエラーが出るので、とりあえず、これはパスを通した

```bash
$ service monitorix start
monitorix を起動中:             [  OK  ]
$ tail /var/log/monitorix
WARNING: unable to load module 'int'. Can't locate RRDs.pm in @INC (@INC contains: /usr/bin/lib /usr/lib/monitorix /usr/lib/perl5/vendor_perl/5.8.8 /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/lib/monitorix/int.pm line 26.
```

/usr/bin/monitorix の27行目あたりを修正

```pl
use lib $Bin . "/lib", "/usr/lib/monitorix";
```
↓↓↓

```pl
use lib $Bin . "/lib", "/usr/lib/monitorix", "/usr/lib/perl5/vendor_perl/5.8.8";
```

このあとに起動すると、また、エラーが...

```
Wed Oct 22 11:52:50 2014 - Nothing to do, exiting.
Wed Oct 22 11:57:34 2014 - Starting Monitorix version 3.6.0 (pid 13504).
Wed Oct 22 11:57:34 2014 - Loaded main configuration file '/etc/monitorix/monitorix.conf'.
Wed Oct 22 11:57:34 2014 - Initializing graphs.
/usr/bin/monitorix -c /etc/monitorix/monitorix.conf -p /var/run/monitorix.pid: symbol lookup error: /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/auto/RRDs/RRDs.so: undefined symbol: Perl_Tstack_sp_ptr
```

そもそもリンクがとか...。インストールされてるrpmを確認する。んで、別のパッケージないか探したら、標準のレポジトリにあったので、そっちに入れ直したら動いた、ってか、標準の方と rpmforge で違う名前でバージョンが違うし、el5向けだしで、まぁ、動かなくて当然なのかなと...

```bash
$ yum info perl-rrdtool
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.riken.jp
Available Packages
Name        : perl-rrdtool
Arch        : x86_64
Version     : 1.4.7
Release     : 1.el5.rf
Size        : 55 k
Repo        : rpmforge
Summary     : Perl RRDtool bindings
URL         : http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/
License     : GPL
Description : The Perl RRDtool bindings
```

CentOS6系でRRDtool動かない場合は、上の方をインストールしちゃってないか確認した方が良い。

```bash
$ yum info --disablerepo=rpmforge rrdtool-perl
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Installed Packages
Name        : rrdtool-perl
Arch        : x86_64
Version     : 1.3.8
Release     : 6.el6
Size        : 58 k
Repo        : installed
From repo   : base
Summary     : Perl RRDtool bindings
URL         : http://oss.oetiker.ch/rrdtool/
License     : GPLv2+ with exceptions
Description : The Perl RRDtool bindings
```
Heroku上でprebootを使ってRailsダウンタイムを無くす方法

ブログより転機
http://konyu.hatenablog.com/entry/2014/10/22/122930

git push でherokuにアップロードした場合、それなりに大きなRailsのアプリだと立ち上がりに数十秒〜数分かかってしまう

これを防ぐのがprebootだ。

ざっくり言うとN個Dynoがある場合、1個ずつ立ち上げてくれるので
ダウンタイムがなくなるというもの


### 正確ではないが内部の動作のイメージ

2台Dynoがあるとして

1. 新しいコードをPushした
1. Gracefullyに1台にアプリプロセスをKill
1. 1台に新しいコードを反映してアプリスタート
1. リスタート完了後ネットワークに繋ぎ直し

2台目以降も同様に順々にやっていく


###prebootの動作する前提条件
これを対象はDynoを2個以上であること

### 設定

prebootを付ける場合

```
heroku features:enable -a myapp preboot
```

prebootを外す場合

```
heroku features:disable -a myapp preboot
```

このprebootが有効な処理は以下のように設定のアプリのデプロイ、変更、再起動が出来る

* git push
* heroku config:add
* heroku restart


### 参考
Heroku Dyno再起動時の振る舞い
http://www.slideshare.net/shunjikonishi/heroku-dyno

Heroku Labs: preboot
https://devcenter.heroku.com/articles/labs-preboot

Zero downtime on Heroku
http://stackoverflow.com/questions/8326861/zero-downtime-on-heroku
oculus-bridgeの使い方


## oculus-bridge
oculus-bridgeはWebブラウザとOculusをつなぐApplicationです。
割と簡単にWebGLとOculusを連携してくれますが、専用アプリが必要なため、すこしだけ手間がかかります。

Github: https://github.com/Instrument/oculus-bridge
ここからもろもろcloneしてみてください。

## 必要なもの

- Oculus Rift
- WebSocketをサポートしているブラウザ
- BridgeApp   [Win](https://github.com/Instrument/oculus-bridge/blob/master/app/build/oculus-bridge-windows.zip?raw=true)/[Mac](https://github.com/Instrument/oculus-bridge/blob/master/app/build/oculus-bridge-osx.zip?raw=true)

## Sampleの動かし方
- BridgeAppをDLして開く
- Oculusをつなぐ
- BridgeAppのWebSocketとOculusのところが光っているのを確認。
- Sampleをローカルサーバーで開いたりする。

## 中身ってどうなってるん？
WebSocket++というライブラリでWebSocketサーバーを作っています。
それを、Cinderというフレームワークで操ってアプリ化しているようです。
ブラウザ側では、ただ、WebSocketの値を受け取ってイベント駆動させてるだけのようです。
「『クリックしたらツールチップを表示するスクリプト』をちょっと変えてみた。」をちょっと変えてみた。

[『クリックしたらツールチップを表示するスクリプト』をちょっと変えてみた。](http://qiita.com/mrd-takahashi/items/4f27927ced6275b16969)

* 自分だったらこう書く的な。

# まずはソースから

```html
<table class="clickToolTip">
<tr>
<th><!-- 変更点： aタグのクラスをclickToolTipAnkerに変更 -->
  <div class="tooltipWrapper">
  タイトル&nbsp;<a href="javascript:void(0);" class="clickToolTipAnker">?</a>
  <!-- 変更点： pタグをこの位置に。idは削除 -->
  <p class="toolTip invisible">"タイトル"の説明</p>
  </div>
</th>
<td><input type="text" name="title"></td>
</tr>

<tr>
<th>
  <div class="tooltipWrapper">
  メッセージ<a href="javascript:void(0);" class="clickToolTipAnker">?</a>
  <p class="toolTip invisible">"メッセージ"の説明<br />複数行の内容を<br />書くことも可能。<br /><br />複数行の内容を書くことも可能。<br />複数行の内容を書くことも可能。<br />複数行の内容を書くことも可能。<br />複数行の内容を書くことも可能。</p>
  </div>
</th>
<td><textarea name="message" rows="5" cols="30"></textarea></td>
</tr>
</table>
```

```js
$(function(){

	// ツールチップ表示処理 イベント自体はtableにセット。delegateでaタグ
	$('.clickToolTip').on('click', 'a.clickToolTipAnker', function(){
		var $this = $(this);
		//pタグは自分の親の子が持つp.tooltip
		var $p = $this.closest('.tooltipWrapper').find('.tooltip');

		// [?]の座標を取得
		var position = $this.position();
		var newPositionTop = position.top +10;				/* + 数値で下方向へ移動 */
		var newPositionLeft = position.left + 35;			/* + 数値で右方向へ移動 */

		// ツールチップの位置を調整
		$p
		.css({'top': newPositionTop + 'px', 'left': newPositionLeft + 'px'})
		.removeClass('invisible');
	});

    // 表示されたツールチップを隠す処理（ツールチップ領域以外をマウスクリックで隠す）
    $('html').on('mousedown', function(event){
        // イベント発生源である要素を取得（クリックされた要素を取得）
        var clickedElement = event.target;

        // 取得要素が"toolTip"クラスを持ってなかったら、ツールチップを非表示に
        if(!$(clickedElement).hasClass('toolTip')){
            $('p.toolTip').addClass('invisible');
        }
    });
});
```

# 変更点

* idによる指定ではなく、相対関係による指定に変更。

# メリット

* 項目が増えても~~コピペが~~作業がしやすくなる
* その都度idを振らなくても良くなる（名前考えるのめんどくさい）
* まとまりになっているので余所に移設しやすい

# デメリット

* 多分idによる走査の方が早い（体感では分からないと思うけど） 
* 記述量がちょっと増えた
メモ

<blockquote class="twitter-tweet" lang="en"><p>qiita のタイトルがアフィブログのタイトルみたいなのだらけになってて、お前ら本当に技術者なん？って気持ち。</p>&mdash; INADA Naoki (@methane) <a href="https://twitter.com/methane/status/524743830076006400">October 22, 2014</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" lang="en"><p>ノウハウ共有サイトなんだから、タイトル見ただけで、その記事を読めば何が分かるのかを分かるようにしろよ。</p>&mdash; INADA Naoki (@methane) <a href="https://twitter.com/methane/status/524744002893922304">October 22, 2014</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
【Facebook】ログインアプリでGraphAPI2.0利用申請してみた=>実験用アプリでは承認されない

# 概要

以前作っていた実験用のアプリ(v1.0)を使って、v2.0移行のための申請をしてみた。
実験用アプリはFacebookログインで登録すると、FacebookのユーザID、名前、自己紹介が表示されるだけのシンプルなもの。
何か権限を要求しないと申請できないので、自己紹介を取得できる"user_about_me"権限を付けた。

# 申請してみた

### 申請準備

最低限以下をしておく。

* Facebookアプリの設定 (設定しておかないと申請前のvalidationで弾かれる)
 * App Details > App Info > Long Description
 * App Details > Contact Info > Privacy Policy URL (アクセスできること)
 * App Details > Icons > Logo (App icon) (1024x1024ピクセル, 白背景はNG)
 * Settings > Basic > Site URL
 * Settings > Basic > Movile Site URL
* 申請に必要なものの準備
 * アプリのスクリーンショット4枚
 * 申請する権限がアプリになぜ必要かの説明 (英語, Google翻訳レベルでOK)
 * 申請する権限を使う手順 (英語, Google翻訳レベルでOK)
* Facebookのレビュー担当者向け準備
 * 担当者がアプリを触れるようにする (アクセス制限してれば解除しておく)
 * 担当者がアプリで使うテストユーザを準備する (実際にFbログインされる)

### 申請

1. アプリ管理画面 > Status & Review > Statusタブ > Submit Items for Approval > Start a Submissionをクリック
2. 立ち上がったダイアログから"user_about_me"を選択、Add Itemsをクリック
3. Items in Reviewタブにリダイレクトされる
4. ItemsからAdd Notesをクリックして、以下を埋める
 * 権限の必要性 (Please explain how you are using user_about_me to enhance a person's in-app experience.)
 * 権限の利用手順 (Please provide step-by-step instructions so our review team can reproduce how you are using user_about_me in your app.)
5. Test Userにテストユーザ名を入力
6. Screenshotsに準備したスクリーンショット4枚を貼る
7. Submit for Reviewをクリック
8. 電話番号と確認コードで認証する

申請するとAlertsに通知が来て、Status & ReviewのItems in Reviewに状況が報告される。

# 結果

平日夕方16時頃に申請して、深夜2時くらいに結果通知が来た。
結果は、非承認。
メッセージには、「テストアプリに見える。機能開発終わってから申請して」と。

![ng.png](https://qiita-image-store.s3.amazonaws.com/0/17647/c7962de2-2d7c-5905-3e4a-29cc3172455c.png)

どの程度かは分からないが、きちんとアプリを作らないと申請通りそうにないことが判明。

テストユーザであればv2.0の権限要求できるので、そちらでテストして、作り込んでから申請するしかなさそう。
yosemiteでapacheのvhost設定をする（ついでにRubyも動くようにしとく）


ほぼクリーンなyosemiteで、apacheを立ち上げてvhostも設定した時に最初にしたこと。

##まずは設定ファイルの場所

###apache設定ファイル
/private/etc/apache2/httpd.conf

###vhost用のインクルード設定ファイル
/private/etc/apache2/extra/httpd-vhosts.conf

###hostファイル
/private/etc/hosts


##やったこと
###vhosts.confを読み込み
httpd.conf499行目付近の

```
#Include /private/etc/apache2/extra/httpd-vhosts.conf
```
のコメントを外す

###vhostsの設定ファイルを編集
httpd-vhosts.confを編集する。最低限以下のような感じ？

```
# domainnameと/path/to/your/docs/は各自環境で読み替え

NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot "/path/to/your/docs/"
    ServerName domainnameA
    <Directory "/path/to/your/docs/">
        Require all granted
        DirectoryIndex index.html
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/path/to/your/another/docs/"
    ServerName domainnameB
    <Directory "/path/to/your/another/docs/">
        Require all granted
        DirectoryIndex index.html
    </Directory>
</VirtualHost>
```

ここ参考にさせていただきました。
http://blog.77jp.net/authz_coreerror-apache-2-4-error
http://www.adminweb.jp/apache/virtual/index2.html

###hostsを編集
```
127.0.0.1 localhost
# 以下を追記。domainnameは各自環境で読み替え
127.0.0.1 domainnameA
127.0.0.1 domainnameB
```


##で、apache再起動
```
sudo apachectl restart
```

##Ruby動かす
###モジュールの読み込み
httpd.conf157行目付近の

```
#Loadmodule cgi_module libexec/apache2/mod_cgi.so
```
のコメントを外す

###vhosts.confに以下を追記

```
    <Directory "/path/to/your/docs/">
        Require all granted
        #以下追記
        DirectoryIndex index.html index.rb
        Options +ExecCGI
        AddHandler cgi-script .rb
    </Directory>
```

同じくapache再起動は忘れずに。

---

すべて、「とりあえず動かす」レベルなので、必要な設定はそれぞれあとから追記すれば良いかなと。
inline要素を横並びにしてできる隙間を消す

要素をinlineにして横並びにすると、デザイン上、隙間が生まれます。原因は改行コードなので、HTMLで改行を行わなければいいのですが、コードの見栄え的によくありません。

また`<!-- -->`(コメントアウト)で改行による隙間を消すこともできますが、
こちらも見栄えとしてあまりいいとは思わないので、`letter-spacing`を使って消していきます。

## HTML

```html
<ul class="list">
    <li>aaa</li>
    <li>bbb</li>
    <li>ccc</li>
</ul>
```

## CSS

```css
.list {
    letter-spacing: -.4em;/*文字を詰める(隙間を消す)*/
}
.list > li {
    display: inline;
    letter-spacing: normal;/*文字間を元に戻す(隙間は消えたまま)*/
}
```

以上です。他にも色々な方法がありますが、個人的にはこれがベターかなと思いました。
gradleでコマンド結果をキャプチャする



```
"${実行するコマンド}".execute().text
```
でコマンド結果をキャプチャ出来る


## versionにgitのブランチ名を付与する例
```
def branch = "git rev-parse --abbrev-ref HEAD".execute().text.trim()
version = "1.0-" + branch.replaceAll('/','-').trim()
```

## ビルド時の最新コミットログをファイルに出力する
```
  task versionInfo(dependsOn: compileJava) {
      def buildrevision = new File("$projectDir/build_revision.txt")
      buildrevision.text = "git log -1 --decorate=full".execute().text
  }
```
gradleのインストール



## centos
```bash
sudo su - root

wget -N https://services.gradle.org/distributions/gradle-2.0-all.zip
unzip gradle-2.0-all.zip -d /opt/gradle
ln -sfn /opt/gradle/gradle-2.0 /opt/gradle/latest
printf "export GRADLE_HOME=/opt/gradle/latest\nexport PATH=\$PATH:\$GRADLE_HOME/bin" > /etc/profile.d/gradle.sh
```

* 最新バージョンは https://services.gradle.org/distributions/ で確認

## mac
```
brew update
brew install gradle
```

## インストールできてるか確認
```bash
gradle -v
```

## gvmを使う
```bash
curl -s get.gvmtool.net | bash
gvm list gradle
gvm install gradle
```

### gradleのversionを指定する
```bash
gvm install gradle 2.0
```

## 備考
* jenkinsで使う場合は [jenkinsプラグイン](https://wiki.jenkins-ci.org/display/JENKINS/Gradle+Plugin)を使うとインストールまで自動でやってくれる。
HTMLコーディングする時は、せめてこれだけやろう

#CSSを読込んでからJSを読込む

下のコードのコメントアウト辺りで読込む
これだけでもパフォーマンス向上！

```lang:HTML
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>タイトル</title>
<!-- CSSここで読込んで -->
</head>
<body>

ここにHTML書く

<!-- JavaScript body閉じタグの直前で読込んで -->
</body>
</html>
```

JavaScriptを`</body>`の直前で読み込み動かないライブラリなどがあれば、<head>タグ内へ移動。

#画像の容量を小さくする

PhotoshopなどからPNG画像を書き出したまま使わないで、せめてなにかツール使って容量を小さくする！

これとか
https://tinypng.com/


#まとめ

制作現場を見ていると何にも考えないでコーディングしているのを沢山みるので、ちょっと気をつけて欲しいな。と思ったり。
試してみてうまくいかなければ改善して行けば良いと思います。
POIでxlsxファイルのカスタムプロパティを操作する

プログラムから作成したxlsxファイルに同定用のデータをどうにか仕込んでおく必要があったので調べてみたら、Officeにはカスタムプロパティというメタデータを保存しておく仕組みがあったのでそれを使うことにした


POIからはこんな感じでアクセスできる

```java
public String test() throws Exception {
	XSSFWorkbook xssfWorkbook = (XSSFWorkbook) WorkbookFactory.create(new FileInputStream("hoge.xlsx"));
	
	// 値の設定
	xssfWorkbook.getProperties().getCustomProperties().addProperty("hoge", "fuga");
		// 値の取得
	for (CTProperty ctProperty : xssfWorkbook.getProperties().getCustomProperties().getUnderlyingProperties().getPropertyList()) {
		if (ctProperty.getName().equals("hoge")) {
			return ctProperty.getLpwstr();
		}
	}
	return null;
}
```

文字列取得メソッドは`getLpwstr`の他にも`getBstr`と`getLpstr`があるけど、[ここ](http://msdn.microsoft.com/ja-jp/library/s9ts558h(v=vs.110).aspx)を見る限りJavaから読み書きするならUnicodeの`getLpwstr`使えばよさそう
[Rails 4.x] ActiveAdmin をカスタマイズして、indexやshowでassociation関係のテーブルのカラムも表示させる

# アソシエーションの確認

```rb:app/models/product.rb
class Product < ActiveRecord::Base
  belongs_to :maker
end 
```

```rb:app/models/maker.rb
class Maker < ActiveRecord::Base
  has_many :products
end 
```

# indexページをカスタマイズ

以下を追記。

```rb:app/admin/product.rb
ActiveAdmin.register Product do
  index do
    selectable_column

    column :id do |product|
      link_to product.id, admin_product_path(product)
    end
    column :name do |product|
      link_to product.name, admin_product_path(product)
    end
    column :description
    column :maker do |product|
      if product.maker.present?
        link_to product.maker.name, admin_maker_path(product.maker)
      else
        status_tag('Empty')
      end
    end
  end
end
```


# showページをカスタマイズ

以下を追記。

```rb:app/admin/product.rb
ActiveAdmin.register Product do
  show do |f|
    panel "Subject" do
      attributes_table_for f, :id,:name,:description,:maker
    end
  end
end
```

# 参考

http://stackoverflow.com/questions/19326625/cant-display-in-active-admin-index-attribute-of-associated-model-belongs-to-ha

http://alfa.hatenablog.jp/entry/2014/08/17/224914
JavaでRDBデッドロック検出

http://cs.hatenablog.jp/entry/2013/07/09/234554
RDB操作でデッドロックは不可避です。ご確認ください。

DBでのデッドロックの発生は、直ちにシステムが停止することを意味しません。DBMSはデッドロック発生を検出してトランザクションを失敗させる機能を持っているからです。
アプリケーションの開発者がすべきことはただ一点、 **デッドロック検出時のリトライ** です。更新処理だけじゃないです。参照処理でも忘れちゃいけません。約束です。

Javaの場合デッドロック発生はコード的にどう検知すればいいかというと、SQLExceptionが内部にSQLSTATEというRDB共通のエラー番号を持っているのでこれで判別可能となっています。
SQLSTATEの一覧は日立さんのこのまとめが役に立ちます。拝承。
http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d635840/W3580048.HTM
デッドロック発生は **40001** ですね。

フレームワークによってはSQLExceptionでなくPersistenceExceptionを投げてきますが、大抵PersistenceExceptionは内部にSQLExceptionを抱えているので取り出して判定できます。

両方の場合の判別コードです。どうぞ。

```java
try {
    // 永続化操作
} catch (SQLException sqle) {   // SQLExceptionを投げるフレームワークの場合
    if ("40001".equals((sqle).getSQLState())) {
        // デッドロック
    }
    else throw sqle;
} catch (PersistenceException pe) { // PersistenceExceptionを投げるフレームワークの場合
    Throwable cause = pe.getCause();
    if (cause instanceof SQLException && "40001".equals(((SQLException)cause).getSQLState())) {
        // デッドロック
    }
    else throw pe;
}
```

デッドロック発生の場合はそういう例外を自前で作ってさらに投げ出した方がよさげですね。
パスワードを作るワンライナー

ワンライナー

```rb
ruby -e 'puts Array.new((ARGV[0] || 32).to_i){ rand(62) }.pack(%q!C*!).tr(%Q!\x00-\x3e!, %q!A-Za-z0-9!)'
```


実行結果
> % ruby -e 'puts Array.new((ARGV[0] || 32).to_i){ rand(62) }.pack(%q!C*!).tr(%Q!\x00-\x3e!, %q!A-Za-z0-9!)'
> DZjADuaVlU9kCKDwex1yZoyPi0TysMfT

.zshrcへ追加

```zsh
alias pw="ruby -e 'puts Array.new((ARGV[0] || 32).to_i){ rand(62) }.pack(%q!C*!).tr(%Q!\x00-\x3e!, %q!A-Za-z0-9!)'"
```

zsh経由で使う
> % pw 16
> SKZUBmGLAULN33IC
> % pw 32
> 5mit4kh5iyKDiZddd3DkLyFhPuCf0DnQ
> % pw 64
> 2R956EM9Sd08lVXYTkTlwlBECudScOitmw9Q6yC0qV8eXTfi4FmmHNS1xsPCAzWY
ペアプロの相手を決めるワンライナー


小ネタ。

```bash:
$ git shortlog --summary | cut -f 2 | shuf | paste - -
```

coreutils の shuf を使ってるので入れておいてください。
プロジェクト外れてたりお休みの方は `grep -v` とかで抜いてあげてください。
AndroidアプリのEditTextを含む画面でキーボードを非表示にする

Androidアプリで`EditText`がある画面では、画面を開いたときに`EditText`にフォーカスが当たり、ソフトウェアキーボードが表示されます。
画面の下のほうまで表示したい場合などにソフトウェアキーボードを表示しないようにするには、以下のような方法があります。

# EditTextからフォーカスをはずす
`TextView`などのほかのビューにフォーカスを当てます。
ビューの子要素に`requestFocus`タグを入れることで、アクティビティ表示時にそのビューがフォーカスされます。
この際、フォーカスを当てるビューに`focusable``focusableInTouchMode`をそれぞれ指定します。

```xml
<EditText
    ... />

<TextView
    ...
    android:focusable="true" 
    android:focusableInTouchMode="true"   
>
   <requestFocus /> 
</TextView>
```

※ [こちら](http://furudate.hatenablog.com/entry/2013/11/17/120529)で紹介されている方法と同様です。

ただし、`EditText`からフォーカスが外れるので、場合によっては目立たなくなったり、入力欄であることがわかりにくくなってしまうことがあります。
フォーカスを当てつつキーボードも表示しないようにするには、次のようにします。

# EditTextにフォーカスした状態でキーボードを非表示にする
`windowSoftInputMode`を指定することで、アクティビティ起動時のフォーカスでキーボードが表示されないようにすることができます。
これにより、`EditText`にフォーカスが当たっていて、ソフトウェアキーボードが表示されない状態にすることができます。
`AndroidManifest.xml`で設定しておく方法と、Javaのコードから指定する方法があります。

## AndroidManifest.xmlで設定する場合

```xml:AndroidManifest.xml
<manifest ... >
    <application
        ... >
        ...
        <activity
            android:name="hoge.MyActivity"
            android:windowSoftInputMode="stateAlwaysHidden" >
        </activity>
    </application>
</manifest>
```

## Javaのコードから指定する場合
※[こちら](http://y-anz-m.blogspot.jp/2010/05/android_17.html)で紹介されている方法と同様です。

```java:MyActivity.java
protected void onCreate(Bundle savedInstanceState) {  
  ...
  getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
  ...
} 
```

[こちら](http://ichrevo-se.jugem.jp/?eid=11)の説明では`setContentView`の前に実行しなければ有効にならないと記載されていますが、手元で試したところではそうでなくても有効にすることができました。
（Android4.4.2で確認しました）

* * *
ソフトウェアキーボードの表示/非表示は[adjustment option](http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#softInputMode)とも併用可能です。
例えば、`adjustResize`を同時に設定する場合は、
`AndroidManifest.xml`で設定する場合は

```xml
android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
```

Javaのコードから指定する場合は

```java
getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
```

のようにすると適用できます。

* * *

※ 以下のサイトを参考にしました（文中のリンクと同じです）
・[【Android】画面起動後にフォーカスを当てるViewを指定するのと指定した文字の後にカーソルを移動する - Furudateのブログ](http://furudate.hatenablog.com/entry/2013/11/17/120529)
・[Activity起動時にEditTextのソフトウェアキーボードを表示しない方法 | ichRevoのブログ](http://ichrevo-se.jugem.jp/?eid=11)
・[Y.A.M の 雑記帳: Android　自動でソフトキーボードが出るのを防ぐ](http://y-anz-m.blogspot.jp/2010/05/android_17.html)
・[WindowManager.LayoutParams | Android Developers](http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#softInputMode)
[Rails 4.x] タイトルをページごとに動的に表示させる方法

いろんなやり方がある様ですが、とりあえずひとつうまくいったやりかたです。

# レイアウト

各レイアウトに以下の様に記載。

```erb:app/views/layout/application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title><%= yield(:title) %> | <%= Settings.service.title %> <%= Settings.service.name %></title>
```

# view

各viewに以下の様に記載。

```erb:app/views/*/*.html.erb
<% content_for :title do %><%= Settings.title.hoge %><% end %>
```

# 定数管理

これはいろいろなやり方があります。
今回はrails_configを使います。

## rails_config

以下を追記

```rb:Gemfile
# constant value, settings
gem 'rails_config'
```

```rb
$ bundle install
```

```rb:config/settings.yml
service:
  name: "hoge"
  title: "hogehoge"
```

# 参考
http://railstutorial.jp/chapters/static-pages.html
http://blog.44uk.net/2012/09/09/rails-gem-for-static-variables/
Apacheのログレベルを変更

> AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error.
> Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

こんなのが出たので調査。

```diff:
  <VirtualHost *:80>
      ServerName demo
      DocumentRoot "/srv/demo/"
      ServerAdmin root@localhost
      CustomLog logs/access.log common
      ErrorLog logs/error.log
+     LogLevel debug
  </VirtualHost>
```

/var/log/httpd/error.log にログが出力される。
Mavericksの通知を無効にして、ナビゲーションバーからアイコンを消す方法

# ターミナルで一発

ターミナルを開いて以下のコマンドを打てば解決。

```
$ launchctl remove com.apple.notificationcenterui.agent
```

# 元に戻すには

再起動をすると元に戻ります。

# なお

Yosemiteではうまく行きませんでした。 (2014/10/22)
LC_ALL指定の sort がMacOSXで機能しない件

LANGUAGE, LC_ALL, LC_*, LANG というロケール関係の環境変数があります。LANGUAGEはgettextの翻訳選択で主に活躍するだけなので、sortに影響をあたえるのはそれ以外。

LC_ALLとsortの挙動についてなんとなく書きます (正確にはLC_COLLATEを使うのが良いのかもしれませんが、あまりそこまで考えず)```locale -a``` でen_US.UTF-8がある前提でUbuntu 12.04 LTSでソートをしてみます。

```
> sort --version
sort (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.
>  echo "a\nb\nA\nB" | LC_ALL=en_US.UTF-8 sort
a
A
b
B
> echo "a\nb\nA\nB" | LC_ALL=C sort
A
B
a
b
```

man sortでも「バイト順でソートすんならLC_ALL=Cしろよー」と書いてありました。

で、このロケールに応じたcollationを使うソートなんですが、何故か自分のMacOSXだと動作しません。Yosemite (10.10) での結果を見てみます。

```
> sort --version
sort (GNU coreutils) 5.93
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.
> echo "a\nb\nA\nB" | LC_ALL=en_US.UTF-8 sort
A
B
a
b
```

sortが古いかな―、と思ってcoreutilsをmakeだけした場合 (./configure; make)

```
> src/sort --version
sort (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.
> echo -e "a\nb\nA\nB" | LC_ALL=en_US.UTF-8 src/sort
A
B
a
b
```

あら。

```
> ls -l /usr/share/locale/en_US.UTF-8/LC_COLLATE
lrwxr-xr-x  1 root  wheel  28 Oct 20 07:37 /usr/share/locale/en_US.UTF-8/LC_COLLATE -> ../la_LN.US-ASCII/LC_COLLATE
```
ふぁっ？

関連: http://postgresql.1045698.n5.nabble.com/Collate-order-on-Mac-OS-X-text-with-diacritics-in-UTF-8-td1912473.html


ICUが入ってないわけじゃないみたいなんですが、どういう挙動なんでしょうかね。気になります。
CentOS7でCakePHP2.5を動かす

## Apache設定

CakePHPが.htaccessでmod_rewriteを使うので以下修正。

```diff:/etc/httpd/conf/httpd.conf
  <Directory "/var/www/html">
  ...
- AllowOverride None
+ AllowOverride All
  ...
  </Directory>
```

```bash:
httpd -S
systemctl restart httpd
```

## CakePHPダウンロード

```bash:
cd /var/www/html
wget https://codeload.github.com/cakephp/cakephp/zip/2.5.5
unzip 2.5.5
cd cakephp-2.5.5
git clone https://github.com/cakephp/debug_kit.git app/Plugin/DebugKit
```

```bash:
cp app/Config/database.php{.default,}
sudo chown -R apache:apache .
```

## Security値変更

```diff:app/Config/core.php
- Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
- Configure::write('Security.cipherSeed', '76859309657453542496749683645');
+ Configure::write('Security.salt', 'DYHG93B0QYJFIXFS2GUVOUUBWWVNIR2G0FGAC9MI');
+ Configure::write('Security.cipherSeed', '74968364576859309657453542496');
```

* 書き換える。

## Database接続設定

```php:app/Config/database.php
class DATABASE_CONFIG {

        public $default = array(
                'datasource' => 'Database/Mysql',
                'persistent' => false,
                'host' => 'localhost',
                'login' => 'root',
                'password' => '',
                'database' => 'test',
                'prefix' => '',
                'encoding' => 'utf8',
        );
}
```

## DebugToolbarを表示させたい場合

```diff:app/Config/bootstrap.php末尾に追加
+ CakePlugin::load('DebugKit');
```


```diff:app/Controller/AppController.php
  class AppController extends Controller {
+ 	public $components = array('DebugKit.Toolbar');
  }
```

## E_STRICTが表示されるのを抑止

* php5.4からerror_reportingが[E_STRICTも出すようになった。](http://php.net/manual/ja/function.error-reporting.php)
* CakePHPはフレームワーク内でerror_reportingを設定しているため、php.iniではなく以下で設定する。

```diff:app/Config/core.php
  Configure::write('Error', array(
      'handler' => 'ErrorHandler::handleError',
-     'level' => E_ALL & ~E_DEPRECATED,
+     'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
      'trace' => true
  ));
```

参考: [CakePHP2.xとPHP5.4でStrict Errorが出た場合の対処法](http://blog.photosynthesic.jp/2013/03/cakephp2-x%E3%81%A8php5-4%E3%81%A7strict-error%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/)
CakePHP3メモ


* デバッグログを取る

http://book.cakephp.org/3.0/en/core-libraries/logging.html#writing-to-logs

```php
use Cake\Log\Log;

Log::write('debug', print_r($result, true));
```



* 手っ取り早くオブジェクトの時間を生成

http://book.cakephp.org/3.0/en/core-libraries/time.html#Cake\I18n\Time

```php
use Cake\I18n\Time;

new Time('2014-10-05 01:59:14');
```

=> Cake\I18n\Time Object になる

* ハイドレートって何？

http://book.cakephp.org/3.0/en/orm/query-builder.html#disabling-hydration

Cake3のモデルだけど、
*注：以下はすべてコントローラ(ReportsController)に書く想定です。*

```php
$query = $this->Reports->find();
```

こういう書き方でクエリーオブジェクトなるものが作られる。

```php
debug($query = $this->Reports->find());
```

こうするとなんか黄色い画面になって生成されるクエリーが確認できる。

```php
$query->all();
```


と書けばSQLが実行される。

```php
$results = $query->all();
foreach ($results as $result) {
	echo $result->id;
	echo $result->created;
}
```

とすれば取り出せる。


```php
$query = $this->Reports->find();
foreach ($query as $result) {
	echo $result->id;
	echo $result->created;
}
```

こう書いてもおんなじ（笑）。`all()`は省略可能ってことか。

```php
$query->combine('id', 'name')->toArray();
```

こうすると

```php
Array ( [1] => yamada [2] => maeda ) 
```

というように、idと値で配列にしてくれる。

で、

```php
$query = $this->Reports->find();
```

このクエリーオブジェクトってのは

```php
$query->toArray();
```

こうすることで配列に変換できる。
できるんだけど、なんかいろんな情報が一緒に詰まっていて見づらいし、よくわからない。
で、

```php
$query->hydrate(false);
```

こうすると不要な情報が消えてすっきりするのだ。

```php
$result = $query->hydrate(false)->toArray();
```
CentOS7にZabbix2.2をインストール

# OSセットアップからZabbixServer動作までのAnsible作った

* https://github.com/tukiyo/setup_centos7

# zabbixの利点

* nagiosよりzabbixのインストールが簡単。
* グラフ描画が優秀
* WebUIが操作の前提なので、WebUIからなんでもできるはず

# epelリポジトリを追加

zabbixはepelリポジトリで提供されているので追加する。

```bash:
yum install epel-release
```

# zabbixインストール

* httpd, php, mariadb-serverを事前にインストールしておくこと。

```bash:
yum install zabbix22 zabbix22-web zabbix22-agent zabbix22-server
```

```mysql:
create database zabbix character set utf8 collate utf8_bin;
grant all on zabbix.* to 'zabbix'@'localhost' identified by 'zabbix_password';
```

```bash:初期データの投入
mysql -uzabbix -pzabbix_password zabbix < /usr/share/zabbix-mysql/schema.sql
mysql -uzabbix -pzabbix_password zabbix < /usr/share/zabbix-mysql/images.sql
mysql -uzabbix -pzabbix_password zabbix < /usr/share/zabbix-mysql/data.sql
```

/etc/zabbix/zabbix_server.conf に追記

```diff:/etc/zabbix/zabbix_server.conf
  # DBPassword=
+ DBPassword=zabbix_password
```

/etc/httpd/conf.d/zabbix.conf 末尾に追記

```diff:/etc/httpd/conf.d/zabbix.conf
+ php_value max_execution_time 300
+ php_value post_max_size 16M
+ php_value max_input_time 300
```

```bash:
systemctl restart zabbix-agent
systemctl enable zabbix-agent
systemctl restart zabbix-server-mysql
systemctl enable zabbix-server-mysql
systemctl restart httpd
```

## 公式マニュアル

* [4. クイックスタート [Zabbix Documentation 2.2]](https://www.zabbix.com/documentation/2.2/jp/manual/quickstart)

# 画面キャプチャ

## WebUI

http://IP/zabbix にアクセスすると以下画面が表示される。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/33aec285-09bf-b9b4-4e18-9486ca269db2.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/82eb2634-7f82-c4be-f70e-62cea0179038.png)

* /etc/httpd/conf.d/zabbix.conf で修正。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4ee2b348-2663-a6ba-ef47-dba4c585df3b.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b7f7178f-ea8e-3f3e-abac-e8ab57d253b0.png)

![5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/afbc03e6-3c20-0313-a123-13489dea19b5.png)

![6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/069a20d8-4ca4-aae3-b50e-6248d1e61e03.png)

* /etc/zabbix/web/zabbix.conf.php が生成される。DBの接続情報が記載されている。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7851055b-20c7-89a2-f7fc-e4ee72392a4e.png)

Admin : zabbix でログイン。

## 監視有効

![8.1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3b86667e-80cf-9983-b084-db88c7659ab6.png)

* Not Monitoredをクリックし有効にする。

![8.2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/01e00f4d-5cc7-9985-1178-d3fcd49bb578.png)
dansguardian+squid+iptablesでコンテンツ・フィルタ

なんとか形になったので、投稿しときます。
dansguardian+squid+iptablesを使って、1台のPC内でコンテンツ・フィルタを実現させてみました。構築した環境は、Archlinux、i686ですが、多分他のディストリビューションでも同様に構築できます。
[squid](http://www.squid-cache.org/)って何？ とか、[dansguardian](http://dansguardian.org/)って何？ とか、[iptables](http://linuxjm.sourceforge.jp/html/iptables/man8/iptables.8.html)って何？ とかの場合はググってください。

# 対象者
* これ見てる人
* 検索した人
* 興味持った人

# 手順
1. squidのインストール
2. dansguardianのインストール
3. squidの設定
4. dansguardianの設定
5. iptablesの設定
6. dansguardian、squid、iptablesの起動

# 1. squidのインストール
archlinuxの場合は、squidはcommunityリポジトリに含まれているので、以下のコマンドでインストールできます。
`[root@localhost]# pacman -S squid`
# 2. dansguardianのインストール
dansguardianは、[AUR](https://wiki.archlinux.org/index.php/Arch_User_Repository_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29)リポジトリに含まれているので、事前に[yaourt](https://wiki.archlinux.org/index.php/Yaourt)をインストールしておくと、以下のコマンドでインストールできます。
`[user@localhost]$ yaourt -S dansguardian`
# 3. squidの設定
設定ファイルは今回は特に変更していません。
# 4. dansguardianの設定
以下の2つの設定ファイルを変更しています。
フィルタしたい言語に合わせて修正します。

```sh:/etc/dansgurdian/dansguardian.conf
# language to use from languagedir.
#language = 'ukenglish'
language = 'japanese'
```

systemdを使っていなければ修正しなくても良いです。

```sh:/lib/systemd/system/dansguardian.service
# 以下をコメントアウト
#Environment=LD_LIBRARY_PATH=/opt/pcre-old/lib
```

# 5. iptablesの設定
ここが苦労しました。
1行目：squidが外部URLへアクセスできるように
2行目：dansguardianの実行ユーザID以外は、一旦8080へリダイレクト

```sh:/etc/iptables/iptables.rules
-A OUTPUT -o [1] -p tcp --dport 80 -m owner --uid-owner [2] -j ACCEPT
-A OUTPUT -o [1] -p tcp --dport 80 -m owner ! --uid-owner [3] -j REDIRECT --to-ports 8080
```
[1]：NIC(eth0とか、wlan0とか)
[2]：squidの実行ユーザID(proxyとか)
[3]：dansguardianの実行ユーザID(nobodyとか)

# 6. dansguardian、squid、iptablesの起動
systemdなので以下で起動させます。
`[root@localhost]# systemctl start dansguardian squid iptables`
# フィルタ対象になりそうなURLへアクセス
お好みで。
# 最後に
1. コンテンツ・フィルタを有効にしてQittaにアクセスすると、弾かれますのでご注意を。dansguardianの設定ファイルを変更することで回避できるかもしれません。
2. HTTPSでのアクセスは考慮していません。
3. 内容に漏れ、間違いがあるかもしれません。その際は報告いただくとありがたいです。
[Emacs] MacOSでEmacsを使うときは、バックスラッシュにご注意 & Emacs で[?¥]は使うな

問題
====

[以前書いた記事](http://qiita.com/aKenjiKato/items/4ac7d9b100bdce0b8920)で、Emacsでバックスラッシュが入力できない問題に対処しましたが、文字コードの問題でファイルを開いた時に化けてしまいました。

> Cocoa Emacsでは、通常Option + ¥では/を入力できません。
> ¥に対するキーアサインをいじって、/を入力するようにします。
> 
> ```el
> (define-key global-map [?¥] [?\\])  ;; ¥の代わりにバックスラッシュを入力する
> ```
> (...)
> **上記コードをコピペしたときに意図通り動くかどうかは未確認です**
> 念の為、円マークとバックスラッシュはEmacs以外のところでそれぞれ打ち込んでからyankしたほうが安全です。

`[?¥]` の部分の文字コードの解釈がUTF-8以外のものと解釈してしてしまうことがあったりなかったりするようです。
行頭に`coding: utf-8`を書けばよいのですが、たかだか1文字のためにそれも面倒。

解決方法
========

**こうしたらASCIIの範囲に収まって、化けて困ることがなくなりました。**

```el
(define-key global-map [165] [92]) ;; 165が¥（円マーク） , 92が\（バックスラッシュ）を表す
```

¥に限らず、UTF-8の範囲にある文字にキーをバインドする場合、`C-x C-e`でキーコードを調べて置き換えるといいでしょう。
MacOSX Yosemite(10.10) にアップグレードしてから rbenv install が使えなくなった時の対策

# 対象の読者層

    「…特に整理したりするコトもせず、とりあえず MaxOSX アップデートしたら rbenv で欲しいバージョンの ruby がインストールできなくなった…」
とかになっちゃった人（著者がそう）への対応方法です。一応、最近版の **Ruby 2.1.3** は使えるようになりました。

# 手順

1. **Apple Store** から **XCode6.1** をインストール
2. **[Apple Developer Center](https://developer.apple.com/downloads/index.action)** から **"Command Line Tools (OS X 10.10) for Xcode - Xcode 6.1"** をダウンロード
3. pkg ファイルから **Command Line Tools** をインストール
4. いつも使っているシェルに`$ echo $CC`して、現状のCコンパイラの指定を確認
5. `$ export CC=cc` に更新する
6. 以上の手順を済ませてから `$ rbenv install 2.1.3` で完了

## 1. Apple Store から XCode6.1 をインストール
![スクリーンショット 2014-10-22 03.18.47.png](https://qiita-image-store.s3.amazonaws.com/0/1928/ba83144b-85b6-3bfe-887a-f09515a26c23.png)
日本では Yosemite のリリース時に AppleStore では **XCode6.0.1** しかダウンロードできなくなっていましたが、これを執筆している現在では、普通にダウンロードできます。
**!!3GBほどある巨大なディスクイメージ!!**なので、職場では落とさないようにした方が、方々に迷惑をかけないと思います。
やるならば、NASなどにdmgファイルを置いておいて、各自そこからインストーラを起動させるなどにしましょう。


##2. [Apple Developer Center](https://developer.apple.com/downloads/index.action) から Command Line Tools をダウンロード

![スクリーンショット 2014-10-22 03.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/1928/6a184543-70bc-f599-a312-202a11a653d7.png) 

## 3. .pkg を開封してインストール
普通に入れます。
これで、OSアップデート後に「微妙にどうなっちゃったんだかわからない gcc だったりの Merverics 以前の Command Line Tools など」を忘れて取り組めます

## 4 シェルの環境変数の `CC` がどうなっているかチェック
```shell-session
$ echo $CC

$ #⤴ 設定されてなかった
```
自分の場合は大きくはここで引っかかっていました。Yosemite で消えたのか、Maverics までは指定しなくても上手くいってたのかまでは調べていません。

## 5 環境変数に `export CC=cc` に更新する。
これ、`PATH` が `/usr/bin/` 入ってれば上記の書き方でOKです。
現在の MacOSX の cc は clang に symlink が貼られており、
好みがあるのであれば　CC=gcc や CC=clang としても大きな違いはないものと思われます。

理由は、それぞれの中身がこんなんだからです

![スクリーンショット 2014-10-22 04.02.17.png](https://qiita-image-store.s3.amazonaws.com/0/1928/4e0b271a-e3ea-e6fe-72c9-2b34872ab81e.png)

Command Line Tools でインストールされた gcc や g++ は実質オプションが付いて起動された clang のエイリアスになっている模様です

## 6. おまたせ。好きな Rubyのヴァージョンをインストールするが良い
これで、Yosemite にアップグレードする以前に入れ忘れた 2.1.3 などもビルドしてインストールするコトができるようになります。


# 参考リンク

## 気になったら見に行こう
- [Issues・Homebrew/homebrew](https://github.com/Homebrew/homebrew/issues?q=is%3Aopen+is%3Aissue+label%3Abug)
- [Issues・sstephenson/rbenv](https://github.com/sstephenson/rbenv/issues?q=is%3Aopen+is%3Aissue)
- [Apple Developer Center](https://developer.apple.com/downloads/index.action)

## GitHub で挙がってた Issue など
- [Cannot install Ruby 2.1.2 on Yosemite Beta](https://github.com/sstephenson/rbenv/issues/610)
- [Need to prevent MRI from using gcc-4.2 on Yosemite](https://github.com/sstephenson/ruby-build/issues/651)
- [Nokogiri error: Libiconv missing on mavericks #1111](https://github.com/sparklemotion/nokogiri/issues/1111#issuecomment-48018063)

## Qiita 上であった似たような話題
- [Yosemite(beta) + homebrew + rbenv + ruby + nokogiri](http://qiita.com/kti-sxb/items/bf058a81c5af4cd3987b)
- [Yak shaving in Yosemite](http://qiita.com/naoya@github/items/8793fe9227f2b144b1ff)
- [OS X YosemiteでYou have to install development tools first.と言われnokogiriのインストールに失敗する場合](http://qiita.com/cutmail/items/47bdcc8a0e10cb4348b6)
PHPで都道府県を扱うときの意外な大はまりポイント

数年前にPHPで大はまりしたことを思い出したので、書いてみます。

それは都道府県を扱うプログラムで、都道府県のリストが設定ファイルにPHPで記述されていました。

```php
$prefectures = array(
  01 => '北海道',
  02 => '青森県',
  03 => '岩手県',
  04 => '宮城県',
  05 => '秋田県',
  06 => '山形県',
  07 => '福島県',
  08 => '茨城県',
  09 => '栃木県',
  10 => '群馬県',
  11 => '埼玉県',
  // ...
);
var_dump($prefectures);
```

左の数字はJIS規格やISO規格に定められている都道府県コードで、規格として書くときは一般に０埋めされています。

例：
http://www.shift-the-oracle.com/etc/database/jis-x-401.html

これをそのまま整形してプログラムにしてしまったところに落とし穴がありました。

まず、PHPでは0から始まる数字は８進数になります。これはご存じの方が多いと思います。

しかし、8進数として正しくない文字が来た場合には **エラーにも警告にもならず単に無視される** というのは意外な仕様ではないでしょうか。（Perl, PythonやC言語などではエラーになります。）

マニュアルにも記述はあります。
http://php.net/manual/ja/language.types.integer.php

ここまで来ると、どういうことになるかわかると思います。

結果は、このようになります。

```
array(10) {
  [1]=>
  string(9) "北海道"
  [2]=>
  string(9) "青森県"
  [3]=>
  string(9) "岩手県"
  [4]=>
  string(9) "宮城県"
  [5]=>
  string(9) "秋田県"
  [6]=>
  string(9) "山形県"
  [7]=>
  string(9) "福島県"
  [0]=>
  string(9) "栃木県"
  [10]=>
  string(9) "群馬県"
  [11]=>
  string(9) "埼玉県"
}
```

茨城県が消失し、栃木県が黙って０になります。エラーにも警告にもNoticeにもなりません！

怖いですね。

都道府県のリストを書くときは、０埋めするのはやめましょう！
Write Fast Ruby

Fast Ruby :dash: :dash: :dash: :rocket:
=======================================

In [Erik Michaels-Ober](https://github.com/sferik)'s great talk Writing Fast Ruby: [Video @ Baruco 2014](https://www.youtube.com/watch?v=fGFM_UrSp70), [Slide](https://speakerdeck.com/sferik/writing-fast-ruby), he presents us many idioms that leads to Faster Ruby. He inspired me and I want to document these to let more people know. I try to link to real commit for people to see this can really benefits in real world. **But this does not mean you can always replace one with another, depends on the context (e.g. `gsub` versus `tr`). :warning: Use with caution!**

Each idiom has a corresponding code example resides in [code](code).

All results :running: with Ruby 2.2.0-preview1 on OS X 10.9.4. Your results may vary but you get the idea. : )

**Let's write faster code, together! <3**

:two_men_holding_hands: :two_women_holding_hands: :two_men_holding_hands: :two_men_holding_hands: :two_women_holding_hands: :couple: :two_women_holding_hands: :two_men_holding_hands: :two_women_holding_hands: :couple: :two_men_holding_hands: :couple: :dancers: :couple: :two_men_holding_hands: :two_men_holding_hands: :two_men_holding_hands: :two_men_holding_hands: :couple: :two_men_holding_hands: :two_women_holding_hands: :two_women_holding_hands: :couple: :couple: :two_men_holding_hands: :two_women_holding_hands: :two_men_holding_hands: :dancers: :couple:

[Read More Here](https://github.com/JuanitoFatas/fast-ruby)
Rubyメタプロあれこれ1

rubyのメタプロに関するまとめ
## 特異メソッド
特定のオブジェクトに特化したメソッドの事を特異メソッドという。以下例。

```ruby:hoge_test.rb 
hoge = "abc"

def hoge.moji?
  self.upcase == self
end

hoge.moji?  # => false
```

この場合のselfはhogeにあたる。

## クラスメソッドの正体

上記、特異メソッドの形はクラスメソッドの形に似ていないだろうか？

```
def hoge.moji?; end
def MyClass.moji?; end
```

結論から言えば、クラスメソッドはクラスの特異メソッド。
クラスの中でのself（特定のオブジェクト）は、クラス自身になる。
なので、以下のように書ける。

```
class MyClass
    def self.moji?
    end
end
```

##特異クラス

オブジェクトのクラスを参照するにはObject#classで参照できる。しかし、見えているクラスとは別にRubyは裏に特別なクラスを持っている。それが、オブジェクトの特異クラスである。

Object#classでは特異クラスを隠されてしまうので、スコープに入れない。そこで、classキーワードを使った特別な構文があり、特異クラスのスコープに入る事ができる。

```
class << obj
   #メソッドなど定義
end
```

rubyの入門書などにクラスメソッドの書き方として目にすることがあるが、
これは、特異クラスに特異メソッドを書いている事になる。

```ruby:tokui_test.rb
class MyClass
    class << self
        def method_1; end
    end
end

```


上記、コードはクラスMyClassの特異クラスに特異メソッドを定義という意味。

つまり、***クラスの特異クラスにメソッドを定義する事は、クラスメソッドを定義したことと同じ意味ということ***



また、特異クラスのある場所は、特異メソッドが存在するオブジェクトにある。継承チェーンとしては以下のようになる。

```
オブジェクト->オブジェクトの特異クラス->オブジェクトのsuperclass
->Object
```

##クラス拡張とオブジェクト拡張(include,extend)
オブジェクトやクラスの拡張として、include,extentdがよく用いられる。
その例を示す。

例としてクラスにモジュールからクラスメソッドを拡張する。
includeとextendを使用するがどちらも同じ意味になるが、
includeの例をより簡単にしたのがextend。

```kakucyo_test.rb
module MyModule1
	def hoge1
		'hello'
	end
end

class Booo
	class << self
	    include MyModule1
	end
end

class Waaaa
	extend MyModule1
end

p Booo.hoge1   # => "hello"
p Waaaa.hoge1  # => "hello"

```

includeは特に説明はしない。extend(Object#extend)は、
レシーバーの特異クラスにモジュールをインクルードするための
ショートカットである。この場合のレシーバーはself（Waaa自身)。

##フックメソッド

特定のイベントをフックとしてRubyから呼び出されるメソッド

```
・Class#inherited #クラスが継承されたときに呼ばれる
・Object#initialize #オブジェクトを作成（new）するとき呼ばれる。
・Module#included #インクルードされたあとで呼ばれる。

```

例えば、Module#includedをオーバーライドすれば、モジュールの
ライフサイクルにプラグインできる

```ruby:fook_test.rb

module MyModule
	def self.included(base)
		puts "MyModule　は #{base} にミックスインされました"
      # baseには呼び出したオブジェクト(この場合はMyClassが返ってくる）
	end
end

class MyClass
	include MyModule
end

実行結果 # => MyModule　は MyClassにミックスインされました
```

この技術はRailsのActiveRecordでも使用されている。
以下ソース抜粋

```ruby:validation.rb
module ActiveRecord
	module Validation
		def self.included(base)
                   #クラスメソッドの定義
			base.extend ClassMethods
			base.class_eval do
				~~
				~~
			end
			base.send :include, ActiveSupport::CallBacks
		end

		module ClassMethods
			def validates_each(*args)
				....
			end
		

```

上記を簡単に説明するとActiveRecord::Validationがどこかでインクルードされたらフックメソッドincludedが呼ばれ、base.extendでクラスメソッドを定義。さらに、includeしたクラスに動的ディスパッチを使用して、ActiveSupport::CallBacksをインクルードさせている。


なお、base.include ActiveSupport::CallBacksとは書けない。
理由はModuleクラスのprivateメソッドのため。
bochs(on Mac OS)でxv6を起動する。

環境構築
-------

　・Mac OS Lion
　・bochs 2.6.6

bochsのソースコードをgdbで検証するため，ソースコードからコンパイルする。GUIを適切に設定する必要があるため，configureで以下の指定を行う。

```
$./configure LIBS="-L/usr/X11R6/lib -L/usr/X11/lib" X_PRE_LIBS="-lX11" --with-term --with-x11 --enable-e1000 -enable-pnic --enable-ne2000
```

上記の設定により，ターミナル(curse)もしくは，Xサーバを有効にできる。有効にするには，.borchrcファイルで以下のように指定する。

```
display-library: term #ターミナルで起動
display-library: x    #Xサーバで起動
```

また，XV6のイメージファイルを以下のように設定する。

```
ata0-master: type=disk, mode=flat, path="xv6.img", cylinders=1, heads=1, spt=1
ata0-slave: type=disk, mode=flat, path="fs.img", cylinders=1, heads=1, spt=1
```

bochsのソースツリーは，モジュールごとに階層化されているので，gdbでステップ実行するには./configureで生成された各ディレクトリのMakefileのCXXFLAGSに"-g"を追加する。


参考
------

電源投入後のBIOSの動作が詳細に記載
http://park12.wakwak.com/~eslab/pcmemo/boot/index.html

BIOS命令で画面出力させる方法が詳しく記載
http://softwaretechnique.jp/OS_Development/bootloader1.html