OmniAICreator/Qiita-1.07M huggingface dataset:
Git覚書き


## リモートからブランチをとってくる （pullしたいって思った時）
http://stackoverflow.com/questions/1709177/git-pull-certain-branch-from-github

pullじゃなくてfetch使ってからmergeしようね。

```
% git fetch origin <REMOTE_BRANCH_NAME>
```

```
% git checkout -b <LOCAL_BRANCH_NAME>
```
```
% git merge FETCH_HEAD
```


## 現バージョンをリリースした段階でバージョンのtagを切る
おもむろに、ローカルにあるtag一覧を取得。

```
$ git tag 
```

リモートから最新のtagをとってくる。

```
$ git pull --tags 
```

現バージョンのtagつけてやる

```
$ git tag -a <VERSION_NUM> 
```

メッセージを記入して、リモートにプッシュする。

```
$ git push --tags
```



## 以前のバージョンのtagからブランチを切る
おもむろに、tagを指定してcheckout

```
$ git checkout <VERSION_NUM> 
```

ブランチに属さなくなるので、そこから新たにブランチを切る

```
$ git checkout -b <BRANCH_NAME>
```

## tagを間違えてつけてしまった場合のtagの切り直し方

ローカルのtagを削除

```
$ git tag -d <WRONG_VERSION_NUM>
```

リモートのtagを空のtag（存在しないtag）で上書きするように削除。

```
$ git push origin :refs/tags/<WRONG_VERSION_NUM>
```

正しいバージョンのtagつけてやる

```
$ git tag -a <CORRECT_VERSION_NUM> 
```

メッセージを記入して、リモートにプッシュする。

```
$ git push --tags
```

## バージョンアップ後のタグの更新で[rejected]
追加したタグを更新しようとしたら

```
$ git push --tags
```

怒られた。

```
error: failed to push some refs to <REMOTE_REPO_NAME>
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and merge the remote changes
hint: (e.g. 'git pull') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

一旦、リモートからタグをとってきて、

```
$ git pull --tags
```
もう一度pushをこころみる

```
$ git push --tags
Everything up-to-date
```
うまくいったみたい。

git pull --tags するときに下記のメッセージが出た。

```
Fetching tags only, you probably meant:
  git fetch --tags
```
fetchだけでもいいのかも。

## mergeを途中でやめる

```
$ git merge --abort
```

```
git status
```

merge途中のファイルが残っていたら、

```
git clean -f
```

## submoduleの変更などを破棄する
いじった覚えがないけどローカルで変更させてしまったみたい。

```
$ git status
# On branch develop
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#	modified:   app/Submodules/<SUBMODULE_DIR> (modified content)
#
no changes added to commit (use "git add" and/or "git commit -a")
```
普通に、

```
$ git checkout app/Submodules/<SUBMODULE_DIR> 
```
としてもうまく破棄されなかったので、

```
$ cd app/Submodules/<SUBMODULE_DIR>
```
一旦ディレクトリまで移動してから
このディレクトリ以下をcheckoutする。

```
$ git checkout .
```
これで確認してみると、

```
$ git status
# Not currently on any branch.
nothing to commit (working directory clean)
```
すっきり。
Kobito: 要望: プレビューのリンクのリンク先URLを分かるようにしてほしい


## やりたいこと

Kobitoのマークダウンプレビュー画面で、リンクのリンク先をソースを見なくても確認できるようにしたい。

## なぜ

書いている時に、正しくリンクされているか確認する作業がある。リンクをclickしてみればわかるが、毎回ブラウザが開くのが面倒。その手間を減らしたい。

## こんなふうに実装してはどうか?

* リンクにカーソルを当てたら、リンク先URLが吹き出しで出る
* リンクにカーソルを当てたら、Google Chromeのように 左下隅に表示される

など
ローカルな関数でメモ化再帰できるようにするマクロをClojureで

Clojureにはメモ化のために使うmemoizeという関数がある。

```clj:memoizeの使用例
user=> (def f (memoize (fn [n] (println n) (* n n))))
#'user/f
user=> (f 2)  ; 1回目の呼び出しではprintlnが実行される
2
4
user=> (f 2)  ; 2回めの呼び出しではキャッシュされた値が使われるため、printlnが実行されない、
4
user=> 
```

しかし、memoizeは意外と使い勝手が悪い。
メモ化を使いたいシチュエーションというのは再帰関数の場合が多い。いわゆるメモ化再帰というやつ。ところが、defを使ってトップレベルにメモ化した関数を定義してしまうと、メモ化に使われたキャッシュがいつまでも残ってメモリリークになる。加えて、最近のClojureでは再帰呼び出しが遅延束縛にならなくなったため、「メモ化されていない関数をトップレベルに定義しておき、メモ化して使いたい箇所だけmemoizeで囲んで使う」というのも意味がない。かと言って、letを使ってローカルに関数を定義しようとすると、今度はletのスコープが再帰関数の定義を許してくれない。
このあたりの悩みに直面する人はわりといるみたいで、以下のブログ記事でも確認できる。
- [Clojureの関数のメモ化 &gt;&gt; memoize 1.1 と 1.2 ~ Y箱](http://ypsilonbox.blogspot.jp/2011/09/clojure-memoize-11-12.html)
- [tnoda-clojure &bull; メモ化再帰関数](http://tnoda-clojure.tumblr.com/post/38399531755)

この問題に対する解決策はいくつかある。
解決策のひとつは動的束縛を使う方法だ。メモ化して使う関数を^:dynamicを使って定義しておき、メモ化して使う箇所だけmemoizeで囲んで束縛し直す。この方法を使うと、たとえばフィボナッチ数を返す関数の定義は以下のようになる。

```clj:動的束縛を使ったfibの定義
(defn ^:dynamic fib [n]
  (if (<= n 1)
    1
    (+ (#'fib (- n 1)) (#'fib (- n 2)))))

(binding [fib (memoize fib)]
  (fib 10))
```

この方法の場合、再帰呼び出しはVar経由で行う必要があることに注意する。ここでの例では、fibの再帰呼び出しが#'fibになっている。これは上で触れた、再帰呼び出しが遅延束縛にならなくなったことに起因する。

もうひとつの解決策は、上の2つめのブログ記事で挙げられているように、letとatomを使って再帰関数を定義する方法だ。

```clj:atomを使ったfibの定義
(let [fib (atom nil)]
  (reset! fib
          (memoize (fn [n]
                     (if (<= n 1)
                       1
                       (+ (@fib (- n 1)) (@fib (- n 2)))))))
  (@fib 10))
```

他にもやり方は考えられるが、いずれの場合にしても通常の再帰関数の定義からやや手を加えてやる必要がある。しかし、パターンは見えているので、マクロを使えばそのパターンをマクロの裏へ追いやってしまうことができる。今回はマクロを使って、ふたつめに挙げた方法をletfnと似た見た目に仕立ててみよう。以下がマクロの実装だ。

```clj:letfn-memoized
;; このマクロではsymbol-macroletを使っているため、tools.macro(https://github.com/clojure/tools.macro)が必要。
(defmacro letfn-memoized [fn-defs & body]
  (let [fnames (map first fn-defs)
        gensyms (into {} (map #(vector % (gensym)) fnames))]
    `(let [~@(mapcat #(list (gensyms %) '(atom nil)) fnames)]
       (symbol-macrolet [~@(mapcat #(list % `@~(gensyms %)) fnames)]
         ~@(for [[fname args & fbody] fn-defs]
             `(reset! ~(gensyms fname) (memoize (fn ~args ~@fbody))))
         ~@body))))
```

letfn-memoizedマクロを使うと、さっきのfibの定義はこう書き換えられる。

```clj:letfn-memoizedを使ったfibの定義
(letfn-memoized
  [(fib [n]
     (if (<= n 1)
       1
       (+ (fib (- n 1)) (fib (- n 2)))))]
  (fib 10))
```

これは以下のように展開され、

```clj:letfn-memoizedの展開
(let [G__1131 (atom nil)]
  (symbol-macrolet [fib @G__1131]
    (reset! G__1131
            (memoize (fn [n]
                       (if (<= n 1)
                         1
                         (+ (fib (- n 1)) (fib (- n 2)))))))
    (fib 10)))
```

最終的には、上のatomを使ったfibの定義と同じように展開される。

letfn-memoizedによって、晴れてletfnと同じ構文でメモ化再帰できるローカルな関数が定義できるようになった。

##あとがき
とはいえ、letfn-memoizedは十分複雑なマクロで、よほどいろんな箇所でメモ化再帰使っているというような場合でなければ、わざわざ定義して使うのもわりに合わないだろう。普段は動的束縛を使った方法を使っておくのが吉だと思う。
serverspecでテスト駆動サーバ構築


[Chef と Puppet の勉強会というよりも、むしろ時代は serverspec だった #pfcasual - 彼女からは、おいちゃんと呼ばれています](http://d.hatena.ne.jp/inouetakuya/20130511/1368271417)
こちらの記事で[serverspec](http://serverspec.org/)を見て、テストファーストでサーバ構築できたら良さげだなーと思って使ってみました。

## 導入
gemからserverspecインストール。serverspec-initでSSH経由でサーバをテストするようにホスト名を入力。

```
$ gem install serverspec
$ serverspec-init                                                                                                
Select a backend type:

  1) SSH
  2) Exec (local)
  3) Puppet providers (local)

Select number: 1

Input target host name: test-server1
 + spec/
 + spec/test-server1/
...
```
test-server1にはvagrantで作ったまっさらなVMを使ってみます。

## テスト
spec/下に指定したホスト名でディレクトリができてるので、試しに以下のようなテストを用意。apacheとtomcat(+管理ツール)がインストール済みかつ起動状態かどうか確認します。

```conf:example_spec.rb
require 'spec_helper'

#==========
# Apache
#==========
describe 'apache2' do
  it { should be_installed }
  it { should be_enabled   }
  it { should be_running   }
end
describe 'port 80' do
  it { should be_listening }
end

#==========
# Tomcat7
#==========
describe 'tomcat7' do
  it { should be_installed }
  it { should be_enabled }
  it { should be_running }
  
  # admin
  describe 'tomcat7-admin' do
    it { should be_installed }
	
	# 設定ファイルのチェック
    describe '/etc/tomcat7/tomcat-users.xml' do
      it { should contain '<role rolename="manager-gui"/>' }
      it { should contain '<user username="tomcat" password="tomcat" roles="manager-gui"/>' }
    end
  end
end 
describe 'port 8080' do
  it { should be_listening }
end
```

test-server1にテストを実行。

```
$ rake spec
...........FFFFFFFFFFF

Failures:

  1) apache2
     Failure/Error: it { should be_installed }
       sudo dpkg -s apache2
       Package `apache2' is not installed and no info is available.
       Use dpkg --info (= dpkg-deb --info) to examine archive files,
       and dpkg --contents (= dpkg-deb --contents) to list their contents.
...
...

```
まだ何もセットアップしてない状態なのでエラー。chef-soloなり手動なりでセットアップして再テスト。

```
$ rake spec
...........

Finished in 0.47476 seconds
11 examples, 0 failures
$ 
```

今度はOK。更にもう一台test-server2をVMで作成して、test-server1と同様にテストしてみます。

test-server2には同じテストを実施したいので、spec/下にtest-server1へのsymlinkを作成。

```
$ ln -s test-server1 spec/test-server2
$ tree spec/                                                                                                         
spec/
├── spec_helper.rb
├── test-server1
│   └── example_spec.rb
└── test-server2 -> test-server1
```

雑な感じだけど、ひとまず動けばいいという事で・・。これで2台目のマシンにもテストが走るようになるので、あとはテストが通るまで繰り返せばOK。テスト駆動がサーバ構築でも行えていい感じ！

[他にもテストのmatcherが色々用意されているので](http://serverspec.org/matchers.html)、これから試していきたいなーと思います。
[LaTeX]長い表を表示する


複数ページにまたがる長い表を表示する方法

```tex:longtable.tex
\usepackage{longtable}
...
\begin{document}
...
\begin{longtable}{lll}
\caption[表目次用のキャプション]{キャプション\label{tab:label}}\\ \hline
項目１&項目２&項目３\\ \hline
\endfirsthead%ここまでが1ページ目のヘッダー．キャプションを含んでいるのに注意．
\caption[]{キャプション（続き）}\\ \hline
%[]に何も書かないと表目次には何も書かれない．[]ではなく*にすると，表番号もでなくなる．
項目１&項目２&項目３\\ \hline
\endhead
\hline
\firstfoot
%\hline
%\endfoot%最後のフッターを他のフッターと変えられる．同じなら書かなくてもいい．
a & b & c \\
x & y & z \\
\end{lontable}
```
[Emacs]Gnuplot-modeのキーバインド


| Key-bind | Function |
|:-----------|:------------|
| C-c C-l | カーソルのある行をgnuplotで実行 |
| C-c C-v | カーソルのある行をgnuplotで実行して次の行に移る |
| C-c C-r | 選択しているリージョンをgnuplot で実行する |
| C-c C-b | バッファをgnuplotで実行する |
| C-c C-f | ファイルをgnuplotで実行する |
| M-TAB	   | キーワードを補完する |
| C-c C-c | リージョンをコメントアウトする |
| C-c C-o | コマンドの引数の入力補助 |
| C-c C-h | キーワードの解説 |
| C-c C-e | gnuplotのプロセスバッファを表示 |
| C-c C-k | gnuplotのプロセスをkillする |
パーティションを切った後に swap 領域を追加する方法

十分なメモリを積んでるから swap 無しでも大丈夫だろうと思ってたら，VM Player の VM 作成が異常に遅かったりする．そんなとき，swap 領域を追加したいと思うことがあるだろう．

一般には，ディスクに swap 用のパーティションを用意するのだが，既にディスクめいっぱいにパーティションを切り分けている場合，再度切り直すのがめんどうだ．

そこで，swap 用のファイルを作成してそれを swap 領域として使わせる方法を紹介する．以下は /home/user/tmp ディレクトリに 4GB の swap 用ファイルを作成する方法だ．

1. ```$ dd if=/dev/zero of=/home/user/tmp/swap bs=1G count=4``` (of が swap 用ファイルのパス，bs が単位，count がサイズ)
2. ```$ mkswap /home/user/tmp/swap```
3. ```$ swapon /home/user/tmp/swap```

ここまでで swap 領域が完成する．```$ cat /proc/swaps``` で wap が追加されたかどうかが確認できる．

ちなみに，これをリブート後も使用したいなら，/etc/fstab に以下を追記すればいい．

```
/home/user/tmp/swap   swap   swap   defaults   0   0
```
Homebrew でOpenCVをインストールする方法

#homwbrew でOpenCVをインストールする方法

デフォルトのHomebrewではOpenCVはないがhomebrew-scienceを追加でインストールすることで
コンピュータサイエンス向けのライブラリをインストールできるようになる

homebrew-science　<https://github.com/homebrew/homebrew-science>

###前提条件
Homebrewがインストール済みであること

###インストールの仕方
`$ brew tap homebrew/science`

試しにどんなものがインストール可能か見てみる
`$  brew search open`
libopennet	  open-mpi	    open-vcdiff	      openconnect	openfst		  openrtsp	    openssl
open-babel	  open-ocd	    openblas	      opencore-amr	openimageio	  opensc	    openvpn
open-cobol	  open-scene-graph  opencc	      opencv		openjpeg	  openslide
open-mesh	  open-sp	    opencolorio	      openexr		openmeeg	  openslp

OpenCVのインストール自体はこれ
` brew install opencv`

これでおしまい

### 32bit 版をインストール
64bit版(たぶんOS準拠のbit数)がインストールされる、32bit版をインストールしたい場合はオプションを指定する(processing1.5系 利用の場合など)

`brew options opencv`
--32-bit
	Build 32-bit only
--with-eigen
	Build with eigen support
--with-jasper
	Build with jasper support
--with-libtiff
	Build with libtiff support
--with-opencl
	Enable gpu code in OpenCV using OpenCL
--with-qt
	Build the Qt4 backend to HighGUI
--with-tbb
	Enable parallel code in OpenCV using Intel TBB

32bit版をビルドする場合は--32-bitをつければ良い

`brew install opencv --32-bit`
Undoを管理する

本記事は [Vim Advent Calendar 2012](http://atnd.org/events/33746) の169日目です。
168日目は@cohamaさんによる、[tig なんて目じゃない！ Git のログ系 Vim プラグイン gitv ＆ gitv をGit 統合インターフェース化する最強の設定](http://d.hatena.ne.jp/cohama/20130517/1368806202)でした。

Vimにはundo(redo)機能があります。エディタとしては当たり前ですね。
回数は無制限です。ここまで聞くと高機能だと感じる方もいるかもしれません。
が、Vimは更にundo履歴をツリー状に管理することができます。標準で。
undo履歴のツリー管理機能を標準で持つエディタを他に聞いたことありませんし、
実際なかなか無いでしょう。

こうして標準搭載されていながらも、なぜかあまり噂を聞かない(私だけ？)この機能について
今回調べてみましたので、触れていこうかと思います。

# undo-branches(undo-tree)

アンドゥツリーなどと言ったりするこの機能ですが、Vimではundo-branchesとも言うようです。
というより、調べて見た感じだと実装時はundo-branchesと呼ばれ、最近ではundo-treeとも呼ぶようになった印象を受けました。
`:h undo-branches`
`:h undo-tree`
`:h usr_32`

# 概要

よく使うであろうコマンドは以下です。

- `g-` / `g+`

ツリーを利用したundo/redoを行います。但し、ツリーを利用した、と言っても
実際は時間にそって編集履歴をたどっていっているのみです。
以下のような編集履歴があったとします。

```

change 1 - change 2
         \ change 3 - change 4@

```

仮にすべて1分間隔で編集が行われていったとすると、以下のように時間が記録されます。

```

change 1 - change 2
(1 min.)   (2 min.)
         \ change 3 - change 4@
           (3 min.)   (4 min.)

```

これを`g-`を用いてchange 4から遡って行くと、
change4, 3, 2, 1となっていくわけです。

- `:undol[ist]`

ツリーの葉に当たる部分をリスト表示します。
上記の例で行けばchange2, 4についてのリストが表示されます。
このリスト番号を用いて直接undoしたいときは、
`:earlier {count}` / `:later {count}` を用います。

# 活用法を考える

こんな便利にもかかわらず、どこかとっつきにくい印象を受けるのでどうしたら使いやすくなるか考えてみました。
まず、この機能をフル活用するという前提のもとに、以下の設定を行なっておきます。

```vim:

" Undo履歴をファイルに保存する
set undodir=$HOME/.vim/undodir
set undofile

```

これでVimを終了してもファイルのundo履歴は残ります。
では具体的にどのように活用するか。例えばこのような方法があります。

## プラグインを導入する

Gundo - Visualize your Vim Undo Tree
http://sjl.bitbucket.org/gundo.vim/

GundoはUndo-branchesを可視化し、利用しやすくすることができます。
プラグインの持つウインドウには可視化されたツリーと差分が表示されます。
![GundoImg](http://i.imgur.com/aOhYRQ4.png "GundoImg")

表示されているツリーはカーソルを移動して`<CR>`することでその編集履歴まで戻ることができます。カーソルを動かしてbranchesをたどっている時も差分を見ることができるので、直感的なundoができます。

欠点を上げるならば、結構画面を食われてしまうことでしょうか。また、変更がリアルタイムにツリーに反映されないので、使用する際はマニュアルにあるように、起動コマンド`:GundoToggle<CR>`をmapして使うことになるでしょう。

## mapする

思い切って普段のundo/redoコマンドにundo-branchesを利用するコマンドをマップしてしまいます。

```vim:

nnoremap u g-
nnoremap <C-r> g+

```

枝がない箇所では通常通りundoとして機能するので、使い勝手もあまり変わりません。劇的な使い勝手の向上とはいかないですが、意識せず使えるのが良い点です。上書きするのが忍びない場合は覚えやすい他のマップでもいいでしょう。個人的にはよく連打でundoするので、`U`(行単位Undo)を上書きするのも有りだと思います。
普段使わないコマンドだとこんな簡単なものでも結構覚えてないことがあるので、いざ枝を辿ろうとした時にあたふたしなくていいのもいいかもしれません。

# まとめ

色々と書いてみましたが、実際なぜあまり聞かないのかというと、

> 意外と使わない

ということではないかと思っています。
実際に、こうしてみてみると便利そうだけど、いざというときは存在を忘れて`u`を連打している私がいます。また常にツリー構造が見えているわけでもないので、分岐が把握しにくい、とっつきにくい、というところもあり、活用するためにはそういったところが課題として感じました。いつか取り組んでみたいです。

以上VAC 169日目の記事でした、次回のAdvent Calendar 170日目は@tyruさんです。

## 参考

http://kaworu.jpn.org/kaworu/2008-04-30-1.php
http://blog.bonar.jp/entry/20080613/1213312249
http://umezo.hatenablog.jp/entry/20090429/1240989787
http://vim-users.jp/2010/07/hack162/
gitのmerge commitから、automergeが発生しているファイル一覧を出力2

# [前回](http://qiita.com/items/bfe25f7179ef31155b54)の改良版です。

いろいろとアドバイスを貰ったのでそれを元に修正しました。
地道に投稿し続けた甲斐がありました！
ありがとうございます。
使ってみようと思われた方は[こちら](https://github.com/kyanro/git-command-automerged)からどうぞ！

せっかくなので、貰ったアドバイスを反映するために、勉強も兼ねて２つ作ってみました。

##改良版1 linuxっぽい書き方に
改良点

+ 多重起動を考慮し中間ファイルにユニークな名前を設定
+ 処理終了時に中間ファイルを削除
+ 空ファイルの作り方
+ パイプの有効活用

ユニークな名前を設定するために、mktempを使うといいともきいたのですが、入っていない環境もあるとのことだったので、今回は利用を見送りました。


##改良版2 中間ファイルを使わないようにする方法
改良点

+ 中間ファイルを作成しないよう修正
+ (改良版1のいいところを取り込み)


###改良版1
```sh
#! /bin/bash
#引数としてコミットの ハッシュ HEAD HEAD^ 等のmergeコミットを一つ入力
#automergeが起きたファイルを全て表示

#入力されたコミットの親の数を確認
PearentNum=$(echo $(git log $1 -1 --pretty=format:"%P" | wc -w))

#中間ファイル名の設定
TEMP_DIR="/tmp/merged.$$"
mkdir -p $TEMP_DIR
TEMP_MERGED="$TEMP_DIR/merged.$$"
TEMP_AUTOMERGED="$TEMP_DIR/automerged.$$"

#終了時に中間ファイルを削除するよう設定
trap 'rm -r ${TEMP_DIR}' 0

#merge commitかチェック
if [ $PearentNum -gt 1 ] ; then
	#親が2以上(merge commitの場合)
	#入力されたコミットとその親との差分が存在するファイル名からmergeが行われたファイルを列挙

	#同名ファイルが万が一存在した時のために $TEMP_MERGED を初期化
	cp /dev/null $TEMP_MERGED

	#親の数だけループ
	i=1
	for Pearent in $(git log $1 -1 --pretty=format:"%P")
	do
		#一応親のハッシュを出力しておく
		echo "Pearent $i : $Pearent"
		git diff --name-only $1 $Pearent >> $TEMP_MERGED
		i=$(expr $i + 1)
	done

	#mergeされたファイルをソートし、重複ファイルを抽出
	sort $TEMP_MERGED | uniq --repeated > $TEMP_AUTOMERGED
	
	#重複しているファイルがあれば出力
	if [ -s $TEMP_AUTOMERGED ] ; then
		echo " *automerged file name"
		cat $TEMP_AUTOMERGED
	else
		echo "no automerge"
	fi

else
	#親が2以上いないなら入力されたハッシュを出力して処理を終了
	echo "$(git log $1 -1 --pretty=format:"%H") is not Merge　Commit"
fi

```

###改良版2
```sh
#! /bin/bash
#引数としてコミットの ハッシュ HEAD HEAD^ 等のmergeコミットを一つ入力
#automergeが起きたファイルを全て表示

#入力されたコミットの親の数を確認
PearentNum=$(echo $(git log $1 -1 --pretty=format:"%P" | wc -w))

#merge commitかチェック
if [ $PearentNum -gt 1 ] ; then
	#親が2以上(merge commitの場合)
	#入力されたコミットとその親との差分が存在するファイル名からmergeが行われたファイルを列挙

	#マージが行われたファイル名一覧用変数の初期化
	MergedFiles=""

	#親の数だけループ
	i=1
	for Pearent in $(git log $1 -1 --pretty=format:"%P")
	do
		#一応親のハッシュを出力しておく
		echo "Pearent $i : $Pearent"

		MergedFiles=$(echo -e "$(git diff --name-only $1 $Pearent)\n${MergedFiles}")
		i=$(expr $i + 1)
	done

	#空行削除後、mergeされたファイル名をソートし、重複ファイルを抽出
	AutoMerged=$(echo "$MergedFiles" | grep -v "^$" | sort | uniq --repeated)
	
	#重複しているファイルがあれば出力
	if [ -n "$AutoMerged" ] ; then
		echo " *AutoMerged filenames..."
		echo "$AutoMerged"
	else
		echo "no automerge"
	fi

else
	#親が2以上いないなら入力されたハッシュを出力して処理を終了
	echo "$(git log $1 -1 --pretty=format:"%H") is not Merge　Commit"
fi

```
UIIDをUIDeviceで管理するカテゴリ拡張

業務でiOSアプリを開発していると、UUIDやUIIDを取得・使用することもしばしば。

NSUserDefaultsやDBに保存するコードを書くのも面倒な私はUIDeviceにこんなカテゴリを作って使用しています。

ちなみにUUIDやUIIDに関してはこちらのエントリが分かりやすいかも
http://d.hatena.ne.jp/tanamon/20120924/1348491831

```objc:UIDevice+Identifier.h
//UIIDを格納するNSUserDefaults上のキー
#define kUIID @"uniqueInstallationIdentifier"

@interface UIDevice (Identifier)
//UUIDを生成して返却するメソッド
+ (NSString*)universallyUniqueID;

//UIIDを生成して返却するメソッド。１インストールで１UIIDとなる。内部で自動管理する
+ (NSString*)uniqueInstallationID;

//内部で管理しているUIIDを削除する
+ (BOOL)removeManagedUIID;
@end
```

```objc:UIDevice+Identifier.m
@implementation UIDevice (Identifier)

+ (NSString*)universallyUniqueID
{
	CFUUIDRef theUUID = CFUUIDCreate(NULL);
	NSString *string = (NSString *)CFUUIDCreateString(NULL, theUUID);
	CFRelease(theUUID);
	return string;
}

+ (NSString*)uniqueInstallationID
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *ret = nil;
    if ([defaults objectForKey:kUIID] == nil) {  //管理しているUIIDが存在しない場合
        ret = [self universallyUniqueID];
        if (ret != nil) {
            [defaults setObject:ret forKey:kUIID];
            [defaults synchronize];
        }
    } else {      //管理しているUIIDが既に存在する場合はその値を返却する
        ret = [defaults objectForKey:kUIID];
    }
    return ret;
}

+ (BOOL)removeManagedUIID
{
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:kUIID];
    return [[NSUserDefaults standardUserDefaults] synchronize];
}
@end
```

呼び出しは以下

```objc:SomeClass.m
NSString *uiid = [UIDevice uniqueInstallationID];
```

uniqueInstallationIDメソッドの処理は管理しているUIIDが存在しない場合はuniversallyUniqueIDを使ってUUIDを生成し、その値をUIIDとしてNSUserDefaultsに保存します。
以降、管理しているUIIDが削除されるまではその値を返却し続けます。

UIIDはDBに保存したり独自にNSUserDefaultsに保存するという方が多いと思いますが、参考までに。
個人ユースGitのススメ(その1)


バージョン管理システムが導入されていると色々と便利な事が多いですよね。

しかし、バージョン管理システムが自由に使えてリポジトリをさっさと作れる環境にいる人もそこそこいるのだろうけど、例えばサーバ管理者に依頼とかしないと使えない人、そもそもサーバから作らなければいけない人などは、ちょっとした物を作るのにも手軽にという訳にはいきませんし、SVNなどの中央集中型だとネットワーク接続がある事が前提なので、任意の時点でコミット出来ないなど、不便な事もあります。

そんな時におすすめなのがGitです。本来はDVCSとして使用する物なのでしょうが、個人のローカルで使用するという用途でも十分（というかパワフルに）役に立ちます。

インストールは使用中のOSにあわせて

[Gitの公式ページ](http://git-scm.com/)

からモジュールをダウンロードしてインストールすれば良いでしょう（コマンドラインの場合）GUIツールや統合環境用のプラグインなんかも結構ありますが、今回は扱いません。

インストールが終わったら、使いはじめます。コマンドラインシェルで管理したいディレクトリに移動して

```
$ git init
```
 ※$はコマンドラインのプロンプトです。実際の入力は$以降を入力して下さい。
これだけです。

これでそのディレクトリはgitで管理出来るように初期設定が完了しました。

実行したディレクトリに「.git」というディレクトリが出来ているはずです。

それでは、ファイルを追加してみましょう。

先程のフォルダに適当なテキストファイルを作成します。ここではファイル名test.txtとします。


ここで

```
$ git status
```

を実行して下さい。

 

このコマンドは現在管理しているフォルダのgitからの管理状態を表示するコマンドです。出力は

>\# Initial commit
>\#
>\# Untracked files:
>\#   (use "git add ..." to include in what will be committed)
>\#
>\#     test.txt

のように出力されるはずです。
 

さて、ではgitの管理下にファイルを追加してみましょう。

```
$ git add test.txt
```

を実行します。特にメッセージは表示されません。

再度、上記で実行したgit statusで状態を見てみましょう。


>\# On branch master
>\#
>\# Initial commit
>\#
>\# Changes to be committed:
>\#   (use "git rm --cached ..." to unstage)
>\#
>\#     new file:   test.txt

こんなメッセージが表示されたのでは無いかと思います。少しメッセージが変化してますね。

new file : test.txtがgitにこのファイルが管理対象のファイルとして認識された事を示しています。この段階ではまだコミットはされていません。

コミットするには 

```
$ git commit -m "メッセージ" test.txt
```

 を実行します。メッセージの部分は各自適当に書き換えて下さい。実行すると


>[master (root-commit) 4584a10] commit 1
>1 file changed, 2 insertions(+)
>create mode 100644 test.txt

こんな感じのメッセージが出力されてと思います（実行環境や状態により、メッセージは完全に同じでは無いです）

ここで再度git statusを実行すると

```
# On branch master
nothing to commit (working directory clean)
```

と出力されます。現在管理下にあるファイルのコミットは全てコミットされ、変更も特にない状態を示しています。

ここで、test.txtを適当に編集してセーブしてみましょう。その後またgit statusを実行すると

>\# On branch master
>\# Changes not staged for commit:
>\#   (use "git add <file>..." to update what will be committed)
>\#   (use "git checkout -- <file>..." to discard changes in working directory)
>\#
>\#     modified:   test.txt

こんなメッセージが出力されるはずです。midifiedの部分で、gitが管理下のファイルが変更された事を認識している事が分かります。

ここで実際は実験的な修正を行っていたとして、それが気に入らなかったとしましょう。そういう場合、一つ前にコミットした状態にファイルを戻したいですよね。そういう場合は

```
$ git checkout HEAD ファイル名
```

を実行します（HEADは今の所魔法の呪文なので、気にしないで下さい。既存のVCSを使った事があるなら想像は付くかもしれませんが）。

その後、git statusを実行すると


> \# On branch master
>nothing to commit (working directory clean)

のように表示されるはずです。実際のファイルの内容も以前のコミット状態に戻っているはずです。

さて、再度編集した後に気に入った修正が出来たら上でも行った

```
$ git commit -m "メッセージ" test.txt
```

※メッセージの部分は適当で
を実行しましょう。

ここまでで概ね基本的な使い方は習得できたかと思います。これでも管理を始めるの為の敷居の低さで既存のセンター集中型バージョン管理システムよりは始めやすいと思います。

が、まだまだこれはGitの入り口レベルです。次回でGit特有の便利な使い方を詳解していきたいと思います。

この記事で実行したコマンドを知りたい方は、インストールで使用したGit公式URLや、もしくは色んな方が記事を書いているのでそちらを参照して下さい。

ではまた次回（いつになる事やら）
【Linux】find & grep 併用コマンド

### ソースの中から文字列「hogehoge」を検索するには
```
find . -name \*.c -exec grep hogehoge {} \;
```
とすればよいが、これでは *.c のファイルの数だけ grep コマンドが実行され、時間がかかる。そういう場合は

```
find . -name \*.c -print | xargs grep hogehoge
```

とすればよい。もっときっちりやるなら

```
find . -name \*.c -print0 | xargs -0 grep hogehoge /dev/null
find . -type f -exec grep -il confirm {} \;
```
【PHP】CentOS5.5 + ORACLEで開発サーバ構築のメモ

### PHP 3.5 INSTALL
[root@localhost]# yum install php53-devel(PHP3.5.4)
[root@localhost]# yum install php-pear(以下のoci8をインストールするため)
[root@localhost]# yum install php53-soap
[root@localhost]# yum -y install gcc gcc-c++(compiler)
[root@localhost]# yum install php53-mbstring
yum search libXi

### ORACLE
・環境設定
export NLS_LANG=Japanese_Japan.AL32UTF8
export TNS_ADMIN=/opt/app/instantclient/
export TWO_TASK=COOK11GT
export LD_LIBRARY_PATH=/opt/app/instantclient/

###以下に接続し該当Oracle Instant Clientをダウンロード
http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html

### Instant Client Downloadsfor Linux x86
- Version 11.2.0.2.0
- Instant Client Package - Basic: All files required to run OCI, OCCI, and JDBC-OCI applications
- oracle-instantclient11.2-basic-11.2.0.2.0.i386.rpm
- oracle-instantclient11.2-devel-11.2.0.2.0.i386.rpm(PHP)
- instantclient-sdk-linux32-11.2.0.2.0.zip(SDK)

[root@localhost]# rpm -ivh oracle-instantclient11.2-*.rpm

[root@localhost]# ./configure -with-oci8=instantclient,/opt/app/instantclient
・PHPINFOのphp.iniファイルの読み込み先を見てそのphp.iniファイルにextension=oci8.so追加
- vi /etc/php.ini
 
### VMWARE TOOLS INSTALL
[root@localhost vmware-tools-distrib]# ./vmware-install.pl
【Linux】SVN設定

### ソースフォルダの新規追加
```
\#cd /var/www/html/svn/
\#svnadmin create --fs-type fsfs プロジェクト名
\#chmod -R g+w プロジェクト名
\#chown -R apache.apache プロジェクト名
-- 下の1行目は省略可
\#svn checkout http://192.168.1.1/svn/プロジェクト名

\#trac-admin /home/trac/プロジェクト名 initenv
Path to repository [/path/to/repos]> /var/www/html/svn/プロジェクト名
\#chown -R apache.apache /home/trac/プロジェクト名
```

### trac INIファイル設定

```
\#vi /home/trac/プロジェクト名/conf/trac.ini
[header_logo]
\#alt = main
#height = 200
link = http://192.168.241.236/trac
src = http://192.168.241.236/abc1day.gif
\#width = 600
[trac]
repository_dir = /var/www/html/svn/プロジェクト名
```

### tracリシンク

```
#trac-admin /home/trac/プロジェクト名 resync
```

### tracパーミション付与

```
#trac-admin /home/trac/プロジェクト名 permission add hide TRAC_ADMIN
```

### ユーザー追加

```
\#htpasswd  -m /var/svn/conf/svnusers　ユーザー名
```

### バックアップ

```
\#cd /var/svn
\#svnadmin dump repo_name > repo_name.dump
```

### ロード

```
\#cd /var/svn
\#svnadmin create repo_name
\#svnadmin load repo_name < repo_name.dump
```

※tracリポジトリブラウザの文字化け問題

```
/home/trac/プロジェクト名/conf/trac.ini
default_charset = utf-8
```
■ TRAC&SVN削除
\#rm -rf 

■ eclipseからSVNプロジェクト追加の手順
プロジェクトを右クリック ⇒ チーム ⇒ プロジェクトの共用
【Linux】CentOSにgitインストール方法

### yum
- yumでgit レポジトリがないため手動で追加しアップデートする

### 参照リポジトリを追加する
- /etc/yum.repos.d/rpmforge.repo
- 以下の内容を作成

```
[rpmforge]
name = Red Hat Enterprise $releasever - RPMforge.net - dag
\#baseurl = http://apt.sw.be/redhat/el5/en/$basearch/dag
mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
\#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
enabled = 0
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1
```

- 以下のコマンドを実行することでgitをインストール

yum install git --enablerepo=rpmforge
【Eclipse】Aptana & SVN設定

### Aptana Install
Aptana Studio Update Site - http://download.aptana.org/tools/studio/plugin/install/studio

### 一般設定
- メニューバ ⇒ ウィンドウ -> 設定 ⇒  一般 ⇒ Webブラウザー ⇒ 外部Firefox
- メニューバ ⇒ ウィンドウ -> 設定 ⇒  一般 ⇒ ファイル関連付け ⇒ .htaccessをテキストエディターと関連付け
- メニューバ ⇒ ウィンドウ -> 設定 ⇒  一般 ⇒ コンテンツ・タイプ ⇒ テキストにUTF-8適用
- メニューバ ⇒ ウィンドウ -> 設定 ⇒  一般 ⇒ ワークスペース ⇒ テキスト・ファイルエンコードにUTF-8適用
- メニューバ ⇒ ウィンドウ -> 設定 ⇒  一般 ⇒ ワークスペース ⇒ ローカル・ヒストリー -> ファイルを保持する日数設定
- メニューバ ⇒ ウィンドウ -> 設定 ⇒  一般 ⇒ 開始およびシャットダウン ⇒ Aptana イントロのチェックを解除
- メニューバ ⇒ ウィンドウ -> 設定 ⇒  一般 ⇒ 外観 -> 色とフォント ⇒ 基本 -> メイリオフォント適用

### SVNを除くビルド・パス設定
- プロジェクト右クリック ⇒ プロパティー ⇒ PHP ビルド・パス ⇒ ビルドパス ⇒ 除外 ⇒　ソースのリンク ⇒ 編集 ⇒ **/.svn/*
【Excel】ExcelからCSV書きだす方法

```
Option Explicit

' CSV形式テキストファイル書き出すサンプル
Sub WRITE_CSVFile()
    Const cnsTITLE = "CSVテキストファイル出力処理"
    Const cnsFILTER = "CSVファイル (*.csv;*.dat),*.csv;*.dat"
    Dim xlAPP As Application        ' Applicationオブジェクト
    Dim intFF As Integer            ' FreeFile値
    Dim strFILENAME As String       ' OPENするファイル名(フルパス)
    Dim X(1 To 5) As Variant        ' 書き出すレコード内容
    Dim GYO As Long                 ' 収容するセルの行
    Dim GYOMAX As Long              ' データが収容された最終行
    Dim lngREC As Long              ' レコード件数カウンタ
    Dim COL As Long                 ' カラム(Work)

    ' Applicationオブジェクト取得
    Set xlAPP = Application
    ' 「名前を付けて保存」のフォームでファイル名の指定を受ける
    xlAPP.StatusBar = "出力するファイル名を指定して下さい。"
    strFILENAME = xlAPP.GetSaveAsFilename(InitialFilename:="SAMPLE.csv", _
        FileFilter:=cnsFILTER, Title:=cnsTITLE)
    ' キャンセルされた場合は以降の処理は行なわない
    If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub

    ' 収容最終行の判定(Excel認知の最終行から上に向かってデータがある行を探す)
    GYOMAX = Cells.SpecialCells(xlCellTypeLastCell).Row
    Do While Cells(GYOMAX, 1).Value = ""
        GYOMAX = GYOMAX - 1
    Loop
    If GYOMAX < 2 Then
        xlAPP.StatusBar = False
        MsgBox "テキストをA～E列2行目から入力してから起動して下さい。",, cnsTITLE
        Exit Sub
    End If

    ' FreeFile値の取得(以降この値で入出力する)
    intFF = FreeFile
    ' 指定ファイルをOPEN(出力モード)
    Open strFILENAME For Output As #intFF
    ' 2行目から開始
    GYO = 2
    ' 最終行まで繰り返す
    Do Until GYO > GYOMAX
        Erase X         ' 初期化                                     ' ①
        ' A～E列内容をレコードにセット(先頭は2行目)
        For COL = 1 To 5
            X(COL) = FP_CutInjusticeChar(Cells(GYO, COL).Value)      ' ②
        Next COL
        ' レコード件数カウンタの加算
        lngREC = lngREC + 1
        xlAPP.StatusBar = "出力中です．．．．(" & lngREC & "レコード目)"
        ' レコードを出力
        Write #intFF, X(1), X(2), X(3), X(4), X(5)                   ' ③
        ' 行を加算
        GYO = GYO + 1
    Loop
    ' 指定ファイルをCLOSE
    Close #intFF
    xlAPP.StatusBar = False
    ' 終了の表示
    MsgBox "ファイル出力が完了しました。" & vbCr & _
        "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub

' CSVテキスト項目に出力できない文字を除去する
Private Function FP_CutInjusticeChar(vntInText As Variant) As Variant
    Dim strInText2 As String
    Dim POS As Long
    Dim strChar As String
    Dim strOutText As String

    FP_CutInjusticeChar = Empty
    ' 一旦、文字列に変換する
    strInText2 = Trim$(CStr(vntInText))
    ' ブランクの場合は処理なし
    If strInText2 = "" Then Exit Function

    ' 文字列の桁数分繰り返す
    strOutText = ""
    For POS = 1 To Len(strInText2)
        ' 1文字を取り出す
        strChar = Mid(strInText2, POS, 1)
        ' ダブルクォーテーションとCRコードをOMIT
        If ((strChar <> vbCr) And (strChar <> """")) Then
            strOutText = strOutText & strChar
        End If
    Next POS
    ' 元の値が数値の場合はDouble型とする
    If IsNumeric(vntInText) = True Then
        FP_CutInjusticeChar = CDbl(strOutText)
    Else
        FP_CutInjusticeChar = strOutText
    End If
End Function
```

### 参考URL
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_050.html
http://www.nurs.or.jp/~ppoy/access/excel/xlM033.html
【Excel】VBでDB接続方法

### ADODB.Connection PostgreSQL接続

```
  strConn = "DRIVER={PostgreSQL Unicode};DATABASE=db;SERVER=192.168.1.99;
              PORT=5432;UID=XX;PWD=XXX;"
  'If IsEmpty(conn) Then Set conn = CreateObject("ADODB.Connection")
  Set conn = CreateObject("ADODB.Connection")
  Set rs = CreateObject("ADODB.Recordset")
  On Error Resume Next
  '************************************
  conn.Open strConn
  rs.Open "select pg_backend_pid()", conn  'バックエンドプロセスID
  Debug.Print "(1).....PID:" & rs.Fields(0).Value
  '-----------------------
  conn.Execute "CREATE TEMP TABLE TTEST (fld1 integer,fld2 text);"
  '-----------------------
  Debug.Print IIf(Err.Number = 0, "create ok", Err.Description)
  Err.Clear
  rs.Close
  conn.Close    ' --------- closeでセッションが終わる訳ではない
  '************************************
  conn.Open strConn
  rs.Open "select pg_backend_pid()", conn 
  Debug.Print "(2).....PID:" & rs.Fields(0).Value
  '-----------------------
  conn.Execute "CREATE TEMP TABLE TTEST (fld1 integer,fld2 text);"
  '-----------------------
  Debug.Print IIf(Err.Number = 0, "create ok", Err.Description)
  Err.Clear
  rs.Close
  conn.Close
  '************************************
  'ADODB.Connectionを開放
  Set conn = Nothing
  Set conn = CreateObject("ADODB.Connection") '再生成してみる
  '************************************
  conn.Open strConn
  rs.Open "select pg_backend_pid()", conn
  Debug.Print "(3).....PID:" & rs.Fields(0).Value
  '-----------------------
  conn.Execute "CREATE TEMP TABLE TTEST (fld1 integer,fld2 text);"
  '-----------------------
  Debug.Print IIf(Err.Number = 0, "create ok", Err.Description)
  Err.Clear
  rs.Close
  conn.Close　'　　<--広域変数にしcloseしないとセッションの再利用可能
```

### MYSQL接続

```
Sub test()

Dim con As ADODB.Connection
Dim rs As ADODB.Recordset

Dim connectionString As String
Dim sqlStr As String

Dim rowNo As Integer
Dim colNo As Integer
Dim item As Variant

'接続文字列
connectionString = "Driver={MySQL ODBC 5.1 DRIVER};" _
                & " SERVER=localhost;" _
                & " DATABASE=cocoadb;" _
                & " USER=root;" _
                & " PASSWORD=admin;"

'ADODB.Connection生成
Set con = New ADODB.Connection

On Error GoTo Err

'MySQLに接続
con.Open connectionString

'SQL文
sqlStr = "select * from ms_usr"

'SQL文実行
Set rs = con.Execute(sqlStr)

'シートデータクリア
Worksheets("Sheet1").Cells.Clear

rowNo = 1
colNo = 1

'RecordSetの終了まで
Do While rs.EOF = False

    'データ抽出
    For Each item In rs.fields
        Worksheets("Sheet1").Cells(rowNo, colNo).Value = item.Value
        colNo = colNo + 1
    Next
    colNo = 1
    rowNo = rowNo + 1

    '次のレコード
    rs.MoveNext
Loop

'クローズ
con.Close
Set rs = Nothing
Set con = Nothing

Exit Sub

Err:
    Set rs = Nothing
    Set con = Nothing
    MsgBox (Err.Description)

End Sub 
```
レキシカルスコープを使ったフィボナッチ数列の表示

Go言語

```go:fibonacci.go
package main
import "fmt"
func fibonacci() func() int {
    x, y, z := 0, 1, 0
    return func() int {
    	z, x, y = x, y, x+y
        return z
    }
}
func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}
```

R言語

```r:fibonacci.R
fibonacci <- function() {
	a <- c(0, 1, 0)
	function() {
		a[c(3,1,2)] <<- c( a[c(1,2)], a[1]+a[2] )
		return(a[3])
	}
}
f <- fibonacci()
for(i in 1:10) {
	cat( f(), "\n" )
}
```
【Excel】指定したセル範囲の文字列を連結する方法（区切りつき）

### ALT + F11でマクロを開いて

```
Function ConcatenateRangeText(objCells As Range) As String

  Dim objCell As Range
  Dim strRet As String

  For Each objCell In objCells
    If strRet = "" And objCell.Text <> "" Then
        strRet = "'" & objCell.Text & "'"
    ElseIf objCell.Text <> "" Then
        strRet = strRet & "," & "'" & objCell.Text & "'"
    End If
  Next

  ConcatenateRangeText = strRet

End Function
```
TextViewを１行に収める

singleLine と scrollHorizontally と ellipsize を設定する。

先頭を省略する。
例）…かきくけこさしすせそ

```xml 
<TextView
    android:id="@+id/start"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:scrollHorizontally="true"
    android:ellipsize="start"
/>
```

中間を省略する。
例）あいうえお…さしすせそ

```xml 
<TextView
    android:id="@+id/middle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:scrollHorizontally="true"
    android:ellipsize="middle"
/>
```

末尾を省略する。
例）あいうえおかきくけこ…

```xml 
<TextView
    android:id="@+id/end"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:scrollHorizontally="true"
    android:ellipsize="end"
/>
```
[iOS]アプリ内でYouTubeを再生する

UIWebViewを使うと、
iPhoneアプリで他のアプリを呼び出すことなく、
YouTubeの動画を再生出来るようです。

まず、YouTubeで再生したい動画の上で右クリックして
「埋め込みコードをコピー」します。
「動画のURLをコピー」だと上手くいかないので注意しましょう。

![スクリーンショット 0025-05-31 20.21.06.png](https://qiita-image-store.s3.amazonaws.com/0/20722/d3234020-0cfe-8d93-c64a-2c7e2ebf4171.png)

うまくコピーできると、次のようなiframeタグが得られます。
（URLの途中に"/embed/"とあれば上手くできてます。）

```html
<iframe width="640" height="360" src="http://www.youtube.com/embed/OW0S0zOJeR8?feature=player_detailpage" frameborder="0" allowfullscreen></iframe>
```


このタグのなかのsrcプロパティだけを使います。

UIViewController(self)のpropertyに、webViewという名前のUIWebViewがあるとき、
次のコードでYouTubeの再生が出来るようになります。
（変数urlは、上記のiframeタグのsrcプロパティをそのままコピーしてるだけ）

```objc
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL* url = [NSURL URLWithString:@"http://www.youtube.com/embed/OW0S0zOJeR8?feature=player_detailpage"];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}
```
Windows 8.1 が待ち遠しい！ 個人的に、UI操作性向上と、端末間の同期強化 が注目です。

Surface Pro の国内発売が発表され、
（しかも Office 2013 込み、記憶域拡大モデル！）

興奮冷めやらぬところに、またも嬉しいおしらせですね！

Windows 8 → 8.1 バージョンアップ。気になるところのメモです。

参考: [Windows 8.1 First Look!](http://blogs.technet.com/b/microsoft_japan_corporate_blog/archive/2013/05/31/windows-8-1-first-look.aspx)

Preview、コンシューマ向けの公開時期
==============================================
上記ブログ記事より抜粋

> 米国時間6月26日から始まる開発者向けカンファレンスBuild のタイミングで、Windows 8.1 の Public Preview 版を公開する予定

> Windows 8.1 は今年の後半に、コンシューマー向けのWindows ８に対してWindows ストアを通じて無償提供される予定

（個人的）注目アップデート
==============================================

UIカスタマイズが豊富に！
---------------------------------------------------------

* スタート画面、タイルの大小のバリエーションが増える
* スタート画面テーマの拡充、動きのあるものも

UIの操作性向上
---------------------------------------------------------

* スタート画面、__フィルター機能__ ！（名前、日付、頻度、カテゴリ）
 * (感想: これ欲しかったです！)
* スタート画面、すべてのアプリへのアクセスが簡単に（画面下からのスワイプ）

* __同じアプリを複数スナップ__して使えるように！
 * (感想: なんと！開発車泣かせかもしれませんねw)
* スナップ時、画面の幅が自由に変えられるように

アプリ
---------------------------------------------------------

* __アプリ更新が、バックグラウンドで更新__！
* (感想: これも開発車泣かせな…w)
* アプリ詳細ページにて、関連アプリも表示

Internet Explorer 11
---------------------------------------------------------

* __複数端末間で、タブを同期可能__ に！
* __タブ数無制限に__！
* タッチ機能強化


以上、気になる点でした～
もしミスリードや抜けがありましたら、すみません。詳細は上記の technet.net をご参照ください。
スタックアンダーフロー

謎なスタックアンダーフローに遭遇したので共有

```as3
switch (0) { case 1: { } break; }
trace("a");
```

**※実際は間に色んな処理があったが、最小で再現するところまで小さくした結果です。**

## 条件
* case 文の中に 空の ブロック({}) がある。
* case 文より後に trace がある。
* case 文が別メソッドにある場合、trace 文より行数的に前にあれば再現する。
* コンパイル時に Omit Trace(trace 文を削除する設定)を有効(True)にしてリリースコンパイル

もしかしたら FlexSDK のみかも、試してないからわかんない
git blameで「あ～、もっと過去があるじゃん、そこまでさかのぼってよ～」というときのtips

履歴が複雑になっているケースでは(過去にgit mvを何度もやったとか、svnからgitにプロジェクトを移管したとか)
`git blame`したときに、いちばん初めのコミットまでさかのぼって表示してくれない場合があります。

もっとさかのぼってYO!!

そんなときにgit blameをもっとさかのぼって見る方法。

## 結論
git blame （コミットハッシュ値） -- (ファイル名）

これで任意のリビジョンを起点にして、そこから過去をみることができます。

## 詳細

まず、普通にgit blameします。
`git blame hoge/file.php`

ここで見れた一番古そうなコミットハッシュ値(仮に`badcafe`とします)をメモします。

メモしたら、その１個前を起点にして過去にさかのぼります。

`git blame badcafe^ -- hoge/file.php`

これでも途中までしかさかのぼれなかったときは、さらにこの作業を繰り返します。

## PS
`--`が何を意味してるのかはよくわかりませんでした。
どなたがご存知でしたら教えてください。
WindowsでClojure環境構築した

# JDKのインストール

Javaが必要なのでJDKをインストールする必要がある。

*注意点*

*ここで、デフォルトのProgram Filesにインストールしてしまうと
パスの処理がうまくできなくてritz-replが起動できなくなるので
C:\Javaなどにインストールする。*

# Clojure(leiningen)のインストール

leiningenをインストールすればOK
https://github.com/technomancy/leiningen

Windowsだとleiningen.batにしておけばOK
自分の場合はcygwinでも使えるように通常のシェルスクリプトの方も
インストールしておいた。

# Mavenのインストール

nreplでmavenが必要なのでインストールしておく
http://maven.apache.org/


# 環境変数の設定

| 設定する環境変数 | 設定値 |
|:-----------|:------------|
|  JAVA_HOME   |   JDKインストールディレクトリ   |
|  MAVEN_HOME   |   MAVENインストールディレクトリ   |
| PATH | (JDKインストールディレクトリ)/binを追加 |
| PATH | (MAVAインストールディレクトリ)/binを追加 |
| PATH | (leiningenインストールディレクトリ)を追加 |
| CLASSPATH |  (JDKインストールディレクトリ)/lib/tools.jar |
|| (JDKインストールディレクトリ)/lib/sa-jdi.jar|
||.|

# nrepl + ritz-nreplのインストール

EmacsからM-x list-packagesで以下のパッケージをインストールする

- nrepl
- cojure-mode
- ritz-nrepl

設定を.emacs.d/init.elに追記する

```ecl:init.el
(require 'nrepl)
(require 'ac-nrepl)

(add-hook 'nrepl-mode-hook 'ac-nrepl-setup)
(add-hook 'clojure-nrepl-mode-hook 'ac-nrepl-setup)

(eval-after-load "auto-complete"
  '(add-to-list 'ac-modes 'nrepl-mode))

(defun set-auto-complete-as-completion-at-point-function ()
  (setq completion-at-point-functions '(auto-complete)))
(add-hook 'auto-complete-mode-hook 
  'set-auto-complete-as-completion-at-point-function)
(add-hook 'nrepl-mode-hook 'set-auto-complete-as-completion-at-point-function)
(add-hook 'nrepl-interaction-mode-hook 
  'set-auto-complete-as-completion-at-point-function)
(add-hook 'nrepl-interaction-mode-hook 'my-nrepl-mode-setup)
(defun my-nrepl-mode-setup ()
  (require 'nrepl-ritz))
```

leiningenにも設定追加が必要なので

```clj:~/.lein/profile.clj
{:user
 {:plugins [[lein-ritz "0.7.0"]]
  :dependencies [[ritz/ritz-nrepl-middleware "0.7.0"]]
  :repl-options {:nrepl-middleware
                 [ritz.nrepl.middleware.javadoc/wrap-javadoc
                  ritz.nrepl.middleware.simple-complete/wrap-simple-complete]}}}

```

以上で設定は完了。

# 動作確認

```shell-session 

lein new helloworld
```

として簡単なプロジェクトを作成してEmacsでhelloworld以下の適当なcljファイル(project.cljとか)を開く。

M-x nrepl-ritz-jack-in

でritz-nreplが立ち上がる。
FuelPHP1.6のComposerを使用してTwigを有効にする方法

FuelPHPの1.6に付属してくるcomposer.jsonを使ってTwigを利用しようとすると、そのままでは使用出来なくて困ったので書いておく。
キモはparser.phpのinclude指定だった。

#1. Twigのインストール

##require部分にtwigの設定を追加する

```js:composer.json
{
    "require": {
        "php": ">=5.3.3",
        "monolog/monolog": "1.5.*",
    	"fuelphp/upload": "2.0",
        "twig/twig": "1.13.0"
    }
}
```

##composerでインストールする

```
php composer.phar install
```

#2. Twigを有効にする

##設定を修正する

fuel/app/config/config.php

```php:config.php
return array(
    'always_load' => array(
        'packages'  => array(
            'parser',
        ),
    ),
);
```

##parserパッケージの使用準備を行う
fuel/packages/parser/config/parser.phpをfuel/app/config/ にコピーする

fuel/app/config/parser.php

```php:parser.php
return array(
    'extensions' => array(
        'twig' => 'View_Twig',
    ),
    'View_Twig' => array(
         'include' => dirname(APPPATH) . DS . 'vendor' . DS . 'twig' . DS . 'twig' . DS . 'lib' . DS . 'Twig' . DS . 'Autoloader.php',
    ),
);
```

#3. コントローラからtwigのビューを呼び出す

```php:hoge.php
class Controller_Hoge extends Controller
{
    public function action_index()
    {
        return \Response::forge(\View::forge('hoge/index.twig'));
    }
}
```
date_trunc('day', now())の落とし穴

'2013-05-31 00:00:00'というような、
「今日の日付（今日の0時）がほしいんだけど、、、」と思ったときにしょうもない落とし穴にハマってしまったので、
忘備録として。

「now()とかCURRENT_TIMESTAMPだと現在の日時になっちゃうし、
日時の一部を切り捨ててくれる関数ないかしら」と思い、
見つけたのがdate_trunc関数。

### date_trunc関数

http://www.postgresql.jp/document/8.3/html/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC

「おぉ、イイネ！（・∀・）ﾆﾔﾆﾔ」となり、早速実験。

`SELECT date_trunc('day', now());`

結果を見てみると
`2013-05-01 00:00:00+0`

ktkr！

と思ったのですが、、、

`SELECT CURRENT_DATE;`
でよかったorz

ちなみに今月頭（月初）の日付がほしいときは
`SELECT date_trunc('month', now());`
という風にしています。

|ω・｀)<そんなことせんでも、もっといい方法あるがな
というのがありましたら、ご教授ください。
【Sails.js 入門 - 03】Models その1

http://sailsjs.org/#documentation/models

# Models
多くの MVC フレームワークと同じように、Sails は、 どんなデータソースを使っていようともモデルとのやりとりを標準化するために ORM を提供する。 また、外部API、サポートされてないデータベース、インメモリストア (たとえばセッションストレージ)などからデータを取得するために、独自に作成したモデルとマッピングするインタフェースも定義できる。

## What is a Model?
モデルとは、データベースに保存されたデータの型を代表するものである。たとえば、MySQLをつかっているなら、モデルはひとつのテーブルに相当するものだろう。もし、MongoDB を使っているなら、モデルはコレクションに相当するだろう。 どちらの場合でも、私たちのゴールは、どんなタイプのデータベースにも依存することなく、シンプルでモジュール化されたデータ管理の方法を提供することである。

## How do I define a Model?
モデル定義は、属性(attributes)と関連(associations)を含む。

### Attributes

属性(attributes)は、モデルの基本的な情報である。たとえば、<code>Person</code>というモデルは、<code>name</code>, <code>phoneNumber</code>, <code>age</code>, <code>birthDate</code> <code>emailAddress</code> のような属性を持つかもしれない。<code>Person</code>の定義はこのようになるだろう。

```js:JSON
// Person.js
var Person = {
  name: 'STRING',
  age: 'INTEGER',
  birthDate: 'DATE',
  phoneNumber: 'STRING',
  emailAddress: 'STRING'
};

exports = Person;
```

データ型(type) は、基本は任意であり、DBが型をを必要とする時だけ付与する。'FLOAT' 'INT' 'STRING'

updatedAt createdAt

### defaultsTo

defaultsTo は、 モデル作成時に値が指定されないなら、この値をこの属性にセットする、というものである。

### Adapters

アダプタ(adapters) は、npm を使うか、プロジェクト内の <code>api/adapters</code>ディレクトリで定義することができる

アダプタはアプリケーション全体(グローバル)で上書きすることもできるし、モデルごとに異なるアダプタを関連付けることもできる。デフォルトのアダプタのアプリケーション設定の変更方法は、Configuration セクションを参照してほしい。

単一のモデルのアダプタを上書きするには、アダプタモジュールの名称を指定して、必要に応じて追加の設定情報を書けばいい。

たとえば、

```js:JSON
// api/models/User.js
module.exports = {

 adapter: 'sails-mysql',
 user: 'root',
 password: 'thePassword',
 database: 'testdb',
 host: '127.0.0.1',

 attributes: {

    // Simple attribute:
    name: 'string',
    email: 'string',
    phoneNumber: {
      type: 'string',
      defaultsTo: '555-555-5555'
    }
 }
};
```

私たちのグローバル設定では、ディスクにセットするようになっている。しかし、アダプタを上書きしたので、<code>User</code>モデルは、<code>sails-mysql</code>アダプタを利用してMySQLに保存されるようになる。

### Associations

関連(associations) は、 Sails.js ではまだ利用できない。しかしながら、ToDo リストでは優先度が高い。関連に関しては、#124 をウォッチしてほしい。
Emacs がちらつく原因を特定する

Emacs がちらつく原因の一つとして，重すぎるタイマーイベントが挙げられる．そのため，設定されているタイマーを調べることで Emacs のちらつきがどの Elisp によるものかを特定できる．

設定されているタイマーを調べるには，timer-list 変数を見ればいい． `M-: timer-list RET` と入力すると，以下のようなリストが見られる．

```
([nil 20904 15708 554749 0.05 popwin:close-popup-window-timer nil nil 206166]
 [nil 20904 15708 569395 0.05 popwin:close-popup-window-timer nil nil 268134]
 [nil 20904 15708 570716 0.05 popwin:close-popup-window-timer nil nil 569467]
 [nil 20904 15714 663646 60 ac-clear-variables-every-minute nil nil 293000]
 [nil 20904 15950 929196 300 savehist-autosave nil nil 142000]
 [nil 20904 19283 6108 3600 url-cookie-write-file nil nil 258000])
```

この例であれば，`popwin:close-popup-window-timer` 関数が原因であるということがわかるので，.emacs からこの関数を持つ Elisp のロード命令を除去したり，Elisp を修正することでちらつきを解決しよう．
１分でできる！AmazonEC2のmicroインスタンスでswap領域を作る

microインスタンスではデフォルトでswap領域が存在しないので自分で作る必要があります。
１分でできるのでさくっとやっちゃいましょう。

## 1GBのswap領域を作成する方法

rootで、

```
dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
swapon /swapfile
```

サーバ起動時に自動マウントされるように、/etc/fstab に以下を追記

```text:/etc/fstab 
/swapfile swap swap defaults 0 0
```

自動マウント確認のためにサーバを再起動

## 結果確認

topコマンドを叩いて下記のように`Swap:  1048568k total`と表示されていれば成功です！

```
top - 14:11:40 up 3 min,  1 user,  load average: 0.07, 0.04, 0.00
Tasks:  76 total,   1 running,  75 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    604944k total,   204632k used,   400312k free,    10228k buffers
Swap:  1048568k total,        0k used,  1048568k free,    90488k cached
```
Backbone.jsのsaveメソッドでサーバに送出されるContent-Typeヘッダーの中身がFirefoxだけ違う

XMLHttpRequestでサーバに対して送信するContent-Typeヘッダーの内容は、ブラウザにより以下の様に異なります。
サーバ側でContent-Typeヘッダーにより処理を振り分ける場合は、注意が必要です。

## ブラウザ毎の動作

* Chrome

  `Content-Type: text/plain`

* Firefox

  `Content-Type: text/plain; charset=UTF-8`

* IE10

  `Content-Type: text/plain`

* IE9

  `Content-Type: text/plain`

* IE8

  `Content-Type: text/plain`

* IE7

  未調査です。

## 関連情報

* <http://www.w3.org/TR/XMLHttpRequest/>

  仕様としてはFirefoxの動作も正しいようです。
Twitterのdirect_messages/new APIを使わずにDMを送信する

statues/update APIを利用し、
「d screen_name message」
のようなフォーマット(つまりリプライの@をd に置換したようなフォーマット)で投稿すると
通常のポストにはならず、ダイレクトメッセージとしてscreen_nameへ送信される。
Chef-client/Chef-soloのランリスト(run_list)書式大全

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

Opscode Chefではレシピをランリスト(run_list)としてコマンドラインクライアントに渡したり、Role等に記述します。

あれって結局どういう書式が有効なんでしょうかと思いまとめました。


## 有効な書式一覧

ｰ `recipe[recipe_name]`
- `recipe[recipe_name@1.0.0]`
- `role[role_name]`
- `recipe_name@1.0.0`
- `recipe_name`

引用元はは[こちらのソース](https://github.com/opscode/chef/blob/master/lib/chef/run_list/run_list_item.rb)、MasterなのでChef11ですね。


目を引くのは@ですね、実はランリストで直接バージョン指定ができるんですね。


## `recipe_name`について

さて、`recipe_name`を更に分解すると`cookbook_name::recipe_name`、または`recipe_name`という書式になります。
バージョン指定もつける時は、`mysql::default@1.2.1`のように@より前にレシピの名前をつければOKです。

## ちなみにsoloでは

@でのバージョンは無視されるようです？
ディレクトリを分けるという対応があります、soloならmetadata.rbの`name`はかぶってOK。
Compass の asset_cache_buster で付けるパラメータを MD5ハッシュに変更する


デフォルトのままだとタイムスタンプが使われるので、複数人でコンパイル済みCSSをバージョン管理している場合に余計な差分が発生してしまう。

config.rbに以下を追加。

```ruby:config.rb
asset_cache_buster do |path, file|
  if File.file?(file.path)
    Digest::MD5.hexdigest(File.read(file.path))[0, 8]
  else
    $stderr.puts "WARNING: '#{File.basename(path)}' was not found (or cannot be read) in #{File.dirname(file.path)}"
  end
end
```

```hoge.scss
p {
  background: image_url('hoge.png') no-repeat;
}
```

```hoge.css
/* before */
p {
  background: url('/images/hoge.png?1369971442') no-repeat;
}

/* after */
p {
  background: url('/images/hoge.png?b68b9eca') no-repeat;
}
```
OS Xログイン画面のキーボード配列を確実に変更する方法

##version 10.8.3で確認

OS Xのログイン時のキーボード配列は、初めて起動した際に設定したキーボード配列になり、  
この設定は、OS Xにログインした後のキーボード配列とは別の設定となっている。  
   
例えば、初めてOS Xを起動した際にQwertyの日本語を選択したとする。  
その後、ログインウィンドウではデフォルトで強制的にQwertyの日本語配列となってしまう。  


####ログインウィンドウのキーボード配列を変更する方法が、以下の方法。
> OS X:ログインウインドウでキーボード配列を変更する方法 
> http://support.apple.com/kb/HT4099?viewlocale=ja_JP

しかし、設定できなかった。  
選択はできるようになったが、Dvorakを選択しても明らかに打鍵してる内容がQwerty。

#完全にバグです。


----


##ログインウィンドウのキーボード配列を確実に変更する方法
Qwerty（使わないキーボード配列）を**全て削除**する。  
これで、Dvorak（使いたいキーボード配列）でログインできるようになる。


#Macのキーボード配列は本当にバグが多い！！

>この件はAppleにバグレポート済みです。
【Unity】UnityエディターをVisual Studioに変更

#UnityVSがmicrosoft社に買収されUnityVS(有料→無料)になりました。
http://unityvs.com

# Visual Studio Express 2012インストール

最近、Unityにちょーハマってしまいまいました。
Unityすごいです。物理運動の知識が薄くても簡単に物理運動の実装ができちゃいますね。
いろいろ試してみたところ、開発言語はC#ですることにして
エディターは何を選ぶかというとC#ならVisual Studio使えるじゃん?と思ったから
さっさと調べてみました。

> [Visual Studio Express 2012 for Windows Desktop](http://www.microsoft.com/visualstudio/jpn/downloads#d-express-windows-desktop "Visual Studio Express 2012 for Windows Desktop")をダウンロード

インストール完了後、30日以降も引き続き利用する場合は、プロダクトーキーが必要ですが、[登録](http://go.microsoft.com/fwlink/?linkid=257571&clcid=0x411)から登録すると無料でプロダクトーキーをもらえます。(ログイン必要)

> バッチファイルの生成

* Unityインストール先(僕はD:\Programs\Unity)のEditorフォルダにunity-executable.batファイルを生成(テキストファイル生成後、名前と拡張子をbatに変更すればOK)
* unity-executable.batの内容

```unity-executable.bat
Start "" %1
```

> Unity設定

* Unityの一番上のメニューバーから[Edit] ⇒ [Preferences]を選択
* [External Tools] ⇒ [External Script Editor] ⇒ [Browse] で、Unityインストール先\Editor\unity-executable.batを選択
* [Assets] ⇒ [Sync MonoDevelop Project]を選択するとUnity内のプロジェクトがVisual Studio Expressに開かれる。

これで設定は完了ですね。あと、確認は[Assets] ⇒ [Create]  ⇒ [C#Script]でC#ファイルを生成して
ダブルクリックするとVisual Studio Expressが立ち上がります。

> 多足

* ExpressとProの違いについてはこのサイトを参考になりそうです
http://202.16.132.23/unity3docsj/Documentation/Documentation/Manual/VisualStudioIntegration.html

* Visual StudioとUnityで直接つながるエディターもありました
http://unityvs.com/

* 改行の問題があるらしいです。
[ここ](http://naichilab.blogspot.jp/2013/05/unityvisual-studio-express-2012.html)の2回目以降を参考してください。
でも、まだそんな問題が起こってない;;

> 参考

http://naichilab.blogspot.jp/2013/05/unityvisual-studio-express-2012.html
http://unity.creator.ms/unity-018.html
Compassを使った環境ごとの画像URLの書き換え

Compassを使ってCSS内の画像パスを開発環境と本番環境で切り替える方法です。

```rb:config.rb
css_dir = "src/main/webapp/css/"
sass_dir = "src/main/webapp/scss/"
images_dir = "src/main/webapp/"
output_style = :compressed

DEV= 'http://dev.stat.example.jp/hoge/'
PRD = 'http://stat.example.jp/hoge/'

http_images_path = (environment == :production) ? PRODUCT : STAGING 
```

こんな感じで画像ファイルの配置先を指定します。

でscssの中で画像パスを記述する部分を下記のように記述します。

```scss 
@charset "UTF-8";
.bar {
    background: #0A7995 image-url("ratio20/images/hoge.png") no-repeat center center;
}
```

今までurl("hoge")と記述していた部分をimage-url("hoge")に変えると、compassが自動で環境に合わせたパスを追記してくれます。

```bash 
compass compile -e production --force
```
こんなコマンドで環境を指定します。

便利
Rails3 + HTML5 canvas の例

web 上でみつけた Rails3 + HTML5 canvas の例 を紹介します。

- http://kray.jp/blog/rails3-html5-canvas/ 　rails3 + html5 canvasでお絵かき投稿サイトを作ろう！  2011年11月14日

このページの内容を元に、自分で再構築中のものが以下にあります。
ソースコード：  https://github.com/katoy/rails-canvas
スクリーンショット  https://raw.github.com/katoy/rails-canvas/master/misc/screenshots/screen-001.png
![screen-001.png](https://qiita-image-store.s3.amazonaws.com/0/14958/de0d3730-238a-690e-ff61-aa7966d6a6ea.png)

再構築にあたり、次のような工夫を追加してみています。  
- coffeescript では クラス定義をしてみた。
- 一回だけの undo ではなく、無制限の undo を実装してみた。
- undo  だけでなく、redo も実装してみた。
- 描画するときのアルファ値も変更できるようにしてみた。


HTML5 の API を利用する クライアントページの例は net 上にたくさんあります。
Rails で HTML5 の API を利用する際に、ここで紹介したような小さなサンプルは参考になると思います。