OmniAICreator/Qiita-1.07M huggingface dataset:
英語環境のVagrantboxを日本語化する

##経緯
Macでvagrantを導入し、[Vagrantbox.es](http://www.vagrantbox.es/)のboxを利用していました。
ただ、日本語を利用する機会(Zabbix Webの日本語環境)が出てきた為、日本語にしてみました。

##利用したBox
CentOS 6.5 x86_64 VirtualBox

##英語環境のVagrantboxを日本語化する方法(CentOSの場合)

```
yum groupinstall "Japanese Support"
LANG=ja_JP.UTF-8
export LANG
localedef -f UTF-8 -i ja_JP ja_JP
shutdown -r now
```

1. まず日本語化に必要なものをインストールします。

2. 言語を日本語 / UTF-8に変更します。

3. OSのロケール情報を日本語 / UTF-8に対応させます。

4. OSを再起動して設定を反映させます。

上記の設定を実行することで、日本語化することが可能になります。

※ 不要・間違い等がありましたらご指摘下さい。
Postfixのipv6設定を無効にする方法

##Postfixでipv6を使えないというエラーが届く

```
send-mail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
send-mail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only
```

CentOS6.2の環境でPostfixを運用していると、上記メッセージが届く場合があります。
注：2013/04に私が対応した内容の共有です。
　　現在の状況は確認していません。

これは、CentOS6系のPostfixでipv6がデフォルトで有効になっている為で、OSの設定でipv6を無効にした場合に発生するようです。

その為、Postfixの設定ファイルで、ipv6を無効にすればエラーメッセージは届かなくなります。

```
vi /etc/postfix/main.cf
---(下記を変更)--------------------------- 
inet_protocols = all 
　↓ 
inet_protocols = ipv4
------------------------------
```

上記の修正を実施してPostfixを再起動すればエラーはでなくなります。
`c`,`s`,`r`コマンドで、書き換え前の文字列に応じてIMオン/オフを切り替えるVimプラグインを作りました

# `c`,`s`,`r`コマンドで、書き換え前の文字列に応じてIMオン/オフを切り替えるVimプラグインを作りました

[Vim Advent Calendar 2013](http://atnd.org/events/45072)の92日目(2014-03-02)の記事です。

普段はtutcode keymapを使って日本語を入力しているのですが、
ソースコード編集時に、
関数名書き換え等の際にたびたび日本語入力をオフにする操作を
していることに気づきました。

書き換え前の関数名はASCII文字しか使っていないので、
こういう場合は最初から日本語入力はオフにしておいて欲しい、
と思ったのでプラグイン[contextimi.vim](https://github.com/deton/contextimi.vim)を作りました。

以下の機能を提供します。

* ASCII文字列を`c`、`s`、`r`で書き換える際は、IMをオフに切り替え
* 日本語文字列を`c`、`s`、`r`で書き換える際は、IMをオンに切り替え

使い始めたばかりですが、今のところほとんど違和感なく使えています。
("ASCIIで"を"日本語で"に書き換えようとすると
IMオフになっていらつくことはありました。
書き換え前の文字列に加えて、その前後の文字まで見る方がいいのかも)

## IMのオン/オフの切り替え制御
IMのオン/オフの切り替え制御は、デフォルトでは
`&iminsert`の値を2や0に設定することで行います。(Windowsのgvimの場合など。)

その他のIM切り替え方法に関しては、以下を参考にしてください。

* [日本語入力固定モード](https://sites.google.com/site/fudist/Home/vim-nihongo-ban/vim-japanese/ime-control)
* `'imactivatekey'`関係
 * https://github.com/koron/imcsc-vim/
 * [Ubuntu上のVimでIME(ibus制御)](http://www.kaoriya.net/blog/2013/07/15/)
 * [CUIでもimaf/imsfを使いたい - Issue #444 - vim-jp/issues - GitHub](https://github.com/vim-jp/issues/issues/444)

IM切り替え方法のカスタマイズをしたい場合は、
IM切り替えを行う関数を定義して、
その関数名を`contextimi_activatefunc`に設定してください
(以下の設定例も参考)。

関数の引数は`'imactivatefunc'`と同じです。

## IMオン/オフ切り替えを行うかどうかの判定方法のカスタマイズ

IMのオンもしくはオフが必要かを判定するための関数を定義して、
その関数名を`contextimi_decideimcfunc`に設定してください
(以下の設定例も参考)。

例えば、行末コメント中に日本語がある行で、
行頭から`C`コマンドを使うとIMオンに切り替えますが、
そうではなく、IMオフに切り替えたい場合、その判定を行う関数を作成して、
`contextimi_decideimcfunc`オプションに設定してください。

## 設定例: tcvime(1.5.0)とtutcodep keymapの場合
tcvimeは`keymap`を使うので、
tcvime#Activate()では、`&iminsert`の値を1や0に設定しています。

TcvimeDecideImControl()では、
tutcodep keymapの場合、数字や一部記号はlmapオンでも直接入力可能なので、
それらの文字が書き換え対象の場合はIMをオフにしないようにしています。
(意図しない時に切り替わる可能性を減らすため。)

```vim:.vimrc
function! TcvimeDecideImControl(str)
  if a:str =~ '[^\x00-\x7f]'
    return 1
  endif
  " IMオフにしないと入力が面倒な文字が含まれる場合はオフにする
  " tutcodep keymapの場合、数字・一部記号・一部大文字はlmapオンでも直接入力可
  if a:str =~ '[^-0-9 -+:<-@[-`{-~]'
    return -1
  endif
  return 0
endfunction
let contextimi_decideimcfunc = 'TcvimeDecideImControl'
let contextimi_activatefunc = 'tcvime#Activate'
```

## 拡張案: `a`,`i`,`o`コマンドへの対応
現状は`a`,`i`,`o`コマンドには未対応です。

このプラグインによるIMオン/オフ制御が、
ユーザの意図と異なる切り替えを頻繁に行うとかえって邪魔なので、
あまり意図から外れなさそうな`c`,`s`,`r`からまず対応しています。

`a`等に対応するには、カーソル前後の文字に応じて行うことになると思います。
* カーソル前後の文字が両方ともASCIIならIMオフ
* カーソル前後の文字が両方とも日本語ならIMオン
* カーソル前がASCIIで行末の場合はIMオフ
* カーソル前が日本語で行末の場合はIMオン

## 関連
* `'imactivatekey'`関係
 * https://github.com/koron/imcsc-vim/
 * [Ubuntu上のVimでIME(ibus制御)](http://www.kaoriya.net/blog/2013/07/15/)
 * [CUIでもimaf/imsfを使いたい - Issue #444 - vim-jp/issues - GitHub](https://github.com/vim-jp/issues/issues/444)
* [IMEのON/OFFをsyntaxで制御する - Issue #13 - vim-jp/issues - GitHub](https://github.com/vim-jp/issues/issues/13)
* [日本語入力固定モード](https://sites.google.com/site/fudist/Home/vim-nihongo-ban/vim-japanese/ime-control)
Phalcon の公式ドキュメントをまるごとダウンロードするワンライナー


Phalcon で開発していると、しょっちゅう公式ドキュメント(`http://docs.phalconphp.com/en/latest/`)を参照することになるのですが、若干遅くてサクサク参照できないのでサイトを丸ごとローカルにダウンロードしておくとよいと思います。

適当なディレクトリで、

```
wget -rpkK -l0 -np --cut-dirs=1 http://docs.phalconphp.com/en/latest/
```

サクサク見れるし、ネットにつながってなくても開発できるし、捗ると思います。
（Phalcon に限った話ではないんですが）
_.extendはcloneをしてくれるはず、と勘違いしていた話

本当にただの勘違い、というか思い込みなのだけど……


```js
var a = {a: 1},
    b;

b = _.extend(a, {b: 2});

console.dir(a);  // {a: 1, b: 2}
console.dir(b);  // {a: 1, b: 2}

b.a = 3;

console.dir(a);  // {a:3, b:2}
console.dir(b);  // {a:3, b:2}
```

oh...

`_.extend`したらてっきりディープコピーされるのだと思ってたよ……

`_.extend`に渡すときに`_.clone`か`_.cloneDeep`しないとだったんだね……

ちゃんとドキュメント読まないとだし、思い込んでないで試さないとだなあ。
Chromeのアドレスバーからの検索をGoogle.co.jpにする

Google Chromeを利用して、海外でググってると、その国のドメイン(ベトナムだとwww.google.com.vn)で検索されるため、問題ないときもあれば、その国のサイトから検索結果を返すときもあるので、なかなか不便だったりする。

Google Chromeの設定に行き、「検索エンジンの管理」でこれを入力し、デフォルトに設定すれば、常に日本のGoogleから検索結果を返してくれる。

```
検索エンジン名: Google.co.jp
キーワード: google.co.jp
URK: https://www.google.co.jp/search?q=%s
```

![スクリーンショット 2014-02-28 20.31.06.png](https://qiita-image-store.s3.amazonaws.com/0/1818/84609ed1-ac41-e9cd-f979-c06c3b6828bd.png)
ネットワークを学びなおす！

最初はAIのKnowledge Engineerを志したLisperが、流れ流れてITの中の人になりました。
開発サーバ類を中心に担当してきたので、ネットワーク正直弱いんですが、そうも言ってられない状況で、即効性第一で勉強しなおします！

理論よりも、一刻も早く動かさないとつまらない性分なので、ひたすら何か動かし続けながら、目指すはSDNの世界。ちょっとはましなサーバサイドプログラミングの知識を使ってネットワークを、まぁいつかは制御できるように頑張っていきたいと思います。ご先達の方いらっしゃいましたらコメントをお待ちしております。

当面はVyattaというソフトウェアルータにバリバリ興味あり。
これをVMware ESXiで動かせば、面倒な配線とか不要で色々実験できます。社内ネットワークをESXi上でシミュレートするくらい使い倒してみたい。そしてCCNAの黒本をVyattaで一通り勉強するつもりです。どっかでSDNの流れにのって、プログラミングに話を戻します。長期間脱線すると思いますが皆様ご容赦のほどを。</br>

まずは、現在中古でプレミア価格がついているこの書籍をベースにVyattaに迫ります。
<a href="http://www.amazon.co.jp/gp/product/4774147117/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4774147117&linkCode=as2&tag=mfyk-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4774147117&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=mfyk-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=mfyk-22&l=as2&o=9&a=4774147117" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
WebViewからfacebookへログインしたあとの白い画面対応

#はじめに
webView内でいいねボタンを押すだけ、が思った以上に大変でした。
国内の記事がなかったので、べつの方法もあるとは思いますが
探しきれなかったので、こちらに書いておきます。

#facebookのログイン機能を素のwebviewでつかう
##ログイン情報がログアウト、初回のアクセス
いいねボタンやシェアボタンを押したあとの挙動はログインページに遷移しました。
アプリ側は何もしなくても、webview内でJSがそのまま実行しているままの挙動です。
ログインし、表示されたのは真っしろな画面。

##もう一度良いねボタンを設置したページを表示
ログイン前と同じ状態で表示されていました。
ボタンを押すと、いいねボタンのカウントアップが確認できたので
ああ、ログインできてたんだ・・・ということが分かります。

これはあかん。

#挙動をみる
##ControllerへUIWebViewDelegateのメソッドを追加
```objc:ViewController.m
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *urlString = [NSString stringWithFormat:@"%@", request];
    NSLog(@"url :%@", urlString);
    return YES;
}
```
怪しい名前のURLがログに出力される
https://www.facebook.com/plugins/close_popup.php#_=_

#close_popup.phpは何をしているのか
```html:close_popup.php
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Facebook</title></head>
<body><script>window.close();</script></body>
</html>
```
webviewだと何もしません。だから問題。

#どうしようか
表示しないのがいい。（という判断）
でも遷移しないとログイン画面から動けない

戻ろう・・・

```objc:ViewController.m
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([urlString rangeOfString:@"close_popup.php"].location != NSNotFound) {
        if (webView.canGoBack){
            [webView goBack];
        }
    }
    return YES;
}
```
#コード全部

```objc:ViewController.m
@interface ViewController ()<UIWebViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    CGRect r = [[UIScreen mainScreen] bounds];
	// Do any additional setup after loading the view, typically from a nib.
    UIWebView *wv = [[UIWebView alloc] init];
    wv.delegate = self;
    wv.frame = CGRectMake(0, 0,r.size.width, r.size.height);
    wv.scalesPageToFit = YES;
    [self.view addSubview:wv];

    NSURL *url = [NSURL URLWithString:@"いいねボタンなどをおいたコンテンツのURL"];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    [wv loadRequest:req];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *urlString = [NSString stringWithFormat:@"%@", request];
    //NSLog(@"url :%@", urlString);
    if ([urlString rangeOfString:@"close_popup.php"].location != NSNotFound) {
        //NSLog(@"close_popup.php found");
        if (webView.canGoBack){
            [webView goBack];
            return NO;
        }
    }
    return YES;
}
@end

```
#参考URL
http://stackoverflow.com/questions/11622845/facebook-login-fails-in-uiwebview
http://brainwashinc.com/2014/01/06/ios-uiwebview-handle-window-openwindow-close-popup-page/
http://sakebook.blogspot.jp/2013/03/facebookjavascriptsdkuiwebview.html
#最後に
Facebookから提供されているiOS用のSDKでログインするとパーミションが表示されるのが嫌なので
こちらの方法を取りますが
iOSの場合はAppleの申請がネックになり、Facebook側に仕様変更（close_popup.phpの名前が変わるなど）が発生すると修正までのタイムラグになり機会損失につながります。

「JSでの回避、webviewは素のままで」が望ましい。
（メモ）Vagrant環境でDjango

**mod_wsgi** なるものが橋渡ししてくれるようなのでインストール（他にも方法はあるっぽいが今回はこれで）

```
sudo yum install mod_wsgi
```

あとは[ここ](http://d.hatena.ne.jp/kuma8/20070430/1177942455)を参考にして進めていく。
**/etc/httpd/conf.d** 下に拡張子が **.conf** の新規ファイルを書き（ **/etc/httpd/conf/httpd.conf** のサブ的な扱いなのだろうか？）、指定した箇所に動作用の **.wsgi** スクリプトを書く。

なお、参考ページでは **cgi-bin** の下にDjangoプロジェクトを置いているようだが、別にどこでもいい模様（もちろんその場合は該当の.confのディレクトリ部分を書き換える）。

それらができたら以下で再起動。

```
sudo service httpd restart
```

**WSGIScriptAlias** の第二引数で指定したURL（他とカブっていると多分InternalServerError）にアクセスするとページが表示される
Growthforecastをサブディレクトリで動かすメモ


`http://example.com/growthforecast/`でgrowthforecastを動かしたい！

growthforecastを`--front-proxy`を指定して起動。


```bash
growthforecast.pl \
    --data-dir /opt/racelive/growthforecast/ \
    --host 127.0.0.1 \
    --front-proxy 192.168.0.1  # proxyのWAN側IPアドレス
```

nginxのserverディレクティブでproxy_passの設定をする。

```nginx:exmaple.com.conf
    location /growthforecast {
        proxy_pass http://127.0.0.1:5125;
        proxy_set_header Host $host/growthforecast;
        rewrite ^/growthforecast/(.*) /$1 break;
    }
```

スラッシュが2個ついてしまうので調査中…。
rake db:migrateした後はサーバを再起動すべし！

## 現象

1. 複数台いるサーバからmigrateで、とあるテーブルにカラム追加(デフォルト値あり)
1. カラム追加したテーブルのモデルをfind、追加したカラムの値を更新するとDBに反映されない
1. カラム追加したテーブルのモデルをnew+saveして、追加したカラムの値を更新しようとすると例外発生

### ハマりどころ
* 複数台いるサーバのプロセスのうち、上記の現象が発生しないプロセスがいる
* サーバはpassengerで起動
* 起動後～マイグレまで寝ていたプロセスがマイグレ後に起こされたら、DBスキーマをそのとき初めてメモリにロードする？(ここでは深追いしてない)

## 原因

migrate後～rails再起動の間のActiveRecordの挙動のよう。
findとcreateしたモデルでは挙動が異なったのでそれぞれまとめる。

### findしたモデルのマイグレ前後のupdate_attributes

* findしたモデルは追加したカラムの値を読める
* findしたモデルは追加したカラムに対してupdate_attributesするとログからは成功したように見える
 * DBのコミットログは流れる
 * モデルから属性にアクセスすると値が更新できてない
 * 実際にDBを見にいくと、カラムの値が更新されてない

再現手順

```rb
#===== マイグレ前 =====
user = User.first
user.hoge
#=> NoMethodError: undefined method `hoge'
user.update_attributes!({ :hoge => "updated" })
#=> ActiveRecord::UnknownAttributeError: unknown attribute: hoge

#===== 別コンソールでmigrate実行(hogeカラム作成) =====
user.hoge
#=> NoMethodError: undefined method `hoge'
user.update_attributes!({ :hoge => "updated" })
#=> ActiveRecord::UnknownAttributeError: unknown attribute: hoge

#===== ユーザオブジェクトを取り直して再実行 =====
user = User.first
user.hoge
#=> "default"
user.update_attributes!({ :hoge => "updated" })
#=> true (DBのコミットログは流れるが、DBを直接見ても更新されていない)
{code}
```

### new+saveしたモデルのマイグレ前後のupdate_attributes

* new+saveしたモデルは追加したカラムの値を読めない
* new+saveしたモデルは追加したカラムに対してupdate_attributesできない

再現手順

```rb
user = User.new(:name => "Foo")
user.save!
user.hoge
#=> NoMethodError: undefined method `hoge'
user.update_attributes!({ :hoge => "updated" })
#=> ActiveRecord::UnknownAttributeError: unknown attribute: hoge

#===== 別コンソールでmigrate実行(hogeカラム作成) =====
user.hoge
#=> NoMethodError: undefined method `hoge'
user.update_attributes!({ :hoge => "updated" })
#=> ActiveRecord::UnknownAttributeError: unknown attribute: hoge

# ユーザ作り直して再実行
user = User.new(:name => "Bar")
user.save!
user.hoge
#=> NoMethodError: undefined method `hoge'
user.update_attributes!({ :hoge => "updated" })
#=> ActiveRecord::UnknownAttributeError: unknown attribute: hoge
```

## 結論

* マイグレしたらRails再起動しましょう！
Rails複合ユニーク制約のバリデーション


# Goal

```
* RDBMS側で複合ユニークキーを設定している前提
* Railsのバリデーションによって、Insert SQLを投げる前に重複をチェックする
```

# Preparation

```shell-session
$> uname -a
Linux *** 2.6.32-358.el6.i686 #1 SMP Thu Feb 21 21:50:49 UTC 2013 i686 i686 i386 GNU/Linux
$> cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
$> ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [i686-linux]
$> rails -v
Rails 4.0.2
```

# Example

```
* ユーザが各課題に対して1日1つ日報を出すという設定.
* user(ユーザ)/date（日にち）/subject（課題）でユニークになるようにRDBMS設定している.
* validates_withヘルパでカスタムバリデータをよびだす
* カスタムバリデータはapp/validators以下に定義して、record変数で渡ってくるバリデーション対象でDB selectを実行する
```

```rb:app/model/daily_report.rb
class DailyReport < ActiveRecord::Base
  belongs_to :user
  validates_with DailyReportComplexUniqueValidator
end
```

```rb:app/validators/daily_report_complex_validator.rb
class DailyReportComplexUniqueValidator < ActiveModel::Validator
  def validate(record)
    daily_report = DailyReport.find_by(
      user_id: record[:user_id],
      date: record[:date],
      subject: record[:subject]
    )
    if !daily_report.nil?
      record.errors[:base] << 'user_id, date, subjectのデータがすでに存在しています。'
    end
  end
end
```

# References

* http://edgeguides.rubyonrails.org/active_record_validations.html#performing-custom-validations
.ssh/configで設定すると接続が楽になる方法

puttyよりcygwin派です。
cygwinでsshする時に、.ssh/configに書くと便利な設定を記載。

##１．接続が閉じられるのを防ぐ
アクセス先のサーバーで何も操作しないと、一定時間で接続が切れてしまうことがあります。
これを防ぐには

```
ServerAliveInterval 30
```
を追加します。
自動で30秒に1回サーバーに通信し、接続が切れるのを防ぎます。
※秒数は変更可能。

##２．別名で接続
接続先サーバー名にホスト名がなかったり、ドメインが長い、分かりづらい場合に設定します。

**[設定前の接続方法]**

```
ssh 123.567.890.001
```
**<設定>**

```
Host sample1
	HostName 123.567.890.001
```

**[設定後の接続方法]**

```
ssh sample1
```
（以下の全ての方法でも同じ）

##３．別名で接続＋ポート指定

**[設定前の接続方法]**

```
ssh -p10123 123.567.890.001
```

**<設定>**

```
Host sample1
	HostName 123.567.890.001
	Port 10123
```
##４．別のアカウントで接続
通常使用しているアカウントとは別アカウントで接続。
**[設定前の接続方法]**

```
ssh -i ~/.ssh/sample_id_rsa abc@123.567.890.001
```
**<設定>**

```
Host sample1
	HostName 123.567.890.001
	User abc
	IdentityFile ~/.ssh/sample_id_rsa
```

##５．多段接続
**[設定前の接続方法]**

```
ssh 111.111.111.111
ssh 222.222.222.222
```

**<設定>**

```
Host sample1
	HostName 222.222.222.222
	ProxyCommand ssh -W %h:%p 111.111.111.111
```
Ruby と C#(LINQ) と Java8 で FizzBuzz


出尽くしたネタなんでしょうけども、個人としては初めて書きました（^_^;）

## Ruby

勉強会で教えてもらったので、初めて書きました。

```ruby:fizzbuzz.rb
p (1..100).to_a
.map{|x| 
  if    x%15==0 then "FizzBuzz" 
  elsif x%3==0  then "Fizz" 
  elsif x%5==0  then "Buzz" else x end}
.join(",")
```

## C＃

```csharp:fizzbuzz.cs
Console.WriteLine(
Enumerable.Range(1, 100)
.Select(x=> 
  x%15==0 ? "FizzBuzz" :
  x%3==0  ? "Fizz" :
  x%5==0  ? "Buzz" : x.ToString())
.Aggregate("", (acc, x) => acc=="" ? x : acc + "," + x));
```

文字列をつなげるのは ``String.Join`` で良いんだけど、Ruby の ``join`` っぽくしてみたかったので、``Aggregate`` を使ってみました。

## Java8

```java:
System.out.println(
Stream.iterate(1, x->x++).limit(100)
.map(x->
  x%15==0 ? "FizzBuzz" :
  x%3==0  ? "Fizz" :
  x%5==0  ? "Buzz" : String.valueOf(x))
.collect(Collectors.joining(",")));
```

Ruby 短いっすね。
Ansibleのshellモジュールをchanged_whenと組み合わせて柔軟に


ふつうにshell叩くと常に実行されて`changed=1`になり気持ち悪い. changedになる条件を`changed_when`で定義することが出来る.

```yaml
tasks:
  - name: install python-apt
    shell: LC_ALL=en_EN.UTF-8 sudo apt-get install -y python-apt
    register: result
    changed_when: '"is already the newest version" not in result.stdout'
  - debug: var=result
```

* ポイント
  * commandではなくshell moduleを使う. commandだとchanged_when行で`error while evaluating conditional`とエラーが発生
  * 日本語出力だとマッチさせにくいので`LC_ALL=en_EN.UTF-8`を付ける
  * shell実行結果を変数にregister. `register.stdout`, `register.stderr`等が使える
  * 試す時はdebug行つけるとよい


## 追記

上の例はAnsibleでaptモジュールを使うために`python-apt`を入れる必要があったため作成したタスクで, 単純にapt-getでなにか入れたいだけなら, shellでなくaptモジュールで

```yaml:apt.yml
- name: install nginx
  sudo: yes
  apt: pkg=nginx update_cache=yes
```

こんな風に書くだけで良い
RubyMineでファイルが別の種類のファイルとして開かれてしまったときの対処法


RubyMineで、ファイル生成時に間違って別のテンプレートを選んでしまうと、slimファイルなのにxhtmlファイルとして扱われてしまったりします。 こうなってしまうとファイルを開いてもファイルの扱いを変更する手段はありません。

PreferencesからFile Typesを開くと、以下の様な画面が表示されます。

![ 2014-02-28 18.52.30.png](https://qiita-image-store.s3.amazonaws.com/0/16896/c6385cc9-2f20-d091-0e91-baa1733cb2f3.png " 2014-02-28 18.52.30.png")

すると、_product_image_edit_buttonというファイルがRegistered Patterns に追加されているのが分かります。 これがいけない。

選択した状態で下のマイナス記号のボタンを押下すれば、この問題は解決します。
iOSの拡張キーボードに設定したUIToolbarの色を合わせる方法

拙作のArrow NoteではinputAccessoryViewにUIToolbarを使っています。これはボタンを配置するのが楽ちんなのですが、iOS7になってキーボードに色を合わせるのに苦労しました。というのも、UIToolbarはtintとかいうエフェクトが掛かって、単にキーボードと同じ色に設定しても駄目なのです。というわけで、試行錯誤した結果を共有いたします。
(iOS7.1で色が変わったので修正しました)

```objc:ObjectiveC
@interface ViewController : UIViewController
@property IBOutlet UITextView *textView;
@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    if (self.textView.keyboardAppearance == UIKeyboardAppearanceAlert) {
        toolBar.barTintColor = [UIColor colorWithWhite:0.246 alpha:1];
    }
    else {
        toolBar.barTintColor = [UIColor colorWithRed:0.797 green:0.812 blue:0.840 alpha:1.000];
    }
    self.textView.inputAccessoryView = toolBar;
}
@end

```
Tomcat でヒープの統計情報を取得する方法

Tomcat のどのクラスがメモリリークしているかを確認したい時があります。

例えば、fullGC されているのに全然ヒープ使用量が減らない、ソースコードを読んでも検討がつかない
何かキッカケだけでも欲しい！などなど。

どのクラスが現在どれだけのインスタンスが存在していて、
どれだけのメモリを使っているのかを確認するには以下の様な手順で
ヒープの統計情報を取得することで可能になります。

以下は Amazon Web Services(AWS) の EC2 に Tomcat 7 をインストールしている前提です。

##準備
1. /etc/tomcat7/tomcat7.conf を編集する
    (バックアップを取るのを忘れずに・・・)
    
    `sudo vi /etc/tomcat7/tomcat7.conf`

    CATALINA_TMPDIRの下あたりに以下を追加
    `CATALINA_OPTS="-XX:+PrintClassHistogram"`
2. 再起動する
    ` sudo service tomcat7 restart`

##ヒープの統計情報を取得
1. Tomcat を起動している Javaプロセスに SIGQUIT を送信する
`ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs sudo kill -3`


2. ログにヒープの統計情報が出力されます
`tail -f /var/log/tomcat7/catalina.out`

ログにはこんな感じで出力されます↓

```
 num     #instances         #bytes  class name
----------------------------------------------
   1:         25100        3988192  <constMethodKlass>
   2:         25100        3222400  <methodKlass>
   3:          2091        2768360  <constantPoolKlass>
   4:         21482        2353672  [C
   5:          1813        1515712  <constantPoolCacheKlass>
   6:          2091        1437248  <instanceKlassKlass>
   7:          5346         860552  [B
   8:           622         550584  [I
   9:         21167         508008  java.lang.String
  10:          4038         323040  java.lang.reflect.Method
  11:          2339         283336  java.lang.Class
  12:          8826         282432  java.util.HashMap$Entry
  13:           456         230624  <methodDataKlass>
  14:          3337         203528  [S
  15:          3339         189808  [[I
  16:           231         121968  <objArrayKlassKlass>
  17:          2200         110024  [Ljava.lang.Object;
  18:           533         103880  [Ljava.util.HashMap$Entry;
  19:          2168          69376  java.util.concurrent.ConcurrentHashMap$HashEntry
  20:          2989          62872  [Ljava.lang.Class;
  21:          1306          52240  java.util.LinkedHashMap$Entry
  22:          1418          45376  java.util.Hashtable$Entry
  23:           909          43632  java.util.HashMap
(以下 延々と続くので省略)
```

※ 徐々にヒープ使用量が増えていくのでアワリーで統計取りたいなんて場合は、
  cron に SIGQUIT コマンドを送信するように設定しておけば良いです
Criteriaで複雑な条件のクエリを書く

## 括弧を使ったセレクトをしたい
```
SELECT * FROM table_name
WHERE clumn_A = 1
AND (
(clumn_B = 'hoge' OR clumn_C = "piyo") OR
(clumn_C = 'foo' OR clumn_C = "bar")
);
```
（；＾ω＾）ああん！Propelでこういう条件でセレクトしたいけど条件がネストしててO/Rマッパじゃ難しいお〜！
（；＾ω＾）生のクエリ書くしかないか…！？

## そんなことはない、Criterionを使えばね。
```php
$c = new Criteria();

$c->add(TableNamePeer::CLUMN_A, 1);
$criterion1 = $c->getNewCriterion(TableNamePeer::CLUMN_B, 'hoge');
$criterion1->addOr($c->getNewCriterion(TableNamePeer::CLUMN_B, 'piyo'));

$criterion2 = $c->getNewCriterion(TableNamePeer::CLUMN_C, 'foo');
$criterion2->addOr($c->getNewCriterion(TableNamePeer::CLUMN_C, 'bar'));

$criterion1->addOr($criterion2);
// ここがポイント！
// 条件1 OR 条件2 の ORの部分。

$criteria->add($criterion1);
```

## 余談
クライテリオンってなんか戦隊ものっぽい。
hubコマンドはとても便利です

hubコマンドとは、githubを使うみんなのための大事なコマンドです。
使って覚えるたびに増やします。

* `hub browse`
 * 現在のgithub.comリポジトリURLをブラウザで開きます。便利！
* `hub pull-request`
    * 今いるブランチからプルリクエストが出せます。プルリクのマージ先を指定する場合は、hub pull-request -b hogehogeのように-bオプションを使います。便利！
    * @KeithYokomaさんからの投稿です！ありがとうございます！
* `hub compare`
    * プルリクを出す前に差分のチェックが出来ます。便利！
    * @KeithYokomaさんからの投稿です！ありがとうございます！

* `hub pull-request -i 49`
    * 既存のブランチをissue #49のpull requestにします。便利！
AngularJSでデータバインドされないときは$apply

AngularJS便利ですよね。
なんといってもデータバインドが素敵。

なのに、あれ…？

 __データバインドされてないっ！！__ 

 __データバインドされてるのが1イベント分遅れるっ！！__ 

そんな事があったので調べてみました。

結論としては、\$.ajaxのコールバック関数の中で$scopeの変数を
書き換えていたのが原因でした。

\$.ajaxのコールバック関数の中で$scopeの変数を書き換えるには
以下のように書いて、AngularJSに強制的にデータバインド処理を走らせます。

```controller.js
$scope.$apply(function () {
    $scope.target = 'value';
});
```

##詳しい解説
http://angularjsninja.com/blog/2013/12/27/angularjs-apply/
↑いつも参考にさせていただいている「AngularJS Ninja」さんの記事です。
dpkg-reconfigure の使えるパッケージを調べる

"dpkg-reconfigure"コマンドは指定したDebianパッケージがdebconfを採用している場合に、パッケージの再設定をすることが出来るコマンドです。
どのパッケージがこのコマンドをサポートしているか調べてみようとググってみたら見つかったのでメモです。

```
ls /var/lib/dpkg/info/*.config
```

キーボード設定の変更　keyboard-configuration でお世話になりました。
http://qiita.com/ktyubeshi/items/847b05b7879e2f45da54

**参考記事**
元ネタ->  [dpkg-reconfigureが使えるパッケージの一覧 -](http://park6.wakwak.com/~lie/cgi-bin/wiki/wiki.cgi?mycmd=diff&mypage=dpkg-reconfigure%A4%AC%BB%C8%A4%A8%A4%EB%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%A4%CE%B0%EC%CD%F7)
[Wikipedia debconf(ソフトウェアパッケージ)](http://ja.wikipedia.org/wiki/Debconf_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8))
MacVim-kaoriyaでauto-pairs導入後に日本語IMEが勝手に切り替わる時の対処法

MacVim-kaoriyaでvimプラグインのauto-pairsを導入したらinsert modeで日本語IMEが効かなくなった。
効かなくなったというか日本語IMEにはなるんだけど、
2文字くらい入力すると勝手に半角英数に切り替わっちゃう。
変換も出来ない！！！


そういう時は.gvimrcに
`set imdisable`って書いておけば大丈夫っぽい。


[Vimで隣接した括弧の開き記号を消すと同時に閉じ記号も削除するスクリプト](http://qiita.com/m_mysht/items/56e5d5a17d07a64d8b65)
のコメント欄で[alpaca_taichou](http://qiita.com/alpaca_taichou)さんが教えて下さいました。
ありがとうございます。



`set imdisable`については MacVim-kaoriyaのreadmeをどうぞ
[MacVim-KaoriYa readme - 日本語入力(IM)自動オン/オフ](https://code.google.com/p/macvim-kaoriya/wiki/Readme#日本語入力(IM)自動オン/オフ)
Codeanywhereを使ったら&nbspに変換されてしまってサイトが崩れた話

[ブログに書きました。](http://www18.atpages.jp/~town52/wordpress/2014/02/try-codeanywhere/)

モバイルアプリでCodeanywhere使ったら` `が`&nbsp`になっちゃったんです。
インターフェース速度比較

# インターフェース速度比較
## 規格
転送速度はすべて規格値。単位はすべてMbps。

|インターフェース名|物理転送速度(Mbps)|
|---|---:|
|SATA3|6,144|
|SATA2|3,072|
|SATA1|1,536|
|USB3.1|10,240|
|USB3.0|5,120|
|USB2.0|480|
|IEEE 1394(FireWire)|400|
|PCIe4.0 x1(片方向)|16,384|
|PCIe3.0 x1(片方向)|8,192|
|PCIe2.0 x1(片方向)|4,096|
|PCIe1.1 x1(片方向)|2,048|
|PCI(64bit 66MHz)|4,264|
|PCI(64bit 33MHz)|2,128|
|PCI(32bit 33MHz)|1,064|
|SCSI-3 Ultra320|2,560|

## その他
### Expressカード
PCカードの後継規格だが、互換性なし。PCカード(CardBus対応)はバックが32bit 33MHz PCIに対して、ExpressカードはPCIe1.1かUSB2.0。ExpressCard/34と/52の形状があり、ExpressCard/52はPCカードと同じ形。ExpressCard/34はPCカードより細身。転送速度はバックエンドがPCIe1.1かUSB2.0かによって変わる。

## 参考URL
* シリアルATA - Wikipedia http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%ABATA
* Universal Serial Bus - Wikipedia http://ja.wikipedia.org/wiki/Universal_Serial_Bus
* PCI Express - Wikipedia http://ja.wikipedia.org/wiki/PCI_Express
* ExpressCard - Wikipedia http://ja.wikipedia.org/wiki/ExpressCard
* インターフェイス速度表（資料） [資料室] http://www.mars.dti.ne.jp/~suzunari/suz/doc/dat/hd_interface_speed.htm
Phalconをサブディレクトリに配置したい

[http://localhost/invo/](http://localhost/invo/) みたいにしたいってことです。

これApacheなら楽勝と思うんですけど、今回はnginx。
実は[これ](http://docs.phalconphp.com/en/latest/reference/nginx.html)丸コピで出来るんじゃないかと思ったんですけど、どうにもルーティングがうまくいかない。

しかたないので古い記憶引っ張り出してきて、CakePHPの時はどう書いてたかなー、なんて思いながらごちゃごちゃやりました。

# 前提条件
今回は実験用に[invo](https://github.com/phalcon/invo)を配置したいと思います。
nginxのインストールは他の方が書かれた記事を参照していただき、phalconとphpのインストールは[これ](http://qiita.com/A-gen/items/3c76b3abe6baf9948f25)見てください。

次、ディレクトリ構成です。

1. invo は `/var/www/phalcon/invo` に配置する
2. php-fpm は `/var/run/php-fpm/phalcon.sock` で待ち構えてるとする

・・・ぐらいですかね？

# 設定ファイル
本題の設定ファイルです。必要最小限だと思います。

```nginx:invo.conf
server {
 listen 80;
 server_name invo;

 charset utf-8;

 set $root_path '/var/www/phalcon/invo/public';
 root $root_path;
 index index.php;

 location /invo {
  alias $root_path;
  index index.php;

  if (!-e $request_filename) {
    rewrite ^/invo/(.+)$ /invo/index.php?_url=/$1 last;
  }
 }

 location ~ ^/invo/(.+\.php) {
  alias $root_path/$1;
  fastcgi_pass  unix:/var/run/php-fpm-phalcon.sock;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $request_filename;
  include /etc/nginx/fastcgi_params;
 }
}
```

http://invo/invo にアクセスし、CSSが適用されたトップページが表示されることを確認してください。
続いて、メニューやらポチポチして、ちゃんとルーティングが適用されていることも確認してください。

ちなみにですが、http://invo/invo/index.php?_url=/about/index とかも動作します。
これどうにかならないですかね？


実はnginxの設定あんまり知らないので、ここ変とかいらないとか、もっといい方法があれば教えてくださいorz
gitの ".." と "..." の意味がコマンドで異なるらしいので図解した

いわゆるダブルドットとトリプルドット。

# 履歴が1本

## 図解
![all01.png](https://qiita-image-store.s3.amazonaws.com/0/14471/826de045-3528-769b-a56a-68137da24018.png)


## コマンド
### git log

```
$ git log master..test
C

$ git log master...test
C

$ git log test..master

$ git log test...master
C
```

### git diff

```
$ git diff master..test
+C
 B
 A

$ git diff master...test
+C
 B
 A

$ git diff test..master
-C
 B
 A

$ git difftest...master

```

# 履歴が分岐

## 図解

![all02.png](https://qiita-image-store.s3.amazonaws.com/0/14471/8ee42723-1ca6-3df3-bb56-a52387e221a4.png)

## コマンド

### git log

```
$ git log master..test  --> git log ^master test
C

$ git log master...test --> git log master test ^B
D
C

$ git log test..master --> git log ^test master
D

$ git log test...master --> git log test master ^B
D
C
```

### git diff

```
$ git diff master..test  --> git diff master test
-D
+C
 B
 A

$ git diff master...test --> git diff B test
+C
 B
 A

$ git diff test..master  --> git diff test master
-C
+D
 B
 A

$ git diff test...master --> git diff B master
+D
 B
 A
```

# まとめ

* `git log`は範囲を指定
* `git diff`は2点を指定
librarian-chefのCheffileの書き方


手元で動かしてる奴のメモです。


開発でVagrantや運用に入っているサーバのChef Cookbookは[librarian-chef](https://github.com/applicationsonline/librarian-chef)を使って管理しています。`Cheffile`に定義を書くと依存関係を含めたCookbookを自動的にダウンロードしてくれて便利。同じような機能のライブラリとして[Barkshelf](http://berkshelf.com/)というのもある。

# Cheffile書き方

rubyファイルなのでとりあえずファイル先頭に書く。

```ruby
#!/usr/bin/env ruby
#^syntax detection
```

## Cookbookダウンロードサーバの指定

```ruby
site 'http://community.opscode.com/api/v1'
```

## ダウンロードサーバ上のCookbookを指定する

サイトに登録されている任意のCookbookをダウンロードするには`cookbook`の後ろにCookbook名を入れます。

```ruby
# apache cookbookの指定
cookbook 'apache2'
```

## バージョン指定

```ruby
# apache cookbookのバージョン 1.0.0 以上
cookbook 'apache2', '>= 1.0.0'

# 同cookbookバージョンを 1.0.0 固定
cookbook 'apache2', '1.0.0'
```

## ローカルに保存されているCookbookを使う

```ruby
# site-cookbooks/someprojectをCookbookとして登録
cookbook 'someproject', :path => 'site-cookbooks/someproject'
```

## gitレポジトリのCookbookを使う

```
# gitレポジトリのCookbookを登録
cookbook 'td-agent', :git => 'https://github.com/treasure-data/chef-td-agent'
```

## githubにホストされているCookbookを使う（ショートカット）

```ruby
# githubのパスのみ指定できる。
cookbook 'td-agent', :github => 'treasure-data/chef-td-agent'
```

----

ファイル全体はこんなかんじ。

```ruby
#!/usr/bin/env ruby
#^syntax detection

site 'http://community.opscode.com/api/v1'

cookbook 'database'
cookbook 'java'
cookbook 'nginx'
cookbook 'ntp'
cookbook 'munin'
cookbook 'mongodb-10gen'
cookbook 'openssh'
cookbook 'postgresql'
cookbook 'python'
cookbook 'redisio'
cookbook 'someproject', :path => 'site-cookbooks/someproject'
cookbook 'td-agent', :github => 'treasure-data/chef-td-agent'
```
Pebbleと連携するiOSアプリの作り方（Pebbleと接続するぞ編）


iOSアプリとPebbleの接続は非常に簡単です（SDKが良く出来ているのでしょう。Pebbleチームの努力に感謝）。PebbleKit.frameworkをインポートして、delegate経由で取得したPBWatchオブジェクトを使うだけ！

Pebbleとの接続をざっくり管理するクラスを作ってみます。手元で動作しているコードを少し手直ししているので検証してませんので、動かなかったらゴメンナサイ。

# Pebbleと接続する

## PebbleKitを使う

PebbleKit.frameworkをインポートします。

```objectivec
// PebbleKitフレームワークをインポート
#import <PebbleKit/PebbleKit.h>
```

## Pebbleと接続する

iOS上でのPebbleは`PBWatch`オブジェクトとして表わされます。このクラスの中では`_watch`というインスタンスを用意してPebbleとの接続を管理します。また、接続を管理する`PBPebbleCentral`クラスから接続、切断の通知を受け取るため、`PBPebbleCentralDelegate`を実装します。

```objectivec
// PBPebbleCentralDelegateを追加
@interface SomeClass : NSObject <PBPebbleCentralDelegate>
@end

@implementation SomeClass {
    // Pebbleを管理するインスタンス変数
    PBWatch *_watch;
}
```

適当なタイミングで`PBPebbleCentral`のdelegateをセットします。また、前回接続されたPebbleがあれば`_watch`変数に代入します。

```objectivec
- (id)init
{
    self = [super init];
    if (self) {
        // PBPebbleCentralのdelegateをセットする
        [[PBPebbleCentral defaultCentral] setDelegate:self];

        // 前回接続したPebbleがあればインスタンス変数に登録する
        _watch = [[PBPebbleCentral defaultCentral] lastConnectedWatch];
    }
    return self;
}
```

`PBPebbleCentralDelegate`ではPebbleの接続、切断を管理します。

```objectivec
#pragma mark -
#pragma mark PBPebbleCentralDelegate
- (void)pebbleCentral:(PBPebbleCentral *)central watchDidConnect:(PBWatch *)watch isNew:(BOOL)isNew
{
    // 接続されたらインスタンス変数に登録
    _watch = watch;
}

- (void)pebbleCentral:(PBPebbleCentral *)central watchDidDisconnect:(PBWatch *)watch
{
    // インスタンス変数のPBWatchが切断されたらインスタンス変数から外します。
    if (_watch == watch || [watch isEqual:_watch]) {
        _watch = nil;
    }
}

@end
```

接続、切断（の検知）はこんなかんじです。簡単ですね。


----

# あわせて読みたい

* [Pebbleアプリの作り方（MacOSX / iOS版導入編）](http://qiita.com/key/items/b23c76312901b9683a10)
* [Pebbleと連携するiOSアプリの作り方（Xcode設定編）](http://qiita.com/key/items/bba9a2c1df1d0b5c4447)
* [pebble-sdk-examples](https://github.com/pebble/pebble-sdk-examples) ←元ネタ
Elastic BeanstalkでWAR内の設定ファイルをdev,prodで出し分けたい

Elastic Beanstalk (java) で

- ある設定ファイルをどうしても **WARの中に** 置かないと動かない
- 開発環境と本番環境では違うものを使わなきゃいけない

という状況下で使った手法です。WAR外で良ければ別の簡単な手段があります。

以下、ある設定ファイルを settings.conf という名前だとして進めます。

## ファイル配置

settings.conf.development と settings.conf.production を用意し、/path/to/* に配置します。それぞれ開発用と本番用です。

## elastic beanstalk設定

environmentに ENV というパラメータを追加します。ENVにはdevelopmentやproductionといった、上記のsettings.confの末尾に追加した値を利用します。

## .ebextentions

src/main/webapp/.ebextensions/myapp.config というファイルを設置します。中身は下記

```
container_commands:
  myapp_config:
    command: cp path/to/settings.conf.$ENV path/to/settings.conf
```

これで準備は完了です。

あとは、このwarファイルをデプロイすると、WAR解凍後にcontainer_commandsのコマンドが実行され、必要な設定ファイルが配置され、その後tomcatが起動します。

## 補足

container_commandsの実行タイミングは「アプリケーション解凍後」とドキュメントにはっきり書かれていたので、この手法を取りました。

別にWARの外でもよいなら、filesなど別の機能を利用するのが正しいです。

## 参考

- <http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-container_commands>
pipでインストールしたモジュールを全て削除

現在入ってるモジュールをfreezeで書きだし、テキストファイルに保存
それをuninstallで読み込む

```
pip freeze > piplist.txt
sudo pip uninstall -r piplist.txt
```

何故かパーミッションでエラーが出たので、sudoも付けておいた
チーム開発でデプロイ時にどんなPullRequestが入ったかを知る方法

##はじめに
Rettyではいわゆる Github Flow 的な運用をしていて、本番リリースするにあたって staging 環境でテストをしてから本番環境にリリースすることをしています。
その中で複数人で開発しているため、Pull Request のマージが多くてどんな Pull Request が今回のリリースに入ったのか気になることがありました。

今回はそれをサクッと把握するためのTIPSとなります。

##チーム開発でデプロイ時にどんなPullRequestが入ったかを知る方法
git 開発者は既に私のニーズを把握していたのか？！

【2/28 15:07追記】
git log コマンドの --merges オプションを使えばさらに簡単に把握することができることが判明しましたｗ

```bash
$ git log --merges 1234567..abcdefg
commit > 3456789abcdefghijklmnopqrstu
Merge: 3456789 defghij
Author: hogehoge <fugafug@example.com>
Date:   Fri Feb 28 10:54:14 2014 +0900

    Merge pull request #AAAA from [OrganizationName]/[branchName1]

    commit message
```

grep と複合して使えば一覧にもできます

```bash
$ git log --merges 1234567..abcdefg | grep "Merge pull"
    Merge pull request #AAAA from [OrganizationName]/[branchName1]
    Merge pull request #BBBB from [OrganizationName]/[branchName2]
    Merge pull request #CCCC from [OrganizationName]/[branchName3]
....
    Merge pull request #ZZZZ from [OrganizationName]/[branchNameN]
```

【2/28 15:07以前の内容】
git log コマンドの --left-right オプションもせっかくなので残しておきますね

```bash
$ git log --left-right 1234567..abcdefg
commit > 3456789abcdefghijklmnopqrstu
Merge: 3456789 defghij
Author: hogehoge <fugafug@example.com>
Date:   Fri Feb 28 10:54:14 2014 +0900

    Merge pull request #AAAA from [OrganizationName]/[branchName1]

    commit message
```

grep と複合して使えば一覧だけ簡単に抽出することができます

```bash
$ git log --left-right 1234567..abcdefg | grep "Merge pull"
    Merge pull request #AAAA from [OrganizationName]/[branchName1]
    Merge pull request #BBBB from [OrganizationName]/[branchName2]
    Merge pull request #CCCC from [OrganizationName]/[branchName3]
....
    Merge pull request #ZZZZ from [OrganizationName]/[branchNameN]
```

awk とか使えばもっと複雑な出力はできそうですが、私はこの grep の結果だけでもけっこう有用でした。

##おわりに
Github というか git はやっぱいいですね
Subversion も export とか結構好きだったんですけど、同様のことは git でもできるので今は git にくびったけですｗ
参考になったらストック and はてぶしていただけるとやる気を出して記事の更新頻度が上がると思いますｗ
AppCodeでマイナーだけど便利なショートカット2つ


こんにちは。PhpStormの人です。
最近はアプリも触ってるのでAppCodeとかも使ってたりします。

他のJetBrains IDEでも共通の機能なんですが、AppCodeだと特に感激した機能を2つ紹介します。

## SmartType Completion
その名の通り「賢い補完」です。PHPだとあまり恩恵を受けることがなかったので使ってなかったんですが、Objective-Cだと超有用です。

例えば、

![xMF5IGRq1i.gif](https://qiita-image-store.s3.amazonaws.com/0/20074/7e3837a0-ea29-8e4d-ef7d-dfca37553527.gif)


こんな感じで、オブジェクトに対して正しい形のインスタンスを返すメソッドをサジェストしてくれたりします。べんり。


## Complete Current Sattement
自分のいる行に対して「いい感じにカッコとかを補完して次の行に行く」ような機能です。
Objective-Cの構文だと()や[]が多く、閉じるのだけでも一苦労だったりするので、この機能が捗ります。

![IBzFKNI6z8.gif](https://qiita-image-store.s3.amazonaws.com/0/20074/03142e1c-40df-1a21-f12a-1e5cd4cd1f79.gif)
LinearLayoutとRelativeLayoutの配置属性メモ

毎回やるたびに忘れるのでメモすることにします。

**太字**になっている属性は、Layout内のViewで設定する属性ではなく、親のLayoutで設定する属性です。

## 共通

|属性 |内容|
|:---|:---|
|android:gravity|View内の要素の配置位置を指定（TextViewならテキストの配置位置）|

## LinearLayout

|属性 |内容|
|:---|:---|
|**android:orientation**|縦並びか横並びかを指定|
|**android:baselineAligned**|各Viewの配置をベースラインに合わせるか指定|
|**android:baselineAlignedChildIndex**|ベースラインとなるViewを指定|
|android:layout_gravity|自身の配置位置を指定|
|android:layout_weight|領域に余白があった場合、ここで指定した数値（割合）を元にViewの幅（または高さ）を可変させる。|

## RelativeLayout

|属性 |内容|
|:---|:---|
|**android:ignoreGravity**|指定したViewは、親レイアウトのgravity設定が無視される|
|android:layout_alignBaseline|指定したViewのベースラインに自身を合わせる|
|android:layout_alignParentTop（Bottom,Left,Right）|親のレイアウトの上部（〜右部）に配置する|
|android:layout_centerInParent|親のレイアウトの中央に配置する|
|android:layout_centerVertical|親のレイアウトの垂直方向の中央に配置する|
|android:layout_centerHorizontal|親のレイアウトの水平方向の中央に配置する|
|android:layout_alignTop(Bottom,Left,Right)|指定したViewの上部（〜右部）に配置する|
|android:layout_above|指定したViewの上部へ乗っかるような位置に配置する|
|android:layout_below|指定したViewの下部へぶら下がるような位置に配置する|
|android:layout_toLeftOf（RightOf）|指定したViewの左（右）に並べるように配置する|
|android:layout_alignWithParentIfMissing|自身をavobeとかbelowとかtoLeftOfの指定Viewにさせない？|
Volley+oauth-signpostでOAuthリクエスト

Volley上でOAuthリクエストするときに便利なHttpStackを書きました。

```java:OAuthHurlStack.java
public class OAuthHurlStack extends HurlStack {

    private final OAuthConsumer consumer;

    public OAuthHurlStack(OAuthConsumer consumer) {
        this.consumer = consumer;
    }

    @Override
    protected HttpURLConnection createConnection(URL url) throws IOException {
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        try {
            this.consumer.sign(connection);
        } catch (OAuthMessageSignerException e) {
            // TODO: OAuthMessageSignerExceptionハンドリングを実装
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            // TODO: OAuthExpectationFailedExceptionハンドリングを実装
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            // TODO: OAuthCommunicationExceptionハンドリングを実装
            e.printStackTrace();
        }
        return connection;
    }
}
```

```java:OAuthHttpClientStack.java
public class OAuthHttpClientStack extends HttpClientStack {

    private final OAuthConsumer consumer;

    public OAuthHttpClientStack(HttpClient client, OAuthConsumer consumer) {
        super(client);
        this.consumer = consumer;
    }

    @Override
    protected void onPrepareRequest(HttpUriRequest request) throws IOException {
        super.onPrepareRequest(request);
        try {
            this.consumer.sign(request);
        } catch (OAuthMessageSignerException e) {
            // TODO: OAuthMessageSignerExceptionハンドリングを実装
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            // TODO: OAuthExpectationFailedExceptionハンドリングを実装
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            // TODO: OAuthCommunicationExceptionハンドリングを実装
            e.printStackTrace();
        }
    }
}
```

signpostにcommonshttpを利用している場合はOAuthHttpClientStackを利用してください。

あとはいつもどおり

```java
RequestQueue requestQueue = Volley.newRequestQueue(context, new OAuthHurlStack(consumer)) // consumerはOAuthConsumer
```

っとすればよいです。
文字列の出現回数を調べるawk

SQLでいうところのGROUP BYのようなことをしたい場合。awkで出来たりします。

```sh:調べたいファイル
$ cat fruits.list
apple
orange
orange
apple
melon
```
```sh:結果
$ cat fruits.list | awk '{count[$0]++}END{for(i in count)print count[i], i}'
2 apple
1 melon
2 orange
```

実は `unique -c`使ったほうが簡単です。

```sh:uniq
$ cat fruits.list | sort | uniq -c
      2 apple
      1 melon
      2 orange
```

> fruits.listがめちゃくちゃデカい場合とかにはsortのコストがバカにならないのでawkの方がいいですね

データの件数が多い場合はawkに利点があるようです！
Raspberry pi のSDカードをMac OS Xでバックアップしてレストアして。

# バックアップ

データを丸っと取ってくる。

```bash
sudo dd bs=1m if=/dev/disk{NUM} of=~/Desktop/backup.img
```

# レストア

SDカードを差し込んだら、FATにフォーマットしてそのボリュームを一度コマンドでアンマウントします。
フォーマットはディスクユーティリティーなどを使用してください。

```bash
sudo umount -fv /Volumes/{UNTITLED}
```

次にデータを流し込みます。

```bash
sudo dd bs=1m if=~/Desktop/backup.img of=/dev/disk{NUM}
```
mix-inで引数をプロパティ名に使いたい時の書き方

例: em, remのオールドブラウザ対応

```css
font-size: 1.8em;
font-size: 1.8rem;
```

新しいブラウザではremで上書きしつつ、レガシーブラウザではemを使う。
この場合、font-size用のmix-inを用意してもいいが、emは色んなサイズ指定になるべく汎用的にしたいとおもう。

しかしそのまま書いても、以下のような結果になってしまう。

```sass
// bad
to_rem(prop, font_size)
  prop: unit(font_size, 'em')
  prop: unit(font_size, 'rem')

to_rem(font-size, 1.8)
/*
  prop: 1.8em;
  prop: 1.8rem;
*/
```

公式ドキュメントにも、これについての記述はないっぽいので、諦めてnib（sassでいうCompass的な存在っぽい）のリポジトリ https://github.com/visionmedia/nib をあさる。

```sass
// good
to_rem(prop, font_size)
  {prop}: unit(font_size, 'em')
  {prop}: unit(font_size, 'rem')

to_rem(font-size, 1.8)
/*
  font-size: 1.8em;
  font-size: 1.8rem;
*/
```

やったぜ。

セレクタ文字列と変数が隣接してる場合とかでも、{}で囲むといいかんじに展開してくれるかんじです。いかにもマクロ的ですね。
nibは色々と機能を使いこなしてる感じなので、ドキュメント読んでもわかんないところがあったら読むと参考になります。
F#でHTTPアクセス

サンプルができたのでメモ。
基礎文法がわからないのでとりあえず写経。

```fsharp
open System.Net
open System.IO

let url = "$url"
let req = HttpWebRequest.Create(url)
req.Method <- "$http_method"

req.ContentType <- "$content_type"
let res = req.GetResponse()

let stream = res.GetResponseStream()
let reader = new StreamReader(stream)
let html = reader.ReadToEnd()
printfn "%A" html
```
Storyboardを使ったアプリをGHUnitでテストするときviewDidLoadは呼ばれない

Storyboard上のビューを以下のようにテストする際、viewDidLoadやviewWillAppearは呼ばれない。

```objc
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    GHAssertNotNil(storyboard, @"ストーリーボードが存在しない");
    self.vc = [storyboard instantiateViewControllerWithIdentifier:@"hoge"]; // Storyboard ID
    GHAssertNotNil(self.vc, @"ビューコントローラが存在しない");
    [self.vc loadView];
```

したがって、呼ぶ必要がある場合は明示的に呼ばなければならない。

```objc
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    GHAssertNotNil(storyboard, @"ストーリーボードが存在しない");
    self.vc = [storyboard instantiateViewControllerWithIdentifier:@"hoge"]; // Storyboard ID
    GHAssertNotNil(self.vc, @"ビューコントローラが存在しない");
    [self.vc loadView];
    [self.vc viewWillAppear];  // ここ
    [self.vc viewDidLoad];  // ここ
```

もしくは以下のように、ビューにinitWithCoder:メソッドを生やし、そこにコードを書く。

```objc
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        /*
         URLデータを読み込む
        */
        NSBundle* bundle = [NSBundle mainBundle];
        NSString* path = [bundle pathForResource:@"URLs" ofType:@"plist"];
        urls = [NSArray arrayWithContentsOfFile:path];
    }
    return self;
}
```
URLのvalidates rails

完全にコピペ用

<pre>
validates :url, 
format: { with: /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix,allow_blank: true }
</pre>
tmuxをローカルインストールする時のメモ

tmuxのビルドにはlibevent2が必要なのだが、Cenなんとか7の時代になってもまだリポジトリにないままである。
libevent1ならあるが、これではmakeしたときに定数の未定義エラーが出る。
ふっっっるいCenほにゃららとかいうOS使うと、そもそもlibevent無い時あるよねー。

* tmux最新版は: http://tmux.github.io/
* libevent最新版は: http://libevent.org/
* ncurses最新版は: ftp://ftp.gnu.org/gnu/ncurses/

```zsh
cd
mkdir local
cd local
mkdir src
cd src
# Get&build libevent
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
tar zxf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=${HOME}/local
make
make install
# Get & build ncurses
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz
tar zxf ncurses-6.0.tar.gz
cd ncurses-6.0
./configure --enable-pc-files --prefix=${HOME}/local --with-pkg-config-libdir=${HOME}/local/lib/pkgconfig --with-termlib
make
make install
# Get tmux
wget https://github.com/tmux/tmux/releases/download/2.6/tmux-2.6.tar.gz
tar zxf tmux-2.6.tar.gz
cd tmux-2.6
PKG_CONFIG_PATH=${HOME}/local/lib/pkgconfig ./configure --prefix=${HOME}/local
make
make install
```

libeventはpkg-configできるようにpcファイルを作成してくれるので、ありがたく使わせて頂く。
ncursesは`--enable-pc-files`でpcファイルを作成してくれる。
tmuxバイナリは`$HOME/local/bin`に入る。

新しいバージョンが出るたびにstaticビルドを試してみるのだが、LDパスが上手く通らず、いつもmakeに失敗してしまう。結局はいつも`--enable-static`を削除してビルドを通し、tmux起動時にライブラリの場所を教えてあげることで解決している。

```
export LD_LIBRARY_PATH=${HOME}/local/lib:$LD_LIBRARY_PATH
```
各li要素に対して処理を行う


```html:html
<ul>
    <li>foo</li>
    <li>bar</li>
</ul>
```

```js:jquery
//各要素をalertする。
//パラメータのindexは、liのindexを表す。$(this)で各要素のオブジェクトを表す。
$('li').each(function(index) {
    alert($(this).text());
});
```
iOSでの文字列処理


比較
======
- NSString同士であれば、isEqualTo: より、 isEqualToString: の方が高速（[公式ドキュメント](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html)より）

NSStringによる処理
======

- 前後の空白文字を削除.

```
str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
```

NSMutableStringによる処理
======

- 置換

```
NSMutableString*	tempString	= [NSMutableString stringWithString:defaultString];
// スラッシュ区切りをハイフン区切りに.
[tempString replaceOccurrencesOfString:@"/"
							withString:@"-"
							options:0
							range:NSMakeRange(0, [tempString length])];
```

標準ライブラリ：NSRegularExpression
======

概要
------
正規表現は、iOS 4.0以降で、標準ライブラリに組み込まれた。

- [NSRegularExpression Reference](https://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html)

使い方
------

- 正規表現をつくる

```
NSError* error = nil;
NSRegularExpression* regex =
	[NSRegularExpression regularExpressionWithPattern:@"abcd"
		options:NSRegularExpressionCaseInsensitive
		error:&error
	];
```

- マッチしたかどうかを調べる（レンジを調べる）

```
NSRange rangeOfFirstMatch =
	[regex rangeOfFirstMatchInString:string
		options:0
		range:NSMakeRange(0, [string length])
	];
if( !NSEqualRanges(rangeOfFirstMatch,
		NSMakeRange(NSNotFound,0) ) )
{
	// マッチ！
	NSString* strMatch = [string substringWithRange:rangeOfFirstMatch];
}
```


- マッチした数を調べる

```
NSUInteger numberOfMatches =
	[regex numberOfMatchesInString:string
		options:0
		range:NSMakeRange(0, [string length])
	];
```

サンプル
======

日付、時間を抜き出す
------

```
NSString* string = @"2012/4/13 (木) 14:43";
NSError* error = nil;
NSRegularExpression* regexp =
	[NSRegularExpression regularExpressionWithPattern:@"^(\d+/\d+/\d+).+(\d+:\d+)$"
		options:0
		error:&error
	];
if( error != nil ){
	// Error.
}
else{
	NSTextCheckingResult*	match =
		[regexp firstMatchInString:orgString
			options:0
			range:NSMakeRange(0, orgString.length)
		];
	NSString* result = [NSString stringWithFormat:@"%@ %@",
		[orgString substringWithRange:[match rangeAtIndex:1]],
		[orgString substringWithRange:[match rangeAtIndex:2]]];
}

```

簡易比較
------

```
BOOL foundTrue = ([strTest rangeOfString:@"true"].location != NSNotFound);
```


メモ
======

compare:options:
https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html
NavigationController配下のViewControllerで途中からLandscapeにする場合のおまじない

NavigationControllerにViewControllerをpushしていったときに、途中からたとえばPortraitから強制的にLandscapeにしたいときってありますよね。

supportedInterfaceOrientationsでLandscapeモードを返しても、一度iPhoneを回転させないと反映されないことがあります。その場合は該当するViewControllerのviewDidLoadで


```objc
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
    
UIViewController *vc = [[UIViewController alloc] init];
[self presentViewController:vc animated:NO completion:^{}];
[self dismissViewControllerAnimated:NO completion:^{}];
```

を書いておくと、回転が反映されるようになります。
mochaでNyan Cat

reporterで``nyan``を指定したらテストの進捗にあわせてNyan Catが走る。

```shell-session
$ mocha -R nyan
 7   -_-_-_-__,------,
 0   -_-_-_-__|  /\_/\
 0   -_-_-_-_~|_( ^ .^)
     -_-_-_-_ ""  ""

  7 passing (966ms)
```

テストを書くモチベーションがあがりますね。
gitで使っちゃいけないコマンドを.bashrcで設定する

以下の関数を.bashrcに追加します。

```bash
function git() {
    CMD=$1
    CURRENT_DIR=`pwd -P`
    if [ "${CMD}" == "clean" ]; then
        # gitで管理してないデータなどがあるリポジトリで実行すると大変なことになるので禁止する
        echo "You must not use \"git clean\"."
    elif [ "${CURRENT_DIR}" == "${HOME}/workspace/tools" -o "${CURRENT_DIR}" == "${HOME}/workspace/docs" ] && [ "$CMD" == "push" ] ; then
        # 実験的に変更しているファイルのあるディレクトリではpushしない
        echo "You must not use \"git push\" here."
    else
        command git "$@"
    fi
}
```

command コマンドはエイリアスや関数以外のコマンドを実行するコマンドです。
参考: http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230731/
MatchData#[]の引数について

# MatchData#[]の引数について
Rubyの正規表現におけるキャプチャについてドキュメントを見てみると

> 丸括弧 ( ) によってキャプチャをすることができます。 括弧に囲まれた部分正規表現にマッチした 前からn番目の開き括弧によって囲まれた部分式にマッチした 文字列を後で参照することができます。
> 
> 正規表現内では \1, \2, ... という記法で後方参照できます。 また、\k<1>, \k<2>, ... や \k'1', \k'2', ... という記法を使うこと もできます(10を越える数字を渡すことができます)。 また、Regexp#match で得られた MatchData からは MatchData#[]で取り出せます。
> また、\$1, \$2, ... という特殊変数によって n 番目の括弧にマッチした 部分文字列を参照できます。これらの特殊変数はマッチ処理が終わったあとで しか使えないことに注意してください。

```rb
# (..) に at がマッチしたのを \1 で参照し、マッチが成功している。
m = /[csh](..) [csh]\1 in/.match("The cat sat in the hat")
# => #<MatchData "cat sat in" 1:"at">
# Regexp#match でマッチしたテキストは MatchData#[] で参照できる
m[1] # => "at"
```

しかしこの例では、`m[1]`がどのatを指しているのか非常に分かりづらいです。
結論から申し上げると、1番最初に出てくるcatのatです。
`MatchData#[]`はn番目のカッコにマッチした部分文字列を取り出す場合nを引数に渡してあげる必要があります。n-1ではありません。
では0は何を指すのでしょう。0はマッチした文字列の全体を指します。

```rb:match_test.rb
m = /\[(.*)\] (.*)\: (.*)/.match("[12:34] Alice: Hello")
p m[1] # => "12:34"
p m[0] # => "[12:34] Alice: Hello"
```

```:output
$ ruby match_test.rb 
"12:34"
"[12:34] Alice: Hello"
```
capistrano3 のおしゃべりを抑える


**よく見たら cap install で生成された deploy.rb にコメントアウトで指定の記述方法が明記されていたので、この記事の存在意義は消滅しました**

log level の設定方法をどんなに検索しても出てこなかったのでカッとなってソースを読んだ結果はこちらです。

```ruby
set :log_level, SSHKit::Logger::INFO
```

その他のレベルは https://github.com/capistrano/sshkit/blob/master/lib/sshkit/logger.rb 見てください。
datetime型の引き算で勘違い


pythonではdatetime型同士の引き算はdatetime.timedelta型になる

このときの変数名 pokoとして

```
poko.seconds
poko.days
```

のようにアクセスして差分がとれる

勘違いポイント

secondsは差分を返してくれると思ったが日付で繰り上げられる

どういうことかというと差分が1日と30秒あったとしたら86400 + 30で
86430を返してくれると思ったが、実際は30がえられる。

で daysが 0 -> 1に繰り上げられる

という点ではまった