OmniAICreator/Qiita-1.07M huggingface dataset:
ListViewを継承してonTouchEventを実装するとNullPointerException(Android 2.3以前)になるので回避策でgetChildCount使う実装

```java:HogeListView.java
public class HogeListView extends ListView {
 
    public HogeListView(Context context) {
        super(context);
    }
 
    public HogeListView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
 
    public HogeListView(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_MOVE:
            // task
            break;
        default:
            break;
        }
 
        if (getChildCount() == 0) {
            return false;
        }
 
        return super.onTouchEvent(ev);
    }
}
```

参考
http://stackoverflow.com/questions/12473625/nullpointerexception-at-android-widget-abslistview-contentfitsabslistview-java
Togglable な option を便利にする

本記事は [Vim Advent Calendar 2013](http://atnd.org/events/45072) の 135 日目です。
134 日目は @tyru さんによる、[Vimでコマンドライン履歴を消す方法](http://d.hatena.ne.jp/tyru/20140413/delete_entire_command_line_history) でした。

解説
====

Vim の一部のオプションは bang することで toggle できるようになっています。

```vim:
" ! (bang) で toggle。
" これだけ vimrc に書いても役に立ちません。
setl number!
setl wrap!
```

これを

```vim:
" ? は現在の option 設定の表示。
" toggle 後の設定を表示する。
setl number! number?
setl wrap! wrap?
```

こうして

```vim:
command! Numbertoggle setl number! number?
command! Wraptoggle setl wrap! wrap?
```

コマンド化したり

```vim:
nnoremap <F2> :<C-u>Numbertoggle<CR>
nnoremap <F3> :<C-u>Wraptoggle<CR>
```

map しておくと便利です。[F キーの F は不浄の F](http://lingr.com/room/vim/archives/2012/07/21#message-10858481)です。

以上
====

Vim Advent Calendar 2013 135 日目の記事でした、次回 136 日目は @manga_osyo さんの[Vim script で関数のデフォルト引数を設定したい](http://d.hatena.ne.jp/osyo-manga/20140415/1397571244)でした。
[ I need help ] Google Analytics api のプロフィール情報を取得したい

## やりたいこと

[Google Analytics Query Explorer](http://ga-dev-tools.appspot.com/explorer/)で実装されているような、ユーザ認証してプロフィール情報を取得すること。

## デモ
・サイトアクセスした状態からスタートします。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/34636/b4ff9698-06c9-cc89-a7da-a172efdc5738.jpeg)

・Authrorize Access をクリック
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/34636/1f2d3b51-23b8-2682-dd0a-e84951320705.jpeg)

・必要情報を入力して、ログインボタンをクリック
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/34636/bc4d616b-1168-4108-3b47-b3952c5e5e21.jpeg)

・アカウント情報と、ビューのIDが選択されています。
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/34636/96de551a-4c37-69bc-830c-94c6206bb6be.jpeg)


Authrorize　ボタンをクリック⇒認証ウインドウを出して情報入力、ログイン⇒プロフィール情報取得　までの流れを自サービス向けに実装したいのです。

## というわけで
**どなたか御存知の方、いらっしゃいませんか？**
botoでインスタンス名に任意のプレフィックスを持つEC2インスタンスの情報を取得する


# botoって??
AWSを操作するPython用のSDKのことだそうな。（Python以外のSDKにもコードネームほしい

http://aws.amazon.com/jp/sdkforpython/


# 準備
## インストール

pipコマンドで入れるのが楽そうです

```bash
$ sudo yum install python-pip
$ sudo pip install boto
```

## 認証情報(AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEY)の設定

コードにベタ書きはしたくないので設定ファイルに定義する。
どうやら、「/etc/boto.cfg」、「~/.boto」の順に探すみたいで、今回はユーザ毎にしておきたいので、~/.botoに以下のフォーマットに従って定義する

```bash
[Credentials]
aws_access_key_id = <your access key>
aws_secret_access_key = <your secret key>
```

https://code.google.com/p/boto/wiki/BotoConfig

### 番外：これでハマりました。。。
ドキュメントには見当たらなかったのですが、botoの実装みると、環境変数に"AWS_CREDENTIAL_FILE"が定義されているか確認して、定義されていればそちらの設定を優先するロジックになっています。

https://github.com/boto/boto/blob/b9dbaad430fc35160d86fb921c4c1f75d66b6ddf/boto/pyami/config.py#L66-L77

当初botoのimportでConfigPaserクラスでエラーが出て「え???」となってしまったのですが、
AWS_CREDENTIAL_FILEに設定されていたファイルのヘッダー(1行目)に、「==========」という文字列が含まれていることが原因でした。あまり同じエラーで悩む人はいないと思いますが、参考までに。（そもそもなぜにそんなヘッダーになっていたのか謎。。

# 実装してみる
```python
import boto
import boto.ec2
from boto.ec2.connection import EC2Connection
from boto.ec2.regioninfo import RegionInfo
import re

def get_ec2_instances(region_end_point, re_pt):
    region = RegionInfo(endpoint = region_end_point)
    ec2_connection = boto.ec2.connection.EC2Connection(region = region)

    result = []
    instances = [i for r in ec2_connection.get_all_instances() for i in r.instances]
    for i in instances:
        if re_pt.match(i.tags['Name']):
            result.append(i)

    return result

if __name__ == "__main__":
    re_pt = re.compile('production')
    ec2_instance_list = get_ec2_instances('ec2.ap-northeast-1.amazonaws.com', re_pt)

    print(ec2_instance_list)

```

これで東京リージョンから"production"というプレフィックスをインスタンス名とするEC2のインスタンス情報を取得できました。

# 所感など
* Python始めて書いたけど、慣れてくると気持ちいいかもしれない。
* インデントが強制されることで、フォーマットが統一できるのはいいですね。（ツールやルールでの強制は破れてしまう可能性があるしめんどうなので。。）
* もっとスマートな書き方があればどなたか教えてください。
第一引数にエラーが渡されるコールバック関数からエラー処理を退避させる

##### はじめに
この記事はコールバック地獄からの脱却を狙った記事ではありません

# if (err) return onError(err) と書くのは不毛に感じる
nodejsライクなコールバック関数（第一引数にエラーを取る関数）を引数として取る関数（parse）を書いたとする。そして実際に parse を使うコードをこんな感じで書いたとする

```js:ex01.js
function onError (err) { console.log(err.stack || err.toString()) }

var reg = /[0-9a-zA-Z._\-]+@[0-9a-zA-Z._\-]+?\.org/g
var x = new XMLHttpRequest
x.addEventListener('load', function () {
    parse(x.responseText, reg, function (err, list) {
        if (err) return onError(err)

        // 正常なケースの処理
        some_works(list)
    })
})
```

なんというか、、、parse関数の中で例外処理を別の関数（onError）に渡すというのを明示的に書いているのが面倒くさいというか、何を無駄なことやっているんだろう？　という気になる。特にネストが深くなればなるほど無駄感がひどい！

nodejsの世界だと[Domain#intercept](http://nodejs.org/api/domain.html) でエラー処理の部分と正常なケースの処理の部分を分離することができるのでそれを真似てみる

```js:ex02.js
var d = new Domain

d.onError = function (err) { console.log(err.stack || err.toString()) }

var reg = /[0-9a-zA-Z._\-]+@[0-9a-zA-Z._\-]+?\.org/g
var x = new XMLHttpRequest
x.addEventListener('load', function () {
    parse(x.responseText, reg, d.intercept(function (list) {
        // 正常なケースの処理
        some_works(list)
    }))
})
```

もし、parse関数が例外を投げた場合、d.onError に例外が渡されて、d.interceptでラップされたコールバック関数にはエラーが届かない。（parse関数は ex01 も ex02 も同じ）

これだけでも正常ケースな処理の道筋からエラー処理の分岐が消えるので見通しがよくなるので嬉しい。

##### 最後に
nodejs以外でDomain機構を持つライブラリーがあるのか知らないので、お勧めのライブラリー、その他の方法があったら教えてください

---

```js:domain.js
;(function (global) {
    'use strict'

    var isBrowser = !! global.self
    var isWorker  = !! global.WorkerLocation
    var isNodeJS  = !! global.global

    function Domain () {}

    Domain.prototype.intercept = function (cb, she) {
        var me = this

        return function () {
            var args = [].slice.apply(arguments)
            var err  = args.shift()

            err ? (typeof me.onError === 'function' && me.onError(err))
                : cb.apply(she, args)
        }
    }

    if (isNodeJS) {
        module.exports = Domain
    } else {
        global.Domain = Domain
    }
})(this.self || global)
```

```js:parse.js
// 文字列から正規表現にマッチしたリストを第２引数に渡す: 正常な値として
// マッチしない場合はエラーを第１引数に渡す: エラーケースとして
function parse (str, reg, cb) {
    var res, list = []
    try {
        while (res = reg.exec(str)) {
            list.push(res)
        }
    } catch (err) { return cb(err) }

    if (list.length === 0) {
        return cb(new Error('string did not match regular.'))
    }
    
    cb(null, list)
}
```
住所または郵便番号から緯度経度を取得する関数

GoogleMapsAPIに住所を渡すと各種情報をXML形式で返してくれるのを利用して、住所から緯度経度を配列で返す関数を作成

```php
function get_gps_from_address( $address='' ){
	$res = array();
	$req = 'http://maps.google.com/maps/api/geocode/xml';
	$req .= '?address='.urlencode($address);
	$req .= '&sensor=false';	
	$xml = simplexml_load_file($req) or die('XML parsing error');
	if ($xml->status == 'OK') {
		$location = $xml->result->geometry->location;
		$res['lat'] = (string)$location->lat[0];
		$res['lng'] = (string)$location->lng[0];
	}
	return $res;
}
```


```php
$latlng = get_gps_from_address('東京都');
print_r($latlng);

//実行結果
/*
Array
(
    [lat] => 35.6894875
    [lng] => 139.6917064
)
*/
```
MacのPostgreSQLでパスワードを再設定


設定ファイルのmd5をtrustに変えてパスワードを無効にする

```
$ sudo vim /Library/PostgreSQL/9.3/data/pg_hba.conf
- local   all             all                                     md5
+ local   all             all                                     trust
```

設定ファイルを再起動

```
$ sudo -u postgres ./bin/pg_ctl restart -D/Library/PostgreSQL/9.3/data
```

パスワードなしでログインできるようになるので、パスワードを再設定

```
$ psql -U postgres -p 5433
postgres=# ALTER USER postgres WITH ENCRYPTED PASSWORD 'admin';
postgres=# \q
```

設定ファイルのパワードを有効にする

```
$ sudo vim /Library/PostgreSQL/9.3/data/pg_hba.conf
- local   all             all                                     trust
+ local   all             all                                     md5
```

設定ファイルを再起動

```
$ sudo -u postgres ./bin/pg_ctl restart -D/Library/PostgreSQL/9.3/data
```
PowerShell にて実行ポリシーを `Get-ExecutionPolicy -list` で一覧して、自分の権限などにおいてスクリプトの実行許可があるか確認する方法 


[![LGTM](http://www.lgtm.in/p/owEgXANns)](http://www.lgtm.in/i/owEgXANns)

[:+1:](http://www.lgtm.in/u/owEgXANns) [:-1:](http://www.lgtm.in/r/owEgXANns)

取り急ぎ用件のみにて失礼いたします。

# 参考リンク

[Get\-ExecutionPolicy](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-executionpolicy?view=powershell-6)
clojure.walkでシーケンスを再帰的に変更する

clojure.walkネームスペースにある関数を使うとシーケンスを再帰的にたどって変更することができます。

ぱっと見て目につく関数は`walk`ですが、これは主に内部で使うもので直接使うことはあまりなさそうです。

最も使いそうなのは`postwalk`です。

```clj
user=> (require '[clojure.walk :as w])
user=> (w/postwalk vector '(1 (2)))
[([1] [([2])])]
user=> (w/postwalk #(if (number? %) (- %) %) [2 [3] 4])
[-2 [-3] -4]
```

シーケンスの中の値とシーケンス自身に対して再帰的に関数を適用しているのがわかります。

`postwalk`と似たような関数として`prewalk`があります。
違いは`postwalk`が子ノードから順に関数適用するのに対し、`prewalk`は親ノードから順に関数適用します。
なお、どちらも深さ優先でノードをたどります。

```clj
user=> (w/prewalk #(if (number? %) (- %) %) [2 [3] 4])
[-2 [-3] -4]
user=> (w/prewalk vector '(1 (2)))

StackOverflowError   clojure.lang.RT.boundedLength (RT.java:1654)
```

この例のように`prewalk`でシーケンスをさらに囲うような処理をするとStackOverflowErrorになるので注意が必要です。

他に、どのようにシーケンスをたどるか表示する`postwalk-demo`と`prewalk-demo`があります。


```clj
user=> (w/postwalk-demo  '(1 (2) 3))
Walked: 1
Walked: 2
Walked: (2)
Walked: 3
Walked: (1 (2) 3)
(1 (2) 3)
user=> (w/prewalk-demo  '(1 (2) 3))
Walked: (1 (2) 3)
Walked: 1
Walked: (2)
Walked: 2
Walked: 3
(1 (2) 3)
```

マップやセットの中もちゃんとたどってくれます。

```clj
user=> (w/postwalk-demo  '(1 {:a [:b #{:c}]} 3))
Walked: 1
Walked: :a
Walked: :b
Walked: :c
Walked: #{:c}
Walked: [:b #{:c}]
Walked: [:a [:b #{:c}]]
Walked: {:a [:b #{:c}]}
Walked: 3
Walked: (1 {:a [:b #{:c}]} 3)
(1 {:a [:b #{:c}]} 3)
```
Yesodのmodelで好きな型をフィールドの型に使えるようにしたい

　[Yesod](https://hackage.haskell.org/package/yesod)では[Persistent](http://hackage.haskell.org/package/persistent)と言うORMを使って気軽にモデルを定義し、そして使用することが出来ます、しかも型安全に、です。
　[Yesod](https://hackage.haskell.org/package/yesod)ではmodelの定義はconfig/modelsと言うファイルに書くのがお決まりですが、さて、ココで「自分の定義した型をモデルに使いたい」と言う時に少しハマったのでメモります。
　まず、Model.hsファイルに定義した型の書いてあるパッケージを`import`します。ここで例えば`Data.DateTime`などだと事前にYesod側で定義してくれているのかスムーズに使えるのですが、完全なる自前の型を使いたいという時に「これは使えない型だよ、適切に型クラスの`instance`にしてね」とエラーが出ます。
　その型クラスと言うのは[`PersistField`](https://hackage.haskell.org/package/persistent-1.3.0.5/docs/Database-Persist-Class.html#t:PersistField)なのですが、これの`instance`を手で書くのは手間です、いや、そんなに手間でもないっぽいですけど、やっぱり手間です。
　と言う需要のための便利機能がもちろんあって、それは[`derivePersistField`](https://hackage.haskell.org/package/persistent-template-1.3.1.3/docs/Database-Persist-TH.html#v:derivePersistField)です。
　よしじゃあ早速これを使って

```Model.hs
--いろいろ
import UserModule ( UserDefineType )
derivePersistField "UserDefineType"
--いろいろ
```

　としてやれば……あれ？　なんかエラーが出ますね……。
　どうやらModel.hs内で[`derivePersistField`](https://hackage.haskell.org/package/persistent-template-1.3.1.3/docs/Database-Persist-TH.html#v:derivePersistField)を使うとエラーになるようです。
　じゃあどないすりゃええねん！　と奮闘した結果、以下のようになりました

```Helper.hs
module Helper where
    import Database.Persist.TH
    import UserModule ( UserDefineType )
    derivePersistField "UserDefineType"
```

```Model.hs
--色々
import UserModule ( UserDefineType )
import Helper ( )
--色々
```

　こうしてやれば良いようです、要するに

* Model.hs内に[`derivePersistField`](https://hackage.haskell.org/package/persistent-template-1.3.1.3/docs/Database-Persist-TH.html#v:derivePersistField)を直接書かず、別のファイルに[`derivePersistField`](https://hackage.haskell.org/package/persistent-template-1.3.1.3/docs/Database-Persist-TH.html#v:derivePersistField)を書いてそれを`import`しろ

　ということのようです
　なおこれはこれで警告が出るのですが、まあ、仕方がないね。
　何でこんな仕様なんだろう、と思いつつ、まあ、仕方が無い感じなので、皆さんコケたらこうやって対処しましょう、無駄なファイルと`import`が増えるようですが仕方が無いです。

　読んでいただきありがとうございました、では。
Lubuntu で無線LANのインディケータをパネルに表示する方法

`do-release-upgrade` して 13.10 から 14.04LTS にアップグレードしたら、

![scr-panel.png](https://qiita-image-store.s3.amazonaws.com/0/35880/753e4aa7-5ab4-2a22-57e4-a896ef2e58b5.png)

このパネル上の無線LAN表示が消えてしまった。

そこで、`>設定>LXSessionのデフォルトのアプリケーション` （lxsession-default-apps）の `Aurostart` タブの `Manual autostarted applications` に `nm-applet` を追加することで復活した。

![scr-autostart.png](https://qiita-image-store.s3.amazonaws.com/0/35880/1437c4f9-717d-1bc7-e26d-f85ea9e7ad3c.png)

因みに `Core applications` タブで `Network GUI` に `nm-applet` を設定し `Reload` することでも復活するが、なぜか再起動すると無効になってしまうため、`Aurostart` に設定することをオススメする。

![scr-nmapplet.png](https://qiita-image-store.s3.amazonaws.com/0/35880/dab5e1b9-21e3-4c2c-28d2-6042f14182ea.png)
AngularJSのngRepeatの特殊なプロパティ

([The Special Properties of ngRepeat In AngularJS][元記事] の訳)


今日のネタはAngularJSのドキュメントから直接持ってきましたが、わずかな方々はそのトピックを見落としていることを知っています。

ngRepeatディレクティブ内で特殊なプロパティ(\$firstや\$lastそして\$middle)が利用できます。これらのプロパティはboolean値(\$firstなら最初の要素に対してだけtrueになるなど)が格納されていて、そして、利用できる2つのさらなる特殊なプロパティは\$evenと\$oddです。

そのほかの便利プロパティは\$indexプロパティで、繰り返す要素の各オフセット値を含んでいて0から始まります(全く良いオフセットのように(?))

次の通りのマークアップを[このPlunkerでのライブ](http://plnkr.co/edit/DMGPMTYyKh0TrOjV4CcF?p=preview)で表示できます。そのコードは要素が最初と最後に位置するときに\$firstと\$lastを使って、クリッカブルのupとdownプロンプトを表示することを避けるのに使っています。マークアップでもまたクリックされた要素のオフセットを補足するために\$indexを利用しています。

```html
<table>
    <tr ng-repeat="item in items">
        <td>{{item.title}}</td>
        <td><span ng-show="!$first" ng-click="moveUp($index)">up</span></td>
        <td><span ng-show="!$last" ng-click="moveDown($index)">down</span></td>
    </tr>
</table>
```

次のコントローラと結び付け、矢印に対してクリックすることによってリストの要素を上へ下へ移動できます。

```js
module.controller("mainController", function($scope){
    $scope.items = [
        { title: "Item 1" },
        { title: "Item 2" },
        { title: "Item 3" },
        { title: "Item 4" },
        { title: "Item 5" },
    ];
 
    var move = function (origin, destination) {
        var temp = $scope.items[destination];
        $scope.items[destination] = $scope.items[origin];
        $scope.items[origin] = temp;
    };
 
    $scope.moveUp = function(index){            
        move(index, index - 1);
    };
 
    $scope.moveDown = function(index){                    
        move(index, index + 1);
    };
 
});
```



[元記事]: http://odetocode.com/blogs/scott/archive/2014/04/17/the-special-properties-of-ngrepeat-in-angularjs.aspx
Chromium で Flash Player が使えなくなる件の対処法

Ubuntu を 14.04LTS にアップデートすると、Chromium も バージョン 34.0.1847.116 Ubuntu 14.04 aura になりました。そこで、YouTubeを開いてみると以下のような状態に（一部そのまま見れる動画もあります）。

![scr-flashprobem.png](https://qiita-image-store.s3.amazonaws.com/0/35880/75d4d949-5218-c8c6-3489-0e83422dee28.png)

これは Chrome/ium が Adobe Flash の使っている Netscape Plugin API の提供を打ち切るためです。代わりに、Pepper Plugin API というものを提供し始めるのですが、それに対応した Adobe Flash のプラグイン Pepper Flash Player Plugin を利用するには２つの方法があります。

注：2016年5月現在、32bitのPCではこのどちらの方法も使うことができません。諦めて下さい。詳しくは[Chrome Linux 32bit版の後始末とFlash問題 - ぷちてく](http://ptech.g.hatena.ne.jp/noromanba/20160303/1457046725)をお読み下さい。

## 1. Google Chrome ブラウザに乗り換える

特にこだわりのない人は、[Google Chrome ブラウザ](https://www.google.com/intl/ja/chrome/browser/?hl=ja&platform=linux&brand=CHFK)をインストールして乗り換えるという方法があります。Chrome は初めから Pepper Flash Player Plugin をバンドルしてくれているので、別途インストールやバージョンアップをする手間はありません。

## 2. Pepper Flash Player Plugin を別途入手して Chromium にインストールする

```bash
sudo apt-get install pepperflashplugin-nonfree
sudo update-pepperflashplugin-nonfree --install
```

1行目で Ubuntu のパッケージとしてインストール、2行目で chromium にインストールしています。2行目を変更すると Google Chrome の Unstable バージョンにインストールしたりもできます。

参考：[Pepper Flash Player Installer For Chromium Available In The Ubuntu 14.04 Repositories ~ Web Upd8: Ubuntu / Linux blog](http://www.webupd8.org/2014/01/pepper-flash-player-installer-for.html)

（14.04 より前のバージョンをお使いの場合はこの方法は使えないので [Web Upd8 の過去の記事](http://www.webupd8.org/2013/04/install-pepper-flash-player-for.html) を参考にインストールして下さい。）

注意：`sudo apt-get upgrade`ではプラグインがアップデートされません。セキュリティを保つために、

```bash
sudo update-pepperflashplugin-nonfree --install
```

で定期的にアップデートしてください。現在インストールされているバージョンと最新バージョンは

```bash
sudo update-pepperflashplugin-nonfree --status
```
で確認することができます。

#### 2016/5/14 追記

こちらの方法でアップデートする際に

```bash
ERROR: failed to retrieve status information from google : 
W: 以下の鍵 ID に対して利用可能な公開鍵がありません: 1397BC53640DB551 More information might be available at:
http://wiki.debian.org/PepperFlashPlayer
```

というエラーが出ることがあります。これはGoogleのGPG公開鍵の期限が切れたことによるもので、再インポートによって解決します。

```bash:解決するためのコマンド
gpg --keyserver keyserver.ubuntu.com --recv-keys 1397BC53640DB551 && 
gpg --export --armor 1397BC53640DB551 
| sudo sh -c 'cat >> /usr/lib/pepperflashplugin-nonfree/pubkey-google.txt'
```

----

参考：[Use Chromium on Linux? Adobe Flash Will Stop Working From April | OMG! Ubuntu!](http://www.omgubuntu.co.uk/2014/01/chromium-npapi-flash-dropped-april-2014)
git push でリモートのサーバにリポジトリを作成する

流行っているようなので書いてみました。


## authorized_keys の設定

.ssh/authorized_keys に command を書いておきます

```
command="/home/hexa/git.sh" ssh-rsa AAAAB3...
```

スクリプトは下記の内容です

```bash:git.sh
#!/bin/bash

set -- $SSH_ORIGINAL_COMMAND
case $1 in
  git-receive-pack ) REPOSITORY_PATH=$( echo $2 | tr -d "'" )
                     [ ! -e $REPOSITORY_PATH ] && /usr/bin/git --bare init $REPOSITORY_PATH > /dev/null 2>&1
                     /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND" ;;
   git-upload-pack ) /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND" ;;
                "" ) bash ;;
                 * ) $SSH_ORIGINAL_COMMAND ;;
esac
```

## 確認

まだリポジトリが無いリモートのサーバへ、ローカルから git push します

```bash:
$ ssh hexa@192.168.1.8 'ls bare.git'
Enter passphrase for key '/Users/Hexa/.ssh/id_rsa':
ls: cannot access bare.git: No such file or directory

$ git push ssh://hexa@192.168.1.8:22/home/hexa/bare.git master
Enter passphrase for key '/Users/Hexa/.ssh/id_rsa':
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (9/9), 604 bytes, done.
Total 9 (delta 0), reused 0 (delta 0)
To ssh://hexa@192.168.1.8:22/home/hexa/bare.git
 * [new branch]      master -> master

$ ssh hexa@192.168.1.8 'ls bare.git'
Enter passphrase for key '/Users/Hexa/.ssh/id_rsa':
branches
config
description
HEAD
hooks
info
objects
refs
```

確認のため git clone もしてみます。

```bash
$ git clone ssh://hexa@192.168.1.8:22/home/hexa/bare.git
Cloning into 'bare'...
Enter passphrase for key '/Users/Hexa/.ssh/id_rsa':
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 9 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (9/9), done.
```
std::moveまとめ(link集)

c++11の主要なtopicであるムーブセマンティクスは非常に多くの方が解説されいます。
しかし初学者が一つの記事で理解できるようにはなっていないのが現状です。
そこで以下に順番に読むとわかりやすいリンクを挙げていきます。

## [Return value optimization : Wikipedia](http://en.wikipedia.org/wiki/Return_value_optimization)

先に知っておく方が良い基礎知識。
C++11は関係ありません。

```cpp
#include <iostream>
 
struct C {
  C() {}
  C(const C&) { std::cout << "A copy was made.\n"; }
};
 
C f() {
  return C();
}
 
int main() {
  std::cout << "Hello World!\n";
  C obj = f();
}
```

(Wikipediaより転載)の挙動に自信が無い人は必読です。
とはいえ最適化は標準規格ではないので、実行されるかどうかはコンパイラに依るし、
複雑なコードになれば最適化が阻害される可能性がある。

## [本当は怖くないムーブセマンティクス : yohhoyの日記（別館）](http://yohhoy.hatenablog.jp/entry/2012/12/15/120839)

[yohhoy](http://qiita.com/yohhoy)氏による記事です。
基本的な事を丁寧に解説してある、非常に良い記事です。
とりあえず`std::move`ってよくわからんって人は是非とも読みましょう。

本文中にある要約を転載します

> - 「ムーブセマンティクス」は昔からあるイディオムですが、C++11からはコンパイラもムーブセマンティクスを認識できるようになりました。
> - C++11標準ライブラリ提供のクラスは、「最適化されたコピー」または「所有権の移動」としてのムーブに対応しました。
> - コピー代入シンタックス `u = t` とムーブ代入シンタックス `u = std::move(t)` を区別し、用途に応じて使い分けましょう。
> - ムーブを利用するだけなら、「右辺値参照」を気にする必要はありません。関数の引数／戻り値では「値渡し」スタイルを使いましょう。

(転載ここまで)

## [C++0x 標準ライブラリ完全解説　〜 No.02 std::move, <utility> : 野良C++erの雑記帳](http://d.hatena.ne.jp/gintenlabo/20110116/1295195945)

[gintenlabo](http://d.hatena.ne.jp/gintenlabo)氏の記事。
こちらも同様に`std::move`の基本事項を説明しています。
ムーブの説明自体はyohhoyさんのものの方がわかりやすいと思いますが、
こちらでは具体的に必要な場面の説明が多数挙げられています。

## [参照渡し or 値渡し？ : yohhoyの日記](http://d.hatena.ne.jp/yohhoy/20120524/p1)

結局どうやって関数を書けばいいんだってばよ！？
という方向け。

本文中にある要約を転載します

> - C++03：通常は `const T&` でよい。ただしT型が小さくtrivialな場合は `T` の方が低コスト。（intなどの組込み型では`const int&`よりも単に`int`の方が低コスト。）
> - C++11：コピー操作よりも低コストなムーブ操作があり、かつ実引数が常にlvalueという使われ方でなければ、T による値渡しが有効。
> - C++11：const lvalue参照渡し（`const T&`）, rvalue参照渡し（`T&&`）の2種類をオーバーロード関数として提供すると、ムーブまたはコピー 1回 まで削減される。
> - 「常に値渡しを使うこと」や「値渡しは禁止」は共に正確でなく、関数インターフェイス設計の問題である。

(転載ここまで)

結局overloadするのが最強という結果になります

## [C++0x における NRVO : 野良C++erの雑記帳](http://d.hatena.ne.jp/gintenlabo/20110125/1295991902)

関数の戻り値でムーブを使う場合の注意事項。

> むしろ、ローカル変数 x の型が関数の戻り値の型と異なる場合や、
> x がローカル変数ではなく関数の引数だった場合、
> あるいは関数呼び出しを挟んで `return f(x);` と返す場合などは、
> 明示的に `move` しないと move されないので、
> そのような場合にうっかり move を忘れないように、
> 常に明示的に move するようにするのも、悪くない習慣だとは思います。

同じような記事として
[暗黙のmoveとNRVO : joynote break;](http://d.hatena.ne.jp/joynote/20110822/1314012953)があります。
(コメントしているのgintenlabo氏だけど)
NiftyのC4SAとローカル環境をGithubで繋いでみる

大学の授業の関係でNiftyさんのC4SAを使ってみました。

ワンクリックでアプリケーションの雛形を作ってくれる上に、ブラウザ上でエディタやらコマンドラインやら、怪しげなツールが使えておもしろい。
そしてサーバの環境構築でもたつかずに済むというのはいいですね。

でもローカルでも作業したいとなると、直接push/pullできないのがちょっと難点です。

なので、Github経由でC4SAとローカルを繋いでみることにしました。
今回はRailsアプリを例にやります。


##手順とか

* はじめに、C4SAでRailsアプリのCanvasを作る（今回は4.0選びました）細かな手順はC4SAのヘルプを参照
* Canvas一覧から、今しがた作ったものを選択。CLIだのファイルだのという項目の並んでいる画面に飛びます
* CLIを選択すると、コンソールがブラウザ上で立ち上がります

次に、色々必要なものをコンソールから入れたり作ったりします

### ssh-keygenして、~/.sshにprivate keyを入れる。githubにpublic keyを登録する。

```lang:c4sa-bash
$ ssh-keygen
```
ここではc4sa_rsaという名前でkeyを作ったとする

```lang:c4sa-bash
$ mv c4sa_rsa ~/.ssh/
```
あとは、c4sa_rsa.pubの中身をlessかなんかで覗いて、githubにコピペして登録。

### sshでgithubにクライアントの登録をする

```lang:/.ssh/config
Host github.com
 HostName github.com
 User git
 Port 22
 IdentityFile ~/.ssh/c4sa_rsa
 TCPKeepAlive yes
 IdentitiesOnly yes 
```

```lang:bash_c4sa
$ ssh github.com
```

### giboを入れて、楽々.gitignoreを作る
これ超重要。RailsみたいなWebアプリのフレームワークには.gitignoreが必要不可欠ですよね。手打ちで作るとかなりめんどくさいけど、giboがあると.gitignore作る手間がほっとんどありません。だいすき。

まずはインストールから。curlでソースから直接引っ張ってきます。
（変更：リンクが変わっていたので更新しました）

```lang:c4sa-bash
$ curl https://raw.githubusercontent.com/simonwhitaker/gibo/master/gibo > gibo
$ chmod +x gibo
$ mkdir ~/bin && mv gibo ~/bin/
$ echo export PATH=$PATH:$HOME/bin > ~/.bash_profile
$ source ~/.bash_profile
```

権限とかいろいろあるので、とりあえずhome直下にbinと.bash_profile作りました。これでgiboコマンドが使えるようになります。

giboの使い方は簡単。使っている開発環境の情報をgiboに引数として与えてあげると、.gitignoreに追加するべき項目を自動でもりもり生成してくれます。gibo -lで、指定できる環境一覧が見れます。

```lang:c4sa-bash
$ gibo Ruby Rails JetBrains SASS SublimeText > .gitignore
```
こんなかんじで、.gitignoreにそのままぶち込みます。

さて、これでC4SAがgitのクライアントになりました。ラストスパートです。


### githubでレポジトリを作り、C4SAでinitしてaddしてcommmitしてremote addしてpushする


```lang:c4sa-bash
$ git init
$ git add .
$ git commit -m "first"
$ git remote add origin git@github.com:UserName/RepositoryName.git
$ git push origin -u master
```

いつものですね。
「github初めて使います！」的な人には[こちら](https://help.github.com/articles/create-a-repo)

###ローカルにcloneする

```lang:local
$ git clone git@github.com:UserName/RepositoryName.git
```

完了。
これで、ローカルで作業しつつgithubに上げておき、ある程度進んだところでC4SAからpullして本番環境で動作確認...的なことができます。

余談ですが、C4SAのRailsはDBにmysqlを使っているので、ローカルにmysqlが入ってないとbundle installで引っかかります。ご注意を。

##感想
* VPSよりはお手軽で、Herokuよりめんどくさい。コンソール的な意味で。
* サーバを触ったことがない人がサービスを公開するには良さそう
* このエントリほとんどRails関係なかった
file-cacheのリストをクリアしてもanything / helmが追随してくれない


毎度毎度 Emacs の話しか投稿してない old type の hage ですw

anything / helm (今後このエントリではこれらを helm で代表させます) のfile-cache 情報源 (`anything-c-source-file-cache` / `helm-source-file-cache`) は最初に起動されたときに file-cache のリストから独自のリストを作ってそちらで管理しています。

helm は `file-cache-add-file` に関してはケアしていますが (file-cache にファイルが追加されたら helm のリストにも追加される)、`file-cache-clear-cache` に関してはノーケアです。

私は `file-cache-clear-cache` で一度リストをクリアして構築し直すことをよくやりますが、そうすると helm を開くと同じファイルがずらずらと並んだりします…。それまでの内容がクリアされずに同じファイル名が登録されるわけだから当然ですね。

しかしそれだと困るので `file-cache-clear-cache` をしたときに同時に helm が隠し持ってるリストもクリアするようにしました。ただ helm や anything の変数を直接いじっているのでバージョンがあがるとダメになる可能性があります。

```el:init.el
;; helm用
(defadvice file-cache-clear-cache (after helm-advice-file-cache-clear-cache activate)
  (setq helm-file-cache-initialized-p nil)
  (setq helm-file-cache-files nil))
;; anything用
(defadvice file-cache-clear-cache (after anything-advice-file-cache-clear-cache activate)
  (setq anything-c-file-cache-files nil))
```
【mac限定】ビジュアルモードでURLを選択して ctrl+o でブラウザを開く

.vimrcに以下を追記
```
vnoremap <C-o> y:!open<Space><C-r>"<CR><CR>
```

選択部分をyankしてopenコマンド実行しているだけですが

===
追記
- open-browser.vim というものがあってこれ使った方が良さそう
参考 : http://qiita.com/alpaca_taichou/items/056a4c42fe7a928973e6#3-3

※ カーソル下にあるURLを取得するのどうやってるんだろう...
osxへのnginxのインストール【nginx-fullに変更】


インストール

```lang:ターミナル
$ brew install nginx

```

起動したら


```lang:ターミナル
$ sudo nginx

```

こんなエラーが

```lang:ターミナル
dyld: Library not loaded: /usr/local/lib/libpcre.1.dylib
  Referenced from: /usr/local/bin/nginx
  Reason: image not found
```

これ

```lang:ターミナル
$ brew remove openssl
$ brew install openssl
```

完

・・・

sub_filterが使えなかったので nginxを削除して、nginx-fullをインストール

```lang:ターミナル
$ brew uninstall nginx

$ brew tap marcqualie/nginx
$ brew install nginx-full --with-sub

```

エラーが出ることもあるようです。下の　@yu-sa　のコメントを参考にしてください。 

```
Error: You must `brew link pcre' before marcqualie/nginx/nginx-full can be installed
```


完


## 参考にしたサイト

[Mac - homebrewでnginxを入れるときはnginx-fullを入れよう](http://kannokanno.hatenablog.com/entry/2014/02/10/134920)

[Install Nginx, PHP-FPM, MySQL and phpMyAdmin on OS X Mavericks using Homebrew](http://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew/)

[Installing Nginx in Mac OS X Maverick With Homebrew](https://coderwall.com/p/dgwwuq)


[Cannot open zsh shell as login](https://github.com/Homebrew/homebrew/issues/27106)
ファイルの中にある特定文字列を数える(Perl版)

[Python - ファイルの中にある特定文字列を数える - Qiita](http://qiita.com/kimihiro_n/items/09a1640858da6bcb14d9)
触発されて。

* pythonみたいにcountメソッドは無いのでsplitで代用。
* splitは分割数なので-1する。(マッチしない行でも1個の分割数)
* splitでなくて正規表現の置換した数でもできそうだが、遅そう。
* エラー処理は面倒だったので省略。
* ファイルを丸呑みできるなら

```pl:match_count.pl
#!/usr/bin/perl
use strict;
use warnings;

sub count_words
{
  my ($stream, $search_word) = @_;
  my $num = 0;
  while (<$stream>) {
    my $match_num = scalar (my @list = split /$search_word/, $_) - 1;
    $num += $match_num;
  }
  return $num;
}

sub main
{
  if (-t) {
    my ($file, $search_word) = @ARGV;
    open my $fh, "<", $file;
    print count_words($fh, $search_word) . "\n";
    close $fh;
  }
  else {
    my $stdin = "STDIN";
    my ($search_word) = @ARGV;
    print count_words($stdin, $search_word) . "\n";
  }
}

if ($0 eq __FILE__) {
  main();
}
```

```text:hoge.txt
hogefugapiyohogefugapiyo
hogehogehogehogehogehoge
```

```bash
$ chmod +x match_count.pl
$ ./match_count.pl hoge.txt hoge
8
$ cat hoge.txt | ./match_count.pl hoge
8
```
play-slickを使ってslick-joda-mapperのimportからRDBMS依存の記述をなくす

slick-joda-mapperはSlickでjoda-timeを使うときに型の変換をいい感じにしてくれる便利なライブラリなのですが一点だけ難点があります。
それはRDBMSのドライバーごとにimportが必要なところです。

```scala
import com.github.tototoshi.slick.H2JodaSupport._       // H2を使う場合
import com.github.tototoshi.slick.PostgresJodaSupport._ // Postgresを使う場合
import com.github.tototoshi.slick.MySQLJodaSupport._    // MySQLを使う場合
...
etc
```

ソースコード中に使用するドライバーを直がきしないといけなくなるため、特定のRDBMSに依存させたくないプロダクトをつくってるときに困ります。
それがplay-slickの仕組みを使うとこんな感じで書けるようになります。

```scala
object MyDriver extends slick.GenericJodaSupport(play.api.db.slick.Config.driver)
import MyDriver._
```

こんなふうに ``` play.api.db.slick.Config.driver ``` としてドライバーを持ってきてあげると
``` application.conf ```に書かれたドライバーの設定からいい感じに処理してくれます。

おそらくplay-slick使わずとも``` Play.Current ```から持ってくることもできると思いますがPlayでSlickをplay-slickなしで使うことも少ないでしょう。


最近、Play framework + AngularJS(with TypeScript)でリアルタイムコミュニケーションツールをちょこちょこ作ってて気付いた話でした。
https://github.com/phantomtype/Phantasm
counterclockwiseのショートカット


Eclipse+counterclockwiseでclojureをちょこちょこ書いているのだけれど、Cmd+Enter以外をあまり活用できてないので、憶えられ
てないものをまとめてみた。

slimvの,Wみたいな、「今のブロックを囲む括弧を追加」というショートカットってあるのかなあ。


## カーソル移動

#### ひとつ前のトップレベルS式の頭に移動
	Cmd + option + A
#### カーソルのあるブロックの括弧の次位置へ移動
	Cmd + option + P

	
* 開き括弧の次位置と閉じ括弧の次位置に順番に移動する
 

## 選択範囲を操作

#### 左側の要素を含むように選択範囲を拡張
	Cmd + Shift + ←

#### 右側の要素を含むように選択範囲を拡張

	Cmd + Shift + →

#### 選択要素を囲む括弧全体を含むように選択範囲を拡張
	Cmd + Shift + ↑
#### 選択範囲操作のアンドゥ
	 Cmd + Shift + ↓
#### 選択範囲を一つ親の括弧の要素にする
	 Option + R

![before-raise-selection.png](https://qiita-image-store.s3.amazonaws.com/0/27613/003f5f48-2664-f3bd-2184-73b036cf6332.png "before-raise-selection.png")

　↓
![after-raise-selection.png](https://qiita-image-store.s3.amazonaws.com/0/27613/7ccbbce6-c0d5-583b-8f8f-a3c76d6c7728.png "after-raise-selection.png")



## 括弧から出したり入れたり

#### 一番後ろの要素を括弧の外に追い出す(backward barf)
	 Cmd + 0 + B

![before.png](https://qiita-image-store.s3.amazonaws.com/0/27613/c44d33d2-4584-c012-c29e-3aca57732b66.png "before.png")

　↓
![after-back-barf.png](https://qiita-image-store.s3.amazonaws.com/0/27613/a3081b52-c6b1-c4a7-4619-ff23af49c33f.png "after-back-barf.png")


#### 括弧の右外にある要素を括弧の中に移す(backward slurp)
	Cmd + 0 + S

![after-back-barf.png](https://qiita-image-store.s3.amazonaws.com/0/27613/272bfe83-809b-d630-d5fe-7bb85dfc8408.png "after-back-barf.png")
　↓
![after-back-slurp.png](https://qiita-image-store.s3.amazonaws.com/0/27613/f30cd426-0c67-4c58-c8c7-be28442d5839.png "after-back-slurp.png")


#### 括弧の一番最初の要素を括弧の外に追い出す(forward barf)
	Cmd + 9 + B

![before.png](https://qiita-image-store.s3.amazonaws.com/0/27613/c44d33d2-4584-c012-c29e-3aca57732b66.png "before.png")
　↓
![after-for-barf.png](https://qiita-image-store.s3.amazonaws.com/0/27613/04125416-f044-014c-b217-0eacdf807baa.png "after-for-barf.png")


#### 括弧の左外にある要素を括弧の中に移す(forward slurp)
	 Cmd + 9 + S

![after-for-barf.png](https://qiita-image-store.s3.amazonaws.com/0/27613/04125416-f044-014c-b217-0eacdf807baa.png "after-for-barf.png")
　↓
![before.png](https://qiita-image-store.s3.amazonaws.com/0/27613/c44d33d2-4584-c012-c29e-3aca57732b66.png "before.png")

## その他編集

#### S式を囲む括弧を取り除く
	ctrl + S

![before.png](https://qiita-image-store.s3.amazonaws.com/0/27613/c44d33d2-4584-c012-c29e-3aca57732b66.png "before.png")
　↓
![after-splice.png](https://qiita-image-store.s3.amazonaws.com/0/27613/163d22e7-e158-a971-59b0-e88859d2c123.png "after-splice.png")


#### カーソルの位置でS式を分割
	option + S

![before.png](https://qiita-image-store.s3.amazonaws.com/0/27613/c44d33d2-4584-c012-c29e-3aca57732b66.png "before.png")
　↓
![after-split.png](https://qiita-image-store.s3.amazonaws.com/0/27613/526fd925-0b9b-bccb-5316-10559ca0deeb.png "after-split.png")


#### S式を前のS式とをくっつける
	option + J

![before-join.png](https://qiita-image-store.s3.amazonaws.com/0/27613/c303aa85-611a-01ab-27f2-cbf821d6d107.png "before-join.png")
　↓
![after-join.png](https://qiita-image-store.s3.amazonaws.com/0/27613/a89aa187-4f83-8e70-0afd-3a4bbe102123.png "after-join.png")

* 第一要素だと、くっつける相手がいないので何もしない
第1回オフラインリアルタイムどう書く(Java)

http://nabetani.sakura.ne.jp/hena/1/

```java:Main.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
        private static int[] table = new int[(int)Math.pow(3, 9)];
	private static int convertBoardToInt(char[] inp) {
		int sum = 0;
		int[] board = new int[9];
		for (int i = 0; i < 9; i++) {
			if(hasWon(sum) != 0) return sum;
			int p = i % 2 + 1;
			int d = inp[i] - '0' - 1;
			if (board[d] != 0) return -p;
			else               board[d] = p;
			sum += p * (int)Math.pow(3, d);
		}
		return sum;
	}
	private static int[] hashToIntArray(int h) {
		int[] a = new int[9];
		for(int i = 0; i < 9; i++) {
			a[i] = h % 3;
			h /= 3;
		}
		return a;
	}
	private static void setResults() {
        	int size = table.length;
		for(int h = 0; h < size; h++) {
			int[] a = hashToIntArray(h);
			if      (a[0] != 0    &&
                                 a[0] == a[1] && 
                                 a[0] == a[2]) table[h] = a[0];
			else if (a[3] != 0 &&
				 a[3] == a[4] &&
                                 a[3] == a[5]) table[h] = a[3];
  			else if (a[6] != 0 &&
				 a[6] == a[7] &&
                                 a[6] == a[8]) table[h] = a[6];
  			else if (a[0] != 0 &&
				 a[0] == a[3] &&
                                 a[0] == a[6]) table[h] = a[0];
  			else if (a[1] != 0 &&
				 a[1] == a[4] &&
                                 a[1] == a[7]) table[h] = a[1];
  			else if (a[2] != 0 &&
				 a[2] == a[5] &&
                                 a[2] == a[8]) table[h] = a[2];
  			else if (a[0] != 0 &&
				 a[0] == a[4] &&
                                 a[0] == a[8]) table[h] = a[0];
  			else if (a[2] != 0 &&
				 a[2] == a[4] &&
                                 a[2] == a[6]) table[h] = a[2];
		}  
        }
	private static int hasWon(int h) {
		return table[h];
        } 
	public static void main(String[] args) throws Exception {
		setResults();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while((line = br.readLine()) != null) {
			String[] ss = line.split("\\t");
			int v = convertBoardToInt(ss[1].toCharArray());
			String result = null;
			if(v < 0) {
				result = String.format("Foul : %s won.", (-v == 1)? "x": "o");
			} else {
				switch(hasWon(v)) {
				case 0: result = "Draw game."; break;
				case 1: result = "o won."; break;
				case 2: result = "x won."; break;
				}
			}
			if(!result.equals(ss[2])) {
				System.out.println("input:" + ss[1]);
				System.out.println("expected:" + ss[2]);
				System.out.println("actual:" + result);
			}
		}
	}

}
```
管理者権限いらずで、PowerShell の実行ポリシーを `Set-ExecutionPolicy -scope CurrentUser RemoteSigned` して、スクリプトの実行を許可する方法。もしくは、`Set-ExecutionPolicy -scope Process RemoteSigned` により現在のプロセスでのみ有効にする方法。

[![LGTM](http://www.lgtm.in/p/d6s3)](http://www.lgtm.in/i/d6s3)

[:+1:](http://www.lgtm.in/u/d6s3) [:-1:](http://www.lgtm.in/r/d6s3)

取り急ぎ要件のみにて失礼いたします。

# 参考リンク

* [Set\-ExecutionPolicy](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6)
EvernoteからDayOneに移行するためのシェルスクリプト

# 使い方
1. evernoteから、html形式でデータをエクスポート
1. エクスポートされたフォルダ内に、スクリプトを設置
1. 実行

# 注意点
- Macのターミナルで動作を確認済み
- 移行後に作られるデータの日付は、ノートの作成日になります(not 更新日)
- htmlタグとか添付ファイルとかは反映されません

```bash
#!/bin/bash

# usage
# 1. export Evernote data as html
# 2. put this script to exported Evernote folder
# 3. exec this

IFS=$'\n'

for note in `ls *.html`
do
  content=`cat $note | sed -e 's/<[^>]*>//g'`
  created=`cat $note | sed -e :loop -e 'N; $!b loop' -e 's/\n//g' | sed -e 's/^.*meta\ name="created"\ content="\(.*\)"\/><meta name="updated".*$/\1/'`

  echo ${content} | dayone --date="${created}" new
done
```
Gitで部分的にコミットする方法

一つのファイルの中にたくさん変更を行ったんだけど、コミットする単位は小分けにしたいというケースがあります。

そんな時は、`git add -p`すると良いようです。試してみましょう。

```diff
$ git add -p app/models/blog.rb
diff --git a/app/models/blog.rb b/app/models/blog.rb
index 17bb72a..88634db 100644
--- a/app/models/blog.rb
+++ b/app/models/blog.rb
@@ -1,7 +1,10 @@
 # coding: utf-8
-
 require_relative 'post'

+module Conversions
+
+end
+
 class Blog
    attr_writer :post_source

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
```

差分があるところが切りだされて、「ここはStagingに乗せる？」と聞いてきます。
Stagingに乗せる場合は、「y」と答えます。そうでない場合は「n」と答えます。

今回は、「n」と答えます。すると、次の差分が出てきます。

```diff
@@ -35,12 +38,29 @@ class Blog
       fetch_entries
    end

+   def tags
+      Post.all_tags_alphabetical
+      #entries.all_tags_alphabetical
+   end

    def filter_by_tag(tag)
       FilteredBlog.new(self, tag)
    end

    private
+   class FilteredBlog < DelegateClass(Blog)
+      include ::Conversions
+
+      def initialize(blog, tag)
+         super(blog)
+         @tag = tag
+      end
+
+      def entries
+         Taggable(super).tagged(@tag)
+      end
+   end
+
    def post_source
       @post_source ||= Post.public_method(:new)
    end
Stage this hunk [y,n,q,a,d,/,K,g,s,e,?]?
```

出てきた差分のうち、`class FilteredBlog < DelegateClass(Blog)`の部分だけをStagingに乗せようと思います。
そこで「e」を押すと、エディタが表示されます。

![スクリーンショット 2014-04-18 22.42.50.png](https://qiita-image-store.s3.amazonaws.com/0/15996/4e17ab47-5c54-60bb-c85e-d22a07e70e91.png "スクリーンショット 2014-04-18 22.42.50.png")


私の環境ではVimが表示され、先ほどの差分が表示されました。更に最後までスクロールすると、次のように書かれています。

```vim
 # ---
 # To remove '-' lines, make them ' ' lines (context).
 # To remove '+' lines, delete them.
 # Lines starting with # will be removed.
 #
 # If the patch applies cleanly, the edited hunk will immediately be
 # marked for staging. If it does not apply cleanly, you will be given
 # an opportunity to edit again. If all lines of the hunk are removed,
 # then the edit is aborted and the hunk is left unchanged.
```

英語で書かれていますが、まとめると、

* '-'の行をaddしたくなければ、'-'を' '（空白）にする。
* '+'の行をaddしたくなければ、'+'の行を消す。
* 先頭に#と書かれている行はaddされません。

ということです。

今回の例では、次のようにすればOKです。

![スクリーンショット 2014-04-18 22.48.16.png](https://qiita-image-store.s3.amazonaws.com/0/15996/40ad299d-8b24-5ccc-46ec-6fed5bdc8c50.png "スクリーンショット 2014-04-18 22.48.16.png")

`def tags`から`end`までの行を単純に削除しました。これを保存します。

`git status`とすると、同じファイルなのにStagingにいるものとStagingに居ないものとに分かれています。

```sh
$ git status                                                   
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   app/models/blog.rb

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   app/models/blog.rb

$
```

更に確認がしたい場合は、`git diff --cached`でStaging環境にあるものの差分が、`git diff`でStaging環境にないものの差分が確認できますので、コミットする前に確認してもよいでしょう。

後は普通に`git commit`でコミットすればOKです。
Windowsで Magic Trackpad を使う方法



このサイトにありました。
http://www.labnol.org/software/apple-magic-trackpad-with-windows/14158/


### 手順

[Boot Camp 更新プログラム 3.2 (Windows 64 bit)](http://support.apple.com/kb/DL979?viewlocale=ja_JP) をダウンロード。
exeファイルだが **実行しない** 。


[7-ZIP for Windows](http://www.7-zip.org/download.html) でexeファイルを展開する。


展開されたフォルダの中に、 `BootCampUpdate64.msp` というファイルがある。
これをまた7-ZIPで展開する。

展開されたファルダの中に、`BootCamp3200bToBootCamp3200` というフォルダがあり、その中に、 `Binary.AppleWirelessTrackpad_Bin` というファイルがある。

このファイルにexe拡張子をつけて実行すると、ドライバーがインストール出来る。
ファイルの中にある特定文字列を数える

# Linux上のとあるファイルの中から特定の文字列が何個含まれてるか

## 状況例

``` hoge.txt
hogefugapiyohogefugapiyo
hogehogehogehogehogehoge
```
みたいなファイルから「hoge」の数を知りたい時。
(ちなみに 8 こ)

ビルトインのコマンドで何とか出現回数を調べようと思ったのですが、上手く行かなかったのでPythonでスクリプト書いてみました。
(grepだと一行に複数回の出現に対応できなかったりするので)

## 特定文字列の数を計算するスクリプト

```py:match_count.py
# -*- coding: utf-8 -*-
#!/usr/bin/env python
 
import sys
import os.path
 
 
def clean_args(args):
    if len(args) == 2:
        search_word = args[1] 
        return (True, None, search_word)
    if len(args) != 3: 
        print "[Usage] match_count.py $filename $search_word"
        return (False, None, None)
    
    target_file_path = args[1]
    search_word       = args[2] 
 
    if not os.path.exists(target_file_path):
        print "[Error] File is not exist."
        return (False, None, None)
 
    return (True, target_file_path, search_word)
 
 
def count_words(filename, search_word):
 
    if filename is not None:
        # python 2.4だったのでwith使えず
        stream = open(filename, 'r')
        counter = _count(stream, search_word)
        stream.close()
        return counter
    else :
        return _count(sys.stdin, search_word)
 
 
def _count(stream, search_word):
    counter = 0
    for line in stream:
        counter += line.count(search_word)
    return counter
 
   
def main():
 
    args = sys.argv
    (is_valid, filename, search_word) = clean_args(args)
    if not is_valid:
        sys.exit()
    
    print count_words(filename, search_word)
 
 
if __name__ == '__main__':
    main()
```

このファイルをLinux上で作って、実行権限をつけます。

## 使い方

```
$ ./match_count.py hoge.txt hoge
8
```
みたいな感じでhogeにマッチした数を取得できます。

パイプにも対応してみたので

```
$ cat hoge.txt | ./match_count.py hoge
8
```
みたいにしても使えます。
複数ファイルをcatしたりすれば捗るかな。
Processing 2.Xでの日本語の扱い

Processing 2.Xでの日本語表示、日本語入力に関するまとめです。

Processingについては [Processing.org](http://www.processing.org/)を参照のこと。

#2.2.?
- フォントが設定ファイルを直接変更しなくても環境設定から変更できるようになった
- 日本語の入力も表示も問題なくできるが、問題がある場合は、以下の設定を確認する。
 - Processing -> 環境設定(OSによってはFile->Preferences)
   - Editor and Console fontを日本フォントにする（デフォルトが日本語フォントでない場合）
   - Use smooth text in editor windowにチェック
   - Enable complex text inputにチェック
   - OKを押した後、Processingを再起動
- 一応入力、表示できるようになったが、入力中は文字が二重に表示されている？

#2.1.?
- フォントが設定ファイルを直接変更しなくても環境設定から変更できるようになった
- 日本語が表示できなくなった。（デフォルトのフォントが日本フォントでない＆日本語フォントにしても幅が詰まって表示される。）

#2.0.?
- 日本語の入力も表示も問題なくできるが、問題がある場合は、以下の設定を確認する。
 - Processing -> 環境設定(OSによってはFile->Preferences)
   - Use smooth text in editor windowにチェック
   - Enable complex text inputにチェック
   - OKを押した後、Processingを再起動
- フォントを変更したい場合は、preferences.txtを直接編集することにより設定できる。
 - editor.font=processing.mono,plain,12のような行があるので、書き換えることによりフォント名とフォントスタイル、フォントサイズを指定できる。
【個人メモ】rawgithub(CDN)のサービスがアップデートされてた

# rawgithub、rawgitに改名していた

去年、[CDN代わりにgithubを使いたい場合は外部サービスrawgithubを利用しよう](http://qiita.com/futoase/items/39cb4b7d704b1e53e7f6) という記事を書いていた。
で、最近になって「rawgithub利用すっか」みたいな場面が出てきた。

記事の通りrawgithub.comを利用した形でURLを指定すると
[rawgit.com](http://rawgit.com/)にリダイレクトされる。

あれ、指定したURLからファイル取れないなと思って確認してみたら
rawgitに進化していた。

![スクリーンショット 2014-04-18 20.41.07.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2194d158-8fc7-2d10-027d-fb41833e0830.png)


改めて使い方を書きなおしてみる。

# rawgitの使い方

## github.comにあるプロダクトを選ぶ

CDNが提供されていないgithub.comにあるプロダクトを選ぶ。
ここでは、[Buttons](https://github.com/alexwolfe/Buttons)を選択する。

![スクリーンショット 2014-04-18 20.31.20.png](https://qiita-image-store.s3.amazonaws.com/0/3985/278a7e3a-089e-817f-241f-e3e414c49562.png)


## github.comのURLをrawgitにコピペ

ここでは、button.cssをrawgit経由で利用できるようにする。

I. ブラウザで必要なリソースファイルを開き、確認する
II. URLをクリップボードにコピーする

![スクリーンショット 2014-04-18 19.29.13.png](https://qiita-image-store.s3.amazonaws.com/0/3985/1d789479-353f-95de-1694-46a6798e88b6.png)

III. rawgitのフォームにURLを入力する。URLからは/blobを削除する

![スクリーンショット 2014-04-18 19.29.56.png](https://qiita-image-store.s3.amazonaws.com/0/3985/417bfbb8-ce84-3e7b-9a8f-4f587a778b2a.png)

IV. 表示されているrawgit.comのアドレスをコピペし、利用する。

![スクリーンショット 2014-04-18 19.30.34.png](https://qiita-image-store.s3.amazonaws.com/0/3985/c74dc86b-40df-205c-116d-1edc454437af.png)

![スクリーンショット 2014-04-18 19.31.23.png](https://qiita-image-store.s3.amazonaws.com/0/3985/b8a2ce20-06aa-7b8c-a7e4-96074cf15981.png)

## リソースのContent-Type

rawgitを経由してリソースを取得した場合、
Content-Typeはtext/cssになっている。

![スクリーンショット 2014-04-18 19.38.51.png](https://qiita-image-store.s3.amazonaws.com/0/3985/29b98336-f2dd-4c96-0f87-d42ba0008410.png)

以前にも書いたが、github.comからcssコンテンツを取ってくると
Content-Typeがtext/cssではなく、text/plainになっている。
そのため、ブラウザがcssとして解釈ができず、利用できない。

![スクリーンショット 2014-04-18 20.35.02.png](https://qiita-image-store.s3.amazonaws.com/0/3985/40ccc10f-fd73-8d58-0057-878b9237b481.png)


## 実際にrawgitを利用する

jsbinでButtonを利用したサンプルを使ってみた。

[サンプルへのリンク](
http://jsbin.com/zemis/1/edit?html,output)

![スクリーンショット 2014-04-18 20.56.28.png](https://qiita-image-store.s3.amazonaws.com/0/3985/5fb2ea23-4772-f654-ba35-585668ee842b.png)

コードスニペットを書いて試したい場合、大変助かる。

# Production(beta)とは

![スクリーンショット 2014-04-18 20.38.28.png](https://qiita-image-store.s3.amazonaws.com/0/3985/4ae7668e-8e1d-3604-adac-1210b2833571.png)

Production betaという表現がサイトにあったので、気になって見てみた。

http://rawgit.com/faq#beta

今のところCDNをrawgitの作者が自費で借りているようだ。
一応Productionという表現はあるけれど、商売で使うには自前でね★とのことだ。

[rawgitはソースコードを公開している](https://github.com/rgrove/rawgithub)から問題なさそう。

寄付できるようになればいいんだけどな。
gitlabのwebhookからブランチの情報を受け取り、Jenkinsに仕事をさせる


# 状況
gitlabのリポジトリにコミットされたらテストを実行して欲しいが、その前に別のリポジトリにあるソースをチェックアウトして準備する必要がある（モックを返すプロセスを起動しないといけない・・・）

ちゃんとプッシュされたブランチに対してテストして欲しい

# 結論
jenkinsのgitlab pluginではなく、git pluginを使い、pushされたブランチ名を取得する

Parameterized Trigger Pluginを使って、ビルドに変数を渡せるようにする

hookを受け、ブランチ名を下流プロジェクトに流すジョブを作成する（間に別のリポジトリに対するジョブが挟まるため）

# 仕事を振り分けるジョブを作成する
## webhook
ソースコード管理→gitに対象のリポジトリを設定し、ビルド・トリガを"SCMをポーリングする"に設定して、

```
http://{gitlabサーバーのアドレス}/git/notifyCommit?url={ブランチの情報}
```
を設定すれば、push時にジョブが起動するようになる。

## ブランチ名を取得する

https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

こいつにこういう記述がある

```
Environment variables
The git plugin sets several environment variables you can use in your scripts:

GIT_COMMIT - SHA of the current
GIT_BRANCH - Name of the branch currently being used, e.g. "master" or "origin/foo"
GIT_PREVIOUS_COMMIT - SHA of the previous built commit from the same branch (the current SHA on first build in branch)
GIT_URL - Repository remote URL
GIT_URL_N - Repository remote URLs when there are more than 1 remotes, e.g. GIT_URL_1, GIT_URL_2
GIT_AUTHOR_EMAIL - Committer/Author Email
GIT_COMMITTER_EMAIL - Committer/Author Email
```

上記方法で起動されたジョブは環境変数$GIT_BRANCHにブランチ名がアサインされるので、これを下流プロジェクトに引き渡すようにすれば良い。

## 下流プロジェクトにブランチ名を流す
ビルド後の処理→Trigger parametrized build on other projects→Predefined parameters

```
branch = ${GIT_BRANCH}
```

下流プロジェクトのパラメータにbranchが渡される。（下流プロジェクトはパラメータ付きでビルドできるように設定する）

### 下流プロジェクト
ビルドのパラメータ化にチェックをつけ、文字列を選択。

名前に先ほどの場合はbranchを指定し、パラメータを使用したいところで$branchとすれば呼べる。
iOSからgoogle analyticsへのカスタム変数の保存方法


### カスタムディメンションやカスタムメトリックスとは
* カスタムメトリックスは、analyticsではカスタム変数と書かれている。
* フィルタリングに利用できる変数を保存できる
* 一覧ページと詳細ページがあった時に、詳細ページは具体的にどのページなのかつける。
     * /items/***なら、***を保存する
* ユーザ属性もよい
     * 課金しているなら課金。なにかアクションした人かどうかなど入れるのもいい

### 手順
1.google analyticsの設定からカスタムディメンションを作成する

* 名前は、適当につけるといい。
* 範囲はヒット。セッションごとユーザごとの属性なら変更する。
* つけるとiOSのSDKでどのように書けばいいか表示される！
* https://support.google.com/analytics/answer/2709829?hl=ja

2.iOSにカスタムディメンションのコードを追加する

```
NSString *dimensionValue = @"SOME_DIMENSION_VALUE";
[tracker set:[GAIFields customDimensionForIndex:1] value:dimensionValue];
```

3.カスタムメトリックスの利用方法

* google analyticsから設定する
* ある値のデータを保存することができる
* 整数、通貨、時間を保存できる
* 追加のコードはこちら

```
NSString *metricValue = SOME_METRIC_VALUE_SUCH_AS_123_AS_STRING;
[tracker set:[GAIFields customMetricForIndex:1] value:metricValue];
```

※ 注意！google analyticsで設定を行わないと、データが保存できない

### マクロで設定するなら

```
#import "GAI.h"
#import "GAIFields.h"
#import "GAIDictionaryBuilder.h"

#define GA_TRACK_VIEW(PAGE, CUSTOM1, CUSTOM2, CUSTOM3) [[[GAI sharedInstance] defaultTracker] send:[[[[[[GAIDictionaryBuilder createAppView] set:PAGE forKey:kGAIScreenName] set:CUSTOM1 forKey:[GAIFields customDimensionForIndex:1]] set:CUSTOM2 forKey:[GAIFields customDimensionForIndex:2]] set:CUSTOM3 forKey:[GAIFields customDimensionForIndex:3]] build]];
#define GA_TRACK_EVENT(EVENT,ACTION,LABEL,VALUE) [[[GAI sharedInstance] defaultTracker] send:[[GAIDictionaryBuilder createEventWithCategory:EVENT action:ACTION label:LABEL value:VALUE] build]];
#define GA_TRACK_TIMING(CATEGORY,TIME,NAME,LABEL) [[GAI sharedInstance] defaultTracker] send:[GAIDictionaryBuilder createTimingWithCategory:CATEGORY interval:TIME name:NAME label:LABEL] build];
#define GA_TRACK_SOCIAL(NETWORK,ACTION,TARGET) [[[GAI sharedInstance] defaultTracker] send:[GAIDictionaryBuilder createSocialWithNetwork:NETWORK action:ACTION target:TARGET] build];

#define GA_TRACK_CLASS GA_TRACK_VIEW(NSStringFromClass([self class]), nil, nil, nil);
#define GA_TRACK_CLASS_WITH_CUSTOM1(CUSTOM) GA_TRACK_VIEW(NSStringFromClass([self class]), CUSTOM, nil, nil);
#define GA_TRACK_CLASS_WITH_CUSTOM(CUSTOM1, CUSTOM2, CUSTOM3) GA_TRACK_VIEW(NSStringFromClass([self class]), CUSTOM1, CUSTOM2, CUSTOM3);
```
From GitHub: A note about your plan

こないだ、昔freeでもprivateなのが作れた時に作られたprivate repoが今でも使えるバグがあって(仕様なんだと思ってた)fairじゃないからそれを直すよっていうメールがきました。

"longtime loyal users", "you're one of those awesome folks", privateを3ヶ月キープできるだけのクーポンをくれるところ、githubのカスタマーサービスは素敵だなと思いました。

```
Hi Kentaro,

We've recently noticed a bug in our billing system that has allowed some longtime loyal users to own private repositories while remaining on the Free plan and it looks like you're one of those awesome folks. However, owning private repositories should be limited to users that are on a paid plan.

We would love it if you continued to use your private repository, but to be fair to our other customers, we have moved you to a paid plan. To give you some time to decide whether to stay on a paid plan, we've applied a coupon to your account that will give you 3 months of the Micro plan for free. After that, if you choose to update your billing information [1], you will be billed $7 per month.

Thanks for understanding and please do let us know if you have any questions or concerns.

Cheers,
Haleigh
```