OmniAICreator/Qiita-1.07M huggingface dataset:
Gitが連想配列記憶装置であることを低レイヤーな操作を通して体感しよう！

誤解を恐れずに言えば、Gitとは一つの連想配列ストレージシステムです。
かっこよく言うと Key Value Storeです。

Gitがやっていることの本質は、あなたのコンテンツを圧縮してDBに保存し、あなたの要求に応じてDBから取り出して解凍する、ただそれだけです。

具体的には
KVSでのsetにあたる命令が`git add`,`git commit`
KVSでのgetにあたる命令が`git checkout`
です。

そしてデータベースとは.git/object/ ディレクトリ配下にあるファイル群のことです。

さて今回は`git checkout`コマンドを使わずに低レイヤーなコマンドだけを使って同じことを実現してみましょう。

# 準備
新規レポジトリを作成して、"hello world"と書かれたファイルをコミットします。

```
git init dqneo
echo hello world > hello.txt
git add hello.txt
git commit -m "initial commit"
```

次にそのファイルを削除してコミットします。

```
git rm hello.txt
git commit -m "second commit"
```

2コミット実行した結果、いまワークツリーにはファイルが何もない状態になりました。

# 過去のファイルはどこへ行った？
さて`hello.txt`はワークツリーから消えてしまったわけですが、いったいどこにあるのでしょうか？

`git rev-parse`や`git cat-file`などの低レベルコマンドを駆使して連想配列オブジェクトを順番にたどっていけばわかります。

まず現在のHEADが指し示すコミットハッシュ値を調べます。

```
$ git rev-parse HEAD
3d4387e272a02ccd42d63570053ec317197c8da9
```

現在のHEADが指し示すコミットハッシュ値は`3d4387e272a02ccd42d63570053ec317197c8da9`です。
(ちなみにこの値は、あなたの環境では違う値になるはずです。なぜならコミットした日時とauthorの名前が、私とあなたでは違うからです)

次に、このコミットの親コミットを調べます。
親コミットというのは「ひとつ前のコミット」という意味です。

```
$ git cat-file -p 3d4387e272a02ccd42d63570053ec317197c8da9
tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
parent 3d18808630d928c2f4b826569cc92d05bc25fa73
author DQNEO <dqneoo@xxxx.xxx> 1386165103 +0900
committer DQNEO <dqneoo@xxxx.xxx> 1386165103 +0900

second commit
```

親コミットはparentの右に書いてある `3d18808630d928c2f4b826569cc92d05bc25fa73`であることがわかります。
親コミット(初回コミット)の中身をのぞいてみましょう。

```
git cat-file -p 3d18808630d928c2f4b826569cc92d05bc25fa73
tree 68aba62e560c0ebc3396e8ae9335232cd93a3f60
author DQNEO <dqneoo@xxxx.xxx> 1386165089 +0900
committer DQNEO <dqneoo@xxxx.xxx> 1386165089 +0900

initial commit
```

上記のtreeのハッシュ値を使って、treeオブジェクトの中身を覗いてみると

```
git cat-file -p 68aba62e560c0ebc3396e8ae9335232cd93a3f60
100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad    hello.txt
```

あった！ありました！
`hello.txt`を表すblobオブジェクトが見つかりました。

## 過去のファイルはここにあった！

このオブジェクトが実際に`.git/objects/`内に存在することを確認しておきましょう。

```
ls -l .git/objects/3b
合計 4
-r--r--r-- 1 vagrant vagrant 28 12月  4 22:50 2013 18e512dba79e4c8300dd08aeb37f8e728b8dad
```

たしかに存在しています。

# git checkoutと同じことを低レイヤーにやる

冒頭の定義によれば、`git checkout`の本質はデータベースからコンテンツを取り出すことです。
具体的に言うと`.git/objects/`の中にあるファイル群からそれを見つけ出してカレントディレクトリ(ワークツリーとも言う)に展開することです。

さて、ではこのハッシュ値を使ってコンテンツを取り出してみましょう。

```
$ git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad
hello world
```

ｷﾀｰーーー！！

ではこの結果をリダイレクトして、

```
git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad > hello.txt
```

はい、これで`git checkout` みたいなことができました！
（実際の`git checkout`はHEADの参照先を変更したりとかもうちょっといろいろやってる)
Google+ Emacsコミュニティに作ったElispを投稿してみた結果

(この記事には書き手の主観が多く含まれており、一部不適切な表現が存在する可能性があります。)

## Elispで自分の思うままに拡張できたらなぁ
いつの日か配布できるレベルのElispを作れたらいいなとEmacs Lispテクニックバイブルをちまちま読んでいました。
その本の後ろの方にはanything.el(helm.el)という拡張の応用方法が書いてあり、短いコードを書いただけで絞り込み検索の対象を自分でもいとも簡単に作れました。
**これを利用して何か作れそうという思い**にかられて指を動かし始め、気がついたら自分の中で抱いていた"できたらいいな"が実現していました。

## あぁ、これ我ながら便利だわ
とりあえず仕上がったhelm.elの拡張の挙動に自己満足。
ほかの人も気に入ってくれそうだし配布してもいいのかな？
みんなElispをGithub:octocat:に置いてドキュメントも英語で書いてるので、自分も真似してそうしてみました。

## 置いただけじゃ誰も見てくれない...
せっかく英語で書いたんだし海外の人も使ってくれるはず。
ちょうどそう考えているところに、とある記事を発見。

:link: [自分のプロダクトを海外でも認知してもらうには(Emacs編) Life is very short](http://d.hatena.ne.jp/syohex/20130926/1380209099)

何をすれば良いのかがわかったので実践あるのみです。

![emacs-advent-calendar-05-1.png](https://qiita-image-store.s3.amazonaws.com/0/8920/f86326b1-0140-5341-dab7-8d9be5b616f6.png)
[Google+のEmacsコミュニティ](https://plus.google.com/communities/114815898697665598016)

初めての投稿にビビりながら、2,3行の英文、Githubへのリンク、画像／アニメーションGif／Youtube動画を付けて掲載。カテゴリは「Announcements」。やはり**一目で何なのか分かるものを添えること**が大事かと思います。

## 思いがけない反応が得られた
ありがたいことに、見てくれた方が配布用Elispの特殊コメントの書き方を教えてくれたり、Emacs Wikiに載せてくれたり、パッケージ管理システムのMELPAに登録してくれました。
ほかにも「こういう機能も付けてくれ。」「似たElispもあるよ。」などなど。

### 実際の投稿
:link: [Google+ Emacs announcements helm-swoop](https://plus.google.com/107988747892328588078/posts/38NZQR9EBAa)
:link: [Google+ Emacs announcements helm-css-scss](https://plus.google.com/107988747892328588078/posts/94BcqB7Skqj)

## Google+への投稿に便利なツールを少し紹介
### [LICEcap 無料 Win/Mac対応](http://www.cockos.com/licecap/)
デスクトップをキャプチャして奇麗なアニメーションGIFを作ってくれます。
### [KeyCastr 無料 Mac対応](http://download.cnet.com/KeyCastr/3000-2075_4-125977.html)
キーボードで何をタイプしたのかが画面に表示されます。キャプチャアプリと組み合わせましょう。

## ほかの海外Emacsコミュニティ
![reddit.png](https://qiita-image-store.s3.amazonaws.com/0/8920/dec69afd-f908-5fed-b895-df209f374116.png)
[Reddit M-x emacs](http://www.reddit.com/r/emacs/)
紹介したいページのリンクとテキストを貼って投稿するだけです。
そこにコメントが付くことがあるので、Google+より本音が得られやすいのではないかと思います。

## まとめると
:white_check_mark: 便利なElispが出来たので、Githubに簡潔な英語ドキュメントとセットで置き、Google+ Emacsコミュニティに投稿すると日本では考えられないくらい多くの良いフィードバックが得られた。
:white_check_mark: Emacs Lispテクニックバイブルの電子書籍版(PDF)を出してほしい。

## おわりに
海外の人とコミュニケーションを取ることが、とても新鮮でワクワクしました。これからはちょくちょくGoogle+ Emacsコミュニティを覗いてみようと思います。

.emacs Advent Calendar 6日目は[sanryuu](http://qiita.com/sanryuu)さんです。お楽しみに。
Elixir の doctest 書き方まとめ

# doctest とは
テストコードと結果をコメントに書いておくと自動的にテストしてくれるもの。Python の doctest から来てます。Elixir はこれを言語として組み込んでいます。

# 下準備
[サンプルコード](https://github.com/ma2gedev/doctestex/blob/master/lib/doctest/hello.ex)を用意してみました。
doctest の対象としたいモジュールを、`doctest` マクロを使ってテストコード側で指定します。以下の`doctest Doctest.Hello`部分。

>
ちなみに `doctest` マクロは `ExUnit.DocTest` に定義されていて、`use ExUnit.Case` することで `__using__` コールバック経由で import されるようです。`__using__` は Ruby でいうところの、`included` っぽい動作をしています。

```ex
defmodule DoctestTest do
  use ExUnit.Case

  doctest Doctest.Hello
end
```

この指定をすることで`mix test`したときにテストと合わせて、doctest も行われるようになります。失敗したときの実行結果はこんな感じになります。

```bash
$ mix test
Compiled lib/doctest/hello.ex
Generated doctest.app
......

  1) test doc at Doctest.Hello.world/0 (7) (DoctestTest)
     ** (ExUnit.ExpectationError)
       expected doctest: Doctest.Hello.world
         to evaluate to: "hello world"
            instead got: "goodbye world"
     stacktrace:
       lib/doctest/hello.ex:9: Doctest.Hello (module)

.

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)
8 tests, 1 failures
```

# 書き方
メソッドのドキュメント部分に iex 実行画面のフォーマットのままテストコード、結果を書きます。
面白いことに iex での実行結果をそのまま貼付けると動きます。試しにiexで実行、結果をそのままドキュメントとして貼付け、でテストコード&ドキュメントがかけるのは嬉しい！

```ex
  @doc """
  # iex コンソール出力結果をそのまま貼付け

  iex(1)> Doctest.Hello.iex_console_result
  "iex console result"

  """
  def iex_console_result do
    "iex console result"
  end
```

以下に書き方のパターンを載せます。

## 基本
```ex
  @doc """ 
  # 基本

  iex> Doctest.Hello.world
  "hello world"

  """ 
  def world do
    "hello world"
  end 
```

## 複数のテスト結果を一度に得る場合

```ex
  @doc """ 
  # 複数のテスト結果を一度に得る場合

  iex> Doctest.Hello.multiple(1)
  2
  iex> Doctest.Hello.multiple(3)
  6

  """ 
  def multiple(num) do
    num * 2 
  end 
```

## 複数のテスト結果を別々に受け取る場合

```ex
  @doc """
  # 複数のテスト結果を別々に受け取りたい場合

  iex> Doctest.Hello.add(1, 2)
  3

  iex> Doctest.Hello.add(3, 4)
  7

  """
  def add(x, y) do
    x + y
  end
```

## 複数行に渡るテストコードの場合

```ex
  @doc """
  # 複数行のテストコード

  iex> Doctest
  ...> .Hello
  ...> .multiple_line
  "multiple line"

  """
  def multiple_line do
    "multiple line"
  end
```

## 例外のテスト

```ex
  @doc """
  # Exception をテストする

  iex(1)> Doctest.Hello.raise_message
  ** (RuntimeError) raise!!

  """
  def raise_message do
    raise "raise!!"
  end
```

# ドキュメント
doctest については以下にあります(今回の記事はこれのまとめです)。これ以外は見つけられませんでした。
http://elixir-lang.org/docs/stable/ExUnit.DocTest.html

# 何故 doctest ?
実は一瞬だけ Python の doctest をチラ見したことがあって、そのときはコードと一緒にドキュメント兼テストコード書いておけるの便利ーと少し感動して、感動したまま終わってしまいました。で advent calendar で Elixir のことを調べることになって、再び会うこととなり良い機会だったのでまとめてみました。

このエントリは Elixir Advent Calendar 2013 の5日目でした。明日は @tsuka さんです！
Javascriptメモ：配列、またはオブジェクト同士の比較

#### 不思議なことに、以下の比較ではいずれも結果がfalseとなる ####

```js
// Array
var ar = [1,2,3];
var ray = [1,2,3];

console.log(ar==ray);
```

```js
// Object
var obj = {k:1,e:2,y:3};
var ect = {k:1,e:2,y:3};

console.log(obj==ect);
```

う〜ん・・・・いったい何が違うのだろう？
APSchedulerで少し進んだジョブスケジューリング

APSchedulerで少し進んだジョブスケジューリング
=====================================

## 理由と目的と動機

* cronで10分に一回くらいのジョブを回すのが限界に来てしまった。
* __前の処理が10分以上掛かると多重起動になってしまうから。__これを防止したい。
* 何らかの __ロック機構__ を使えば・・・と思ったのだが、それをジョブのコード中に入れるのは避けたい。
  * そのジョブが対象となるロック機構依存になってめんどくさい。
  * __テストが大変でバグの元。__
* 起動しているのはpythonのジョブなので、できればpythonで書かれているものはないのか・・・

## 多重起動を防止できるジョブスケジューラ探し

* APShcedulerがあった！
* pythonで実装されてる。
* 多重起動を防止できる。
  * 多重起動の許可と幾つまでOKかも指定できる。
* cronライクなジョブスケジューリング可能。
* atコマンドの様に指定の時間に一回の起動も可能。
* cronより細かい、秒単位のジョブスケジューリングもできる。
* 本家のドキュメントはこちら
  * http://pythonhosted.org/APScheduler/index.html

## インストール

pipかeasy_installで。

```bash
$ easy_install apscheduler
または
$ pip install apscheduler
```

## ジョブスケジューラを書いてみる

* インターバルの秒数を指定して起動するタイプのスケジューラを実装してみる。

```py
import apscheduler.scheduler as ApSched

def job_function():
    print "Hello World"

sched = ApSched.Scheduler(standalone=True,coalesce=True)
sched.add_interval_job(job_function, seconds=10)
sched.start()
```

standaloneオプションはデフォルトFalse。Trueにするとスケジューラ自身がdaemonicに動く。

試しにipythonで実行してみた結果。

```
In [18]: 2013-11-26 16:12:32.680493
Hello World
In [18]: 2013-11-26 16:12:42.680962
Hello World
In [18]: 2013-11-26 16:12:52.680975
Hello World
```

尚、ちゃんとプログラムの実行時間を抜いてインターバル時間を計算してくれている。

## 多重起動防止の実験

```py
from apscheduler.scheduler import Scheduler
import datetime
import time

def job_function_13sec():
    print datetime.datetime.today()
    time.sleep(13)
    print "Hello World"

sched = Scheduler(standalone=True,coalesce=True)
sched.add_interval_job(job_function_13sec, seconds=10)
sched.start()
```

結果。

```
In [46]: sched.start()
2013-11-26 16:36:10.818178
WARNING:apscheduler.scheduler:Execution of job "job_function_13sec (trigger: interval[0:00:10], next run at: 2013-11-26 16:36:30.817553)" skipped: maximum number of running instances reached (1)
Hello World
2013-11-26 16:36:30.818776
WARNING:apscheduler.scheduler:Execution of job "job_function_13sec (trigger: interval[0:00:10], next run at: 2013-11-26 16:36:40.817553)" skipped: maximum number of running instances reached (1)
Hello World
2013-11-26 16:36:50.818992
WARNING:apscheduler.scheduler:Execution of job "job_function_13sec (trigger: interval[0:00:10], next run at: 2013-11-26 16:37:10.817553)" skipped: maximum number of running instances reached (1)
Hello World
2013-11-26 16:37:10.818815
WARNING:apscheduler.scheduler:Execution of job "job_function_13sec (trigger: interval[0:00:10], next run at: 2013-11-26 16:37:30.817553)" skipped: maximum number of running instances reached (1)
Hello World
2013-11-26 16:37:30.818828
```

ジョブのオプションとして __デフォルトでmax_runが1__ なので、多重起動を防止してくれている。

## その後

* cronの様に常時動かすためにsupervisordでデーモン化しました。
  * http://qiita.com/yushin/items/15f4f90c5663710dbd56
* プロセスが死んでも自動再起動でご安心。
* しかしクラッシュしたらメールを飛ばすようにしたい・・・。うーあー。イベントリスナーとかの機能で行けそう。
IntelliJ IDEA 13 で SBT がサポートされたので試してみた。

# IntelliJ IDEA の SBT 正式サポート
IntelliJ IDEA 13 がリリースされ、 Scala のビルドツールである SBT に正式対応となった。

以前は sbt-idea plugin を使うことで、 SBT を用いてインストールしたライブラリ用の External Libraries 設定の書かれた xml ファイルを生成し、 IntelliJ 上でそれらのライブラリを扱うことができていた。
https://gist.github.com/kmizu/1876800

しかし、今回のアップグレードによって、 ```build.sbt``` に変更を加えるだけでそれらの xml が生成され、 IntelliJ 上でライブラリが読み込まれた状態となる。

私のようなバカでも SBT をすぐに導入することができる。 JetBrains ありがとう。

# 事前準備
- IntelliJ IDEA 13 のインストール
- scala, sbt プラグインのインストール

# プロジェクト作成
```Create New Project``` を選択
![スクリーンショット 2013-12-04 22.16.21.png](https://qiita-image-store.s3.amazonaws.com/0/14657/48efe627-87ea-80d7-3dd4-be6433f9cc7d.png)
```Other``` の項目に ```SBT``` の項目が追加されているので、感謝しながら選択
![スクリーンショット 2013-12-04 22.17.19.png](https://qiita-image-store.s3.amazonaws.com/0/14657/559d11af-903c-1338-f212-4fccc83b9cc1.png)

# プロジェクトの内容を確認
プロジェクトのディレクトリー構成ツリーはこんな感じ。
![スクリーンショット 2013-12-04 22.20.08.png](https://qiita-image-store.s3.amazonaws.com/0/14657/e8a08eea-02be-ed8f-fe4b-34870f528795.png)
```build.sbt``` にはこんな内容が書かれてる。

```scala:build.sbt
name := "sbt-test"

version := "1.0"
```

# 適当な Logger をインストールしてみる
Scala の Logger を試しに入れてみる。
今回は ```scalalogging``` をチョイス

```scala:build.sbt
name := "sbt-test"

version := "1.0"

libraryDependencies ++= Seq(
  "com.typesafe" %% "scalalogging-slf4j" % "1.0.1",
  "org.slf4j" % "slf4j-api" % "1.7.1",
  "ch.qos.logback" % "logback-classic" % "1.0.7"
)
```
この段階ではライブラリはインストールされなかった。

# SBT task を実行
Tool Window パネルがデフォルトでは閉じているので、左下のボタンをクリックして表示する。
![スクリーンショット 2013-12-04 23.23.36.png](https://qiita-image-store.s3.amazonaws.com/0/14657/02a234ff-069c-973a-cbf4-1f56a69790d5.png)
左右側と下側にタブが表示されるので、右下の ```SBT``` をクリックする。
![スクリーンショット 2013-12-04 23.28.38.png](https://qiita-image-store.s3.amazonaws.com/0/14657/a17ff7af-4d13-ea5e-f045-6b13ecc72e4b.png)
目的の SBT プロジェクトを右クリックし、 ```Refresh external project``` を実行する。
![スクリーンショット 2013-12-04 23.34.57.png](https://qiita-image-store.s3.amazonaws.com/0/14657/bf56a803-4f49-af1b-0bda-b1ebf2493d5d.png)
めでたく External Libraries に読み込まれたことを確認！
![スクリーンショット 2013-12-04 23.37.33.png](https://qiita-image-store.s3.amazonaws.com/0/14657/443fafd0-a02a-02eb-d02c-f5a76c1400a4.png)

# 自動で変更が反映されるように変更
毎回 Refresh するのが面倒な場合は、 ```Use auto-import``` オプションをオンにしなくてはならない。
一旦 ```SBT tasks``` から削除し、 ```File``` → ````Import Project...``` で ```.sbt``` ファイルを選択することで可能だった。
![スクリーンショット 2013-12-04 23.43.20.png](https://qiita-image-store.s3.amazonaws.com/0/14657/2019e927-047b-b186-cc09-2acf895778ce.png)

# さて Scala しよう
Scala 言語仕様デカすぎ。
HomebrewでWineをInstallした時の覚書

*Homebrew*で *Wine*をインストールした時に、メニュー等が英語になってしまったのでその時の注意点

# gettextをインストール
まずは以下のように、*gettext*をインストールする。先に *gettext* をインストールしておかないとメニューなどが英語になってしまうので注意。

```
brew install gettext
```

ただ、これだけだと *link* がはられないので次のように *link* をはる。

```
brew link '--force gettext'
```

# Wineのインストール

あとは普通に *Wine*をインストールする。

```
brew install wine
```

今回はこれで、 *Wine1.6.1* がはいった。
今週のアルゴリズム：フィボナッチ数列

CodeIQ Advent Calendar http://www.adventar.org/calendars/82

Enumeratorの使い方の好例だと思います.

```rb
#!/usr/bin/ruby
puts Enumerator.new{|y|
	a=b=1
	loop{
		a,b=a+b,a
		y<<a if a%a.to_s.chars.map(&:to_i).reduce(:+)==0
	}
}.take(11)*',' # 2,3,5,8,21,144,2584,14930352,86267571272,498454011879264,160500643816367088
```

…後ほど解説記事出ますよね？
LaunchRockの自動返信メールが日本語に対応していない。

ここ最近、触っていたティザーサイトを簡単に作成できる<a href="http://launchrock.co/" title="LaunchRock - Set up a "Launching Soon" page in minutes">LaunchRock</a>というサービス。

無料でカスタマイズ性にも優れているので、良いサービスだったのですが、
主要な機能の一つである、ユーザーに登録してもらった後の、
自動返信メールが日本語に対応していなく、
文字化けしまくりという致命的なマイナス面を抱えておりました、

色々調べてみましたが、解決策は今のところ見つからず。

海外向けのサービスならLAunchRockでも良いですが、
国内向けのサービスなら、<a href="https://comingsooners.com/" title="ComingSooners">ComingSooners</a>が良いと思います。
LaunchRockに比べ拡張性は落ちますが、サクッとティザーサイトを作れます。

というわけでLaunchRockを使用する際は、
自動返信メールが日本語に対応していないという事に、
ご注意下さい。
ある程度Gitを操作できるようになってから当たると良いマニュアル/情報源

Gitにある程度慣れ，基本的な操作ができるようになるとより深く知りたくなってくると思いますが，そのときにググって分散した情報を読むのではなく，まとまったドキュメントを活用すると効率が良いです．
まずは中級者向け`git help`について．

# `git help help`

まずは`git help help`をして，よく使う`git help`についてより良く知っておきましょう．`git help`の中でおすすめオプションは以下の2つ．

## `-w`
HTMLでのmanをブラウザで開く．長いmanを読むときなどは読みやすくて地味に便利

## `-g`
ガイド一覧．特定のgitコマンドに縛られないような内容を見ることができます．

## gitガイド

```
$ git help -g
The common Git guides are:

   attributes   Defining attributes per path
   glossary     A Git glossary
   ignore       Specifies intentionally untracked files to ignore
   modules      Defining submodule properties
   revisions    Specifying revisions and ranges for Git
   tutorial     A tutorial introduction to Git (for version 1.5.1 or newer)
   workflows    An overview of recommended workflows with Git

'git help -a' and 'git help -g' lists available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
```

この中でも特に **glossary**(用語集)や **revisions**(リビジョン(範囲)の指定方法一覧)は一度見ておくと，helpで利用される基本用語の意味や曖昧になりがちなrevision指定について整理できるのでおすすめです．例えば`HEAD~`と`HEAD^`や`master..branch`と`master...branch`の違いなど
[リリースされたばかりのv1.8.5](https://raw.github.com/git/git/master/Documentation/RelNotes/1.8.5.txt)で入った`@`の意味も`git help revisions`に書かれています(`HEAD`と同じ)．

(余談: `..`と`...`の使い分けの1つは[現在のブランチで加えた変更を見る - Qiita](http://qiita.com/yaotti/items/ab52a7e834422a6f9662)を参考に)
(余談その2: [v1.8.5で入った`git cherry-pick -`のコミット](http://article.gmane.org/gmane.comp.version-control.git/233960/) ;))

# Pro Git
Scott先生の書いた本．仕組みから各コマンドの使い方まで体系立ってまとめられているので一読をすすめます．
特にchapter 9はGitの内部構造についてまとまって書かれた貴重な日本語情報源です．
[Pro Git日本語版](http://git-scm.com/book/ja)

# [Git ML](http://git-scm.com/community)
Gitの動きを知りたい場合．
全部読むのはかなり気合入れないとつらい(たぶん無理…)．
全体の動きを知りたいなら[Hamanoさん](https://github.com/gitster)が週1ぐらいで書いている"What's cooking in git.git"を読むと近いうちにこんなものが入るんだなーというのがわかる．[archive](http://search.gmane.org/?query=What%27s+cooking+in+git.git&author=&group=gmane.comp.version-control.git&sort=date&DEFAULTOP=and&xP=what%27s%09Zcook%09git&xFILTERS=Gcomp.version-control.git-Ac-Ahamano-Ajunio---A)


以上，基本操作が出来るようになってからの理解を深めるのに役立つ情報源でした．
wgetを使ってリストにあるファイルをまとめて取得する。

以下のようなファイルをあらかじめ用意する。

```text
url1
url2
url3
```

このファイルをrequirements.txtとする。
このファイルを置いたフォルダで、以下のコマンドを実行するとurl1、url2、url3を順番にダウンロードする。

```shell-session
wget -i requirements.txt
```

wgetは標準入力から取得先のURLを取得することもできるので、以下のようなことも可能。

```shell-session
cat requirements.txt | wget -i -
```

これをうまく使うと環境構築がだいぶ楽になる。
同じ型を持つオブジェクトの実装を変えられるようにしたい

自律機能を備えたAutonomie
Characterを生成するときにどうやって動くか(`runAuto` の実装)を選ぶことができる

キャラクタによってmoveの実装をわけたいときなどに便利(おそらくもう少し一般化可能)

```hs
{-# LANGUAGE TemplateHaskell, TypeSynonymInstances, FlexibleInstances #-}
import Control.Monad.State
import Control.Lens
import Data.Functor.Identity

data Autonomie m a = Autonomie { auto :: a, runAuto :: m () }

class Game c where
  update :: State c ()
  draw :: StateT c IO ()

data Object = Object { _pos :: (Int, Int) }
makeClassy ''Object

type Character = Autonomie (State Object) Object
instance HasObject Character where
  object = lens auto (\f a -> Autonomie a (runAuto f))

instance Game Character where
  update = do
    f <- get
    object %= execState (runAuto f)
  draw = do
    f <- get
    lift $ print $ f^.pos

walk :: State Object ()
walk = pos %= (\(x,y) -> (x+2, y))

dash :: State Object ()
dash = pos %= (\(x,y) -> (x+10, y))

main = do
  let chara1 = Autonomie (Object (100, 100)) walk
  draw `execStateT` (update `execState` chara1)
  
  let chara2 = Autonomie (Object (100, 100)) dash
  draw `execStateT` (update `execState` chara2)
```
Project Euler No. 1


# Problem

> If we list all the natural numbers below $10$ that are multiples of $3$ or $5$, we get $3, 5, 6$ and $9$. The sum of these multiples is $23$.
> 
> Find the sum of all the multiples of $3$ or $5$ below $1000$.


# Haskell Code

```haskell:Euler_001.hs
module Main where

main = print $ answer
  where 
    answer = sum $
    [n|n<-[1..999], (mod n 3 == 0) || (mod n 5 == 0)]
```

# Answer

2****8
VCLファイルの構文ミスしている箇所を特定する方法

VCL(Varnish configuation Language)とはその名の通り、Varnishの設定を記述するための言語です。

```zsh
/etc/init.d/varnish start
```

上記コマンドでVarnishのプロセスを生成する際にVCLの構文を確認するのですが、構文を誤っていたとしてもその箇所を教えてくれません。

その場合下のコマンドを実行すると、"それっぽい箇所"を教えてくれます。

```zsh
varnishd -C -f default.vcl
```

`defautl.vcl` は適宜変更してください :smile:  :smile:
HaxeでのLambdaとかusingについて

はい、どーも、Haxeの記事を書かせていただきます。

前回は、functionについて書いたので、今度はHaxeのLambdaクラスについて書きまう。

# Lambda解説

HaxeのAPIには、Lambdaというクラスがあります。

http://api.haxe.org/Lambda.html

これは、何か?というと、Lambdaの名前が付いているようにHaxeで関数型プログラミングを支援するクラスです。

正確に言えば，HaxeのIterable<A>のクラスと関数型のためのクラスなのです。

## 全部 public static function! 

まぁ、全部が全部public static functionです。コンストラクタもありません。なので、new してインスタンス化することはありません。(というか、コンストラクタがないので、できないってことですが。)

実はこれは、Haxeのusingの機能のためです。これは後述します。

## mapとか,filter, foldとか、つかってみる。

とりあえず、つかってみる

## map

はい、良くあるやつです。Haxeでは、「iteratorと関数」をとり、「iteratorを返す」関数で、各要素に関数値を適用します。

```hx:Sample.hx
class Sample{
	public static function main(){
		var array  = [1,2,3];
		var array1 = Lambda.map(array, function(x){ return x + 1; });
		trace(array1); // => {2,3,4}
	}
}
```

## filter

はい、またまた良くあるやつです。「iteratorと述語関数」をとり、「iteratorを返す」関数で、述語が真になる要素のみ返します。

```hx:Sample.hx
class Sample{
	public static function main(){
		var array  = [1,2,3,4,5,6,7,8,9,10];
		var array1 = Lambda.filter(array, function(x){ return x % 2 == 0; });
		trace(array1); // => {2,4,6,8,10}
	}
}
```

## fold 

はい、またまたまた良くあるやつです。「iteratorと2引数関数と初期値」を引数にとり、最初に初期値と、iteratorの最初の要素を関数に適用し、そのあとは、前の結果と次の要素適用する関数です。

```hx:Sample.hx
class Sample{
	public static function main(){
		var array  = [1,2,3,4,5,6,7,8,9,10];
		var result = Lambda.fold(array, function(x,y){ return x + y; }, 0);
		trace(result); // => 55
	}
}
```

まぁお馴染すぎて、飽きました。

# usingで便利に!

## Lambda.~と毎回書くのは面倒臭い!!!!

はいはい、Lambda.map とは、Lambda.filterとか、Lambda.foldとか書くのだるいですよね。
3回Lambdaを使うだけで大変なことになります。

以下、1~10までの偶数を2倍して合計を求めるプログラムです。

```hx:Sample.hx
class Sample{
	public static function main(){
		var result = Lambda.fold(
						Lambda.map(
							Lambda.filter(
								[0,1,2,3,4,5,6,7,8,9,10],
								function(x){ return x % 2 == 0; }),
							function(x){ return x * 2; }),
						function(x,y){ return x + y; },
						0);
		trace(result);
	}
}
```

と…とでもグロテスクです!!!

**そのためにusingというHaxeの機能があります**

##  そのためにusingで便利に!!

Haxeにはusingという機能があります。

### usingでmapを使う。

```hx:Sample.hx
using Lambda;
class Sample{
	public static function main(){
		var array = [1,2,3];
		var array1 = array.map(function(x){ return x + 1; });
		trace(array1);
	}
}
```

あれれ~? iterableクラスにmapメソッドが!!?

### filterをusing
```hx:Sample.hx
using Lambda;
class Sample{
	public static function main(){
		var array = [1,2,3,4,5,6,7,8,9,10];
		var array1 = array.filter(function(x){ return x % 2 == 0; });
		trace(array1); // => [2,4,6,8,10]
	}
}
```

まるで、filterも同様です。

### foldも ….

```hx:Sample.hx
using Lambda;
class Sample{
	public static function main(){
		var array = [1,2,3,4,5,6,7,8,9,10];
		var array1 = array.fold(function(x,y){ return x + y; }, 0);
		trace(array1); // => 55
	}
}
```

### さっきのグロテスクなやつも….

```hx:Sample.hx
using Lambda;
class Sample{
	public static function main(){
		var result = [1,2,3,4,5,6,7,8,9,10]
			.filter(function(x){ return x % 2 == 0; })
			.map(function(x){ return x * 2; })
			.fold(function(x,y){ return x + y; }, 0);
		trace(result);
	}
}
```

読みやすくなりましたね?

## どうして?

Haxeのusingおかげです!
Lambdaが、public staticメソッドだらけなのは、usingの為にあるのです。
そのことについてusingについて詳しくは次の記事にでも。

## まとめ

Lambdaはusingを使うと便利!

あしたは、誰も書かなかったら僕がかきまう。
6日目は@hatchineeさんですよろしくおねがいします。
ゲーム制作計画10日目！

今日は技術的な部分を少し進めようと思います。
Cocos2d-html5とenchant.jsのどちらを使用するか迷ったのですが、
解説サイトが充実しているということでenchant.jsを利用することにしました。
Cocos2d-html5も使ってみたかったのですが、
JavaScriptが使えない、サンプルなぜか動かない、入門サイト（日本語）があまりない
ということでさすがに大変かなと思い、
ゲーム本体に割く時間を確保するためにも、enchant.jsを使用しようと思います。
今のところ、どのように適応させるのかも分かっていないので十分辛いと思われますが…

とりあえずこちらのサイトを参考に読んでみたいと思います。
enchant.jsでゲームを作る7つの利点と5つの注意点（http://www.atmarkit.co.jp/ait/articles/1212/03/news018.html）
enchant.jsでスマホ向けゲームを作り始めるための基礎知識（http://www.atmarkit.co.jp/ait/articles/1302/06/news029.html）
enchant.jsで重要なスプライトとシーンを使うには（http://www.atmarkit.co.jp/ait/articles/1304/01/news034.html）

本日は、画像を表示するところまでやりました。
とりあえず、enchant.jsの認識のさせ方がわかったので良かったと思います。
index.htmlの方で場所を指定してあげるんですね。
先ほどのウェブページを一通り試してみたところで開発に入ろうと思います。
以上です。
ansible-playbook ワンライナー


ansibleってchefより手軽に使えていいよねーという声が多いのですが、
手軽でいいけど、何かファイルをいくつか用意するのが面倒ですよね。

ワンライナーでやれる手がないかなという事で思い出したのがこれ

##*bashのプロセス置換機能* 

```sh:リモートのファイルをdiffるワンライナー
$ diff -u <(ssh host1 cat /etc/hosts) <(ssh host2 cat /etc/hsots)
```
これはリモートホストにあるファイルをdiffするときによく使うやつです。

これを使おう!

## ansible ワンライナー

Ansible Best Practices に沿った
playbookのディレクトリ階層のスケルトンを生成するplaybookを、
githubにplaybookをおいて、
https://github.com/masahide/playbook-sample

```sh:ワンライナーで実行
$ ansible-playbook -i <(curl -s https://raw.github.com/masahide/playbook-sample/master/localhost) <(curl -s https://raw.github.com/masahide/playbook-sample/master/sample.yml) -e dir=`pwd`
````
こうするとローカルにinventoryファイルやplaybookファイルを置かなくても直接実行できます。


```sh:実行結果
$ ansible-playbook -i <(curl -s https://raw.github.com/masahide/playbook-sample/master/localhost) <(curl -s https://raw.github.com/masahide/playbook-sample/master/sample.yml) -e dir=`pwd`

PLAY [localhost] **************************************************************

TASK: [create directories for ansible files.] *********************************
changed: [localhost] => (item=/home/masahide/work/playbook/group_vars)
changed: [localhost] => (item=/home/masahide/work/playbook/host_vars)
changed: [localhost] => (item=/home/masahide/work/playbook/roles/common/tasks)
changed: [localhost] => (item=/home/masahide/work/playbook/roles/common/defaults)
changed: [localhost] => (item=/home/masahide/work/playbook/roles/common/handlers)
changed: [localhost] => (item=/home/masahide/work/playbook/roles/common/templates)
changed: [localhost] => (item=/home/masahide/work/playbook/roles/common/files)
changed: [localhost] => (item=/home/masahide/work/playbook/roles/common/vars)

PLAY RECAP ********************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0
```

##ansibleワンライナーは諸刃の剣


たとえば、rm -rf / 等が入れられたplay-bookに差し替えられてたとか
非常にヤバイので取り扱いには注意が必要です。

## ansibleワンライナーが使えるのはver1.4以降

このansible-playbookのbashプロセス置換対応は
ver1.4以降でないとエラーが発生します。

かなり前にpullreqを出してたのが、最近やっとマージされて使えるようになりました。
https://github.com/ansible/ansible/pull/3937
二値画像の回転(2012.7.23の過去問)

1日1個 @nabetani さんの作った問題を解く、どう書くAdventCalendarの4日目です。

今日の問題は http://qiita.com/Nabetani/items/9d80de41903775296ca6 にあります。

```hs
{-# LANGUAGE Rank2Types #-}
module Doukaku.TwoTone  where
import Data.Bits.Lens (bitAt)
import Numeric.Lens (hex)
import Control.Lens (Lens', view, set, preview, review)

solve :: String -> String
solve input = (n' ++) . (':' :) . fill . pack . turnRight l n . unpack $ tile'
  where
    (n', _:tile') = break (== ':') input
    n = read n'
    l = length tile'
    fill x = replicate (l - length x) '0' ++ x

unpack :: String -> Integer
unpack = maybe 0 id . preview hex

pack :: Integer -> String
pack = review hex

point :: Int -> Int -> Int -> Int -> Lens' Integer Bool
point l n x y = bitAt index
  where
    bitLength = l * 4
    index = (bitLength - 1) - (y * n + x)

turnRight :: Int -> Int -> Integer -> Integer
turnRight l n tile = foldr set' 0 points
  where
    points = [(x, y) | x <- [0 .. n - 1], y <- [0 .. n - 1]]
    set' (x, y) = set (point' x y) (view (point' y (n - 1 - x)) tile)
    point' :: Int -> Int -> Lens' Integer Bool
    point' = point l n
```

どう書くの鬼門であるビット演算。`Lens`を使ってやってみようと思って始めたのですが、かなり苦労しました。整数に起こして、各ビットへのレンズ`point l n x y`を定義して後はセット、ゲットしているだけです。

一辺の長さとビット列を一組にして、そいつのレンズを`_1`とかと組み合わせようと思ったもののうまく行かず泥臭い感じになっています。さらに`Prism`と`Lens`を効果的に組み合わせる方法がわからず、`pack`、`unpack`と`turnRight`が完全に独立してしまっています。また、この問題のいやらしいところは64ビット整数だと収まらないようにできていることで、`Integer`型を使う羽目になりました。

問題ページに他の方の回答もありますので、見ると参考になるでしょう。
Cross Platform MIDI Tools Advent Calendar #4: GUIツールキット・開発環境の選択について

MIDIライブラリについては、とりあえずMIDIプレイヤーを作るための下地部分としては概ね書き終えたので、次はUIについて書くことにする。

MoonlightでMLDSPを作成し始めた当時、MLDSPはそもそも完成したMIDIプレイヤーとして作成する意図は無かった(!)。もともとは同時期に作っていたprocessing (proce55ing) の.NET版実装のグラフィックス描画スクリプトのサンプルとして作成していたものだった。実際に作り上げられたアプリケーションも、同processingエンジンに依存していた部分があって、必ずしも（いや、全くもって）Silverlightらしいアプリケーション設計にはなっていなかった（もっとも、GUIアプリケーション フレームワークがこのMIDIプレイヤーに適合する部分は多くない）。当時はSilverlight 2.0の時代で、WriteableBitmapも存在しなかったため、全てのオブジェクトはSystem.Windows.Shapesのクラスなどを使用していた(!)ため、大変重いものだった。

今回、改めてXMDSPとしてデスクトップ版を実装するにあたっては、特にC#/.NETに限定しなくても良いと考えた（ただしC#の既存ライブラリを使い回したかったので、C#で無理そうな場合のみ他をあたるつもりだった）。ほしいのは基本的な2Dグラフィックス描画の能力で、OpenGL/OpenTKのようなナマの3Dは（よく分からないので）避けたかった。そしてクロスプラットフォーム（実際にはLinux/WindowsあとついでにMac）で動くことを要件とした。さらに開発環境がLinuxにも対応していることが必要だった。Unityは無償版があるものの開発環境がLinuxデスクトップで動作しないのでNG、Cocos2D/XNAやMonoGameもMonoDevelopテンプレートがLinux上で（おそらく）意図通りに動作しなかったのでNG…と、かなり厳しい線引きになった。

以上を通過したものとして、Agg#は割と好印象だったのだけど、基盤がどうしてもWindows.Formsになってしまうのと、ファイルダイアログすら独自に実装させられているのを見て、これは厳しい選択であるように思われた（実際にはWindows.Formsに載っているのだから、Windows.Formsのダイアログを使えば機能するのだけど、それが良いかどうかは疑問だ）。Gtk#のgdk/cairoも選択肢として考え出したところで、Xwtが使えるのではないかと考えた。Gtk#はAPIがあまりC#erには直感的ではないので（gtk#はプラットフォームネイティブのAPIだし基本的に自動生成する以上は仕方がない）、Xwtで実現可能ならXwtにする、というのは合理的な判断だったと思う。

Xwtについて、少し書いておくと、これは各プラットフォームにおける、ネイティブのUIフレームワークを直接使用する、最大公約数アプローチのクロスプラットフォームGUIフレームワークだ。WxWidgetなどが設計思想としては近いだろうか。WindowsならWPF、OSXならMonoMac、LinuxならGtk#を使用している。基本的には、ウィジェットのAPIを共通化しているが、グラフィックスまわりも共通のAPIが利用できる（これは多少ネイティブから離れたAPI構成になってはいると思うが、使いやすくはある）。Gtk#ではCairoをグラフィックスのContextとして使用している。

Xwtのコードに含まれているサンプルで、Xwt.DrawingというAPIで、2Dグラフィックスの基本機能があることは確認できたので（筆者はLinux上のGtkで確認した）、まずはキーオン・キーオフを表示する16段キーボードから実装することにした。それぞれのチャネルについて、キーボードに対応するCanvasを作成して、OnDraw()というメソッドの中で、渡されたグラフィックスのContextオブジェクト（XwtのGtk実装）に定義されたSetColor()やらLineTo()やらStroke()やらといったメソッドを呼び出して2Dグラフィックスを描画するだけだ。

さて、実際にそのやり方でキーボードを描画して動かしてみたものの、非常に重くて実用に耐えなかった。この続きは明日。
sympyで運動方程式

##sympyで運動方程式
pythonの数式処理ライブラリのsympyで物理で出てくる運動方程式を扱えるようなので、試してみたいと思います。
今回は参考サイトのpydy_exampleの中にもあるマス・バネ・ダンパ系の運動方程式を導出するスクリプトを書いてみます。
まず、図に示すようなマス・バネ・ダンパ系があるとします。普通に運動方程式を立てると以下のようになります。
![mass_spring_damper.png](https://qiita-image-store.s3.amazonaws.com/0/14516/b9ba5fe5-65b8-a3d0-a6c0-6deadfc6e89e.png)
**運動方程式**

```math
{\bf M}\dot{{\bf x}} = {\bf f}({\bf x})
```

ここで

```math
{\bf x} = [{\it x}, \dot{{\it x}}]^T \\
{\bf M} = \begin{bmatrix} 1 & 0 \\ 0 & m \end{bmatrix} \\
{\bf f}({\bf x}) = \begin{bmatrix} \dot{x} \\ -k x - c \dot{x} + m g + f \end{bmatrix}
```

であるとします。
次にスクリプトです。sympy.physics.mechanicsというモジュールを使います。Kane's methodというのを使って運動方程式を立てているのですが、これがイマイチよく分かりません。ラグランジュ法で解く方法もあるようです。

```py:mass_spring_dumper.py
#!/usr/bin/python
#coding:utf-8
import sympy as sym
import sympy.physics.mechanics as me

x, v = me.dynamicsymbols('x v')
m, c, k, g, t, f = sym.symbols('m c k g t f')

# 座標系の作成
ceiling = me.ReferenceFrame('C')

o = me.Point('o') # 天井の点
p = me.Point('p') # 質点
o.set_vel(ceiling, 0)
p.set_pos(o, x * ceiling.x)
p.set_vel(ceiling, v * ceiling.x)

# 質点にかかる外力を計算
damping = -c * p.vel(ceiling) # ダンピング
stiffness = -k * p.pos_from(o) # バネ
gravity = m * g * ceiling.x # 重力
exf = f * ceiling.x # その他の外力

forces = damping + stiffness + gravity + exf
print forces

mass = me.Particle('mass', p, m)
kane = me.KanesMethod(ceiling, q_ind=[x], u_ind=[v], kd_eqs=[v - x.diff(t)])
kane.kanes_equations([(p, forces)], [mass])
M = kane.mass_matrix_full
f = kane.forcing_full
print M
print f
print M.inv() * f
```

出力は以下のようになります。

```
(-c*v + f + g*m - k*x)*C.x
Matrix([[1, 0], [0, m]])
Matrix([[v(t)], [-c*v(t) + f + g*m - k*x(t)]])
Matrix([[v(t)], [(-c*v(t) + f + g*m - k*x(t))/m]])
```

使い方を勉強すればかなり強力なツールになりそうです。
力学系の式を立ててくれるソフトは有料ではmapleやmathematicaがありますが、いずれも高価なので、このようなソフトがフリーで使えるのはありがたいですね。

##参考サイト
sympyドキュメント http://docs.sympy.org/latest/index.html
pydy examples https://github.com/PythonDynamics/pydy_examples
systemdの*.serviceファイルの書き方

記事作成日がもう2013年とだいぶ昔なので最新の情報はマニュアルを参照してください👃

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

--------------------------------------
たまに書く必要があったりするのでめも。環境はArch Linux。

まず基本的なところで前に自分で書いた/etc/systemd/system/kdump.serviceを元に。

```text:kdump.service
[Unit]
Description=Load dump capture kernel
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/bin/run-kexec.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
```

ファイルの基本構成要素は _Unit_ 、 _Service_  、 _Install_ から成り立っていて _Unit_ と _Install_ はman 5 systemd.unit、 _Service_ はman 5 systemd.serviceに詳細な説明があります。
_Unit_ と _Install_ はユニットファイルの共通的な設定内容、 _Service_ はそのサービスを実行するためというような感じになってます。

# Unitセクション

## Description
ユニットの説明を書く。

## After/Before
After（Beforeも）は指定したユニットの実行順番の依存関係を設定する。例えばfoo.serviceで↓のように書いていたらfoo.serviceはbar.serviceのstart-up処理が終わるまで起動しない。

```
After=bar.service
```

## Requires/Wants
ユニットの依存関係の定義。RequiresとWantsの大きな違いとしてリストアップした依存関係のユニットが失敗したときの処理が違う。foo.serviceで↓のように書いた場合、bar.serviceの起動に失敗してもfoo.serviceのstartup処理そのものが失敗になる訳ではない（もちろんfoo.serviceを起動する上でbarが必要ならだめだけど）。

```
Wants=bar.service
```

## その他
man 5 systemd.unit

# Serviceセクション

## Type
Typeには以下の5があり、設定がなければsimpleがデフォルトで使われる。

- simple
- forking
- oneshot
- notify
- dbus

kdump.serviceの場合はoneshotを使っていて、これはコマンドとしてはすぐに終わるような場合に使う。

## ExecStart
実行するコマンドラインを書く

## RemainAfterExit
Typeがoneshotの場合はコマンドの実行終了後もステータスをアクティブにしておきたいのでRemainAfterExit=yesとしてsystemdにこのユニットはアクティブですよーと知らせる。

### kdumpの例
kdumpの例だとTypeはoneshot、RemainAfterExitにyesを設定し、こんなスクリプトを実行してます。

```bash
#!/bin/bash

kernname=`uname -r`
boot_dir=/boot
vmlinuz="$boot_dir/vmlinuz-$kernname"
initramfs="$boot_dir/initramfs-$kernname.img"
root_dev=`cat /proc/cmdline  | sed 's/ /\n/g' | grep ^root= | cut -f2- -d'='`

echo /usr/bin/kexec -p "$vmlinuz" --initrd="$initramfs" --append="root=$root_dev single irqpoll maxcpus=1 reset_devices"
/usr/bin/kexec -p "$vmlinuz" --initrd="$initramfs" --append="root=$root_dev single irqpoll maxcpus=1 reset_devices"
echo "kexec comman executed"

exit 0
```

### sshdの例
sshdの場合はプロセスの再起動、終了なんかの設定も入ってます。

```
[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
```

## その他
man 5 systemd.service

# Installセクション

## WantedBy/RequiredBy
systemctl enable XXXでユニットをenableしたときに.wants、.requiresにシンボリックリンクを作る。　動作としてはWants=、Requires=と同じような感じ。

実際にこんな感じになってます。

```
masami@saga:~$ ls -la /etc/systemd/system/multi-user.target.wants/
total 8
drwxr-xr-x 2 root root 4096 Dec  4 14:13 .
drwxr-xr-x 4 root root 4096 Dec  4 14:13 ..
lrwxrwxrwx 1 root root   38 Nov  1 01:53 dhcpcd.service -> /usr/lib/systemd/system/dhcpcd.service
lrwxrwxrwx 1 root root   33 Nov  5 12:14 kdump.service -> /etc/systemd/system/kdump.service
lrwxrwxrwx 1 root root   40 Nov  1 10:27 libvirtd.service -> /usr/lib/systemd/system/libvirtd.service
lrwxrwxrwx 1 root root   36 Dec  4 14:13 ntp-once.service -> /etc/systemd/system/ntp-once.service
lrwxrwxrwx 1 root root   40 Oct 21 22:27 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target
lrwxrwxrwx 1 root root   36 Nov  1 07:45 sshd.service -> /usr/lib/systemd/system/sshd.service
```

## その他
man 5 systemd.unit
Debianセットアップ

何故か開発環境が突如消滅して作り直したので。個人的なメモです。

入れるもの:

* ssh
* sudo
* samba
* git
* apache
* python
* rvm/ruby
* nvm/npm/nodejs
* grunt

実機(VM)のコンソールで。

```bash
# 環境更新
aptitude update
aptitude upgrade -y

# SSH
aptitude install ssh -y
```

これで実機での作業を終えて手元の端末からSSHログイン。rootで作業する。

```bash
# その他のアプリをインストール
aptitude install sudo samba git curl apache2 python build-essential -y

# 例えば__my_user__をsudoで何でも出来るように
gpasswd -a __my_user__ sudo
```

以下各自のユーザーで作業。

```bash
# Node.js
wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh
source ~/.nvm/nvm.sh
# nvm ls-remote
nvm install v0.10.21
echo nvm use v0.10.21 >> .profile

# Ruby
curl -L https://get.rvm.io | bash -s stable
# rvm ls -r
rvm install ruby-2.0.0-p247
echo source $HOME/.rvm/scripts/rvm >> ~/.profile
echo rvm use ruby-2.0.0-p247 >> ~/.profile
source ~/.profile

# 諸々
npm install grunt-cli -g
gem install compass

# SSHキー作成
ssh-keygen -t rsa
# 続いて
## cat ~/.ssh/id_rsa.pub
# でキーを表示してコピペして、gitのサーバーの方のやつに登録

# Samba
sudo pdbedit -a `whoami`
# sudo vi /etc/samba/smb.conf
# echo [`whoami`] >> /etc/samba/smb.conf
# echo writable = yes >> /etc/samba/smb.conf
# echo path = /home/`whoami` >> /etc/samba/smb.conf

# 各プロジェクト
npm install
```

正直あんまりよくわかっていないところある。
bashでsumする


# 動機

<blockquote class="twitter-tweet" lang="ja"><p>bashでcsvのセルの合計数求めようとしてたけどエクセルのsum関数便利だったときの敗北感</p>&mdash; そらむぎ (@soramugi) <a href="https://twitter.com/soramugi/statuses/407826595697524736">2013, 12月 3</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

bashで頑張ってたけどエクセル立ち上げちゃった話。

# だけどがんばる

```bash
function sum_num {
if [ -p /dev/stdin ]; then
  args=$(cat -)
else
  args=$*
fi

_num=0
for i in $args; do
  _num=$((_num+$i))
done
echo $_num
}
```

     ~ $ sum_num 1 2 3
    6
     ~ $ echo 1 2 3 | sum_num
    6
     ~ $ cat numbers.txt
    1
    2
    3
    4
    5
     ~ $ cat numbers.txt | sum_num
    15
     ~ $ sum_num 1 2 3 hi
    6

# 使う

     ~ $ cat huge.csv
    hi,foo,nyan
    1,2,3
    1,2,3
    2,3,1
    3,2,1
     ~ $ cat huge.csv | cut -d ',' -f 2
    foo
    2
    2
    3
    2
     ~ $ cat huge.csv | cut -d ',' -f 2 | sum_num
    9

大勝利
LXCをPythonから操作する

##概要
vagrantでubuntu13.10をインストールして、その上でテストしました。

##  まずはPython3.3のインストール

```Bash
sudo apt-get install libsqlite3-dev
sudo apt-get install sqlite3 # for the command-line client
sudo apt-get install bzip2 libbz2-dev

wget http://python.org/ftp/python/3.3.3/Python-3.3.3.tar.bz2
tar jxf Python-3.3.3.tar.bz2
./configure --prefix=/opt/python3.3
make
sudo make install

sudo ln -s /opt/python3.3/bin/python3.3 /usr/bin/python

wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
sudo python3.3 ez_setup.py
sudo easy_install pip
```

## LXCのインストール
```Bash
sudo apt-get -y install lxc
sudo apt-get -y install lxctl
```

## PythonのインタプリタからLXCの仮想コンテナを操作してみる
```Bash
sudo python3
```

```Python
import lxc
c=lxc.Container("C")
c.create("ubuntu")

# 成功すると最後にこのようなメッセージが出ます。
# モジュールのインストールで途中で失敗したらcreateからやり直せば成功します。
Processing triggers for ureadahead ...
Can not write log, openpty() failed (/dev/pts not mounted?)
Setting up libdrm2:i386 (2.4.46-1ubuntu1) ...
Setting up libprocps0:i386 (1:3.3.3-2ubuntu9) ...
Setting up libudev1:i386 (204-0ubuntu19) ...
Setting up udev (204-0ubuntu19) ...
invoke-rc.d: policy-rc.d denied execution of restart.
Removing 'diversion of /bin/udevadm to /bin/udevadm.upgrade by fake-udev'
update-initramfs: deferring update (trigger activated)
Setting up initramfs-tools-bin (0.103ubuntu1.1) ...
Setting up initramfs-tools (0.103ubuntu1.1) ...
update-initramfs: deferring update (trigger activated)
Setting up procps (1:3.3.3-2ubuntu9) ...
invoke-rc.d: policy-rc.d denied execution of start.
Setting up openssh-client (1:6.2p2-6ubuntu0.1) ...
Setting up openssh-server (1:6.2p2-6ubuntu0.1) ...
invoke-rc.d: policy-rc.d denied execution of restart.
Setting up ssh (1:6.2p2-6ubuntu0.1) ...
Processing triggers for libc-bin ...
Processing triggers for initramfs-tools ...
Download complete
Copy /var/cache/lxc/saucy/rootfs-i386 to /usr/lib/i386-linux-gnu/lxc ... 
Copying rootfs to /usr/lib/i386-linux-gnu/lxc ...
Generating locales...
  en_US.UTF-8... up-to-date
Generation complete.
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Creating SSH2 ECDSA key; this may take some time ...
invoke-rc.d: policy-rc.d denied execution of start.

##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

# コンテナを起動する
c.start()

# 設定ファイルの場所
c.config_file_name
'/var/lib/lxc/C/config'

# コンテナの一覧
lxc.list_containers()
['C']

# 設定の書き込み
c.append_config_item("lxc.network.ipv4", "192.168.1.10/24")
c.append_config_item("lxc.network.ipv4.gateway", "192.168.1.1")
c.save_config()

# IPアドレス確認
c.get_ips()

# コンソールにアタッチする。
c.console()
```

このようなログインシェルが立ち上がります。

```bash
  Ubuntu 13.10 C tty1

  C login: 
  Password: 
```

ユーザー名とパスワードはubuntuです。
Ctrl-a qでpythonインタープリタに戻ります。

以下、インタープリタの続き。

```Python

# クローンを作成する。
clone = lxc.Container("CLONE_NAME")
clone.clone(c)
clone.start()
clone.stop()
clone.destroy()

# 破棄して終了
c.destroy()
```


もう少し詳しいサンプルはこちらに載っていますので、是非参考に。
https://github.com/lxc/lxc/blob/master/src/python-lxc/examples/api_test.py
Mighty Mouseで下スクロールできなくなったとき

http://i-nyu.jugem.jp/?eid=2807
を参考に、適当にそこらへんにあったペーパータオルを1枚机の上に敷いて、ボールの部分を強く押し付けながら良い感じにボールを転がす。

http://store.apple.com/jp/product/MB112J/B/apple-mouse
シュッとしてジワーッと戻るCSS transitionの例

要素にhoverすると背景色がジワリと変化していくCSSを書くと以下のようになると思います。

```css
.sample {
    padding: 20px;
    background-color: #efefef;
    transition: background-color 1s linear;
}
.sample:hover {
    background-color: green;
}
```

これを指定した .sample の要素に対してhoverすると、1秒かけて背景色が薄いグレーからグリーンになります。
よく見るサンプルですね。
ただしこのままだと、hoverしたときと外れた時の両方ともtransitionが適用されてしまいます。

**hoverした時は素早くtransitionを行い、外れる時はゆっくりと変化させる場合はどうするか。**
簡単です。hover側にtransitionのコードを追加すればいいのです。

```css
.sample {
    padding: 20px;
    background-color: #efefef;
    transition: background-color 1s linear;
}
.sample:hover {
    background-color: green;
    transition: background-color 0.1s linear; /* 追加 */
}
```

この使い方が分かると、よりプロフェッショナルな感じのアニメーションを実装できるようになります。
色々試してみてください。

サンプルはjsFiddleに置いておきます。
http://jsfiddle.net/nantekkotai/MjjTA/
WindowsにCasperJSをインストールするのが面倒くさい

面倒だった。

- Chocolateyない
- インストーラーない
- npm install するとPython依存
- git clone するとPython依存

Zipファイルを解凍するのだけが正解です。

# CasperJSとは

JavaScriptアプリケーションのEndToEndテストを実行するためのツール。
JavaScriptでスクリプトを書くSeleniumのようなもの。

# インストール

## PhantomJS
内部的にPhantomJSを使っているのでまずは

```bat:Chocolateyインストール（入れてなければ）
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```
```bat:PhantomJSインストール
cinst phantomjs
```
```bat:動作確認
phantomjs -version
```
コマンドが見つからない場合は、コマンドプロンプトを開きなおしてください。


## CasperJS
CasperJSもChocolateyに登録されていますが、メンテナンスされていないようです。

[CasperJS, a navigation scripting and testing utility for PhantomJS and SlimerJS](http://casperjs.org/) の右のほうにあるZipファイルをダウンロードして解凍します。

### パス設定
bin\casperjs.exe が実行ファイルです。

コマンド名だけで呼び出したければ、好きな場所（C:\CasperJsとか）に置いて、パスを通してください。

MINGW32のbash（GitBashとか）から呼び出す場合はbinディレクトリに入っているcasperjsスクリプトが先に呼び出されます。これはPythonスクリプトです。Pythonをインストールしていないければ以下のエラーが出ます。

```
/usr/bin/env: python: No such file or directory
```

casperjs.exeと拡張子まで指定してください。

casperjsスクリプトの名前をcasperjs_に変えれば、casperjsコマンドでcasperjs.exeが呼び出せるようになるので便利です。

## 参考
[JavaScript - Casperjsのインストール(windows編） - Qiita [キータ]](http://qiita.com/usakoyama/items/5fbb68460db2024d9439)
たぶん1分くらいでできる形態素解析とtfidf(テストコードつき)


##下準備

```sh
pip install nltk
pip install mecab-python
```

##下のコードを貼りつけて実行してみてください
TF-IDFを出力するための関数がtfidf
形態素解析するための関数がextract_words
下の方にあるimport unittest以下の長ったらしいヤツはテスト

```python
#!/usr/bin/env python
#-*- encoding: utf-8 -*-
import nltk
import MeCab
import urllib2
from urllib2 import HTTPError
from itertools import chain


def tfidf(doc,docs):
  """対象の文書と全文の形態素解析した単語リストを指定すると対象の文書のTF-IDFを返す"""
  tokens = list(chain.from_iterable(docs)) #flatten
  A = nltk.TextCollection(docs)
  token_types = set(tokens)
  return [{"word":token_type,"tfidf":A.tf_idf(token_type, doc)} for token_type in token_types]
    

def extract_words(text):
  """テキストを与えると名詞のリストにして返す"""
  text =  text.encode("utf-8") if isinstance(text,unicode) else text
  mecab = MeCab.Tagger("")
  node = mecab.parseToNode(text)
  words = []
  while node:
    fs = node.feature.split(",")
    if (node.surface is not None) and node.surface != "" and fs[0] in [u'名詞']:
      words.append(node.surface)
    node = node.next
  return words

import unittest

class MachineLearningTest(unittest.TestCase):
  def test_extract_words(self):
    """形態素解析のテスト"""
    text = "textを形態素解析して、名詞のリストを返す"
    keywords = extract_words(text)
    self.assertEqual(keywords, ["text","形態素","解析","名詞","リスト"])
  def test_tfidf(self):
    """tfidfのテスト"""
    urls = ["http://qiita.com/puriketu99/items/"+str(i) for i in range(1,10)]
    def url2words(url):
      try:
        html = urllib2.urlopen(url).read()
      except HTTPError:
        html = ""
      plain_text = nltk.clean_html(html).replace('\n','')
      words = extract_words(plain_text)
      return words
    docs = [url2words(url) for url in urls]
    tfidfs_fizzbuzz = tfidf(docs[0],docs)
    tfidfs_fizzbuzz.sort(cmp=lambda x,y:cmp(x["tfidf"],y["tfidf"]),reverse=True)
    result = [e for i,e in enumerate(tfidfs_fizzbuzz) if len(e["word"]) > 2 and i < 30]
    self.assertEqual(result[7]["word"],"yaotti")#Qiita側がデザイン変えるとテスト失敗するかも
    print result
    #[{'tfidf': 0.08270135278254376, 'word': 'quot'},
    # {'tfidf': 0.02819364299404901, 'word': 'FizzBuzz'},
    # {'tfidf': 0.02067533819563594, 'word': 'fizzbuzz'},
    # {'tfidf': 0.02067533819563594, 'word': 'Buzz'},
    # {'tfidf': 0.016916185796429405, 'word': 'Fizz'},
    # {'tfidf': 0.016726267030018446, 'word': 'end'},
    # {'tfidf': 0.015036609596826138, 'word': 'map'},
    # {'tfidf': 0.015036609596826138, 'word': 'yaotti'},
    # {'tfidf': 0.011277457197619604, 'word': 'def'}]

if __name__ == '__main__':
  unittest.main()
```
>参考
TF-IDFの計算
http://everydayprog.blogspot.jp/2011/12/tf-idf.html
Pythonでカバレッジを調べる


備忘録
coverage入れる

```
$ pip install coverage
```

やってみる

```
$ nosetests --with-coverage
..................
Name                        Stmts   Miss Branch BrMiss  Cover   Missing
-----------------------------------------------------------------------
ctypes                        333    333    108    108     0%   3-543
ctypes._endian                 33     33     14     14     0%   1-59
ctypes.macholib                 1      1      0      0     0%   9
ctypes.macholib.dyld           88     88     42     42     0%   5-158
ctypes.macholib.dylib          20     20      4      4     0%   5-63
ctypes.macholib.framework      23     23      4      4     0%   5-65
ctypes.util                   159    159     69     69     0%   1-236
mymodule                          6      0      0      0   100%
uuid                          301    301    131    131     0%   47-581
-----------------------------------------------------------------------
TOTAL                        1256    966    460    384    21%
----------------------------------------------------------------------
Ran 18 tests in 0.073s

OK
```

なんかいっぱいでた！ 要らないモジュールの情報消したい！

```
$ nosetests --with-coverage --cover-package=mymodule                                                                                                    
..................
Name                    Stmts   Miss Branch BrMiss  Cover   Missing
-------------------------------------------------------------------
mymodule                      6      0      0      0   100%
-------------------------------------------------------------------
TOTAL                     298      8     88     12    100%
----------------------------------------------------------------------
Ran 18 tests in 0.073s

OK
```
消えた！

ところでオプションが長くなってきたので設定ファイルにする

```.noserc
[nosetests]
with-coverage=true
cover-package=mymodule
```

実行

```
$ nosetests --config=.noserc
```

おしまい
「No newline at end of file」が出たときの対処

sedでやると楽らしい

~~~
sed -i -e '$a\' file
~~~

[bash - How to add a newline to the end of a file? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/31947/how-to-add-a-newline-to-the-end-of-a-file)
Nginx


```
$ yum install nginx
$ vi /etc/nginx/conf.d/virtual.conf
$ sudo /sbin/service nginx start
```

``` conf.d/virtual.conf
server {
    listen       80;
    server_name  example.org  www.example.org;
    ...
}

location / {
  root /home/hoge/;
  index index.html;
}
```

## 試してみたい
apacheのリバースプロキシ
http://www1205uf.sakura.ne.jp/wp/world/?p=96
Rubyメモ


### 例外

```
begin
  User.find(param[:id])
rescue ActiveRecord::RecordNotFound => e
  p e
end
```

### ディレクトリがなければ作る

``` ruby:
path = "/home/take/diary"
Dir::mkdir(path, 0755) unless Dir.exist?(path)
```


## 常にtrueを返すオブジェクト

```
hoge = Class.new do
  def method_missing(*args)
    true
  end
end.new

p hoge.piyo # => true
```


## ヒアドキュメント

```
class_eval <<-METHODS, __FILE__, __LINE__ + 1
  ....
METHODS
```

`__FILE__, __LINE__ + 1` この部分なんだろ？


## Hash to Struct

``` ruby:
def hash_to_struct(hash)
  Struct.new(*hash.keys).new(*hash.values.map{|s| Hash === s ? hash_to_struct(s) : s})
end
```

## json string => ruby object

``` ruby:
JSON.parse()
```

## ruby object => json string

``` ruby:
JSON.generate()
```

## file write

``` ruby:
File.open(@options[:path], 'w') do |f|
  f.write JSON.generate(data)
end
```

## file read

``` ruby:
File.open(@options[:path]).read
```

## file

``` ruby:
File.dirname
File.exists?
Dir::mkdir
```

## STDIN

``` ruby:
STDIN.gets
```

## STDOUT

``` ruby:
puts # 改行あり
print # 改行なし
p
pp
```

## catch 多重ブロックのbreak 大域脱出

``` ruby:
resutl = catch(:hoge) do
  trhow :hoge, result
end
```

http://www.geocities.jp/m_hiroi/light/abcruby14.html

コストは安くない http://d.hatena.ne.jp/syonbori_tech/20111020/1319107721

find.rbによる例 http://d.hatena.ne.jp/yarb/20121012/p1
CSSによる吹き出し


http://cssarrowplease.com/

## 今すぐ使えるコード

```
.arrow_box {
	position: relative;
	background: #FFF;
	border: 2px solid #CCC;
	padding: 3px;
	border-radius: 5px;
	margin-top: 5px;
}
.arrow_box:after, .arrow_box:before {
	bottom: 100%;
	border: solid transparent;
	content: " ";
	height: 0;
	width: 0;
	position: absolute;
	pointer-events: none;
}
.arrow_box:after {
	border-bottom-color: #FFF;
	border-width: 8px;
	left: 15%;
	margin-left: -8px;
}
.arrow_box:before {
	border-bottom-color: #CCC;
	border-width: 11px;
	left: 15%;
	margin-left: -11px;
}
```

```
<div class="arrow_box">メッセージ</div>
```

## 三角形

まずborderで三角を作ることで吹き出しの先端を作ります。
borderは上下左右の線分でできていますが、幅が同じなら頂点から45度領域

線の幅を変更すると自由に角度を変更することができます。

```
.border-triangle-four{
  border: solid transparent;
  border-width: 11px;
  border-bottom-color: #CCC;
  border-left-color: #F00;
  border-top-color: #0F0;
  border-right-color: #00F;
  height: 0;
  width: 0;
}
```

```
<div class="border-triangle-four"></div>
```

## 三角の線

大きさの異なる三角を重ねれば線のように見えます。

```
.foo{
	position: relative;
}
.border-triangle{
	border: solid transparent;
	border-width: 11px;
	border-bottom-color: #F00;
	height: 0;
	width: 0;
	position: absolute;
	top: 0px;
}
.border-triangle-overlay{
	border: solid transparent;
	border-width: 8px;
	border-bottom-color: #FF0;
	height: 0;
	width: 0;
	position: absolute;
	top: 6px;
	margin-left: 3px;
}
```

```
<div class="foo">
  <div class="border-triangle"></div>
  <div class="border-triangle-overlay"></div>
</div>
```