OmniAICreator/Qiita-1.07M huggingface dataset:
Clang初級


とりあえず早引きclangてことで。
使用するclangは以下なカンジ。

```Bash
$ clang -v
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix
```


## Cソースから実行ファイルを作る

```Bash
$ clang <ソースファイル> -o <実行ファイル名>
```
```Bash
$ ls -a
<ソースファイル>       <実行ファイル>
```

## プリプロセッサだけ実行したい

```Bash
$ clang -E <ソースファイル> 2>&1 | tee <出力ファイル名>
```
```Bash
$ ls -a
<ソースファイル>
```

-E すると、コンソール上に結果が表示されるので、teeで捕まえます。
-E はプリプロセッサ展開結果を表示するだけなので、実行しても何も作成されません。
.i ファイルを出力するコマンドがありそうなものなのですが。


## アセンブラ見たい

```Bash
$ clang -save-temps <ソースファイル> -o <実行ファイル名>
```
```Bash
$ ls -a
<ソースファイル>   <プリプロセッサ展開結果.i>   <アセンブラ.s>    <オブジェクトファイル.o>   <実行ファイル>
```
なんもかんも -save-temps で事足りるんですねわかります。
clangはオプションなしで実行すると、i ファイルも s ファイルも o ファイルも削除しちゃうんですね。
で、-save-temps 使うと削除されない、と。

## 参考サイト
>[.mjtの日記復帰計画](http://d.hatena.ne.jp/mjt/20100728/p2)
>[電脳スピーチ blog](http://denspe.blog84.fc2.com/blog-entry-174.html)
>[可音月堂](http://kanetsuki.wordpress.com/2012/02/26/llvmclang-3-0-の導入/)
>[【B2】C++テクニカルセッション](http://edn.embarcadero.com/print/images/42758/B2.pdf)
>[clang(1) - Linux man page](http://linux.die.net/man/1/clang)
>[nothingcosmos wiki](http://nothingcosmos.wiki.fc2.com/wiki/LLVMに関して)
>[Stack Overflow](http://stackoverflow.com/questions/18161792/how-to-parse-ast-openmp-with-clang)
>[clang-developers](http://clang-developers.42468.n3.nabble.com/Get-o-and-i-files-by-only-one-cmd-td4027710.html)
>[llvm入門](http://www.slideshare.net/herumi/llvm-17911004)
puppet入門6 puppetのclientを追加する


* [puppet入門1 準備編](http://qiita.com/tukiyo/items/54c32ecfb8cc6cd76073)
* [puppet入門2 パッケージをインストールしてみる](http://qiita.com/tukiyo/items/e47dfc77ac40052ed04c)
* [puppet入門3 ファイルを配布](http://qiita.com/tukiyo/items/0003a54e47bf768133e2)
* [puppet入門4 ハマった場合の対処とか](http://qiita.com/tukiyo/items/d05bf0b705fd473adc55)
* [puppet入門5 ユーザー、グループの追加](http://qiita.com/tukiyo/items/e15dabc6174b475728fc)
* [puppet入門6 puppetのclientを追加する](http://qiita.com/tukiyo/items/261beec159f17a457d02)
* [puppet入門7 ファイルに変更があった時にサービスをrestartさせる](http://qiita.com/tukiyo3/items/0eef6e1a97d89b0149e4)


ドメイン名: safe
puppetmaster: 192.168.11.100 centos5
puppetclient1: 192.168.11.101 ubuntu

DNSがあれば早いが、今回は/etc/hostsファイルでしのぐ。

puppetclient1にて作業
=================

```bash:puppetのインストール
# apt-get install -y puppet
```

```bash:puppetmasterに登録申請
# puppet agent --server=puppetmaster.safe --no-daemonize --verbose
info: Creating a new SSL key for puppetclient1.safe
info: Caching certificate for ca
info: Creating a new SSL certificate request for puppetclient1.safe
info: Certificate Request fingerprint (md5): 3E:98:7D:E2:F5:64:1A:E8:0E:39:94:61:50:E7:DC:4E
```


puppetmasterにて作業
=================

```bash:クライアント一覧を表示
# puppet cert --list --all
  "puppetclient1.safe"  (MD5) 3E:98:7D:E2:F5:64:1A:E8:0E:39:94:61:50:E7:DC:4E
+ "puppetmaster.safe" (SHA256) 8A:0D:E2:51:F5:96:2E:E3:21:D7:D0:88:9D:BE:82:6E:E4:0B:93:49:79:C5:86:B1:65:0B:39:2A:91:05:29:4C (alt names: "DNS:puppet", "DNS:puppet.safe", "DNS:puppetmaster.safe")
```

```bash:
# puppet cert --sign puppetclient1.safe
Notice: Signed certificate request for puppetclient1.safe
Notice: Removing file Puppet::SSL::CertificateRequest puppetclient1.safe at '/var/lib/puppet/ssl/ca/requests/puppetclient1.safe.pem'
```


puppetclient1にて作業
=================

```bash:puppetmasterの指示を受ける。
# puppet agent --server=puppetmaster.safe --no-daemonize --verbose
```

次は[puppet入門7 ファイルに変更があった時にサービスをrestartさせる](http://qiita.com/tukiyo/items/0eef6e1a97d89b0149e4)
通信、パースなど処理にかかる時間を計測する。

## 処理にかかる時間を計測

基本的なことですが、通信にかかる時間やダウンロードをしたデータをパースするなどユーザーに極力待たせずに処理を終わらせるのが望ましいとは思います。

連続した処理などで実際どの処理で時間がかかっていたのか知らずにやっていて、調べてみたら思っていた所と違う場所で処理に時間がかかっていた、、、ということがあったので忘備録的に書いてみます。

```objc:

// インスタンス変数
NSDate *startDate;
NSDate *endDate;

// 処理開始位置で現在時間を代入
startDate = [NSDate date];

// 処理終了位置で現在時間を代入
endDate = [NSDate date];
  
// 開始時間と終了時間の差を表示
NSTimeInterval interval = [endDate timeIntervalSinceDate:startDate];
NSLog(@"処理開始時間 = %@",[self getDateString:startDate]);
NSLog(@"処理終了時間 = %@",[self getDateString:endDate]);
NSLog(@"処理時間 = %.3f秒",interval);


// 日付をミリ秒までの表示にして文字列で返すメソッド
- (NSString*)getDateString:(NSDate*)date
{
     // 日付フォーマットオブジェクトの生成
     NSDateFormatter *dateFormatter = [NSDateFormatter new];
     // フォーマットを指定の日付フォーマットに設定
     [dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss.SSS"];
     // 日付の文字列を生成
     NSString *dateString = [dateFormatter stringFromDate:date];
    
     return dateString;
}
```
NSDateを出力すると下図の様になって正確な時間まで分からない（差は正確に表示されています）
![uploading image.png...](http://d3j5vwomefv46c.cloudfront.net/photos/large/823439704.png?1385192488)


ミリ秒まで表示するメソッドを使って表示すると差が分かりやすい。
![uploading image.png...](http://d3j5vwomefv46c.cloudfront.net/photos/large/823441162.png?1385192995)
Unity2d クリック(タップ) されたオブジェクトを特定するやり方

初投稿です。

以前、自前のブログにUnity上でオブジェクトがタップされたかを検知するというので、
http://kibunhaossan.blog.fc2.com/blog-entry-37.html
上記記事を書いた後、ドヤ顔でUnity4.3から追加された2Dモードで同じことをしようとして、ものの見事に2日程詰まったので、2Dでのタップ判定について記載します。

色々書きそうなので、最初に要点を記します。

1. SpriteはColliderが設定されていないので、Colliderの設定をする。
2. 3D用の当たり判定は2D用では使えない。コードを2Dように書く必要がある
3. Colliderを重ねると、Order in Layerの0から優先して評価される。

んじゃ、順に書いていきます。

## 1. SpriteはColliderが設定されていないので、Colliderの設定をする。

Unity3D標準のGameObjectのCubeとかは特性上勝手にColliderが指定されているので、特に意識する必要は無いですが、SpriteはColliderが勝手に入ってくれません。
まずは、その設定をしましょう。

当たり判定を入れたいObjectを選択して、
![Objectを選択](http://f.cl.ly/items/0a140K3k1G0h2G2O0X37/unity-2d-click-01.png)


Componentから、今回の例では、Box Collider 2Dを選択します。
![Component追加](http://f.cl.ly/items/1e2J0Z2u2J0y1L2d373p/unity-2d-click-02.png)
![Component追加](http://f.cl.ly/items/0y0g3x1s1L1T3n380g1K/unity-2d-click-03.png)

インスペクタに追加されたことを確認します。
また、Is Triggerにチェックを入れておきます。
![IsTriggerにチェック](http://f.cl.ly/items/2Z1H3v16420t133i3W2E/unity-2d-click-04.png)

これでEditor上の設定は完了したので、次にコードを2D用にしていきます。


## 2. 3D用の当たり判定は2D用では使えない。コードを2Dように書く必要がある

まず、大事なのが。
2Dと3DのPhysicは同居できるが、お互いが干渉しあうことはありません。
(なので、2Dと3DのPhysicをぶつけるとすり抜けてしまいます)
ココらへんの説明は、
http://www.slideshare.net/keigoando/unity2-dnew-gui#btnNext
上記の資料＋上記で提示されているGitのSampleが非常にわかりやすいので、見たことない人は是非とも見てください。

んで、何が言いたいのかって言うと、3D用のPhysics.Raycastは2Dで展開されているSpriteを検知することはできません。
んじゃどうするか？2D用にちゃんと以下が用意されているので、それを使います。

* RaycastHit2d
* Physics2D
** Physics2D.Raycast

以下、上記を使ったSample

```
if (Input.GetMouseButtonDown(0)) {
    var tapPoint : Vector2 = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    var collition2d : Collider2D = Physics2D.OverlapPoint(tapPoint);
    if (collition2d) {
        var hitObject : RaycastHit2D = Physics2D.Raycast(tapPoint,-Vector2.up);
        if (hitObject) {
            Debug.Log("hit object is " + hitObject.collider.gameObject.name);
        }
    }
}
```
※私のブログの方のTE様より、collition2dが取得できない時不具合が発生するとのご指摘を頂きましたので、collition2dの判定を加えています。

これで取得することができます。


## 3. Colliderを重ねると、Order in Layerの0から優先して評価される。

これはおまけです。(ここでも詰まったので…)
どうやら、２つのSpriteそれぞれにColliderを設定し、タップすると、Order in Layerの0から優先して評価されてしまいます。
(ごちゃごちゃやっている際に、背景にCollider指定を入れてしまい、これに気づくまで本気で積みました)

これは、例えば以下のようにして回避できます。
![Sortの優先度を上げる](http://f.cl.ly/items/1v2G072K443Q3E1M1q1B/unity-2d-click-05.png)

Unity4.3は出て間もないというのもあり、色々試行錯誤してやっとここまでこぎつけたって感じなので、非常に無駄な事等やってましたら優しく突っ込んでやってくださいまし（＾＾；
VIMでmanを読む


下記コマンドを入力するだけの簡単なお仕事です。

``` zsh
man <知りたいこと> -P "col -b | vim -Rc 'setl ft=man ts=8 nomod nolist nonu' -c 'nmap q :q<cr>' -" 
```

zsh使っているなら、`~/.zshrc`にこんな感じで書いておくとデフォルトのmanを(大体)置き換えられて恍惚。

``` zsh:~/.zshrc
function man() { /usr/bin/man $* -P "col -b | vim -Rc 'setl ft=man ts=8 nomod nolist nonu' -c 'nmap q :q<cr>' -" }   
```


## キーバインド
使えます。

| Key | Behavior |
| ----------| ---------|
|`<C-]>` | カーソル下の単語を更にmanで調べる|
|`<C-t>` | 戻る |
Unity4.3 Android Admob 広告をクリック出来ない！


```xml:AndroidManifest.xml
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
```
そもそも、マニフェストファイルにクリックを許可するために上記1行を追記しなければならないのだが、Unity4.3から、このmeta-dataタグを「入れるべき行（場所）が変わった」ようだ。

これまでは、

activity android:label="@string/app_name" android:launchMode="singleTask" うんたらかんたら

でしたが、ちょっと上の

activity android:name="com.unity3d.player.UnityPlayerProxyActivity"

の中に入れてください。



```xml:AndroidManifest.xml
<activity android:label="@string/app_name" android:name="com.unity3d.player.UnityPlayerProxyActivity" android:launchMode="singleTask" android:screenOrientation="sensor" android:configChanges="locale|mcc|mnc|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
```

参考URL
http://forum.unity3d.com/threads/195169-Google-Admob-plugin-for-Unity-ad-is-not-clickable
teeコマンドでログをとる

端末の場合
==========

puppetを実行した時のようなカラフルなログをあとでまた表示したい場合があります。

```bash:puppetlog.txtに保存
sudo puppet agent --server puppetmaster.safe --test | tee puppetlog.txt
```

ログが保存出来たら`more`で読みましょう。(lessやvimではダメです。catは・・・大変なことになりますよ。)

```bash:
more puppetlog.txt
```

カラフルなログが表示できるはずです。
途中`q`キーで終了すると端末に色が継続されることがあります。(赤いままだったり。)
その場合は`reset`コマンドで端末をリセットしましょう。

mysqlの場合
===========

mysqlコマンドでも`tee`は活躍します。きっと端末のteeコマンドではなくてmysqlのteeという関数だろうけど。

```mysql:
mysql> tee querylog.txt
mysql> select * from catalogs
```

querylog.txtに以下コマンド結果がどんどん出力されるので、横に長い結果とかを別のエディタでじっくり読みましょう。
puppet入門5 ユーザー、グループの追加

* [puppet入門1 準備編](http://qiita.com/tukiyo/items/54c32ecfb8cc6cd76073)
* [puppet入門2 パッケージをインストールしてみる](http://qiita.com/tukiyo/items/e47dfc77ac40052ed04c)
* [puppet入門3 ファイルを配布](http://qiita.com/tukiyo/items/0003a54e47bf768133e2)
* [puppet入門4 ハマった場合の対処とか](http://qiita.com/tukiyo/items/d05bf0b705fd473adc55)
* [puppet入門5 ユーザー、グループの追加](http://qiita.com/tukiyo/items/e15dabc6174b475728fc)
* [puppet入門6 puppetのclientを追加する](http://qiita.com/tukiyo/items/261beec159f17a457d02)
* [puppet入門7 ファイルに変更があった時にサービスをrestartさせる](http://qiita.com/tukiyo3/items/0eef6e1a97d89b0149e4)




ユーザーとグループを追加してみよう。
今回はmysqlユーザーを作ってみた。

設定
======

```puppet:site.pp
node 'puppetmaster.safe' {
  group { "mysql":
    gid => 518,
    ensure => present
  }
  user { "mysql":
    ensure => present,
    home => "/opt/mysql",
    managehome => true,
    uid => 518,
    gid => 518,
    shell => "/bin/bash",
    password => '!!'
  }
}
```

配布
======

```bash:
# id mysql
id: mysql: No such user
# puppet agent --server=puppetmaster.safe --no-daemonize --verbose
Notice: Starting Puppet client version 3.3.2
Info: Retrieving plugin
Info: Caching catalog for puppetmaster.safe
Info: Applying configuration version '1385177049'
Notice: /Stage[main]//Node[puppetmaster.safe]/Group[mysql]/ensure: created
Notice: /Stage[main]//Node[puppetmaster.safe]/User[mysql]/ensure: created
Notice: Finished catalog run in 0.27 seconds
^CNotice: Caught INT; calling stop
# id mysql
uid=518(mysql) gid=518(mysql) groups=518(mysql)
# grep mysql /etc/shadow
mysql:!!:16032:0:99999:7:::
# grep mysql /etc/passwd
mysql:x:518:518::/opt/mysql:/bin/bash
```


```bash:/var/log/messages
Nov 23 06:24:08 puppetmaster puppet-agent[24182]: Starting Puppet client version 3.3.2
Nov 23 06:24:08 puppetmaster puppet-agent[24187]: Retrieving plugin
Nov 23 06:24:09 puppetmaster puppet-master[916]: Compiled catalog for puppetmaster.safe in environment production in 0.02 seconds
Nov 23 06:24:09 puppetmaster puppet-agent[24187]: Caching catalog for puppetmaster.safe
Nov 23 06:24:09 puppetmaster puppet-agent[24187]: Applying configuration version '1385177049'
Nov 23 06:24:09 puppetmaster puppet-agent[24187]: (/Stage[main]//Node[puppetmaster.safe]/Group[mysql]/ensure) created
Nov 23 06:24:09 puppetmaster puppet-agent[24187]: (/Stage[main]//Node[puppetmaster.safe]/User[mysql]/ensure) created
Nov 23 06:24:09 puppetmaster puppet-agent[24187]: Finished catalog run in 0.27 seconds
```

次は[puppet入門6 puppetのclientを追加する](http://qiita.com/tukiyo/items/261beec159f17a457d02)
画像をぴったりとくっつけたい

## はじめに

囲碁を実装した際に、CSSを実装する必要がありました。今回はCSSについて書きます。

[Canvasを画像に変えたい](http://qiita.com/t-mochizuki/items/4741864bca50afb80839)で、碁石や碁盤の画像が用意できました。この画像を適当に並べれば、碁盤を表現できると期待したのですが、適当に画像を並べただけでは、画像と画像の間にすきまができてしまいます。

このすきまをなくすCSSについて書きます。

## すきまをなくす

まず、ここでは次のようなHTMLを想定します。

``` GO.html
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="css/board.css" media="all">
  </head>
  <body>
    <title>GO</title>
    <table id="board">
      <tr>
        <td><img src="images/upper-left.png"></td>
        <td><img src="images/upper.png"></td>
        <td><img src="images/upper.png"></td>
        <td><img src="images/upper.png"></td>
        <td><img src="images/upper-right.png"></td>
      </tr>
      <tr>
        <td><img src="images/left.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/right.png"></td>
      </tr>
      <tr>
        <td><img src="images/left.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/right.png"></td>
      </tr>
      <tr>
        <td><img src="images/left.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/right.png"></td>
      </tr>
      <tr>
        <td><img src="images/left.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/cross.png"></td>
        <td><img src="images/right.png"></td>
      </tr>
      <tr>
        <td><img src="images/under-left.png"></td>
        <td><img src="images/under.png"></td>
        <td><img src="images/under.png"></td>
        <td><img src="images/under.png"></td>
        <td><img src="images/under-right.png"></td>
      </tr>
    </table>
  </body>
</html>
```

このHTMLに対して次のようなCSSを用意します。

``` board.css
table {
  border-collapse: collapse;
}

td {
  padding: 0px;
}

img {
  vertical-align: bottom;
}
```

このようにCSSを実装すると画像と画像の間のすきまをなくすことができました。ソースコードは[go](https://github.com/t-mochizuki/go)にありますので、興味のあるかたはダウンロードしてお試しいただければと思います。オフラインで動きます。

## 実は

実は、この問題を自力で解決することはむずかしそうだったので、@conscellさんに相談しました。そのときに[知らないといつまでたってもHTMLとCSSが理解できない暗黙の仕様4つ](http://webcre8.jp/investigate/html-implied-specifications.html)を紹介していただきました。
RailsにDateTimePickerを導入する



## 概要

日付だけならjQuery-uiのDatePickerでokだが、今回は日時まで
取得したかったので以下のDateTimePickerを使う。

bootstrap-datetimepicker-rails
https://github.com/lubieniebieski/bootstrap-datetimepicker-rails

※DatePickerなら以下を参照
Rails で jQuery-ui の Date Picker を日本語で表示する場合のメモAdd Star
http://d.hatena.ne.jp/CortYuming/20130420/p1

## 流れ

Gemfileに追記、bundle install。

```ruby:Gemfile
gem 'bootstrap-datetimepicker-rails'
```

```sh
bundle install
```

application.jsを編集。

```assets/javascripts/application.js
//= require bootstrap-datetimepicker

var data = {'data-format': 'yyyy-MM-dd hh:mm:ss' };
$(function(){
    $('.datepicker').attr(data);
    $('.datepicker').datetimepicker();
});
```
表示項目オプションとしてdata-format属性が必要なので、動的に追加している。

使いそうな出力形式はこんな感じ。

|data-format属性（オプション）|出力形式|
|---|---|
|{'data-format': 'yyyy-MM-dd'}|2013-11-23|
|{'data-format': 'yyyy-MM-dd hh:mm:ss'}|2013-11-23 11:16:46|
|{'data-format': 'yyyy-MM-dd hh:mm:ss PP'}|2013-11-23 11:16:46 PM|

より詳しくは以下。
http://tarruda.github.io/bootstrap-datetimepicker/

application.cssを編集。

```assets/stylesheets/application.css.scss
@import 'bootstrap-datetimepicker';
```

任意のviewから呼び出し。

```app/views/hoges/_form.html.erb
<%= f.label :日付 %>
<%= f.text_field :created_at, :class => 'datepicker' %>
```

出た。

![datetimepicker.png](https://qiita-image-store.s3.amazonaws.com/0/8790/547aea92-e069-d7fb-0f15-b1fac193a457.png "datetimepicker.png")
Objective-CでJavaライクなランダム

#ペッと貼ってペッと使うだけ

Cocoapodsでこういうのあるだろーって楽しようとしたらくだらなすぎてなかった。
だから自分で書いた。短いコードなだけに間違ってたらマヌケ。
でも以外と突っ込まれそうなのが、intとかdoubleとかが何ビットだのでunsignedがうんたらで0xゼロゼロ・・・のくだりがどうとか。
間違ってたらこっそり教えてください。

```objc:Random.h

#import <Foundation/Foundation.h>

@interface Random : NSObject

+ (int)nextInt:(int)n;

+ (int)nextIntFrom:(int)m to:(int)n;

+ (float)nextFloat;

+ (double)nextDouble;

+ (BOOL)nextBOOL;

@end
```

```objc:Random.m

#import "Random.h"

@implementation Random {
}

+ (int)nextInt:(int)n {

	return arc4random() % n;
}

+ (int)nextIntFrom:(int)m to:(int)n {

	return [self nextInt:n - m] + m;
}

+ (float)nextFloat {

	return arc4random() / (float) 0x100000000;
}

+ (double)nextDouble {

	return arc4random() / (double) 0x100000000;
}

+ (BOOL)nextBOOL {

	return arc4random() % 2;
}

@end
```
luaのforとwhileのパフォーマンス差

luaはループの書き方によって実行速度に差が出るっぽくて、forが圧倒的に速い。
前のエントリを書いててたまたま気づいたんだけど、面白いのでメモ。

# ベンチマーク
純粋に繰り返しのみを行うコードで、forとwhileのどちらを使うかだけを変えている。

```lua:while.lua
local start = os.clock()
local COUNT = 1000000000 

local i = 0
while i < COUNT do
	i = i + 1
end

print( os.clock() - start )
```

```lua:for.lua
local start = os.clock()
local COUNT = 1000000000 

for i=0, COUNT do
end

print( os.clock() - start )
```

# 結果
forが３倍ほど高速であることがわかる。
＃ 最適化によってループが省略されている可能性も疑ったが、実用コードに入れても絶対差としては同程度だった。

| 回 | for.lua | while.lua |
|----|----|----|
| 1 | 5.25 | 17.28 |
| 2 | 5.34 | 17.70 |
| 3 | 5.32 | 17.39 |
Git 入門 ( Frontrend Vol.6 メモ )

# はじめに
本記事は、Git コマンドの仕組みを理解せず使っている Git 初心者向けの記事です。
本記事の内容は、株式会社サイバーエージェント 主催の [Frontrend 勉強会](http://frontrend.doorkeeper.jp/events/6907 "Frontrend 勉強会")での「いつやるの？ Git 入門」の要約です。
勉強会で使用されていた資料は [こちら](http://sssslide.com/www.slideshare.net/matsukaz/git-28304397 "こちら") より参照できます。

# Git の内部構造
Git で大事なデータ領域は下記の 3 つです。

* 作業ディレクトリ
　Git ディレクトリ以外の、ユーザが編集するファイル / ディレクトリのこと

* ステージングエリア ( インデックス )
　作業ディレクトリの変更点を登録する一時領域のこと

* Git ディレクトリ
　.git ディレクトリのこと

Git コマンドは上記 3 つのデータ領域間のファイル操作のことです...と言われても分かりにくいと思いますので、具体例で説明します。

### 具体例

```
$ mkdir example && cd example
$ git init
```

上記コマンドを実行すると、example ディレクトリに .git ディレクトリができると思います。この .git ディレクトリが Git ディレクトリ、その他ディレクトリが作業ディレクトリにあたります。

```
$ touch hoge.txt
$ git add -A
```

上記コマンドを実行すると、作業ディレクトリの変更点 ( hoge.txt の作成 ) がステージングエリアに登録されます。つまり add コマンドは、 **作業ディレクトリとステージングエリア間のファイル操作を行うコマンド** ということです。

```
$ git commit -m <commit message>
```

上記コマンドを実行すると、ステージングエリアに登録された変更内容が .git ディレクトリに反映されます。つまり commit コマンドは、 **ステージングエリアと .git ディレクトリ間のファイル操作を行うコマンド** ということです。

mv / reset / rebase などの他のコマンドがどの領域間のファイル操作を行うかは、[Git Cheatsheet](http://ndpsoftware.com/git-cheatsheet.html "Git Cheatsheet") より確認できます。

# ブランチとは
ブランチとはメインとは別の流れで作業を続ける機能のことです。Subversion とは異なり、 **Git には trunk が無く全てがブランチである** ため、現在作業中のブランチがどこなのか ( つまり HEAD の位置 ) を知っておく必要があります。
ブランチのコンセプトの理解を深めたい方は、[Learn Git Branching](http://k.swd.cc/learnGitBranching-ja/ "Learn Git Branching") を参考にしてください。

# 参考 URL
http://matome.naver.jp/odai/2136491451473222801
rails インストール (CeontOS)


## はじめに

下記のものを入れておく

1. git
1. rbenv
1. ruby-build
1. ruby

[参考] http://qiita.com/inouet@github/items/478f4228dbbcd442bfe8

## 1. gem のアップデート

```bash
$ gem update --system
```

## 2. bundler のインストール

```bash
$ gem install bundler --no-ri --no-rdoc
Fetching: bundler-1.3.5.gem (100%)
Successfully installed bundler-1.3.5
```

忘れずに

```
$ rbenv rehash
```

## 3. rails のインストール

```bash
$ mkdir ~/my_rails_app
$ cd ~/my_rails_app
$ bundle init
```
Gemfile ができる

Gemfile 編集

```bash
$ vim Gemfile

source "https://rubygems.org"
gem 'rails', '~> 4.0.0'

```

```bash
$ bundle install
```

## 3. 確認

```bash
$ rails -v
Rails 4.0.1
```

プロジェクト作ってみる

```bash
$ rails new test_app
```
いろいろファイルが作られる

WEBサーバ(WEBRic)を立ち上げて確認

```bash
$ cd test_app
$ rails server
```

JavaScript Runtime のエラーが出る場合は therubyracer を入れる。

Gemfile編集して

```bash
$ vim Gemfile
# gem 'therubyracer', platforms: :ruby <== このコメントを外す
```
インストール

```bash
$ bundle install
```

ブラウザでURLを叩いて Rails 画面が出ればOK

http://192.168.33.10:3000/
Resouces for Building Rich Client Page with JS


# Twitter Bootstrap

## Form
###### [jqBootstrapValidation by ReactiveRaven](http://reactiveraven.github.io/jqBootstrapValidation/)
- Can define validation rule mainly by HTML5 compatible format.

###### [BootStrap MaxLength](http://mimo84.github.io/bootstrap-maxlength/)

## Layout Generator
###### [LayoutIt! - Interface Builder for Bootstrap](http://www.layoutit.com/)

## Resource

### Official
###### [Bootstrap Expo](http://expo.getbootstrap.com/)
### Resource Catalog
###### [The Big Badass List of Twitter Bootstrap Resources](http://www.bootstraphero.com/the-big-badass-list-of-twitter-bootstrap-resources)
- List of resource to use bootstrap.
- Components, Framework Integrations, Interface Builders, Mockup Tools, How Tos (Articles, Presentaions, Videos), Javascript Addons.

###### [Fuel UX](http://exacttarget.github.io/fuelux/)

### Articles
###### [Bootstrapに便利な機能を追加できるjQueryプラグインまとめ - W3Q](http://w3q.jp/t/4438)
###### [ひと味ちがうTwitter Bootstrapリソースまとめ、UIパーツ編 - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/twitter-bootstrap-parts-jquery-ui/)
###### [ひと味ちがうTwitter Bootstrapの18個の無料テンプレート&有料まとめサイト - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/twitter-bootstrap-templates/)

# Table
- [DataTables (table plug-in for jQuery)](http://www.datatables.net/)
- [jquery テーブル いくつか | CotDeve Blog](http://cotdeve.com/blog/jquery/jquery-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB-%E3%81%84%E3%81%8F%E3%81%A4%E3%81%8B/)

# Modal
- [Pop Easy | by Thomas Grauer](http://thomasgrauer.com/popeasy/)
- [[JS]機能も充実、設置も簡単、デザインも素敵！モーダルウインドウを実装する超軽量のスクリプト -Pop Easy | コリス](http://coliss.com/articles/build-websites/operation/javascript/jquery-plugin-pop-easy.html)
- [シンプルイズベスト！おしゃれなモーダルウィンドウを実装出来る「SIMPLE MODAL」 | 株式会社LIG](http://liginc.co.jp/designer/archives/12036)
- [【jQuery or CSS only】シンプルで便利なモーダルウィンドウ - NAVER まとめ](http://matome.naver.jp/odai/2135536288967536901)
【募集】プログラミングのスキル交換をしませんか

私に技術を教えてください。私も教えます。
互いにマンツーマンで教えあい、効率的に技術を習得しましょう。
ガチガチの成果を保証をするというよりは、時間で区切り、互いにハンズオンをベースにベストエフォートで教えあう感じをイメージしています。
興味がある方は、コメント、メール、ツイッターで連絡ください。

##実績

|私が差し出したもの|私が受け取ったもの|
|---------------|---------------|
|将棋の基礎       |機械学習の基礎|
|機械学習の基礎    |確定拠出年金に関する情報,全文検索に関する情報,医者から見た医者にかかるときに気をつけるべきこと,病気に関して医師に相談する権利|
|機械学習の基礎|ペン字のコツ、翻訳者の考える英語学習方法、黒人音楽のグルーヴのメカニズム、良好な開発会社の紹介|


##教えてほしいこと(どれかひとつで十分です)
線形代数の基本
Unityの基本
多くの人が知らず、あなたがそれによって得をし、かつ私がそれを聞いて正しそうだと納得できる技術・情報・知見

##教えられること
cocos2dx(javascript)の基礎
機械学習の基礎(scikit-learnの基礎)
GoogleAppEngineの基礎
Ember.jsの基礎
Coffeescriptの基礎
Javascriptの基礎
Vimの基礎
Pythonの基礎
スクレイピングの基礎
PHPの基礎
簿記2級
VBAの基礎(!)
将棋
オセロ
モノポリー
ボンバーマン
porky.jsのすべて

等々
くわしくは、下記をごらんください。
知ってることであれば教えます。
http://qiita.com/puriketu99

##希望日時
時間はいつでもいいです

##段取り
1.教えられることと教えて欲しいことを私に伝えてもらう
2.どの範囲を何時間ずつ教えあうか等、具体的に話を摺りあわせる
3.合意ができれば、具体的なスケジュールを決める

　#互いにQiita内等でリプ飛ばし合って質問してもいい契約とかでもよいです

##連絡先

###twitter
http://twitter.com/puriketu99

###メールアドレス
puriketu.white[at]gmail.com
Java apache HttpClient 4.3からの大幅なインターフェース変更に対応

## インターフェース変更

久しぶりにApache Jakarta HttpClientを利用してみたところ最新の4.3であまりにもインターフェースが変更されていて非推奨の警告ばかりでてきました。
警告なので当面は動作するのですが今後のことを考えて正しい使い方を調べてサンプルコードを作成してみました。

2013年11月現在、英語も含めてあまりサンプルソースコードが見つからないので参考にしたのは本家のJavaDocとソースコードを追って確認しました。
これまで使い慣れていた人にとってdeprecatedが多くなってしまうほどの大幅な変更です。

本家JavaDoc
https://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/

大きな変更点として、実装面ではスレッド処理に強い実装になっていること、プログラミング記述上の変更点としては設定系がそれぞれクラスに分かれていることがあげられます。一度わかってしまえば新しい方がいい感じですので皆さんもぜひご利用ください。

### ポイント

- HttpClientのオブジェクトを利用するのはHttpClientBuilderを利用する
- 接続設定やヘッダなどの設定にはConfigクラスを利用する

## HttpClientインスタンスの作成

今までのHttpClientではDefaultHttpClientをそのままインスタンス化できました。

### 旧式の記述

```java:old
  // configurations
  int socketTimeout = 3;
  int connectionTimeout = 3;
  String userAgent = "My Http Client 0.1";
  // create client
  HttpClient httpClient = new DefaultHttpClient();
  HttpParams params = httpClient.getParams();
  HttpConnectionParams.setConnectionTimeout(params, connectionTimeout);
  HttpConnectionParams.setSoTimeout(params, socketTimeout);
  method.setHeader("Accept-Charset", "utf-8");
  method.setHeader("Accept-Language", "ja");
  method.setHeader("User-Agent", userAgent);
```

### 4.3での記述

4.3のインターフェースでは分類されたConfigurationを作ってクライアントをビルドするという流れになっています。

```java:HttpClient
  // configurations
  int socketTimeout = 3;
  int connectionTimeout = 3;
  String userAgent = "My Http Client 0.1";
  // request configuration
  RequestConfig requestConfig = RequestConfig.custom()
      .setConnectTimeout(connectionTimeout)
      .setSocketTimeout(socketTimeout)
      .build();
  // headers
  List<Header> headers = new ArrayList<Header>();
  headers.add(new BasicHeader("Accept-Charset","utf-8"));
  headers.add(new BasicHeader("Accept-Language","ja, en;q=0.8"));
  headers.add(new BasicHeader("User-Agent",userAgent));
  // create client
  HttpClient httpClient = HttpClientBuilder.create()
      .setDefaultRequestConfig(requestConfig)
      .setDefaultHeaders(headers).build();
```

冗長に感じるかもしれませんが、これまでよりロジカルな流れでできるので好ましいように感じます。自身のインスタンスが返されて設定をappendのように追加できるのもいい感じですね。

リダイレクトや回数を指定する場合もRequestConfigで設定できます。

```java:Redirect
  // request configuration
  RequestConfig requestConfig = RequestConfig.custom()
      .setCircularRedirectsAllowed(true)
      .setMaxRedirects(30)
      .setRedirectsEnabled(true)
      .build();
```

## リクエスト送信と結果取得

この部分はこれまで通りのやり方です。

```java:GET
  HttpGet httpGet = new HttpGet();
  HttpResponse response = httpClient.execute(method);  
  int responseStatus = response.getStatusLine().getStatusCode();
  String body = EntityUtils.toString(response.getEntity(), "UTF-8");
```

```java:POST
  HttpPost method = new HttpPost(url);
  List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
  requestParams.add(new BasicNameValuePair("foo","var");
  method.setEntity(new UrlEncodedFormEntity(requestParams));  
  HttpResponse response = httpClient.execute(method);  
  int responseStatus = response.getStatusLine().getStatusCode();
  String body = EntityUtils.toString(response.getEntity(), "UTF-8");
```

とりあえず今回はこのくらいで。
CSS Sptite

CSS Spriteの勉強がてら、sprite画像とcssが書かれたhtmlファイルを生成するスクリプトを書いてみた。
https://github.com/takushi-m/CSSSpritter
使い方は
```shell-session
python css_sprite.py ./img
```
とするだけ。フォルダを指定しなかったときは現在のフォルダで画像を探す。

http://codezine.jp/article/detail/7425
Volleyを使うときに気をつけることメモ

開発中のアプリに「ネット上からの画像の取得とキャッシュをする」処理があったので、不安定なオレオレ実装からGoogle謹製のVolleyに乗り換えてみました。
Volleyの導入やスタートアップは[こちら](http://dev.classmethod.jp/smartphone/android/android-tips-51-volley/)なんかを参考にするといいと思います。
今回はVolleyを使う上での実用的なメモを備忘録代わりに書いておきます(@mhidakaさんに助けてもらいました)


## 1. 一度にRequestを投げすぎるな！

Volleyがレスポンスを返すおおまかな流れは

* Requestを生成
* RequestQueueに投げる
* ディスクキャッシュを探して見つかれば返す
* インターネットから拾ってきて返す

という感じです。RequestQueueに投げてからレスポンスを返すまでは別スレッドで動いてくれるので、UIスレッドを停止させることはありません。
ところで、このDispatcherがVolleyでは1つしかなくて並列化されていないので、短い時間に大量のRequestを投げてしまうとキューが溜まってしまってなかなか処理が終わりません。ですので「後で使うから予めプリキャッシュしておこう」という感じにVolleyを使うとパフォーマンス良くないです。必要なときに必要なだけ適切に投げてあげるといい感じに動きます。

## 2. ImageLoader+ImageCache

「ImageViewへネットからの画像読み込み」に特化した **ImageLoader** という仕組みがVolleyにあります。
ImageLoaderは画像に特化したRequest処理の実装で、内部にメモリキャッシュを持ちます。
[こちら](http://dev.classmethod.jp/smartphone/android/android-tips-51-volley/)を見てもらえればわかりますが、ImageLoaderにはImageCacheというインタフェースのインスタンスを渡してあげることでメモリキャッシュが可能になってます。ImageLoaderを使った時の処理の流れは

* **URLをImageLoaderに投げる**
* **URLをキーにメモリキャッシュを探索(高速)**
* 見つからなければ勝手にRequestを生成してRequestQueueに投げる
* ディスクキャッシュを探して見つかれば返す(ここは単一スレッド)
* インターネットから拾ってきて返す

となっています。メモリキャッシュへのアクセスはそもそも早い<del>上に並列化されている</del>ので画像を扱う場合は基本的にこのImageLoaderを使うのが鉄則だと思われます。
<追記>
メモリキャッシュの探索は並列化されてなかったので取り消しました

## 3.ImageLoader+NoCacheという選択肢

RequestQueueの生成時に渡すCacheは普通のサンプルコードではDiskBasedCacheだったりしますが、これを独自の空実装にしておけば、常にネットワークへアクセスさせることができます。この場合の処理の流れは

* URLをImageLoaderに投げる
* URLをキーにメモリキャッシュを探索(高速)
* 見つからなければ勝手にRequestを生成してRequestQueueに投げる
* ディスクキャッシュは必ず空
* インターネットから拾ってきて返す(4本並列で早い)

ネットワークからレスポンスを受け取るためのDispatcherはデフォルトで4つ用意されているのでレスポンスの投げ方やサイズ、回線状況によりますが、ディスクキャッシュよりもネットワークからのレスポンスのほうが早い場合もあります。なのでパフォーマンスを重視して一切キャッシュせずにVolleyを使うというのも十分にアリな選択です。


以上Volleyの私的メモでした。Volley素晴らしいのでみなさん使って流行らせましょう！
GoogleChrome appの作り方


単純に、chromeから自分のブログの管理ページへ飛んでくれるリンクを作りたかった。ただ、blogとして利用しているwordpressは基本的に好きなサーバを借りてそこにphpとかをおいて動かすブログ。
当然ながら僕の管理ページに飛んでくれるリンクアプリはchromeストアにない。
「よし、リンクを作ろう」と決意し、ものの15分で完成！！
実に簡単で拍子抜けした。
![Screen Shot 2013-11-22 at 23.39.39.png](https://qiita-image-store.s3.amazonaws.com/0/20980/05f1423a-2994-5d35-09f6-b2b547f90c88.png "Screen Shot 2013-11-22 at 23.39.39.png")

---

#作り方
空のフォルダーを用意。
次に、以下の二つのコンテンツを保存

```js:manifest.json
{
  "name": "wordpress",
  "version": "1.0",
  "description": "",
  "manifest_version": 2,
  "icons": {"128": "icon.png"},
  "app": {
    "default_title": "wordpress",
    "launch": {
        "web_url": "http://steelydylan.phpapps.jp/wp-admin/"
    }
  }
}
```


アイコン画像

![icon.png](https://qiita-image-store.s3.amazonaws.com/0/20980/688e9e4b-aaf1-41ce-a2e6-a5399b832914.png "icon.png")

あとは、chromeを開き、拡張機能の項目に移動し、
「load unpacked extension」をクリックし、先ほど作成したフォルダを選択するだけ！！

![Screen Shot 2013-11-22 at 23.49.55.png](https://qiita-image-store.s3.amazonaws.com/0/20980/531975d9-6e0e-3d65-a039-9d78a98c2304.png "Screen Shot 2013-11-22 at 23.49.55.png")
GoogleAppsScroptメモ：カレンダーをいじってみる

#### アクセスしてきたユーザーのカレンダーに予定を登録できるか実験 ####
まずはてきとうにUIを用意

```js
function doGet(e){
   var app = UiApp.createApplication();
   app.setTitle("SmartCalenderImporter");   //これがページタイトルになる
  
   var btn = app.createButton("Import your calendar");
   var btnClick = app.createServerClickHandler('importCalendar');
   btn.addClickHandler(btnClick);
  
   app.add(btn);
   return app;
}
```

次にカレンダー登録をする関数を作る

```js
function importCalendar(){

   var cal = CalendarApp.getDefaultCalendar();
   //アクセスしてきたユーザーのカレンダーを取得
   var title = "Your new birthday!";
   var start_point = new Date('November 25,2013 09:00:00 GMT+09:00');
   //GMTというのは世界水準の時刻で・・・・
   var end_point = new Date('November 25,2013 12:00:00 GMT+09:00');
   //東京はそのプラス９時間とのこと
   var options = {location:"Your house",description:"Happy birthday!!"};  
    //場所と説明文はなぜかセットで扱う模様
  
   cal.createEvent(title,start_point,end_point,options);
   //タイトル、開始日時、終了日時、場所＆説明文（たぶん無くても可）という順序で引数に入れる
}
```
###### なんと、これだけでページからイベントを登録できてしまった ######
カレンダー登録の部分に至ってはたったの６行、なんだかかえって不安になる。
認証画面はページを開く段階で勝手に出してくれるので完全にGoogleまかせみたいだ（ちなみに一応複数のアカウントで試してみたが、それもちゃんと成功した）。
ともあれ僕が作りたいのはカレンダー操作を行うアプリなので、ここから少しずつ発展させていきます。
Express + JadeでHTMLを見やすく出力する方法

Express+JadeでHTMLを出力すると改行無しで1行で出力されます。

```html
<!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express</p></body></html>
```

`res.render()`の第二引数にpretty: trueを渡すと改行＋インデントされます。

```js
// routes.index.js
exports.index = function(req, res){
  res.render('index', { title: 'Express', pretty: true });
};
```

```html
<!DOCTYPE html>
<html>
  <head>
    <title>Express</title>
    <link rel="stylesheet" href="/stylesheets/style.css">
  </head>
  <body>
    <h1>Express</h1>
    <p>Welcome to Express</p>
  </body>
</html>
```

これは、`res.render(view, [locals], callback)`が`jade.rendeFile(filename, options, callback)`を呼んでいるためです。この第二引数optionsは、

[API Documentation : Jade - Template Engine](http://jade-lang.com/api/)

>    options
>    An options object (see above), also used as the locals object

と、Jadeのオプションとテンプレートに渡す変数の両方の目的で使われています。Jadeのオプションには他にも以下のものがあります。

* filename
* pretty
* self
* debug
* compileDebug
* compiler
* globals

なので、例えばテンプレート変数名のつもりでうっかりdebugとか使うと、動かなくはないけどコンソールに大量にログが出力されます。
doCheckName on Jenkins plugin

Jenkins pluginのコードを見ていてこんなのがあった

```java
public FormValidation doCheckName(@QueryParameter String value) throws IOException, ServletException {
     if (value.length() == 0) { 
        return FormValidation.error("Please set a name");
    }
    if (value.length() < 4) {
        return FormValidation.warning("Isn't the name too short?");
    }
    return FormValidation.ok();
}
```

これは入力されたフォーム情報にValidationをかける関数だけれど、この`doCheckName`は別に拡張ポイントのオーバライドでもなんでもなくて、field名に合わせて動的にJenkinsが決めてくれるらしい。
つまりconfig.jellyにこんなふうに書いてあると

```
<f:entry title="Test" field="test">
  <f:textbox />
</f:entry>
```

このtextboxのvalidationは`doCheckTest`が呼ばれることになっている。
LAN内でリバースプロキシを使用した場合の request.remote_ip


はまったのん…

環境
====

- Rails 4.0.1
- nginx + Unicorn

リバースプロキシを利用した場合のアクセス元アドレス
======

通常、リバースプロキシ (nginxなどのウェブサーバを含む; 以下単にプロキシ) を利用した場合、アクセス元はプロキシ側のIPアドレスとなるため実際のアドレスを知ることが出来ない。このため、プロキシ側ではリクエストヘッダ (`Client-IP:` など) にアクセス元のアドレスを含めることが多い。Webサーバはこの値を読んで本来のアドレスを知ることが出来る。

Railsでは `request.env` 中の情報を利用して、実際のリモートホストを取得することが出来る。ただし、`request.remote_ip` でヘッダの情報を処理した "正しい" リモートホストを参照することができるため、直接ヘッダの情報を参照するメリットはあまり無い。(この機能は ActionPack 中の ActionDispatch で提供されており、`Client-IP:` または `X-Forwarded-For:` に含まれるアドレスがリモートアドレスとして取り扱われる。)

問題点
=====

LAN (プライベートIPアドレスを使用したネットワーク) 内にあるサーバにアクセスした場合には request.remote_ip がプロキシ側のアドレスとなってしまう。

※プロキシ側では Client-IP: または X-Forwarded-For: が設定されるものとする。

原因
====

ActionDispatch::RemoteIp::TRUSTED_PROXIES にマッチするアドレス (ループバックアドレスとプライベートアドレス) は、プロキシサーバと見なされ、Client-IP: や X-Forwarded-For: に含まれていても無視されるため。(`ActionDispatch::RemoteIp::GetIp.filter_proxies` で処理している。)

```ruby:actionpack-4.0.1/lib/action_dispatch/middleware/remote_ip.rb
TRUSTED_PROXIES = %r{
  ^127\.0\.0\.1$                | # localhost IPv4
  ^::1$                         | # localhost IPv6
  ^fc00:                        | # private IPv6 range fc00
  ^10\.                         | # private IPv4 range 10.x.x.x
  ^172\.(1[6-9]|2[0-9]|3[0-1])\.| # private IPv4 range 172.16.0.0 .. 31.255.255
  ^192\.168\.                     # private IPv4 range 192.168.x.x
}x
```

対策
====

プロキシのみにマッチする正規表現を Rails.configuration.action_dispatch.trusted_proxies に設定する。

```ruby:config/environments/production.rb
Hoge::Application.configure do
  ...
  config.action_dispatch.trusted_proxies = /^127\.|^::1$/
end
```

ここでは、ループバックアドレスのみをプロキシサーバとして扱うよう設定した。

まとめ
=====

- ドキュメントをサガしたけど直接書かれているものが見つからず、ソースコードを読むことに。オープンソースはありがたいけど、初心者には辛い。
- デフォルトで Client-IP: や X-Forwarded-For: を処理したり、プライベートアドレスをプロキシ扱いにするのは、あまり筋が良くないと思う。
- こまちゃん可愛い
zsh で連続したスペースにキーバインドを割り当てる

zsh で、\<SPACE\> \<SPACE\> とスペースを2つ連続で入れた時に何かしたくなった。例えばスペース2つ入れたら `git ` に置き換わる、とか。

`bindkey '  ' XXX` とかしたくなるけど、それではうまくいかない。
一応動くことは動くんだけど、普通にスペースを1つだけ入れたい時でも、一回スペースを押してからちょっと待ち時間が発生してしまう。うれしくない。

そういうときはこれを `.zshrc` に書いておけばOK。

```zsh:double_space_keybind.zsh
function _double_space_to_git() {
    if [[ "${BUFFER}" == " " ]]; then
        LBUFFER="git "
    else
        zle self-insert
    fi
}
zle -N _double_space_to_git
bindkey ' ' _double_space_to_git
```

これで、スペースを2つ連続で入れると `git ` に置き換わる。
`git ` のところは好きなように変えて使ってください。
非ActiveRecordなテスト用データをFactoryGirlで生成する

# 非ActiveRecordなデータを`let`したい

```spec
describe Something do
  let(:test_data) { FacotryGirl.build :chunky }
#...
  expect(test_data.name).to be('bacon')
```

と言う感じでActiveRecordにないテスト用のデータを生成したいと思ったので。

## `spec/support/models/test_data.rb`でクラスを定義

```ruby:spec/support/models/test_data.rb
class TestData
  attr_accessor :name, :anything_you_want
end
```

## `spec/factories/test_data.rb`で`FactoryGirl`を定義

```rb:spec/factories/test_data.rb
FactoryGirl.define do
  factory :chunky, class: :test_data do
    name 'bacon'
    anything_you_want 'hey!'
  end
end
```

で一番上に書いたような使い方が出来ます。
Ruby 1.8 と 1.9 以降で delegator の挙動が変わっている


[Evaluating Alternative Decorator Implementations In Ruby](http://robots.thoughtbot.com/evaluating-alternative-decorator-implementations-in "Evaluating Alternative Decorator Implementations In Ruby")
これの最後の delegate を使ったサンプルが Ruby 1.8 だと素直に動かなかった。

Ruby の delegate ライブラリについてはとりあえずここを読めば分かると思う。
[Rubyist Magazine - 標準添付ライブラリ紹介 【第 6 回】 委譲](http://magazine.rubyist.net/?0012-BundledLibraries "Rubyist Magazine - 標準添付ライブラリ紹介 【第 6 回】 委譲")

## 問題

```rb:test_delegator.rb
class Coffee
  def cost
    2
  end
end

require 'delegate'

class Decorator < SimpleDelegator
  def class
    __getobj__.class
  end
end

class Milk < Decorator
  def cost
    super + 0.4
  end
end

coffee = Coffee.new
puts Milk.new(coffee).cost
```

```irb
irb(main):001:0> RUBY_VERSION
=> "1.8.7"
irb(main):002:0> load 'test_delegator.rb'
2
```

```irb
irb(main):001:0> RUBY_VERSION
=> "1.9.3"
irb(main):002:0> load 'test_delegator.rb'
2.4
```


最後の結果が違うのに注目すれば良いのだけど、要点は

* (Simple)Delegator を継承したクラス(この場合は Decorator)で `class` メソッドを `__getobj__.class` とオーバーライドした場合
* 移譲先オブジェクトのメソッドをオーバーライド(Milk#cost)しても、Ruby 1.8 だとオーバーライドがうまく動作しない

という感じ。

ソースを追ったら Delegator クラスの initialize の中で self.class.ancestors のメソッドを再定義しているのがダメっぽい。
1.9 からは別実装になってるので、問題無く動作する。

## 解決策

力技だけど、1.9 のソースを持ってきて、1.8 以下の時はそっちを使うようにした。

## もっと良い解決策

Ruby のバージョンをあげる
mock_redisを利用してテスト環境のRedisをmockする

# Redisのテスト
環境の切り替えはnamespaceとか使うべきなのかな…と思っていたら[causes/mock_redis](https://github.com/causes/mock_redis)を見つけました。

```irb
>> require 'mock_redis'
>> mr = MockRedis.new
>> mr.set('some key', 'some value')
=> "OK"
>> mr.get('some key')
=> "some value"
```

と言った形でredisの操作をmock出来るgemです。

# RSpecへの適応
テスト実行時にlocalのredis等を使わないようにします。

```rb:spec_helper.rb
require 'mock_redis'

RSpec.configure do |config|
  config.before(:all) do
    # for Spring
    $redis.client.reconnect
  end
  config.before(:each) do
    redis_instance = MockRedis.new
    Redis.stub(:new).and_return{ redis_instance }
    # for redis cache.
    #Redis::Store.stub(:new).and_return{ redis_instance }
    # 追記
    $redis = Redis.new
  end
```

## 追記
initializerのタイミングがMockよりも先なのでspec_helper内で$redisを生成し直す形に変更しました。
と言うか今までMock出来てなかったのか…。

`Redis.new`した時に`MockRedis.new`を返します。
Springを利用している場合は

```rb:
     Redis::InheritedError:
       Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.
```

が出てしまうので、`before(:all)`内で再接続させています。
`$redis`はinitializers内で

```rb:config/initializers/redis.rb
redis_config = YAML.load_file(Rails.root.join('config', 'redis.yml'))[Rails.env]
$redis = Redis.new(:host => redis_config['host'], :port => redis_config['port'])
```

と言った感じで設定しています。
Solve byobu error "Cannot open your terminal '/dev/pts/0' - please check"

_この項、あまり信用しないでください。どうも動作が不安定なようです_

---

`su` でユーザを切り替えると


`Cannot open your terminal '/dev/pts/0' - please check`

というエラーが出る場合があります。


これは `/dev/pts/0` に書き込み権限が無いためです。


`su` のたび `script /dev/null` すれば解決するのですが、面倒な場合は、切り替え先のユーザの `.bashrc` または `.zshrc` の末尾に以下のコードを加えます。間違えると無限ループにハマったり `su` できなくなったりするので、ご注意ください。

```shell-session
if [ ! "$STY" -a ! -w `tty` ]
then
    exec script -q /dev/null
fi
```

`byobu` を立ち上げると `STY` という環境変数が設定されることを利用しています。また端末に接続されたデバイス・ファイルの書き込み権限を確認しています。


以下のサイトを参考にしました。
http://memo.saitodev.com/home/gnu_screen/
AngularJSの$resourceの仕組み

ここでちょっと勘違いなコメントをしてしまいました。

- [AngularJSで同期のように非同期関数を書く](http://qiita.com/toruta39/items/2de08b73fddb72270ffb)

AngularJSの$resourceサービスを使うと、以下のように非同期な処理なのに同期呼び出しのように書けるということなんですが、僕はこれをPromiseを返して実現してるものだと思っていました。

~~~js
var User = $resource('/api/user/:username');
$scope.user = User.get({username: 'foo'});
~~~

でも違うんですね。
公式ドキュメントを読むとちゃんと書いてあります。

- [AngularJS: ngResource.$resource](http://docs.angularjs.org/api/ngResource.$resource)

$resourceオブジェクトのメソッドを呼び出すとすぐに空の参照を返し、サーバーから結果が返ってくるとその結果を参照に追加すると。

確かに実装を見てもそうなってました。
戻り値が配列でない場合(getとか)は、まずResource型のインスタンスを作って参照を返し、サーバーから結果を受け取ったら参照の中身を置き換える。
戻り値が配列の場合(queryとか)は、まず空の配列を返し、サーバーから結果を受け取ったらそれを配列にpushする。

なるほど。よくできてますね！
gumbyframeworkをbower抜きでclaymate

claymate installを行うとbowerを使うので、原則的にbower構成になり、デフォルトでは公式のリポジトリを使い推奨されたディレクトリ構成になる。
bower構成以外でgumbyframeworkを使いたい場合（フォークしたリポジトリをgitsubmoduleで使いたい、格納先を調整したい場合など）は自分の構成に合わせて、gumby.jsonを用意するかclaymateコマンドのオプションで指定する。

claymate:
https://github.com/GumbyFramework/Claymate
gumbyframeworkのscaffoldの作成、運用時のjsのminify、sassのコンパイルなどをコマンドで自動化してくれる。

claymate build は同時にJSのminify以外に、Sassのコンパイルをcompass経由で行うので、compassの構成をconfig.rbで指定しておく。
checkoutする前のブランチに戻る

```bash
$ git branch
  develop
* master
```

の状態で、

```bash
$ git checkout develop
Switched to branch 'develop'
```

となりますが、

```bash
$ git checkout -
Switched to branch 'master'
```

とするとブランチを切り替える前のブランチに切り替えられます。
gitやgithubでしくじって嫌な汗をかいたらここをみる

gitでアレを元に戻す108の方法(TIM 技術ブログ)
http://labs.timedia.co.jp/2011/08/git-undo-999.html

なおこの会社にはMercurialマスターだったtroterさんもいました。
セカコミもいます。
AndroidStudioで生成したAPKをDeveloperConsoleにアップ出来ないケース

AndroidStudioでは、BuildメニューからGenerate Signed APKを選択すると、署名付きAPKファイルを生成出来ます。
生成されたAPKファイルをDeveloper Consoleにアップロードすれば、公開用アプリとして登録されるはずです。

しかしアップロード完了後、Developer Consoleに以下のようなエラーが表示され、アップロードに失敗しました。

> アップロードできませんでした
> デバッグ可能な APK をアップロードしました。セキュリティ上の理由により、Google Play に公開するにはデバッグを無効にする必要があります。デバッグ可能な APK の詳細をご確認ください。

下記のブログで、同じケースのことが書かれており、解決出来ました。
[「デバッグ可能なAPKをアップロードしました。」などどと言い始めた Google Play Developer Console（新! #android ファッション通信 Σ(＾A＾；)）](http://android.benigumo.com/20131115/%E3%80%8C%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E5%8F%AF%E8%83%BD%E3%81%AAapk%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E3%80%8D/)

## 解決方法

1. AndroidManifest.xml ファイルに _android:debuggable="false"_ を追記する
2. AndroidStudio の Build Variants を release にしてから APK を生成する

### AndroidManifest.xml ファイルに _android:debuggable="false"_ を追記する

`<application>` タグを以下のように修正します。

```xml:AndroidManifest.xml
    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@string/AppTheme"
            android:debuggable="false"
            >
        ....
    </application>
```

### AndroidStudio の Build Variants を release にしてから APK を生成する

AndroidStudioのTool Windowsメニューから、Build Variantsを選択します。
するとソースツリーの下あたりに、Build Variantsウィンドウが出現します。そこでBuild Variantの設定がDebugになっている場合は、Releaseに切り替えます。

## まとめ

上記2つの方法であれば、どちらでもDeveloper Consoleへ登録可能なAPKが生成出来ました。
ただし、AndroidStudioを使う上では2番目のBuild Variantsを切り替える方法が、正しいのだと思います。

理由は、BuildツールとしてGradleを採用しているからです。
GradleでBuildする最大のメリットとして、1つのプロジェクトから複数バージョンのAPKを生成することが出来ます。デフォルトのBuild Variantsには、DebugとReleaseしかありませんが、それ以外にも自由に追加可能なため、生成したいAPKに合わせてBuild Variantsを都度切り替えるやり方が、本来の使い方のようです。

このへんのBuild Variantsについては、下記ブログがすごく参考になります。
[Build Variants によって別バージョンの Android アプリを同じプロジェクトからビルドする (Gradle 使用)（ひだまりソケットは壊れない）](http://vividcode.hatenablog.com/entry/android-app/build-variants)
twigだけでカレンダーを作る

twigの標準関数/フィルタだけでカレンダーが作れたのでメモ

```yourtemplate.html.twig
{% import 'calendar.html.twig' as cal %}
今月のカレンダー
{{ cal.calendar() }}
翌月のカレンダー
{{ cal.calendar('next month') }}
```

```calendar.html.twig
{% macro calendar(monthOffset) %}
{% set day = date('first day of this month') %}
{% if monthOffset %}
{% set day = day|date_modify(monthOffset) %}
{% endif %}
{% set month = day|date('n') %}
{% set year = day|date('Y') %}
{% set day = day|date_modify('-' ~ day|date('w') ~ 'days') %}
{{ year }}年{{ month }}月
<table>
<tr>
<td>日</td>
<td>月</td>
<td>火</td>
<td>水</td>
<td>木</td>
<td>金</td>
<td>土</td>
</tr>
{% for i in (0..5) %}
<tr>
{% for j in (0..6) %}
{% if day|date('n') == month %}
<td><a href="{{ path('route_name') }}?d={{ day|date('Y/m/d')|e('url') }}">{{ day|date('j') }}</a></td>
{% else %}
<td>&nbsp;</td>
{% endif %}
{% set day = day|date_modify('+1day') %}
{% endfor %}
</tr>
{% endfor %}
</table>
{% endmacro %}
```
vim7.4をgitのコミットエディタに指定してコミットするとエラーが起こる

vimをcore.editorに指定して`git commit`すると、以下のようなエラーが発生する。

```
"COMMIT_EDITMSG" [変換済] 10L, 329C
/usr/local/vim74/share/vim/vim74/syntax/diff.vim の処理中にエラーが検出されました:
行   65:
E401: パターン区切りが見つかりません: "^\\ Δεν υπάρχει χαρακτήρας νέας γραμμής στο τέλος του αρχείου"
E475: 無効な引数です: diffNoEOL^I"^\\ Δεν υπάρχει χαρακτήρας νέας γραμμής στο τέλος του αρχείου"
```

このエラーが出てもEnter押せば通常通りコミットできるのだが、気持ち悪い。

`/usr/local/vim74/share/vim/vim74/syntax/diff.vim`を見てみると、20行目から321行目のロケール関連の設定があやしい。先頭の英語と中段のja、ja DiffUtils 3.3だけ残してあとはコメントアウトしたらエラーが発生しなくなった。

なぜ`syntax/diff.vim`が処理されたのかよくわからないが、ひとまず。
NUnit実行時における設定ファイルの場所

NUnitからテスト対象のアプリケーションを起動した場合と、アプリケーションを直接起動した場合で、アプリケーションの設定ファイルの場所が変わるようです。
いくつか動作確認を行い、設定ファイルの場所を確認しましたので、メモしておきます。

#前提
次の環境で動作確認を行いました。
* Windows 7 64bit
* NUnit 2.6.2（GUI版）
* テストケースとテスト対象アプリケーションは、.NET Framework 4.5で作成。

#設定ファイル配置場所

##１．NUnitのデフォルト設定の場合
※Process Model=Default、Configuration File Name=未設定

**アプリケーションスコープの設定ファイル**
ディレクトリは、NUnit Test Projectファイルと同じディレクトリでした。
ファイル名は、NUnit Test Projectファイルの拡張子を「.nunit」→「.config」に変更した名前でした。

（例）
>NUnit Test Projectファイルが、「D:\CSharp.NET\ConfigPath\ConfigPath.nunit」の場合は、
>設定ファイルは、「D:\CSharp.NET\ConfigPath\ConfigPath.config」。

**ユーザースコープの設定ファイル**
ディレクトリは、「C:\Users\＜ユーザー名＞\AppData\Local\NUnit.org\test-domain-＜NUnit Test Project名＞.＜任意文字列＞\＜NUnitのバージョン＞」
ファイル名は、「user.config」でした。
ここで、「＜ユーザ名＞」は自分のWindowsユーザー名、「＜NUnit Test Project名＞」はNUnit Test Projectファイルの拡張子「.nunit」を除いた名前、「＜任意文字列＞」はよくわからない40桁ぐらいの文字列、「＜NUnitのバージョン＞」はNUnitのバージョンです。

（例）
>NUnit Test Projectファイルが、「D:\CSharp.NET\ConfigPath\ConfigPath.nunit」の場合は、
>設定ファイルは、「C:\Users\hoge\AppData\Local\NUnit.org\test-domain-ConfigPath.nu_Url_iln2w0o04cny0ph5drhsaep5ehwhqe5q\2.6.2.12296\user.config」。

##２．NUnitの設定がProcess Model=Multipleの場合
※Process Model=Multiple、Configuration File Name=未設定

**アプリケーションスコープの設定ファイル**
ディレクトリは、テストケースのDLLと同じディレクトリでした。
ファイル名は、テストケースのDLLの拡張子を「.dll」→「.dll.config」に変更した名前でした。

（例）
>NUnit Test Projectファイルが、「D:\CSharp.NET\ConfigPath\ConfigPathTest\ConfigPathTest.dll」の場合は、
>設定ファイルは、「D:\CSharp.NET\ConfigPath\ConfigPathTest\ConfigPathTest.dll.config」。

**ユーザースコープの設定ファイル**
ディレクトリは、「C:\Users\＜ユーザー名＞\AppData\Local\NUnit.org\test-domain-＜テストケースDLL名＞.＜任意文字列＞\＜NUnitのバージョン＞」
ファイル名は、「user.config」でした。
ここで、「＜テストケースDLL名＞」はテストケースのDLLの拡張子を「.dll」→「.dll.config」に変更した名前です。

（例）
>NUnit Test Projectファイルが、「D:\CSharp.NET\ConfigPath\ConfigPathTest\ConfigPathTest.dll」の場合は、
>設定ファイルは、「C:\Users\hoge\AppData\Local\NUnit.org\test-domain-ConfigPathTest.nu_Url_iln2w0o04cny0ph5drhsaep5ehwhqe5q\2.6.2.12296\user.config」。

##補足
ユーザースコープの設定を読み込む場合、ユーザーの設定ファイルが存在しないと、アプリケーションスコープの設定ファイルを読み込みます。
NUnitの設定で、「Configuration File Name」が設定されている場合は、その設定に従って設定ファイルを探すようになりそうです。
NUnitの設定で、Process Modelを「Separate」にした場合、設定ファイルの場所は、Process Modelが「Default」の場合と同じ場所になりそうです。Process Modelが「Single」の場合は未確認です。
NUnitをコンソールアプリケーションとして起動した場合の動作は未確認です。
Toggle between first non-whitespace char and beginning of the line in sublime text

This article is translated from [Japanese](http://qiita.com/Qureana/items/a6183b6ec7bdce0aaf01).

In Sublime Text2 cursor move to the beginning of the line when you press `C-a`.
But I want to toggle between the first non-whitespace character and the beginning of the line.Like this:

1. Move to the first non-whitespace character on the line.
2. Move to beginning of the line.
3. Back to the first non-whitespace character on the line.
Same as above.

I’m using the following settings:

```json

{ "keys": ["ctrl+a"], "command": "move_to", "args": { "to": "bol", "extend": false} }

```

# Reference
http://kataok.hatenablog.com/entry/2012/11/26/172858
rbenv を使って ruby をインストールする(CentOS編)


## 1. git が入っていなかったらインストール

```bash
$ sudo yum -y install git
```

## 2. rbenv をインストール（clone）する

```bash
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

## 3. 環境設定

```bash
# PATH に追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
$ exec $SHELL -l
```

## 4. rbenvの確認

```bash
$ rbenv --version
rbenv 0.4.0-74-g95a039a
```

## 5. ruby-build を インストール（clone）する

```bash
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## 6. ruby の最新版を確認

install -- list でインストール可能なバージョン一覧が出力される

```bash
$ rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
   :
   :
  2.0.0-p195
  2.0.0-p247
  2.0.0-p353       ←　こいつが2.0系の最新版っぽい      
  2.0.0-preview1
  :
```

## 7. ruby のインストール

先ほど調べたバージョンを指定する

```bash
$ rbenv install -v 2.0.0-p353
```

## 8. 環境確認

再読み込み

```bash
$ rbenv rehash
```

インストールされているruby一覧を確認

```bash
$ rbenv versions
* system (set by /home/vagrant/.rbenv/version)
  2.0.0-p353
```

先ほどインストールした最新版に設定

```bash
$ rbenv global 2.0.0-p353
```

確認

```bash
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
```

おしまい。
proxyの環境でgithubを使う


proxyでGitHubに接続する方法です。
(corkscrewを使う方法しか知らなかったのですが、ncを使う方法も教えてもらったのでupdateします。)


## corkscrewを使う場合
### githubにsshの公開鍵の登録をする
### corkscrewを取得

```bash:Ubuntuの場合
$ sudo apt-get install corkscrew 
```

### `~/.ssh/config`に以下を書き加える

```:~/.ssh/config
Host github.com 
    HostName ssh.github.com 
    port 443
    ProxyCommand corkscrew (Proxyのアドレス) (ポート番号) %h %p
```

### sshで接続できるか確かめる

```bash
$ ssh -T git@github.com
```

## ncを使う場合

UbuntuやMacは最初からncが入っているはずです。

### githubにsshの公開鍵の登録をする
### `~/.ssh/config`に以下を書き加える

```:~/.ssh/config
Host github.com 
    HostName ssh.github.com 
    port 443
     ProxyCommand nc -X connect -x (Proxyのアドレス):(ポート番号) %h %p
```

### sshで接続できるか確かめる

```bash
$ ssh -T git@github.com
```
ワーキングディレクトリでの変更を元に戻す

エディタ閉じてしまった時とかに便利。
ちなみにここでいう元に戻すは直近のコミット時のものに戻すという意味。

```bash
$ git checkout HEAD index.html
```

ちなみにHEADは最新のコミットなので、さらに一つ前のコミットの場合はHEAD^のように^を増やしていく感じ。