OmniAICreator/Qiita-1.07M huggingface dataset:
統計学メモ

* ランダムウォーク
* 見せかけの回帰
* 単位根過程
* 共和分
* 定常過程
    * 要はサイコロを降り続けて結果を記録している状態かな。
* 非定常過程
    * 前の結果を元に次の結果を得て、それを記録している状態（多分・・・・）
* 単位根検定
    * 系列が単位根過程なのかを確かめる。

***

* シャピロウィルク検定
    * データが正規分布に従っているか確かめる

***

* 雑感
    * データの分布、特性は何か？
    * 扱っているデータの質が分かっていないと、何の手法を使えば良いか分からない、間違える
    * 何のデータから何を知りたいのか、その結果、何を判断しようとしているのか。
* todo
    * 理論（本）と実践（紙とR）
mochaをCoffeeScriptで使おう

mochaをCoffeeScriptで書いたプロジェクトで上手く動かなかったのでメモ

```
$ npm install --save mocha chai
$ mkdir test
```
mochaでは何も指定が無いときは./test/*.jsを片っ端から舐めていきます。
しかし、CoffeeScriptの案件ですと一々コンパイルの手間がかかってしまいます。
mochaコマンド実行時に引数としてパラメータを渡しても良いのですが、使いまわすために`./test/mocha.opts`ファイルをコピペして作っておきましょう。

```:./test/mocha.opts
--compilers coffee:coffee-script/register
--reporter spec
--colors
```

`--compilers`は使用するCoffeeScriptのバージョンによって変わります。
### CoffeeScript 1.7.x以上の場合
`--compilers coffee:coffee-script/register`

### CoffeeScript 1.7.x未満の場合
`--compilers coffee:coffee-script`

他の紹介記事などが古かったために、ここでコケました。

その他のパラメータはいつものように設定して構いません。

## 実際に使ってみる
```coffeescript:./TestClass.coffee
class TestClass
    getModifyText:(text)->
        return "text is " + text
module.exports = TestClass
```
```coffeescript:./test/test.coffee
chai = require "chai"
assert = chai.assert

testClass = new (require "../TestClass")

describe 'Test TestClass.', ->
	it 'modify text', (done)->
		assert.equal testClass.getModifyText("hello"), "text is hello"
		done()
```
windowsから送られてきたzipファイルを解凍するとファイル名が大変なことになっている時

Windowsユーザーが生成したzipファイルをunzipコマンドで解凍するとファイル名が文字化けていることがある.やれやれ,nkfの出番かなと思ってやってみても,一向に解読できない．結局zipファイルの中身がちゃんと読み取れないままファイルにばらしちゃってるからダメなようだ．

```bash
unzip -O cp932 lovelive.zip
```

でok．ちなみにcp932はwindowsの文字コードのこと <http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000716.html>
Vagrant - rsyncでファイルを同期する(Windows)

# その前に、Vagrantとは何か？

[Vagrant入門 ～導入/配布/設定/プラグインの使い方～](http://qiita.com/daichi87gi/items/d5da33c76295ee32a735)に記載しました。

# Vagrantでrsyncを使う理由

Webシステムの開発でVagrantを使う場合において、テスト環境の仮想マシンへのデプロイにSynced Folderを使うと便利であったが、いくつかの欠点…　例えば、アクセス速度が遅い、パーミッションが変更できないなどの問題があった。

rsyncでファイルを同期すれば、パフォーマンスが向上し、パーミッションも変更できるようになる。

# Vagranfileの設定

## rsyncではない、フォルダ共有の場合

```rb:Vagrantfile
config.vm.synced_folder "./src", "/srv/website"
```

## rsyncで同期する
上記の設定に`type: "rsync"`を追加する。同期しないフォルダは`rsync__exclude: [".git/"]`のように追加する。

### 設定例

```rb:Vagrantfile
config.vm.synced_folder "./src", "/srv/website", type: "rsync", rsync__exclude: [".git/", ".idea/"]
```

設定はこれで終わり。

ただ、このまま実行すると、`rsync`が見つからないとのエラーが出る場合があります。
その場合はCygwinなどをインストールして利用する。

次、rsyncを使えるようにするための手順。

# Cygwinとrsyncをインストール

Cygwinをrsync付きでインストールする際は、下の画像のようにSelect Packageの画面で`Net > rsync`を選択する。

![cygwin_rsync.png](https://qiita-image-store.s3.amazonaws.com/0/37334/54007b50-866a-e0d6-d701-d9fdba19a72c.png)

## binフォルダにパスを通す。デフォルトではここ`C:\cygwin\bin`

## 再起動する。

# Vagrant upを実行する

`vagrant up`か`vagrant reload`を実行すると、次のエラーが出た。

```
rsync: change_dir "/c/path/to/project" failed: No such file or directory (2)
```

`/c`がローカルディスクCを参照していないためだと思われる。
参照させるため、シンボリックリンクを作成する。

## Cygwinでシンボリックリンクを作成
Cygwinを起動し、次のコマンドで`/c`がローカルディスクCを参照するようにする。

```sh
$ cd /
$ ln -s /cygdrive/c c
```

```sh
lrwxrwxrwx  1 Daichi None     11 6月   3 22:03 c -> /cygdrive/c
```

# 再度、Vagrant upを実行する

`vagrant up`か`vagrant reload`を実行する

今度は成功。
ゲストOSで同期されたディレクトリを確認する。

```
$ ls -l
drwxr-xr-x 7 vagrant vagrant 4096 Jun  3 12:50 project_name
```

このように、所有者とグループはvagrantになる。

# vagrant起動中に同期を実行する

`vagrant rsync-auto`コマンドを使います。

```
vagrant rsync-auto
==> default: Doing an initial rsync...
==> default: Rsyncing folder: /c/path/to/project/ => /srv/website
==> default: Watching: C:/path/to/project/
```

これでファイルの監視状態になり、ホストOSで更新したファイルは自動的にゲストOSに同期されます。

# 参考にしたサイト

* [Vagrant 1.5 で追加された Rsync Synced Folder が良い - Shin x blog](http://www.1x1.jp/blog/2014/03/vagrant-rsync-synced-folder.html)
* [(英語)ドキュメント - rsync](http://docs.vagrantup.com/v2/synced-folders/rsync.html)
Rails 3系でメモリにフラグメントキャッシュする。

---


Rails 4.0 では標準に採用されているようので、以下のgemのinstallは不要

```gemfile
gem 'cache_digests'
```
<https://github.com/rails/cache_digests>


```config/environments/production.rb
config.cache_store = :memory_store, { size: 64.megabytes, :expires_in => 3.minutes }
config.action_controller.perform_caching = true
```
上記の設定だと、メモリが64mbに達するか、3分以上経過した場合、キャッシュが無効となる。

開発環境でも動作確認するため、同様の設定をconfig/environments/development.rbにも行う。

```view
<% cache ['company', @company.code] do %>
…
<% end %>
```

キャッシュしたい部分を上記のようにブロックで囲む。
cacheの後の配列部分がキーになるので、この配列をキャッシュ対象のものでユニークになるように設定する。
Play で一部の path にだけ Filter をかけたい

Play には CSRF 対策を行う CSRFFilter や、GZip 圧縮のための GzipFilter が用意されている。これらの Filter を特定の path にだけ(もしくは特定の path を除いて)適用したかったので、ちょっとしたクラスを作った。

````scala:FilterOnly.scala
import play.api.mvc.{ RequestHeader, EssentialAction, EssentialFilter }
 
/**
 * Apply underlying filter only when f returns true.
 */
class FilterOnly(underlying: EssentialFilter, f: RequestHeader => Boolean) extends EssentialFilter {
  override def apply(next: EssentialAction): EssentialAction = new EssentialAction {
    private[this] val filteredNext = underlying(next)
    override def apply(rh: RequestHeader) = if (f(rh)) filteredNext(rh) else next(rh)
  }
}
 
object FilterOnly {
  implicit class EssentialFilterFilterOnlyImplicit(val filter: EssentialFilter) extends AnyVal {
    def only(f: RequestHeader => Boolean) = new FilterOnly(filter, f)
  }
}
````
https://gist.github.com/tkawachi/51a3daa23ea2dd27e0a4

`import FilterOnly._` とすれば `CSRFFilter().only(_.path.startWith("/target"))` というふうに、特定の path にだけ適用する Filter を既存の Filter から作れる。
`only()` に渡す関数の引数は `RequestHeader` なので、path 以外にもヘッダ情報をみて適用するか否かの判断をすることもできる。

きっと同じようなコードがどこかにありそうな気がするが、見つけられなかったので晒しておく。
paperclip tips


## programming での画像登録 using paperclip

scrapingで取得した画像をpaperclipでuploadしようとして調べたメモ。

```ruby:app/models/movie.rb
class Movie < ActiveRecord::Base
  has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png"
  end

```

```
movie = Movie.new
movie.image = File.open('file')
movie.save!
```

シンプルだった。
仮想ディレクトリの設定

仮想ディレクトリの設定
Apache上で仮想ディレクトリを設定する際は、httpd.confに対して、以下の設定を行う。

## apache2.4未満の場合

``` /etc/apache2/httpd.conf
Alias /~VirtuslDir/ /VirtualDir/

<Directory “/VirtualDir”>
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>
```

## apache2.4の場合
``` /etc/apache2/httpd.conf
Alias /~VirtuslDir/ /VirtualDir/

<Directory “/VirtualDir”>
    AllowOverride None
    Options None
    Require all granted
</Directory>
```
- Yosemiteからapacheのバージョンが2.4へとバージョンアップしているので、適時 **httpd.conf**の設定も書き換えておくこと。

## httpd.confを変更した後は
Apacheの再起動を行う必要がある。

``` apacheの再起動
$ sudo apachectl restart
```
How to update Cocoapods



##Caution about updating Cocoapads

When we use Cocoapods, sometimes we'll find error like this

>[!] The `master` repo requires CocoaPods 0.32.1 -

You may installed two or three Cocoapads into `/Users/name/.rbenv/shims/` or somewhere.


Once you should checked PATH using a command `type -a pod`.
Then it'll show like
>/Users/name/.rbenv/shims/pod
>/usr/bin/pod

So you should delete `/usr/bin/pod`(older one).

After that, once shutdown your terminal, then it'll be updated.(Don't forget to set new PATH)
SSH認証キーをGitHubへ設定する。（Mac用）

## SSH認証キーを作成する。

``` SSH認証キーの作成
$ ssh-keygen -t rsa
```
鍵の生成が完了すると、 **id_rsa(秘密鍵)** と **id_rsa.pub（公開鍵）** が、~/.ssh/に生成される。  
生成された **id_rsa(秘密鍵)** に対して念のため読み取り属性を与えておく。

``` 読み取り属性の与え方
$ cd ~/.ssh
$ chmod 600 id_rsa
```

## SSHでの接続を簡単にするために
~/.ssh/configに設定を追加しておく。なお、~/.ssh/configファイルがなければ新たに作成する。


``` ~/.ssh/config
Host github
	HostName		github.com
	IdentityFile	~/.ssh/id_rsa
	User			git
```

## GitHub側での公開鍵の登録手順
1. GitHubの右上の道具箱アイコン(Account Setting)をクリックする。
2. 左側にあるメニューよりSSH keysを選択する。
3. メイン画面よりAdd SSH keyを選択する。
4. Titleに任意の名前を設定する。
5. Keyには、 **id_rsa.pub(公開鍵)** の内容を貼付ける。なお、貼付ける際は、以下のコマンドを実行してクリップボードにコピーすると、間違いが無いかと思う。

  ```
  $ pbcopy < ~/.ssh/id_rsa.pub
  ```

6. Keyを貼付けたら、　Add Keyを選択する。
7. 最後に、パスワードを聞かれるので、GitHubのパスワードを入力して完了。

## SSHでの接続確認をしておく
ターミナルより次のコマンドを実行することで確認が出来る。

```
$ ssh github
PTY allocation request failed on channel 0
Hi XXXXXXXXXX! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
```

エラーのようなメッセージが出るが、内容を読むとSSH接続には成功しているけど、GitHubはシェルアクセスは許していない旨のメッセージなので、心配しなくてもOK。
自己参照のオブジェクトや配列をディープコピーする


## 対象
```
var original = {a: 1};
original.b = original; // 自己参照
```

# 既存の方法

いくつか既存の方法を試してみましたが、すべて思い通りにはなりませんでした。
うかつに実行すると例外が発生してしまいます

## JSON.parse

```javascript
var cloned = JSON.parse(JSON.stringify(original));
```

`TypeError: Converting circular structure to JSON`が発生


## jQuery

```javascript
var cloned = $.extend(true, {}, original);
```

`RangeError: Maximum call stack size exceeded`が発生


## Coffeescript cookbook

[コードはここで](http://coffeescriptcookbook.com/chapters/classes_and_objects/cloning)

`RangeError: Maximum call stack size exceeded`が発生


## underscore

```javascript
var cloned = _.clone(original);
console.log(cloned.b === original.b); //(true) シャローコピー
```

# 今回作成したもの

だれかが既に解決していたら、ただ見つけられなかっただけです。
とりあえず作ってみたので公開します

```javascript
var clone = (function() {
  function cp (val) {
    if (val === null ||
        val === void 0 ||
        typeof val === 'string' ||
        typeof val === 'number' ||
        typeof val === 'boolean' ||
        typeof val === 'function') {
      return val;
    }

    var constructor = Object.getPrototypeOf(val).constructor;

    if (constructor === RegExp) {
      var att = String(val).slice(val.source.length + 2);
      return new RegExp(val.source, att);
    }

    if (constructor === Date) {
      return new Date(val.getTime());
    }

    var self = this;

    // 自己参照対策
    var idx = self.obj1.indexOf(val);
    if (~idx) {
      return self.obj2[idx];
    }

    var rtn = constructor === Array ? [] : {};
    this.obj1.push(val);
    this.obj2.push(rtn);

    if (constructor === Array) {
      val.forEach(function(x) {
        rtn.push(self.cp(x));
      });

    } else {
      Object.keys(val).forEach(function(x){
        rtn[x] = self.cp(val[x]);
      });

    }
    return rtn;
  }

  function clone (val) {
    var self = {
      cp: cp,
      obj1: [], // 自己参照対策
      obj2: []
    };
    return self.cp(val);
  }

  return clone;
})();
```



## 検証

```javascript
var cloned = clone(original);
console.log(cloned === original); // false
console.log(cloned.b === original.b); // false
console.log(original.b === original); // true
console.log(cloned.b === cloned); // true
console.log(cloned.b.b.b.b.b.a === original.b.b.a); // true

```

参照はそれぞれ自分自身への循環参照でディープコピーされています。

## さいごに

対応しているのは、プリミティブといくつかの基本的なオブジェクトだけ。
DOMとかは対象外です。
関数だけは参照渡しになっているのでそこだけディープコピーじゃないけど、まあいいかと。

最初のプリミティブらへんの解決はかんたんに、
`val === null || typeof val !== 'object'`
とかでもいいかもしれません
IPv4のHeader Checksumエラーをチェックしなくする方法

エラーになっている箇所を右クリックすると
`Protocol Preference` というのが出てくるので
`Validate the IPv4 checksum if possible` のチェックを外す

![protocol_preference.png](https://qiita-image-store.s3.amazonaws.com/0/12550/539e61ad-252a-c4e0-5ff4-ab73763e3384.png)
iOS 8で導入されたLocal Authenticationを使ってTouchID認証

iOS 8から追加された `Local Authentication` でTouchID認証を行うドキュメントが **一般にも公開** されていたのでメモ。

[Local Authentication Framework Reference](https://developer.apple.com/library/prerelease/ios/documentation/LocalAuthentication/Reference/LocalAuthentication_Framework/index.html#//apple_ref/doc/uid/TP40014520)

# サンプルコード

```objc
- (void)authStart
{
    // 認証用のオブジェクト生成
    LAContext *myContext = [[LAContext alloc] init];
    NSError *authError = nil;
    NSString *myLocalizedReasonString = @"認証を行う理由をここに書く";
    
    // 生体認証（TouchID）の利用が可能か？
    if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError])
    {
        [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                  localizedReason:myLocalizedReasonString
                            reply:^(BOOL success, NSError *error)
         {
             if (success) {
                 // 認証に成功した
             }
             else {
                 // 認証に失敗した
             }
         }];
    }
    else {
        // TouchIDが使用できない（古い端末を使用した場合など）
    }
}
```

evaluatePolicy には認証ポリシーを指定できますが、現時点では `LAPolicyDeviceOwnerAuthenticationWithBiometrics` のみ指定可能なようです。

# 注意点

LocalAuthenticationは実機でのみ動作するようです。シミュレータで実行しようとするとエラーになります。

Xcode 6は現在NDA下にあるため、実行結果のスクリーンショットの掲載は控えておきます。
Goをインストールし、Vimで書く環境を整えるまでの手順


# 概要

Go言語をインストールして実行できる環境を作る。
VimでGo言語を書く設定をする。

# Goのインストール

以下のページでバイナリをダウンロードし、ホームディレクトリに設置する。
https://code.google.com/p/go/wiki/Downloads?tm=2


```shell
$ wget https://storage.googleapis.com/golang/go1.2.2.linux-amd64.tar.gz
$ tar xvzf go1.2.2.linux-amd64.tar.gz
$ mv go1.2.2.linux-amd64 ~/go
```

Goのパッケージをダウンロードして設定するディレクトリを作成する。

```shell
$ mkdir ~/go/packages
```


.bashrcなどに、以下の環境変数を設定する。

```shell
export GOROOT=~/go
export GOPATH=$GOROOT/packages
export PATH=$PATH:$GOROOT/bin
```

「. ~/.bashrc」などで設定を有効化すると、goコマンドが使用できるようになる。

# Vimの設定

入力補完のために、gocodeを入れる。

```shell
$ go get github.com/nsf/gocode
```


Goに同封されているVimの設定とgocodeのVimの設定を読み込むために、
.vimrcに以下の設定を追記する。

```vim:.vimrc
filetype off
filetype plugin indent off
set runtimepath+=$GOROOT/misc/vim
filetype plugin indent on
syntax on
autocmd FileType go autocmd BufWritePre <buffer> Fmt
exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim")
set completeopt=menu,preview
```

これで自動補完や自動フォーマットが動作するようになる。

「:Import fmt」で、importを追加できたりするのも便利。


# 参考

Vimを使ったGo言語開発手法
http://mattn.kaoriya.net/software/vim/20130531000559.htm

Go言語のインストール
http://golang.jp/install

GOPATH は適当に決めて問題ない
http://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f

Go言語の開発環境構築 (Golang + Mac OS X + Vim)
http://note-of-engineer-b.blogspot.jp/2013/12/golang-setup.html
if文の三項演算子


>条件式 ? 式1 : 式2

条件式を評価し、TRUEであれば式1、FALSEであれば式2を返します。

```php
//基本形
$check = ($message = 'hi') ? 1 : 0;
//応用系
$user->setAreaId(((int)$request->get('areaId')) ?: $user->getAreaId())
```
SwfitでUITableViewが動かなかったのでメモ

UITableViewControllerを継承して作成したら動かなかったのでメモ。

```objc
    init(style: UITableViewStyle) {
        super.init(style: style)
        // Custom initialization
    }
````

fatal error: use of unimplemented initializer 'init(coder:)'

となっていてクラッシュするので

```objc
//    init(style: UITableViewStyle) {
//        super.init(style: style)
//        // Custom initialization
//    }
````

コメントアウトしたら動きました
Swiftで音楽を再生

Swiftのお勉強がてら音楽を再生できるようにしてみました。
元記事：http://sawapi.hatenablog.com/entry/2014/06/07/023814

## つくったもの 
だいぶシンプルな音楽プレイヤー。
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/26955/c67db65f-3073-7774-d356-caa1059d1da7.png)
iPhoneに入ってる曲を取り出してタップすると再生します。

## ソースコード
https://github.com/sawapi/musicPlayer

## ファイル構成
- AppDelegate.swift・・・そのまま
- ViewController.swift・・・Viewの処理
- SongQuery.swift・・・iPhoneに入っている曲の情報を返す
- Main.storyboard・・・NavigationControllerとTableViewおいただけ

## コードの概要

### 曲リストの取得
```swift
func get() -> AlbumInfo[] {
    
    var albums: AlbumInfo[] = []
    
    // アルバム情報から曲を取り出す
    var albumsQuery: MPMediaQuery = MPMediaQuery.albumsQuery()
    var albumItems: MPMediaItemCollection[] = albumsQuery.collections as MPMediaItemCollection[]
    var album: MPMediaItemCollection
    
    for album in albumItems {
        
        var albumItems: MPMediaItem[] = album.items as MPMediaItem[]
        var song: MPMediaItem
        
        var songs: SongInfo[] = []
        
        var albumTitle: String = ""
        
        // album情報から曲リストを取得する
        for song in albumItems {
            
            albumTitle = song.valueForProperty( MPMediaItemPropertyAlbumTitle ) as String
            
            var songInfo: SongInfo = SongInfo(
                albumTitle: song.valueForProperty( MPMediaItemPropertyAlbumTitle ) as String,
                artistName: song.valueForProperty( MPMediaItemPropertyArtist ) as String,
                songTitle:  song.valueForProperty( MPMediaItemPropertyTitle ) as String,
                // NSNumberじゃないとうまくいかない
                songId:     song.valueForProperty( MPMediaItemPropertyPersistentID ) as NSNumber
            )
            
            songs.append( songInfo )
        }
        
        var albumInfo: AlbumInfo = AlbumInfo(
        
            albumTitle: albumTitle,
            songs: songs
        )
        
        albums.append( albumInfo )
    }
    
    return albums 
}
```

MPMediaQuery.albumsQuery()でアルバムのリストを取得できます。
songIdは、UInt64で動くと思ったらなぜか動かず。。NSNumberなら動きました。

### 選択した音楽を再生
```swift
func tableView( tableView: UITableView?, didSelectRowAtIndexPath indexPath:NSIndexPath! ) {        
    
    // MPMediaItemPropertyPersistentID
    // 曲を識別するID
    let songId: NSNumber = albums[indexPath.section].songs[indexPath.row].songId
    
    // IDからMPMediaItemオブジェクトを取得
    // SongQuery#getItemを参照
    let item: MPMediaItem = songQuery.getItem( songId )
    
    let url: NSURL = item.valueForProperty( MPMediaItemPropertyAssetURL ) as NSURL
    
    //var error: NSError? = nil
    
    // 再生
    audio = AVAudioPlayer( contentsOfURL: url, error: nil )
    audio.play()
    
    self.title = albums[indexPath.section].songs[indexPath.row].songTitle
}
```

MPMediaItemのvalueForPropertyメソッドはAnyObjectを返すので型変換してあげます。
AVAudioPlayerのerrorの部分にNSErrorを入れてもうまくいきませんでした。。
やり方が分かったら直します。

## まとめ
Objective-C自体あまり触ったことないですが、Swiftはかなり取っ付き易いです。
あとはコード補完さえなんとかなれば。。
Ubuntu14.04にMariaDB10を入れる(ソースから)

##MariaDB10.0.11ソースをダウンロード
https://downloads.mariadb.org/

##ビルド関係のページを参考に以下の一群をinstall
https://mariadb.com/kb/en/build-environment-setup-for-linux/
https://mariadb.com/kb/en/building-mariadb-on-ubuntu/

installしたもの一覧
```
build-essential dpkg-dev devscripts hardening-wrapper autoconf automake1.9 autotools-dev binutils bison chrpath debhelper doxygen dpatch fakeroot fontconfig-config g++ gawk gcc gettext ghostscript ghostscript-x gsfonts html2text intltool-debian libc6-dev libcroco3 libcups2 libcupsimage2 libfontconfig1 libfontenc1 libfreetype6 libgomp1 libice6 libjpeg62 libltdl7 libltdl-dev libmail-sendmail-perl libncurses5-dev libpaper-utils libpaper1 libpng12-0 libreadline-dev libsm6 libsys-hostname-long-perl libtool libwrap0-dev libxaw7 libxfont1 libxmu6 libxpm4 libxt6 linux-libc-dev lmodern m4 make patchutils po-debconf tex-common texlive-base texlive-binaries texlive-latex-base texlive-latex-base-doc ttf-dejavu ttf-dejavu-core ttf-dejavu-extra xfonts-encodings xfonts-utils zlib1g-dev libssl-dev
```

##コンパイル
オプションは適当に指定
```
cmake . -DCMAKE_INSTALL_PREFIX=/path_to_your_installation_dir/mariadb \
-DMYSQL_DATADIR=/path_to_your_installation_dir/data \
-DMYSQL_UNIX_ADDR=/path_to_your_installation_dir/mariadb.sock \
-DINSTALL_SYSCONFDIR=/path_to_your_installation_dir/etc \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1
```

失敗したらCMakeCache.txtを削除して再度cmakeを行う
```
make
make test
make install
```

##インストール後
DBの初期化
```
cd /path_to_your_installation_dir/mariadb
./scripts/mysql_install_db --basedir=/path_to_your_installation_dir/mariadb --datadir=/path_to_your_installation_dir/mariadb_data --defaults-file=/path_to_your_installation_dir/etc/my.cnf --user=user_name
```
サンプルのmy.cnfを適当にコピー
```
cp ./support-files/my-huge.cnf /path_to_your_installation_dir/etc/my.cnf
```
my.cnfを適当に編集した後、起動
```
/path_to_your_installation_dir/mariadb/bin/mysqld_safe &
```
アクセス
```
/path_to_your_installation_dir/mariadb/bin/mysql -uroot
```
終了
```
sudo /path_to_your_installation_dir/mariadb/bin/mysqladmin shutdown
```

以上
OSX10.10(Yosemite)βに上げてハマった点

正直、現時点では上げない方が良い感じ、とはいえ(間違えて)あげてしまったものは仕方がないので一応トラブルメモ。

# ハマったところ

## 最初の再起動待ちが長すぎて怖い→正式版は13分で完了！
15分って表示されてるが残り４分のところで進まなくなり、しんぼう強く１〜２時間くらい本読んだりゲームしたりしながら放置したところで動き出し一応起動した。
固まったと勘違いして電源切ったりしてしまうと大変なことになりそうでやらなくてよかった・・・。

## ログイン画面でキーボードが効かない！パスワード入力できない！入れない！→正式版リリース時点では問題なし！
これは焦る・・・。とりあえずログインできないと何も手が出ないからね。

- 何度か再起動してみても意味なし。
- ふと思いついてゲストのアイコンをクリックしてみたところ入れた！パスワードなしのゲストがあってよかった・・・。
- ゲストで起動したらおもむろにターミナルを開き`su`と`passwd`コマンドで、本来のユーザのパスワードを空に変更。
- 一旦再起動してユーザアイコンをクリック
- 入れたー！！

その後、実はGoogle日本語入力が怪しかったんじゃないかという気がして、それのUninstall後にパスワード再設定したらログイン画面でキーボードが使えるようになったことを確認。

## Google日本語入力が動かない→正式版リリース時点では問題なし！

- どうしようもなさそうなのでUninstall
- ちなみに再インストールしてもダメでした。多分Google側の対応待ちかな。
- 久しぶりにデフォの日本語入力（「ことえり」だっけ？）を有効にして凌ぐことにした

## Chromeブラウザが落ちまくる→正式版リリース時点では問題なし！

- Google日本語入力のDLページなど幾つかの特定ページに行くと確実に落ちる
- どこに地雷が埋まってる変わらない状態なので一旦Uninstall
- 再インストール後は治ったようだ、よかった

## BettorTouchToolが動かない→正式版リリース時点では問題なし！
- 対応版がすでに[配布されてた](http://blog.boastr.net/os-x-10-10-yosemite/)のでこれを入れて事なきを得る

## Homebrewが動かない→事前にbrew updateしてればOK
どうやらOSX標準のRubyが1.8から2.0に上がったことの影響のようだ。

- `/usr/local/Library/brew.rb`の最初の行が`#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -W0`てなってるのが問題。
 - 1.8の部分を2.0またはCurrentに修正してやることで治る。
- その後、`brew update`したらCurrentになってたのでOSXを上げる前にupdateしておけば問題はなかったのかもしれない。
- 次からは `brew update; brew upgrade; brew cleanup` しとくことにしよう。

## iTerm2で二重打鍵→正式版リリース時点では問題なし！

入力した文字が２重にタイプされる問題発生（例えば ls と打ったら llss ってなってそんなコマンドねーよ状態）

- どうやらIMEが日本語入力の英数モードだと二重打鍵になってしまうようだ。ただの英数モードじゃなく、`U.S.`に切り替えてやると大丈夫ぽい。でもこれだと`英数`キー一発で切り替えられなくてとても不便・・・。
- この症状はGoogle日本語入力でもことえりでも発生する。
- iTerm2以外のアプリでは二重打鍵にならないからOSX10.10+iTerm2の固有の問題かも。

色々試してみた結果、ATOKの英字モードでは二重打鍵が発生しないことが分かった。なので暫くはATOKの月額308円のパスポートライセンスで生きることにした。

## tmuxとクリップボードできない→正式版リリース時点の最新版では問題なし！

- brewで入れた reattach-to-user-namespace がOSX10.9までしか対応してないため
- [githubのリポジトリ](https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard)の方では既にyosemite対応がマージ済みなのでそれをビルドして解決


# 大丈夫だったもの

- XtraFinder 意外にも大丈夫だった！
 - ウソだった、細かくおかしいところあり（Cmd+xのカットが普通のコピーになるなど）
 - でもまぁマーベリックになったときみたいに落ちまくるとか無いからあんまし気にならない。
- KeyRemap4MacBook 意外にも大丈夫だった！
- VirtualBox 普通に動いた
- Parallels 普通に動いた
- Skype
- Growl
- Dropbox
- Alfred
- HiperSwitch

そろそろチェックめんどくなってきた、要は上の方に書いたアプリ以外は大体動いてるってことで。動かないのを見つけたら追記する。

- ATOK は既にYosemite対応をサイト上でもうたってるので試してみた。iTerm2の二重打鍵問題も解決した、よかった！→GoogleIME使えるようになったのでATOKパスポート解約した
tcpdumpのフィルタ

# ARP
http://www.ietf.org/rfc/rfc826.txt
## ARP要求だけを取り出すフィルタ
ARPヘッダの8オクテット目が1

```
arp and 'arp[7]==1'
```
## ARP応答だけを取り出すフィルタ
ARPヘッダの8オクテット目が2

```
arp and 'arp[7]==2'
```
標準出力にログを吐くアプリケーションのデーモンを start-stop-daemon で立てる

[GrowthForecast](http://kazeburo.github.io/GrowthForecast/) には残念ながらログファイルを書き出すオプションは無く，すべて標準出力に吐くようです

しかしそのようなアプリケーションでも `start-stop-daemon` を使って daemon 化してかつ標準出力に吐くログをログファイルとして保存したいことがあります

このような場合ただリダイレクトするだけではうまくいかないので以下のようにします

```sh:
start-stop-daemon --start --background --exec "/bin/bash" --make-pidfile --pidfile "$PID" -- \
  -c "exec $DAEMON >> /var/tmp.log 2>&1"
```

まず bash の daemon として立ち上げますが，このままだと bash が daemon として起動してしまいます
そうなると pid が bash の daemon となり肝心の立ち上げたいプロセスの管理ができなくなってしまいます

そこで bash の `exec` を使います

これを使えば標準出力をログファイルに書き出せてかつ pid も管理したいプロセスのものになります

今回は GrowthForecast を実行する専用ユーザー gf を作成してそこで plenv を使って Perl と GrowthForecast をインストールしたので以下の様なスクリプトを用意しました

```sh:gf
#!/bin/bash

PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin

APP=growthforecast
ROOT_DIR="/home/gf"
DATA_DIR="${ROOT_DIR}/data"
PID="${ROOT_DIR}/gf.pid"
NAME=growthforecast
DAEMON="/home/gf/.plenv/shims/growthforecast.pl"
DAEMON_USER="gf"

. /lib/lsb/init-functions

case "$1" in
  start)
    echo "start $NAME";
    start-stop-daemon --start --chuid "$DAEMON_USER" --background --exec "/bin/bash" --make-pidfile --pidfile "$PID" -- \
      -c "exec $DAEMON --data-dir /home/gf/data --front-proxy=127.0.0.1 --enable-float-number >> /home/gf/log/gf.log 2>&1"
    ;;
  stop)
    log_daemon_msg "Stopping " "$NAME"
    start-stop-daemon --stop --oknodo --signal TERM --pidfile "$PID"
    log_end_msg $?
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
    echo "Usage: gf {start|stop|restart}"
    exit 1
    ;;
esac

exit 0
```
[FuelPHP]composerのアップデート方法


ローカルにクローンしてきたプロジェクトを叩いたら、

"Composer is not installed. Please run "php composer.phar update" in the root to install Composer"

と言われた。
なので、composerをアップデートする。

方法は公式リファレンスにも書いてあります。
http://fuelphp.jp/docs/1.6/installation/instructions.html

```
% php composer.phar self-update
$ php composer.phar update
```

で完了。
上と左の合計

http://qiita.com/Nabetani/items/34bf2a05099a47e193b6
http://nabetani.sakura.ne.jp/hena/ord22irrpas/

50分ほど。かなり大変でした。
一応Ruby 1.8/2.0で動作。
nilを活用しているので同等のものがない言語への移植は困難。

```rb:hena22.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/34bf2a05099a47e193b6
#http://nabetani.sakura.ne.jp/hena/ord22irrpas/
STDOUT.sync=true
while gets
	a,b=$_.chomp.split(':')
	column,row=a.split('x').map(&:to_i)
	cells=!b ? [] : b.split(',').map{|e|
		l,t,w,h=e.split('').map(&:to_i)
		#番兵を設けるため1を足す。高さ/幅から端点の座標に変更。
		{:x1=>l.to_i+1,:x2=>l.to_i+1+w.to_i,:y1=>t.to_i+1,:y2=>t.to_i+1+h.to_i}
	}

	m=(row+1).times.map{[nil]*(column+1)}
	(row+1).times{|y|m[y][0]=0}
	(column+1).times{|x|m[0][x]=0}
	m[0][1]=1 #m[1][0]=1でも可。適当。

	while !m[row][column] # 右下が埋まるまで
		1.step(row){|y|
			1.step(column){|x|
				next if m[y][x] # 既に埋まっていたらスキップ
				#1x1のセルでなければ
				if cell=cells.find{|e|e[:x1]<=x&&x<e[:x2] && e[:y1]<=y&&y<e[:y2]}
					#セルの右上を見ている時に限り左・上隣を見る
					if cell[:x1]==x && cell[:y1]==y
						cells_for_val={}
						val=0
						#左隣
						unless (cell[:y1]...cell[:y2]).each{|_y|
							adjacent_cell=cells.find{|e|e[:x1]<=x-1&&x-1<e[:x2] && e[:y1]<=_y&&_y<e[:y2]}
							if !adjacent_cell||!cells_for_val.include?(adjacent_cell)
								cells_for_val[adjacent_cell]=1 if adjacent_cell
								break if !m[_y][x-1] # まだセルが埋まっていなければスキップ。breakするとeachはnilを返す。unless〜next。
								val+=m[_y][x-1]
							end
						}
							next
						end
						#上隣
						unless (cell[:x1]...cell[:x2]).each{|_x|
							adjacent_cell=cells.find{|e|e[:x1]<=_x&&_x<e[:x2] && e[:y1]<=y-1&&y-1<e[:y2]}
							if !adjacent_cell||!cells_for_val.include?(adjacent_cell)
								cells_for_val[adjacent_cell]=1 if adjacent_cell
								break if !m[y-1][_x]
								val+=m[y-1][_x]
							end
						}
							next
						end
						#セルを埋める
						(cell[:y1]...cell[:y2]).each{|_y|
							(cell[:x1]...cell[:x2]).each{|_x|
								m[_y][_x]=val%100
							}
						}
					end
				else
					next if !m[y-1][x] || !m[y][x-1]
					val=m[y-1][x]+m[y][x-1]
					m[y][x]=val%100
				end
			}
		}
	end
	puts "%02d"%m[row][column]
end
```
複数の共通鍵の管理方法


```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):id_rsa_sumple[ここでファイル名を入力！！]
```

そうすると

```
$ ls ~/.ssh/
id_rsa_sample	id_rsa_sample.pub
```
という2つのファイルが生成されていればおっけー。

configでの設定は秘密鍵だけでよいので以下を参照。
http://qiita.com/maximum80/items/a453ed00ac96cab77f08
ProcessingでLife Game（簡易版）

# 概要
ライフゲームの簡易シミュレーション。サイズは10x10としているが、サイズパラメータを変更することで全体サイズの変更が可能。
## ルール
* 黒のセルは生存、白のセルは死滅
* 周りの8個のセルに対して以下のルールに従い時間発展
  * 生存しているセルが2つの場合は現状維持
  * 生存しているセルが3つの場合は生成
  * それ以外は死滅
* 境界条件は周期的境界条件 

# 実行方法
1.Processingの作業ディレクトリを作成
2.下記ソースコードをディレクトリ名と同じファイル名.pdeとして保存
3.初期条件に分布を0,1で指定（0:消滅 1:生存）
4.Processing上で実行

# 参考
* [Wikipedia ライフゲーム](http://ja.wikipedia.org/wiki/ライフゲーム)

# ソースコード
```java
// Processingによる簡易版ライフゲーム（サイズ10x10） 

// 定数
public class Cnst{
  public static final int XSIZE = 160;               // 画面サイズ（縦）
  public static final int YSIZE = 160;               // 画面サイズ（横）
  public static final int PXSIZE = 16;               // セルサイズ
  public static final int XN = YSIZE / PXSIZE;       // セル数（横）
  public static final int YN = XSIZE / PXSIZE;;      // セル数（縦）
  public static final int BGCOLOR = 255;             // 背景色
  public static final int FR = 1;                    // フレームレート（Hz）
  public static final int SW = 0;                    // セルの枠線の太さ
}

// セルオートマトンクラス
public class CA{
  // インスタンス変数
  int[][] s;

  // コンストラクタ
  CA(){
    this.s = new int[Cnst.XN][Cnst.YN];
    this.s = setInitConfig();
  }

  // 拡張剰余
  private int mod(int i,int n){
    if(i >= 0){return i % n; }
    else{return (i + n) % n; }  // 任意の範囲には対応していない
  }

  // 初期条件（この例ではダイハードパターンを指定）
  private int[][] setInitConfig(){
    int[][] a = {
      {0,0,0,0,0,0,0,0,0,0},
      {0,0,0,0,0,0,0,0,0,0},
      {0,0,0,0,0,0,0,0,0,0},
      {0,0,0,0,0,0,0,1,0,0},
      {0,1,1,0,0,0,0,0,0,0},
      {0,0,1,0,0,0,1,1,1,0},
      {0,0,0,0,0,0,0,0,0,0},
      {0,0,0,0,0,0,0,0,0,0},
      {0,0,0,0,0,0,0,0,0,0},
      {0,0,0,0,0,0,0,0,0,0}
    };
    return a;
  }

  // 周期的境界条件で周りのセルと相互作用
  public void generate(){
    int[][] t = new int[Cnst.XN][Cnst.YN];
    for(int i = 0;i < Cnst.XN;i++){
      for(int j = 0;j < Cnst.YN;j++){
        int ip = mod(i - 1,Cnst.XN);
        int in = mod(i + 1,Cnst.XN);
        int jp = mod(j - 1,Cnst.YN);
        int jn = mod(j + 1,Cnst.YN);

        int k = this.s[ip][jp] + this.s[ip][j] + this.s[ip][jn] 
          + this.s[i][jp] + this.s[i][jn] 
          + this.s[in][jp] + this.s[in][j] + this.s[in][jn];
        t[i][j] = rule(k,s[i][j]);
      }
    }
    this.s = t;
  }

  // 選別関数 
  // kの値による分岐は、(1 - Math.signum(abs(cond - k))) * formula で記述可能
  // この例では、
  //   k = 2 状態を維持(sを返す)
  //   k = 3 生成(1を返す)
  //   それ以外 消滅(0を返す)
  // を表しており、1行では
  //   (1 - (int)Math.signum(abs(2 - k))) * s + (1 - (int)Math.signum(abs(3 - k))) * 1
  // と表せる。
  private int rule(int k,int s){
    if(k == 2){return s;}
    else if(k == 3){return 1;}
    else{return 0;}
  }

  // 描画
  public void expr(){
    for(int i = 0;i < Cnst.XN;i++){
      for(int j = 0;j < Cnst.YN;j++){
        fill(((1 - this.s[i][j]) * 255));
        strokeWeight(Cnst.SW);
        rect(Cnst.PXSIZE * i,Cnst.PXSIZE * j,Cnst.PXSIZE,Cnst.PXSIZE);
      }
    }
  }
  
}

// 変数
CA ca;

// セットアップ
void setup(){
   size(Cnst.YSIZE,Cnst.XSIZE);
   frameRate(Cnst.FR);
   ca = new CA();
}

// 描画
void draw(){
  background(Cnst.BGCOLOR);
  ca.expr();
  ca.generate();                                         // 周期的境界条件のもとでの相互作用
}

```
現在のカラースキームを確認する


## カラースキーム名を確認する

```vim
colorscheme
```

## ハイライトグループ一覧

何にどういうスタイルが割り当てられてるか見るには以下。

```vim
so $VIMRUNTIME/syntax/hitest.vim
```

![Screen Shot 2014-06-07 at 6.02.49 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3732/36196857-7ef6-4476-5387-348e3b1ad569.png "Screen Shot 2014-06-07 at 6.02.49 PM.png")

もっと詳細にカラーコード付きで見るには・・・

```vim
highlight
```

![Screen Shot 2014-06-08 at 9.13.16 AM.png](https://qiita-image-store.s3.amazonaws.com/0/3732/a2626200-fafb-66fe-11eb-f0a27a0fe3cc.png "Screen Shot 2014-06-08 at 9.13.16 AM.png")


さらに以下だと、それぞれのスタイルがどのファイルで定義されているかも表示されます。

```vim
verbose highlight
```

![Screen Shot 2014-06-08 at 9.13.46 AM.png](https://qiita-image-store.s3.amazonaws.com/0/3732/b160ab29-3fbc-323a-bfd4-77c961d86598.png "Screen Shot 2014-06-08 at 9.13.46 AM.png")
第22回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://yhpg.doorkeeper.jp/events/11378 )を行っています。

問題は「上と左の合計」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord22irrpas/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間ぐらいあれば足りるかな、と思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、上記の Doorkeeper に過去問リンク集がありますので、そちらをご覧になると良いと思います。

【宣伝】
CodeIQ に出しているじゃんけん大会
https://codeiq.jp/ace/nabetani_takenori/q888
もよろしく。
Installing Balsamiq Mockups on Ubuntu

Tried to install Adobe Air 2.6 as per the Adobe help:
http://helpx.adobe.com/air/kb/archived-air-sdk-version.html

But got an error:

    ~/tmp$ sudo ./AdobeAIRInstaller.bin 
    /tmp/air.dzfuRI/setup: error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory

I apparently need to install the 32 bit versions of libgtk2.
http://askubuntu.com/questions/356605/ubuntu-13-10-64-bit-machinarium-error-while-loading-shared-libraries-libgtk-x1

So I install 32 bit version of libgtk2. Ubuntu uses multi-arch to manage 32bit and 64bit versions of libraries. I can install the 32 bit version by appending ":i386" to the package name.

    sudo apt-get install libgtk2.0-0:i386

After that I tried to install and got an error message in the console:

    Gtk-Message: Failed to load module "canberra-gtk-module"

This message dialog also showed up:

![air_error.png](https://qiita-image-store.s3.amazonaws.com/0/15501/8371fae8-31ce-7e84-a2d6-3f4cad2ed3fe.png)

I guess I need to install the 32 bit version of libcanberra-gtk-module?
http://www.linuxquestions.org/questions/linux-software-2/gtk-message-failed-to-load-module-canberra-gtk-module-936168/

    sudo apt-get install libcanberra-gtk-module:i386

After doing that I still got the same dialog but the canberra module error message went away.
I also got this message above but ignored it. Maybe it has something to do with the problem?

    (setup:12779): Gtk-WARNING **: module_path にはテーマ・エンジンがありません: "murrine",

The install instructions mention installing libnss so it seems more likely I need to install the 32bit version of that.
http://helpx.adobe.com/air/kb/install-air-2-64-bit.html

Installing libnss did the trick:

    sudo apt-get install libnss3-1d:i386

But I got a message now about installing gnome-keyring. So following the instructions here:
http://ubuntuhandbook.org/index.php/2013/07/install-adobe-air-linux-mint-32-64-bit/

I created some symlinks:

    sudo ln -s /usr/lib/x86_64-linux-gnu/libgnome-keyring.so.0 /usr/lib/libgnome-keyring.so.0
    sudo ln -s /usr/lib/x86_64-linux-gnu/libgnome-keyring.so.0.2.0 /usr/lib/libgnome-keyring.so.0.2.0


Next install balsamiq:
Installed by double clicking the deb and installing. That seemed to work.

Balsamiq seems to run but doesn't display Japanese characters.

When to help => about => open local store folder and added a BalsamicMockups.cfg file.

```xml
<config>
<fontFace>Takaoゴシック</fontFace>
<assetsPath>/home/ian/Dropbox/Documents/Work/path/to/assets</assetsPath>
</config>
```

Now Japanese font is displayed and I can use the assets I use for work.
gruntからgulpに乗り換えることにした

久々にnodeを書くことがあり、[grunt.js](http://gruntjs.com/)じゃなくて[gulp.js](http://gulpjs.com/)を使ってみた結果gulpの方が圧倒的に良かったので、その素晴らしさの片鱗を味わってもらおうと思う。

## jadeファイルをhtmlに変換するタスク

まず、`src/jade` ディレクトリにあるjadeファイルをhtmlに変換するタスクはこんな風に書ける。既にめっちゃ短い。

```js:gulpfile.js
var gulp = require('gulp'),
    jade = require('gulp-jade');

gulp.task('jade', function () {
  gulp.src('src/jade/*.jade')      // gulp.src でファイルを指定
    .pipe(jade())                  // jade plugin に通して
    .pipe(gulp.dest('./static/'))  // gulp.dest で書きだす
});
```

`gulp jade` コマンドを実行するとタスクが走る。

## watchする

**重要なのはここ**

ファイルを監視して変更があったら自動的にコンパイルするようにしたくなったとする。
gruntだと新しいタスクを追加してから既存のタスクと結合する、みたいなことを書かないといけないが、 gulpの場合、なんと実質 **たった一行追加するだけ** で完了する。

```js:gulpfile.js
var gulp = require('gulp'),
    jade = require('gulp-jade'),
    watch = require('gulp-watch'); // plugin 追加

gulp.task('jade', function () {
  gulp.src('src/jade/*.jade')
    .pipe(watch())  // ここを追加しただけ！
    .pipe(jade())
    .pipe(gulp.dest('./static/'))
});
```

直列に並んだタスクに新しいものを追加する場合は、今見たように `.pipe()` で追加したいタスクを間に挟み込めば完了する。いかにもUNIX的で分かりやすい。

## Webサーバも立てる

では並列化したい場合はどうするかというと、 `gulp.task` の依存関係を使って記述する。例えば、さっきのjadeタスクと同時にWebサーバを起動したい場合

```js:gulpfile.js
// サーバを起動するタスク
gulp.task('server', function () { /* .. */ });
// さっきのjadeタスク
gulp.task('jade',   function () { /* .. */ });

// server と jade を並列でつなぐ
gulp.task('default', ['server', 'jade']);
```

do one thing wellな機能をpipeで直列につなぎ、出来上がったタスクをさらに前後に並べることができる。もうgruntを使うのはやめることにする。
Swiftでジェネリッククラスを書いてみた


どこかの記事でclassはジェネリックを使えないみたいなことを書いてあったのでためしに書いてみた。

```swift:Stack.swift
class Stack<T> {
    var array : T[] = T[]()
    
    func count() -> Int {
        return array.count
    }
    
    func push(item: T) {
        array += item
    }
    
    func pop() {
        if(array.count > 0){
            array.removeLast()
        }
    }
    
    func top() -> T? {
        if(array.count > 0){
            return array[array.count - 1]
        }
        return nil
    }
}

var stack = Stack<Int>()

stack.push(1)
stack.push(2)
stack.push(3)

println(stack.top())
stack.pop()
println(stack.top())
stack.pop()
println(stack.top())
stack.pop()
println(stack.top())
```

これをコンソールで実行した結果が下記。

```bash:
3
2
1
nil
```

classでもジェネリックは書けるようです。
というメモ。
Yahoo!ローカルサーチAPIに掲載する方法

はじめての利用で質問方法が間違っていましたらすみません。

現在 Yahoo!ローカルサーチAPI を利用させております。
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/localsearch.html

利用中のサイト宛に店舗を運営させておられる方から掲載希望の連絡をいただきました。

以前はYOLPカセットギャラリーにて掲載の手続きができたと思うのですが、現在はサービスが終了しているようです。

APIのレスポンスに掲載されるようにはどのような手続きをすればよいのでしょうか？
コマンドラインからSwiftを触る


`irb`や`pry`のような感覚で触りたい。
でも、`xcode-select -switch`するのだるいじゃないですか！
特に本職で開発されている方にとって。

フルパスで実行すれば良いです。

```
/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift
```

且つ、alias登録すると幸せになるでしょう。

```
alias play-swift='/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift'
```

`:quit`で終了できます。

![Screenshot 2014-06-07 17.14.23.png](https://qiita-image-store.s3.amazonaws.com/0/4192/6471ccee-ced1-9ee5-0a7f-6e9d2c9dc41a.png "Screenshot 2014-06-07 17.14.23.png")
brewコマンドのメモ

brew、Homebrew についての個人的なメモ。

# brew、Homebrew とは

Mac OSX のパッケージ管理システム。
brew はそのコマンド。

Homebrew — OS X用パッケージマネージャー
http://brew.sh/index_ja.html

# brew でよく使うコマンド

## formula を更新

    $ brew update

## 更新があるパッケージを再ビルド

    $ brew upgrade

## 問題がないかをチェックする

    $ brew doctor

## パッケージの検索

    $ brew search packagename

## インストール済みパッケージ一覧

    $ brew list

## パッケージのアンインストール

    $ brew remove packagename
Symfony2でUrl取得

requestオブジェクトから現在のUrl等取得できます。
基本getUriForPathでよさそう。

```php
echo 'getBasePath : '.$request->getBasePath() . '<br>';
echo 'getBaseUrl : '.$request->getBaseUrl() . '<br>';
echo 'getRequestUri : '.$request->getRequestUri() . '<br>';
echo 'getUri : '.$request->getUri() . '<br>';
echo 'getUriForPath : '.$request->getUriForPath('/') . '<br>';
```
↓
```getBasePath : /snap/web
getBaseUrl : /snap/web/app_dev.php
getRequestUri : /snap/web/app_dev.php/App/model/99
getUri : http://localhost/snap/web/app_dev.php/App/model/99
getUriForPath : http://localhost/snap/web/app_dev.php/
```

参考：http://api.symfony.com/2.0/Symfony/Component/HttpFoundation/Request.html#method_getBasePath
Sencha Cmd のバージョン切り替え

Ext JS 5 がでて、いろいろ検証したり勉強したりしています。ところが、普段のお仕事は Ext JS 4 ベース。ですから Sencha Cmd の違うバージョンをつかわないといけません。

Sencha Cmd をインストールすると、

    ~/bin/Sencha/Cmd/x.x.x.x/

の下 (x.x.x.x はバージョン番号) にインストールされます。
複数のバージョンがインストールされるようになっているのですが、単に sencha で起動するのは最後にインストールしたやつです。

    export PATH=/Users/sunvisor/bin/Sencha/Cmd/5.0.0.116:$PATH
    export PATH=/Users/sunvisor/bin/Sencha/Cmd/5.0.0.160:$PATH
    export PATH=/Users/sunvisor/bin/Sencha/Cmd/4.0.2.67:$PATH
    export PATH=/Users/sunvisor/bin/Sencha/Cmd/4.0.4.84:$PATH

`.profile` の中はこんな風に複数の path 定義がならんでいると思います。

それぞれのディレクトリの中に sencha ってコマンドがあるんで、一番下の行で指定されているディレクトリの sencha が実行されます。
でも各ディレクトリには、その他に、バージョン番号付きの sencha コマンドもあります。

    -rwxr-xr-x   1 sunvisor  staff     1697  6  2 20:59 sencha
    -rwxr-xr-x   1 sunvisor  staff     1697  6  2 20:59 sencha-5.0.0.160

各ディレクトリには path は通っていますから、このバージョン番号付きのを実行してやれば、現在最優先になっていない方の sencha コマンドを実行できます。

    sencha-5.0.0.160 app build

bash や zsh のTABキーでの補完機能を使えばさほどめんどうではないので、便利ですよ。

ちなみに、今の sencha がどこの sencha かを調べるには

    sencha which

とします。

### 追記

それでもやっぱり面倒くさいとか、バッチファイルなどの中で sencha で呼んでいるから、うまくいかないとかありますよね。
それで、.profile の中に alias 定義をすることにしました。

    # sencha cmd version switch
    alias usesencha402='export PATH=/Users/sunvisor/bin/Sencha/Cmd/4.0.2.67:$PATH'
    alias usesencha4='export PATH=/Users/sunvisor/bin/Sencha/Cmd/4.0.4.84:$PATH'
    alias usesencha5='export PATH=/Users/sunvisor/bin/Sencha/Cmd/5.0.0.160:$PATH'

こんな感じでやっておくと、ターミナルで

    usesencha5

とすれば Cmd 5 が使われるようになります。ターミナルを閉じたり、別な bash/zsh を起動したら無効になりますので、いまから 5 に切り替えて作業して、通常は 4 でいいねん、というとき便利かと。
新しいバージョンが出れば、alias を増やしたり、書き換えたりすれば OK です。
ニコニコ生放送にて、30分で作ったお絵かきソフト

![20140607-153244-866.png](https://qiita-image-store.s3.amazonaws.com/0/34295/c834503f-7ca7-0474-6e16-a470e724a432.png)


```Siv3D:Main.cpp

//お絵かきソフト

# include <Siv3D.hpp>

void Main()
{
	Window::Resize({ 640, 640 });

	Graphics::SetBackground(Palette::Gray);

	Image image{ 640, 480, Palette::White };

	DynamicTexture texture{ image };

	const std::array<Color, 16> colors =
	{
		Palette::Black,
		Palette::Gray,
		Palette::Silver,
		Palette::White,
		Palette::Maroon,
		Palette::Red,
		Palette::Olive,
		Palette::Yellow,
		Palette::Green,
		Palette::Lime,
		Palette::Teal,
		Palette::Aqua,
		Palette::Navy,
		Palette::Blue,
		Palette::Purple,
		Palette::Fuchsia
	};

	std::array<Rect, 16> buttons;

	const Point areaSize{ 80, 80 };

	const Point margin{ 5, 5 };

	const Point buttonSize = areaSize - margin * 2;

	const Point firstPos = Point(0, 480) + areaSize / 2;

	for (int i = 0; i < buttons.size(); ++i)
	{
		buttons[i].setSize(buttonSize);

		buttons[i].setCenter(firstPos + Point((i % 8) * areaSize.x, (i / 8) * areaSize.y));
	}

	Color penColor;


	while (System::Update())
	{
		for (int i = 0; i < buttons.size(); ++i)
		{
			if (buttons[i].leftClicked)
			{
				penColor = colors[i];
			}
		}

		if (Input::MouseL.pressed)
		{
			const Point pos = Input::MouseL.clicked ? Mouse::Pos() : Mouse::PreviousPos();

			Line{ pos, Mouse::Pos() }.write(image, 8, penColor);

			texture.fill(image);
		}

		texture.draw();

		for (int i = 0; i < buttons.size(); ++i)
		{
			buttons[i].draw(colors[i]);

			buttons[i].drawFrame(1.0, 1.0, Palette::White);
		}
	}
}

```
RaspberryPiにRTCモジュールを搭載して、ハードウェア起動時に時刻を合わせる


RaspberryPiはRTCおよびバックアップバッテリを搭載していないため、起動直後はシステムクロックが初期値になっています。バッテリバックアップ付きのRTCモジュールを使用することで、オフライン状態で起動してもシステムクロックを維持することが出来ます。


# 前提条件

* Arch Linux ARM
* DS3231使用RTCモジュール


# RTCモジュールを搭載する


## RTCモジュール

RaspberryPi, RTCなどのキーワードで検索するといくつかの製品が販売されていますが、Amazon.co.jpで販売されていたRaspberryPi用のI2Cモジュールを使いました。

* I2C接続DS3231使用のRaspberryPi用RTCモジュール ([Amazon.co.jpで入手](http://www.amazon.co.jp/dp/B00KB10VIO/ref=as_sl_pc_tf_lc?tag=mitsukuni-22&camp=1027&creative=7407&linkCode=as4&creativeASIN=B00KB10VIO&adid=0B4ED3KNRV71QVFEY5EC&&ref-refURL=http%3A%2F%2Frcm-fe.amazon-adsystem.com%2Fe%2Fcm%3Flt1%3D_blank%26bc1%3D000000%26IS2%3D1%26bg1%3DFFFFFF%26fc1%3D000000%26lc1%3D0000FF%26t%3Dmitsukuni-22%26o%3D9%26p%3D8%26l%3Das4%26m%3Damazon%26f%3Difr%26ref%3Dss_til%26asins%3DB00KB10VIO), <a href="http://www.amazon.co.jp/gp/product/B00DEWCCPW/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00DEWCCPW&linkCode=as2&tag=mitsukuni-22">Raspberry Pi white　Case (白ケース)</a>に入ります)

ビジュアル的にこんなかんじで、RaspberryPiに亀の子にして搭載します。写真には写っていませんがモジュールの裏側に小型バッテリがハンダ付けされています。

![IMG_0083.jpg](https://qiita-image-store.s3.amazonaws.com/0/29860/5bdc9ca5-005b-d2d8-1f5d-d18bec12ae91.jpeg "IMG_0083.jpg")

## モジュールの初期化

ArchLinux 3.12.20-4-ARCHでは、次のコマンドでRTCモジュールを呼び出すことが出来ました（手元のハードウェアでは`rc.local`的なファイルを使用して起動時にRTCモジュールが有効になるようにしています。
）。

```
/usr/bin/echo ds1307 0x68 | /usr/bin/tee /sys/class/i2c-adapter/i2c-1/new_device
```

※昔はmodprobeコマンドなどを利用して認識させていたと思いますが、イマイチこの辺りの仕組みを理解できていません。modprobe.conf的なファイルに何かを書いてあげればシステムファイルに書き込みしなくても認識するのでしょうか？

dmesgの出力。

```
[root@alarmpi ~]# dmesg | grep -i ds1307
[    8.205884] i2c i2c-1: new_device: Instantiated device ds1307 at 0x68
[    8.277696] rtc-ds1307 1-0068: rtc core: registered ds1307 as rtc0
[    8.277758] rtc-ds1307 1-0068: 56 bytes nvram
```


## 起動後の状態で確認


起動直後の状態で、

```
[root@alarmpi ~]# uptime
 15:21:28 up 0 min,  1 user,  load average: 0.81, 0.22, 0.07
```

システムクロックがハードウェアクロックと同期しています。

```

[root@alarmpi ~]# timedatectl status
      Local time: Sat 2014-06-07 15:21:29 JST
  Universal time: Sat 2014-06-07 06:21:29 UTC
        RTC time: Sat 2014-06-07 06:21:30
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

いえい！

----

参考。

* [Set up Real Time Clock (RTC) on Raspberry Pi](http://www.instructables.com/id/Set-up-Real-Time-Clock-RTC-on-Raspberry-Pi/?lang=ja)
* [Raspberry Piにリアルタイムクロックをインストールする](http://hs-it-notes.blogspot.jp/2014/01/raspberry-pi.html)
* [Raspberry Pi Expansion Board (X100) (2014/01/04)](http://www.mztn.org/rpi/rpi27.html)
ニコニコ生放送にて、30分で作った音楽プレイヤー

![20140607-204055-179.png](https://qiita-image-store.s3.amazonaws.com/0/34295/dae4ef77-2597-5791-cb2d-9fe49bfc582c.png)

```Siv3D:Main.cpp

//音楽プレイヤー
# include <Siv3D.hpp>

void Main()
{
	Graphics::SetBackground(Palette::White);

	const Sound sound = Dialog::OpenSound();

	sound.play();

	Circle playButton(Window::Center(), 30);

	Circle sliderToggle(20);

	const Point sliderStartPos{ 100, 100 };

	const Point sliderEndPos{ 540, 100 };

	const Vec2 sliderDelta = sliderEndPos - sliderStartPos;

	bool isDraggingSlider = false;

	while (System::Update())
	{
		if (playButton.leftClicked)
		{
			if (sound.isPlaying)
			{
				sound.pause();
			}
			else
			{
				sound.play();
			}
		}

		if (sliderToggle.leftClicked)
		{
			isDraggingSlider = true;

			sound.pause();
		}

		if (isDraggingSlider)
		{
			const double length = sliderEndPos.x - sliderStartPos.x;

			const double offset = Clamp(static_cast<double>(Mouse::Pos().x - sliderStartPos.x),0.0, length);

			const double value = offset / length;

			sound.setPosSec(value * sound.lengthSec);
		}

		if (Input::MouseL.released)
		{
			isDraggingSlider = false;

			sound.play();
		}

		sliderToggle.setPos((sound.posSec / sound.lengthSec) * sliderDelta + sliderStartPos);

		if (sound.isPlaying)
		{
			Waving::FFT(sound);
		}
		

		const float* p = Waving::FFTBuffer();

		for (int i = 0; i < 320; ++i)
		{
			RectF(i * 2, Window::Height(), 2, -Pow(p[i], 0.6f) * 1000).draw(HSV(240 - i));
		}

		
		playButton.draw(playButton.mouseOver ? Palette::Lightcoral : Palette::Gray);

		Line(sliderStartPos, sliderEndPos).draw(10, Palette::Gray);

		sliderToggle.draw(sliderToggle.mouseOver ? Palette::Lightcoral : Palette::Gray);
	}
}

```
HikariCP + Sql2o + log4jdbc-log4j2 + Wicket（その2）

## 経緯
以前、[表題の組み合わせを使ってみるサンプルコードを書いた](http://qiita.com/gishi_yama/items/f00704c1abbf896abf58)。

実際に開発を進めてみると、WicketのWebApplicationクラスのMetaDataKeyを使って管理するよりも、SingletonなオブジェクトでSql2oオブジェクトを管理した方が（JUnitでのテストなども含めて）取り回しが楽な気がして、ちょっと変更して使いはじめたので、メモしておく。

なお、以下の手順ではGoogle GuiceとWicket-Guiceも利用している。

## 手順

### Propertiesファイルの作成

[前回](http://qiita.com/gishi_yama/items/f00704c1abbf896abf58#3-1)と同じ。

### Sql2oのインスタンス化（Singleton）

前回はWicketのMetaDataKeyで管理していたSql2oオブジェクトを、Sinbletonなオブジェクトで管理できるようにする。Singleton化にはGuiceの機能を使う。

```java:IDBCP.java
@ImplementedBy(DBCP.class)
public interface IDBCP {
  public HikariDataSource getHikariDataSource() throws SQLException;
}
```

```java:DBCP.java
@Singleton
public class DBCP implements IDBCP {

  private final Sql2o sql2o;

  public DBCP() {
    String configPath = 
      getClass().getClassLoader().getResource("").getPath() + "hikari.properties";
    sql2o = 
      new Sql2o(new HikariDataSource(new HikariConfig(filePath)), new PostgresQuirks());
  }

  @Override
  public sql2o getSql2o() throws SQLException {
    Return sql2o;
  }
```

```java:MyApplication.java
public class MyApplication extends WebApplication {

  @Override
  protected void init() {
    super.init();
    getComponentInstantiationListeners()
      .add(new GuiceComponentInjector(this, getGuiceModule()));
    //-- snip --
  }

  protected Module getGuiceModule() {
    return new Module() {
      @Override
      public void configure(Binder binder) {
        binder.bind(IDBCP.class).to(DBCP.class).asEagerSingleton();
      }
    };
  }
  //-- snip --
}
```

### Sql2oの利用

Sql2oオブジェクトの取得方法が変わるだけ。

```java:FooPage.java
public class FooPage extends WebPage {

  @Inject
  private IDBCP dbcp;

  public FooPage() {
    // 書籍テーブルからISBNのリストを取得する想定.
    // 実際の利用では 別クラスのメソッドの返値をModelなどでラッピングする.
    try (Connection con = dbcp.getSql2o.open()) {
      List<String> isbns = con
        .createQuery("select isbn from books")
        .executeScalarList(String.class);
    }
    // -- snip --
  }
}
````
CoffeeScript で MonadGenerator

```coffeescript
ns.namespace "amo.monad", (_export) ->
  MonadGenerator = (ret, bind) ->
    class Monad
      constructor: (val) -> @mVal = ret val
      bind: (a_to_mb) ->
        mb = new Monad()
        mb.mVal = bind @mVal, a_to_mb
      fmap: (a_to_b) ->
        a_to_mb = (a) -> ret a_to_b(a)
        @bind a_to_mb

    return Monad
  _export MonadGenerator, "generator"
```

```coffeescript
# Continuation Monad
ns.namespace "amo.monad", (_export) ->
  generator = ns.use "amo.monad.generator"
  ContRet = (a) -> (a_to_r) -> a_to_r(a)
  ContBind = (ma, a_to_mb) ->
    (b_to_r) ->
      a_to_r = (a) -> a_to_mb(a) b_to_r
      ma a_to_r
  ContMonad = generator ContRet, ContBind
  _export ContMonad, "cont"
```

```coffeescript
# ListMonad
ns.namespace "amo.monad", (_export) ->
  generator = ns.use "amo.monad.generator"
  ListRet = (a) -> [a]
  ListBind = (ma, a_to_mb) ->
    mb = []
    Array.prototype.push.apply mb, a_to_mb(a) for a in ma
    mb
  ListMonad = MonadGenerator ListRet, ListBind
  _export ListMonad, "list"
```

```coffeescript
# MaybeMonad
ns.namespace "amo.monad", (_export) ->
  generator = ns.use "amo.monad.generator"
  class Nothing
  nothing = new Nothing
  MaybeRet = (a) -> a
  MaybeBind = (ma, a_to_mb) ->
    if ma is nothing
      return nothing
    return a_to_mb ma
  MaybeMonad = generator MaybeRet, MaybeBind
  MaybeMonad.nothing = nothing
  _export MaybeMonad, "maybe"
```

```coffeescript
# StateMonad
ns.namespace "amo.monad", (_export) ->
  generator = ns.use "amo.monad.generator"
  StateRet = (a) -> (s) -> [a, s]
  StateBind = (ma, a_to_mb) ->
    (s) ->
      [a, s2] = ma s
      return a_to_mb(a)(s2)
  StateMonad StateRet, StateBind
  _export StateMonad, "state"
```