OmniAICreator/Qiita-1.07M huggingface dataset:
vim,iTerm2で★とか■とか※とかがずれるのでなんとかした

今までそんなに気にしてなかったけど、送られてきたテキストがこれらの記号多めだったので、重い腰を上げて設定しました。

## 設定内容

- .vimrcに `set ambiwidth=double` を記入
- iTerm2の Preferences → Profiles → それぞれのTextタブで Treat ambiguous-width characters as double width のチェックを入れる
![スクリーンショット 2014-03-04 11.06.43.png](https://qiita-image-store.s3.amazonaws.com/0/17722/66b79d3f-0d14-6cc0-2f5a-5b8260d10a93.png)

## 2014/03/06追記: tmux-powerlineのステータスバーがおかしくなる場合

tmux自身に下記のpatchを当ててやることで解決しました。ありがとうございます。

<https://gist.github.com/waltarix/1399751>

brewで入れている場合はpatchを簡単に当てることができます。詳しくはこちら→ <http://qiita.com/macoshita/items/2ee3c15f362103d1e373>

## 背景

- ★とか■とか※とかは Unicode で ambiguous(曖昧な) width という分類になるらしい。
  - <http://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85>
  - この背景さえわかっておけば、多分他のアプリでも解決しやすいのではないかと思います。

## 参考

- <http://slashdot.jp/journal/549921/MacOSX>
複数ファイルでも tail -f がしたい

## 概要

複数のファイルをまとめて `tail -f` しようとしたらスクリプト作成後に、[まとめ](http://www.thegeekstuff.com/2009/09/multitail-to-view-tail-f-output-of-multiple-log-files-in-one-terminal/)を見つけた。

仕方ないので、リンク先を日本語で紹介してお茶をにごします。

## tailコマンドをそのまま使う

`tail` コマンドは複数のファイルを受け取れるので以下のように書けます。

```bash
tail -f f1.log f2.log f3.log
```

そうすると出力は

```
==> f1.log <==
hoge

==> f2.log <==
hoge
piyo

==> f3.log <==
hoge

==> f1.log <==
huga
```

となり、少なければ見やすい反面、ログが多いと読みづらい

## multi-tail.sh を作る

出力をまとめて読むのであれば、そういうスクリプトを作ってしまうのが楽。

```bash:multi-tail.sh
#!/bin/bash

trap 'kill $(jobs -p)' EXIT
for f in "$@"; do
  tail -f "$f" &
done
wait
```

```bash
bash multi-tail.sh f1.log f2.log f3.log
```

## multitail コマンドをインストール

aptとか[Homebrew](http://brew.sh/)に`multitail`というのがある（homebrewしか確認してない）

```bash
multitail f1.log f2.log f3.log
```

出力は`top`コマンドみたいに、画面全体を書き換えながら表示されます。
jQuery Lazyloadプラグインで遅延読み込み


画像の遅延読み込みができるjQueryプラグインを導入してみた。

[jquery_lazyload](https://github.com/tuupola/jquery_lazyload)を使用。有名らしい。

## 使い方

```erb:sample.html.erb
<%= javascript_include_tag "jquery" %>
<%= javascript_include_tag "jquery_lazyload" %>

<script>
$(function(){
  $("img.lazy").lazyload({ effect: 'fadeIn', threshold: '200' });
});
</script>

<img src="loading.gif" class="lazy" data-original="hoge.png" width="200" height="200">
```

jQueryとlazyloadプラグインを読み込み上記のようなスクリプトを書けば、`lazy`クラスを持つ画像が遅延表示される。

注意点としては、img要素のsrc属性にはダミー画像を書いておき、本物の画像ファイルをdata-original要素に書いておくこと。

細かいオプションに関しては、公式ページとかで確認。


railsで利用するにあたり、適当なメソッドを作った。

```ruby:app/helpers/application_helper.rb
def lazy_image_tag(source, options={})
  options['data-original'] = source
  if options[:class].blank?
    options[:class] = "lazy"
  else
    options[:class] = "lazy #{options[:class]}"
  end

  image_tag('transparent.gif', options)
end
```

jsのスクリプトを書いておき、上記のメソッドを使えば、画像が遅延読込されるようになる。

## 参考
[画像を遅延ロードする定番jQueryプラグイン「Lazy Load」](http://www.koikikukan.com/archives/2012/11/21-015555.php)
Macのフォント変換はFontPrepがいいかもしれない

#どんなもの
TTFかOTFから、他の拡張子のフォントを作ったり、プレビューのCSSを書き出すアプリ。
http://fontprep.com/

#変換方法
1. TTFかOTFをドラッグ＆ドロップ
1. フォントが読み込まれたらフォント名とアイコンが並んだバーが出るので、一番左のアイコンを押してエクスポートする

※フォントが読み込むのは、他のアプリなんかと同様遅いので気長に待つ。
SquidをZabbixで監視する

mnb@就業中 です。
こちらでSquid3監視用のZabbixで使用できるSNMPテンプレートを見つけました。
http://kometchtech.blog45.fc2.com/blog-entry-1193.html

ありがとうございます。kometchさん。
アイテム数87、、、これを登録するのはかなり大変です。
5種類のグラフに分けて登録くださっています。
大感謝です。これで予定より早く監視に入れます。

![squidsnmpzabbix.JPG](https://qiita-image-store.s3.amazonaws.com/0/37930/a613557f-d7ed-718f-b100-fd8de48591d5.jpeg)
Vagrant+Chef-Soloで、Play Frameworkが実行できる環境を作る


[Amazon.co.jp： 入門Chef Solo - Infrastructure as Code eBook: 伊藤直也: Kindleストア](http://www.amazon.co.jp/%E5%85%A5%E9%96%80Chef-Solo-Infrastructure-as-Code-ebook/dp/B00BSPH158)

をひと通り読んだので、Vagrant上のCentOSにPlay Frameworkが実行可能な環境を構築するレシピを作ってみました。

[レシピ](https://github.com/assaulter/vagrant-play)

実行手順はリンク先のREADMEに書いたので、軽く概要をまとめる程度にしたいと思います。（こうして書いてみると意外とやること多いのと、レシピを書く、人のレシピを使う際に色々用語が出てきて、一気にやると混乱すると思うので。）

# VM and Vagrant

CentOSな仮想環境を構築するために使用。

設定はVagrantfileに書く。

Vagrantfileにシェルを書いて実行も出来るみたいだが、ここに色々書くのは無理があると思うので、Chef-Soloを使った次第。

## Vagrantfileの設定項目
・box(仮想イメージ)の名前およびDL先

・プライベートネットワークの設定

・ホストとリモートの間で共有するディレクトリの設定

## chefで操作できるようにする
sshでvagrant upしたCentOSにログイン出来るようにしておく

```
$ vagrant ssh-config --host hostname >> ~/.ssh/config
```

# Chef-Solo側でレシピ作成および転送
## knife solo
実際は殆どこのコマンド操作を行う。

```
// chefのレシピ集を置く雛形作成
$ knife solo init chef-repo
```

```
// リモートにchefを入れる
$ knife solo prepare hostname
```

```
// レシピ実行
$ knife solo cook hostname
```

## レシピ作成
ここまでが準備で、ようやくレシピ作成に取り掛かれます。
## Berkfileで、人が作ったレシピを使う
gemに対するbundler的な感じで、取得してきたいレシピを記述しておいてBerksコマンドで取得出来る。が、取ってきたやつを使うのにちょっと学習コストがあるかも。これはまた次の機会に解説したいと思います。

```
// Berksfileに追加
cookbook 'simple_iptables', git:"git://github.com/dcrosta/cookbook-simple-iptables.git"
// 直接gitを指定することも出来る
```

```
// このコマンドで取得する。pathは慣習的にcookbooksに入れる模様。
$ berks install --path cookbooks
```

## 自前のレシピを書く

```
// 自前はsite-cookbooksに置く模様
$ knife cookbook create play-install -o site-cookbooks
```

## 実行して欲しいリストを書く
今までの手順でやってるとchef-repo/nodes配下にhostname.jsonが出来ていると思うのですが、ここに記述されているレシピが実行されます。(つまり取得してきただけじゃ何も実行されない。)

```
// 基本的には自前、人の関係なく書ける。
{
  "run_list":[
    "recipe[simple_iptables]",
    "recipe[iptables]"
  ]
}
```

で、"knife solo cook hostname"を実行すれば…

# まとめ
VM, VagrantをDL

chefをインストール

knifeの設定

レシピを書く、取ってくる

実行

意外とめんどくさいかもしれませんが、一度自分で動かして、レシピを自分で書く、人のレシピを取ってくるあたりまでやると大体概要がつかめてくるんじゃないかなと思います。

# 次回以降のネタ
・レシピ書く際にchef側に用意されてるコマンド(関数？)の使い方

・人のレシピ取ってきて使う際に設定するの意外とわかりづらいんだよなぁ…英語ばっかだし、の解説
rails4のtextarea

erbですね。

## フォームの幅指定

*size*を利用する
```yaml
<%= f.text_area :propetyname, :size => "30x10" %>
```

## 表示の改行

*simple_format*を利用する
```yaml
<%= simple_format(propetyname) %>
```

詳しくはこちら。
http://railsdoc.com/references/text_area
StackEditでvim/emacsキーバインド設定


## StackEditとは？
- オープンソースのMarkdownエディター
- [公式サイト](https://stackedit.io/)

![Screen Shot 2014-03-04 at 6.41.19 AM.png](https://qiita-image-store.s3.amazonaws.com/0/4777/736fb3cc-6361-e475-ece0-8a712037ac6b.png "Screen Shot 2014-03-04 at 6.41.19 AM.png")

## vim / emacs キーバインド設定
- デフォルトでは、ショートカットキーいっぱい設定されていて、機能がいろいろ便利そうですが、逆にカーソルの移動とかは矢印キーしか出来ないことは不便
- 調べてみたら、拡張設定で`vim / emacs`キーバインドに設定出来ます

## 設定手順
- 左上の`#`アイコンで`Settings`画面に移動
- `Extensions`タブの一番下の`UserCustom extension`リンクをクリックし下記の内容を入力する

```js

userCustom.onReady = function() {
    var ace = {}
    ace.require = require
    ace.define = define
    ace.require(["ace/lib/net"], function(acenet) {
        acenet.loadScript("//cdn.jsdelivr.net/ace/1.1.01/min/keybinding-vim.js", function() {
            e = document.querySelector(".ace_editor").env.editor
            ace.require(["ace/keyboard/vim"], function(acevim) {
                e.setKeyboardHandler(acevim.handler);
            });
        });
    });
    window.ace = ace;
};
```

- 上記は`vim`に設定しているので、`emacs`に設定したい場合、参考URLの`Github Issue 254`をコメントを参考して、`vim`の2箇所を`emacs`に変更すればOK

## 注意点
- `vim / emacs`キーバインド出来ると言っても、ショートカットキーが最優先される
- 例えば、`ctrl-h`ではヘッダーのショットカートキーになっているので、前の文字の削除には行きません

## 参考URL
- [MOONGIFT紹介記事](http://www.moongift.jp/2013/09/20130924-3/)
- [Github Issue 254](https://github.com/benweet/stackedit/issues/254)
yumのrepositoryをcliで管理

```bash:
$ yum repolist all
```
![スクリーンショット 2014-03-04 6.37.33.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2a11b474-8b19-a49d-c896-3cb3046bb12c.png)

以下centos5では出来ない。

```bash:有効化
$ sudo yum-config-manager --enable rpmforge
```

```bash:無効化
$ sudo yum-config-manager --disable rpmforge
```
SNMPとMIB/OIDについて(CentOS編)


SNMPってよく使われるけれども、そもそもどういうものなのか
分かって使っている人が周りに少ない気がします。

私もまだまだ勉強中ですが、少なくともこういうものなのか！？という部分をまとめてみました。

##SNMP
皆さん良く使う、機器の状態を値で返してくれたり、トラップを出してくれるものですね。

##MIB

ツリー構造になっているシステム情報のこと。
すべてのSNMPエージェントが備えているMIB-II（1.3.6.1.2.1）や、net-snmpが独自に提供しているUCD-SNMP（1.3.6.1.4.1.2021）がある。
ディレクトリ構造と同様に各ディレクトリに名前が付けられており、オブジェクトと呼ばれています。

##OID
オブジェクトIDのこと。それぞれのオブジェクトを区別するために数字が付けられています。

##例

```MIB-II（1.3.6.1.2.1）
システム情報・インターフェイス情報・TCP/UDP情報がある。
- インターフェイス情報
使用可能なネットワーク(eth0 eth1 eth2など)
1回の転送で送信できるデータの最大値(Mtu)
- TCP/UDP情報
グローバルIP,ローカルIP
```

```UCD-SNMP（1.3.6.1.4.1.2021）
CPU負荷やメモリ、HDD容量などの情報がある。
```

##主によく取る値のOID
1. CPU Use (1.3.6.1.4.1.2021.11)
2. HDD・Memory (1.3.6.1.2.1.25.2.3)
3. Load Average (1.3.6.1.4.1.2021.10.1)
4. Network (1.3.6.1.2.1.2.2)

上記をsnmpwalkで、例えばHDDの / はどのMIB/OIDか確認すれば幸せになれると思いますw

##なぜsnmpwalkで確認しなければいけないの？
ここが私がハマって、がっくりきた箇所です。
（私が調べた限りでは教えてくれているサイトはなかったです。。。）

例えば、Aというサーバで /home の合計値は、
AllocationUnits(1.3.6.1.2.1.25.2.3.1.4.35) ☓ 1.3.6.1.2.1.25.2.3.1.5.35
だと分かりました。

では、他のサーバでもこれだろう！と同じOIDで設定すると、dfなどで確認している値と違う値が出てきます。
（但し、実際dfコマンドではすべての容量の10%分を差し引いた値を表示し、snmpでの確認ではすべての容量を表示する違いはあります。）

それはなぜか！？
サーバによって、割り当てられているOIDが違うみたいだからです。

私も知ってがっくりきましたが、Bというサーバでは、
AllocationUnits(1.3.6.1.2.1.25.2.3.1.4.33) ☓ 1.3.6.1.2.1.25.2.3.1.5.33
ということもありうるようなんです。

なので、多くの解説サイトさんでは、1.3.6.1.2.1.25.2.3.1.4.x と濁して説明をされていたようです。

そういう意味では、CactiやZabbixで提供されているSNMPのテンプレートは便利だな、と感じました。
zshで前方検索(history-incremental-search-forward)が出来ない時

シェルの便利な機能として前方検索と後方検索がある．
それぞれhistoryの前方，後方に向けてコマンドを検索でき，
長くてコマンドを打ち直すのが面倒な場合に重宝する．
多分，デフォルトで次のように設定されてる．

```zsh:.zshrc
bindkey "^s" history-incremental-search-forward
bindket "^r" history-incremental-search-forward
```

このうち，history-incremental-search-fowardの方が
ずっと機能していなかった．
主に使うのは後方検索なので，放置してたが，次の二つを疑うと良い．

emacsキーバインドにしてるか

```zsh:.zshrc
bindkey -e
```

フロー制御オフにしてるか

```zsh:.zshrc
setopt noflowcontrol
```

私の場合は2番目が原因だった．
iTerm2だとデフォルトでフロー制御がオフになってる(?)っぽいが
zshrcに明示しないと駄目．
フロー制御をオフにする副作用についてはわかっていない．
Objective-Cでは名前のないメソッドを宣言できるという話


# :::

突然ですが問題です。↑はなにを表しているでしょう？

正解　→　
###メソッド名

[![MMR どういうこと](http://tiqav.com/1Bv.th.jpg)](http://tiqav.com/1Bv)

うん、こういうことなんだ。

```objectivec
- (void):(NSString*)arg1 :(NSString*)arg2 :(NSString*)arg3
{
    NSLog(@"%@/%@/%@",arg1,arg2,arg3);
}

```

```objectivec
- (void)testNoneNameMehotd
{
    XCTAssertNoThrow([self :@"hoge" :@"fuga":@"var"], ); // -> hoge/fuga/bar
    XCTAssertNoThrow(objc_msgSend(self, @selector(:::), @"hoge",@"fuga",@"var")); // -> hoge/fuga/bar
}
```

部分的に点けることもできるみたい

```objectivec

- (void)testPartial
{
    XCTAssertNoThrow([self :@"hoge" arg2:@"fuga" :@"var"], );
}

- (void):(NSString*)arg1 arg2:(NSString*)arg2 :(NSString*)arg3
{
    NSLog(@"%@/%@/%@",arg1,arg2,arg3); // -> hoge/fuga/bar
}
```

　 　 　 　 |＼　　 　 　 　 　 ／|
　 　 　 　 |＼＼　　 　 　 ／／|
　　　　 　 : 　,>　｀´￣｀´　<　 ′
.　　　　 　 Ｖ　 　 　 　 　 　 Ｖ
.　　　　 　 i{　●　 　 　 ●　}i
　　　　 　 八　 　 ､_,_, 　 　 八
. 　 　 　 /　个 . ＿　 ＿ . 个 ',
　　　＿/ 　 il 　 ,'　　　 '.　 li　 ',＿_



　 　 　 　 |＼　　 　 　 　 　 ／|
　 　 　 　 |＼＼　　 　 　 ／／|
　　　　 　 : 　,>　｀´￣｀´　<　 ′
.　　　　 　 Ｖ　 　 　 　 　 　 Ｖ
.　　　　 　 i{　●　 　 　 ●　}i
　　　　 　 八　 　 ､_,_, 　 　 八 　　　わけがわからないよ 
. 　 　 　 /　个 . ＿　 ＿ . 个 ',
　　　＿/ 　 il 　 ,'　　　 '.　 li　 ',＿_
文字を表示する


　それでは次にInDesign CS6で文字を表示してみましょう。以下のプログラムを入力してみてください。

````
pageObj = app.documents.add()
txtObj = pageObj.textFrames.add();
txtObj.visibleBounds = ["1cm","0.5cm","5cm","10cm"];
txtObj.contentType = ContentType.textType;
txtObj.contents = "InDesign JavaScript Sample";
````

　１行目は新規にドキュメントを作成するものです。これは先ほどやりました。InDesign CS6でテキストを表示させるためには、まずテキストフレームを作成する必要があります。２行目でテキストフレームを作成しています。
　テキストフレームを作成しても、その大きさを指定しないと期待通りにはなりません。そこでvisibleBoundsに上端、左端、下端、右端の座標を単位付きで指定します。順番を間違えないように注意してください。
　次にフレームの種類を指定します。テキストフレームを作成したのに、なぜ？と思われるかもしれませんが、InDesign CS6ではテキストフレームもグラフィックのフレームも基本的に同じためです。ここでは明示的にテキストを入れます、と指定するためcontentTypeにContentType.textTypeとしてフレームの種類をテキストにしています。
　これでテキストを表示する準備ができました。実際のテキストはcontentsに入れれば表示されます。

　文字を表示しましたので、次に文字のサイズを変更してみましょう。以下のスクリプトは最初の１文字を34Qにするものです。

````
pageObj = app.documents.add()
txtObj = pageObj.textFrames.add();
txtObj.visibleBounds = ["1cm","0.5cm","5cm","10cm"];
txtObj.contentType = ContentType.textType;
txtObj.contents = "InDesign JavaScript Sample";
txtObj.characters[0].pointSize = "34Q";
````

　先ほどのスクリプトに１行追加しただけです。追加したのは一番最後の行です。文字のサイズはpointSizeで指定します。どの文字のサイズを指定するかをcharactersで指定します。[]の中に数字がありますが、これが文字の位置になります。InDesign CS6での文字は一番最初の文字が0番、2文字目が1番というように１少ない値になっています。つまり最初の文字を指定するにはcharacters[0]とすればよい事になります。
　文字のサイズは"34Q"のように文字列で指定します（数値でも指定可能）。級数だけでなくポイントでも指定できます。この場合には"24pt"のように指定します。

　これでInDesign CS6で文字を表示し、任意の位置の文字のサイズを変更することができるようになりました。同様にしてフォントなども変更することができます。
Xcode5でプリコンパイル済みヘッダを使う

New File... > PCH Fileから追加します。

![スクリーンショット_2014_03_04_1_24.jpg](https://qiita-image-store.s3.amazonaws.com/0/27497/c1718439-b9d6-b9de-1cc4-fe9ce798b408.jpeg)

![スクリーンショット_2014_03_04_1_33.jpg](https://qiita-image-store.s3.amazonaws.com/0/27497/3fd41a30-a122-02b7-0b70-b13d5b4d3f33.jpeg)

Build Settingsにて、Precompile Prefix HeaderをYesに変更し、Prefix Headerのファイルパスを設定します。Precompile Prefix HeaderをYesにすると、指定したPrefix Headerをプリコンパイルします。

![pch_sample_xcodeproj.jpg](https://qiita-image-store.s3.amazonaws.com/0/27497/89776be2-3ae2-f4f0-75ab-b161160f99ac.jpeg)

Prefix Headerに指定したファイルは、コンパイルのプリプロセッサオプションで ' __-include__ _file_'の形で実行されているようです。これは _file_ を、通常の入力ファイルが処理される前に処理されるため、結果的に _file_ に含まれる内容は、一番最初にコンパイルされることになります。
Pythonで積分

##課題

+ 以下の積分を求める。

```math
\int_0^1\dfrac{1}{1+x^2}~dx
```

+ 実際の解は $\pi/4= 0.78539816339...$

##手法

+ [SciPy](http://www.scipy.org/) の [scipy.integrate.quad](http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.quad.html) を利用する。

##内容

+ スクリプト

```py:sample.py
from scipy.integrate import quad

answer, abserr = quad(lambda x: 1/(1+x**2), 0, 1)

print answer
```

+ 実行結果

```
> python sample.py
0.785398163397
```
複数の配列の値のあらゆる組み合わせを調べる

`itertools.product`で簡単にできるようでした。プログラミング問題を解いたり、あらゆる値で問題が出ないか網羅的な検査をするテストを書く際には便利そうですね。

```python
import itertools
numbers = (1, 2, 3)
people = ('Alice', 'Bob')
for person, number in itertools.product(people, numbers):
	print '%s => %d' % (person, number)
```

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

```
Alice => 1
Alice => 2
Alice => 3
Bob => 1
Bob => 2
Bob => 3
```
BottleのRequest/Responseオブジェクトをマスター


1ファイルフレームワークBottleは気軽にWebAPIなどを実装する際に便利ですね。ResponseとRequestオブジェクトの使い方についてメモしておきます。

# [Request](http://bottlepy.org/docs/dev/api.html#the-request-object)

`bottle.request`にアクセスすると、現在処理しているリクエストにアクセスできます。以下の例では`bottle.`を省略します。

- GETリクエストの場合のフォームパラメータ: `request.query`
- POST/PUTリクエストの場合のフォームパラメータ: `request.forms`
- GET/POST/PUT全部まぜこぜのフォームパラメータ `request.params`
- HTTPヘッダの取得: `request.get_header('User-Agent')`
- HTTPメソッド: `request.method`
- リクエスト本文(body): `request.body`
- アクセスされたURL: `request.url` urlpartsも便利
- リモートアドレス: `request.remote_addr`

# [Response](http://bottlepy.org/docs/dev/api.html#the-response-object)

bottleのrouteデコレータで修飾された処理関数は、文字列か、HTTPResponseクラスのインスタンスを返す必要があります。ここでは主にHTTPResponseクラスについて述べます

- HTTPResponseクラスのコンストラクタはstatusとbodyをオプショナルに受け取る。
    - bodyのデフォルト値は`''`
    - statusのデフォルト値は`None` => 基本的には200になる
    - statusは`200`のようなステータスコードか, `'200 OK'`のようなステータスのフル表記のどちらか
- 属性bodyで本文(body)をセットできる
- `set_header(name, value)`でHTTPヘッダを追加できる
    - 同様に`get_header(name)`もある

```python
from bottle import HTTPResponse
body = '<html><body>ok</body></html>'
r = HTTPResponse(status=200, body=body)
r.set_header('Content-Type', 'text/html')
```

bodyは後から`r.body = '...'`のようにセットすることも可能なようです。

## リダイレクトするレスポンス例

```python
@route('/gotosomewhere')
def gotosomewhere():
	r = HTTPResponse(status=302)
	r.set_header('Location', 'http://example.com')
	return r
```

## JSONを返す例
```python
import simplejson as json
@route('/something.json')
def somethingjson():
	body = json.dumps({'message': 'hello world'})
	r = HTTPResponse(status=200, body=body)
	r.set_header('Content-Type', 'application/json')
	return r
```
Bootstrap3でnavbar-navをセンタリングする

text-centerやcenter-blockでも頑として動かないnavbar-navをセンタリングする方法

```html
@media (min-width: 768px){
.navbar-nav{
    margin: 0 auto;
    display: table;
    table-layout: fixed;
    float:none;
}
}  
```

## 引用
http://stackoverflow.com/questions/19073813/how-to-center-navbar-nav-element-in-bootstrap-3
初めての Chef

# Chef を使ってみた
* Chef を使用するとサーバの環境構築が自動化できると聞いて、初歩的なパッケージインストールまでをやってみた
* AWS EC2(Ubuntu) に Apache をインストールする

# 簡単な用語説明
* node : 環境設定をしたい対象となるサーバ
* workstation : 設定内容を記載するファイルの作成や管理をするクライアント
* Recipe : 設定内容を記載するファイル、Ruby で書く

# 事前準備
## workstation
* Mac を使用
* インストールするもの
    * chef
    * knife-solo
* chef のインストール
    * https://learnchef.opscode.com/quickstart/workstation-setup/

```bash
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
```


* knife-solo のインストール

```bash
$ sudo gem install knife-solo
```

* ```$ gem list``` で 2 つがインストールされていることを確認
* knife コマンドの初期設定を行う

```bash
$ knife configure
```

## node
* AWS EC2 の Ubuntu Server を対象とする
    * インスタンスは作成済みとする

# 準備
## Chef レポジトリの作成
* Workstation 側で作業
* 任意のレポジトリを下記コマンドで作成する(今回は testchef というリポジトリにする)

```bash
$ knife solo init “作成するレポジトリ名”
```

* 実行後に、testchef ディレクトリが出来る
* ディレクトリ構成

> testchef/
> ├── cookbooks
> ├── data_bags
> ├── environments
> ├── nodes
> ├── roles
> └── site-cookbooks

## workstation の chef solo を使用し、node に Chef をインストール
* 作成した Chef レポジトリに入り、下記コマンドを実行

```bash
$ knife solo prepare -i ~/.ssh/xxx.pem ubuntu@xx.xxx.xxx.xx
```

* 下記ログが表示されれば、OK

> Thank you for installing Chef!

# Cookbook の作成、Recipe の記載
* Chef レポジトリ(testchef)に移動し、下記コマンド入力

```bash
$ knife cookbook create test -o site-cookbooks
```

* 実行後、site-cookbooks/test/recipes/default.rb ができるので、これを編集する
    * 今回は apache をインストールするように編集

```default.rb
package "apache2" do
    action :install
end
```

* 編集後、testchef/nodes/xx.xxx.xxx.xx.json を編集し、recipe を呼ぶようにする

```xx.xxx.xxx.xx.json
{
    "run_list":[
        "recipe[test]"
        ]
}
```

# chef の実行
* 下記コマンドで実行する

```bash
$ knife solo cook -i ~/.ssh/xxx.pem ubuntu@xx.xxx.xxx.xx
```

* 以下のログが出力される

> Running Chef on xx.xxx.xxx.xx...
> Checking Chef version...
> Uploading the kitchen...
> Generating solo config...
> Running Chef...
> Starting Chef Client, version 11.10.4
> Compiling Cookbooks...
> Converging 1 resources
> Recipe: test::default
>   * package[apache2] action install
>     - install version 2.2.22-1ubuntu1.4 of package apache2
> 
> 
> Running handlers:
> Running handlers complete
> 
> Chef Client finished, 1/1 resources updated in 18.333540242 seconds

# まとめ
* AWS の EC2(Ubuntu) を対象に chef を使用してみた。
    * 一度 recipe を作成すると使い回しが効く
    * EC2 などと組み合わせると同じ環境を作成しやすくなる
    * Vagrant などとも相性は良さそう
Selenium IDE でチェックボックスがチェック可能であることを確かめる

下記は xpath で指定された場所にあるチェックボックスがチェック可能である( `disabled` になっていない)ことを確かめることができます。

|コマンド|対象|値|
|---|---|---|
|verifyEditable|//html/path/to/element||

また、下記の場合は `diabled` になっていることを確かめることができます。

|コマンド|対象|値|
|---|---|---|
|verifyNotEditable|//html/path/to/element||

下記を参考にしました。ありがとうございます。
http://stackoverflow.com/questions/14929747/how-to-find-whether-button-is-disabled-or-not-in-selenium-ide
Gaufrette - PHPで便利なファイルシステム抽象レイヤー

PHPでファイルアップロード・・・めんどくさいですね。

ましてやAmazonS3にアップロード、パフォーマンスまたはコストの為にローカルキャッシュを持たせる..

ローカルに保存していたファイルをクラウドに移行、または別のクラウドサービスに移行..

__すごくめんどくさい__

## そんな時の抽象レイヤー

Gaufrette - https://github.com/KnpLabs/Gaufrette

### ローカルファイルシステム

```php:
<?php

use Gaufrette\Filesystem;
use Gaufrette\Adapter\Local as LocalAdapter;

$adapter = new LocalAdapter('/var/media');
$filesystem = new Filesystem($adapter);

$content = $filesystem->read('hoge.txt');

$content = 'Hello gaufrette';

$filesystem->write('hoge.txt', $content);

```

アダプターを変えるだけで、色々なファイルシステムにアクセスできます

### Amazon S3

```php:
$service = S3Client::factory(['key' => 'key_here', 'secret' => 'secret_here']);
$adapter  = new Gaufrette\Adapter\AwsS3($service,'bucket-name');
```

移行も簡単にできてしまうのが容易に想像できますね！

### キャッシング

```php:
$ttl = 3600;
$adapter = new Gaufrette\Adapter\Cache($slowAdapter, $localAdapter, $ttl);
$filesystem = new Gaufrette\Filesystem($adapter);
```

#### 他にもアダプタはたくさん

* Rackspace
* OpenStack
* Dropbox
* DoctrineDbal
* Ftp
* etc

https://github.com/KnpLabs/Gaufrette/tree/master/src/Gaufrette/Adapter


## SymfonyにはKnpGaufretteBundleもあります
https://github.com/KnpLabs/KnpGaufretteBundle

アダプタをサービスにする手間が省ける他に、LiipImagineBundle（サムネイルを生成するバンドル）上でGaufretteを使う事も容易になります。

1. `KnpGaufretteBundle` で `StreamWrapper` を定義
2. `LiipImagineBundle` で `1のStreamWrapper` をデータソースとする `StreamDataLoader` を定義

何も困る事はありませんね！

詳しくはドキュメントにあります。
https://github.com/liip/LiipImagineBundle/blob/master/Resources/doc/data-loader/stream.rst

ローカルファイルシステムにしか使わないとしても便利なのでおすすめです。
ゆかりんの年齢を計算する

Objective-cの便利なクラスたちを使って、簡単にゆかりんの年齢を計算します。
wikipediaによるとゆかりんの誕生日は、
1976年2月27日なので、以下のように計算します。

```objc
        NSCalendar *callendar = [NSCalendar currentCalendar];
        NSDate *now = [NSDate date];
        
        NSDateComponents *birthdayComponents = [[NSDateComponents alloc] init];
        birthdayComponents.year = 1976;
        birthdayComponents.month = 2;
        birthdayComponents.day = 27;
        NSDate *birthday = [callendar dateFromComponents:birthdayComponents];
        
        NSCalendarUnit unit = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
        NSDateComponents *elapsed = [callendar components:unit fromDate:birthday toDate:now options:0];
        
        int year = 17;
        int month = ((int)elapsed.year - year) * 12 + (int)elapsed.month;
        int day = (int)elapsed.day;
        
        NSLog(@"17歳と%dヶ月と%d日", month, day);
```

というわけで、ためしに実行してみると、
ゆかりんはこの記事作成時には、
17歳と252ヶ月と5日ということになります。
時々ゆかりんの年齢を忘れてしまった、という方は試してみてください。
今日はfluent-plugin-out-httpsを作った話


# なぜ作ったか
俺はfluentのログを[Google Apps ScriptのdoPost()](https://developers.google.com/apps-script/guides/ui-service#Forms)で受け取りたい。そしてGASでグラフを描きたいんだ！ しかしdoPost() はhttpsしか受け付けてくれない。

[fluentプラグインの一覧](http://fluentd.org/plugin/)を見ても、どうもhttpsで出力するプラグインってなさげ。httpは[entoさんのfluent-plugin-out-http](https://github.com/ento/fluent-plugin-out-http)があるのだけど。

というわけで、今日の午後はentoさんのhttpプラグインをfolkしてhttps版を作ることにした。なんとか動いた。人生初のfluentプラグインだ！ わーい＼(-o-)／

# 使い方

githubに置いといた：[fluent-plugin-out-https](https://github.com/kazunori279/fluent-plugin-out-https) 

`td-agent/plugin`フォルダに[`out_https.rb`](https://github.com/kazunori279/fluent-plugin-out-https/blob/master/lib/fluent/plugin/out_https.rb)を入れて、`td-agent.conf`でこんな感じに書けばよい。

```td-agent.conf
<match *>
  type 				http
  use_ssl			true
  include_tag		true
  endpoint_url    https://localhost.local/api/
  http_method     post
  serializer      form
</match>
```

`use_ssl`を`true`に設定するとhttps通信になる。ログの各行ごとに指定した送り先にhttpsで送ってくれる。また、イベントログのプロパティにfluentdのタグを含める`include_tag`オプションも実装した。これは後でGAS連携時に使う予定。

# fluentd > Google Apps Script連携できるね！

fluentとGASの組み合わせってあまり聞かないけど、便利じゃないだろうか？ 週末に作った[nginx + norikra on docker](http://qiita.com/kazunori279/items/1bbb8fce10219217c247)とGoogle Spreadsheetを連携させるとこんな感じ：

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/38290/5ff5af3f-e669-da75-4968-fc7fc289a029.png "Untitled.png")

# Caveats
* さっきできたばっかりだしRuby書いたの数年ぶりなのでバグあるかも
* 各行ごとに1リクエストが飛ぶので、norikraみたいに集計結果をパラパラと送ってくるソースにしか使えない
* SSL接続先の検証はデフォルトでは行わない。コメントアウトしてある`VERIFY_PEER`を入れて、`OpenSSL::X509::DEFAULT_CERT_FILE`が指す場所に`cert.pem`を置けば検証してくれる
* GASで使うとき、doPost()で受けるURLにはGoogleアカウントによる認証はかけられない

# Acknowledgements
* ほとんどのコードはentoさんの書いたものです。entoさんあざっす！！
CentOS6.3にてデフォルトのMySQL5.1をアンインストールして、別バージョンのMySQLをインストールする方法

CentOS6.3はデフォルトでMySQL5.1がインストールされていることがあります。
ライブラリの依存関係を更新して、別バージョンのMySQLをインストールする手順を下記にまとめます。
※参考としてMySQL5.5を挙げています。

### 1. MySQLのインストールチェック
CentOSデフォルトのMySQLがインストールされていないか確認する
` rpm -qa | grep mysql` 

"MySQLがインストール済みの場合、下記のようにrpm情報が表示される
` mysql-libs-5.1.61-4.el6.x86_64` 

### 2. MySQLパッケージの更新
MySQLがインストール済みの場合、下記の手順でパッケージの更新を行う

MySQL 5.5の互換共有ライブラリをインストール
` cd /usr/local/src
rpm -ivh MySQL-shared-compat-5.5.33-1.el6.x86_64.rpm` 

MySQL 5.1の共有ライブラリを削除
` rpm -e mysql-libs-5.1.61-4.el6.x86_64` 


### 3. MySQL5.5 のインストール
改めてMySQL5.5 をインストール
` cd /usr/local/src
rpm -ivh MySQL-server-5.5.33-1.el6.x86_64.rpm`

インストール後、出力メッセージの最後に以下のメッセージが表示されていることを確認。
` 1:MySQL-server  ########################################### [100%]` 

続いてClientのインストール
`cd /usr/local/src
rpm -ivh MySQL-client-5.5.33-1.el6.x86_64.rpm`

インストール後、出力メッセージの最後に以下のメッセージが表示されていることを確認。
` 1:MySQL-client ########################################### [100%]`
Growl for Windowsでプラグインを手動インストールするには

WindowsでGrowlが使える[Growl for Windows](http://www.growlforwindows.com/gfw/)は、プラグインで機能を拡張できます。
プラグインの手動インストールの手順がドキュメントになかったので書いておきます。

[Windows Balloons](http://www.growlforwindows.com/gfw/subscribers/windowsballoons)を例とすると

1. zipファイルを[ダウンロード](http://www.growlforwindows.com/gfw/d.ashx?f=subscribers/windowsballoons.zip)する

1. プラグインのディレクトリを探す
Growlの設定は、インストール先の他に`%LOCALAPPDATA%\Growl\2.0.0.0`にある。この中を覗くと、プラグイン用のディレクトリがいくつか見つかる。Windows Balloonsはsubsribe機能を拡張するので、`%LOCALAPPDATA%/Growl\2.0.0.0\subscribers`がプラグイン用のディレクトリになる。

1. ダウンロードしたzipファイルを展開して、先ほどのディレクトリに置く
`%LOCALAPPDATA%/Growl\2.0.0.0\subscribers\プラグイン名\展開されたファイル達`になるようにする。

1. Growlを再起動する

プラグインの種類ごとにディレクトリが分かれているので注意が必要です。
ついでにF#でparamorphism/apomorphism

[前回の投稿](http://qiita.com/minfuk/items/b7d7b7d0f8c6f1796148)に続いて。相変わらず応用先は不明。

```fsharp
// 前回の定義を前提としています。

let rec ana phi x = 
    let z : F<'c> = (x |> phi)
    Wrap(z.fmap(ana phi) z)
    
let fork f g x = (f x, g x)

let rec para phi x =
    let y = (x |> unIn)
    y.fmap (fork (para phi) id) y |> phi

type Sum<'a,'b> =
    | InL of 'a
    | InR of 'b

let join f g x =
    match x with
    | InL(a) -> f a
    | InR(b) -> g b

let rec apo phi x =
    let (y : F<Sum<'c, Nu<'a>>>) = x |> phi
    Wrap(y.fmap(join (apo phi) id) y)

```
Chaplin.jsでtemplete機能を拡張する方法

ちょっとマイナーで需要があるのか分かりませんが、仕事でChaplin.jsを使っているのでTIPS的な記事をコツコツ書いていければいいなと思います。

ということで、Chaplin.jsのViewクラスでtemplateプロパティにテンプレートそのものを渡すのではなくて、以下のようにscriptタグで囲われたテンプレートのidを渡せるようにしてみました。

```html
<script type="text/x-handlebars-template" id='hoge_template'>
  <h1> Hello world </h1>
</script>
```

getTemplateFunctionを以下のように拡張します。

```coffeescript
define [
  'chaplin'
], (Chaplin) ->
  'use strict'

  class View extends Chaplin.View

    initialize: ->
      super

    getTemplateFunction: ->

      # Template compilation
      # --------------------

      template = @template
      if typeof template is 'string'
        templateFunc = Handlebars.compile $(template).html()
        @constructor::template = templateFunc
      else
        templateFunc = template
      templateFunc
```

上で作成したViewをextendして以下のように使用します。

```coffeescript
define [
  'chaplin'
  'base/views/view'
], (Chaplin, View) ->
  'use strict'

  class HogeView extends View
    autoRender: yes
    container: '#container'
    id: 'hoge'
    template: '#hoge_template'

    initialize: ->
      super

    render: ->
      super
```

これでidを渡すだけで済むようになります。

```
Linuxコマンド：Windowsコマンド対応表

LinuxコマンドとWindowsコマンドとの対応表を作りました。
使い方は載せると長くなるので省略します。

##ファイル操作

|操作|Linuxコマンド|Windowsコマンド|
|:--|:--:|:--:|
|現在のディレクトリの場所を確認する|pwd|dir|
|ファイルやディレクトリの情報を表示する|ls -al|dir|
|ディレクトリ間の移動|cd|cd (or) chdir|
|ディレクトリを作成|mkdir|md (or) mkdir|
|ディレクトリを移動|mv -r|move|
|ディレクトリをコピー|cp -r|xcopy /e /c /h|
|ディレクトリを削除|rm -r|del (or) erase<br />(or) rd /s (or) rmdir /s|
|ファイルを移動|mv|move|
|ファイルをコピー|cp|copy|
|ファイルを削除|rm|del (or) erase|
|テキストファイルの内容を表示|cat (or) less|type|

##ユーティリティ</h1>

|操作|Linuxコマンド|Windowsコマンド|
|:--|:--:|:--:|
|ヘルプを表示|help|help|
|コマンドのヘルプ|[コマンド] --help|help [コマンド]|
|OSのバージョンを表示|[RHEL系]<br />cat /etc/redhat-release<br />[debian系]<br />cat /etc/lsb-release|ver|
|カーネルのバージョンを表示|uname -a|ver|
|システムの日付を表示|date|date|
|システムの時刻を表示|date|time|
|システムの日付を変更|date -s|date|
|システムの時刻を変更|date -s|time|
|ディスクの空き容量を調べる|df -h|fsutil volume diskfree [ドライブ名]|

##その他

|操作|Linuxコマンド|Windowsコマンド|
|:--|:--:|:--:|
|任意の文字列を表示|echo|echo|
|Pingを打つ|ping|ping|
|telnetクライアント|telnet|telnet|
|IPアドレスを表示|ifconfig|ipconfig|
|表示をクリアする|clear|cls|
rubyのリファレンスを入れてみる

refe Arrayとかでリファレンスを参照する。
rubyが入っている前提で話していく。

```bash
gem install refe2
bitclust setup
```

以上これだけ。

```bash
refe Array
refe shuffle
```

とかで

---

Array#shuffle
--- shuffle -> Array
--- shuffle(random: rng) -> Array

配列の要素をランダムシャッフルして，その結果を配列として返します。

引数に [[c:Random]] オブジェクトを渡すことでそのオブジェクトが
生成する疑似乱数列を用いることができます。

例:

   a = [ 1, 2, 3 ]           #=> [1, 2, 3]
   a.shuffle                 #=> [2, 3, 1]
   rng = Random.new
   rng2 = rng.dup # RNGを複製
   # 以下の2つは同じ結果を返す
   [1,2,3].shuffle(random: rng)
   [1,2,3].shuffle(random: rng2)

@see [[m:Array#shuffle!]]

---

こんな感じで説明が出てくればオーケー。

vimでも使う場合は、

```vim:.vimrc
NeoBundle 'thinca/vim-ref
"省略
let g:ref_use_vimproc=1
let g:ref_refe_version=2
let g:ref_refe_encoding = 'utf-8'
```

こんな感じで設定しておいて、
NeoBundleInstallしておけば、refeとかlinux系だとmanとかも見れる。

```vim
:Ref refe Array
:Ref man ls
```

みたいにすりゃあ見れますよ。
さくらVPSのVNCが立ち上がらない時の対処法

　以前調べた時に出てこなかったので、一応記録的に残しておきます。
　さくらVPSを利用していて、SSHが何らかの理由で利用できないなど、VNCを使いたい時ってありますよね
　そこでなぜかVNCが立ち上がらないという現象に遭遇しました
　ググったら「Java7なのがダメ」だとかなんだとかの情報がいくつか出てきたので試したけど全部ダメ
　結局サポートに連絡した結果、「Java7にも現在は対応しております、セキュリティ設定の問題では無いでしょうか？　中にして下さい(意訳)」との御返事
　やってみたら、見事に出来ました

　というわけで、さくらVPSのVNCが立ち上がらないぞ！？　という時はとりあえずJavaのセキュリティ設定を見なおしてみましょう、というお話でした

P.S.

　「うまく行きました(意訳)」との返信を送ったところ「うまく行ったようで何よりです、これからもよろしくお願いします(意訳)」との丁寧な御返事が
　さくらへの信頼感がそれとなく上昇した瞬間でした　※僕はさくらInternetの回し者ではないです
IAMで特定セキュリティグループの設定の追加削除が出来るようにする設定

IPがコロコロ変わる人が居て、毎回IP追加のお願いに対応するのが面倒なので、もうIP変わる度に自分でsshの接続元設定を追加削除してくれやー。

でも特定セキュリティグループの設定以外は何もかも出来なくしたIAMユーザを使わせたい、というときに設定するポリシー。

SecurityGroupAccessとか適当な名前を付けて設定する。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1393841669000",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeSecurityGroups"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Stmt1393841669001",
      "Effect": "Allow",
      "Action": [
        "ec2:AuthorizeSecurityGroupEgress",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:RevokeSecurityGroupEgress",
        "ec2:RevokeSecurityGroupIngress"
      ],
      "Resource": [
        "arn:aws:ec2:ap-northeast-1:123456789012:security-group/sg-aabbccdd"
      ]
    }
  ]
}
```

`ap-northeast-1`とか`123456789012`とか`sg-aabbccdd`は、それぞれリージョン、アカウントID、セキュリティグループIDに書き換えて使う。

DescribeSecurityGroupsはセキュリティグループ一覧の表示に必要なので "*" にせざるを得ない。不要なセキュリティグループの設定も見れてしまうが見れるだけで修正は出来ないから割りきって諦める。
AuthorizeSecurityGroup*は設定の追加、RevokeSecurityGroup*は設定の削除に必要な権限、EgressとIngressはそれぞれOutboundルールとInboundルールのこと。Inboundの設定追加と削除だけなら*Egressの権限は付けなくて良かったね。

ホントはAllTraficを許可したり好きなポートを開けたり出来ないよう、更に指定できるポートの条件も追加したいとこで、多分Condition設定を追加すれば出来るかもしれないが今日はそこまで調べてない。
WordPressのテンプレート階層にレイアウトを組み込む wordpress-layout-style-theme

WordPressの、 **コンテンツを出力するテンプレート（single.phpとかindex.phpとか）で、get_header関数でhtml開き、head、body開き〜header、コンテンツ出力して、get_footer関数でfooter〜body、html閉じる** というテンプレートの展開のしかたが気持ち悪かったので、get_headerとかをレイアウトテンプレートにまとめられるものを作ってみました。

**[wordpress-layout-style-theme](https://github.com/atomita/wordpress-layout-style-theme/tree/master)**

これを使用した際の[デフォルトのレイアウト](https://github.com/atomita/wp-layout-style-theme/blob/master/src/Atomita/Wordpress/LayoutStyleTheme/default.php)では、header.phpにheaderタグの中身、footer.phpにfooterタグの中身を書く形になります。


「カスタムヘッダーを使うときに、get_header関数呼ぶだけでいい形になるので便利」（同僚談）

利用の際はComposerを使うと便利ですが、使わない場合は、LayoutStyleThemeFacadeクラスを使わないか、[atomita/php-facade](https://github.com/atomita/php-facade) を合わせて利用してください。
Symfony2で作ったコマンドを別なバンドルから呼び出す方法

##Symfony2で作ったコマンドを別なバンドルから呼び出す方法

コマンドを作ったらwebから呼びたくなるのが人の常じゃないですか  
でもどこにも書いてないor公式で見つけられないので探して試して動いたので記録する

###ymlの設定（ルーティングの方は割愛）
```yaml
#services.yml
services:
    my.command:
        class: MyBundle\Command\myCommand
        calls:
            - [setContainer, ["@service_container"] ]

```

###コントローラーの実装
```php

namespace MyBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;

class DefaultController extends Controller {

    public function executeAction() {
        $params = array();
        $input = new ArrayInput($params);

        $output = new ConsoleOutput();
        $command = $this->get('my.command');
        $command->run($input, $output);
    }
}
```

####コンソールをファイルに出力するならこう

```php
use Symfony\Component\Console\Output\StreamOutput;
//...
        $file   = '/tmp/log.log';
        $handle = fopen($file, 'w+');
        $output = new StreamOutput($handle);
        $command = $this->get('my.command');
        $command->run($input, $output);
        fclose($handle);

```

####コンソールが不要ならこう（>/dev/null 2>&1）

```php
use Symfony\Component\Console\Output\NullOutput;
//...
        $output = new NullOutput();
        $command = $this->get('my.command');
        $command->run($input, $output);

```

だれか非同期に実行する方法を教えて下さい・・・
jQuery: POSTだけではなくAnchorでもモーダルダイアログを出せるようにする


[改造](http://qiita.com/hidelafoglia/items/adf786fdff632b9b95e7)

HTML. dialog="ダイアログセレクタ" でダイアログを指定する:

```html
    <form id="main-form" method="get">

       <!-- ボタンでダイアログをだす -->
       <input id="id-harajuku" class="modal" dialog="#id-modal-post" 
        type="image" src="harajuku_st.jpg" name="harajuku" />

       <input id="id-prince" class="modal" dialog="#id-modal-post"
        type="image" src="prince.jpg" name="prince"   />

       <hr/> 

       <!-- アンカーでもダイアログを出す -->
       <a id="id-google" class="modal" dialog="#id-modal-get" 
        href="http://www.google.com"> Google</a>

       <a id="id-home" class="modal" dialog="#id-modal-get"
        href="index.html?home" >Home</a>
    </form>
```


HTML :

```html
    <div class="modal-dialog" id="id-modal-post">
      <span class="alert">よろしければデータを送信します</span>
      <span class="button cancel">取消</span>
      <span class="button ok" >送信</span>
    </div>

    <div class="modal-dialog" id="id-modal-get">
      <span class="alert">よろしければサイトに移動します</span>
      <span class="button cancel">取消</span>
      <span class="button ok" >送信</span>
    </div>
```

スクリプト:

```js
    $(function(){

        $("div.modal-dialog")
            .dialog({autoOpen:false});

        $("input.modal,a.modal").click(function(e){ 
            clicker = $(this);
            if ( clicker.attr('gate') == 'open'){
                clicker.attr('gate','close');
                if(clicker.prop('tagName').toUpperCase() == 'A')
                    // return true だと移動しない...
                    window.location = clicker.attr('href');
                return ;    
            }

            dialog = $(clicker.attr("dialog") );
            dialog.dialog('open');

            dialog.find('.ok').click(function(e){
               dialog.dialog("close");
               clicker.attr("gate","open").click();
            }).button();

            dialog.find('.cancel').click(function(e){
              dialog.dialog("close");
            }).button();

            e.preventDefault() ;
        });

    });
```
ロールオーバーや先読みでgifアニメがおかしくなる件

IE7以上で１回のみのgifアニメが終わっていたり、
ループのgifアニメが途中から表示されてしまうときがあります。

#解決法
先読みを止める。
先読み（ロールオーバーのJSにも含まれていることがあります）によって、（ロールオーバーする前でも）画像を読み込んだ瞬間からgifアニメが動いてしまっておかしくなってしまいます。

##しかしこれだとIE11が動かない・・・
ロールオーバーの画像がgifアニメ（繰り返さない）のとき、ロールオーバー2回目から最後のコマしか表示されなくなった。
[JavaScriptでGIFアニメーションを繰り返し読み込むときの注意点 | iwb.jp](http://iwb.jp/javascript-gifanimation-load/)を参考に、ロールオーバー時の画像にクエリーを付けたら動いた。

```
ロールオーバー時画像パス
↓
ロールオーバー時画像パス+ '?' + (new Date).getTime()
```

##全ブラウザこれでいけるか？と思ったら、Firefoxの挙動がおかしい
[[JavaScript] Memo, IE 10, IE 11を判別するnavigatorプロパティ - userAgentを使わずに « イナヅマTVログ](http://www.inazumatv.com/contents/archives/9662)を参考に、IE11のみ分岐

```
ロールオーバー時画像パス+ '?' + (new Date).getTime()
↓
var is_ie11 = !!window.navigator.pointerEnabled; //IE11かどうか
if(is_ie11) { //IE11のみ
	ロールオーバー時画像パス+ '?' + (new Date).getTime()
} else { //それ以外
	ロールオーバー時画像パス
}
```
スクリーンがミラーリングされているかどうかを知る方法

画面（スクリーン）がミラーリングされているかどうかは、UIScreen インスタンスの mirroredScreen プロパティをチェックすれば良い。

```objc
// class UIScreen
@property(nonatomic, readonly, retain) UIScreen *mirroredScreen
```

スクリーンは、UIWindow にリンクしている。

```objc
// class UIWindow
@property(nonatomic, retain) UIScreen *screen
```

そして、UIWindow は UIApplication にリンクしている

```objc
// class UIApplication
@property(nonatomic, readonly) NSArray *windows
```
Django:入力アイテム数に応じて、子フォームの数を変動させる



入力された注文(Order)の数(units)だけ帯同者(Companion)の子フォームの数を変更させる。


やり方がよくわからんので、強引にやってみる。:

```py
    if request.method == "POST":

          form = OrderForm(user=request.user,
                           ticket=ticket, data=request.POST)
          #: Order(注文)
          is_form_valid = form.is_valid()
  
          #: Companion (帯同者)
          formset = create_companion_formset(
              request, order=form.instance)            
          is_formset_valid = formset.is_valid()

          number = int(form.cleaned_data.get('units', 1)) 
          if number != len(formset.forms):
          
              #: 数に変更があったので、....
              is_formset_valid = False
              old = formset
              
              #: formset を新しい数で作りなおす
              formset = create_companion_formset(None, extra=number)
              
              #: コピーする
              for i in range(min(number, len(old.forms))):
                  formset.forms[i] = old.forms[i]
          
         if is_form_valid and is_forset_valid:
             form.save()
             formset.save()
             
         #:.....
```

追加された子フォームの入力を必須とする:

```py
    class OrderCompanionFormset(BaseInlineFormSet):

        def clean(self):
            for i in range(self.total_form_count()):
                if not self.forms[i].has_changed():
                    _errs = self.forms[i].error_class(
                        [_("Form must be filled.")])
                    self.forms[i].errors['__all__'] = _errs 
```

フォームセットのファクトリ:

```py
    def create_companion_formset(request, order=None, extra=1, *args, **kwargs):
        ''' Companion のフォームセットを作る '''
        kwargs['form'] = CompanionForm
        kwargs['can_delete'] = False
        kwargs['formset'] = OrderCompanionFormset
    
        #: 通常
        if request and request.method == "POST":
            formset = inlineformset_factory(
                Order, Companion,
                *args, **kwargs)(request.POST, instance=order)
    
        else:
            formset = inlineformset_factory(
                Order, Companion, extra=extra,
                *args, **kwargs)(instance=order)
    
        return formset                    
```
                    
_errs のメッセージは non_form_errosにでます:

```html
    {% for form in formset %}
    <h4> 帯同者 </h4>
    {% if form.non_form_errors %}
    <div class="alert alert-error">{{ from.non_form_error.as_text }}</div>
    {% endif %}
	....
    {% endfor %}                                                                  
```
vim-quickrunでjavacの出力が文字化けするのを直す

terminalでの文字化けは

```.bashrc
alias javac = javac -J-Dfile.encoding=UTF8
```

で治せるが，vim-quickrunの場合はvimrcへの設定が必要 

```vim:.vimrc
let g:quickrun_config["java"] = {
      \ 'exec' : ['javac -J-Dfile.encoding=UTF8 %o %s', '%c %s:t:r %a']
\}
```
[参考:vim-quickrun](https://github.com/thinca/vim-quickrun/blob/637aa0f9eab485874eb3606be35586735855d880/autoload/quickrun.vim)

##追記(2014/3/6)

コンパイルだけじゃなくて，実行時にもオプションが必要だった．

terminalの場合は

```.bashrc
alias javac = javac -J-Dfile.encoding=UTF8
alias java  = javac -Dfile.encoding=UTF8
```

vimrcは

```vim:.vimrc
let g:quickrun_config["java"] = {
      \ 'exec' : ['javac -J-Dfile.encoding=UTF8 %o %s', '%c -Dfile.encoding=UTF8 %s:t:r %a']
\}
```

とします．
Boost.Pythonでクラスを定義したらwrong number of template argumentsと怒られた話


    error: wrong number of template arguments (1, should be 4)
    .../boost_1_55_0/boost/python/def_visitor.hpp:14:56: error: provided for ‘template<class T, class X1, class X2, class X3> struct boost::python::class_’  

<a href='http://www.boost.org/doc/libs/1_55_0/libs/python/doc/v2/class.html'>ドキュメント</a>には2個目以降の引数は省略できると書いてあるのに4個必要だと怒られた。

それ #include &lt;boost/python/class.hpp> を忘れてるせいだから〜。残念！
controller,view以外からurl_forを呼ぶ

意外と簡単だったがggってもなかなかヒットしなかったのでメモ。

## やりたいこと

* rake タスクからurl_forを使ってとあるURLを作成したい
 * routs.rbでごにょごにょしてる部分があるので、url_forで解決したい
* root_pathも呼びたい

## 解決方法

```rb
routes = Rails.application.routes.url_helpers
url = routes.url_for(host: "example.com", controller: "users", action: "show", id: 1)
rootpath = routes.root_path
```

以下じゃできなかった
* http://lxyuma.hatenablog.com/entry/2013/02/17/002744
* http://steve.dynedge.co.uk/2010/04/29/rails-3-rake-and-url_for/
heroku run rake db:migrateするとConnection timed outになってしまうので確認したらマイグレーションファイルが複数存在してた


タイトルの通り。こういうのもQiitaに投稿していこうかと。

## `heroku logs`で確認する

```
Error R13 (Attach error) -> Failed to attach to process
```

もっとちゃんとログを見たいときは

```
heroku run:detached rake db:migrate
```
こうすればいいらしい。するとちゃんとrake実行時のエラーが見れる。

```
rake aborted!
Multiple migrations have the name CreateEpisodes
```

CreateEpisodesっていうマイグレーションファイルが複数あるんだとか。いやいやローカルには１つしか無いんですけど。

## 解決
`git status`で確認してみると、ローカルで一度削除した`TIME_create_episodes.rb`が本番にはまだ存在していているんだろうなーというのがわかった。

`git rm app/db/migrate/TIME_create_episodes.rb`してもいいんだけど、他にもgit rmせずに消したファイルがうようよ残っていたので気持ち悪いから一括で消したい。

```
git rm `git ls-files --deleted`
```

これでいいらしい。`git ls-files --deleted`が削除されたファイルなので、それを全部gitから削除するという感じ。

[git rmせずに普通にrmしちゃったファイルたちと一括でgit rmする](http://qiita.com/shim0mura/items/4363769faf25ce485b89)

## 参考
- https://devcenter.heroku.com/articles/error-codes#r13-attach-error

- https://devcenter.heroku.com/articles/one-off-dynos#running-tasks-in-background
Debian Preseed メモ


# ブートパラメータ
```bootparam
install noapic auto=true priority=critical url=http://%IP%:%PORT%/preseed.cfg
```

- noapic: おまじない
- auto=true: キーボード設定なども含めPreseedする
- priority=critical: キーボード設定等、インストールに必須でない選択肢を聞かない
- url=...: Preseedの場所

# Preseed
```veewee-debian-wheezy-preseed.cfg
## ローカリゼーション
# keyboard-configuration/xkb-keymapはkeymapに短縮できるとあるが、
# カーネルパラメータでしか短縮できない (BUG?)
d-i debian-installer/locale string ja_JP.UTF-8
d-i keyboard-configuration/xkb-keymap select jp

## ネットワーク関連
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
d-i netcfg/wireless_wep string
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.jp.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string


## ユーザ
# vagrant用の設定
# root-login=falseならば、一般ユーザは自動的にsudo可能になる
d-i passwd/root-login boolean false
d-i passwd/user-fullname string vagrant
d-i passwd/username string vagrant
d-i passwd/user-password password vagrant
d-i passwd/user-password-again password vagrant


## タイムゾーン
d-i clock-setup/utc boolean true
d-i time/zone string Asia/Tokyo
d-i clock-setup/ntp boolean true


## パーティション
# MBRでセットアップする
d-i partman-auto/method string regular

# 何があっても既存のパーティションを強制的に削除
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

# 単一パーティション
d-i partman-auto/choose_recipe select atomic

# 何があっても新しいパーティションを強制的に作成する
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
tasksel tasksel/first multiselect


## パッケージ
# 起動時に時刻があっていて、sshでアクセスできるようにする
d-i pkgsel/include string openssh-server ntp


## 終了処理
# 再起動するか確認しない
d-i finish-install/reboot_in_progress note
```
Xamarin.Mac+MvvmCrossでアプリ開発を始める準備の準備（2014年3月）

##Problem
Xamarin.Android, Xamarin.iOSの話ばかりでXamarin.Macの話題がなかなか出ません。
ということでMvvmCrossを使ってXamarin.Macアプリ開発をする準備の準備です。これでようやくスタートラインに立てます。

3.1.1時点のNuSpecではXamarin.MacプロジェクトにMvvmCrossを追加すると･･･
![Screen Shot 2014-03-03 at 4.32.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/34563/e704f8d4-9c58-67e5-4a89-c2331bd8a2ad.png "Screen Shot 2014-03-03 at 4.32.58 PM.png")
これではもうどうしようもありません。ちなみにMonoMacプロジェクトでも同様です。現在NuSpecにMonoMac, XamMacの記述はありません。

##Build
ビルドしましょう。リポジトリを下記GitHubからクローンします。
https://github.com/MvvmCross/MvvmCross
開くのは`MvvmCross_Mac.sln`です。
![kobito.1393832441.136574.png](https://qiita-image-store.s3.amazonaws.com/0/34563/8ebc5574-8754-81f1-eff7-627c09b0c921.png "kobito.1393832441.136574.png")
FirstDemo,ApiExamplesプロジェクトについてXamarin.Macに移行するか確認されます。インストールされていれば，Migrateしておきましょう。

###初期状態でビルドできるもの
Cirrious.CrossCore
Cirrious.MvvmCross
Cirrious.MvvmCross.Binding
Cirrious.MvvmCross.Localization
Cirrious.MvvmCross.Mac
System.Windows.Mac

###MSBuildエンジンではビルドできないもの
![kobito.1393832702.160555.png](https://qiita-image-store.s3.amazonaws.com/0/34563/a8bdc763-0f46-8b91-8177-c84e1e0e25e6.png "kobito.1393832702.160555.png")
Use MSBuild build engineのチェックボックスをオフにします。
Cirrious.CrossCore.Mac
Cirrious.MvvmCross.Binding.Mac

##Try
ではApiExamples.Macプロジェクトをビルド，実行してみましょう。
事前にApiExamples.MacプロジェクトのTarget FrameworkをMono/.NET 4.5に変更しておいてください。すると･･･
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/34563/581c774e-33fc-6c80-913c-83dfd00131f2.png "Untitled.png")

```
AppDelegate.cs(37,37): Error CS0012: The type `MonoMac.AppKit.NSApplicationDelegate' is defined in an assembly that is not referenced. Consider adding a reference to assembly `MonoMac, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' (CS0012) (ApiExamples.Mac)
```

そうです。Xamarin.MacではMonoMacネームスペースをXamMac.dllで提供していますが，MvvmCrossライブラリが参照しているのはGPLのほうのMonoMacです。

##Solution
MonoMacではMonoランタイム同梱ができないし，ライセンス的にも商用では大変困ります。
MonoMacを参照しているプロジェクト全てに対し，MonoMacからXamMac.dllへ参照を変更します。XamMac.dllは適当なXamarin.Macプロジェクトをビルドすれば配置されるのでこれを使うことにします。![kobito.1393833604.628030.png](https://qiita-image-store.s3.amazonaws.com/0/34563/788c02af-7de5-d0f6-19ca-6f3a3442d08b.png "kobito.1393833604.628030.png")
こんな具合に下記の3プロジェクトを書き換えてください。コピー＆ペーストが使えます。
Cirrious.CrossCore.Mac
Cirrious.MvvmCross.Binding.Mac
Cirrious.MvvmCross.Mac

では再度ApiExamples.Macをビルド，実行しましょう。
![Screen Shot 2014-03-03 at 5.06.05 PM.png](https://qiita-image-store.s3.amazonaws.com/0/34563/c93b2065-24ba-3de0-e73a-90c4609d0958.png "Screen Shot 2014-03-03 at 5.06.05 PM.png")

できました。しかしこのままではリリースビルドできません。
![Screen Shot 2014-03-03 at 5.08.29 PM.png](https://qiita-image-store.s3.amazonaws.com/0/34563/90c76f3b-6934-a48e-3478-dbf66bb38fd7.png "Screen Shot 2014-03-03 at 5.08.29 PM.png")
Don't Link,またはLink Framework SDKs Onlyに変更してください。

できあがったDllを参照すれば自分のプロジェクトでMvvmCrossを使えるようになります。

##Conclusion
Xamarin.Macが大好きです。
MvvmCross 3.1.2ではNuSpec変更の予定もあるようなので，しばらく待てばこの状況は解消されるはずです。きっと。
AppStreamクライアント(windows)のビルド

# ソースコード
[Amazon AppStream SDK](https://s3.amazonaws.com/appstream-sdk/AppStreamSDK_1.2.0.13.zip)

# CMake
### [cmakeダウンロード](http://www.cmake.org/)

### 手順
 * Where is source codeに、「CMakeLists.txt」の含んでいるディレクトリを指定する
  * AppStreamSDK_1.2.0.13\example_src\client\projects\windows
 * where to build the binaresに、メーク先を指定する
 * 「Configure」をクリックして、Visual Studio バージョンを選択して、Finishをクリックする
 * ↑成功すると、「Generate」ボタンをクリックする

# ビルド
### Visual Studio 2013(評価版)をインストール

### プロジェクトを開く
 * AppStreamClient.vcxprojを選択

### ビルド
 * プロジェクトを選択して、「ビルド」をクリックする

### トラブル
 * エラー情報
```
2>     ライブラリ C:/Users/alinwi/Desktop/PCMac/AppStreamSDK_1.2.0.13/precompiled_samples/windows/x86_2013/Release/AppStreamClient.lib とオブジェクト C:/Users/alinwi/Desktop/PCMac/AppStreamSDK_1.2.0.13/precompiled_samples/windows/x86_2013/Release/AppStreamClient.exp を作成中
2>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
2>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
```

 * 対応方法 
  * AppStreamClient プロパティ→構成プロパティ→リンカー
  * /NOD:LIBCMT.lib をコマンドラインオプションに追加する

# 別の機器に、使う（Visual Studio 2013なし）
### 以下のソフトをインストール
 * Visual C++ Redistributable
 * Microsoft DirectX Software Development Kit

### 以下のコードをコピーする
 * ビルドしたファイル（.exeなど)
 * AppStreamSDK_1.2.0.13\bin\windows\x86下のファイル
 * AppStreamSDK_1.2.0.13\3rdparty\windows\ffmpeg\bin\x86下のファイル

### quickRun86.batを配置
 * AppStreamSDK_1.2.0.13\precompiled_samples\windows\x86\quickRun86.batをコピー
 * binと3rdpartyのパスを修正
 * ビルドディレクトリ下に、修正する
3/3日のJavaScript学習内容

~P171 5章終


本日は５章まで終わらせる事が出来ましたが、
まだ内容が定着しきっていないのと、確認のために今までの内容を復習しました。

特に５章の関数のところでは、
プログラムをネストされると理解するのに結構時間がかかってしまうので
６章に入る前にもう少し学習しようと思います。

新規の内容はクロージャを用いた関数のプログラムですが、
クロージャを用いると、プログラム内の変数が初期値に戻らないため、
何度も似たような文を作成せずに一つの関数のみで書け、
上手く使えば便利なテクニックのひとつだと感じました。
AppStreamサンプルで、サーバー構築

# 参照
* [Running the Sample Amazon AppStream Applications](http://docs.aws.amazon.com/appstream/latest/developerguide/appstream-first-application.html)
 

# AppStream Applicationサーバー構築
### https://console.aws.amazon.com/appstreamに、「Get Started」ボタンをクリックする
### Step 2: Deployに、以下の情報を入力してください
##### Application name
 * 例：appstream_sample_test_yan

##### Application description（任意）
##### Pre-signed S3 URL to installer
 1. サンプルアプリホストをダウンロードする　(参照)
 2. S3側
  * バケットを作成して、↑のDLしたファイルをアップロードする
 3. Firefox側
  * Firefoxに、S3Fox Organizerをインストールする
  * 「Manage Accounts」に、キーペアとユーザ名より、ユーザを作成する
  * S3に作成したバケットに、アップロードしたファイルに対して、右キーをクリックして、「Get Pre-signed Urls」を選択する
  * Set Expiry: 2400 hours
  * https
  * 「Generate Urls」をクリックて、生成したURLをコピーする

##### Installer parameters（任意）

##### Launch path
 * C:\app\XStxDirectXServer\XStxDirectXServer.exe

##### Launch parameters（任意）

### プレビュー　→　開始
 


# 認証用サービス構築
### cloudformation　console画面に、「Create New Stack」ボタンをクリックする

### Create A New Stack画面に、以下を入力
 * Name
 * Source - Provide an S3 URL to template
 * http://appstream-sdk.s3.amazonaws.com/appstreamEntitlementService.template

### Specify Parameters画面に、以下を
 * AccessKey
 * CommandStr
  * java -DUIPin=XXXXX -DappstreamEndpoint=appstream.us-east-1.amazonaws.com -jar /opt/appstream/entitlement-service.jar
 * FileURL
  * http://appstream-sdk.s3.amazonaws.com/sample-entitlement-service-1.0.0.jar
 * KeyPair Name
 * SecretKey

### Use the Sample Entitlement Service
1. https://console.aws.amazon.com/cloudformation/homeに、作成したstackを選択して、「Outputs」に、PublicDNSを見える
1. http://[PublicDNS]:8080/webへアクセスする
1. 上記に、使った-DUIPin=XXXXXで、sign inする
1. Grant access only to users listed below.を選択する
1. ユーザネームを入力して、「All Entitlements」を選択する
1. 「Add User」をクリックする