OmniAICreator/Qiita-1.07M huggingface dataset:
逆引きReactiveCocoa: シグナルの現在の値だけでなく、直前の値にアクセスする

元ネタ: [How to obtain KVO old value using ReactiveCocoa 2.0 API? · Issue #762 · ReactiveCocoa/ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa/issues/762)

-----

## KVOのオプションを使用する場合

ReactiveCocoaでは`RACObserve()`マクロによってKVOを非常に簡単に扱うことができますが、それだけでは、通常のKVOで使用する`addObserver:forKeyPath:options:context:`の場合には指定できる`NSKeyValueObservingOptions` (NSKeyValueObservingOptionOldなど) を指定できません。

KVOのオプション指定を行いたい場合、`-[NSObject rac_valuesAndChangesForKeyPath:options:observer:]`を使用するとKVOのオプション指定を反映したシグナルを得ることができます。ただし、この戻り値のシグナルは`RACObserve()`とは違い、`next`として、変更後の値とチェンジディクショナリーからなる`RACTuple`を送るため、`-reduceEach:`を使用するなどしてタプルの値を分解・チェンジディクショナリーから変更前の値を取得するなどの必要があります。

```objc
[[self 
    rac_valuesAndChangesForKeyPath:keyPath options:NSKeyValueObservingOptionOld observer:nil] 
    reduceEach:^(id value, NSDictionary *changeDictionary) {
        id oldValue = changeDictionary[NSKeyValueChangeOldKey];
        return // 何かしらの値;
    }];
```

## オペレーターを使用する場合

`-[RACSignal combinePreviousWithStart:reduce:]`を使用すると、`reduce:`のブロック引数で以下のように直前の値を使用することができます。

```objc
RACSignal *signal = [@[ @1, @2, @3, @4 ].rac_sequence signal];
[[signal 
    // 最初の`next`では`previous`に1つ目の引数（この場合は`@0`）が渡され、
    // 2回目以降の`next` では前回の`current`が渡される。
    combinePreviousWithStart:@0 reduce:^(NSNumber *previous, NSNumber *current) {
        return @(previous.integerValue + current.integerValue);
    }]
    subscribeNext:^(NSNumber *value) {
        NSLog(@"%d", value.integerValue);
    }];
// 1 (<= 0 + 1)
// 3 (<= 1 + 2)
// 5 (<= 2 + 3)
// 7 (<= 3 + 4)
```
9patchでStretchable Areaを横2箇所設置時に同幅にスケールしない問題の解決方法

![hukidashi_bg_n.9.png](https://qiita-image-store.s3.amazonaws.com/0/14166/aa0b65e8-010d-aada-87fb-4e05c2a598c2.png)

ふきだしのしっぽ をセンターに表示したい場合など、左右の２箇所でスケールしたい時があります。
２箇所Stretchable Areaを設定した画像で、センター部分が右に寄ってしまうという現象が発生しました。
確認したのは、Galaxy S (OS:4.2.2) です。

解決方法：
根本的な原因は不明ですが、２箇所Stretchable Areaを設定した画像の横ピクセル数を
奇数にしたら直りました。
複数解像度に対応する場合は、画像を確認しないといけないので、めんどうですね...
逆引きReactiveCocoa: 副作用だけのシグナルをリフティング／バインディングに使用する

元ネタ: [Best practice for signals that capture completed/error operations · Issue #653 · ReactiveCocoa/ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa/issues/653)

-----

ログインやデータの永続化など、特に `next` として送る値がないシグナルの結果を `-[NSObject rac_liftSelector:withSignals:]` や `RAC()` マクロでのバインディングに使用したい場合にどうするべきかというパターンです。

```objc
RACSignal *login = [[[self 
    // ログイン成功時には `completed`, 失敗時には `error` を送る。
    loginWithUserName:userName password:password] 
    concat:[RACSignal return:@YES]]
    catchTo:[RACSignal return:@NO]];

RAC(self, loggedIn) = login;
// or
[self rac_liftSelector:@selector(loginDidSuccess:) withSignals:login, nil];

```

とすると、`-loginWithUserName:password:` の実装側では、`next` として `@YES/@NO` や `RACUnit.defaultUnit` を送る必要がなくなります。

### 補足

元ネタでは `[RACSignal return:@YES];` を返す部分に `-then:` を使用していましたが、そう遠くない内にリリースされるであろう [ReactiveCocoa 3.0](https://github.com/ReactiveCocoa/ReactiveCocoa/tree/3.0-development) では `-then:` が[非推奨 (deprecated) になりそう](https://github.com/ReactiveCocoa/ReactiveCocoa/commit/be1b3d367bf5cbcbdb0cb56cfba364a1090ae04a)なので置き換えています。
bash/zshでGruntのタスク名を補完する

Gruntのcompletionとかないのかなーと思って探してみたら、grunt-cliのところに[書いてありました](https://github.com/gruntjs/grunt-cli#shell-tab-auto-completion)。

---

```bash:.bashrc
eval "$(grunt --completion=bash)"
```

もしくは

```zsh:.zshrc
eval "$(grunt --completion=zsh)"
```

を追加すると良いみたいです。

---

私は

```bash:.bashrc
type grunt >/dev/null 2>&1 && eval "$(grunt --completion=bash)"
```

という風にしました。

---

とまあ、補完はできたのですけど速度はかなり遅いです。

- https://github.com/g-k/grunt-shell-completion
- https://github.com/yonchu/grunt-zsh-completion

などは使ってみていませんが（というかzsh使いではない）上記のものより補完が速いのかもしれません。
NSRectとかNSPointとか

手書きのメモをQiitaに残す。

```objc
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSRect r0 = NSMakeRect(0, 0, 10, 10);
    NSRect r1 = NSMakeRect(5, 5, 10, 10);
    
    NSRect r2 = NSUnionRect(r0, r1); // r0と r1を含む矩形領域
    NSRect r3 = NSIntersectionRect(r0, r1);  // r0と r1の共通領域
    
    [self p:@"r0" rect:r0];
    [self p:@"r1" rect:r1];
    [self p:@"r2" rect:r2];
    [self p:@"r3" rect:r3];

    NSRect r4 = NSMakeRect(100, 100, 10, 10);
    NSRect r5 = NSIntersectionRect(r0, r4); // r0と r4は重ならない
    [self p:@"r5" rect:r5];
}

-(void) p:(NSString*)header rect:(NSRect)r
{
    NSLog(@"%@: (%.0f,%.0f) %.0f x %.0f", header, r.origin.x, r.origin.y, r.size.width, r.size.height);
}
```

> r0: (0,0) 10 x 10
> r1: (5,5) 10 x 10
> r2: (0,0) 15 x 15
> r3: (5,5) 5 x 5

重なりがないときは全ての要素が0になる
> r5: (0,0) 0x0
プロキシ環境下でのCoreOS + Docker

※ この記事はVMWare上のCoreOSについての記述です。Vagrantなど別の環境では、違った方法があるのかもしれません。

dockerのホストOSとしてなるべく軽量なものがいい、CoreOSだ、となるのですが、プロキシ環境下では困ったことになります。

dockerは内部的にはGoのnet/httpを使って、イメージファイルを取りに行きます。したがってプロキシを通すためには、[HTTP_PROXY環境変数にプロキシURLを設定](http://golang.org/pkg/net/http/)すればよいのです。

```shell-session
% export HTTP_PROXY=http://hogeproxy:3128
```

しかし、CoreOS環境ではdockerデーモンは、systemctlがOS起動時に立ち上げてくれます。ので、起動後ログインして、

```shell-session
% sudo systemctl stop docker.service
% sudo HTTP_PROXY=http://hogeproxy:3128 docker -d
```

と環境変数付きで再起動すればよいのです。

…
…
… ダサい！

さて、/etcのどこかを書き換えればいいんだな、ということで/etc/profileなどを書き換えようとしても、CoreOSの場合、

```shell-session
% mount
/dev/sda3 on / type ext4 (ro,relatime)
```
と/etcがリードオンリーでマウントされているので、それができません。


試行錯誤した結果、OEMベンダ向けのディレクトリにスクリプトを書けば、docker起動前に実行してくれることがわかりました。/usr/share/oem ディレクトリの下に、run という名前でシェルスクリプトを置いておけば自動的に実行してくれます。

```bash:/usr/share/oem/run
#!/bin/bash

systemctl set-environment HTTP_PROXY=http://hogeproxy:3128
```

のように記述して、実行権つけてCoreOS再起動すると、

```shell-session
% docker build .
Uploading context 10240 bytes
Step 1 : FROM stackbrew/ubuntu:saucy
Pulling repository stackbrew/ubuntu
 ---> 3dfa13a1a7fckB/10.24 kB (100%)/ubuntu, endpoint: https://cdn-registry-1.docker.io/v1/
```

プロキシ越しにイメージファイルを取得できるようになりました！
CentOS 6.5, MySQL 5.6でRamディスクにデータを移す

## 環境

- CentOS 6.5
- yumで入れたmysql5.6
 - <http://dev.mysql.com/doc/mysql-repo-excerpt/5.6/en/linux-installation-yum-repo.html>
 - 昔と比べて楽になったなぁ<del>（おっさん臭い）</del>

## やったこと

全部root

```bash
# mysqlとめた
service mysqld stop

# ramディスク作った
mkdir -p /mnt/ramdisk
mount -t tmpfs -o size=2G tmpfs /mnt/ramdisk

# mysqlディレクトリをコピーした（パーミッションそのままに）
cp -pr /var/lib/mysql /mnt/ramdisk/
```
### /etc/my.cnf いじった

```
# datadir=/var/lib/mysql
datadir=/mnt/ramdisk/mysql
```

### 起動しない

```bash
service mysqld start
```

### /var/log/mysqld.log を見る

```
2013-12-05 10:58:01 10047 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
```

他にもパーミッションねぇとかなんとか。あるよ！！

## 原因はSELinux

- ググるとubuntuでapparmorがどうのこうのというのを見かける
  - じゃCentOSならSELinuxじゃねぇ？
     - selinuxとかつけてググり直す
         - ビンゴ

```bash
# 試しに切ってみる
/usr/sbin/setenforce 0

# 動いた！
service mysqld start
```

## 後々

/etc/sysconfig/selinux を弄っておく（permissiveでも問題ないサーバなので）

## もともとの目的

jenkinsで異様にテストが重い→ローカルマシンでは早い→原因はI/Oくさい→「Ramディスク使えばいいんじゃね？」（←天からの啓示）

結果、22分かかってたテストが1分で終わるようになった。ひゃっほう。
Cucumberの実行時のタグ指定方法

### はじめに
* cucumberのfeatureファイルにつけたタグを使った実行方法についてまとめてみた

### 実行方法
* 1つのタグ@hogeが付いているシナリオのみを実行

```
$ cucumber --tags @hoge
```

* @hogeまたは@fooが付いているシナリオを実行

```
$ cucumber --tags @hoge, @foo
```

* @hogeかつ@fooが付いているシナリオを実行

```
$ cucumber --tags @hoge --tags @foo
```

* タグ@hogeが付いていないシナリオを実行

```
$ cucumber --tags ~@hoge
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
Google SitesのリストページはGASによって羽ばたく

意味がわかりませんね。
Google Apps Script Advent Calendar 4日目があいちゃったので補填投稿です。

では今回はGoogle SitesのリストページとGASについて書いていきたいと思います。

# Google Sitesのリストページ?

以下の様なページです。
https://sites.google.com/site/keisukeoohashi/listpage

一見Google Sites内で一覧表示したり、課題管理したり、Todo管理したりできる、
いい感じのページなのですが、
自動でタスクを削除したり、
隠したり更新から何かフックさせてなんかやるみたいなことができない、ちょっと片手落ちな機能なのです。

# Google Apps Scriptが加わると....

さてそんな不憫なリストページですが、
「自動で削除」や「更新したら何か」はGASを使えばできるわけで、
GASを使うとかなりいい機能になる代表格と言えます。

# 色々抑えておくポイント

## データの取得と更新

以下の感じのコードになります。

```js
//データの取得
function getListItemsData() {
  var page = SitesApp.getPageByUrl("https://sites.google.com/site/keisukeoohashi/listpage");
  
  //リストの取得
  var items = page.getListItems();
  
  //カラムヘッダーの取得
  var columns = page.getColumns();
  
  //詰め込み用
  var dataList = [];
  
  //全部取得
  for(var row = 0; row < items.length; row++) {
    var item = items[row];
    
    var data = {};
    for(var colIndex = 0; colIndex < columns.length; colIndex++) {
      var columnName = columns[colIndex].getName();
      data[columnName] = item.getValueByIndex(colIndex)
    }
    
    dataList.push(data);
  }
  
  //これで dataList[行番号][カラム名]でアクセス可能
  //ちなみに
  //checkboxの場合はチェックが付いていると"on" ついてないとnullになる。
  //URLはAタグ付きで来る 非常に困る。
  //日付は yyyy-MM-dd っぽい
  Logger.log(dataList);
  
  
  
  //ちなみに好み的には以下のコードで書いた方好きだけど(読まなくて良い)
  var dataList2 = items.map(function(item){
    return columns.reduce(function(data, column){
      var columnName = column.getName();
      data[columnName] = item.getValueByName(columnName);
      return data;
    }, {});
  
  });
  Logger.log(dataList2);
  
}

//データの更新
function insertNewData() {
  var page = SitesApp.getPageByUrl("https://sites.google.com/site/keisukeoohashi/listpage");
  
  //登録は非常に簡単
  //カラムの順番と同じ順の配列を渡すだけ
  //
  //なんだけど、
  //データの整合性チェック(リストから選ばれてる?とか、日付になっている？とか、チェックボックス値とか)は
  //行われない ただしURL(Aタグ)は除く ... なんで...
  page.addListItem([
    "ほげ","ふが","ほげ","ほげ","ほげ","on","2013-12-01","<a href='https://google.com'>ほげ</a>"
  ]);
 
}
```

## トリガー

リストページが更新されたら、GASを走らせるみたいなトリガーは2013/12/05現在存在しない。
なので、

* 時間トリガーを使い、定期的にリストページを監視する。
* Google Apps Script起動用アンカーをリストページ内におき、更新時にクリックしてもらう。

の2種類が一般的な方法だと思います。
個人的には両方やっておくことをオススメします。

1つ目の方は普通にトリガーの登録の仕方と同じです。

2つ目の方は、Google Sitesのページにて、編集モードにし、メニューの「挿入」→「リンク」→「Appsスクリプト」から選択可能です。
ただしここで表示されるスクリプトは「Google Sites内に作成したスクリプト」だけになります。
注意してください。

# まとめ

個人的には、Google SitesのリストページとGASの組み合わせは非常に好きです。
例えば
Todoリストをリストページで作成しておき、GASでSpreadsheetへ定期的にバックアップ & 終了したタスクは削除
みたいなものをしたり、
設定ファイル代わりに使ったりも可能です。

Google Sitesとその他のアプリケーションを簡易に結合ができるようになりますので、ぜひ試してみてください。
Fedoraで行っているテスト各種

Fedoraでどんなテストが行われているかを書いてみたいと思います。
テストは大別すると3種類有って、通常のパッケージアップデート時に行われる *updates-testing* とリリース前に行われるテスト、それにTest Dayと呼ばれるテストイベントの3個です。

# updates-testing
これはリリース版のディストリビューションでパッケージのアップデートをする時に行われるテストです（[Fedoraのwiki](https://fedoraproject.org/wiki/QA:Updates_Testing)）。
Fedoraの場合、メンテナさんがパッケージをアップデートすると最初にupdates-testingというリポジトリにrpmファイルがアップロードされます。ここで人間がテストしてOKだったものが通常のupdatesリポジトリに入るという流れになっています。
そしてテストした結果は[bodhi（菩提）](https://admin.fedoraproject.org/updates)というシステムで管理されます。
![bodhi_top.png](https://qiita-image-store.s3.amazonaws.com/0/22325/7259f911-1da3-063e-ca19-4b5ad7385751.png)
 *bodhiトップ画面*

大体は見たままなので説明不要かと思いますが、重要なのはkarmaです。テストした人はkarmaを与えます。問題が無ければ+1、問題があったら-1、単なるコメントだったら0ですね。karmaが-1（ニコニコマークが泣いているもの）は基本的にupdatesリポジトリに入れません。
![updatescomments.png](https://qiita-image-store.s3.amazonaws.com/0/22325/465983fa-1d2f-29c2-0a4f-59389e81ccf2.png)
 *bodhiコメント一覧*

パッケージのテストはどんなことをやるかというと基本的に任意です。そのパッケージを使っている人がその人の通常の使い方で問題なければOKとしても良いし、[Wikiにテストケース](https://fedoraproject.org/wiki/QA)があればそれを実行してもOKと言う感じです。
なのでここでバグがちゃんと見つかるかというとテスト内容依存（X.orgあたりはハードウェア依存も）ですが、それなりには見つかってるかなと思います。

ちなみに、「bodhiコメント一覧」の画像でAuthorに「autoqa」という人がいますが、これは自動テストです。パッケージの依存関係が正しいかなどはこれがテストしてます。

# リリース前のテスト
これはそのままですねw　FedoraはAlpha、Betaときて正式版がリリースされます。そしてこれら3種類にもRC版があります。Alpha版をリリースするためにはAlpha rc1でテストして問題があればAlpha rc2で再テストという感じで進んでいきます。
テスト内容はインストール、旧版からのアップグレード、デスクトップ環境のテストという3本柱です。
Fedora20で行われたテストは[こちら](https://fedoraproject.org/wiki/Category:Fedora_20_Test_Results)で確認できます。例えば[Category:Fedora 20 Beta RC Test Results](https://fedoraproject.org/wiki/Category:Fedora_20_Beta_RC_Test_Results)を見てみますと、インストールテストの結果、デスクトップ環境のテスト結果などが見れます。
で、[rc2のインストールテスト結果](https://fedoraproject.org/wiki/Test_Results:Fedora_20_Beta_RC2_Install)を見るとどんなテストをして、その結果がどうだったか確認できます。

リリース前のテストで行うテストは一通りテストケースがありますのでそれを行っていきます。

# Test Day
これはリリース前に行われることが多いですが、パッケージとか機能に特化したテストイベントです。[Fedora 20で予定されているTest Dayの一覧](https://fedoraproject.org/wiki/QA/Fedora_20_test_days)がここで見れます。Test Dayの主催者は通常はそのパッケージ/機能のメンテナさんですね。この人がパッケージ、テストケース、必要ならテスト用のライブCDイメージなどの準備をしてTest Dayが行われます。Test Day中はircで話しつつ進める感じです。

# テストして得られる物

- テストして報告をしておくと、とりあえず自分の環境ではそれなりに動く最新のFedoraディストリビューションが手に入ります。
- QAチームのリーダーにblogで褒めてもらえるw [Fedora 14](http://www.happyassassin.net/2010/10/26/fedora-14-goes-gold/)の時はSpecial Thanks to~頂きました(　´∀｀)bグッ!
【JavaScript】プルダウンメニューを選択しただけで、画面遷移をさせる。

こんにちは。

結構実用的（というかよくみる）学習まで進んできました。

まずはプルダウンメニューを選択したあと、
ボタンを押下して画面遷移をさせる方法

```html
<form name="pullForm">

	<select name="pullMenu">
		<option value="a.html">aへ遷移</option>
		<option value="b.html">bへ遷移</option>
		<option value="c.html">cへ遷移</option>
	</select>

	<input type="button" value="クリック" onclick="screenChange()"> 
</form>
```

```js
function screenChange(){
	pullSellect = document.pullForm.pullMenu.selectedIndex ;
	location.href = document.pullForm.pullMenu.options[pullSellect].value ;
}
```

```html <select><option>~</option></select> ```
これでプルダウンメニューを設置して、各optionのvalueにリンク先を示す。

```js pullSellect = document.pullForm.pullMenu.selectedIndex ; ```
selectedIndexは<select>要素内にある<option>要素に配列を[0]から与えるので、
```js location.href = document.pullForm.pullMenu.options[pullSellect].value ; ```
<select>要素内にある<option>要素内を参照するoptionsに格納する。

あとはHTMLのinput要素内にonclickでOK。

これがボタンを設置した場合。

では、ボタンではなくプルダウンを選択した時点で
画面遷移をさせるにはどうするか。

jsはそのままで、

```html
<form name="pullForm">
	<select name="pullMenu" onChange="screenChange()">
		<option value="a.html">aへ遷移</option>
		<option value="b.html">bへ遷移</option>
		<option value="c.html">cへ遷移</option>
	</select>
</form>
```

<select>要素内に ```js onChange="~()" ``` をいれるだけです。


さてさて、ここで考えることが1つ。
ではユーザビリティ的にはどちらがいいのかと考える今日この頃です。

ネストして応用が効きそう。

それではこれからも宜しくお願いいたします。
nextEventMatchingMaskの使い方

#目的
nextEventMatchingMaskの使い方について。

Mac Dev Centerにあるサンプル Sketchのコード読み中。

ドローツールのようなものを作ろうとすると「ボタン押下→移動→ボタン離す」で移動や描画などを行う事が多くあるが、 mouseDown, mouseMoved, mouseUpメソッドの組み合わせで作ると処理がばらばらになってコードの見通しが悪くなることがある。

mouseDownをトリガにして、mouseUpまで一つのループで書きたいという場合に nextEventMatchingMaskを使うと良い。

#使い方
カスタムビューを作って以下のように書く

```objc
-(void)mouseDown:(NSEvent*)theEvent
{
    do {
        NSPoint p = [theEvent locationInWindow];

        // p = [self convertPoint:p fromView:nil];
        
        NSLog(@"%.0f, %.0f", p.x, p.y]);
        
        theEvent = [NSApp nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)
                                      untilDate:[NSDate distantFuture]
                                         inMode:NSEventTrackingRunLoopMode
                                        dequeue:YES];
        
        if ([theEvent type] == NSLeftMouseUp)
            break;
        
    } while (YES);
}
```
WebPayを使った簡単なネットショップをつくってます


こんにちは。あそなすといいます。WebPay Advent Calendar 2013の4日目です。

さて、僕が書こうとしていた内容は「サーバにクレジットカードの番号（PAN）を通さない決済方法」という名目でこのアドベントカレンダーに臨んでちまちまコードを書いていたのですが、まさかの初日のhmskさんに、WebPayでリリースされたばかりのCheckoutHelperの話をされるとは思ってもいなかったので、急遽路線変更をして「WebPayを使った簡単なWebショップをつくっている」という話をしようと思います。

## CheckoutHelperとは

初日の[hmskさんの記事](http://qiita.com/hmsk/items/744f9a7e37638340a992)にもありますように、CheckoutHelperとは決済の手続きを助けてくれるものです。

そもそも[WebPayにはTokenというAPI](https://webpay.jp/docs/api#tokens)があります。 このAPIを使うことによってクレジットカードのトークンを発行してくれます。
CheckoutHelperはJavaScriptで実装されていて、トークン化をする時 **自分が管理しているサーバにクレジットカードの番号を通すことがない** のが1番の利点ですね。

そして、なぜ自分のサーバにクレジットカードの番号を通さないのが利点なのか？また、決済仕組みやクレジットカードに関するセキュリティなどについては[WEB†DB PRESS](http://www.amazon.co.jp/dp/4774158747)が詳細に書かれてあるのでそちらもオススメします。

余談ですが、僕はCheckoutHelperのことを勘違いしていて、CheckoutHelperを使うことで決済まで終わるものだと思っていました。
実際にはCheckoutHelperはクレジットカードのトークン化しかせず(2013/12/5日現在)、決済自体は別途WebPayのAPIを呼び出す必要があります。

具体的なCheckoutHelperを使った決済の実装方法などはhmskさんの記事に記載されており、またGithub上にリポジトリが公開されています。ちなみに僕はslimが好きです。

https://github.com/hmsk/webpay-sinatra-sample

## asonas/shop-webpay

https://github.com/asonas/shop-webpay

冒頭に書いたとおりですが、そもそもなぜ「サーバにクレジットカードの番号を通さない」コードを書いていたかというと、Stripe が [stripe/shop](https://github.com/stripe/shop) というアプリケーションを公開したことに起因します。

stripe/shopはStripeのAPI使いつつ、[Parse](parse.com)の上で動作するようにつくられています。つまり、StripeとAPIの互換性を持っているWebPayでも同じようなことができるはずだと思ったのが始まりでした。

WebPayを使ったショップのアプリケーションは前からつくろうと思っていたのですが、なかなか時間を見つけることができなくて後々になっていたし、丁度アドベントカレンダーも始まったことなので開発をやってみようという思います。

所謂自分で設置するカートシステムの良いところは、自由にデザイン・テンプレートをいじれたり、独自ドメインをあてがうことができたり、手数料も安くすませられるのもいいですね。カートのシステムを考えるのもまた面白くモデリングのしがいがあって楽しいです。

目前に着地点は見えているので、そこへ無事にのせられたらきちんと公開してみようと思います。

## まとめ

これはWebPay Advent Calendar 2013の4日目の記事でした。
CheckoutHelperが公開されたことを機に簡単なネットショップを公開できるツールを開発しています。
[WebPay Advent Calendar 2013](http://qiita.com/advent-calendar/2013/webpay)はまだ空いているようなので、進捗があったらまた書いてみようと思います。

それではまた。
PhpStorm内でVim/Emacsを動かそう


PhpStorm7からの新機能で、内部Terminalが導入されました。
サーバ上に繋いでログをtailしたりとか地味に便利です。
デフォルトシェルとかも変更出来たりします。
ただしTerminal内で色は付けられないです。
![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/20074/4ae0ddc1-c0df-acc4-22ea-6b0da8b31df8.png "Preferences.png")

今回はこの内部Terminalを使ってVimやEmacsを動かしてみます。

と言っても特に設定は必要なくて、PC内にVimやEmacsがインストールされてPathが通っていればそのまますぐ使えます。

- Vim
![app_…_AppShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/a122beed-c37b-5f4f-31b9-b091e2ce70c0.png "app_…_AppShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png")

- Emacs
![app_…_AppShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/e9f41d1b-9de9-5acf-9334-2a4727438978.png "app_…_AppShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme_.png")

ひと通りのことはちゃんと動きます。ちなみにプラグインもちゃんと読み込まれます。
ただし、キーバインドはPhpStormで設定されているもので完全に上書きされるのでCtrlを多用するEmacsを動かすときは注意です。

PhpStorm内でSLも動かせます。
![app_…_AppShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme__と_works.nanapi.jp_…_ConvertShell.php_-_nanapi_-____www_nanapi_.png](https://qiita-image-store.s3.amazonaws.com/0/20074/14bcc96c-adf6-0bb3-f4c9-cc01320978e8.png "app_…_AppShell.php_-_screeme_-____Dropbox_100_Programming_php_screeme__と_works.nanapi.jp_…_ConvertShell.php_-_nanapi_-____www_nanapi_.png")

以上、ネタエントリでした。

明日の6日目も私です。お楽しみに！
usingについて。

はいはーい。またまた書きます。

# usingについて

昨日のLambdaでも出てきましたが、Haxeにはusingというものがありまして、一言で言えばクラスや特定の型にメソッドを追加し拡張する機能があります。
僕はこれでよく言語間の違いを分けたりしています。

僕は実は、なにげに凄くね?とおもったりしています。特にモナドを実現するために便利な機能でもあると思っています。

## usingのキホン

たとえばー、 こんな感じのクラスがあって~,

```hx:Foo
class Foo{
	public static function hoge(a, b, c, d){
           // 実装なのれす!!!
	}
}
```

このusing Foo;するとhogeメソッドをこんな感じにつかえます!!!

```hx:Sample.hx
using Foo;
class Sample{
	public static function hoge(a, b, c, d){
          ///  usingをつかわないでかくと
             Foo.hoge(a,b,c,d);
         ///  usingを使ってかくと!
             a.hoge(b,c,d);
	}
}
```

 ぶっちゃけこれだけ!!!!

## ちょっと解説

### どーしてhogeが呼び出せるの???? 

Haxeでusingをつかうと、そのクラスのpublic static メソッド第一引数とマッチする型であれば、その型のメソッドとして呼びだせる、というわけです。


## 実例!!!

そうですねー、たとえばInt型を拡張してみましょう。

* 3の倍数であればFizz
* 5の倍数であればBuzz
* 15の倍数であればFizzBuzz
* それ以外は、その数値

を返すメソッドをInt型に追加しましょう。

### 返す値の型を作る

さてさて、Haxeは一つの関数は同じ型を返さなければなりません。このままでは、Intとfizzbuzzの文字列で型が違います。なので、今回はfizzbuzz型を作ります。全部文字列にしても良いのですが、Haxeらしく書くならenumで書くとHaxeらしいです。


```hx:FizzBuzz.hx
enum FizzBuzz{
	Fizz;
	Buzz;
	FizzBuzz;
	Number(i:Int);
}
```

あ、そうそう、Haxeのenumについてもまた別の記事にでも詳しく書いてみたいと思います。

### public staticだらけのクラスを作る

つぎに、数値を引数に与えたら、FizzBuzz型に変換してかえすpublic staticメソッドをFizzBuzzConverterクラスにつくります。

```hx:FizzBuzzConverter.hx
class FizzBuzzConverter{
	public static function toFizzBuzz(i : Int) {
		return 	if( i % 15 == 0 ){
			FizzBuzz;
		}else if( i % 3 == 0 ){
			Fizz;
		}else if( i % 5 == 0){
			Buzz;
		}else{
			Number(i);
		}
	}
}
```

### とりあえずusingなしで使ってみる。

```hx:Sample.hx
class Sample{
	public static function main(){
		trace(ToFizzBuzz.fizzbuzz(6));
		trace(ToFizzBuzz.fizzbuzz(10));
		trace(ToFizzBuzz.fizzbuzz(30));	
		trace(ToFizzBuzz.fizzbuzz(7));
	}
}
```

とりあえず出力

```
Sample.hx:3: Fizz
Sample.hx:4: Buzz
Sample.hx:5: FizzBuzz
Sample.hx:6: Number(7)
```

良いですね。


### usingで書いてみる

```hx:Sample.hx
using FizzBuzzConverter;
class Sample{
	public static function main(){
		trace(6.toFizzBuzz());
		trace(10.toFizzBuzz());
		trace(30.toFizzBuzz());	
		trace(7.toFizzBuzz());
	}
}
```

良い感じですねー。


## もっと詳しく詳細解説ぅ!!!!

### 呼び出されるメソッドの優先順位

たとえば、usingで拡張されたメソッドと元々のクラスのメソッドが競合したとき、また、複数のusingが競合したときどうなるか?しらべてみた。

結論から言えば

* 元々のクラスにメソッドがあった、場合、そのクラスのメソッドが呼びだされる。
* 最後にusingされたクラスのメソッドが呼びだされる。

となりました。まぁ妥当でしょう。

### 元々のクラスにメソッドがあった場合

たとえばusingのために以下のクラスがあったとしましょう。

```hx:Foo.hx
class Foo{
	public static function copy(a){
		return ["foo"];
	}
}
```

さて、Arrayにはcopyメソッドがあります。ので、Fooをusingしても、Foo.copyメソッドは呼び出されません。

```hx:Sample.hx
using Foo;
using Foo;

class Sample{
	public static function main(){
		trace(Foo.copy([1,2,3])); // => ["foo"]
		trace([1,2,3].copy()); // => [1,2,3]
	}
}
```

### using同士で競合している場合

以下のFooとBarクラスがあったとします。

```hx:Foo.hx
class Foo{
	public static function copy(a){
		return ["foo"];
	}
}
```

```hx:Bar.hx
class Bar{
	public static function copy(a){
		return ["bar"];
	}
}
```

これを、このように呼びだします。

```hx:Sample.hx
using Foo;
using Bar;

class Sample{
	public static function main(){
		trace(1.copy()); //=> [“bar"]
	}
}
```

このように、Barのメソッドが優先されます。

以上です。

次は僕じゃないれすよー!!!
6日目は@hatchineeさんですよろしくおねがいします。
Project Euler No. 5


# Problem

> $2520$ is the smallest number that can be divided by each of the numbers from $1$ to $10$ without any remainder.
> 
> What is the smallest positive number that is evenly divisible by all of the numbers from $1$ to $20$?

# Code in Haskell

```haskell:Euler_005.hs
module Main where

-- ユークリッドの互除法そのまま （追記　←　大嘘）
greatestCD a 0 = a
greatestCD a b
  | a>=b = greatestCD b (a - b)
  | a<b  = greatestCD b (b - a)

{- 
　コメント欄で教えていただきました。
　こっちが本来の「ユークリッドの互除法」で
これなら計算も一瞬で終わります……実に（私の頭が）ひどい。

greatestCD m 0 = m
greatestCD m n = greatestCD n (mod m n)

-}


-- LCMは積をGCDで除したもの
leastCM a b = a*b `div` (greatCD a b)
leastCMofALL as = foldl leastCM 1 as

main = print answer
  where answer = leastCMofALL [1..20]
```

これは予想通り恐ろしく遅い。$1$から$20$ならなんとかなるが、$1$から$30$までにしてみると、もうまったく終わらない。

> 追記　上のコード内のコメントにある通りで、「ユークリッドの互除法」は悪くない。残念なのは私でした。きちんとしたヴァージョンだと爆速で終わるので、下記のものはまったく余計な代物です。でも恥の証として残しておく。

そこで、$1$から$n$までを素因数分解して、各素因数ごとに指数の最大値を取って合成するという方策を取ってみた（その方策を実行する仕方がダサいのは私が情弱だからである）。素因数分解はProblem No. 3のものを転用する：

```haskell:Euler_005bis.hs
module Main where
import Control.Applicative
import Data.List
import Data.Ord (comparing)
import System.Environment (getArgs)

factoring n fs (x:xs)
  | n == 1 = fs
  | (mod n x == 0) = factoring (div n x) (x:fs) (x:xs)
  |otherwise = factoring n fs xs

factors n = group $ factoring n [] [2..n]
factorset n =  sortBy (comparing length) $ concat $ map factors [2..n]

reduce [] = []
reduce (x:xs)
  | or $ map (isPrefixOf x) xs = reduce xs
  |otherwise = x: reduce xs

build [] = 1
build (x:xs) = ((head x)^(length x)) * build xs

solve = build . reduce . factorset

-- コマンドライン引数で正整数を取って結果を返す
main =  solve<$>read<$>(!!0)<$>getArgs >>= print
```

明らかにムダがあるはずなのだが、それでもこれは見事に早かった。

# Answer

2*******0

# Comments
ちなみに$1$から$30$までだと$2329089562800$である。

# MEMO
mainがコマンドライン引数を取るときにはghciではmainではなく:mainを使うこと（情弱なので初めて知った）。
Ubuntuでroot権限で作業をしたい

元ネタは[こちらの記事](http://qiita.com/t-sagiri/items/0b21b8434d46513f3a7d)です。

Ubuntuでroot権限をとる時のお話です。


## そもそもなんでこんな話になるの？

Ubuntuは、デフォルトではrootがありません、、、と言うと少し語弊がありますが、要はrootでログインできません。
基本、sudoで作業をしてくださいということです。
セキュリティの観点から、ということです。


## ちょーめんどくさいんですけどー

普通に使用している分には特に面倒でもないのですが（クセにしちゃえば良いだけなので）、セットアップ時などはroot権限が必要な作業を長めにしますので、ちょっと面倒です。
GUI系でrootが必要な場合はパスワードを聞いてくるので特に問題ないのですが、端末側での作業がちょっと面倒ですね。

そういう時は、

```
sudo su -
```

以上です。


## どういうこと？

rootが本当に「存在しない」わけではありません。
普通には使えないようになっているだけです。
sudoでsuすればいいのです（わかりにくい、、、）。

これなら、sudoersに含まれていないユーザはroot権限がとれないので、少し安全ですね。ということです。きっと。


元ネタの記事のように、rootにパスワードを与えてしまえばそれはそれでいいのですが。
あとでrootのパスワードを削除する（そうすれば元の状態に戻る）のも面倒ですし、忘れそうなので、こんな風にしています。


## rootでログインしたいときは？

その場合は、やはりrootにパスワードを与えるしかありません。
でも、rootでログインしたい時って、そんなにありません。過去に何かあったような気がしますが忘れちゃいました。
phpmyadmin

再投稿させていただきます。
タイトル通りなんですが、phpmyadminについてです。
以下、マニュアル通りFFFTPツールにてサーバーにアップ致しまして
http://www.alpha-prm.jp/support/tool/php/index.htm
アクセスしようと試みて、
http://www.ドメイン名/phpmyadmin/
と、入力したんですが『ページが見つかりません。』
と、表示されます。
どこをどう直せばphpmyadminが表示されるんでしょうか？
サーバーにアップしたphpmyadminのファイル名を直接入力すると内容は表示されます。
しかし、ながら
http://www.ドメイン名/phpmyadmin/
を入力すると、ダメです。
以上、宜しくお願い致します。
Project Euler No. 4


# Problem

> A palindromic number reads the same both ways. The largest palindrome
made from the product of two 2-digit numbers is $9009 = 91 \times 99$
> 
> Find the largest palindrome made from the product of two 3-digit numbers.

# Code in Haskell

```haskell:Euler_004.hs
module Main where

isPalindrome = (\a -> a == reverse a) . show
	
main = print answer
  where
    answer = maximum $ filter isPalindrome $ pstream
    pstream = [ x*y | x<-[100..999], y<-[100..999]]
```

# Answer
9****9
redhat固有のノウハウ

redhat社へのTEL
============
朝9時から電話窓口が開いています。

* 0120-266-668 に電話して、1 を押すとつながります。

前の担当者がいなくなって登録情報がわからない場合
============
`レッドハット照会番号`を伝えれば大丈夫です。

OSインストール時、インストール番号入力欄があります
============
![](https://access.redhat.com/site/documentation/resources/docs/ja-JP/Red_Hat_Enterprise_Linux/5/html/Virtualization/images/install_number.png)

[参照](https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/5/html/Virtualization/chap-Virtualization-Guest_operating_system_installation_procedures.html)

kickstartを使う場合は `key XXXXXXXXXXX`という行で指定できます。

サブスクリプション未登録時の警告メッセージ
=============
以下メッセージが毎日4時に出力される。

```bash:/var/log/messages
rhsmd: In order for Subscription Manager to provide your system with updates, your system must be registered with the Customer Portal. Please enter your Red Hat login to ensure your system is up-to-date.
```

サブスクリプション登録している場合、これは出ていても大丈夫です。(TELで確認しました。)
ですが止める方法は[公式ページ](https://access.redhat.com/site/ja/node/69764)より以下抜粋

```bash:
# yum remove subscription-manager subscription-manager-firstboot
```

snmpdが/var/log/messagesに1日1万行出力する件
============

これはCentOSでも一緒かも。

```diff:/etc/sysconfig/snmpd.options
$ diff -u snmpd.options.org snmpd.options
--- snmpd.options.org	2013-12-05 07:51:11.000000000 +0900
+++ snmpd.options	2013-12-05 07:55:01.000000000 +0900
@@ -1,2 +1,16 @@
 # snmpd command line options
 # OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"
+OPTIONS="-LS 5 d -Lf /dev/null -p /var/run/snmpd.pid -a"
+
+##
+# snmpdのlogが/var/log/messagesに大量に出力されるのを抑止
+# LogLevel
+##
+# 0: LOG_EMERG
+# 1: LOG_ALERT
+# 2: LOG_CRIT
+# 3: LOG_ERR
+# 4: LOG_WARNING
+# 5: LOG_NOTICE
+# 6: LOG_INFO
+# 7: LOG_DEBUG.
```

```bash:
# service snmpd restart
```
Scala/Play!でFirePHP(Wildfireプロトコル)を使って端末側でログを見る

12/5のScala Advent calendarは、Wildfireプロトコル(FirePHP)を使うというネタです。なぜScalaなのにPHPという単語が出てくるのか。FirePHPにはクライアント側の拡張により、サーバー上のログをクライアント側で確認できる機能があります。HTTPのヘッダに一定の記述することでそれをクライアント側で解釈しデバッグコンソールで表示するというものです。クライアントとしては、FirefoxならばFirebug+FirePHP, ChromeならばWebugなどの拡張を導入することで使用可能になります。

[FirePHP Wiki | Reference / Protocol](http://www.firephp.org/Wiki/Reference/Protocol) にWildFireプロトコルが乗ってますが、Scalaでそれを生成するコードとしてはこんな感じでしょうか。

``` scala
package utility

import play.api.libs.json._

class Wildfire {
  var structureIndex = 1
  var msgIndex = 1
  val msg = scala.collection.mutable.Map[String, String]()

  def toHeaderMap(): Map[String, String] = {
    msg("X-Wf-Protocol-1") = "http://meta.wildfirehq.org/Protocol/JsonStream/0.2"
    msg("X-Wf-1-Plugin-1") = "http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3"
    msg("X-Wf-1-Structure-1") = "http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1"
    msg("X-Wf-1-Index") = (msgIndex - 1).toString

    msg.toMap
  }

  def put(text: String, meta: Map[String, String]) {
    val content = JsArray(Array(Json.toJson(meta), JsString(text))).toString
    msg(s"X-Wf-1-${structureIndex}-1-${msgIndex}") = s"${content.length}|${content}|"
    msgIndex += 1
  }
}
```

Wildfireクラスのインスタンスを作り、putメソッドでログを生成し、toHeaderMapメソッドで、HTTPヘッダ用のMapを生成できます。Play!で記述したサンプルとしては以下の通りです。

``` scala
package controllers

import play.api._
import play.api.mvc._

import play.api.libs.iteratee.Enumerator

import utility.Wildfire

object Application extends Controller {

  def index = Action {
    val wildfire = new Wildfire()
    wildfire.put("hoge", Map("Type" -> "ERROR", "File" -> "Application.scala", "Line" -> "0"))
    val headers = wildfire.toHeaderMap() + (CONTENT_TYPE -> "text/plain")
    SimpleResult(
      header = ResponseHeader(OK, headers),
      body = Enumerator()
    )
  }
}
```

Webug だと、Developer Tools のコンソールにこのようなログが出力されます。
![webug.jpg](https://qiita-image-store.s3.amazonaws.com/0/3134/7a74c0c7-8961-aa42-f37c-61c614c21b05.jpeg)
Project Euler No. 3


# Problem

> The prime factors of $13195$ are $5$, $7$, $13$ and $29$.
> 
> What is the largest prime factor of the number $600851475143$ ?

# Haskell Code

```haskell:Euler_003.hs
module Main where
import Data.List
 
-- (x:xs)は自然数の列で、小さい方からnを除算をしていく。
-- 剰余が0ならもう一度その同じ数で除算し、
-- そうでないなら次の自然数で除算するという再帰。

factoring n fs (x:xs)
  | n == 1 = fs
  | (mod n x == 0) = factoring (div n x) (x:fs) (x:xs)
  |otherwise = factoring n fs xs

main = print answer
  where 
    answer = maximum $ factoring n [] [2..n]
    n = 600851475143
```

# Answer

6**7
puppet入門7 ファイルに変更があった時にサービスをrestartさせる

* [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)


`notify`と`source`、そして該当する`service`の指定を行えばよい。
ファイルの内容だけでなく、owner,group,modeのどれかが変わってもサービスがrestartします。

```puppet:
node 'puppetmaster.safe' {
  file { ['/etc/sysconfig/snmpd.options']:
      owner   => 'root',
      group   => 'root',
      mode    => '755',
      require => Package['net-snmp'],
      notify  => Service['snmpd'],
      source => 'puppet:///rhel5/etc/sysconfig/snmpd.options',
  }

  service { 'snmpd':
    enable  => true,
    ensure  => running,
    require => Package['net-snmp'],
  }
}
```
MojoliciousのJSON出力で文字化け

MojoliciousでJSON-APIを作るのは普通に行うと思いますが、
JSON文字列をHTML内に出力するというケースもあるでしょう。
そんな時に、文字化けに遭遇したのでご紹介します。
下記サンプルコードを見てください。

```pl
package MojibakeApp::Example;
use Mojo::Base 'Mojolicious::Controller';
use Encode 'decode';

# This action will render a template
sub welcome {
  my $self = shift;

my $moji = {hello => "文字化け"};
my $json = $self->render(
json => $moji , partial => 1);

$self->app->log->debug($json);
print Dumper($json);

$self->render(
   message => $json);

```

```html
% layout 'default';
% title 'Welcome';
<script>var hoge= <%= $message %>
</script>
```

この文字化けに遭遇したときは、原因が最初よくわかりませんでしたが、
ログ出力でその原因がわかりました。
Mojoliciousのログファイルは文字化けしていたのですが、
ターミナルに出力したprintの出力結果が文字化けしていなかったのです。
そうです。render(partial)した結果がバイト列になっているのです。

下記のようにdecodeで一旦、テキスト文字列に引き戻してやることで
文字化けを回避することができました。

```pl
my $json = $self->render(
 json => $moji , partial => 1)->decode;
```

小ネタではありますが、筆をおきます。
書いていてこれはMojoliciousのバグなのでは？！
とも思うようになってきて若干不安です。

さて、次回はazumakuniyukiさんということで、期待高まります。
よろしくお願いします。
directory of dotfiles



OSごとの設定は、`os_hoge/`に置きます｡例えば､Linuxなら`os_linux`などです。

各種ツールは、`.hoge/`などに置きます。例えば､`.zsh`などです。

シェルスクリプトは、`bin/`に置きます。

ダウンロードした圧縮ファイルは、`tmp/`に置きます。

お気に入りフォントやパッチを当てたフォントは、`.fonts/`に置きます。


```bash:~/dotfilesのディレクトリ例
├── .fonts
├── .sublime-keymap
├── .sublime-settings
├── .tmux
├── .tmux.conf
├── .vim
├── .vimrc
├── .zsh
│   └── functions
│       └── _download-manager-zsh
├── .zshrc
├── README.md
├── bin
│   ├── dotfiles_doc_add
│   ├── download-manager-zsh
│   ├── iterm_window_transparency
│   └── used-mem-simple
├── doc
│   ├── dotfiles.txt
│   ├── download.txt
│   ├── keybind.txt
│   ├── memo.txt
│   ├── setting.txt
│   └── tips.txt
├── download.sh
├── os_cygwin
│   └── .zshrc
├── os_linux
│   └── .zshrc
├── os_mac
│   ├── .sublime-keymap
│   ├── .sublime-settings
│   ├── .tmux.conf
│   └── .vimrc
├── os_windows
│   └── profile.ps1
├── package.sh
├── setup.sh
└── tmp
```

##setup.sh

`setup.sh`は、各種設定ファイルへのシンボリックリンクと`download.sh`、`package.sh`の実行を書きます｡

初期のセットアップに行うファイルのダウンロードは`download.sh`に書きます｡

初期のセットアップに行うパッケージマネージャーのコマンドは`package.sh`に書きます｡


これらは、以下のようなコマンドで実行できるようにしておきます｡

```
$ curl -L https://raw.github.com/syui/dotfiles/master/setup.sh | sh
```

`setup.sh`の中身は､以下の様な感じになります。


```bash:~/dotfiles/setup.sh
#!/bin/bash

# dotfilesのダウンロード
git clone https://raw.github.com/syui/dotfiles.git

# シンボリックリンク
file="{.zsh,.zshrc,.tmux,.tmux.conf,.vim,.vimrc}"
ln -s $HOME/dotfiles/$file $HOME/$file

# ダウンロード
. ~/dotfiles/download.sh

# パッケージ
. ~/dotfiles/package.sh
```

あと、補足としては､OSを自動判定し､シンボリックリンクを貼るようにすれば、便利です｡
setup.sh


`dotfiles`という設定ファイルの集まりは、`setup.sh`というシェルスクリプトで自動設定する人が多いです｡

ここで、よく使用されるコマンドを見て行きたいと思います｡

##シンボリックリンク

シンボリックリンクというのは、ファイルやディレクトリの別名みたいなものです。

```bash:
$ ln -s （リンクを張られるファイル名） （リンク名）

$ rm （削除するリンク名）
```

ちなみに、シンボリックリンクは、リンク名の最後に「/」を入れると削除できませんので注意です｡

他のコマンドについては､後で追記していく予定です。

```bash:
unlink (削除するリンク名）
```
Cling Metaprocessor

## Metaprocessor

[Cling]のページに、Metaprocessorの説明があります。
これ以外にもいくつかのコマンドがhelpにありました。

### .q

Clingを終了します。

### .help

Clingのヘルプを表示します。

### .L Library

ライブラリまたはファイルを読み込みます。

    [cling]$ .L z
    [cling]$ #include <zlib.h>
    [cling]$ zlibVersion()
    (const char *) "1.2.8"

`.L z`でも`.L libz`でも、`.L libz.so`でも同じでした。

ライブラリが見つからない場合、内部で`#include "Library"`が呼ばれます。
それも見つからない場合、次のようなエラーが発生します。

    [cling]$ .L Library
    input_line_4:1:10: fatal error: 'Library' file not found
    #include "Library"
             ^

ライブラリが読み込まれていない状態でライブラリの関数などを呼び出すと `ExecutionContext: use of undefined symbol '...'!`が発生します。

Ubuntuのパッケージなどでインストールした場合、soファイルが `/usr/lib`ではなく、 `/usr/lib/x86_64-linux-gnu`などに置かれていることがあります。
そのため、`.L`で読み込もうとしてもパスの通った場所にsoファイルが存在せず、インクルードと解釈され、さらに同名のファイルが存在しなければ上記のエラーが発生します。
この場合、 `cling -L/usr/lib/x86_64-linux-gnu`のように実行時にオプションを用いてライブラリパスを通す必要があります。

### .I path

インクルードパスを設定します。
cling実行時に`-I`オプションを付けるのと同じです。

### .x filename.cxx

この例の場合、filename.cxxを読み込み、`void filename()`が存在したら実行します。
filenameは任意のファイル名です。

もしファイル内に関数が存在しないなら、次のようなエラーが発生します。

    input_line_5:2:2: error: use of undeclared identifier 'filename'
     filename()
     ^

### .rawInput

インタプリタで関数を宣言すると、以下のようなエラーが発生します。

    [cling]$ #include <iostream>
    [cling]$ void test(){
    [cling]$ ?   std::cout << "Hello World!" << std::endl;
    [cling]$ ?   }
    input_line_5:2:13: error: function definition is not allowed here
     void test(){
                ^

関数の前後に`.rawInput`を入力することで解決します。

    [cling]$ #include <iostream>
    [cling]$ .rawInput
    Using raw input
    [cling]! void test(){
    [cling]! ?   std::cout << "Hello World!" << std::endl;
    [cling]! ?   }
    [cling]! .rawInput
    Not using raw input
    [cling]$ test()
    Hello World!

### .printAST

ヘルプの説明を直訳すると抽象構文木を表示するとかなんとか…。

試してみたところ、次のようになりました。

    [cling]$ .printAST
    Printing AST
    [cling]$ int a = 123;

    -------------------Declaration---------------------
    FunctionDecl 0xb2cd0b0 <input_line_4:1:1, line:4:1> __cling_Un1Qu30 'void (void)'
    `-CompoundStmt 0xb2cd188 <line:1:24, line:4:1>
      |-DeclStmt 0xb2cd168 <line:2:2, col:13>
      | `-VarDecl 0xb2cd120 <col:2, col:10> a 'int'
      |   `-IntegerLiteral 0xb2cd150 <col:10> 'int' 123
      |-DeclRefExpr 0xb2cd1a8 <col:14> 'int' lvalue Var 0xb2cd120 'a' 'int'
      `-NullStmt 0xb2cd178 <line:3:1>
    
    ------------------Declaration Body---------------
    CompoundStmt 0xb2cd188
    |-DeclStmt 0xb2cd168
    | `-VarDecl 0xb2cd120 a 'int'
    |   `-IntegerLiteral 0xb2cd150 'int' 123
    |-DeclRefExpr 0xb2cd1a8 'int' lvalue Var 0xb2cd120 'a' 'int'
    `-NullStmt 0xb2cd178
    
    ---------------------------------------------------
    [cling]$ .printAST
    Not printing AST

## Reference

* [Cling | ROOT][Cling]
* [cling goes public! | ROOT][ref-1]
* [cling - Lambda The Ultimate][ref-2]

[Cling]: http://root.cern.ch/drupal/content/cling
[ref-1]: http://root.cern.ch/drupal/content/cling-goes-public
[ref-2]: http://ustcscgy.github.io/wiki/cling.html
IE10以上で有効になるCSS

## もう、IE専用CSSを書くのは嫌だぉ……(´；ω；｀)
全国２兆6,474万1300人のIE6-8が嫌いなプログラマ＆コーダ＆デザイナの皆様ごきげんよう。
世の中には色々な需要がありまして、相変わらずIE専用のCSSが必要になる事が稀によくある昨今です。
殆どのCSSをまともに解釈してくれるIE10以降のIE君なのですが、過去のQuirks Modeという呪縛から相変わらず逃げ切れておらず、最近、IEのメンテをしてるMicroSoft社員が可哀想にすら感じています。

##  前振りは良いからコードはよ（バンバン）

```fix.css
/* IE10-specific styles go here */
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
	display:block;
}
```
参考URL[http://www.impressivewebs.com/ie10-css-hacks/](http://www.impressivewebs.com/ie10-css-hacks/)

## ちなみに
なんか、面白いんだけれど、Quirks Mode が有効になっていると、:after擬似要素が無効になるんですね、IEって。
IE滅べというより、IEに特化したHTML書いてるサイト滅べって思いました。
以上です
Asset Catalog への画像リソース追加をシェルスクリプトで楽に行う

Xcode 5 で追加された Asset Catalog は、画像リソースの管理に使うと便利です。
画像リソースをいじってもプロジェクトファイルが変更されないので、バージョン管理ツールでのコンフリクトが起こりにくくなります。また、非 Retina 画像と Retina 画像をペアにして管理できます。

しかし、Xcode 上で `Images.xcassets` に画像ファイルを追加しようと思うと、画像ファイルを所定の場所にいちいちドラッグ＆ドロップしなくてはいけないため、面倒であり、間違いも発生しやすいです。

実は、`Images.xcassets` は非常に単純な構成になっています。単に `imageset` というフォルダの中に、画像ファイルそのものと、`Contents.json` というファイルがあるだけです。
このため、スクリプトを作って処理を自動化することができます。

実際に、スクリプトを書いてみました。

* [generate_xcassets.sh](https://gist.github.com/usami-k/7784440)

これで、だいぶ楽ができます。

# スクリプトの使い方

使い方は次のとおりです。

1. フォルダを新規に作り、そこに画像ファイルたちを入れます（`aaaa.png` と `aaaa@2x.png` といったペアになるファイルを両方入れておきます）。
2. そのフォルダで、上記のシェルスクリプトを実行します。すると、`imageset` フォルダが自動で作成され、その中に画像ファイルが移動し、`Contents.json` が作成されます。
3. できた `imageset` を `Images.xcassets` フォルダに入れると、Xcode が自動的に認識してくれます。

# 実行例

フォルダ内に次のようなファイルがあるとします。

* `aaaa.png`
* `aaaa@2x.png`
* `bbbb.png`
* `bbbb@2x.png`
* `cccc.png`
* `cccc@2x.png`

このフォルダでスクリプトを実行すると、次のようになります。

* `aaaa.imageset`
	* `aaaa.png`
	* `aaaa@2x.png`
	* `Contents.json`
* `bbbb.imageset`
	* `bbbb.png`
	* `bbbb@2x.png`
	* `Contents.json`
* `cccc.imageset`
	* `cccc.png`
	* `cccc@2x.png`
	* `Contents.json`

# 補足

ごく単純なスクリプトであり、エラー処理や気のきいた機能などはありません。いろいろと改良の余地はあると思います。
【失敗】スマホで自動フォーカス

【やりたいこと】
input textなどのフォームの入力が終わった後に
次の項目へ勝手にフォーカスを当てる

【結論】
Androidのエンターキーの挙動が
そもそも機種によって違う。
（モノによっては即、サブミットしました）

【試したこと】
・onchangeでフォーカスを次の項目へ
移るものもあれば移らないのも・・・
移ってもキーボードがなくなっちゃうなどなど・・・

・エンターキーの検出
上と同じ結果に

【感想】
今回僕がやった方法は生のjavascriptだったのでもしかしたらjQueryとかで
ごにょごにょしたら出来たのかもしれません。
Project Euler No. 2



# Problem No. 2

> Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with $1$ and $2$, the first 10 terms will be:
> 
> $1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...$
> 
> By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

# Haskell Code

```haskell:Euler_002.hs
module Main where

{-
     1:2:x:y:... fibo
     + + +
 (1:)2:x:y:...   tail fibo
     = = =
 1:2:x:y:z:...   fibo
     = = =
     3 5 8
-}

fibo = 1:2: zipWith (+) fibo (tail fibo)
main = print $ sum $ filter even $ takeWhile (n<4*10^6) fibo
```

# Answer

4*****2

# Comments

ということは三項間漸化式はみなこの形で書ける。$s_{n+2} = a s_{n+1} + b s_{n} + c$を考えると、最初の二項を$x$と$y$として：

```haskell:LazySeries.hs
series a b c x y = 
  x:y: zipWith (\x y -> a*x+b*y+c) (series a b c x y) (tail $ series a b c x y)
fibo = series 1 1 0 1 2 
```

なのだが、唖然とするほど遅い。無理。zipWithが遅延評価なせいだ、と思い込んで正格評価版 zipWith'を使ってみても

```haskell:EagerSeries.hs
zipWith' f (a:as) (b:bs) = x `seq` x : zipWith' f as bs
  where  x = f a b
zipWith' _ _ _ = []

series' a b c x y = 
  x:y: zipWith' (\x y -> a*x+b*y+c) (series' a b c x y) (tail $ series' a b c x y)
fibo' = series' 1 1 0 1 2 
```

殆どなにも変わらず恐ろしく遅い（ちなみに series' 1 0 0 1 1を評価させてみるとかなり笑える）。最初に目にして以来、カッコいいし効率的で速いと思っていた……実に情弱である。
Groongaのdumpとgrndumpのメモリ消費の違い


Groongaではdumpコマンドを利用すると、データベースのダンプを取ることができます。

[8.3.14. dump — Groonga v3.1.0ドキュメント](http://groonga.org/ja/docs/reference/commands/dump.html) 

しかし、ダンプするデータを一度メモリにロードする実装になっているようで、メモリが足りないとダンプできず困っていました。

そんなときに`grndump`を使うと良いという噂を目にしたので実験してみました。

> hirose31
> dumpコマンドはメモリ食うのでgrndumpでストリームなダンプとった方がいいらしい（要確認）
> http://b.hatena.ne.jp/hirose31/20131114#bookmark-169201846


##grndumpとは

`grndump`は以下の記事の後半にある通り、rroongaをインストールすると使えるようになるコマンドです。

[groongaのデータベースをダンプ・リストアする方法 - Qiita [キータ]](http://qiita.com/groonga/items/7642e9e22bcda4b4327f)


Rubyがインストールされた環境であれば、以下のようにしてrroongaをインストールすることで`grndump`コマンドを利用できるようになります。

```sh
$ sudo apt-get install libgroonga-dev 
$ sudo gem install rroonga
```

## 実験環境

実験環境として、VirtualBox + Vagrantで以下の環境を作りました。

- OS: Ubuntu 12.04 x86_64
- Groonga / rroonga: v3.1.0
- Memory: 512MB
- Swap: 512MB

ちょっとメモリが少なすぎますが、データベースサイズに対してメモリが少ない環境ということで。


## 実験内容

以下の2つのコマンドでダンプを取った時のメモリ消費量を比較します。

```sh:dump
$ groonga db/db dump > dump-groonga-dump.grn
```

```sh:grndump
$ grndump db/db > dump-grndump.grn
```


なお、dumpしたいDBのサイズは5.6GBです。

```sh
$ du -sm db
5611	db
```

メモリ消費量の計測は以下のページを参考にしました。

[特定プロセスのプロセスメモリ使用量の推移をとりつづける - runny egg’s diary](http://d.hatena.ne.jp/lake_michigan/20130125/1359077539)


## 実験結果

結果は次のようになり、確かにgrndumpはメモリが少ない状況でも正常にダンプできました。

- dump：途中でKillされる
- grndump：正常に終了する

メモリ消費量をプロットすると、下図のようになりました。

![Groonga_dumpのメモリ消費.png](https://qiita-image-store.s3.amazonaws.com/0/4240/1f30f81d-65f7-2e1e-0b8d-93d49ddc5403.png "Groonga_dumpのメモリ消費.png")


##結論

現時点では、メモリが足りなくてdumpできないときにはrroongaの`grndump`を使うと良いです。他にも`grndump`は上で紹介した記事にあるように、いろいろなオプションがあり便利なコマンドです。

ちなみに、メモリが十分にあるときはGroongaのdumpのほうが速くダンプできました。Groongaのdumpでもストリームのダンプができるようになると嬉しいです。
Google PlayのTop Grossing 100に入っている+その他のタイトルでどのくらいcocos2d-xが使われているのか調べてみる

概要
=============

こんにちは。数ヶ月前から趣味でcocos2d-xをさわり始めました。リリースした初日から遊んでいたブレイブフロンティアやGoodiaのアプリがcocos2d-xで作られているのを知り、知っているアプリの中でどれが、cocos2d-xで作られているのか興味を持ちました。

今回のブログでは、2013年12月3日の時点でGoogle PlayのTop Grossing 100位以内とその他、私が興味を持って、cocos2d-xで作られているかもと思ったアプリを調べて、cocos2d-xで作られているかどうか判定していきます。

調べ方
=============
cocos2d-xで作られているかどうか判定するのはどのようにするかといいますと、今回は、*.apk内にある*.soを判断して判定します。cocos2d-xの場合は<PROJECT_ROOT>/proj.android/jni/Android.mkのLOCAL_MODULE_FILENAMEにlibgameと書いてあるので、libgame.soファイルがあればcocos2d-xと判定します。

調査結果
=============
ではいきなりですが調査結果です。Google Play Top Grossing 100位の中で、以下のアプリがcocos2d-xを使っていました。

* LINE PLAY
* 三国志パズル大戦
* LINE Bubble!
* 究極キャッスル攻防戦 - Castle Clash
* ZOOKEEPER BATTLE
* LINE I Love Coffee

その他興味のもったアプリを調べたところ以下もcocos2d-xでした

* にゃんこ大暴走
* ドン★パッチン

注意: 半分手動で調べたので間違っていたら訂正致します。
![Examination of apps made with cocos2d-x 20131203-5.png](https://qiita-image-store.s3.amazonaws.com/0/30079/d2b16a51-4592-9722-fd65-ffb353b4332e.png)
![Examination of apps made with cocos2d-x 20131203-6.png](https://qiita-image-store.s3.amazonaws.com/0/30079/e8643a1b-07d8-5b44-8a53-7779edc47327.png)
TANITAの体重計BC-569では、FlashAirを使用できない。


[TANITAの体重計BC-309で、PQI Air Cardが使用できない](http://d.hatena.ne.jp/iww/20130804/1375619137)

4ヶ月くらい前のブログだけど、私も別の機種で試していたので備忘録として。

タイトルの通りですが、TANITAの体重計BC-569ではFlashAirの無線LAN機能は使用できませんでした。
一眼レフとかでは問題なく動作します。

推測ですが、体重計だとSDカードへの書き込みは一時的かつ書き込みサイズが小さいので、通電している時間が極端に短いからと思っています。

一般的に、無線LANではSSID＋パスワードのネゴシエーションをしますが、その時間もないまま、切れてしまっているのかと。

それにしても、Qiitaに書くことだろうか。。。
MiddlemanでOGPデータをyamlを使って極力少ない労力で書く



アドベントカレンダー2013 2日目の記事です。
[Middleman Advent Calendar 2013 - Adventar](http://www.adventar.org/calendars/251)

----

ogpを書くにあたって、重複しまくりなものをできるだけ重複しないようにyamlで書いてみよう！わたしたち人間は怠惰だから！

## 今北産業
* yamlのアンカーとエイリアスを使う →  [Rubyist Magazine - プログラマーのための YAML 入門 (初級編)](http://magazine.rubyist.net/?0009-YAML#l10)
* でも、エイリアスでは文字列の連結ができない → [YAMLのアンカー&エイリアス ](http://d.hatena.ne.jp/repeatedly/20090305/1236189504)
* yamlを`data/opg.yml`に置くと、slim側で`data.ogp.description`と書けば使える

## 以下ソース
重複しないように、と思ったけど、これではあまり意味がない感じがする。
が、使用するslim側ではあまりデータの意識をせずに`line.text`などと書けるのでよしとしよう。でも、やっぱり使いにくい。


``` ogp.yml
url: &url
  'http://www.hoge.com/hoge/?jp=日本語'
title: &title
  'titleです'
description: &description
  'descriptionです'
keyworkds: &keyworkds
  'key,words'

&test: 1

twitter:
  lang: 'ja'
  hashtags: 'middleman'
  site: *title
  text: *title
#  text: "#{*title} #{*description}" # 無理
#  text: *title + ' | ' + *description # 無理
line:
  text: *title
  link: *url
fb:
  app_id: '1234'
og:
  locale: 'ja_JP'
  images: ['http://hoge.com/ogp.jpg']
  url: ''
  title: *title
  site_name: *title
  description: *description

```


``` _meta.slim
meta name="keywords" content="#{data.ogp.keywords}"
meta name="description" content="#{data.ogp.description}"

meta property="og:type" content="company"
meta property="og:locale" content="ja_JP"
meta property="og:url" content="#{data.ogp.og.url}"
meta property="og:title" content="#{data.ogp.title}"
meta property="og:site_name" content="#{data.ogp.og.sitename}"
meta property="og:description" content="#{data.ogp.og.description}"
- data.ogp.og.images.each do |image|
  meta property="og:image" content="#{image}"
meta property="fb:app_id" content="#{data.ogp.fb.app_id}"


/Twitter
meta name='twitter:card', content='summary_large_image'
meta name='twitter:domain', content='hoge'


link href="/favicon.ico" rel="shortcut icon"
```

```  _social_btn.slim
.socialBtns
  ul
    / fbはiframe版のもの
    li.facebook
      - encodedFBUrl = URI.escape(data.ogp.url)
      iframe.fb-like src='//www.facebook.com/plugins/like.php?href=#{encodedFBUrl}&send=false&layout=button_count&width=130&show_faces=false&font&colorscheme=light&action=like&height=21&appId=#{data.ogp.fb.app_id}', scrolling='no', frameborder='0', style='border:none; overflow: hidden; width:130px; height:21px;', allowtransparency='true'
    li.twitter
      a href="https://twitter.com/share" class="twitter-share-button" data-lang="ja" data-url="#{data.ogp.url}" data-text="#{data.ogp.title} #{data.ogp.description}" data-hashtags="#{data.ogp.twitter.hashtags}"
    li.line
      - lineURL = URI.escape(data.ogp.line.text + ' ' + data.ogp.line.link)
      a href="http://line.naver.jp/R/msg/text/?#{lineURL}": img src="img/sp/linebutton_88x20.png" width="88" height="20" alt="LINEで送る"
```
Riakの利点を考えてみる

スライドにまとめて上げた。[これ](http://www.slideshare.net/scixer/riak-28885715)。
（最近僕が作ったけど深遠な理由により表に出ることが無くなったのだ）

まとめると、僕にとっての、Riakを使う魅力は、

* 運用が簡単であること
* 耐障害性があること

だ。

これらは、Riakがマスターレスで、等価であることによる恩恵である。
riakクラスタを作って、アプリケーションからのアクセスをバランシングするだけで冗長構成が出来上がる。
マスターレスなので、どのノードが壊れてもシステムは止まらない。
素晴らしい！！

また、Erlangで書かれているというのも特徴だ。
これには賛否両論があるだろうが、僕はRiakを知って、Erlangを勉強し始めた。
最初は独特のシンタックスに戸惑ったが、それを乗り越えていると実は読みやすいということを実感した。
関数型といってもHaskellくらい大変なものじゃないし、タプルを使ったパターンマッチは明快で読みやすい。
OTPというフレームワークに沿った記述がなされているので、属人性が少なく、メソッドひとつあたりのコード量も少ない。
一回Riak SCRに参加した後だと普通に読める。

ということで、ぜひRiak SCRに行ってみよう！！

（ネタ枯渇 & 8分の時間オーバーさーせん...orz）
1分で複数マシンにiTerm2を使ってSSHログインを決める

iTerm2でおもむろに画面を分割します。

![Screen Shot 2013-12-04 at 10.08.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/153/9196abd9-e723-0417-b2be-c120a07534eb.png)

次にそれぞれの画面で異なるホストへのsshコマンドを書きます（まだ実行しない）

![Screen Shot 2013-12-04 at 10.07.59 PM.png](https://qiita-image-store.s3.amazonaws.com/0/153/49ecb9a2-ad0e-ba3d-13b9-86d4b33f5960.png "Screen Shot 2013-12-04 at 10.07.59 PM.png")

そしておもむろにshift+command+iを押します

![Screen Shot 2013-12-04 at 10.09.00 PM.png](https://qiita-image-store.s3.amazonaws.com/0/153/b3f93f3e-2682-eabe-38f6-66751613807c.png)

enter

![Screen Shot 2013-12-04 at 10.10.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/153/e10744d0-efa8-965c-6bf3-d5b8f461fad3.png)

あとは適当に実行したいコマンドを打てば複数のマシンに同時に同じコマンドを実行できます。
ホスト数が増えるとダメだけど、数が少ないなら手軽で便利です。

### 注意

ヒューマンエラー発生率が高まるので、危険な操作はすべきではないです。