OmniAICreator/Qiita-1.07M huggingface dataset:
Macからmbedへのプログラムの自動コピー


mbedのオンラインコンパイラで開発を行う際，ブラウザでダウンロードしたプログラム（binファイル）をその都度ドラッグ&ドロップでMBEDドライブにコピーするのは面倒である．そこでAutomatorで以下のような簡単なワークフローを作り，Downloadフォルダのフォルダアクションに設定している．

![mv_to_mbed.workflow](https://qiita-image-store.s3.amazonaws.com/0/5338/17ba1366-707d-be01-9163-2879cc4a8b0a.png "mv_to_mbed.workflow")

これにより，Downloadフォルダに新しいファイルが追加されると上記ワークフローが起動され，拡張子binを持つファイルがMBEDドライブに移動する．

注意

* 「Finder項目にフィルタを適用」というアクションは検索にSpotlightを使っている．したがって，DownloadフォルダをSpotlightの検索対象から除外したり，Spotlightを無効にしていると上記ワークフローは動作しない．この場合は後述するようにシェルスクリプトを使うとよい．

* フォルダ変更の検出はデフォルトでは10秒に1回しか行われない（launchd.plistのマニュアルを参照）ので，それ以下の間隔で何度もプログラムをダウンロードするとmbedにコピーされないことがある．


## シェルスクリプトを起動するフォルダアクションのワークフロー

DownloadフォルダをSpotlightの検索対象から除外したり，Spotlightを無効にしている場合は以下のようなワークフローで対処できる．

![mv_to_mbed2.png](https://qiita-image-store.s3.amazonaws.com/0/5338/b589e2c4-de54-9999-ebcc-765c38ade175.png "mv_to_mbed2.png")

ここで`cp -X`としている理由は以下を参照

* [MacからFRDM-KL25Z/46Zへのbinファイルのコピー](http://qiita.com/wtakuo/items/a274ccb66d2026cf955b "MacからFRDM-KL25Z/46Zへのbinファイルのコピー")
rotatelogsが2.4で全部こなせるようになったのでメモ

apache2.4.7に付いてきたrotatelogsがリンクとプログラム経由を提供していたので
日付でrotateしつつgzipしてdeleteまでしてみた。

公式はこちら
http://httpd.apache.org/docs/2.4/programs/rotatelogs.html

## apache側のカスタムログ指定

```http.conf
CustomLog "|/home/apache/bin/outputlog.sh access" custom
ErrorLog "|/home/apache/bin/outputlog.sh error"
```

ここではオリジナルのshellにパイプしています。

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

# ex) sh outputlog.sh access foobar.com
LOG_PATH=/var/log/httpd
ROTATELOGS_BIN=/etc/httpd/bin/rotatelogs
GZIP_SHELL=/home/apache/bin/gziplog.sh
if [ $# -le 0 ]; then
  echo "args error.$#"
  exit 1
fi

type=$1
domain=$2

case "$type" in
  "access" | "access_log" ) type="access";;
  "error" | "error_log" ) type="error";;
  "transition" | "transition_log" ) type="transition";;
  * ) exit 1;;
esac

#sg admin "$ROTATELOGS_BIN -cfl -p ${GZIP_SHELL} -L ${LOG_PATH}/${domain}${domain:+-}${type}_log ${LOG_PATH}/${type}/${domain}${domain:+-}${type}_log.%Y-%m-%d.%H:%M:%S 60"
sg admin "$ROTATELOGS_BIN -cfl -p ${GZIP_SHELL} -L ${LOG_PATH}/${domain}${domain:+-}${type}_log ${LOG_PATH}/${type}/${domain}${domain:+-}${type}_log.%Y-%m-%d 86400"
````

結果的には

```bash
sg admin "/etc/httpd/bin/rotatelogs -cfl -p /home/apache/bin/gziplog.sh \
-L /var/log/httpd/access_log /var/log/httpd/access/access_log.%Y-%m-%d 86400"
```

`/var/log/httpd`直下に現在進行形ログが残り
以下種類別のディレクトリに本体が置かれるようになっています。

## ファイルの圧縮と削除

次に上記で指定している`-p /home/apache/bin/gziplog.sh`の部分

```bash:gziplog.sh
#!/bin/sh
LOG_PATH=/var/log/httpd
GZIP_BIN=/bin/gzip
## Retention period.
TERM=7

## Ignore first.
if [ $# -le 1 ]; then
  exit 0
fi
newfile=$1
oldfile=$2

### gzip ####
gzip ${oldfile} >/dev/null 2>&1

#### file delete ####
filename=${oldfile##*/}
find ${oldfile%/*} -maxdepth 1 -mtime +${TERM} -name "${filename%_log*}_log*.gz" -delete
```

公式にある通り、第二引数に切り替わる前のファイルのfullpathが来るので
それをそのまま`gzip`してます。

次にその引数からファイルの検索＆削除

以上。
２色の相対から自動的にステータスバーの色を選出

iOS7からステータスバーがちょっとオシャレになりました。
が、結局色は白と黒の２色しか選べません。
またiOS6以前と違い背景色が黒でステータスバーも黒とかにするとステータスバーが見えなくなって良くない感じです。
色を決め打ちで開発する場合は問題ないですが、UIのカラーをユーザが自由に設定出来る場合はステータスバーの色もユーザに指定させるよりもアプリ側で自動選出する方がスマートです。
以下のように実装することで２色から見やすいステータスバーの色を選出することが出来ます。

```objc
-(UIStatusBarStyle)statusbarstyleWithBaseColor:(UIColor*)baseColor ButtonColor:(UIColor*)buttonColor{
    CGFloat b1,b2;
    [baseColor   getHue:nil saturation:nil brightness:&b1 alpha:nil];
    [buttonColor getHue:nil saturation:nil brightness:&b2 alpha:nil];
    return b1>b2?UIStatusBarStyleLightContent:UIStatusBarStyleDefault;
}

```
UInavigationbarの色とUIBarbuttonの色の関係から選出するといい感じかもしれないですね。
ServerMan@VPS借りてみた


仕事で、専用サーバを管理することになった。
普段は、開発者なんだけど、なぜ？

Virtual Boxで検証環境作ってから専用サーバにとかやってるうちに自分でも遊びたくなってきた。

いまどきVPSならワンコインの時代なのね
いろいろ比較サイトとか見てみて、結局一番安いServerMan@VPSのEntryでｗ

バージョンアップとかでメモリー1Gとか十分でしょう。
作ってみたいものもあるし、実験用ということで

仕事では、Virtual Boxで検証して動作確認してからWinSCPでアップとかやってたんだけど、ちょっとめんどくさい。

自宅は、Macなんだけど、WinSCPに相当するいいのがないな、、、
とりあえず同じようにVirtualBoxでCentOS6.3ということなので
ISO落としてきてインストール。(CentOS-6.3-x86_64-minimal.iso)

とかやってるうちにServerManも準備できたらしい。

df -h で見てみると、空き容量きっかり50G、そーかー
OSの領域は入らないのね、これは嬉しい。

で、VirtualBoxも合わせて50GにしたんだけどOS入れたら残り44G、うーむ・・・

もう一度入れなおしだｗ
えっと、6G減るわけだから、一応プラス1Gにして57Gで再度インストール、、、残り46G、、、なぜ？ｗ
(多分、Swapとかの自動的な設定なんだろうけど)
めんどくさいから、このままいくことにする。

SSHつないで、両方の環境確認したら結構違うね。
てか、minimalって入ってないもの多い。
あと、ServerMan コンソールしか使わないからxinetdとか要らないんだけど、なんで入ってるんだろう。

SSHってローカルとリモート同時に入力出来ないのかと検索したらcsshXなんてものがあるらしいじゃないですか。

ちょっと設定してやるとローカルとリモート両方に同時にコマンド打てるから作業効率あがるわー

Windwosにもこういうのあるのかな、、、探そう。

ローカルなLinuxでもSSH接続で使うとコピペできたりして便利だよね。
これは、WindowsでもTeraTerm接続したほうが便利なのと一緒。

ローカルなCentOSの方は、最初SSHが繋がらなかったんだけど
SELinuxが原因だったよ。

だいたいのこと検索で見つかるけど、これなかなか知らないと気づかないね。

トップは、WordPressでいいかーとか思ってまず入れたんだけど、同期って意外と方法が無いんだな。

ローカルで書いて同期するのがいいのか、サーバーで書いてバックアップするのがいいのか、、、いずれにしてもブラウザベースだから、csshXは使えない、、、ブラウザを同時に操作すればいいのか・・・？

Celeniumとかどうよとか一瞬思ったけど、無理そうだな

で、WPで記事書こうかと思ってエディタ探してたらQiitaを思い出し、最初の記事をこっちに書いてみてるという。

Kobitoも使ってみてる。

作業途中のスクリーンショット取ってたんだけど、もう明け方だし眠いのでこのまま投稿します。

さて、サーバーさんで何をして遊びましょうかね。
ChefでEPELをインストールできない

## yum cookbook v3.0系で書き方変わってるし＞＜

伊藤本のままやっててハマった。。。
Githubみると、v3.0系のレシピの書き方はこう。
<https://github.com/opscode-cookbooks/yum>

    # add the EPEL repo
    yum_repository 'epel' do
      description 'Extra Packages for Enterprise Linux'
      mirrorlist 'http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch'
      gpgkey 'http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6'
      action :create
    end

nginxをインストールするレシピと、

    package "nginx" do
      action [:install]
    end

ノードの設定は、

    {"run_list":[
      "yum",
      "nginx"
    ]}

そのまま。
この書き方もいつか変わるかもしれない。
RVM

RVM

# ざっくりと

1台のマシンで、Rubyの複数のバージョンを共存させる仕組み。
rvmで管理されるRubyは、OS領域ではなくユーザー領域にインストールされるので、OSレベルでのライブラリの競合等を気にしなくて済む。


# rvmのインストール

Ubuntuの場合

```
$ curl -L https://get.rvm.io | bash -s stable --ruby
```


# 簡単な使い方

1. インストールできるバージョンのリスト : `rvm list known`
1. インストールされているバージョンのリスト : ` rvm list `
1. バージョンXXに切り替え : ` rvm use XX `
1. (OS再起動後とかの?)デフォルトのバージョンをXXにする : `rvm use XX --default`
Scala Liftの教訓

Scala LiftのView Firstの思想に刺激され[紹介記事](http://qiita.com/icoxfog417/items/8ac0ac21434fd229395f)を書き、実際に[使ってみて](http://qiita.com/icoxfog417/items/f5136a2bae229f45f108)たどり着いたのは、これはちょっと使えないなという悲しい結末・・・とはあの頃予想できただろうか(いや、できない)。

正月とこれまで幾日かの土日を費やしたどり着いた結論は以下の通りだ。

## 結論
UIから作るViewFirstで開発を行いたい！場合、Angular.jsやKnockout.jsのようなフレームワークを導入し画面側から開発を行い、Model設計(JavaScriptクラス)が固まってきたらサーバーサイドで永続化の処理を実装するのがベストだ。
ロジック混入を回避する場合はAngular.jsならDirective、Knockout.jsでも普通にtemplateを使えば隠蔽可能だ(モジュール化をきちんとやるならAngular.jsの方がカスタマイズ性は高い)。

JavaScriptフレームワークの登場により、アプリケーションの画面動作はhtmlとJavaScriptでほぼ書けるようになってきている。WebComponentsなども登場しリッチな画面を簡単に作れるようになってきたこの状況では、サーバーサイド側からDOMを出力する(悪く言えば介入する)ViewFirstのフレームワークは逆に足枷になってしまうだろう。

特にLiftに関していえば、学習コストが高く情報が少ないのもデメリットとして上げられる。だから悪い、というわけではないのだが仕事(チーム)で開発するならこの壁は厚い。
Scalaでやりたい、というこだわりがなくMicrosoftに敵意がないのであれば、ViewFirstのフレームワークとしてはASP.NET WebFormの方が完成されているので使いたい場合こちらの方がお勧めできる。

もちろん今後Liftが進化を遂げクライアントサイドのフレームワークと連携をうまく取れる日が来るのかもしれない。ただ、その時まで、Liftは心の中にしまっておこう・・・と思う。

## 具体的な難点
色々(本当にいろいろ)あるが、一番はsnippet間の連携が取れない点だ。
ViewFirstなのだから、画面をsnippetで分割してそれらの間で連携をとりながら更新できる・・・のかと思いきやそうではないのだ。

これはある意味しかたがないことで、Webでは1Requestに対し1Responseなのだから「Aというsnippetを更新したらBも連動して更新する」というのは通常できない(例えば、投稿をポストしたらヘッダ領域の投稿件数を更新する、みたいな)。
そういう意味では、この点がサーバーサイドでViewFirstが実現できない最大の理由かもしれない。1Request(1event)に対しマルチレスポンスを返したいなら今のところクライアントサイドでやるしかないのだ。

ただ、Liftではサーバーサイドからのプッシュが可能なCometがサポートされているため、頑張れば上記のような実装も不可能ではない。
ただ、それを実装するということはクライアント/サーバー間をすべてAjax/Cometで制御するということだし、なによりCometで配信したら接続中の全クライアントに配信されてしまうので1:1の制御が必要になる・・・がこの機構がLiftにはない。
この点を突き詰めるなら、socket.ioやSignalRといったWebsocketの仕組みとクライアント側フレームワークをうまく組み合わせ、クライアントサイドの変更はJavaScriptフレームワーク、サーバーでの処理が必要なものはsocket.io/SignalRで送信し他クライアントに配信する、という方がいいだろう(これは面白い・・・かもしれない)。

別の解として全画面を親となる一つのsnippetで囲んでしまうという手もある。これなら全画面Post->全画面返却なので好きな部分を複数更新できる。
で、実はこの思想を実現しているのがASP.NET WebFormなのである。私はこれをやった時なんで全画面をわざわざ送っているのか理解できなかったが、くしくもLiftに触れることでその理由を悟った。。。

ASP.NET WebForm はMicrosoftらしくVisual Studioのサポートもあいまってかなり簡単に開発できるし情報もLiftからすると相当多い。もちろんLiftではjQueryライクなセレクタがあるため書きやすいと言えば書きやすいが、そうするともはやサーバーサイドでjQueryを書いているのと変わらなくなってきて、それならわざわざサーバーでやらんでも・・・という話になってしまう。

そんなわけで、リアルでの更新を突き詰めるならsocket.io/SignalR、サーバーサイドでやっていくならASP.NET WebFormかな・・・となってしまうのである。
MacからFRDM-KL25Z/46Zへのbinファイルのコピー


Mac OS Xにおいて，mbed化したFreescale FRDM-KL25Z/46Zにプログラムファイル(binファイル)をコピーする際，ファインダでは問題なくても（シェルやシェルスクリプトで）cpあるいはmvコマンドを使うとプログラムが起動しないことがある．

    cp hoge.bin /Volumes/MBED

この場合，"RESERVED BIT"という文字列が書かれたfail.txtというファイルがmbedドライブにできる．

これはMac OS Xのcpやmvが拡張属性(Extended Attributes)やリソースフォークも一緒にコピーしようとするが，KL25Z/46Zのmbedドライブはこれに対応していないのが原因らしい（要確認）．とりあえずこれらのコピーを行わないよう，cpに-Xオプションをつけると上手くいく．mvにはこのようなオプションはない．

    cp -X hoge.bin /Volumes/MBED

NXP LCP800-MAXでも類似の問題が発生するが，やはりcp -Xで問題なくコピーできる．LCP1768ではこのような問題はない．
macportsでsbclを入れようとしたらsb-posixのテストでコケて入らない

port intall sbcl +threads
したらインストールがコケる。
昔から直ったり壊れたりしているみたい。

sb-posixのテストがコケてインストールしてくれないらしい。
実際はしばらく前からインストールできなかったんだけど、ccl使うからいいやと思って放置してた。

opt/local/var/macports/build/_opt...lang_sbcl/sbcl/sbcl.../contrib/sb-posix/posix-test.lisp
を書き換える。

(deftest readdir.1 
;;(let ((dir (sb-posix:opendir "/"))) コメントアウトして下の２行を追加 
(let ((dir (sb-posix:opendir "/")) 
(sb-alien::*default-c-string-external-format* :latin-1)) 

インストールし直すと入る。
Docker で aobench をコンテナで動かす.


Docker(LXC) でのアプリケーションアイソレーションやアプリケーションサンドボクシングの検証として aobench を動かしてみましょう.

https://code.google.com/p/aobench/

Docker ですでに提供されている busybox イメージでは外部コンパイルされたバイナリがうまく動かなかったので, buildroot を利用して busybox 環境をまずは構築するところから始めます.

http://buildroot.uclibc.org/

buildroot-2013.11.tar.bz2

をダウンロードして展開,

```
$ make menuconfig
```

として

* x86_64 ターゲットを利用
* glibc ランタイムを利用　
* gcc 4.8.x ツールチェイン(optional)

にして save -> exit

して

```
make
```

をすると output/images に rootfs.tar というイメージが出来ます.
ただ, これだと docker ではそのまま動かせる環境になっていないようなので,

http://blog.docker.io/2013/06/create-light-weight-docker-containers-buildroot/

を参考にして image の fixup を行い, dietfs としてイメージを import しておきます.

## aobench のビルド

コンテナの外(今回は git clone https://github.com/dotcloud/docker.git で手に入る ubuntu 12.04 環境)で aobench をコンパイルします. 
(より確実には buildroot で生成されるツールチェインを使ったほうがいいでしょう)

```
$ gcc -O3 -o ao ao.c -lm
$ mkdir /home/vagrant/in
$ cp ao /home/vagrant/in/
```

/home/vagrant/in を persistent volume としてマウントして, 生成した dietfs イメージを起動します.

```
$ sudo docker run -i -v /home/vagrant/in:/in:ro -t dietfs /bin/sh
# /in/ao
Output ao.ppm
```

コンテナプロセスの中で aobench が実行できましたね!

## aobench イメージ

aobench の入ったイメージを Docker index に上げました.

https://index.docker.io/u/syoyo/aobench/

## まとめ

数値計算指向のアプリも docker でバッチリ動きます. 
busybox(buildroot)を利用することでディスクのオーバヘッドは 5~6 MB と, とても lightweight に保つことができました.

これでどこでも aobench が出来ますね! Happy aobench!

## 参考文献

* Docker で lightweight なイメージを作成: http://blog.docker.io/2013/06/create-light-weight-docker-containers-buildroot/
Node.js + co + koa の勧め

![Node.js](http://nodejs.org/images/logos/nodejs.png "Node.js")

# そろそろ Node.js が成熟する頃ですね

Node.js が、もうすぐ成熟する時を迎えています。
ちなみにバージョン 1.0 はまだ出ていません。
2014年1月時点で 0.11.11 までですね。

# JavaScript のコールバック地獄

JavaScript のコールバック地獄から
やっと開放されることになりそう。

コールバック地獄とは↓こういうのネ。

```js
get("a.txt", function(a) {
  get("b.txt", function(b) {
    get("c.txt", function(c) {
      console.log(a + b + c);
    });
  });
});
```

Node.js の co を使うと↓こんな感じになるよ。

```js
co(function*() {
  var a = yield get("a.txt");
  var b = yield get("b.txt");
  var c = yield get("c.txt");
  console.log(a + b + c);
})();
```

ちょっと良くない?
JavaScript の非同期プログラミングという
一番醜い所を綺麗に見せてくれる。
これならやっと人に勧められそうな気がする。

※記事を書いた → [[JavaScript] 非同期処理のコールバック地獄から抜け出す方法 - Qiita](http://qiita.com/LightSpeedC/items/7980a6e790d6cb2d6dad)

# ちょっと過激目な予告

それで個人的な予告：
## Express は段階的に無くなるのではないか。
## もしかすると、終焉を迎えることになるのではないか。

言い過ぎか...

# Koa に移行しよう

co ベースの新しい Koa に移行しましょう。
まだバージョンは 0.3.0 だけどね。
まだ早過ぎるかなぁ。


# ES6 yield (generators)

やっぱり ES6 の yield (generators) が
今後のキーテクノロジになると思うよ。
見た目は他の言語の generators だし
C# の async/await っぽいけど
スレッドを使用しない所がミソだよ。
ブロックしないんだよ。

JavaScript はシングルスレッドなんだよ。
言わば Windows 3.1 だよ。(笑
VMS の $QIO + AST だよ。(笑

# Node.js は省エネで超エコ

Node.js は省エネで超エコなシステムが構築できるよ。
省メモリ。省リソース。
省スレッド。省コンテキストスイッチング。
C10K も OK だよ。
今時の SNS やチャットが
静かな常時接続で実現できる。

こういうところだけが、
私が Node.js 推しである
唯一の理由なんです。

# 参考

http://www.infoq.com/jp/news/2014/01/koa-0.2.0-release
tig 1.3の新機能・修正点（になるであろう差分）を紹介してみる

[jonas/tig](https://github.com/jonas/tig) は現在も活発に開発が継続しており、次のバージョンアップが待たれます。
2013年8月にリリースされたtig 1.2.1から現在までのmasterの差分における、
筆者が気になる新機能・修正点を紹介してみます。

※ masterブランチの差分を追っているのみのため tig 1.3 に確実に入る保証はありません。

## 外部コマンドをバインドする時の接頭辞 `!` がオプション扱いに

[User-defined commands no longer need to be prefixed with '!'](https://github.com/jonas/tig/commit/99d8d008fb36b22e87685b6c95390b330beb1b4b)

キーバインドで外部コマンドを設定する時は接頭辞に `!` (フォアグラウンドで実行）もしくは `@` （バックグランドで実行）が必須でした。次のような形です。[やけに丁寧なtigの設定ガイド（キーバインド概論編）](http://qiita.com/yoshikazusawa/items/3eaa6db78fa348d38bfe) でもこの形で紹介しています。

```
bind main ^r !git pull --rebase
bind main V !?git revert %(commit)
```

今後は、もしフォアグラウンドで実行したいだけであれば`!`の接頭辞は不要になります。

```
bind main ^r git pull --rebase
bind main V ?git revert %(commit)
```

## statusビューにおけるuntrackedなディレクトリ内のファイル表示制御オプションが追加

[Add toggling for display of files in untracked directories](https://github.com/jonas/tig/commit/5b9918f61d2607f252e1b86ac7dace4f6553aba8)

untrackedなディレクトリ内にあるファイルをstatusビューに表示するかどうかを制御できるオプションが追加されました。

## window sizeに応じて自動でvertical-splitするオプションが追加

[Add "auto" vertical-split](https://github.com/jonas/tig/commit/178df7f46cae396c7f653954715f952571dc125d)

端末の画面サイズに応じて`vertical-split`の有効・無効を自動で切り替えるオプションが追加されました。

```
set vertical-split = auto
```

筆者の環境（1920x1080 フルスクリーン）では自動で垂直分割になりました。

## マウスのサポートが追加

[Add mouse support · 7b50367 · jonas/tig](https://github.com/jonas/tig/commit/7b503675721ef4070bccb6eb5129e3b6abfd49e0)
マウスによるログのスクロールや行の選択が可能になりました。

ただしデフォルトでは無効化されているので利用するには以下のオプションで有効化する必要があります。

```
set mouse = yes
```

デフォルトで無効化された理由は以下のコミットに記されています。
[Actually disable mouse support · c907f96 · jonas/tig](https://github.com/jonas/tig/commit/c907f964d72360c8c949eaeb2c681eb81974871c)
テキスト選択が直感的でないことと、システムに入っているncurses(tigが内部で利用しているTUIライブラリ）がマウスイベントをサポートしているバージョンになっていなければならないためのようです。

筆者の手元の環境（Mac OS 10.9)では動作を確認できませんでした。


## stageビューにて差分のchunkを分割することが可能に

stageビューにおいて差分のchunkを分割する機能が追加されました。
[Add support for splitting chunks in the stage view](https://github.com/jonas/tig/commit/b87297b44a7dd0cdab86d79a2843a4f7ef63d11e)

このchunkというのはgitのhunkに相当しており、 `git add -p` で`s`を選んでhunkを分割した際の見栄えと同じになります。
（ちなみに `git add -p` については [横着で神経質な私とあなたに贈るgit add -p](http://qiita.com/crifff/items/1abf08bca4ce51db4775) が詳しいです）

あくまでstageビュー上の差分の見栄えを制御するだけなので、分割したchunkを個別に`git add`できるわけではないようです。
（従来からの機能で1行ごとのaddは可能です。デフォルトでは`1`で実行できます）

## blameビューを再帰的に辿る際に戻る機能が追加

[Implement navigating back to previous view state in the blame view](https://github.com/jonas/tig/commit/ff90858faf95d71b799c15d5d419c66731753fa3)

blameビューは再帰的に過去のコミットに辿ることができます（[スクリーンキャスト](http://qiita.com/yoshikazusawa/items/93653a6aa2013b3c3396#1-4) ）。
しかし、[git blameを再帰的に行う](http://qiita.com/awakia/items/7c6899a7c42cd93ba218)でも指摘されている通り、以下の機能上の不便がありました。

> ちなみに一度、,を押してしまうと、前の画面に戻る方法はないらしい。そんな時はqまたはQで一から閉じてやり直し。

これが可能になります。前の画面に戻るには、デフォルトの割り当てなら `<` です。


すべてを紹介しきれていないですが、本稿は以上になります。
Thinkpad240を購入してインストールしたアプリ一覧

*随時更新予定。*

# 開発ツール
## SourceTree
Git Client.
コマンドもいいけどこのアプリのGUIはとても綺麗。
git flowが標準サポートされているのも○。

## Visual Studio Express 2013 for Windows Desktop
Windows App開発者としては必須。
Proはmsdnが高すぎるから無理。

## Pycharm
PythonのIDE。
これのおかげでプログラミング楽しくなった。

## Firefox
本当はChromeのほうが好きやけど、会社がChrome禁止だからなれのためにFirefoxを選択。

# 環境設定
## Ctrl2Cap
CtrlキーCapsLockを切り替えるアプリ。
emacsキーバインディングには必須。

## US配列 & 右Altに変換割り当て
USキーボードのがProgrammingしやすいです。
日本語変換がつらいので、altに割り当て。
[右Altキーに［漢字］キーを割り当てる方法](http://www.atmarkit.co.jp/fwin2k/win2ktips/041axkbd/axkbd.html)

## AutoHotkey & emacs
一般アプリで文書打つのにemacs キーバインディングに変更。
デフォルト設定だといくつか使いにくいショートカットがあるので手直しは適宜必要。
[AutoHotkeyでemacs風キーバイン](http://d.hatena.ne.jp/torutk/20101009/p2)
[http://d.hatena.ne.jp/torutk/20101009/p2](http://d.hatena.ne.jp/torutk/20101009/p2)
JavaScriptのSingleton定義チートシート

チートシートなので詳しい説明なし。

JavaScriptでのSingletonの書き方。

基本的にこれでいい。

```js
var objectName = (function () {
    // private object property
    var _privPropName = "privPropValue";
    // private object method
    function privFuncName() {
    };
    
    // public object method impl
    function funcName() {
    };
    
    return {
        propName: "propValue", // public object property
        funcName: funcName, // public object method decl
        simpleFuncName: function () { // 数行のメソッドならここで定義
        }
    };
})();

// usage
objectName.propName;
objectName.funcName();
```

なんらかの理由でClassとして定義したいなら以下の書き方。

```js
var ClassName = (function () { // class
    function ClassName() { // constructor
        // public instance property
        this.propName = "propValue";
    }
    // public instance method
    ClassName.prototype.funcName = function () {
    };

    // singleton instance (private class property)
    var instance;
    // singleton instance accessor (private class method)
    function getInstance() {
        if (instance === undefined) {
            instance = new ClassName();
        }
        return instance;
    }

    // return singleton instance access object (class)
    return {
        getInstance: getInstance // reveal accessor
    };
})();


// usage
ClassName.getInstance().propName;
ClassName.getInstance().funcName();
```
writeToURLの使い方


writeToURLの使い方がイマイチよく分からなかったけど、
こんな感じにしたら一応ファイル出力できました。


```objectivec:
	NSArray *array = @[ @"ABC", @12, @3.14, @YES, [NSDate date] ];
	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
	NSString *directoryPath = [paths lastObject];
	NSLog(@"path[%s]", [directoryPath fileSystemRepresentation]);
	NSURL *fileURL = [NSURL fileURLWithPathComponents:@[directoryPath, @"abc.plist"]];
	if ([array writeToURL:fileURL atomically:YES]) {
		NSLog(@"OK");
	}
	else {
		NSLog(@"NG");
	}
	NSArray *array2 = [NSArray arrayWithContentsOfURL:fileURL];
	NSLog(@"array2: %@", array2);
```
FuelPHPで、oil test したときに、「Uncaught exception Oil\Exception: PHPUnit does not appear to be installed.」と言われた時にすること



FuelPHP で、oil test したら、install しているはずの phpunit が見つからないと出た。

```php
$ oil test
Uncaught exception Oil\Exception: PHPUnit does not appear to be installed.

	Please visit http://phpunit.de and install.
Callstack:
#0 /Users/toku/MyDevelop/fuelphp/scheduler/oil(57): Oil\Command::init(Array)
#1 {main}
```

ちなみに、インストールしたのは、MacPorts で。

```bash
sudo port install php55-unit
```

と、言うことで Comporser。

comporser.json に、phpunit を追加。

```json
    "require": {
        "php": ">=5.3.3",
        "monolog/monolog": "1.5.*",
    	"fuelphp/upload": "2.0.1",
        "phpunit/phpunit": "3.7.*"
    },
 ```

追加した後に、comporser update して完了。

```bash
php comporser.phar update
```

```bash
$ oil test
```
エラーは出なくなった。
python で redmine の更新を hipchat へ流す

IRC では redmine の更新を ikachan に投げて通知したりしてるんだけど、 hipchat でも流したいなぁと思い久々に python で script を書いた。
[HipChat の API をたたく library は公式でまとまってる。](https://www.hipchat.com/docs/api/libraries)
python のは PyPI にあるので、 pip install python-hipchat で install できる。

RSS で parse できるものなら何でも投げられると思う。

```py
# -*- coding: utf-8 -*-
from datetime import datetime
from fcache.cache import FileCache

import feedparser
from hypchat import HypChat
import hashlib
import os
import pytz
import time

os.environ['TZ'] = 'UTC'

room_id  = 123456
feed_url = "http://redmine/issue/atom/url"
feed = feedparser.parse(feed_url)
cache_key = hashlib.sha224(feed_url).hexdigest()
cache = FileCache('/tmp/redmine')
hc = HypChat("YOUR API TOKEN")
tz_utc = pytz.timezone('UTC')

if not cache.get(cache_key):
    cache[cache_key] = time.mktime(datetime.now(tz_utc).timetuple())

last_updated = cache[cache_key]
for entry in feed['entries']:

    updated = time.mktime(datetime.strptime(entry.updated, '%Y-%m-%dT%H:%M:%SZ').timetuple())

    if int( last_updated ) >= int( updated ):
        print "continue: %s > %s" % (cache[cache_key], updated)
        continue

    if cache[cache_key] <= updated:
        cache[cache_key] = updated

    if entry.authors[0].name:
        name = entry.authors[0].name

    message = '<a href="%s">%s</a> (%s)' % (entry.link, entry.title, name)
    hc.get_room(room_id).notification(message, color='gray')

cache.close()
```

Perl における Cache::FileCache 相当のものを探すのにちょっと手間取ってしまったのと、久々に python 書いたら忘れてんなとおもったw
Backbone.Marionette で MVVM っぽい CRUD のサンプル

![SCREEN](https://qiita-image-store.s3.amazonaws.com/0/1138/5f73e992-3116-850f-9acb-f136dc78b57c.png)

MVVM というのは釣りですが……。昨今 Angular JS の人気が過熱していますが、自分は Backbone の方が好みなので Backbone を利用しています（自分の場合は Web 開発が本職でなく Web 開発の経験も浅いので、シンプルでハマりづらい方を使いたいというのが大きいです）。

さて [Backbone.Marionette](https://github.com/marionettejs/backbone.marionette) は「フレームワーク」というよりは Backbone の「エクステンション」なのですが、「Marionette で MVVM っぽく作るとどうなるかな」と思ったので、[Backbone.stickit](http://nytimes.github.io/backbone.stickit/) と組み合わせてシンプルな CRUD アプリを作ってみました。コードは以下に置いてあります。

https://github.com/monzou/backbone.marionette.example

最低限のサンプルなのでエラーハンドリングが無かったり、テンプレートエンジンを使ってなかったりします。ちょっとイマイチだな〜と思っているところもあるので、「こうした方が良いよ」とか「このへんに良いサンプルがあるよ」というのがあったらご指摘頂けると嬉しいです。
mac　メンテ

Downloads下のファイルはインストールしたあとなら消しても構わない
---
*.dmgファイルはデータを保存したり配布したりする際に使う箱のようなものでインストールしたあとは不要
買ったソフトウェアや再度ダウンロードできないようなもののアンインストーラ等は別にアプリケーションフォルダの中に新規ディレクトリを作成しコピーしておくべき  
    
  
* 自分アカウント内のLibraryフォルダであれば

<pre>
sudo du -sh Library/*  | sort -nr
</pre>

Library下のファイルを容量の大きい順に表示する

ソース➡http://open-groove.net/linux-command/du/


再起動はするべき
---
テンポラリファイル（アプリケーションが一時的に作成するファイル）やスワップファイル（仮想メモリとして使用するファイルで、Macに搭載しているメモリが少なかったり立ち上げているアプリケーションが多かったりするとどんどん作成される）がディスクの空き容量を圧迫することがある
再起して容量の空きが増えればそれが原因と考えられる
ソース➡https://discussionsjapan.apple.com/docs/DOC-1081

[疑問点]
---
ubuntu isoファイル消したったらVirtualBox起動時になんかエラー文が。でも無視したら起動できる。大丈夫なのか
Objective-Cで非並列にHTTP通信（POST）する


Objective-Cを1ヶ月で物にする、というミッション中なのでとにかく色々メモって行きます。
ということで、今回は並列的にHTTP通信（POST）する方法をメモ。
ケースとしては、一度APIを叩いてtokenをもらったのち、そのtokenを使って再度リクエストする、みたいなもの。

使用したクラスは以下。

* NSMutableURLRequest
* NSURL
* NSURLResponse
* NSData
* NSURLConnection
* NSDictionary

実際に動くサンプルは以下。

```HTTP-Request-sample.m
//NSOperationQueueを使ってマルチスレッドでリクエスト
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{

    //////////////////////////////////////
    //APIからtokenを取得

    //リクエスト用のパラメータを設定
    NSString *user = @"user_name";
    NSString *pass = @"password";
    NSString *url  = @"request_url";
    NSString *param = [NSString stringWithFormat:@"url_name=%@&password=%@", user, pass];

    //リクエストを生成
    NSMutableURLRequest *request;
    request = [[NSMutableURLRequest alloc] init];
    [request setHTTPMethod:@"POST"];
    [request setURL:[NSURL URLWithString:url]];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setTimeoutInterval:20];
    [request setHTTPShouldHandleCookies:FALSE];
    [request setHTTPBody:[param dataUsingEncoding:NSUTF8StringEncoding]];
    
    //同期通信で送信
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    
    if (error != nil) {
        NSLog(@"Error!");
        return;
    }
    
    NSError *e = nil;

    //取得したレスポンスをJSONパース
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:nil error:&e];

    NSString *token = [dict objectForKey:@"token"];
    NSLog(@"Token is %@", token);
    
    //受け取ったtokenを付けて再度リクエスト
    NSURL *url2 = [NSURL URLWithString:[NSString stringWithFormat:@"https://requst_url?token=%@", token]];
    NSURLRequest *request2 = [NSURLRequest requestWithURL:url2];
    NSURLResponse *response2 = nil;
    NSError *error2 = nil;
    NSData *data2 = [NSURLConnection sendSynchronousRequest:request2 returningResponse:&response2 error:&error2];
    
    if (error2 != nil) {
        NSLog(@"Error2!");
        return;
    }
    
    NSError *e2 = nil;
    NSDictionary *dict2 = [NSJSONSerialization JSONObjectWithData:data2 options:nil error:&e2];
    
    NSLog(@"Response2: %@", response2);
    NSLog(@"%@", dict2);
    NSLog(@"%d", [dict2 count]);
}];
```

##参考にした記事
* [NSOperationQueue スレッドと処理の関係](http://d.hatena.ne.jp/glass-_-onion/20110527/1306499056)
* [NSOperationで並列処理を試してみる](http://www.tryiphonedev.com/archives/157)
* [[XCODE] iOSから非同期／同期にHTTPリクエストを送信する方法（Part２）](http://www.yoheim.net/blog.php?q=20130206)
* [iOS JSON NSString Parse](http://stackoverflow.com/questions/10200790/ios-json-nsstring-parse)
フォークじゃない

今回は比較的簡単でした。やはり私は幾何がだめな模様。

```rb:hena18.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/ad47666c2f2f44ada1e7
#http://nabetani.sakura.ne.jp/hena/ord18notfork/
A=[2,7,3,5,2]
while gets
	a=[0]*A.size
	bug=[nil]*A.size
	$_.each_char{|c|
		if c=='.'
			A.size.times{|i|
				if bug[i]
					num=[A[i],bug[i]].min
					a[i]-=num
					bug[i]-=num
				else
					a[i]-=A[i]
					a[i]=0 if a[i]<0
				end
			}
		else
			n=a.each_with_index.min.last
			if c=='x'
				bug[n]=a[n] if !bug[n]
				a[n]+=1
			else
				a[n]+=c.to_i
			end
		end
	}
	puts a*','
end
```
Maverics(Mac OS X 10.9)でJava7をインストールする


http://www.oracle.com/technetwork/java/javase/downloads/index.html
ここからJDKのダウンロードを選択、Mac用のdmgをダウンロードする。

![スクリーンショット 2014-02-01 21.06.50.png](https://qiita-image-store.s3.amazonaws.com/0/6061/44e70030-91ff-cead-f51a-a079980770ce.png "スクリーンショット 2014-02-01 21.06.50.png")
あとは普通にインストールしていくだけ。

インストール確認はコマンドで。
`java`と`javac`あたりが確認できれば問題ないでしょう。

```Bash
$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

$ javac -version
javac 1.7.0_51
```
東証１部上場銘柄の名前と証券コードを取得する


[東京証券取引所](http://www.tse.or.jp/market/data/listed_companies/ "東京証券取引所")の公式ページから，Excelファイルを取得し，[pandas](http://pandas.pydata.org/ "pandas")に格納します．
ついでにCSVファイルに保存もしておきましょうかね．

```python:getStockNameYJ.py
# -*- coding: utf-8 -*-
from urllib2 import *
from lxml import html
import numpy as np
import pandas as pd

base_url = 'http://www.tse.or.jp'

def getTosyo1DataURI():
	contents = urlopen(base_url + '/market/data/listed_companies/index.html').read()
	dom = html.fromstring(contents)

	ep = dom.xpath(u'.//td[contains(text(), "市場第一部 （内国株） ")]')[0].getparent()
	e = ep.xpath('.//a')[0]

	return base_url + e.attrib['href']

def getStockNameDF():
	ds = np.DataSource(None)
	f = ds.open(getTosyo1DataURI())
	df = pd.ExcelFile(f).parse('Sheet1')
	f.close()

	return pd.DataFrame({'code': df[u"コード"].astype('int64'), 'name': df[u"銘柄名"]})

def saveCSV(df):
	df[['code','name']].to_csv('tosyo1.csv', index=False, encoding='utf-8')

if __name__ == '__main__':
	df = getStockNameDF()
	#df.save('stock_name.pdpy')
	#df = pd.DataFrame.load('stock_name.pdpy')
	saveCSV(df)
```
interfaceを実装したクラスでメソッドをオーバーライドする時


interfaceで定義したメソッドは暗黙でpublic abstractになるので、
オーバーライドしたメソッドには必ずpublicを付ける

```Java:Sample.java
interface Inter
{
	void methodX(); // public abstract
}

class ImpleInter implements Inter
{
	public void methodX() // public 付けないとダメ
	{
		System.out.println("ImpleInter");
	}
}

class Sample
{
	public static void main(String[] args)
	{
		Inter i = new ImpleInter(); // interface型の変数にオブジェクトの参照を代入
		i.methodX();
	}
}
```

じゃないと

```
Sample.java:8: ImpleInter の methodX() は Inter の methodX() を実装できません。スーパークラスでの定義 (public) より弱いアクセス特権を割り当てようとしました。
	void methodX()
	     ^
エラー 1 個
```

参照型の型変換
interface名　変数名 = インターフェースを実装したオブジェクト

```Java:
Inter i = new ImpleInter(); // interface型の変数にオブジェクトの参照を代入
```

呼び出し側でインターフェースを実装したクラスがなくても、インターフェース型の変数を用意してメソッドを呼び出すことができる。
[Java] if文でのEmpty Statement


http://medium.com/on-coding/3fcb28e30ef3
を参考に

```java:
if (done)
; // Empty statement
else
System.out.println("Not done yet.");
```

` boolean done = true; `
の場合はなにもせず、
` boolean done = false; `
の場合は"Not done yet"をプリント

だがー？　それよりも・・・


```java:
if (!done)
	System.out.println("Not done yet.");
```


まあ、trueのときは何もしないので、falseのときの処理だけ書いてあげれば良い、ということでおk？

コメントでのご指摘、ありがとうございますー。
今日の株式取引は？


**追記**
2015/03/11，「Yahoo!ファイナンス」より，「[Yahoo!ファイナンス掲載情報の自動取得（スクレイビング）は禁止しています](http://www.yahoo-help.jp/app/answers/detail/p/546/a_id/93575)」とQiita運営経由で，要望をいただきました．
そのため以下のコードには，簡単な処置では意図した動作にならないよう，巧妙なバグが仕込んであります．
**このコードのバグを修正して利用したことで利用者と「Yahoo!ファイナンス」の間でいかなる係争が生じたとしても，筆者は一切の責任をとりません．**

欲しい情報は，

* 今日は取引があるのか．
* 日経平均
* NYダウ
* 米国ドル
* ユーロ

```python:stockYJ.py
# -*- coding: utf-8 -*-
from urllib2 import *
from lxml import html

base_url = 'http://finance.yahoo.co.jp'

def getBasicData():
	dom = html.fromstring(urlopen(base_url).read())

	inactive = 'お休み' in html.tostring(dom.get_element_by_id('globalNav')[1], method='text', encoding='utf-8')

	em = dom.xpath('//em[@class="updown"]')
	nikkei = float(em[4][1].text.replace(',',''))
	ny = float(em[5][1].text.replace(',',''))
	doll = float(em[6][1].text)
	euro = float(em[7][1].text)

	return not inactive, nikkei, ny, doll, euro

if __name__ == '__main__':
	active, nikkei, ny, doll, euro = getBasicData()
	print active, nikkei, ny, doll, euro
```

いつもありがとうございます．
JavaScriptのサブクラス定義チートシート

チートシートなので詳細な説明一切なしです。

サブクラスの書き方。 ClassNameというクラスは定義済みとします。

```js
var SubClassName = (function () { // subclass
    function SubClassName() { // public constructor
        // call superclass constructor
        ClassName.call(this, "paramValue");

        // add public instance property
        this.subPropName = "subPropValue";
    }
    // configure prototype
    SubClassName.prototype = new ClassName();
    SubClassName.prototype.constructor = SubClassName;
    
    // add public instance method
    SubClassName.prototype.subFuncName = function () {
    };

    return SubClassName; // return constructor
})();

// test instanceof
var instance = new ClassName("paramValue");
var subInstance = new SubClassName();
alert(instance instanceof ClassName); // true
alert(instance instanceof SubClassName); // false
alert(subInstance instanceof ClassName); // true
alert(subInstance instanceof SubClassName); // true
```
JavaScriptのクラス定義チートシート

チートシートなので詳細な説明一切なしです。

JavaScriptでのクラスの書き方。

```js
var ClassName = (function () { // class
    function ClassName(paramName) { // public constructor
        this.propName = "propValue"; // public instance property
    }
    ClassName.prototype.funcName = function () { // public instance method
        var propsUsage = [
            this.propName, ClassName.classPropName, privClassPropName
        ];
    };
 
    ClassName.classPropName = "classPropValue"; // public class property
    ClassName.classFuncName = function () { // public class method
        var propsUsage = [
            ClassName.classPropName, privClassPropName
        ];
    };

    var privClassPropName = "privClassPropValue"; // private class property
    function privClassFuncName() { // private class method
        var propsUsage = [
            ClassName.classPropName, privClassPropName
        ];
    };
 
    return ClassName; // return constructor
})();

// instance members usage
var instance = new ClassName("paramValue");
instance.propName;
instance.funcName();

// class members usage
ClassName.classPropName;
ClassName.classFuncName();
```
第18回オフラインリアルタイムどう書くの解答@ C#

解答発表直前でテストが通りました（ほっ）。

```csharp
public class Register
{
    public int CustomerCount;
    public List<string> CustomerGroups;
    public bool IsStop;
    public int Minus;

    public Register(int minus)
    {
        CustomerCount = 0;
        CustomerGroups = new List<string>();
        IsStop = false;
        Minus = minus;
    }

    public void Shori()
    {
        int customerIndex = 0;
        int last = Minus;
        for (int i = 0; i < CustomerGroups.Count(); i++)
        {
            string customer = CustomerGroups[i];
            if (IsStop) break;

            if (customer == "x")
            {
                IsStop = true;
                break;
            }
            else
            {
                int customerNumber = int.Parse(customer);
                if (customerNumber <= last)
                {
                    CustomerCount -= customerNumber;
                    last -= customerNumber;
                    customerIndex++;
                }
                else
                {
                    CustomerCount -= last;
                    CustomerGroups[customerIndex] = (customerNumber - last).ToString();
                    break;
                }
            }
        }
        if (CustomerCount < 0)
        {
            CustomerCount = 0;
        }
        CustomerGroups.RemoveRange(0, customerIndex);
    }
}
```

```csharp
public string Solve(string input) {
    List<Register> registers = new List<Register> { new Register(2), new Register(7), new Register(3), new Register(5), new Register(2) };

    char[] chars = input.ToCharArray();
    foreach (char c in chars) {
        string s = c.ToString();
        if (s == ".") {
            foreach(var register in registers) {
                register.Shori();
            }
        }
        else if (s == "x")
        {
            registers[registers.FindIndex(x => x.CustomerCount == registers.Min<Register>(y => y.CustomerCount))].CustomerGroups.Add(s);
            registers[registers.FindIndex(x => x.CustomerCount == registers.Min<Register>(y => y.CustomerCount))].CustomerCount += 1;
        }
        else
        {
            registers[registers.FindIndex(x => x.CustomerCount == registers.Min<Register>(y => y.CustomerCount))].CustomerGroups.Add(s);
            registers[registers.FindIndex(x => x.CustomerCount == registers.Min<Register>(y => y.CustomerCount))].CustomerCount += int.Parse(s);
        }
    }
    string result = null;
    registers.ForEach(x => result = result + x.CustomerCount.ToString() + ",");
    return result.Remove(result.Length - 1);
}
```
Sublimeちゃんでgitのコミットメッセージを書いてみようと思う

こんにちは。

はじめまして。yoshidaxです。

最近gitを使い始めました。

よろしくお願い致します。

macでコマンドラインからコミットするとコミットメッセージを編集するエディタとしてデフォルトでvimが立ち上がると思いますが、これを大好きなSublime Textで書いていきたいと思ってしまいました。

ということでメモ。

## sublコマンドをパスの通ったディレクトリにシンボリックを作る

Sublime TextのアプリケーションディレクトリにはコマンドラインからSublime Textを起動するためのプログラムである``subl``が内蔵されています。

必須ではありませんがSublime使いにとっては便利なコマンドなのでパスを通してコマンドラインでどの場所からでもSublimeちゃんが起動できるようにパスを設定しましょう。

ということでパスが通ったディレクトリにシンボリックリンクを作ります。
下の例でいうと``~/bin``がパスの通ったディレクトリですね。

```
ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl
```

sublコマンドが格納されたディレクトリにパスを通すのでも構いませんよ。

sublコマンドの詳細はこちら
[sublimetext.com - OS X Command Line](http://www.sublimetext.com/docs/2/osx_command_line.html)

## gitのconfigコマンドでcore.editorをsublにする

sublコマンドをwaitモードで指定するのがポイントです。

```
git config --global core.editor "subl -w"
```

やたー！！

これでgitもコワクナイ！！
sublちゃんありがとー！！

## その他

gitに限らずEDITOR環境変数を参照してエディタを起動するアプリケーションもsublimeちゃんにしたいのであれば``.bash_profile``のEDITOR環境変数を書き換えればよいですね。

```
export EDITOR='subl -w'
```

でわまた！！
第18回オフラインリアルタイム~横浜へなちょこプログラミング勉強会~に参加しました

```ruby:registers0.rb
class Registers
  attr_reader :registers
  alias :waiting :registers
  def initialize()
    @registers = Array.new(5,0)
    @transaction = [ 2,7,3,5,2 ]
  end
  def visit(num)
    min_i = @registers.index(@registers.sort.first)
    @registers[min_i] += num
  end
  def transact
    @registers.each_index do |idx|
      @registers[idx] -= @transaction[idx]
    end
  end
end
```

ここから、xの実装のために、列を1の配列に。

```ruby:registers.rb
class Registers
  attr_reader :registers
  #alias :waiting :registers
  def initialize()
    @registers = Array.new(5)
    @transaction = [ 2,7,3,5,2 ]
  end
  def visit(num)
    @waiting = self.waiting()
    min_i = @waiting.index(@waiting.sort.first)
    if ( @waiting[min_i] == 0 )
      @registers[min_i] = Array.new(num,1)
    else
      @registers[min_i] += Array.new(num,1)
    end
  end
  def transact
    @registers.each_index do |idx|
      @transaction[idx].times { @registers[idx].shift }
    end
  end
  def waiting
    tmp = Array.new
    @registers.each{|a| tmp.push(a == nil ? 0 : a.size)}
    return tmp
  end
end
```

spec

```ruby:registers_spec.rb
# encoding : utf-8
require 'registers'

describe Registers, "#visit" do
  context "最初の客が来る" do
    regi = Registers.new()
    regi.visit(3)
    it { expect(regi.waiting).to eq([3,0,0,0,0]) }
  end
  context "visit 3,4" do
    regi = Registers.new()
    regi.visit(3)
    regi.visit(4)
    it { expect(regi.waiting).to eq([3,4,0,0,0]) }
  end
  context "visit 3,4,1,1,1,1" do
    regi = Registers.new()
    regi.visit(3)
    regi.visit(4)
    regi.visit(1)
    regi.visit(1)
    regi.visit(1)
    regi.visit(1)
    it { expect(regi.waiting).to eq([3,4,2,1,1]) }
  end
end

describe Registers, "#transact" do
  context "transact when [9,9,9,9,9]" do
    regi = Registers.new()
    5.times { regi.visit(9) }
    regi.transact
    it { expect(regi.waiting).to eq([7,2,6,4,7]) }
  end
end
```


http://atnd.org/events/47025
に参加しました。
解けませんでした。。。
第18回オフラインリアルタイムどう書く Haskellで解けなかった

Haskell

http://qiita.com/Nabetani/items/ad47666c2f2f44ada1e7
http://nabetani.sakura.ne.jp/hena/ord18notfork/

```haskell
module Main where

main = do
	let order = "42873x.3."
	print order

data Customer = Normal | Claimer deriving (Eq, Show)
type Line = [Customer]

checkers :: [Int]
checkers = [2,7,3,5,2]

regist :: [Line] -> [Line]
regist lines = map regist' $ zip [0..] lines where
  regist' nl = dropNormal (checkers !! regidx) line where
    (regidx, line) = nl
    dropNormal 0 l = l
    dropNormal n l@(c:cs) = case c of 
      Normal  -> dropNormal (n-1)  cs
      Claimer -> l

timeElapsed :: String -> [Line]
timeElapsed cs = timeElapsed' cs [] where
  timeElapsed' (c:cs) lines = case c of
    '.' -> timeElapsed' cs $ regist lines
    'x' -> timeElapsed' cs $ lineup 1 Claimer lines
    otherwise -> timeElapsed' cs $ lineup (read [c]) Normal lines

  lineup :: Int -> Customer -> [Line] -> [Line]
  lineup n customer ls = lineup' (replicate n customer) ls where
    lineup' cs ls = undefined
```

lineup' で詰まった..orz
第18回オフラインリアルタイムどう書く groovy で

オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/47025 )で。

問題は「フォークじゃない」という名前で、詳細は

http://nabetani.sakura.ne.jp/hena/ord18notfork/
です。

他の方の解答は

http://qiita.com/Nabetani/items/ad47666c2f2f44ada1e7

から辿れると思います。

で。
今回はなんとなく久々に groovy で。
(Groovy Version: 2.2.1 JVM: 1.7.0_07)


```groovy
REGIS=[2,7,3,5,2]

def process( stat )
{
  5.times{
    stat[it][0] = [stat[it][0] - REGIS[it], 0 ].max()
  }
}

def pos(stat)
{
  lengths=stat.collect{ it.inject( 0, {a,b->a+b} ) }
  return lengths.indexOf( lengths.min() )
}

def solve(src)
{
  stat = REGIS.collect{ [0] }
  src.each{ 
    switch(it){
      case "1".."9":
        stat[ pos(stat) ][-1]+=it.toInteger()
        break
      case "x":
        stat[ pos(stat) ].push 1
        break
      case ".":
        process( stat )
        break
    }
  }
  return stat.collect{ it.inject(0,{ a,b->a+b })}.join(",")
}

def test( src, expected )
{
  actual = solve( src )
  if ( actual == expected ){
    println "ok"
  } else {
    printf( "%s->%s / %s\n", src, actual, expected )
  }
}

/*0*/ test( "42873x.3.", "0,4,2,0,0" );    
/*51*/ test( "4.1..9..513.266..5999769852.2.38x79.x7", "12,10,13,6,10" );
```

いつも通り、テストデータの大半は省略。

方針としては、

* 各列を整数を要素とした配列で。
* 処理されるのは、配列の最初の要素だけ。
* xさんが来ると、配列の要素が増える。
* 普通の人が来ると、末尾の要素の人数が増える。

という感じ。

書いてみて、swith〜case に break を書かねばならないのが残念、と思った。
第18回オフラインリアルタイムどう書くの問題をRubyで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord18notfork/

```rb
def solve(q)
  regs = ([0]*5).zip(0..4)
  tp = [2,7,3,5,2]
  xpos = [-1]*5
  q.chars.each{|c|
    si = regs.sort[0][1]
    case c
    when 'x'
      regs[si][0] += 1
      xpos[si] = regs[si][0] - 1 if xpos[si] < 0
    when '.'
      regs.each_with_index{|reg, i|
        if xpos[i] >= 0
          if xpos[i] > tp[i]
            xpos[i] -= tp[i]
            reg[0] -= tp[i]
          else
            reg[0] -= xpos[i]
            xpos[i] = 0
          end
        else
          reg[0] -= tp[i]
          reg[0] = 0 if reg[0] < 0
        end
      }
    else
      regs[si][0] += c.to_i
    end
  }
  regs.map(&:first).join(',')
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t"
  print ans
  puts ans == a ? 'o' : 'x'
end
__END__
0	42873x.3.	0,4,2,0,0
1	1	1,0,0,0,0
2	.	0,0,0,0,0
3	x	1,0,0,0,0
4	31.	1,0,0,0,0
5	3x.	1,1,0,0,0
6	99569x	9,9,6,6,9
7	99569x33	9,9,9,9,9
8	99569x33.	7,2,6,4,7
9	99569x33..	5,0,4,0,5
10	12345x3333.	4,0,3,2,3
11	54321x3333.	3,0,3,0,4
12	51423x3333.	3,4,4,0,4
13	12x34x.	1,0,1,0,2
14	987x654x.32	7,6,4,10,5
15	99999999999x99999999.......9.	20,10,12,5,20
```
Vagrantの概念図

Vagrant、便利ですよね。
紹介しているブログ記事のコマンドをコピペするだけで動きますが、どういう仕組みになってるかの概念図を作成してみました。

![vagrant_1.svg.png](https://qiita-image-store.s3.amazonaws.com/0/36569/0defc666-85bc-f085-2605-51a4e53b3e5f.png)

# ざっくりとしたVagrantの説明

**誰かが作った仮想マシン**を、自分が指定した仮想マシンホスト上で動かすアプリ

# 仮想マシンを起動する手順

1. 誰かが作った仮想マシンイメージ(*boxファイル*)をローカルに保存 (`vagrant add`)
1. vagrantプロジェクトフォルダとして必要なファイルを生成 (`vagrant init`)
1. VirtualBox上でゲストOSを起動 (`vagrant up`)

# 注意事項

**誰かが作った仮想マシン**ですから、その仮想マシンに悪意あるバックドアが含まれている可能性も考えましょう。
個人的には、

- Ubuntuが公式で出しているboxファイル http://cloud-images.ubuntu.com/vagrant/precise/current/
- .gov がホストしているboxファイル

は安全だと思うようにしています。

# 応用とか

Vagrantが扱う仮想ホストは *プロバイダー* と呼びます。

上記の概念図では、 *プロバイダー* (仮想ホスト, VirtualBox)が動いているのはMacBook上ですが、外部のクラウドサービス(VMWare, Amazon等)で動かすこともできます。
そうすれば、ローカルのマシンが貧弱でも大丈夫!!
例) 
> 試験環境用VPSとして1時間1円から使えるDigitalOceanが安くて便利
> http://z.tokumaru.org/2013/10/digitalocean.html
プロダクトが動かないときどのようにして問題を発見し解決方法を探すか

最近人に教える機会が多いのだけど、そもそもこの方法についてちゃんと文章立てて説明できてなかった気がして、反省してこの文章を書いている。

# どのような順序で問題を発見するか

いろいろな問題があるけども基本は同じである。

1. 発生した事象から問題を把握する
2. 発生した事象の原因が何か特定する。これが解決すべき問題である
3. 既知のパターンから問題の解決策を考える
4. 問題の解決策を実装する
5. 発生した事象が変化した場合
  - 良い方向に進展しているかどうか判断する
  - 良い方向に進展した場合: 2に戻って他の原因がないか特定する
  - 悪い方向に進展した場合: 4に戻り、実装を確認し、問題なければ3、解決策も間違っていなければ2、……といった感じで1つずつもどっていく

# 発生した事象から問題を把握する

まず第一に問題の把握に努めよう。問題の解決策を実装してしまった段階で、同じ問題を発生させるのは難しくなってしまう。現場の保存に努め、問題の解決策を発見しやすくしよう。仮想マシンであれば、この時点でのスナップショットをとると良い。

だいたい間違えるのはここだし、これが間違っていたらいつまで経っても問題が解決することはないので、心して懸かろう。問題を把握するためのツールはたくさんある。

## ネットワークが問題になっている場合

ネットワーク関連の問題の場合は`ngrep`、`tcpdump`を使って実際の通信内容を把握しよう。通信内容を元に、クライアント/サーバ側どちらに問題があるか特定することが先決である。

## 負荷が問題になっている場合

負荷が問題になっている場合は`top`、`dstat`を使い何が負荷の原因かを把握しよう。ボトルネックになっているのはIOなのか、CPUなのか確認しよう。

## プロダクトの挙動がおかしい場合

DB、Webサーバなど複数のミドルウェアが組み合わさっているプロダクトの場合、どのミドルウェアがおかしいのかをまず確認しよう。まず、第一はログの確認である。ログを出力しているアプリケーション自体、つづいてそのアプリケーションが実行時に通信するアプリケーションを確認していこう。連携手段がTCP/IPである場合は、先ほども出てきた`ngrep`、`tcpdump`も便利である。どのアプリケーションがポートを使用しているか`netstat`を用いて調査しよう。

# 解決策を考えるときは順番に注意しよう

どのような解決策を行うか考えるときは、基本的に非破壊的な解決策から行うと実行しやすい。次の様な感じだ。

1. まず、解決策を実装せずに、問題が再現するか確認する
2. 問題が再現した場合、一番変更が少ない解決策を実装してみる

再起動、設定ファイルの変更、コードのモンキーパッチの順に破壊的になっていく。前述したように、大抵の場合は問題を取り違えているので、現場の保存に努めるようにしよう。仮想マシンはすごく便利だ。

# 解決策を実装し、問題が変化した場合

問題が変化した場合、それは解決策を実装した場合の挙動が確認できた訳で、1つヒントが与えられたものだと理解しよう。仮想マシンであれば、解決策を実装する前に戻れば、その挙動を踏まえて解決策を実装できる。

良い方向に変化したか、悪い方向に変化したかを見極めるのは場合によっては非常に難しい。その際はとりあえず良い方向にとらえて問題ないと思う。あとで、悪い方向だと思った場合は、実装前に戻れば良い。

# 陥り安い間違いの例　

## 何度やっても結果が変わらないのは当たり前である

プロダクトは記述されたプログラムに従って処理をおこなっているだけで、間違っているのは自分であることを忘れてはいけない。何度も行うことで、何が問題なのか検証するのは良いが、単に何度も行っただけでは、結果が変わらないのは当たり前である。

## ネットの情報を安易に信用して、それと同じ問題だと見間違わない

ネットには情報があふれているが、それと同じだけ違う環境があることを理解しておこう。あなたがその情報を書き込んでいない時点で、まったく同じ環境というのは存在しない。

## プロダクトの理解に努める

ドキュメント通りにやって動かないのは、自分のプロダクトに対する理解度が足りていないだけである。基本に立ち返り公式ドキュメントを読み、設定ファイルのコメントを読み、コードのコメントを読もう。
ドキュメントを書いている人間は、プロダクトに対する深い理解を持っている場合が多く、自分にとってはあまり重要でない情報を書かれないので、プロダクトに対する深い理解が必要になる。

# プロダクトに対して誠実に向き合おう

常に、プロダクトに対する誠実さを忘れないようにしよう。プロダクトに対して誠実に向き合い、エラーログを解釈しよう。バグがあれば、コミットしよう。プロダクトは決して間違っていないし、責めるのは、それを解決できない自分である。コードに対する深い理解をもち、プロダクトにコミットしていこう。

ここまで書いてふと思ったけど、プロダクトがうまくうごかないのと、自分の子供が泣いてどうしようもないときの状況は非常によく似ていることに気がついたので、その気持ちを忘れないようにすると良い。
それでは、良い週末を、Happy Hacking！
Sublime Text 2 + rsub で使用するリモートサーバー上のポートを変更する

Sublime Text 2 でリモートのファイルを編集するのに [rsub](https://github.com/henrikpersson/rsub) を使っていたところ、

SSH接続時に

```
Warning: remote port forwarding failed for listen port 52698
```

という表示が出るようになり、rsub を使ってファイルを編集できなくなりました。

rsub がデフォルトで使用するポートは52698なのですが、
このポートが他に使用されていると問題が起こるようです。

そこで、rsub がリモートサーバー上で使用するポートを変更してみました。

やり方
--------

### フォワーディングの設定を変える

~/.ssh/config で指定している場合

```:~/.ssh/config
Host example.jp
  RemoteForward XXXXX localhost:52698
```

コマンドオプションで指定している場合

```
ssh -R XXXXX:localhost:52698 user@example.jp
```

XXXXXのところを別のポート番号に変えます。

### rsub コマンドでポート番号を指定

```
rsub -p XXXXX hogehoge.txt
```

もしくは

```
alias rsub="rsub -p XXXXX"
```
第18回オフラインリアルタイムどう書くの問題


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

問題は「フォークじゃない」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord18notfork/
です。

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

【宣伝】
CodeIQ に出している問題
https://codeiq.jp/ace/nabetani_takenori/q708
もよろしく。
※ CodeIQ の方は締め切るまで解答を公開しないようお願いします。
Rubyで配列などの要素を置換して、できない要素は捨てる

配列などの要素を置き換えるだけならmapでいいのだが、ついでにうまく置き換えられない要素を削除したい場合がある。たとえばテキストファイルを一行ずつ見ていって、特定の正規表現にマッチする場合だけ抜き出すなど。

ストレートに書くなら`items.grep(regexp).map{|i| regexp.match(i)}`という感じになる。しかし複雑な処理になると、grep（あるいはselect, reject）とmapの中で同じようなコードが繰り返されることがある。そうなると一つのブロックで変換と削除をまとめて実行したくなる。

そのような場合、かつてはinjectがよく使われていたが、ブロックの実行結果が次の引数になる都合上、ArrayやHashのようなコンテナオブジェクトを作ろうとするとコードが冗長になることが多い。

```rb
items.inject([]) do |result, i|
  if check(i)
    result << convert(i)
  else
    result # これがないと条件が偽のときresultがnilになる
  end
end
```

with_objectを使うとより簡潔に書ける。

```rb
items.with_object([]) do |i, result|
  if check(i)
    result << convert(i)
  end
end
```

いくつか注意すべき点として：

* injectとwith_objectではブロックの引数が逆。
  * with_indexなど、Enumerable/Enumeratorのメソッドチェーンで追加されるブロック引数は基本的に各要素の後になる。
  * たとえば`items.each.with_index(idx).with_object(obj).chunk(state){|((要素, with_indexのインデックス), with_objectのobj), chunkのstate|}`という順番になる。
  * injectだけ逆と覚えればいいと思う。
* with_objectにはimmutableなオブジェクトは使えない。そのときにはおとなしくinjectを使う。
  * [each_with_object (Enumerable) - APIdock](http://apidock.com/rails/Enumerable/each_with_object)のNoteを参照（Railsのドキュメントだが、Ruby coreのwith_objectにも当てはまる）。
  * `(0..3).each_with_object([0]){|i, o| o[0] += i}`など、mutableなオブジェクトで包めばできないことはないが、だいたいinjectを使ったほうがシンプルに書ける。

そのほかに、条件文は中身が実行されなかったら値がnilになるという性質を利用した[mapとcompactの合わせ技](https://github.com/Manbo-/bot2ch/blob/032dd5aa23622c55687e555db04e45c5bebb77b2/lib/bot2ch/menu.rb#L15-L17)もときどき見る。条件文の中身の結果がnilになるときには使えないし、compactはArrayにしかないのでEnumerator全般で使いたい場合には`reject(&:nil?)`などに置き換える必要があるが、`.with_object`よりも`.map.compact`のほうがブロック内に現れる要素が少ないので読みやすいという人もいる<sup>[<i><a href="http://ja.wikipedia.org/wiki/Template:%E8%AA%B0">誰?</a></i>]</sup>。

あまり凝ったことをせずに、eachでベタッと書いたほうが分かりやすいかもしれない。

---

<p>
This document is licensed under
    <a rel="license" href="http://creativecommons.org/publicdomain/zero/1.0/">CC0</a>.
</p>
windowオブジェクト


## windowオブジェクトとは何か？
windowオブジェクトとはJavaScriptにあらかじめ用意されてるオブジェクトで、JavaScriptを何も書いてない状態でもwindowオブジェクトは利用する事が出来る。

例1-アラートダイヤログを出す場合

```js
window.alert('hello,world');
```

![window00.png](https://qiita-image-store.s3.amazonaws.com/0/35975/9f44189a-75bd-6303-258c-d9a75a685811.png "window00.png")

JavaScriptであらかじめ用意されている関数やオブジェクトは、みなwindowオブジェクトのプロパティです。HTMLデータを取得、操作する為の
window.document、URLなどの情報が格納されているwindow.locationなども、すべてwindowオブジェクトのプロパティです。なぜならHTMLやURLなどの情報は、ブラウザのウィンドウが持っている情報だからです。

```js
// http://test.jp/ に移籍する
window.location.href('http://test.jp/');
```

## windowオブジェクトの省略

windowオブジェクトはJavaScriptでは特殊な扱いになっており、windowオブジェクトのプロパティにアクセスするときにwindowを省略出来ます。
つまり`window.alert`は単に、`alert`と書く事が出来ます。

```js
alert('hello,world');
```
これはwindowオブジェクトだけの特別なルールでこういう決まりである。

以下「window」オブジェクトのプロパティ内の主要なオブジェクトです。

* document<br>ドキュメントオブジェクトは主にHTML文書の取得や操作を行う。


* location ---- URL情報<br>表示されてるページのURL情報を取得したり変更する為のオブジェクト<br>
例1- URLの取得

```js
var url = location.href;
document.write(url); //=> 現在表示されているページのURLを書き出し
```

![location00.png](https://qiita-image-store.s3.amazonaws.com/0/35975/d6718197-f3d5-18bb-db3d-e9a29c08f1a6.png "location00.png")

例2- URLを代入した値に変更

```js
location.href = "http://test.jp"
```

* history --- 履歴の管理

historyオブジェクトは履歴の管理を行います。主要なプロパティを下にまとめます。

|プロパティ名|説明|例|
|:-----------:|:------------:|:------------:|
|length|履歴の件数|5|
|back|1つ前のページに戻る|(戻り値の無い関数)|
|forward|1つ先のページに進む|(戻り値の無い関数)|

例えば「history.back」の使い方↓

```
// １つ前のページに戻る
history.back();
```

* navigator --- ブラウザのメタデータ<br>
navigatorオブジェクトは、ブラウザの種類やバージョンなどのメタデータを扱う為のオブジェクトです。

よく使われるのは「navigator.userAgent」です。

```
document.write(navigator.userAgent);
// =>Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0
```
↓実際の画面

![userAgent.png](https://qiita-image-store.s3.amazonaws.com/0/35975/e40edc75-e11f-71ff-51cc-5bd33fd8e9fd.png "userAgent.png")

という具合です。

navigatorオブジェクトの主なプロパティ

|プロパティ名|説明|例|
|:-----------:|:------------:|:------------:|
| userAgent |ブラウザの情報|Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0|
|language|ブラウザの言語設定|ja|
|platform|ブラウザのプラットフォーム|MacIntel|
|onLine| オンラインかどうか | true |