OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoのraw_id_fieldsが変更権限を要求する問題(#11561)を回避するバッドノウハウ

DjangoのAdminSiteのraw_id_fieldsは
ポップアップウィンドウで候補検索して選択できるので、
選択肢がいっぱいあるときとか便利。

ただし、ポップアップウィンドウが
ModelAdminのchangelist_viewを呼んでるので
選びたいだけなのに、change permissionがないと怒られる。
(https://code.djangoproject.com/ticket/11561)

ModelAdmin内のchangelist_viewのメソッドを
コピーして(changelist_view_readonlyとか)変更機能のないviewを実装してもいいけど、
もうちょっと楽な方法を。

かなりバッドノウハウだけど、

django/contrib/options.py
ModelAdminクラスのchangelist_viewメソッド内

```py
if not self.has_change_permission(request, None):
            raise PermissionDenied
```

をコメントアウトする。
そもそもchangelist_viewでは、permission持ってないと
テンプレート側でアクションボタンが表示されないので、
AdminSiteを使う管理者が自分だけとかならこれだけでOK。
ただし、非ブラウザ経由でcsrfトークン読んでPOSTリクエスト送ったら通りそう(未テスト)。
他に管理者がいたりして、セキュリティがザルでは困るときには
コメントアウトせずに、ifの条件式に

```py
request.method=='POST'
```

とか、actionがある場合の条件を加えてみたりするのがいいかも。
tmuxのおすすめ設定

[tmuxのすすめ | catatsuyのBlog](http://blog.catatsuy.org/a/243)

以前にこの記事を書きましたが，現在の私の設定とは一部乖離しているので追記します

# ESC キーの効きを良くする

tmux では ESC キーの反応が遅いです

私はたまに vim も使うので ESC の反応が悪いのは少し困ります

```.tmux.conf
set -s escape-time 0
```

# マウスを使えるようにする

マウスのスクロールを使えるようにします

```.tmux.conf
set-window-option -g mode-mouse on
```

# Solarized を使って色をいい感じにする

[Solarized - Ethan Schoonover](http://ethanschoonover.com/solarized)

これを使うと色がいい感じになります

dircolors なども用意されていて大変良いです

`source-file` などを使って外部ファイルとして読み込むのもよいですが，`.tmux.conf` に関しては大して長くもないのでコピペしてしまっても良いと思います

[solarized/tmux at master · altercation/solarized](https://github.com/altercation/solarized/tree/master/tmux)

これの好きな色を選択しましょう

ちなみに dircolors も設定したい場合は zsh ならば [.zshrcを色んな環境で共有する方法を考えてみた - Qiita [キータ]](http://qiita.com/catatsuy/items/00ebf78f56960b6d43c2#2-5) が参考になるかと思います


# tmux のコピーについて

[Ubuntu - tmux上のコピペをうまく設定する方法 - Qiita [キータ]](http://qiita.com/catatsuy/items/71b0f4932f00c6711ef5)

以前こんな記事も書いたのですが，これではリモートのサーバー上で tmux を立ち上げた時に無力です

実は Mac の場合，iTerm2 の開発版が OSC52/PASTE64 に対応しているので tmux のコピーとクリップボードの同期が取れます

[iTerm2のクリップボードインテグレーション(OSC 52/PASTE64)のつかいかた - Qiita [キータ]](http://qiita.com/kefir_/items/1f635fe66b778932e278)

この通りやれば，ローカルだろうとリモートだろうとクリップボードに同期が取れますので `tmux-copy` なるコマンドを用意する必要はありません
`reattach-to-user-namespace` 自体は `pbcopy/pbpaste` を使う際に必要ですので設定しておくと良いでしょう

残念ながら Ubuntu に関しては gnome-terminal が対応していないためこの機能を現在使うことはできません


# tmux の設定

現在の私の設定です


```.tmux.conf
# Prefix
set-option -g prefix C-z

# 日本語環境なら必須？？
setw -g utf8 on
set -g status-utf8 on

# status
set -g status-interval 10

# KeyBindings
# pane
unbind 1
bind 1 break-pane
bind 2 split-window -v
bind 3 split-window -h

bind C-r source-file ~/.tmux.conf
bind C-k kill-pane
bind k kill-window
unbind &
bind -r ^[ copy-mode
bind -r ^] paste-buffer

set -s escape-time 0

# shell
set-option -g default-shell /bin/zsh
set-option -g default-command /bin/zsh

set-window-option -g mode-mouse on

#### COLOUR (Solarized dark)
#### cf: https://github.com/altercation/solarized/blob/master/tmux/tmuxcolors-dark.conf

# default statusbar colors
set-option -g status-bg black #base02
set-option -g status-fg yellow #yellow
set-option -g status-attr default

# default window title colors
set-window-option -g window-status-fg brightblue #base0
set-window-option -g window-status-bg default
#set-window-option -g window-status-attr dim

# active window title colors
set-window-option -g window-status-current-fg brightred #orange
set-window-option -g window-status-current-bg default
#set-window-option -g window-status-current-attr bright

# pane border
set-option -g pane-border-fg black #base02
set-option -g pane-active-border-fg brightgreen #base01

# message text
set-option -g message-bg black #base02
set-option -g message-fg brightred #orange

# pane number display
set-option -g display-panes-active-colour blue #blue
set-option -g display-panes-colour brightred #orange
```

参考になれば幸いです
javascript での配列のコピーの方法 



## 最初に

- オブジェクトのコピーのことは、ここには書かない
- javascript では、オブジェクト・配列の代入は参照 (reference)
  - b = array とかやっても値渡しなコピーしない
- コピーの方法の王道がない (らしい)
- jQuery の場合は、コピー用の $.extend() がある
- オブジェクトに0,1,2,3とかのキーを入れたものは、配列と違う!

## 2つのコピー: deep & shallow コピー

deep コピーと shallowコピーの2つの方法がある

### 1. ディープコピー deep copy 

- 完全な複製
- オブジェクトのプロパティが別オブジェクトを参照していれば、参照先オブジェクトも含めコピー

### 2. シャローコピー shallow copy

- プロバティ値や要素値だけのコピー
- 参照先はコピーしない

## shallow コピーの方法

### concat

```javascript
var array = [ {a:1} ];
var array2 = [].concat(array);
```

### deep コピーの方法

- ほとんど使うことがない
- 実装方法色々 

スピード重視の場合: コピーする配列の内容に従って、効率的なコピーをするのがお勧め

#### 参考

javascriptにおける配列のコピー | JavaScriptのQ&A【OKWave】
http://okwave.jp/qa/q3688292.html


JavaScriptでの配列のコピー - STONEDSOUL
http://stonedsoul.org/post/116226943/javascript


## その他

- 破壊コピーと非破壊コピー


## 参考

- 「パーフェクトjavascript」 P.199
- 「開眼!JavaScript」初版第二刷 2013年11月26日
 - 1.13 オブジェkとはどのように保存・複製されるか (P.23)

## 検索用

javascript, array, copy, deep copy, shallow copy, object, property, 配列, コピー, ディープコピー, シャローコピー,  オブジェクト, プロパティ
rvm コマンド一覧

**RVM**

インストール可能一覧表示

```
# インストール可能一覧
rvm list known

# インストール済み一覧
rvm list
```

インストール

```
rvm install ruby-1.9.2-head
```

利用

```
rvm use ruby-1.9.2-head

# デフォルトで利用
rvm --default use 1.9.2
```

**gemset**

一覧

```
# 現在利用しているバージョン
rvm gemset list

# 全バージョン
rvm gemset list_all
```

gemインストール時に、rdoc・riをインストールしない

```~/.gemrc
gem: --no-rdoc --no-ri
```

作成

```
rvm gemset create albinochipmunk
```

利用

```
rvm gemset use albinochipmunk

# RVMのバージョンとともに指定
rvm use 1.9.2-head@albinochipmunk

# デフォルト
rvm use 1.9.2-head@albinochipmunk --default
```
Vagrantで仮想マシンを停止＆破壊＆再作成するワンライナー

```sh
vagrant halt && vagrant destroy -f && vagrant up
```

## ポイント
* destroyで-f (--force) オプションを付ければY/n 聞かれない。
* 別途vagrantのchef provision連携機能を設定しておけば、これだけでレシピの新規実行ができるので楽です。

## 動機
なぜこんなワンライナーを使う必要があるのか？

* 起動中の状態でvagrant destroyするとうまくいかないことがある
* vagrant reloadだと/vagrant 共有ディレクトリがマウントされないことがある
* vagrant haltで１分ほど待たされる
* vagrant destroyでも数分待たされる
* 「待ち時間」は１回にしたい
mochaのテストケースで条件によってスキップする方法

JavaScriptテストフレームワークの[mocha](http://visionmedia.github.io/mocha/)でBDDやTDDでテストケースを書いていて、実行環境/条件によって、特定のテストをスキップしたいときがありますが、その書き方のメモです。

karma/testemなどを利用して、複数のブラウザ環境でテストを実行するようにしていると、あるブラウザではまだサポートされていないAPIが絡むテストケースで失敗してしまいます。

そういった場合に、conditionを指定して`describe`/`describe.skip`, `it`/`it.skip`や`suite`/`suite.skip`, `test`/`test.skip`を振り分けるようにしています。

**Inclusive tests** - skipについて
http://visionmedia.github.io/mocha/#inclusive-tests

[Asynchronous code](http://visionmedia.github.io/mocha/#asynchronous-code) のコードでdescribeを例にすると下記のようになります。
よりスマートに書けるかもしれないので一例として。

```js
(window.indexedDB ? describe : describe.skip)("Connection", function() {
  var db = new Connection
    , tobi = new User("tobi")
    , loki = new User("loki")
    , jane = new User("jane");

  beforeEach(function(done){
    db.clear(function(err){
      if (err) return done(err);
      db.save([tobi, loki, jane], done);
    });
  })

  describe("#find()", function(){
    it("respond with matching records", function(done){
      db.find({ type: "User" }, function(err, res){
        if (err) return done(err);
        res.should.have.length(3);
        done();
      })
    })
  })
})
Git の仕組みを5分で理解する!


Git の学習コストが高くて酷いので、数分で理解できるように無理やり説明してみます。
大雑把に理解した後、詳しく説明したドキュメントを読んで下さい。
まともに仕組みを理解しようとすると、数時間以上は必要かと思います。

## 前提知識

cvs, svnなどバージョン管理システムを利用したことがあることを前提としています。
レポジトリ、ブランチ、コミット、マージ、コンフリクト等の意味は、理解していることを前提とします。


## 歴史

- 元はLinux のカーネル用に Linus が開発。(今は、濱野 純氏がメンテナ)
- 動作(マージ)速度を重視。

なので、無駄なマージ処理等しない工夫があったりする。 
が、それによって理解が難しい一面になっているように思う(個人的感想)

## 分散型レポジトリ

- 分散型レポジトリ 
  - CVS, subversionのようにレポジトリが一箇所じゃない
- レポジトリ自体をローカルにコピー(clone)してくる
- そのローカルのレポジトリにコミットする
- ローカルのレポジトリにコミットしたものをリモートのレポジトリにpushする
- リモートとローカルで使うことが多い
  - よくある例: GitHub であるレポジトリを自分のGitHubアカウントにforkする。そのレポジトリを自分のローカルPCにコピー(clone)して開発。というパターンが一般的。
- 複数のリモートレポジトリを持ったりすることもある
- 誰かのローカルレポジトリの内容を自分のローカルに取り込む、なども可能

## どこに反映する?

- どこのレポジトリ?
- どこのブランチ?

上記2つを指定する必要がある。

分散レポジトリなので、どこのレポジトリのどのブランチにpushするの? を指定する。

GitHub からレポジトリをコピー(clone)して、ローカルでdevelopブランチを作ってそこにコミットし、別のリモートにあるgit レポジトリ(例えば BitBucket) にあるdevelopブランチに、pushする。などができる。

## origin master って?

よく見るのが、git push origin master の "origin master"。

- origin が、リモートレポジトリの場所の別名
- master は、master ブランチ

つまり、どこのレポジトリの、どのブランチかを指定する

## 3つの状態

この3つの状態を初めに理解するのが重要です。
下記の3つの状態に作業を行うからです。

1. 作業ディレクトリ
2. ステージング・エリア
3. Gitディレクトリ (レポジトリ)

作業ディレクトリで変更ファイルをステージにあげてから、レポジトリにコミットします。

## 作業の流れ

よくある作業の流れ

- GitHubの場合(GitHubの本家レポジトリを自分のGitHubにforkする)
- リモートのレポジトリをコピー (git clone [リモートレポジトリの場所])
- 作業ブランチを作成 (git branch [ブランチ名])
- 作業ブランチに移動 (git checkout [ブランチ名])
- 作業ディレクトリで、ファイルを変更する
- 状態の確認 (git status)
- ステージング・エリアに変更済みファイルを追加 (git add)
- コミット (git commit)
- コミットしたものをリモートレポジトリにプッシュ (push)
- GitHubの場合、本家にプルリクエストを送るパターンが多い

### その他、よくある作業

- リモート・レポジトリの変更の取り込み、マージ
- マージ・コンフリクトの解消
- ファイル、ブランチの削除
- 作業の取り消し

チームで作業しはじめ、沢山のリモートレポジトリ、ブランチと作業し始めると、さらい複雑で学習コストがかかります。

## ファイルの状態

git status でファイルの状態の確認する時に必要な概念です。

### gitに認識されているか、いないか?

- 追跡されている (tracked)
- 追跡されてない  (untraced)

### 追跡されているファイルの3つの状態

- 変更されていない (unmodified)
- 変更されている (modified)
- ステージされている (staged)


## コミット情報のやり取り

無理やり大雑把に表現すると以下のような感じ

### リモートとローカルレポジトリとのやり取り

- fetch 
- push

### ローカルレポジトリとのやり取り

- add
- commit

### (ローカル&リモート)ブランチとのやり取り

- merge
- pull (= fetch & merge )

### その他

- svn update 的な git update はないよ

## レポジトリ管理のディレクトリ

.git ディレクトリ以下で管理

## リモートレポジトリの変更を取り込む方法

git merge か git rebase かがわかりづらい!! (別記事で書く!)


## Fast forward (早送り)

- マージの命令が来ても、結局ファイルが一緒なら実際にファイルのマージしないで、コミットの先頭に持っていくだけ 
 巨大なLinux kernelのように無駄なマージコスト削減のためと思われる


## その他、覚える必要があること

- git pull と git rebase の違い
- git stash でファイル変更を一時退避
- コンフリクトの解消方法
- add, commit, push作業の取り消し方法 


## 参考

Git - Wikipedia
http://ja.wikipedia.org/wiki/Git

Git - Book
http://git-scm.com/book/ja/
コンポーネントにメニューに独自のものを追加する

C#

```java
[AddComponentMenu("Camera-Control/CameraController")]
```

Javascript

```js
@script AddComponentMenu("Camera-Control/CameraController")
```

　上記のようにコード内に記述すると、そのファイルは上部メニューバーの[Component]やインスペクターパネルの[Add Component]に追加されます。
　なお、[Scripts]には表示されなくなります。
プロジェクト毎にgemを管理するにはどうしたらよいんだろう


rubyは

- 必要なmoduleとか用意されてた環境で
- ちょこちょこスクリプトを書いたことある

程度で、gemとかbundlerとかうまく使ってみたいなあ、なんて思ってて。
いろいろ試してみて、とりあえず落ち着いたやつを記録しておく。

## 環境

- MacOSX 10.9 Mavericks
- `$ ruby -v` => ruby 1.9.3p392 (2013-02-22 revision 39386) ...
  - rbenvでいれました
- `$ gem -v` => 1.8.23
- `$ bundle -v` => Bundler version 1.3.5

## 実現したいやつ

[こんなかんじ](http://qiita.com/emadurandal/items/a60886152a4c99ce1017)をやってみたかったけど、`$ bundle exec hoge`はめんどい...

- bundlerとかでgem管理したくて
  - そのまま使ったら`$ gem list`がごちゃごちゃになりそう
- vendor/bundleとかにgem突っ込んだりしたい
  - そのプロジェクト下だけに影響させたい
- でも`$ bundle exec hoge`とかやりたくない
  - 打つのめんどい...

## いまのところの結果

この辺りを参考にして[rbenv-gemset](https://github.com/jamis/rbenv-gemset)を使ってgemsetで管理しながらbundlerを使うかんじに落ち着けた
[rbenv + ruby-build + rbenv-gemset に移行してみた | Re: no subject](http://henry.animeo.jp/wp/?p=1638)
[rvmのgemsetを使ってbundlerと賢く付き合う方法 - Hello, world! - s21g](http://blog.s21g.com/articles/1930)

- プロジェクト毎にgemsetを用意すればおk
  - 毎度空のgemにbundler入れてから使うイメージ
  - でもgemset作るのそこそこめんどくさい気もする
- Gemfile書いて`$ bundle install --system`してあげれば再現しやすい
  - 結果的にdefaultのlibディレクトリに入っちゃってるけど...
  - だって[rbenv-binstubs](https://github.com/ianheggie/rbenv-binstubs)使ってみたりとか`--path=vendor/bundle`とか指定してinstallしてみたけど、うまくpath通せない...
     - 具体的には、rubyスクリプトで`gem "rails", "3.2.13"`とかやった場合にそこ解決してくれないetc.
     - $LOAD_PATHとかいじってみたけどうまく反映されなかった

まだまだRuby力足りなくてかなしいです 別にこんなことしなくてもよいのかなあ...
なんかよくわかんなくなってきた

## その他参考

- [bundle execを使わずにすむ方法 - Qiita [キータ]](http://qiita.com/naoty_k/items/a1fbac19686a8fcd2e34)
- [bundle execを使わずに済む方法（rbenv編） - Qiita [キータ]](http://qiita.com/naoty_k/items/9000280b3c3a0e74a618)
KHR_debug and EXT_debug_marker/EXT_debug_label


OpenGL における開発効率を上げる目的で導入された OpenGL 拡張に [KHR_debug](http://www.khronos.org/registry/gles/extensions/KHR/debug.txt) と [EXT_debug_marker](http://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_marker.txt)/[EXT_debug_label](http://www.khronos.org/registry/gles/extensions/EXT/EXT_debug_label.txt) がある。その微妙な違いを比較してみる。後者は OSX 10.9 で導入されている。

いずれの拡張もドライバ側が実装していなくてもオープンソースである [apitrace](https://github.com/apitrace/apitrace/) で実行すればエミュレートしてくれる。

上記の拡張があるので、glGetError を使ったやり方は非常に原始的であり、コードにいちいち埋め込むより apitrace を使えば視覚的に捕捉してくれる。ドライバが上記の拡張を持っているあるいは apitrace が利用可能な環境において glGetError を使うのは極力避けるべきである。

## KHR_debug
[ARB_debug_output](http://www.opengl.org/registry/specs/ARB/debug_output.txt) の後継として実装された OpenGL 拡張。先の拡張に加えてEXT_debug_marker と EXT_debug_label の持つ機能を包括している。

## EXT_debug_marker
元々 [GREMEDY_string_marker](http://www.opengl.org/registry/specs/GREMEDY/string_marker.txt) というベンダ拡張からグルーピング可能にして使い勝手を上げて汎用的になった OpenGL 拡張。元々は Apple の拡張だった。

## EXT_debug_label
数値のハンドルで取り扱う OpenGL のオブジェクトに名前を付加する OpenGL 拡張。EXT_debug_marker と同様元々 Apple の拡張だった。

本題はここからで、KHR_debug と EXT_debug_(marker|label) は関数名が違う上に場合によっては与えるべき引数も異なる。まず関数名を見てみよう。

|KHR_debug|EXT_debug_marker|EXT_debug_label|
|---|---|---|
|glDebugMessageInsert|glInsertEventMarkerEXT|N/A|
|glPushDebugGroup|glPushGroupMarkerEXT|N/A|
|glPopDebugGroup|glPopGroupMarkerEXT|N/A|
|glObjectLabel|N/A|glLabelObject|
|glGetObjectLabel|N/A|glGetLabelObject|

見ての通りだが、名前が異なることがわかる。さらに仕様書にある関数のプロトタイプを見てみよう。

```c
// KHR_debug
void DebugMessageInsert(enum source, enum type, uint id, enum severity, sizei length, const char* buf);
// EXT_debug_marker
void InsertEventMarkerEXT(sizei length, const char *marker);

// KHR_debug
void PushDebugGroup(enum source, uint id, sizei length,  const char * message);
// EXT_debug_marker
void PushGroupMarkerEXT(sizei length, const char *marker);

// KHR_debug
void PopGroupMarkerEXT();
// EXT_debug_marker
void PopDebugGroup(void);

// KHR_debug
void ObjectLabel(enum identifier, uint name, sizei length, const char *label);
// EXT_debug_label
void LabelObjectEXT(enum type, uint object, sizei length, const char *label);

// KHR_debug
void GetObjectLabel(enum identifier, uint name, sizei bufSize, sizei *length, char *label);
// EXT_debug_label
void GetObjectLabelEXT(enum type, uint object, sizei bufSize, sizei *length, char *label);
```
関数の引数も Pop* 以外は全部異なる。しかも、NULl 文字終端の文字列渡すとき EXT_debug_(marker|label) は 0 で渡す必要があるが KHR_debug は -1 を渡す必要があるという罠にも注意が必要。

EXT_debug_(marker|label) よりも引数が多くより柔軟な設定が可能な KHR_debug について本当はまだ書かなければいけないことがたくさんあるように見えるが一旦ここまでにします...。
Go言語を書くときにテスト駆動開発でやりたいなと思ったので、適当にテスト用のパッケージを調べてみた


# Go言語標準のtestingパッケージが個人的に使いづらかったのがきっかけ

個人的にカジュアルにTDDをしたかったので、PythonでいうassertEqualみたいなものが無いtestingパッケージが個人的に使いづらかったというだけです。(※筆者はPythonをよく使っています)

# 単なるユニットテストならgithub.com/stretchr/testify/assertパッケージが良いと思った

これです。

- https://github.com/stretchr/testify

testifyパッケージの下にassert, http, mockパッケージがあって、それぞれ独立して使うことが出来ます。

importするときは、事前に`go get github.com/stretchr/testify`を行い、コード内部でこんな感じにimportすれば以下のように使えます。公式サイトの例のままですが。

```example.go
package yours

import (
  "testing"
  "github.com/stretchr/testify/assert"
)

func TestSomething(t *testing.T) {

  assert.True(t, true, "True is true!")

}
```

詳しくは[githubリポジトリのREADME](https://github.com/stretchr/testify/blob/master/README.md)のInstallationの項目を読めば分かると思います。

`assert.True(t, true, "True is true!")`のように、Pythonのunittestモジュールライクな関数が手頃に使えるので、testingパッケージの使い方が分からなかった私でも簡単に使えました。私はこれでGo言語のTDDを始められたといっても過言ではないです。

どんな便利関数があるかは[assertパッケージのAPIドキュメント](http://godoc.org/github.com/stretchr/testify/assert)を読めばいいと思いますよ。

私はよく知らなかったんですが、'A lightweight RESTful web framework for Go'と謳っている[goweb](https://github.com/stretchr/goweb)を[作った会社(の人たち)](https://github.com/stretchr)が作っているみたいなので、定期的にメンテされそうな気がするのも個人的にはポイントだったので挙げてみました。

どういう風に作っているのか気になったのでtesting/assertパッケージのソースコードを少し見てみましたが、それほど大きくないパッケージで、標準のtestingパッケージをreflectパッケージとか活用した薄めなラッパーなので、私みたいなGo言語初心者はソースコード読んでみると勉強になると思います。特にreflectパッケージの使い方とか。

testify/assertパッケージだけでなく、testify/mockパッケージもあるので、モックを使う機会があったらこっちも試してみたいですね。モックに関してはこちらの[gomock](https://code.google.com/p/gomock/)の方がデファクトなのかもしれませんが。

# BDDスタイルのテストを書きたい!!!という人はこういったものがあります

これらです。他にもあるとは思いますが。

- https://github.com/onsi/ginkgo
- https://github.com/r7kamura/gospel

私はたまたま[こういった記事をたまたま最初に見た](http://pivotallabs.com/announcing-ginkgo-and-gomega-bdd-style-testing-for-golang/)ので、ginkgoの方を使い始めましたが、後者のgospelは日本の[@r7kamura](https://twitter.com/r7kamura)さんが作っていますし、以下のようなブログ記事を書いて使い方も説明してあるので使い方に詰まったら質問しやすいかと思います。

- [Go言語のテスト用ライブラリとGospel](http://r7kamura.hatenablog.com/entry/2013/10/06/231236)

…まあ、上記どちらの方が使いやすいかというより、どっちかというとRSpecのようなBDDスタイルのテスティングフレームワークを使った経験があるかどうかで使いやすさが全然違うと思いました。私はRSpecみたいなものを使ったことが無かったのでginkgoのドキュメントを読んでいるとき、Contextとか色々あって最初意味不明でしたね。今でも意味がよく分かってないと思います。

## 追記(2013/10/29): 他の方のGo言語テスティングフレームワーク関連の記事

私よりも詳しく上記パッケージ+αを紹介していて、かつWindows関連の情報を記載している記事を見かけたのでリンクしておきます。

- [go言語のテスティングフレームワークについて - さにあらず](http://taichi.hatenablog.com/entry/2013/10/28/215532)

# Go言語のデファクトなテスティングフレームワークが欲しくなってきています

余裕が無くて標準のtestingパッケージ以外には上記二つのパッケージしか試せていないのですが、どうやってテストを書けばいいのか分からなくなってくることが多いし、LLとは違ってビルド時に型間違いとか気づきやすくなっているとは言ってもテストしたくなる箇所も割とあるので、デファクトなテストフレームワーク、というかGo言語らしいテストのやり方決定版みたいなものが早く共有されて欲しいなあ、と最近思っています。
Tumblr SDK for iOSの使い方

以前作ったアプリでTumblr SDKを使うことがありましたので、導入方法を紹介します。

Tumblr APIもありますが、SDKを使う方がより簡単に使えます。

まずこちらからアプリを登録してOAuthによる認証に必要なコンシューマキー、コンシューマ秘密鍵取得します。

http://www.tumblr.com/oauth/apps

CocoaPodsを使って導入もできますが、今回は必要なファイルを直接取ってきます。

まずこちらからTumblr SDKをダウンロードしてください。

https://github.com/tumblr/TMTumblrSDK

解凍してできたTMTumblrSDKディレクトリをプロジェクトにコピーします。

下記も必要となりますのでダウンロードしてプロジェクトにコピーしてください。

・JXHTTP
https://github.com/jstn/JXHTTP

・NSData-Base64
https://github.com/l4u/NSData-Base64

これでSDKを使用する準備が整いました。

ではここからは認証方法についてです。

AppDelegateのapplication:didFinishLaunchingWithOptionsに下記のコードを追加します。

```objc
[TMAPIClient sharedInstance].OAuthConsumerKey = @"取得したコンシューマキー";
[TMAPIClient sharedInstance].OAuthConsumerSecret = @"取得した秘密鍵";
```

次にinfo.plistにURL schemeの設定を行います。

```xml
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>astumblrclient</string>
    </array>
  </dict>
</array>
```

上記で設定したURL schemeでアプリを起動できるようにします。

```objc
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [[TMAPIClient sharedInstance] handleOpenURL:url];
}
```

次に認証処理を行います。
引数に上記で設定したURL schemeを設定してください。

```objc
[[TMAPIClient sharedInstance] authenticate:@"astumblrclient" callback:^(NSError *error) {
            if (error) {
                NSLog(@"Error login to Tumblr");
            } else {
                NSLog(@"login to Tumblr");
                
                // 取得したコンシューマキーと秘密鍵を保存する
                settingInfo.tumblrAuthToken = [TMAPIClient sharedInstance].OAuthToken;
                settingInfo.tumblrAuthTokenSecret = [TMAPIClient sharedInstance].OAuthTokenSecret;
                ・・・
            }
        }];
```

認証が完了したらDashboardから画像一覧をリクエストします。

```objc
[[TMAPIClient sharedInstance] dashboard:@{@"type": @"photo",
                                              @"limit" : @"20"}
                                   callback:^(id results, NSError *error) {
        
        NSLog(@"results: %@", [results description]);
        
        NSArray *posts = results[@"posts"];
        if (posts.count > 0) {
            // 処理を行う
            ・・・
        }
    }];
```

実際にDashboardの画像一覧を取得して表示するサンプルを作ってみましたので、参考にしてください。

https://github.com/asakahara/ASTumblrClient

![tumblrScreenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/30826/73f08091-d475-04fb-2e7c-1bb925f5a260.png "tumblrScreenshot1.png")

作ってみた感想としてSDKを使えば簡単にTumblr APIを扱えるのですが、
ドキュメントが少ない点や日本語の情報がほとんどないので少し困りました。
日本人でTumblrを使う人があまり多くないということなんでしょうかね。
RailsでMarkdown書式を解析


##[Redcarpet](https://github.com/vmg/redcarpet)を使えば簡単だった

```ruby:Gmefile
gem 'redcarpet'
```

```ruby:controller
@info = Info.find(params[:id])
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML)
@html = markdown.render(@info.content)
```

```ruby:view
<%= @html.html_safe %>
```
じゃんけんアルゴリズムをちょっと応用

# じゃんけんの勝敗判定

## グー・チョキ・パーの3種類で判定

#### [じゃんけん勝敗判定アルゴリズムの思い出](http://staku.designbits.jp/check-janken/)
こちらの記事を参考にさせていただきました。

**グー = 0**
**チョキ = 1**
**パー = 2**

として、

**(自分の手 - 相手の手 + 3) % 3**

の値を見て

**0 = 引き分け**
**1 = 負け**
**2 = 勝ち**

というものです。
数学に強い人なら何も説明しなくても「あーなるほど」と分かると思います。

#### 自分が勝つとき

|自分|相手|差|差 + 3|(差 + 3) % 3|
|----:|----:|----:|----:|---:|
|0|1|-1|2|2|
|1|2|-1|2|2|
|2|0|2|5|2|

#### 自分が負けるとき

|自分|相手|差|差 + 3|(差 + 3) % 3|
|----:|----:|----:|----:|---:|
|0|2|-2|1|1|
|1|0|1|4|1|
|2|1|1|4|1|

#### 引き分けのとき

|自分|相手|差|差 + 3|(差 + 3) % 3|
|----:|----:|----:|----:|---:|
|0|0|0|3|0|
|1|1|0|3|0|
|2|2|0|3|0|

## グー・チョキ・パー・皇帝・奴隷の5種類で判定

#### 皇帝

- 基本勝つ
- 但し **奴隷** だけには負ける

#### 奴隷

- 基本負ける
- 但し **皇帝** だけには勝てる

というルールを採用したとき。
（手をどんな形にするのか知らないが）

**グー = 0**
**チョキ = 1**
**パー = 2**
**奴隷 = 3**
**皇帝 = 6**

#### 1. 自分か相手に皇帝・奴隷が含まれているかチェック。

含まれていなければ通常通り処理をして結果を返す。

#### 2. それぞれの手を **3で割って小数点以下を切り捨てる** 。

```php
$you = (int)($you / 3);
$com = (int)($com / 3);
```

### 3. 通常通り判定する

通常時

|手|記号|
|:----|---:|
|グー|0|
|チョキ|1|
|パー|2|

3で割ったとき

|手|記号|
|:----|---:|
|グー・チョキ・パー|0|
|奴隷|1|
|皇帝|2|

通常時の処理をそのまま適用しても正しく判定出来ることが分かります。

# PHPでの実装例

```php
<?php

// 勝敗判定関数
function battle($a, $b) {
    if ($a > 2 || $b > 2) {
        $a = (int)($a / 3);
        $b = (int)($b / 3);
    }
    return ($a - $b + 3) % 3;
}
 
// 手のリスト
$hand_list = array(
    0 => 'グー',
    1 => 'チョキ',
    2 => 'パー',
    3 => '奴隷',
    6 => '皇帝',
);
 
// 結果リスト
$result_list = array(
    2 => 'あなたの勝ちです',
    1 => 'あなたの負けです',
    0 => 'あいこです',
    -1 => '不明',
);
 
// 手が送信されたとき勝負を実行
if (isset($_POST['you'])) {
    // 整数型にキャスト(不正な値をエラー無しに防ぐ効果もある)
    $you = (int)$_POST['you'];
    // コンピュータの手を選出
    $com = array_rand($hand_list);
    if (!isset($hand_list[$you])) {
        // 不正な値のときは自分の手を「？」、結果を「不明」にする
        $hand_list[$you = $result = -1] = '？';
    } else {
        // 正しい値のときは関数に渡す
        $result = battle($you, $com);
    }
}

// ヘッダー送信
header('Content-Type: application/xhtml+xml; charset=utf-8');
 
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
  <head>
    <title>じゃんけんゲーム</title>
    <style type="text/css">
      label { display: block; }
    </style>
  </head>
  <body>
    <h1>じゃんけん</h1>
    <form action="" method="post">
      <label><input type="radio" name="you" value="0" checked="checked" />グー</label>
      <label><input type="radio" name="you" value="1" />チョキ</label>
      <label><input type="radio" name="you" value="2" />パー</label>
      <label><input type="radio" name="you" value="6" />皇帝</label>
      <label><input type="radio" name="you" value="3" />奴隷</label>
      <label><input type="submit" value="勝負！" /></label>
    </form>
<?php if (isset($result)): ?>
    <h1>勝負！</h1>
    <p>
      あなた： <?=$hand_list[$you]?><br />
      コンピュータ: <?=$hand_list[$com]?><br />
      <?=$result_list[$result]."\n"?>
    </p>
<?php endif; ?>
  </body>
</html>
```
rbenvで最新のrubyを取得する方法(Ubuntu)

自分の環境で成功した方法を記載しています。
##１.ユーザーローカルなディレクトリにrbenvをインストールしている場合

まずは以下の方法を試す。
http://qiita.com/kawasy/items/5d000afa6571c71c2723

```bash
git remote -v
fatal: Not a git repository (or any of the parent directories): .git
```

不幸にも上記のようなエラーが出てしまった場合。
勝手な想像だがこのようなエラーが出るのはgit clone をhttps経由で行なっている場合に発生するのではないかと思う。
以下の手順でruby-buildをインストールし直す。

```bash
cd #（ホームディレクトリにファイルをコピーしている場合が多いためホームヘ）
rm -fr ./ruby-build
git clone https://github.com/sstephenson/ruby-build.git
cd ruby-build
sudo ./install.sh
```

##２.全ユーザー共通で使用しているrbenvを使用している場合

全ユーザー共通でrbenvを使用する方法の参考
http://qiita.com/nekogeruge_987/items/2e73be2ffb105c28ffad

上記方法でインストールしているrbenvでrubyを管理している場合
pluginsにインストールしているruby-buildが古いと新しいrubyが参照できないので更新する必要がある（はず）

以下方法
pluginsのディレクトリへ移動しruby-buildディレクトリ削除、その後ruby-buildを入れなおす。

```bash
cd $RBENV_ROOT/plugins
rm -fr ./ruby-build
git clone https://github.com/sstephenson/ruby-build.git
```

これで最新のRubyを参照できるはず

```bash
rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  1.8.7-p358
　・
　・
　・
```

2014/03/19追記　gitを使っているので以下の方法のほうが早いという事に気づいた。

```bash
cd /opt/rbenv/plugins/ruby-build/
git pull origin master
```
最低限！把握しておきたい【Gitコマンド】

半年くらいGit使って来てこれだけ使えればいいなと思うGitコマンドまとめました。
「GitHub for Macでええやん！！」という方は来世で会いましょう。

#git add .
定番のaddコマンド、言わずと知れたステージング

$ git add .
$ git add index.html

みたいに使う事が多い

#git commit -m "commit message."
コミットするよ、基本的に他のオプションは使わないかな

#git diff index.html
ファイルの変更、全体的な変更を見れる。

#git status
今のファイルのコミット、ステージングの状況が見れる

#git branch
ローカルのブランチ一覧が見れる

他にもブランチを作ったり
$ git branch new_branch_name

リモートのブランチを確認するのに使う
$git branch -vr

#git push origin master
originに指定されたリポジトリにmasterのブランチをコミットする
ここら辺はGUIのほうがいいかも

$ git pull origin master
originに指定されたリポジトリのmasterブランチをプルする

# git stash
今の変更状況を一時的に退避する、
stashには10こまで保存可能

名前つけて保存
$ git  stash save "stash_name"

stashを適用して削除
$ git stash pop stash@{0}

stashを適用するが削除しない
$ git stash apply stash@{0}

#git checkout 
指定のコミットソースの状態にする

ブランチつくってそっちにチェックアウト
$ git checkout -b "new_branch_name"

全部戻す
$ git checkout .

index.htmlをksoas989232j3ji232j3iのコミットハッシュの状態に戻す
$ git checkout ksoas989232j3ji232j3i index.html

#git log
コミットログの確認


作法的には「一気にpullすんなfetchしろ！」とか「git add -p使え！」とかあるけど
基本的にはこれらとGUIで仲良くすればgit使ってますわ〜と言えるでしょう
[JS]KnockoutJS 3.0 Upgrade Noteを読む 第1弾


## はじめに

KnockoutJSの3.0がリリースされましたね。
Upgrade Notesを読んで分かった事をまとめます。
今回は、「1. Computed properties now notify only when their value changes」を読みます。

説明を読むと、2.xまでは`computed`が評価された際は、必ず変更したとういう通知が行くそうです。`subscribe`でコールバックを仕掛ければ、その通知を受取ることができます。3.0では、`computed`が評価された結果が前回と同じであれば、通知がいかないようになっています。

文章だけ見ると、分かったようで分からないので、KnockoutJSのソースコードを読みましょう。

## 2.3.0のコード

2.3.0のコードを見てみます。
https://github.com/knockout/knockout/blob/v2.3.0/src/subscribables/dependentObservable.js#L80-L84

`evaluateImmediate`が呼ばれると、値の更新とその事の通知が行なわれているのが分かります。ただし、依存しているobservableが更新されないと`evaluateImmediate`が呼ばれずに、前回評価した値を使うので注意が必要です。

```2.3.0.dependentObservable.js
function evaluateImmediate() {
	//...
	// ここで値の更新と通知している
	dependentObservable["notifySubscribers"](_latestValue, "beforeChange");
	_latestValue = newValue;
	dependentObservable["notifySubscribers"](_latestValue);
	//...
}
```

## 3.0.0のコード

次に、3.0.0のコードを見てみます。
https://github.com/knockout/knockout/blob/v3.0.0/src/subscribables/dependentObservable.js#L85-L91

2.3.0に無かったif文が追加されているのが分かります。
見ての通り、値に変化がなかったら更新も通知もしないというものです。

```3.0.0.dependentObservable.js
function evaluateImmediate() {
	//...
	// 変更なければ、更新も通知もしない
	if (!dependentObservable['equalityComparer'] || !dependentObservable['equalityComparer'](_latestValue, newValue)) {
		dependentObservable["notifySubscribers"](_latestValue, "beforeChange");
		_latestValue = newValue;
		dependentObservable["notifySubscribers"](_latestValue);
	}
	//...
}
```

### 動かして違いを見る

ソースコード上の違いが分かったので、実際に動きの違いを見てみましょう。
以下のコードには、`n`という`observable`と`evenN`という`computed`がでてきます。`n`には数値が入り、`evenN`は`n`が偶数だったら`true`を返すようにしてあります。
2.xの場合、`evenN`の結果が同じでも通知がいきます。例えば、以下のコードでは、はじめ`n`に`10`が入っており、その後`20`に変わっています。どちらも偶数なので、`evenN`は共に`true`になります。`evenN`の値は変わっていないので、通知はいってほしくないですが、2.xの場合は通知がいってしまいます。
一方、3.0.0の場合は、`n(20)`では`evenN`の値は変わらないので、通知はいいません。`n(21)`では、奇数になるので、`evenN`の値は`false`となるので、通知がいきます。

JSFiddleで動作を確認してみましょう。
2.3.0：http://jsfiddle.net/uedatakuya/TdErN/
3.0.0：http://jsfiddle.net/uedatakuya/xxK9E/

```js
var n = ko.observable(10);

var evenN = ko.computed(function() {
    var isEven = n() % 2 == 0;
    alert(isEven);
    console.log(isEven);
    return isEven;
});

evenN.subscribe(function(newValue) {
    alert("change evenN to " + newValue);
    console.log("change evenN to " + newValue);
});

n(20);
n(21);
```

### 挙動が変わると困る場合

上述のように、3.0.0では2.xと挙動が変わります。2.xの挙動と同じようにしたい場合は、Upgrade Notesに書いてある通り、`myComputed.extend({ notify: 'always' });`のように、必ず通知がいくようにしましょう。

http://jsfiddle.net/uedatakuya/sKHgg/

```js
var n = ko.observable(10);

var evenN = ko.computed(function() {
    var isEven = n() % 2 == 0;
    alert(isEven);
    console.log(isEven);
    return isEven;
});

// 必ず通知がいくようにする
evenN.extend({notify: 'always'});

evenN.subscribe(function(newValue) {
    alert("change evenN to " + newValue);
    console.log("change evenN to " + newValue);
});

n(20);
n(21);
```
Node.jsでwkhtmltoimageを使ってWebサイトのキャプチャ画像を取得

npmにもnode-wkhtmlというモジュールがあるけど、child_processを使ってサックリと

[wkhtmltoimage/wkhtmltopdf](https://code.google.com/p/wkhtmltopdf/)

wkhtmltoimageは/usr/bin/wkhtmltoimageにインスコ済の前提で

```js:wkhtmltoimage.js
var chunks = new Array();
var convert = require('child_process').spawn('/usr/bin/wkhtmltoimage', ['--format', 'jpg', '--quality', '100', 'https://www.google.co.jp/', '-']);
convert.stdout.on('data', function(chunk){
	chunks.push(new Buffer(chunk));
});
convert.stderr.on('data', function(data) {
})

convert.on('exit', function(code){
	var data = Buffer.concat(chunks);
	console.log('data:image/jpeg;base64,');
	console.log(data.toString('base64'));
});

```
Google先生のトップページをJPEG形式でキャプった画像がdataURL形式で取得できる
spawnのオプション配列でPNG形式にできたり、ブラウザのサイズや出来上がりの画像サイズを調整したり
convert.on('exit')のコールバックにcodeという引数があるが、これはwkhtmlto*プロセスのexit codeで0以外だと404とか色々あったことがわかる

JavaScriptの実行遅延なども含めてキャプチャ完了までに数秒オーダーで時間がかかるので、Webアプリにする場合はgearmanのworkerとして動かしたり、リクエストをXHRで投げるとかやってる
composerが存在するパッケージを見つけられない

PHPのcomposerで、存在するはずのパッケージが見つからないとエラーが出る場合。
[参考ページ](https://groups.google.com/forum/#!topic/composer-dev/7iTloXl0SHU)

```
Problem 1
- example/package1 dev-master requires example/package2 dev-master -> no matching package found.
```
packagistでチェックして、パッケージ名もdev-masterも存在するにもかかわらず、見つからないというエラーが出てcomposerがパッケージをインストールしてくれない。

原因は、スタビリティが設定されていない、というのがある。
下記のようにminimum-stabilityを「dev」に指定すると直る。

```js
{
    "minimum-stability": "dev",
    "require": {
        "example/package1": "dev-master",
    }
}
```

composerのデフォルトは、開発中のパッケージをインストールしないようになっているので、最低のスタビリティを開発に変更すると、パッケージをインストールしてくれる。
画像の事前ロードをCoffee Scriptでやる

何度 `Coffee` と検索して「美味しいコーヒーの入れ方」的なサイトにたどり着いたことかわかりません。
おしゃれな名前をつけるのはいいですが、少しは検索効率とかも考えてもらいたいものです。

## 本題

画像の事前ロードをCoffee Scriptでやるには

```coffeescript
preload = (images) ->
  $(images).each ->
    (new Image()).src = @

$ ->
  preload(["img/hoge_hover.png",
    "img/moge_hover.png",
    "img/foo_hover.png"])
```

な感じになります。 jsフォルダに入ってるから "../img/foo_hover.png" 的な呼び出しかと思ってましたがそんなことありませんでした。



## 参考

javascript - Preloading images with jQuery - Stack Overflow
http://stackoverflow.com/questions/476679/preloading-images-with-jquery
PHP New Relic でVirtual Hostごとに設定を変える方法


## New Relic って何よ?

- サーバのパフォーマンス等を計測するサービス
- rpm でちらっとインストールすると、計測しはじめ、New Relic の Webサイトで計測結果を見られる
- 有料だけど、便利。個人用無料コースか、オープンソースのものがでないかな…

## Apache の設定 (apache.conf/httpd.conf)

```
<VirtualHost 192.168.42.43>
  ServerName www.myvhost1.com
  DocumentRoot "/path/to/vhost1/"
  ...
  <IfModule php5_module>
       php_value newrelic.appname "Virtual Host 1"
  </IfModule>
</VirtualHost>

<VirtualHost 192.168.123.45>
  ServerName www.myvhost2.com
  DocumentRoot "/path/to/vhost2/"
  ...
  <IfModule php5_module>
    php_value newrelic.appname "Virtual Host 2"
  </IfModule>
</VirtualHost>
```

## php-fpm の場合

```
[app1]
listen=/tmp/pool-app1.sock
php_value[newrelic.appname] = "My App 1"

[app2]
listen=/tmp/pool-app2.sock
php_value[newrelic.appname] = "My App 2"

[app3]
listen=/tmp/pool-app3.sock
php_flag[newrelic.enabled] = off
```

## Nginx の場合

```
location /blog {
  fastcgi_param PHP_VALUE "newrelic.appname=My Blog";
  ...
}

location /shop {
  fastcgi_param PHP_VALUE "newrelic.appname=Shopping Cart";
  ...
}
```

```
  if (extension_loaded ('newrelic')) {
    newrelic_set_appname ("My App 1");
  }
```


## 参考

PHP per-directory INI settings - New Relic Documentation
https://newrelic.com/docs/php/per-directory-settings
WEB+DB Press 75号と76号のEmerging Web Technology研究室を手元で再現しようとしてハマった話


## 顛末
伊藤直也さんの「ChefとVagrantによるインフラのコード化」と「serverspecによるテスト駆動インフラ構築」を続けて手元で試した。

「serverspecによるテスト駆動インフラ構築」の122ページ、nginxの「テストを実行する」ステップで、テストが赤のままFailureした。WEB+DBの記述によれば、ここですべて通るはずなのに。

何度試してもテストは通らない。よくログを見ると、そもそも

```
$ knife solo cook webdb
```

でnginxをインストールしようとしても

```
package[nginx] action install (up to date)
```

となっている。すでにup to dateだからインストールする必要はないとのこと。しかしvagrant sshで実際に見てみるとrake specの結果どおり、インストールはされていない。

## 原因
Vagrantで作った仮想サーバのホスト名が両方ともwebdbだったからだよ！！！！！！！！

### どういうことかというと
knife-soloやserverspecはsshでサーバに入ってシェルスクリプトを実行するだけのもの。なので、

```
ssh webdb
```

でwebdbと名前をつけたサーバに入れるように設定しておく必要がある。

そのため~/.ssh/configにwebdbというサーバ名でsshログインできるように設定を書いておく。のだが、~/.ssh/configにWEB+DB Press 75号で作ったwebdbの設定が残っていた。つまり

```~/.ssh/config
Host webdb
# 以下省略

Host webdb
# 以下省略
```

と、webdbと名づけたホストが2つ入っていた。ssh wedbしても、75号で作ったほうにsshしてしまう。なのでchefが目的のホストでなく75号のホストで動いていた。

## 結論
ホスト名は **webdb75ewtl** のような間違えない名前にしよう。
Octopress で Liquid テンプレートを記事中に書く


Octopress で作ったブログの中で Liquid テンプレートを紹介したいと思った時に、以下のようにそのまま書くと `{{ }}` や `{% %}` が評価されてしまい、エラーになったりと予想と反する挙動になってしまいます。

```html
{% codeblock lang:html %}
<section>
  <h1>Categories</h1>
  <ul>
    {% for category in site.categories %}
      <li>{{ category | category_link }}</li>
    {% endfor %}
  </ul>
</section>
{% endcodeblock %}
```

こういう時は `{% raw %}` と `{% endraw %}` で囲むと、中のタグが評価されなくなります。

```html
{% codeblock lang:html %}
{% raw %}
<section>
  <h1>Categories</h1>
  <ul>
    {% for category in site.categories %}
      <li>{{ category | category_link }}</li>
    {% endfor %}
  </ul>
</section>
{% endraw %}
{% endcodeblock %}
```
フォームで選択された画像をその場でプレビュー

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>Example</title>
</head>
<body>
<img id="picture">
<form>
<input type="file" name="image" accept="image/jpeg,image/png">
</form>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/holder/2.0/holder.js"></script>
<script>
$(function(){
	$('input[name="image"]').on('change', function(e){
		//	multiple指定はしてないので1個だけ入ってくるはず
		var f = e.target.files[0];
		console.log(f);
		if (f.type.match('image.*')){
			//	Reader生成
			var reader = new FileReader();
			//	Readerのロード完了時のハンドラ
			reader.onload = (function(){
				//	この時点でreader.resultにはファイルがdataURL化された文字列が入る
				$('img#picture').attr('src', reader.result);
			});
			//	dataURL形式で読み込み
			reader.readAsDataURL(f);
		}
	});
});
</script>

</body>
</html>
dispatch_source の DISPATCH_SOURCE_TYPE_TIMER で timeout 処理を実装する

先日、x秒たったらある処理をキャンセルするといういわゆるタイムアウト処理を実装する必要があったときに dispatch_source を使ってハマったので備忘録。

当時ググっても繰り返し一定間隔で処理を動かすサンプルはすぐ見つかったのでそれをベースやっても期待する動きならなかった。結局は「[エキスパート Objective-C プログラミング](http://www.amazon.co.jp/gp/product/4844331094/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4844331094&linkCode=as2&tag=griffinstewie-22 "Amazon.co.jp： エキスパートObjective-Cプログラミング -iOS/OS Xのメモリ管理とマルチスレッド-: 坂本 一樹: 本")」にサンプルがのってて助かりましたという話。

Xcode のスニペット形式だとこんな感じ

```
    /// dispatch_source を生成。timer を回す queue を指定。
    dispatch_source_t timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, <#dispatch_queue#>);
    
    /// timeout の時間を "seconds" プレースホルダーに "15" のように入力。"leeway_seconds" にはズレの許容範囲を入力
    dispatch_source_set_timer(timerSource, dispatch_time(DISPATCH_TIME_NOW, <#seconds#>ull * NSEC_PER_SEC), DISPATCH_TIME_FOREVER, <#leeway seconds#>ull * NSEC_PER_SEC);

    /// timer 発火時の挙動を実装
    dispatch_source_set_event_handler(timerSource, ^{
        
        <#code#>
        
        /// 後始末
        dispatch_source_cancel(timerSource);
        /* もしくは
#if !OS_OBJECT_USE_OBJC
        dispatch_release(timerSource);
#endif
        */
    });
    
    /// timer キャンセル時の挙動を実装
    dispatch_source_set_cancel_handler(timerSource, ^{
        <#something_clean_up#>
#if !OS_OBJECT_USE_OBJC
        dispatch_release(timerSource);
#endif
    });
    
    /// timer の動作開始
    dispatch_resume(timerSource);
```

素直に NSTimer を使えばいいじゃん？というのがあったんだけど、その処理全体がバックグランドディスパッチキュー上で実行されてたので Runloop を自分で回すのは嫌だったり、メインスレッドにタイマーをセットするとスレッドをまたぐ事になるのでシビアなタイミング（実行順序）を求められてたので dispatch_source を使いたかったというわけです。

ホントに「[エキスパート Objective-C プログラミング](http://www.amazon.co.jp/gp/product/4844331094/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4844331094&linkCode=as2&tag=griffinstewie-22 "Amazon.co.jp： エキスパートObjective-Cプログラミング -iOS/OS Xのメモリ管理とマルチスレッド-: 坂本 一樹: 本")」はすばらしい。
rvm/rbenv + Sublime text 2 から RSpec を実行できるようにする

RubyTest plugin が入っている状態で

/Users/hoge/Library/Application Support/Sublime Text 2/Packages/RubyTest/ の設定を以下のように変更する。

```ruby:RubyTest.sublime-settings
  "check_for_rvm": true,
  "check_for_rbenv": true,
```

そのあとはテスト上で、

Command-Shift-R: itブロック内のテストについては、テストを1回だけ実行。describeブロック内のテストについては、一連のテストを実行。
Command-Shift-E: 最後に実行したテストを再度実行
Command-Shift-T: 現在のファイルにあるテストをすべて実行
RubyMineが行末を認識してくれない


##困った
RubyMineが、行末を認識せずどこまででも右方向へカーソルを動かせてしまう。
つまり、行末/行頭に来たら次の行/前の行にカーソルが移動してほしいのに、それができない。

##対策
Preferences > Editor > Allow Placement of carret after end of line
（一覧右側の上から4つ目のチェックボックス）をはずせばok。

##参考
Rubymineでカーソル位置が実際の行の末尾を超えて移動できるのが気に入らない。
http://saifis.net/?p=295
最新Express.jsでのWarning解消


最新のExpress.js (2013-10-27現在でv3.4.3)を使うと以下のwarningが出ることに気がついた

```
connect.multipart() will be removed in connect 3.0
visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives
connect.limit() will be removed in connect 3.0
```

まぁ、参照されている[Wiki](https://github.com/senchalabs/connect/wiki/Connect-3.0)に書かれている通りなのだが、Express.jsの下で使っている [Connect](https://github.com/senchalabs/connect)が3.0で過去非互換な変更を入れるらしく、2.xシリーズでも警告を出すようになった。ヒストリーをみると10/18の2.9.2から。

解決策は bodyParser() の代わりに json()とurlencoded()を直接呼ぶこと。具体的には

```
app.use(express.bodyParser());
```
を

```
app.use(express.json());
app.use(express.urlencoded());
```
に置き換えればOK。
PHPのcurlでPOST

```php:curl_post.php
$POST_DATA = array(
    'foo' => 'bar'
);
$curl=curl_init("URL");
curl_setopt($curl,CURLOPT_POST, TRUE);
// ↓はmultipartリクエストを許可していないサーバの場合はダメっぽいです
// @DrunkenDad_KOBAさん、Thanks
//curl_setopt($curl,CURLOPT_POSTFIELDS, $POST_DATA);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($POST_DATA));
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE);  // オレオレ証明書対策
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE);  // 
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl,CURLOPT_COOKIEJAR,      'cookie');
curl_setopt($curl,CURLOPT_COOKIEFILE,     'tmp');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
//curl_setopt($curl,CURLOPT_REFERER,        "REFERER");
//curl_setopt($curl,CURLOPT_USERAGENT,      "USER_AGENT"); 

$output= curl_exec($curl);
```
Clojureのプログラムの品質を上げるためのLeiningenプラグイン一覧

# lein-cloverage でテストコードの網羅率を計測

https://github.com/lshift/cloverage

Clojureの`lein test`で実行されるコードのテストカバレッジをHTMLにするツール。

```
$ lein cloverage
```

で`target/coverage/index.html`にカバレッジ情報が出力される。

「Forms」がテストで全フォームの何％を実行したか、「Lines」が全フォームの何行を実行したかを示す。

# lein-marginalia で「読んでわかるコード」にする

https://github.com/gdeer81/marginalia

Clojureのコメントをドキュメントにするツール。

プログラムテキストとコメントによるドキュメントがside-by-sideで表示され、「文芸的プログラミング」の考え方に似た形でプログラムを読むことが出来る。

```
$ lein marg
```

`docs/uberdoc.html`にドキュメントが出力される。

# perforate で自分のプログラムが遅くないことを確かめる

https://github.com/davidsantiago/perforate

`benchmakrs/`の下に`test/`の下と同じくベンチマーク用のテストコードを入れておくと、自動的にベンチマーク統計を取ってくれるプラグイン。

```
$ lein perforate
```

と入力して暫く待つと、性能測定結果の統計が表示される。


# lein-typed (+ core.typed) で型チェック

https://github.com/frenchy64/lein-typed

で`core.typed`の型チェックをLeiningenから実行できる。

```
$ lein typed check
```
OS X 10.9 Mavericks にアップデートして GAE で使う PIL を復活

dev_appserver.py を起動してこんな warning が出る場合

```
WARNING  2013-10-27 01:13:08,067 api_server.py:332] Could not initialize images API; you are likely missing the Python "PIL" module.
```

環境によって違うとは思うのですが、僕の場合、
http://stackoverflow.com/questions/19532125/cant-install-pil-after-mac-os-x-10-9
を参考に

```
xcode-select --install # zlib をインストール?
sudo easy_install pip
sudo pip install PIL
ln -s  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers/X11 /usr/local/include/X11
```

PIL インストールできても ZLIB サポートが使えない状態だと gif/png がうまく扱えないので

```
    --- ZLIB (PNG/ZIP) support available
```

ちゃんとこうなってるか要確認

```
    *** ZLIB (PNG/ZIP) support not available
```
Mac の VirtualBox と ESET CYBER SECURITY の組み合わせによる問題

# 問題点

ESET CYBER SECURITY 5.0.107.0 が動作している MacOSX 10.8.5 において、VirtualBox 4.2.18 を用いて Ubuntu 12.04(precise 64bit) を動作させる。その Ubuntu の中で `sudo apt-get update` を実行すると、apt-get update の実行に失敗する場合がある。

# 考えられる原因

ESET CYBER SECURITY の「Webアクセス保護とフィッシング対策」の機能において、短時間で複数のhttpサイトにアクセスした場合に、パケットロスなどが発生している。

# 対策

VirtualBox の使用中は、ESET CYBER SECURITY の「Webアクセス保護とフィッシング対策」の機能を「無効」にする。
Node.js、expressを利用していてfaviconが変更できない？と思ったら

下記を見よう。

http://stackoverflow.com/questions/15463199/how-to-set-custom-favicon-in-node-js-express

例えば以下のようにする。

```js
app.use(express.favicon(path.join(__dirname, 'public/images/favicon.ico'))); 
```

また、先にapp.use(express.favicon())していると先勝ちのようなので、他のapp.useも確認の事。
各ブラウザでfaviconの再取得の仕方に癖があるので注意する。
Mavericksにアップデートして遭遇した不具合　まとめ


今のところ概ね問題ないが、やはり幾つかあってこれからもあるかも知れないので個人まとめ

(**2013/12/17追記**)
10.9.1に上げてみた。幾つか追記

- virtual boxのネットワークが繋がらなくなる [ **済** ]

	「eth0が見えない」というエラーだったと思う。ちょうど新しいv4.3が出ていたのでそれをインストールしたら解消。バージョンアップが効いたのか再インストールが良かったのかは不明...

- Firewireの外付けHDDがスリープでも止まらない [ **workaroundあり** ]

	ググッてみると同じ問題で困っている人多数。Mavericksのバグかな。速度を我慢してUSB接続すれば取り敢えず止まるようになる。

	Thunderbolt絶賛売り出し中で仕方ないのかも知れないけど、検証項目から漏れていたら寂しいな。今見たら、かろうじてMac miniには残っているけどiMacにも(新しい)Mac Proにも無いのね...

	(**2013/12/17追記**)
	ググッてみたところ、10.9.1でも治っていないとのこと。試してダメだと悲しいので試さずに次のリリースを待つ。

- Dockから起動したemacsでdefault-directoryが"/"になっている [ 未解決 → **済** ]

	確か前は"~/"だった気がするのだが。

	(**2013/12/17追記**)
	10.9.1インストール後に試したら"~/"になっている。

### 外部リンク

- [Homebrew maveriks / Xcode 5 関連バグ](https://github.com/mxcl/homebrew/issues?labels=mavericks+%2F+Xcode+5&state=open)
さくらマネージドサーバ環境でscreenとvimを使えるようにするメモ


環境: [さくらインターネット マネージドサーバ Xeonプラン](http://www.sakura.ne.jp/managedserver/)

SaaS, PaaS, IaaSという3つのクラウドの概念が確立した今となってはXeon載ってるサーバを専有できてrootとれないという中途半端な環境を新規で使うことないだろうと思うのですが、保守や撤退作業はまだまだありそうです。

## ディレクトリの準備

```bash
$ mkdir ~/local
```

##vimのインストール

まずvimをいれてあとの設定の編集などを楽にしようという魂胆

```bash
$ mkdir ~/local/vim
$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
$ tar jzf vim-7.4.tar.bz2
$ cd vim74
$ ./configure --prefix=$HOME/local/vim
$ make
$ make install
$ ~/local/vim/bin/vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 27 2013 05:01:21)
```

## screenのインストール

```bash
$ wget http://ftp.gnu.org/gnu/screen/screen-4.0.3.tar.gz
$ tar xzf screen-4.0.3.tar.gz
$ cd screen-4.0.3
```

Solaris用のコードがxBSDな環境で悪さするようなので pty.c の36行目から39行目をコメントアウトする。

```pty.c
#ifndef sun
# include <sys/ioctl.h>
#endif

///* for solaris 2.1, Unixware (SVR4.2) and possibly others */
//#ifdef HAVE_SVR4_PTYS
//# include <sys/stropts.h>
//#endif

#if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL)
# include <sys/ttold.h>
#endif
```
あとはvimといっしょ

```bash
$ ./configure --prefix=$HOME/local/screen
$ make
$ make install
```

## .bashrcの設定

```.bashrc
export PATH=$PATH:$HOME/local/vim/bin/
export PATH=$PATH:$HOME/local/vim/screen/
```

## .screenrcの設定

```.screenrc
startup_message off 
vbell off 
caption always "  %n %t  $USER@%H"
termcapinfo xterm* ti@:te@
term xterm-color
shell bash
```

## 使う

```
%bash
[yourname@wwwXXXXm ~]$ screen
[yourname@wwwXXXXm ~]$ vim
```
句読点の一括変換をEmacsで

ふだんの句読点は「，．」ですが，本から書き出して，テキストデータにしたり，ブログで引用したりする際には，句読点を原文に合わせるようにしています．
句読点の組み合わせは，「、。」「，。」「，．」の3種類です．「、．」は見かけません．それと，句点は「。」「．」，読点は「、」「，」を指しますが，「テン・マル」「カンマ・マル」「カンマ・ピリオド」で呼び慣れているので，読点を先に書いています．
書き出す字数が少なければ，変換時に「，」を「、」にするのでもいいのですが，2文以上となると，まずEmacs上で書き出し，領域指定をしてから，自作関数で句読点変換を行っています．
自作関数は次のとおりです．

```el
(defun replace-punctuation (a1 a2 b1 b2)
  "Replace periods and commas"
  (let ((s1 (if mark-active "選択領域" "バッファ全体"))
        (s2 (concat a2 b2))
        (b (if mark-active (region-beginning) (point-min)))
        (e (if mark-active (region-end) (point-max))))
    (if (y-or-n-p (concat s1 "の句読点を「" s2 "」にしますがよろしいですか?"))
        (progn
          (replace-string a1 a2 nil b e)
          (replace-string b1 b2 nil b e)))))
(defun replace-punctuation-ten-maru ()
  "選択領域またはバッファ全体の句読点を「、。」にします"
  (interactive)
  (replace-punctuation "，" "、" "．" "。"))
(defun replace-punctuation-comma-maru ()
  "選択領域またはバッファ全体の句読点を「，。」にします"
  (interactive)
  (replace-punctuation "、" "，" "．" "。"))
(defun replace-punctuation-comma-period ()
  "選択領域またはバッファ全体の句読点を「，．」にします"
  (interactive)
  (replace-punctuation "、" "，" "。" "．"))
(defalias 'replace-punctuation-o 'replace-punctuation-ten-maru)
(defalias 'replace-punctuation-\, 'replace-punctuation-comma-maru)
(defalias 'replace-punctuation-. 'replace-punctuation-comma-period)
(defalias 'tenmaru 'replace-punctuation-ten-maru)
(defalias 'commamaru 'replace-punctuation-comma-maru)
(defalias 'commaperiod 'replace-punctuation-comma-period)
```

`M-x r-p-o RET` で「、。」に，`M-x r-p-, RET` で「，。」に，`M-x r-p-. RET` で「，．」に，変換します（Windows/GNUPACKおよびUbuntuのGNU Emacs 24.3.1で動作確認しました）．リージョン指定をしていなければ，バッファ全体を変換対象とします．変換前にy/nの質問がありますので，誤操作しても安心です．
この投稿のオリジナルは[句読点変換の関数 - わさっき](http://d.hatena.ne.jp/takehikom/20120713/1342122621)です．
git submoduleを今風な感じで削除する

v1.8.3から`git submodule deinit`が追加され、わずらわしかったサブモジュールの削除がほんの少しだけ楽になりました。

```
$ git submodule deinit path/to/submodule
$ git rm path/to/submodule
$ git config -f .gitmodules --remove-section submodule.path/to/submodule
```

ちなみにv1.8.5からは最後の行もいらなくなるそうです。
Emacs標準のファイラdiredの基本的な使い方と便利なTipsいくつか

Emacsをファイラとして使えるようになるdiredですが、便利な割に意外と使われていないようなので簡単に使い方をまとめました。

# 基本操作

## diredバッファを開く

| キーバインド           | 説明                                    |
|------------------------+-----------------------------------------|
| `C-x d`                | 任意のディレクトリをdiredバッファで開く |

普通に`find-file`でディレトリを指定しても開けます。

## 基本操作

| キーバインド | 説明                                                         |
|--------------+--------------------------------------------------------------|
| `n`          | カーソルを1行下に移動                                        |
| `p`          | カーソルを1行上に移動                                        |
| `RET`, `f`   | ファイルを開く                                               |
| `o`          | ファイルを別ウィンドウで開く                                 |
| `v`          | ファイルをview-modeで開く                                    |
| `m`          | ファイルをマークする                                         |
| `u`          | カーソル位置のマークを解除する                               |
| `U`          | すべてのマークを解除する                                     |
| `C`          | マークされたファイルをコピーする                             |
| `D`          | マークされたファイルを削除する                               |
| `R`          | マークされたファイルを移動する                               |
| `+`          | ディレクトリを作成する                                       |
| `q`          | diredバッファを閉じる                                        |
| `X`          | カーソル位置のファイルに対して任意のシェルコマンドを実行する |

# おすすめの設定

```el
;; diredを2つのウィンドウで開いている時に、デフォルトの移動orコピー先をもう一方のdiredで開いているディレクトリにする
(setq dired-dwim-target t)
;; ディレクトリを再帰的にコピーする
(setq dired-recursive-copies 'always)
;; diredバッファでC-sした時にファイル名だけにマッチするように
(setq dired-isearch-filenames t)
```

`dired-dwim-target`は便利なので特に理由がない限り`t`を指定すると良いと思います。

# 覚えておくと便利な操作

## ファイル名で操作対象を絞る

正規表現にマッチする名前のファイルをマークしたり、findの結果からdiredバッファを表示できます。

* `% m` 正規表現にマッチする名前のファイルをマーク
* `t` マークを反転させる
* `M-x find-name-dired` ワイルドカードによるファイルの検索結果をdiredバッファに表示

## 画像表示

画像ファイルをマークした状態で`C-t C-t`を押下することで、diredバッファ内に画像のサムネイルを表示させることができます。

## サーバ上のディレクトリをdiredで開く

TRAMPのおかげで、SSHで接続したサーバ上のディレクトリもローカルのディレクトリと同様に扱うことができます。
ファイルを開く時に、`/ssh:<username>@<hostname>:<directory>`を指定するだけです。

最近Software Design誌のEmacs特集を読んで、multi-hopの設定をすることで多段SSHもできることを知りました。さらにsshだけでなくsftpやsmbも使えるそうなので、大抵のファイル転送はEmacsだけで対応できそうです。

## 圧縮ファイルの操作

diredバッファでは、`Z`キーで各種圧縮ファイルを展開することできます。ファイルの拡張子ごとに展開にどのプログラムを使用するかが変数`dired-compress-file-suffixes`に定義されているのですが、よく使うであろうzip形式の定義がないので以下の記述で追記すると良いでしょう。

```el
;; .zipで終わるファイルをZキーで展開できるように
(add-to-list 'dired-compress-file-suffixes '("\\.zip\\'" ".zip" "unzip"))
```

diredバッファでマークしたファイルをzip形式で圧縮するコマンドが以下のURLに記載されているので、併せてそちらもinit.elに追加しておくと便利だと思います。
http://stackoverflow.com/questions/1431351/how-do-i-uncompress-unzip-within-emacs
用意した文字をランダムで並べて


はい。なんか先週末くらいによく見かけた気がします。
用意したものからランダムで並べて〜〜〜〜

```py:kawaii.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import random
import os,sys
import cgitb; cgitb.enable()

#用意するランダム文字列
material=[u'か', u'わ', u'い', u'い', u'ゎ', u'ぃ', u'ヵ']
#当たり判定の文字列
match=u'かわいい'
#ランダム生成
s=u''.join([material[random.randint(0,6)] for i in xrange(758)])
#探索
hit=s.find(match)
#判定
if hit < 0:
    no=u' かわいいはつくれませんでした。女子力が足りないようです。'
else:
    no=s[:hit + len(match)]+ u'\n\n'+str(hit+len(match))+ u'回目でかわいいはつくれました。'

#結果をブラウザに表示させる
print 'Content-Type: text/pain;charset=utf-8'
print

print 
print 
print ' かわいいはつくれる？？'
print '\n\n\n'
print no.encode('utf-8')

```
ターミナルで整形済みのXMLをサクッと確認する方法


ターミナルでAPIのレスポンスを確認したい場合にcurlコマンドをよく使います。

ですが、そのままcurlコマンドを実行すると標準出力にダーっと出力されるため読みづらいです。

jsonの場合は[jq](http://stedolan.github.io/jq/)を使えばサクッと整形済みのjsonを確認できます。

xmlの場合はよく分からなかったので調べてみたところ、rubyのgemであるNokogiriを使えば確認できそうでした。

```
gem install nokogiri
```

以下、整形済みのxmlを取得するサンプルです。

第一引数に調べたいxmlのURLを入力します。

```
ruby -e "require 'nokogiri';require 'open-uri';require 'kconv';xml = open(ARGV[0]).read;doc = Nokogiri::XML(xml.toutf8, nil, 'utf-8');puts doc;" http://rss.weather.yahoo.co.jp/rss/days/13.xml

```

サンプルにはYahoo!天気・災害 提供RSSを使用させていただきました。

```
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Yahoo!天気・災害 - 東京都の天気</title>
```

こんな感じで整形済みの結果が出力されます。

もっとよい方法があればコメントいただければと思います。

### 参考
* [Rubyで簡単Web解析|NokogiriでHTML XMLパーサー](http://mukaer.com/archives/2012/04/17/rubynokogirihtm/)
* [Nokogiriで文字化けを防ぐ](http://qiita.com/foloinfo/items/435f0409a6e33929ef3c)
* [Yahoo!天気・災害 提供RSS](http://weather.yahoo.co.jp/weather/rss/)