OmniAICreator/Qiita-1.07M huggingface dataset:
Command Line で使用しているツールまとめ vol.8


##コマンドライン

コマンドラインは、コマンドラインインターフェイスの略で､CLIと言われることもあります。

コンピュータの黒い画面をイメージしてもらえれば、間違いありません｡

ここでは、私がコマンドラインで使用しているツールを紹介していきます。

##主要ツール

###なぜコマンドラインを使うのか

プログラムを作るために必要なツールは、3つほどあります。具体的には､以下の様なものです｡

①プログラミング言語

②エディタ

③コンパイラ

コマンドラインは､これらをシェルを通して呼び出すことができるため、便利なわけです｡ちなみに、コマンドラインは、シェルとターミナルで構成されていることが多いです｡

その他に使われるツールとしては､デバッガや各種コマンドがあります。

###オススメのサイト

コマンドラインで使用する主要ツールごとに､おすすめの個人サイトを紹介します｡

|ツール|サイト|
|---|---|
|Zsh|[mollifier delta blog](http://mollifier.hatenablog.com/)|
|Vim|[C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/)|
|PowerShell|[tech.guitarrapc.com](http://tech.guitarrapc.com/)|


###プログラミング言語

プログラミング言語を使って作る文章は、基本、IDEかEditor(エディタ)で書きます。

ここで、個人的にオススメな言語を紹介します。

|言語|解説|参考になるサイト|電子書籍|
|---|---|---|---|
|Python|Pythonは、非常に安定した言語です｡Ruby,Perlなどの言語と似ているので、自分の好きな言語を選ぶとよいでしょう。|[http://docs.python.jp/2.7/](http://docs.python.jp/2.7/)|[みんなのPython Webアプリ編](http://coreblog.org/ats/minpy-web-is-now-free-to-read/)|
|Scala|Scalaは、既存のJavaのプログラムと容易に連携させることができます。|[http://jp.scala-users.org/](http://jp.scala-users.org/)|[Scala で書く tetrix](http://eed3si9n.com/tetrix-in-scala/ja/index.html)|
|C++|C言語でできることは､C++でも出来ます｡凡用的な言語で、高速です｡|[http://ja.cppreference.com/](http://ja.cppreference.com/)|[C++11参考書：C++11の文法と機能](https://github.com/EzoeRyou/cpp-book)|
|Shell|Shellには、BashやZshがあります。カーネルとのやりとりに使用します｡シェルごとに文法が微妙に違うので､注意です。|[http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html](http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html)|[Linux標準教科書](http://www.lpi.or.jp/linuxtext/text.shtml)|
|CoffeeScript|CoffeeScriptのコードはJavaScriptのコードに変換されます。|[http://blog.h13i32maru.jp/entry/20120119/1326955300](http://blog.h13i32maru.jp/entry/20120119/1326955300)|[Smooth CoffeeScript](http://autotelicum.github.io/Smooth-CoffeeScript/)|
|Go|とても楽に書ける言語です。最近、流行っています｡|[http://golang.jp/](http://golang.jp/)|[The Go Tutorial](http://go-tour-jp.appspot.com/)|


ただし、初心者は言語そのものを学ぶという姿勢ではなく、作りたいものを見つけたあとで、そのためにベストな言語を選ぶというスタンスが良いのではないかと思います｡初心者である自分が言うことではないですが…。

なお、フリーの電子書籍は､以下のページでまとめられています｡

[free-programming-books](https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md)


##git
`git`は、バージョン管理システムのことです｡

初心者の方は､電子書籍が無料公開されているので、そちらの書籍を[ダウンロード](http://progit-ja.github.io/)して読んでみると良いかもしれません。
『プログラミングHaskell』の電卓をWindowsでも動くようにする

テキストのソースコードはOSがUnix系でないと動かない書き方になっていますが、次のように書き直せば、Windowsでも動くようになります。

```lhs:calculator.lhs
> import System.Console.ANSI
>
> cls                           :: IO ()
> -- cls                           =  putStr "\ESC[2J"
> cls                           =  clearScreen 
>
> type Pos                      =  (Int,Int)
> 
> goto                          :: Pos -> IO ()
> --goto (x,y)                    =  putStr ("\ESC[" ++ show y ++ ";" ++ show x ++ "H")
> goto (x, y) = setCursorPosition y x
```

`System.Console.ANSI`は`cabal install ansi-terminal`でインストールすれば使えるようになります。
超初心者向けRailsの覚え方（俺ver.）


--

###まずはこれ。
**Head First Rails ―頭とからだで覚えるRailsの基本**
http://www.amazon.co.jp/dp/4873114381

*一冊の本として読みやすいかと言われると疑問だが、とにかく図がいっぱいなので、パラパラ雑誌のような感覚で読んでほしい。ミニクイズも満載なので、友達と出題し合うとか。*

--

### それと併用して、次のどちらか。 
**Ruby on Rails 3 アプリケーションプログラミング**
http://www.amazon.co.jp/dp/4774146633

*ちょい古い。自分はこっち使った。HTML覚えるときにも使った*

**改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)**
http://www.amazon.co.jp/dp/4844331566

*新しい。自分は使ったことない。けど、上記本のレビューで進められてて、見に行ったらレビュー(2件)も悪くなかったから書いてみた。ただそれだけ。*

--

###最後に、これ。
**RailsCasts**
http://railscasts.com/

*自分が知りうる中で(Ruby以外も含めて)最高のスクリーンキャスト。英語に抵抗がなければ迷わずこれ。闇雲にググるよりも良い、中立かつ実践可能な答えが大抵得られる。*

*まず声に癒される。制作者のRyan Batesさんが絶賛バーンアウト中。だが、それは多分彼のまめな性格がたたったのだと思う。Ryan Batesさんに応援メッセージも送れるよ。https://www.ugtastic.com/railscasts/*

--
####番外編：HTML/CSS読めねー！って人はこちら。
**現場のプロから学ぶXHTML+CSS**
http://www.amazon.co.jp/dp/4839929734
enthumble キーカスタマイズ例 【開発者本人】

# <i class="fa fa-check-circle-o"></i> はじめに
## <i class="fa fa-check-square-o"></i> キーボード快適化ソフト | enthumble
[http://jp.enthumble.com/](http://jp.enthumble.com/  "enthumble")
使用頻度の高いキー操作を手もとで行えるようにする、簡単設定のカスタマイズソフト
Windows用フリーソフト | インストール不要 | 商用利用可 | 有料版はキーカスタマイズ可能
# <i class="fa fa-check-circle-o"></i> キーカスタマイズ例 【開発者本人】

## <i class="fa fa-check-square-o"></i>  Base Mode
![Picture HJKL.png](https://qiita-image-store.s3.amazonaws.com/0/1582/4488db29-e076-78f7-718d-5b59b372b519.png)

Base Modeは、HJKLを選択。

## <i class="fa fa-check-square-o"></i>  KeyList.ini
私のキー設定ファイル(./KeyList/HJKL.ini)の中身です。

```ini
[HowToUse]
Check=http://jp.enthumble.com
Name=enthumble version 3.0
[KEY]
Space={Enter}
Muhenkan={Esc}
Henkan={Esc}
Hiragana={shift down}{F10}{shift up} ;右クリックメニューの表示
F1={}
F2={}
F3={}
F4={}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={Volume_Mute}
F11={Volume_Down}{Volume_Down}
F12={Volume_Up}{Volume_Up}
F23={}
F24={}
1={F1}
2={F2}
3={F3}
4={F4}
5={F5}
6={F6}
7={vkF2sc070B}{vkF3sc029}''{left} ;記号で囲って、中へカーソル移動
8={vkF2sc070B}{vkF3sc029}(){left} ;記号で囲って、中へカーソル移動
9={vkF2sc070B}{vkF3sc029}(){left} ;記号で囲って、中へカーソル移動
0={F10}
-={F11}
Hat={F12}
\={vkF2sc070B}{vkF3sc029}{\}
Q={vkF2sc070B}{vkF3sc029}{1}
W={vkF2sc070B}{vkF3sc029}{2}
E={vkF2sc070B}{vkF3sc029}{3}
R={vkF2sc070B}{vkF3sc029}{4}
T={vkF2sc070B}{vkF3sc029}{5}
Y={vkF2sc070B}{vkF3sc029}{6}
U={vkF2sc070B}{vkF3sc029}{7}
I={vkF2sc070B}{vkF3sc029}{8}
O={vkF2sc070B}{vkF3sc029}{9}
P={vkF2sc070B}{vkF3sc029}{0}
@={vkF2sc070B}{vkF3sc029}{-}
LB={{}
A=^a
S=^s
D=^d
F=^f
G={HOME}
H={left}
J={down}
K={up}
L={right}
Semicolon={PgUp}
:={:}
RB={}}
Z=^z
X=^x
C=^c
V=^v
B={END}
N={Backspace}
M={shift down}{Tab}{shift up} 
,={Tab}
.={delete}
/={PgDn}
Backslash={vkF2sc070B}{vkF3sc029}{_}
Up=!{H}{F}{C}{END}{RIGHT}{RIGHT}{ENTER} ;Word・Excel・PPTにて、文色を赤に設定する
Down=!{H}{F}{C}{HOME}{ENTER} ;Word・Excel・PPTにて、文色を黒に設定する
Left=#^{left} ;左にある仮想デスクトップへ移動(Win10)
Right=#^{right} ;右にある仮想デスクトップへ移動(Win10)
LButton={ctrl down}{PgUp}{ctrl up}
MButton={MButton}
RButton={ctrl down}{PgDn}{ctrl up}
WheelUp={}
UWheeDown={}
PageUp={}
PageDown={}
Home={}
End={}
Delete={}
Bacspace={}
Enter={}
Escape={}
Hankaku={}
Tab={}
Capslock={}
Lwin={}
Rwin={}
Insert={}
```


# <i class="fa fa-check-circle-o"></i> リンク
こちらもご参照ください。

・[Readme 【説明書】](http://qiita.com/mhara/items/d2d072592a4db9243c99  "Readme 【説明書】") 
・[キーカスタマイズ【基本編】](http://qiita.com/enthumble/items/44064da2d77ddbd258b7  "キーカスタマイズ【基本編】")
・[キーカスタマイズ【応用編】](http://qiita.com/mhara/items/5ea8de992e8f99fce829  "キーカスタマイズ【応用編】")
・[キーカスタマイズ例 【開発者本人】](http://qiita.com/mhara/items/c666b487fbd06805527b  "キーカスタマイズ例 【開発者本人】")★現在のページ
・[キーカスタマイズ例 【ユーザー投稿】](http://qiita.com/tags/enthumble  "キーカスタマイズ例 【ユーザー投稿】")

以上
vagrant packageでエラー

```shell-session
% vagrant package
[default] Clearing any previously set forwarded ports...
A directory was not specified to package. This should never happen
and is a result of an internal inconsistency.
```
これはvagrant1.4.2のバグのようです。 1.4.3で修正されたようです。



issue: https://github.com/mitchellh/vagrant/issues/2739

パッチ: https://github.com/mitchellh/vagrant/compare/v1.4.2...v1.4.3

vagrantはまだまだ枯れてないようで、こういうのは覚悟しておいた方がよさそうですね。
agとackとptを全部入れて比較してみた

動かしたのはEC2のt1.mediumインスタンス。

まずはack

```
[ec2-user@***:~/golang]$ time ack my_ -l                                                                                                      (r:0 s:6 j:0)
doc/go_faq.html
src/pkg/html/template/escape_test.go
src/pkg/go/printer/testdata/declarations.golden
src/pkg/go/printer/testdata/declarations.input
src/pkg/debug/dwarf/testdata/typedef.c
src/pkg/debug/dwarf/type_test.go
src/pkg/syscall/types_linux.go
src/pkg/runtime/sys_darwin_386.s
src/pkg/runtime/sys_darwin_amd64.s
misc/cgo/test/issue4273b.c
ack my_ -l (real: 1.763 user: 1.384 sys: 0.252 cpu: 92% pf: 0)
```

次にag

```
[ec2-user@***-:~/golang]$ time ag my_ -l                                                                                                       (r:0 s:6 j:0)
doc/go_faq.html
src/pkg/html/template/escape_test.go
src/pkg/go/printer/testdata/declarations.golden
src/pkg/go/printer/testdata/declarations.input
src/pkg/debug/dwarf/testdata/typedef.c
src/pkg/debug/dwarf/type_test.go
src/pkg/syscall/types_linux.go
src/pkg/runtime/sys_darwin_386.s
src/pkg/runtime/sys_darwin_amd64.s
misc/cgo/test/issue4273b.c
ag my_ -l (real: 0.262 user: 0.128 sys: 0.128 cpu: 97% pf: 0)
```


```pt
ec2-user@ip-172-31-18-203:~]$ time pt my_ golang -l                                                                                                       (r:0 s:1 j:0)
golang/doc/go_faq.html
golang/misc/cgo/test/issue4273b.c
golang/src/pkg/debug/dwarf/testdata/typedef.c
golang/src/pkg/debug/dwarf/type_test.go
golang/src/pkg/go/printer/testdata/declarations.golden
golang/src/pkg/go/printer/testdata/declarations.input
golang/src/pkg/html/template/escape_test.go
golang/src/pkg/runtime/sys_darwin_386.s
golang/src/pkg/runtime/sys_darwin_amd64.s
golang/src/pkg/syscall/types_linux.go
pt my_ golang -l (real: 0.840 user: 0.576 sys: 0.256 cpu: 99% pf: 0)
```

だいたい１０倍くらいag速い。
PNGを圧縮したい！！！


PNG！容量でかい！！
圧縮したい時ってありますよね！！！
こういうときとか！！！！！！

> ファイルサイズは，1MB以内としてください．
> <cite>[原稿送信要項｜講演申込・原稿送信 ｜情報処理学会 第76回全国大会](http://www.ipsj.or.jp/event/taikai/76/paper_require.html)</cite>


うわああああああああ▂▅▇█▓▒░(‘ω’)░▒▓█▇▅▂
このNexus 5のスクリーンショット2MBあるゥゥゥゥゥゥ…

ってときに役に立つのが[**pngquant**](http://pngquant.org/)さん．
PNGを容赦なく圧縮してくれます．慈悲はない．

# pngquant
## インストール

Macユーザかつ[**homebrew**](http://brew.sh/)ユーザなら一発インストールできます．

```bash:console
$ brew install pngquant
```
## つかいかた

```bash:console
$ pngquant —-ext _.png -—quality=60-80 —-speed 1 -—iebug 256 img/*.png

# pngquant 品質（0〜256，デフォルト256） ファイルパス（ワイルドカード可）

# —-ext new.png
# 出力ファイル名のサフィックス
# （_.pngならhoge.pngがhoge_.pngになる）
# デフォルトでは -or8.png か -fs8.png になる

# —-quality min-max
# 変換品質（0〜100）

# —-speed N
# 変換速度（1がきれい遅い，10が早い雑い，デフォルトは3）

# —-iebug
# IE6に対応させる？
```

### 例
```bash:console
$ pngquant —ext _.png img/*.png
# img以下のpngファイルを全て圧縮後，”元のファイル名_.png”として保存
```

画像はおもすぎるので載せませんが，2MBあったスクリーンショットが622KBになりました．
助かった…

# 参考
- [pngquant](http://pngquant.org/)
コルーチンを補助するco-gateモジュールを公開しました．

[co(koa.js)は中で何をしているのか．](http://qiita.com/nashibao@github/items/5bab9744c26f74c1aa0d)の続き．

co用のゲートモジュール[co-gate](https://github.com/nashibao/co-gate)を公開しました．
[visionmedia/co](https://github.com/visionmedia/co)を使うと、非同期APIを同期的に使うことが出来るのは、今までのエントリに書いた通りです．
ただ、ThunkやPromiseにAPIを書き換えなければいけません．

そこで`co-gate`では、非同期APIのコールバックをゲートに入れて（`gate.in()`）、同期的にゲートから出す（`gate.out()`）ことで、従来型のAPIをそのままで使うことが出来るようにしています．

```js
// require co
var co = require('co')
  , Gate = require('co-gate')
  , fs = require('fs');
 
 
co(function *(){
  // create gate
  var gate = new Gate()
    , val = undefined;
 
  // just call normal apis with gate.in() as callback
  fs.readFile("test/test1.txt", "utf-8", gate.in());
  fs.readFile("test/test2.txt", "utf-8", gate.in());
 
  try{
    // yielded
    val = yield gate.out();
  }catch(e){
    console.log(e);
  }
 
  assert.equal(val[0], 'test1');
  assert.equal(val[1], 'test2');
 
})();
```

このモジュールは[Go風のチャンネルモジュール](http://golang.org/doc/effective_go.html#channels)である[chan](https://github.com/brentburgoyne/chan)に発想を得ています．興味のある人はchanと見比べてみると面白いと思います．
アジャイル開発のポイント

個人的な感想です。

1. 機能追加するたびに、素早く動けるものを実装し、ユーザーに見せる
2. テスト自動化
3. ソースコード中心（簡単な設計、ドキュメントを最低限に)
4. プロセス管理を簡単に
AV Foundationを使った動画編集(Asset)

`QTKit`がMavericksから廃止され、動画編集等では`AV Foundation`を使う必要がでてきた。
基本的な使い方はiOSとOS Xでほとんど変わらないが、今回はOS Xの場合。

# 参考になるもの
* [Transitioning QTKit Code to AV Foundation](https://developer.apple.com/library/mac/technotes/tn2300/_index.html#//apple_ref/doc/uid/DTS40012852) - Apple公式。`QTKit`経験者用。
* [AV Foundation Programming Guide](https://developer.apple.com/library/mac/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html) - 微妙に情報古いか間違ってる箇所があるような希ガス

# Asset
まずは、`Asset`について理解する。

## Assetって
`mov`ファイルの内容とか、`Photo Library`の写真とか、アプリ内で使う素材は`Asset`という単位で扱う。
分かりにくければ、最初はとりあえずファイル単位だと考えておいてもあまり問題ない。

## Assetの読み込み
### ファイルからAssetを作る
`AVURLAsset`クラスを使って、指定した`URL`の内容からAssetオブジェクトを作れる。

```objc:「ファイルを開く」で選んだmovファイルからAssetを作成
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
openPanel.allowedFileTypes = @[@"mov"];
[openPanel beginWithCompletionHandler:^(NSInteger result) {
    if (result == NSOKButton) {
        AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:openPanel.URL options:nil];
    }
}];
```

`options`は後で複雑な編集をするタイミングで必要になるが、ここでは`nil`でおk。

## Assetの書き出し
`AVAssetExportSession`を使うと、非同期でAssetの内容をファイルに書き出すことができる。

### 出力オプション

`AVAssetExportSession`を使ってファイルに出力する際には、出力オプションを指定する。
AV Foundation Programming Guideでは例として`AVAssetExportPresetLowQuality`をハードコーディングで指定しているが、どうやらOS Xではこれは存在しない模様。

なので、今回は代わりに`AVAssetExportPresetAppleM4ViPod`を指定してみる。

```objc:ExportSessionを作る
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:self.asset presetName:AVAssetExportPresetAppleM4ViPod];
```

※ちなみに、使用可能なプリセットの一覧は`exportPresetsCompatibleWithAsset:`で取得できる。

### 出力先/フォーマット
出力先のファイルは`outputURL`プロパティで指定する。

```objc:「保存する」ダイアログで選んだ先に出力するためのAVAssetExportSessionを作る
NSSavePanel *savePanel = [NSSavePanel savePanel];
savePanel.allowedFileTypes = @[@"m4v"];
[savePanel beginWithCompletionHandler:^(NSInteger result) {
    if (result == NSOKButton) {
        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:self.asset presetName:AVAssetExportPresetAppleM4ViPod];
        exportSession.outputURL = savePanel.URL;
    }
}];
```

次に、出力フォーマットを選択する。ここは出力オプションで指定したプリセットの内容とあわせておかないとエラーになるので、今回の場合は`AVFileTypeAppleM4V`を指定。

```objc:出力フォーマットはm4v
exportSession.outputFileType = AVFileTypeAppleM4V;
```

### 出力
`exportAsynchronouslyWithCompletionHandler:`メソッドを呼ぶと実際に処理が始まる。
名前の通り非同期で行われる。使い方は読み込みで使った`loadValuesAsynchronouslyForKeys:completionHandler:`と似ている。

```objc:出力する
[exportSession exportAsynchronouslyWithCompletionHandler:^{
    switch (exportSession.status) {
        case AVAssetExportSessionStatusCompleted:
            NSLog(@"Completed.");
            break;
        case AVAssetExportSessionStatusFailed:
            NSLog(@"Export failed: %@", exportSession.error.localizedDescription);
            break;
        default:
            break;
    }
}];
```

# 次は
`Asset`の読み込み/出力がわかったら、[次はCompositionについて](http://qiita.com/croquette0212/items/8912053e616e575a4d4a)。
Windows 7をLinuxのVirtualBoxで動かすまで

# 物理ディスクを仮想化（vhd）
仮想マシンに直接インストールする場合はもちろん不要。

[Disk2vhd - TechNet - Microsoft](http://technet.microsoft.com/ja-jp/sysinternals/ee656415.aspx) を使用する。

* Use vhdx のチェックを外す。（VirtualBoxではvhdxに書き込めない。 ）
* 仮想化した先の環境でのライセンスが必要。
* vhdx の作成先は、変換中のローカルボリュームとは別にするのが無難。
* 500GBで10時間くらい。
* 作成したvhdファイルを、ホスト側から見える場所に置いておく。

![Disk2vhd.png](https://qiita-image-store.s3.amazonaws.com/0/27531/f1495f9d-2be0-0265-d681-da9fb066f94a.png)

# VirtualBoxをインストール

サイト: [VirtualBox.org](https://www.virtualbox.org/)
## 本体
Linux Mint 16 64bitの場合は下記をダウンロード。
> Downloads > Ubuntu 13.10 ("Saucy Salamander") > AMD64

`sudo gdebi virtualbox-4.3_4.3.6-91406~Ubuntu~raring_amd64.deb`

Direct3D機能のインストールはお好みで。

## ユーザをグループvboxusersに追加
**これをやらないと、USBが使えない。**
`sudo gpasswd -a xxx(あなたのユーザ) vboxusers`

## VirtualBox Extension Pack
> Downloads > All supported platforms

VirtualBoxを起動して、 [ファイル] > [環境設定] > [機能拡張] からインストールする。

![VirtualBox_ExtPack.png](https://qiita-image-store.s3.amazonaws.com/0/27531/16b7afc5-c8c6-8e3a-158f-d92837450c68.png)

## 仮想マシンを作成

* プロセッサー数は1にする。（1にしないとUSBが使えない・・・。プリンタだけかも。）
* (Disk2vhdで作成した場合)仮想ディスク（VHD）は、IDEコントローラに接続する。（SATAだとブルースクリーン）
* 使いたいUSB機器をホストに接続して、USB デバイスフィルターに追加する。

![VirtualBox_System.png](https://qiita-image-store.s3.amazonaws.com/0/27531/7e72419e-ef26-2e98-7704-13124d6cda65.png)
![VirtualBox_Storage.png](https://qiita-image-store.s3.amazonaws.com/0/27531/746a4564-4ac0-aab5-5855-a295ab7820d2.png)
![VirtualBox_USB.png](https://qiita-image-store.s3.amazonaws.com/0/27531/eb2a1e6e-bb9b-282d-82f1-fd8d5d62bb80.png)

### 補足
USBはホスト側にドライバがなくてもOK。
iOS7デバイス（iPhone5など）をつなぐと、「デバイス"xxx"はロックされています。デバイスのパスコードを入力し、"もう一度試す"を」クリックしてください。」と表示される。
→無限に続くので「キャンセル」する。

## Guest Additionsをインストール
Windowsをセーフモードで起動してインストールしないとうまく行かないみたい。
画面解像度でFull HDなどの高解像度は、Host(右Ctrl)+Fでフルスクリーンにしないと選べないようです。（VirtualBoxのウィンドウを広げれば良いのですが。）

## USB機器を使う場合
画面上部のメニューから [デバイス] > [USBデバイス] から目的の機器を選択すると、ゲストPCに接続される。
![USB_Devices.png](https://qiita-image-store.s3.amazonaws.com/0/27531/ae15baca-9fdf-2f07-e524-89ee2a7d6167.png)
ARC環境下でAVAudioPlayerを使い柔軟かつシンプルにサウンドを再生する方法

ARC環境下では、以下のコードでサウンドは再生されません。

```objc 
- (void)playSound{
    NSString *soundPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"hogehoge.mp3";
    NSURL *urlOfSound = [NSURL fileURLWithPath:soundPath];

    AVAudioPlayer* player = [[AVAudioPlayer alloc] initWithContentsOfURL:urlOfSound error:nil];
    [player setNumberOfLoops:0];
    player.delegate = (id)self;
    [player prepareToPlay];
    [player play];
}
```

なぜなら、メソッドの終了後にplayerのメモリが解放されてしまうからです。
retainをして参照カウントを上げようにも、ARC環境下ではretainは使えません。
この問題に対処するために、AVAudioPlayerのインスタンスをメンバ変数にしようとしても、再生するサウンドの数だけAVAudioPlayerのインスタンスの宣言が必要になり、柔軟なシステムにはなりません。

そして、メンバ変数の場合は同じAVAudioPlayerのインスタンスを再生すると一度それまで同じインスタンスで再生されていた音が停止してから音が再生されるため、音を重ねることが苦手です。
楽器アプリや音ゲーなどで音を再生する際は、音をいくらでも重ねられた方が、自然に聞こえます。

この問題に対処するには、メソッド内で宣言したAVAudioPlayerのインスタンスを、メンバ変数の配列に格納してやればいいことになります。
サウンドの再生が終了したタイミングで、配列からAVAudioPlayerのインスタンスを削除してやることで、メモリが解放されるのでメモリが圧迫されることもありません。
以下、上記を１つのクラスにまとめたサンプルコードです。

```objc:SEManager.h
#import <Foundation/Foundation.h>

@interface SEManager : NSObject{
    NSMutableArray *soundArray;
}

@property(nonatomic) float soundVolume;

+ (SEManager *)sharedManager;
- (void)playSound:(NSString *)soundName;

@end
```

```objc:SEManager.m
#import "SEManager.h"
#import "AVFoundation/AVFoundation.h"

@implementation SEManager

static SEManager *sharedData_ = nil;

+ (SEManager *)sharedManager{
    @synchronized(self){
        if (!sharedData_) {
            sharedData_ = [[SEManager alloc]init];
        }
    }
    return sharedData_;
}

- (id)init
{
    self = [super init];
    if (self) {
        soundArray = [[NSMutableArray alloc] init];
        _soundVolume = 1.0;
    }
    return self;
}

- (void)playSound:(NSString *)soundName{   
    NSString *soundPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:soundName];
    NSURL *urlOfSound = [NSURL fileURLWithPath:soundPath];

    AVAudioPlayer* player = [[AVAudioPlayer alloc] initWithContentsOfURL:urlOfSound error:nil];
    [player setNumberOfLoops:0];
    player.volume = _soundVolume;
    player.delegate = (id)self;
    [soundArray insertObject:player atIndex:0];
    [player prepareToPlay];
    [player play];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    [soundArray removeObject:player];
}

@end
```

どのクラスからでもアクセスできるように、シングルトンにしてみました。
実際に他のクラスから音を再生する際は、SEManagerをimportした上で以下のように書きます。

```objc
    [[SEManager sharedManager] playSound:@"hogehoge.mp3"];
```

GitHubにサンプルコードを置いておきますね。
https://github.com/yukinaga/SEManager
SEManagerを使うことで、シンプルな実装で音がいくらでも重なって再生されますのでお試しください。

拙作『ちんあなごのうた 南の海の音楽祭』では、SEManagerを活用して柔軟かつシンプルなサウンドの管理を実現しています。
もしご興味があれば、ぜひ遊んでみてください。
https://itunes.apple.com/jp/app/chinanagonouta-nanno-haino/id611600816?mt=8
Pythonメモ：変数に変数を代入したときの謎

例えばこんな感じ。数値や文字列では想定通りの結果になる。

```py
#### 数値 ####
num = 1
ber = num
num += 1
print(num)  # 2
print(ber)  # 1

#### 文字列 ####
te = "a"
xt = te
te += "b"
print(te)  # ab
print(xt)  # a
```

しかし配列だと、

```py
#### 配列 ####
li = [1,2]
st = li
li.append(3)
st.append(4)
print(li)  # [1,2,3,4]
print(st)  # [1,2,3,4]
```

**一方を更新すると他方も更新されていることから、これらは互いに同じオブジェクトであることが分かる。**
つまり上記の```st = li```が意味しているのは、```li```と名付けられたそのオブジェクトが```st```という名前でも参照できるようになったというだけのことなのだろう（わざわざそんなことをする必要があるのかは分からないが）。
既存WebアプリケーションもJenkinsで自動デプロイしたい！（概要編）

IT現場における「新3種の神器」とも呼ばれるようになった「Jenkins」を、私も使いこなしてみたいと思っていました。

私の身近なところで、Jenkinsを使って効率化したいと思うシステムは、少々古くなったWebアプリケーションで、手動での独自運用手順が確立されているようなシステムです。デプロイも手動で行います。
このようなシステムは、運用者が長年かけて工夫し、頑張っていて、それなりに安定稼働の実績を積み上げていたりします。
苦労して積み上げてきた実績があるので、運用を変えることは難しかったりします。

もし、既存の運用を変えずに、運用者が頑張らなくても、誰でも、簡単に自動デプロイできたら、いいな～なんて思い、実現方法を考えてみました。

# 対象とするシステム
次のようなWebアプリケーション、環境、運用方法のシステムに対して、自動デプロイを検討します。

Webアプリケーション

- Java 1.4（JSP/Servlet）
- 画像ファイルあり（環境に依存するファイル、依存しないファイルあり）
- 設定ファイルあり（環境に依存するファイル、依存しないファイルあり）

環境

- 開発環境：Windows、Eclipse
- テスト環境：Linux/Unix、Tomcat4.1
- ソース管理：Subversion

デプロイに関する特殊運用

- Eclipseでビルドする。build.xmlなし。既存ソース管理に、build.xmlなどのビルド用のファイルは含めたくない。
- WAR/EARを使わず、JSPやclassファイルを変更のあったファイルだけ、FTPで配布する。
- Webアプリケーションの設定ファイルについて、テスト環境用の設定値は、テスト環境で直接編集する。バージョン管理されていない。

# 自動デプロイの課題
上記システムを自動デプロイするうえで、難しいのは、「特殊運用」の扱いで、次のような課題があると思いました。

- ビルド用ファイルの管理方法を検討する。
- JSP/classファイル単位で配布するため、JenkinsのDeploy war/ear Pluginがつかえない。このプラグインを使えれば、ファイルの配布と、Tomcat再起動を簡単に行えるのに、別途方法を考えなければならない。
- テスト環境で直接編集している設定ファイルは、デプロイ元の環境に存在しないので、どうしたら良い？

# 解決案
上記課題について、自分なりに解決案を考えてみました。（ただし、この解決案は、正しくないとこととして理解しています。正しくは、自動デプロイしやすいように運用を見直すことだと思います。）

- ビルド用ファイルは、開発環境のローカルディスクに、Subversionリポジトリを作成して管理することにする。
- ファイルの配布は、AntのFTPタスクを使用する。FTPはJenkinsのプラグインでも可能で便利ですが、今回は、試行錯誤ビルド・デプロイを繰り返すことになるため、コマンドラインからも実行できたほうが便利だと思い、Antを使うことにします。
- 変更のあったファイルのみを配布するには、独自スクリプトを作成して対応する。
- Tomcatの再起動は、TomcatのAntタスクを使う。
- テスト環境で直接編集している設定ファイルは、自動デプロイをあきらめる。（本当は、運用を変えて、テスト環境で直接編集することは止めるべきだと思います。）

上記解決案について、サンプルWebアプリケーションを用意して、実現可能であることを確認済みです。
今後、気が向けば、解決案を実践してみた内容を具体的に、記述したいと思います。
~/.ssh/configをすこし短く書きたい

Hostの行はスペース区切りで書けることを知ったので少し短く書けるようになった。

```diff:1つのHostNameに対して複数の指定の仕方
-Host mainpc
-    HostName 192.168.12.2
-Host nucpc
-    HostName 192.168.12.2
-Host vm1
-    HostName 192.168.12.3
-    IdentityFile ~/.ssh/vm/id_rsa
-Host vm2
-    HostName 192.168.12.4
-    IdentityFile ~/.ssh/vm/id_rsa
+Host mainpc nucpc
+    HostName 192.168.12.2
+Host vm?
+    IdentityFile ~/.ssh/vm/id_rsa
+Host vm1
+    HostName 192.168.12.3
+Host vm2
+    HostName 192.168.12.4
```
Railsの忘れっぽいあれをメモ

RubyやRailsであれをするにはどうするんだっけ...と自分の中でググり直すコードをメモ

###each_with_indexでindexの他にkeyとvalueも取りたい

```rb
ary.each_with_index do |(key,value) i|
  puts hoge
end
```

###each_with_indexでindexの初期値を変えたい

```rb
ary.each.with_index(1) do |(key,value) i|
  puts hoge
end
```

###htmlが含まれた変数をエンコードせずに表示したい

```rb
<%= raw hoge %>
```

または

```rb
<%== hoge %>
```

独自ヘルパー等で値を渡すときは

```rb
hoge.html_safe
```

逆に、htmlエンコードしたいときは

```rb
ERB::Util.html_escape(hoge)
```

###環境判定

dev環境か否か

```rb
if Rails.env == 'development'
  puts 'devです'
end
```

本番ならproduction
テストならtest

と指定すればOK
Pythonメモ：isを使った比較について

"=="とは若干意味合いが異なるらしい。"is"のほうは型も含めての厳密一致とのこと。

```py
print(1 == True)  # True
print(1 is True)  # False
```

あと、配列同士の比較でも違いが見られる。

```py
li = [1,2,3]
st = [1,2,3]
print(li == st)  # True
print(li is st)  # False
```

そういえば以前Javascriptで同じような投稿をしたことがあった。
http://qiita.com/juniskw/items/4a1f4d91fdf759e6a3da

二つの配列は値が同じでもオブジェクトとしては別物らしいので、その違いが出ていると思われる。
"=="は単純に値を比較していて"is"はオブジェクトそのものを比較しているということだろうか？

というか初めて気が付いたのだが、同じ"=="でもPythonとJavascriptでは微妙に意味が違うっぽい。
co(koa.js)は中で何をしているのか．

qiita投稿テスト．[元エントリ](http://nashibao.tumblr.com/post/72506303958/co-koa-js)

[node.jsはasyncの夢を見るか？](http://nashibao.tumblr.com/post/72499273371/node-js-async)の続き．

[co](https://github.com/visionmedia/co)のようなモジュール（他にも[ここ](https://github.com/creationix/gen-run)とか[ここ](https://github.com/mozilla/task.js)とか）がどのような形で実装されているのか知りたいのは僕だけでは無いと思う．理解のために出来る限り単純化してみた．

```js
var co = function(fn){
  // callback
  var done = function(val){
    // yieldに値を流し込む
    gen.next(val);
  }
  // make a generator
  var gen = fn(done);
  // start
  gen.next();
};
 
// test
// 0~4までをディレイ付きで表示する
co(function*(done){
  for(var i=0;i<5;i++){
    var val = yield setTimeout(function() { done(i); }, 500);
    console.log('val: ', val);
  }
});
```
[gist](https://gist.github.com/nashibao/8293370)

<script src="https://gist.github.com/nashibao/8293370.js"></script>

このコードでは`co()`のスコープ内で呼ばれた`done(val)`の引数を`gen.next(val)`でyieldの返り値として渡している．そのため、`done(val)`が呼ばれるまで待つ挙動を実現出来る．

このままでは、`done`を常に引数で渡さなくてはいけないし、ジェネレータのネストや並列実行に対応出来ない．これらを実装した最終コードは
[co.js](https://gist.github.com/nashibao/8280748)に置いておいた．こちらも`co`関数自体は50行ほどで書いてあるので、理解しやすいと思う．
（[visionmedia/co](https://github.com/visionmedia/co/blob/master/index.js)とはココロは同じだけれど、実装はかなり違うのでご了承下さい．あくまで勉強用です．特に並列実行は返り値の順番が適当だったりします．）

#### 補足

僕はC++やObj-C出身のエンジニアなので、こういう非同期周りは泥臭いイメージしか無かった．Win8のシンポジウムでC#のasyncについて聞いた時は、激しく興奮した覚えがあったけれど、それがnode.jsのシンプルなジェネレータで簡単に実装できるというのは素晴らしいな、と思う．またこれでnode.jsがひとつ好きになった．

yieldシリーズ、次はchanについて書いてみる．
proj.4で経緯度からいきなりWebメルカトルのピクセル座標やタイル座標を出す方法

ピクセル座標を出す場合、ズームレベルをzとして、座標系定義({}の中は計算結果の定数を入れる)

```text:proj4定義
+proj=merc +a={Math.pow(2,z+7) / Math.PI} +b={Math.pow(2,z+7) / Math.PI} +lat_ts=0.0 +lon_0=0.0 +x_0={Math.pow(2,z+7)} +y_0=-{Math.pow(2,z+7)} +k=1.0 +axis=esu +units=m +nadgrids=@null +no_defs
```

で定義し、epsg:4326との間で変換してやればよい。
もちろん、結果は小数点座標で出るので、整数が必要であればfloorする事。

gdal2tilesに通す場合は、+axis定義が効かないので、ワールドファイルで

```text:ワールドファイル定義
1.0
0.0
0.0
-1.0
0.0
0.0
```

を指定してやって対処。

タイル座標を出す場合、同様に、

```text:proj4定義
+proj=merc +a={Math.pow(2,z-1) / Math.PI} +b={Math.pow(2,z-1) / Math.PI} +lat_ts=0.0 +lon_0=0.0 +x_0={Math.pow(2,z-1)} +y_0=-{Math.pow(2,z-1)} +k=1.0 +axis=esu +units=m +nadgrids=@null +no_defs
```

で望む座標系定義が得られる。
go言語のchannelでムダに竹内関数をまわす


channelの勉強がてら、竹内関数の入出力をチャンネル経由にする

```go

func Tak(x, y, z int) int {
    if x <= y {
        return y
    }
    return Tak(Tak(x-1, y, z), Tak(y-1, z, x), Tak(z-1, x, y))
}

```
竹内関数とはこんな感じのもの。
やたらとたらいまわされる。

これをひとつひとつチャンネル経由にしたらどうなるか
さらにたらいまわされるに違いないということで、やってみた。

名前は **タケちゃん**関数


```go
package main

import (
    "fmt"
)

func Tak(x, y, z int) int {
    if x <= y {
        return y
    }
    return Tak(Tak(x-1, y, z), Tak(y-1, z, x), Tak(z-1, x, y))
}

func v2c(v int) chan int {
    e := make(chan int)
    go func() { e <- v }()
    return e
}
func Takechan(xc, yc, zc chan int) chan int {
    emitter := make(chan int)
    go func() {
        x, y, z := <-xc, <-yc, <-zc
        if x <= y {
            emitter <- y
            return
        }
        emitter <- <-Takechan(
            Takechan(v2c(x-1), v2c(y), v2c(z)),
            Takechan(v2c(y-1), v2c(z), v2c(x)),
            Takechan(v2c(z-1), v2c(x), v2c(y)))
    }()
    return emitter
}

func main() {
    fmt.Println(<-Takechan(v2c(14), v2c(6), v2c(5)))
    fmt.Println(Tak(13, 6, 5))

}
```

そこそこ早くうごいた。goroutineすごい。
そんじゃーね。
ディレクトリ内の全Excelファイルの特定セルをRubyで書き換える

```rb
# encoding: utf-8

require 'win32ole'

if ARGV.length != 4 then
  abort "引数の数が正しくありません。\nruby edit_iraisho.rb 対象ディレクトリ 対象シート 対象セル 値"
end

@src_dir, @target_sheet, @target_cell, @value = ARGV

@src_dir = @src_dir.gsub(/\\/) {'/'}
p @src_dir
begin
  excel = WIN32OLE.new('Excel.Application')
  excel.visible = false
  
  Dir.glob(@src_dir + '/*.xlsx') do |f|
    f = File.expand_path(f)
    wb = excel.Workbooks.Open(f)
    sh = wb.Worksheets.Item(@target_sheet)
    sh.Range(@target_cell).Value = @value.encode('utf-8', 'cp932')
    wb.Save
    wb.close
  end
ensure
  excel.Quit
end
```
git submodulesで間違えて追加したときの削除手順

先日間違えてgit submodule add してしまったのでコミットする前に全部削除して再度```git submodule add``` しようとしたら

```shell-session:console
A git directory for 'git-tools/git' is found locally with remote(s):            
  origin        https://github.com/git/git.git                                  
If you want to reuse this local git directory instead of cloning again from     
  https://github.com/git/git.git                                                
use the '--force' option. If the local git directory is not the correct repo    
or you are unsure what this means choose another name with the '--name' option.  
```

と言われ，はまったのでメモ

# 手順
1. .gitmodulesから対象のモジュール情報を削除する
2. .git/configのモジュール情報を削除する
3. とってきたリポジトリを削除する
4. .git/modules/以下にあるsubmoduleでとってきたリポジトリを削除する

以上です．
以後はまりませんように
AWSのMulti-Factor Authenticationでより安全に

ユーザー名とパスワード（第 1 の要素、つまりユーザーが知っているもの）の他に、AWS MFA デバイスからの認証コード（第 2 の要素、つまりユーザーが持っているもの）を入力することでアクセスをより安全にできる。

詳細:http://aws.amazon.com/jp/iam/details/mfa/

アプリの仮想 MFA デバイスで認証コードが作成できる。

| デバイス | アプリ | 
|:-----------|:------------|
| Android	| AWS Virtual MFA、Google Authenticator |
| iPhone	| [Google Authenticator](http://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8) |
| Windows Phone	| Authenticator |
| Blackberry	| Google Authenticator |
詳細:http://aws.amazon.com/jp/iam/details/mfa/

##iPhone版の場合
1.アプリをダウンダウンロードしておく
![スクリーンショット 2014-01-13 00.29.08.png](https://qiita-image-store.s3.amazonaws.com/0/14635/f83ada27-4b0f-990a-dd86-3532da23fe91.png)

↑をダウンロード

2.https://console.aws.amazon.com/iam/home を開く

3.Manage MFA Deviceボタンをおす
![スクリーンショット 2014-01-13 00.32.06.png](https://qiita-image-store.s3.amazonaws.com/0/14635/38b04022-9e49-5ea0-1767-eb789f9d6918.png)

4.A Virtual MFA devive選択
![スクリーンショット 2014-01-13 00.32.20.png](https://qiita-image-store.s3.amazonaws.com/0/14635/f54e8f9b-12cf-cc22-4de0-a62a219bca08.png)

5.バーコードが表示されるので、これをアプリ(Google Authenticator)で撮影
![スクリーンショット 2014-01-13 00.32.34.png](https://qiita-image-store.s3.amazonaws.com/0/14635/66d21411-19ce-3942-36ea-598f8cf7dc99.png)

![写真 1.PNG](https://qiita-image-store.s3.amazonaws.com/0/14635/d098d8fc-c8d6-043e-4101-2d0f4a004374.png)
![写真 2.PNG](https://qiita-image-store.s3.amazonaws.com/0/14635/966194f6-770d-d97f-705b-98cfd695cbdc.png)

バーコードでスキャンされると、番号が表示されるので、これをフォームに入れる
30秒ごとにあたらしい番号が生成されるので、順番に
![写真 3.PNG](https://qiita-image-store.s3.amazonaws.com/0/14635/d7cb4c7f-cdcc-100b-3c0a-2fafb0a1453d.png)

Authentication Code 1 とAuthentication Code 2にいれる。

6.https://console.aws.amazon.com/iam/home　
でStatusがEnabledになったことを確認
![スクリーンショット 2014-01-13 00.35.23.png](https://qiita-image-store.s3.amazonaws.com/0/14635/ee3a8f91-472d-f5c7-87b8-3e7bd594f67e.png)

これで準備OK

7.動作確認
console.aws.amazon.comをサインアウトして、再度ログインしようとすると
通常のID/PASS入力画面のほかに以下の入力画面がでる。
ここで、アプリで表示されている番号をいれると２段階認証が完了する。

![スクリーンショット 2014-01-13 00.36.02.png](https://qiita-image-store.s3.amazonaws.com/0/14635/83b5c088-074c-712a-2dfb-567b5991fec2.png)


##Real devive
Virtual MFA deviveでなくて Real deviveがお好みなら
![31br81HWCpL._SL250_.jpg](https://qiita-image-store.s3.amazonaws.com/0/14635/ca083589-e396-aeeb-380a-c98b43027c65.jpeg)
http://onlinenoram.gemalto.com
を購入してもよいそうです。



##参考
[[AWS] AWS Multi-Factor Authenticationを使う](http://www.fprog.org/~mura-masa/diary/?date=20111129)
↑IAMアカウントでMFAを有効にするときはこちら参照
複数のディレクトリのコミッターを出力するだけ

複数のディレクトリの中にcdして最後にコミットした人を出力するだけ、なんかもっと綺麗にできる気がして仕方がない。

```bash
default_dir=`pwd`

git_list=`cat list.txt`
for var in $git_list
do
	cd ${var}
	
	# for var2 in `git branch -a | grep remotes | grep -v HEAD`
	# for var2 in `git branch -a | grep remotes | grep -v HEAD | grep -v remotes/origin/develop | grep -v remotes/origin/master`
	for var2 in `git branch -a | grep remotes | grep -v HEAD`
	do

		#var_author=`git log -n1 ${var2} | grep Author | sed 's/\([^<]*\)<\([^>].*\)>/\2/g'`
		var_author=`git log -n1 ${var2} --pretty=format:"%ae"`
		#awk '{print $2}'`
		#var_date=`git log -n1 ${var2} | grep Date | awk '{print $3,$4,$5,$6}'`
		var_date=`git log -n1 ${var2} --pretty=format:"%ad" --date=iso | awk '{print $1,$2}'`

		branch_name=`echo ${var2} | sed -e "s/remotes\/origin\///"`
		echo ${var},${branch_name},${var_author},${var_date}

	done

	cd ${default_dir}

done
```
複数のGitリポジトリの最新をチェックする

AtlassianのStashで複数のGitリポジトリのMasterとDevelopをチェックする。
URLをいじればAtlassianStashじゃなくても大丈夫かと思う。
プルリクエストを送っているとマージコメント分が入ってしまうのが難点。

```bash
## sh test.sh > `date +%Y%m%d_%H%M%S`.n.log 2>&1

result_dir=`date +%Y%m%d_%H%M%S`

mkdir ${result_dir}

git_list=`cat list.txt`
for var in $git_list
do
	echo "[${var} Start]"
	if [ ${var:0:1} = "#" ];then
		echo "${var} skip"
		continue 
	fi

	if ! test -d ${var}; then
		echo "clone"
		git clone ssh://git@git.dev.hoge.com:7999/piyo/${var}.git
	fi

	cd ${var}
	git fetch --prune
	git log remotes/origin/master...remotes/origin/develop > ../${result_dir}/${var}.txt
	cd ../
done
```

git logで色々なオプションを試した見た

|option      | note |
|------------|-------------------------------|
|--left-right|どっちのログかを山括弧で示してくれる|
|--oneline|一行で表示|
|--no-merges|マージコミットを非表示|

--pretty='format:%h %cd %an%d %s'
prettyでフォーマットを指定すると、--left-rightが使えない…
Ubuntu13.10にeclipseを入れたらメニューバーが表示できないときの対応


Ubuntu13.10の環境でeclipse(kepler)を自分で落としてきて入れたら，最上段のメニューバーが押しても表示されない現象になりました．「ファイル」「編集」「ソース」「リファクタリング」とかあの部分が押してもなにも出てこない（降りてこない？）感じです．
eclipseのインストールとか，UnityのLauncherへの登録は別のに書きました．
[eclipseをUnityのLauncherとして登録する](http://qiita.com/ayihis@github/items/6604c191c7f6e3df4195#1-7)

上の記事で編集したeclipse.desktopのファイルをいじります．

ちなみに編集前

```
[Desktop Entry]
 Name=Eclipse
 Comment=Eclipse
 Exec=/usr/local/eclipse/eclipse
 Icon=/usr/local/eclipse/icon.xpm
 Terminal=false
 Type=Application
 Categories=IDE;
```

これを編集します

```zsh
sudo gedit /usr/share/applications/eclipse.desktop
```

変更後の内容は以下


```
 [Desktop Entry]
 Name=Eclipse
 Comment=Eclipse
 Exec=env UBUNTU_MENUPROXY=0 /usr/local/eclipse/eclipse
 Icon=/usr/local/eclipse/icon.xpm
 Terminal=false
 Type=Application
 Categories=IDE;
```

これで起動するとちゃんとメニューバーの中身見れるよ！めでたしめでたし．

でもこれはアイコンをクリックした時にしか発動しないので，端末からeclipseとした時にも起動できるようにスクリプトを書いておく．以前にシンボリックリンクを消します

```zsh
sudo rm /usr/local/bin/eclipse
```

スクリプト作成し保存します．

```zsh
cd /usr/local/bin
sudo gedit eclipse
```
スクリプトの内容は以下

```
#!/bin/bash
export UBUNTU_MENUPROXY=0
/usr/local/eclipse/eclipse
```

これで晴れて，アイコンからでも端末からでもeclipseを起動してメニューバーが使えるようになりました．

以下参考サイトです
[Saucy upgrade causes menu problem in Eclipse](http://askubuntu.com/questions/361040/saucy-upgrade-causes-menu-problem-in-eclipse#363237)
[Eclipse menus don't show up after upgrading to Ubuntu 13.10](http://stackoverflow.com/questions/19452390/eclipse-menus-dont-show-up-after-upgrading-to-ubuntu-13-10)
MacのlocalhostにGifzoサーバを立ててGifzoを使う

※ http://gifzo.net/ で現在ダウンロード出来るGifzo ver1.0.2では動かないっぽいです。https://github.com/cockscomb/Gifzo.app はver1.0.0のようなので、これをbuildすれば動きます。

# 概要
[Gifzo](http://gifzo.net/)って便利じゃないですか。今は[Gyazo GIF](https://gyazo.com/ja)になってますけど。ただ、公開したくないアニメーションGIF作りたい時があるので、ローカルにGifzoサーバ立てて、Gifzoクライアントのリクエスト先をローカルにしたら公開せずにローカルに保存出来るよね、ってことでやってみた。

ちなみに[LICEcap](http://www.cockos.com/licecap/)って言うアニメーションGIFを作るソフトがあって使ってみたんですが、画質が微妙だったのと、ローカルGifzoサーバが上手くいけば外のサーバにGifzoサーバ立てて使いたいと思っていたので、わざわざGifzoサーバを立てるということをやりました。

画質にそこまでこだわらずにアニメーションGIF作りたい、って話だったらほとんどLICEcapで事足りると思います。

あと[Windows版Gifzoには元々ローカルに保存する機能あるらしいです](http://hidesys.hatenablog.com/entry/2013/05/23/232333)。

# やり方

## gyazo-sinataraを改造する
[ここ](http://tester7.hatenablog.com/entry/20130525/1369467366)を参考に[gyazo-sinatra](https://github.com/mashiro/gyazo-sinatra)を改造します。

```diff
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..16d538e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/public/images/*
diff --git a/app.rb b/app.rb
index 5a2328e..e2cc530 100644
--- a/app.rb
+++ b/app.rb
@@ -10,10 +10,10 @@ module Gyazo
     configure do
       set :dbm_path, 'db/id'
       set :image_dir, 'public/images'
-      set :image_url, 'http://gyazo.send.sh/images'
+      set :image_url, 'http://localhost:9292/images'
     end

-    post '/' do
+    post '/gyazo' do
       id = request[:id]
       data = request[:imagedata][:tempfile].read
       hash = Digest::MD5.hexdigest(data).to_s
@@ -23,5 +23,14 @@ module Gyazo

       "#{options.image_url}/#{hash}.png"
     end
+
+    post '/' do
+      data = request[:data][:tempfile].read
+      hash = Digest::MD5.hexdigest(data).to_s
+      File.open("/tmp/#{hash}.mp4", 'w'){|f| f.write(data)}
+      ret = system("sh convert_mp4togif.sh #{hash}")
+
+      "#{options.image_url}/#{hash}.gif"
+    end
   end
 end
diff --git a/convert_mp4togif.sh b/convert_mp4togif.sh
new file mode 100644
index 0000000..f38fc94
--- /dev/null
+++ b/convert_mp4togif.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+set -e
+
+HASH=$1
+
+/usr/local/bin/ffmpeg -i /tmp/${HASH}.mp4 -r 10 /tmp/${HASH}_%04d.png
+/usr/local/bin/gm convert -delay 20 /tmp/${HASH}_*.png $(dirname $0)/public/images/${HASH}.gif
+rm -f /tmp/${HASH}*
+
```

改造済みのものが[ここ](https://github.com/takc923/gyazo-sinatra)にあるので、`git clone git@github.com:takc923/gyazo-sinatra.git`したら上のdiff適用したものが手に入ります。

## 必要なソフトウェアをインストールする
```
$ brew update
$ brew install graphicsmagick ffmpeg
$ sudo gem install sinatra rack
```

## サーバ起動
gyazo-sinatraのルートディレクトリで

```
$ rackup
```

## Gifzoを落としてアップロード先をlocalにする
http://gifzo.net/ からGifzoをダウンロード。
ターミナルで次のコマンドを打ってアップロード先をlocalhostにする。

```
$ defaults write net.gifzo.Gifzo url -string "http://localhost:9292/"
```

以上

# 使う
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/94/c669bb1f-03f4-d3b5-963f-d1ec691d2a62.gif)

いい感じですね。ちなみにこのGIF自体はLICEcapで撮りました。

# 参考

* [自分用 Gifzo Server Test - tester7のブログ](http://tester7.hatenablog.com/entry/20130525/1369467366)
* https://github.com/mashiro/gyazo-sinatra
* https://github.com/cockscomb/Gifzo.app
Werdpress カスタムメニューへ"|" の挿入

カスタムメニューの「表示オプション」にある「CSSクラス」を使うと
任意のメニュー項目にCSSクラスを追記できるようになる。
「|」を加えたい項目に、separator というCSSクラスをつける。

そのうえで wp_nav_menu にフックする関数を以下のようにfunctions.phpに追加。


```php
add_filter( 'wp_nav_menu', 'my_wp_nav_menu' );
function my_wp_nav_menu( $nav_menu ) {
	return preg_replace( '|(<li.+?separator.+?</a>)|', '$1<span class="separator">|</span>', $nav_menu );
}
```

CSSクラス separator をつけた項目のテキストリンクの後に span タグで挟まれた「|」が追記されるので、あとは span.separator に対して適宜スタイルをあてる。
Coderetreatファシリテーターガイド


## このドキュメントの目的

当ドキュメントは http://coderetreat.org/facilitating の翻訳を基に、Coderetreatのファシリテーターになる方の助けとなるドキュメントをまとめたものです。

## Coderetreatのファシリテーション

ファシリテーターはCoderetreatにおいてとても重要な役割を担います。
### ファシリテーターの役割

- Coderetreatの1日の導入 ([例：CoreyさんによるCoderetreatの導入](http://vimeo.com/18955165))
- 各々のセッションでペアのガイドを行う
- セッションとセッションの間の小さなふりかえりをリードする
- Coderetreatのクロージングをする

Coderetreatの間、可能な限り参加者が学ぶことを助けるのがファシリテータの主な仕事です。

Coderetreatの場作りをするあなたのために、いくつかのページをまとめておきました。

- [Coderetreatの構造(必読)](http://qiita.com/kompiro/items/a91cabbafa5231d002b7)
  - よくあるCoderetreatは、こんな感じで開催されます。
- [Coderetreatのファシリテーターの役割(英語)](http://coderetreat.org/profiles/blogs/on-the-role-of-the-coderetreat-facilitator)
  - Corey Hainesが、特に初めてファシリテーターになる人に対し、良いTipsとアドバイスをブログにまとめました。ファシリテーターがCoderetreatでどのように仕事をすべきかが書かれています。
- [コンウェイのライフゲーム(必読)](http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)
  - Coderetreatで恒例となっている全てのセッションで取り組むプログラミング課題の紹介です。
- [制限カタログ(必読)](http://qiita.com/kompiro/items/d657ff67a1e99295284c)
  - これまでのCoderetreatで企画された制限カタログです。(制限とは、ライフゲームを実装する際、制限をかけてよりプログラミングを楽しむためのルールです。)
- [ファシリテーターグループとフォーラム(英語)](http://coderetreat.org/group/facilitators)
  - 経験者、初心者を交えたCoderetreatのファシリテーターのグループです。このグループはセッションについてのアイディアを共有したり、異なるテーマうについてゴールを考えたり、お互いをサポートするための場です。もしCoderetreatのファシリテーターになりたい方がいれば、このグループに参加しましょう！
- [ファシリテーションについてのブログ記事を読もう！(英語)](http://coderetreat.org/profiles/blog/list?tag=facilitation)
  - コミュニティが作り上げたコンテンツを読もう！
Coderetreat開催ガイド


このドキュメントはCoderetreatを開催したい人にために http://coderetreat.org/hosting を元に翻訳し、いくつか補足を加えました。

## Coderetreatとは

Coderetreatとは、ソフトウェアの設計と開発の基礎を徹底的に練習する終日イベントです。仕事では必ずさらされる「終わらせなければならないプレッシャー」からできる限り開放され、「良い設計とはなにか」を考え、実践することに集中できるよう、Coderetreatは設計されています。そのため、効果的にプログラミング技術を向上させられる楽しいイベントです。

## Coderetreatを主催するには

主催者は、コードを書くのに不自由がない、快適な場所を参加者に無料で提供してください。そのために、下記を良く読み従うようにしてください。

- Coderetratを終日開催できるように環境を整えてください。
- イベントは無料にしてください。お金が必要な場合はスポンサーを募り、出資を求めてください。
- 終日参加できる[ファシリテーター(ファシリテーターガイドを参考)](http://qiita.com/kompiro@github/items/ef73bf78c3290a55e529)を見つけてください。
- 昼食にはおいしいものを用意し、提供してください。
  - 終日コーディングをするため、参加者に朝8時に家をでることを求めるのであれば、少なくともピザよりも美味しいものを提供しましょう。
  - 参加者同士が食事中、移動しやすいように、立食できるものを用意してください。ランチボックスやお弁当はその場に座って食べてしまうので、避けてください。
- 初めてホストをする場合、参加者が20人を超えないように募集しましょう。人数が多ければ多いほど開催が難しくなります。
- 途中参加者が休憩できるよう、参加者が10人を下回らないように注意してください。
- 当日欠席する参加者は必ずいます。

### 開催に必要な環境

終日快適にコーディングをするために、下記のものを用意してください。(参加者が20人の場合の大体の数をかっこにまとめておきます。)

- 会場に必要なもの
  - 最低限参加者分の電源を確保するための延長ケーブル(8/会場設営時にケーブルを踏んで転ばないように配慮すること)
  - 無線LAN(1)
  - プロジェクター(1)
  - スクリーン(1)
  - タイマー(45分/15分のセットを測るため)
- ペアプログラミングしやすい環境
  − 机(二人がけ×12 2x2のテーブルの島を6作る)
  - 椅子(25)
  - 紙(A3サイズ/6セッション行うので、100枚程度用意してあると良い)
   - お菓子(甘いもの・しょっぱいものを満遍なく分配し、皿大に配置)
- 各セッションのふりかえり用
  - ホワイトボード(2)
  - 付箋(3Mの強粘着タイプ/200〜300枚)→各セッションのふりかえり用
  - サインペン(ぺんてるのもの/25本)→付箋やコピー用紙へのメモに
- 休憩スペース(参加者がセッションから離れやすいようにするスペース。余った机と椅子で構成)
  - 終日無料で飲めるソフトドリンク類(お茶/コーヒー/ジュース等 ペットボトル3、4)
  - コップ(25)
- ランチ用
  - お皿(小25/大10)
  - おてふき(25)

## 主催者の仕事

### 日程
重要。他のイベントと重ならないことに留意する。

### スポンサー募集
ランチスポンサーと、それ以外で区切ると良い。予算は参加者20人だとすると、ランチスポンサーは3万円、それ以外は1万円くらいになる。

### 会場探し
- 会場参加者が動きやすいスペースを作れる部屋を選びましょう
- 参加者が迷わないように気を配りましょう
  - 張り紙をしたり、案内係がいるとよいでしょう

### 開催告知・参加者の募集
- 遅くとも告知は2ヶ月前から
  - 2ヶ月前から開始しないと、情報が広まりません。
  - 毎週1回以上twitter等に告知しましょう。
  - 告知をする場合は、9時過ぎ、12時過ぎ、22時過ぎにすると注目を集めやすいでしょう。
  - 徐々に興味を持つ人もいます。何度も粘り強く告知しましょう。
- 1週間前に参加を決める方もいます。そういう方が参加しやすいよう、直前に増席してみるのもいいかもしれません。

### メールでの連絡
- 参加者が満員を迎える頃
  - 予定が埋まっている参加者がいないか、キャンセルを即す
- 1週間前
  - 予定が埋まっている参加者がいないか、キャンセルを即す
  - 参加者が少ない場合は、友人や同僚、SNSでの告知の協力を申し出る
- 2日前
  - 当日の案内を行う
  - 駐車場/地図
     - 最寄りの交通機関の時間等
  - 当日の持ち物	 - ノートPC
     - ACアダプタ
Rubyでつまずいた備忘録

Chris Pine著　`初めてのプログラミング`　でRubyを勉強してみてつまずいた箇所の
自分勝手な備忘録です。

初めての躓きポイント。
getsメソッドで対話的なプログラムを記述したときのエラー。
本に書いてある通りに記述して

```rb:example.rb
  puts 'こんにちはあなたのお名前は？'
  name = gets.chomp
  puts 'あなたは'+name+'さんですね？すばらしい名前ですね'
  puts 'お会い出来て光栄です'+name+'さん:)'
```

を実行すると

```rb:terminal
  invalid multibyte char (US-ASCII)
```

とエラーが出る。

charと言ってるくらいなので文字コードの指定だろうと思い調べてみたらありました。

`# encoding: utf-8`　もしくは　` -*- encoding: UTF-8 -*-`　を先頭に記述で問題なく解決。
第17回オフラインリアルタイムどう書くの参考問題 with ruby

遅くなりましたが、第17回オフラインリアルタイムどう書くの参考問題「回文基数」
http://nabetani.sakura.ne.jp/hena/ord17scheherazade/
の実装例。

rubyで。

他の言語などの解答例は
http://qiita.com/Nabetani/items/dabe8ec57e0313229552
から辿れます。

現在は第18回
http://atnd.org/events/47025
の参加者募集中。2月1日、横浜です。

で。

```ruby
# tested with ruby 2.1.0

# 二桁の場合
def solve2(n)
  # 表示する数で回す
  (1..((n-1)**0.5).floor).select{ |d|
    b = (n-d)/d
    n==(b+1)*d && d<b
  }.map{ |d|
    (n-d)/d
  }
end

def to_digits( n, b )
  n<b ? [n] : to_digits( n/b, b )+[n%b]
end

# 3桁以上の場合
def solve_many(n)
  # 基数で回す
  (2..(n**0.5).floor).select{ |b|
    dig=to_digits( n, b )
    dig==dig.reverse
  }
end

def solve(s)
  r=solve2(s.to_i)+solve_many(s.to_i)
  r.empty? ? "-" : r.sort.join(",")
end

$stdout.sync=true

DATA.each do |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual==expected;
  puts "%s %s->%s ( %s )" % [ ok ? "ok" : "***NG***", src, actual, expected ]
end

__END__
0 17301 5,38,100,218,236,5766,17300
1 2 -
2 1 -
3 3 2
4 4 3
5 5 2,4
6 6 5
```

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

で。

例えば 10000 の場合。
三桁以上になる場合は 基数が 1〜100。その基数で回文数になるかどうか調べる。
二桁の場合、逆に、回文数になった後の表現形式は「1・1」〜「99・99」の約百通りのどれかなので、これらを調べて、そのような回文数になるような基数があるかどうか調べる。
そうすると、計算量のオーダーが O(n**0.5) ぐらいになる。

計算量を気にしなければ、もう少し短く書ける。
tmuxの中でpyenvの設定が有効でないとき


環境変数PATHにshimsを追加することで解決。

    # pyenv
    export PYENV_ROOT=$HOME/.pyenv
    export PATH=$PYENV_ROOT/shims:$PYENV_ROOT/bin:

    if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
DeviseでViewをカスタマイズする

Railsでユーザ認証などを便利にやってくれる[Devise](https://github.com/plataformatec/devise)を使った時に、Viewをカスタマイズする方法をメモ。

### 設定ファイルを変更

`config/initializers/devise.rb`を開いて、`config.scoped_views`を有効にする。

```ruby:config/initializers/devise.rb
  # ==> Scopes configuration
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
  # "users/sessions/new". It's turned off by default because it's slower if you
  # are using only default views.
  config.scoped_views = true
```

設定ファイルを修正した後はRailsサーバの再起動をお忘れなく。

### オリジナルのviewファイルを生成する

`rails generate devise:views (モデル名)`を実行してviewファイルを生成する

```
$ rails generate devise:views users
      invoke  Devise::Generators::SharedViewsGenerator
      create    app/views/users/shared
      create    app/views/users/shared/_links.erb
      invoke  form_for
      create    app/views/users/confirmations
      create    app/views/users/confirmations/new.html.erb
      create    app/views/users/passwords
      create    app/views/users/passwords/edit.html.erb
      create    app/views/users/passwords/new.html.erb
      create    app/views/users/registrations
      create    app/views/users/registrations/edit.html.erb
      create    app/views/users/registrations/new.html.erb
      create    app/views/users/sessions
      create    app/views/users/sessions/new.html.erb
      create    app/views/users/unlocks
      create    app/views/users/unlocks/new.html.erb
      invoke  erb
      create    app/views/users/mailer
      create    app/views/users/mailer/confirmation_instructions.html.erb
      create    app/views/users/mailer/reset_password_instructions.html.erb
      create    app/views/users/mailer/unlock_instructions.html.erb
```
sakuraエディタマクロ

最近はまったく使わないけれど今までに作ったマクロをいくつか。

## マクロの追加方法

1. 設定＞共通設定
1. マクロタブを選択
1. [参照]をクリックしてマクロファイルを選択
1. 名前とIdを入力(選択)して[設定]をクリック
1. カスタムメニュータブの種別に「外部マクロ」を選択してショートカットを設定。

## 終了タグを挿入する
addEndTag.js

```
   var regExpObj     = new RegExp('<(\\w+)>');
   var currentLine   = "";
   var currentTagStr = "";
   
   var wshObj = new ActiveXObject("WScript.Shell");
   var resArray = Array;
   
   currentLine = GetLineStr(0);
   
   if (resArray = regExpObj.exec(currentLine) != null) {
         GoLineEnd();
         InsText("</"+RegExp.$1+">");
   }
```

## 指定文字列ごとに上下移動する 

> ソースを見る際に、指定文字列(ここではpublic/private/protected)ごとに上下移動する。
> ※Visual Basic EditorなどでCtrl+↑↓で関数ごとに移動する動作のような感じ。
> ※他に移動単位としたい文字列があれば随時パターンを編集("function"など)
> ※大文字小文字は区別しない

moveDownEveryDefine.js

```
 ------------------------------------------------
 // 定義ごとにカーソルを移動する
 // ※Public/Private/Protectedが行頭にある場所ごとに下に移動するだけ
 
 var regExpObj     = new RegExp('Public|Private|Protected', "i");
 var currentLine   = "";
 
 var resArray = Array;
 
 currentLine = GetLineStr(0);
 
 if (regExpObj.exec(currentLine) != null) {
     Down();
 }
 
 while (regExpObj.exec(currentLine) == null && currentLine != "") {
     Down();
     currentLine = GetLineStr(0);
 }
 ------------------------------------------------
```

moveUpEveryDefine.js

```
 ------------------------------------------------
 // 定義ごとにカーソルを移動する
 // ※Public/Private/Protectedが行頭にある場所ごとに上に移動するだけ
 
 var regExpObj     = new RegExp('Public|Private|Protected', "i");
 var currentLine   = "";
 var searchCnt     = 1000;
 
 var resArray = Array;
 
 currentLine = GetLineStr(0);
 
 if (regExpObj.exec(currentLine) != null) {
     Up();
     searchCnt--;
 }
 
 // 不明（先頭行に達したことを判定する方法）
 while (regExpObj.exec(currentLine) == null && searchCnt > 0) {
     Up();
     searchCnt--;
     currentLine = GetLineStr(0);
 }
 ------------------------------------------------
```

## 選択文字を<span>で囲む

addSpanTag.js

```
 selStr = GetSelectedString();
 InsText('<span style="font-size:x-small;">'+ selStr +'</span>');
```
tmuxの使い方とか設定とかメモ

ターミナルたくさん開いてたら、便利だと教えてもらった(あとデキそうなヤツに見えるとか何とか)ので使い始めました。
インストール済みのVMだったのでインストール方法は知りません。
(便利だけど自分がどこにアクセスしてるのか気をつけないと危険だなと思いました)

## まず、調べて参考にさせていただいたサイト。

+ [第127回　ターミナルマルチプレクサ tmuxを使ってみよう](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0127?page=1)
+ [tmuxのすすめ](http://blog.catatsuy.org/a/243)
+ [tmuxの使い方メモ](http://weblog.nabetama.com/post/29193390016/tmux)

## 使いそうなコマンド

> $ tmux attach
> $ tmux detach

全終了
> $ tmux kill-server

セッション一覧
> $ tmux ls

## 使いそうなショートカット

```
 Ctrl+b c  新しいウィンドウを作成
 Ctrl+b d  カレントクライアントをデタッチ
 Ctrl+b &  カレントウィンドウをkill
 Ctrl+b ,  カレントウィンドウをリネーム
 Ctrl+b ?  全キーバインドを列挙
```

なんかの拍子に時計が表示されるショートカットを知り、時々使う
> Ctrl+b t 時計を表示

## コピーモードとかめんどうなので、スクロールとかバッファ(？)の設定

参考にさせていただいたサイト

+ [代替画面バッファ (Alternate Screen Buffer) 1](http://doda.b.sourceforge.jp/2013/01/02/%E4%BB%A3%E6%9B%BF%E7%94%BB%E9%9D%A2%E3%83%90%E3%83%83%E3%83%95%E3%82%A1-1/)
+ [MacのTerminalでtmuxスクロールをするか](http://opamp.hatenablog.jp/entry/20111106/1320572057)

その結果設定ファイルはこうなしました。
(いらない設定もあるかもしれないけど目的は達成したからいいや)

> $ ~/.tmux.conf

```
 set-option -g buffer-limit 100
 
 # コピーモードのキーバインドをvi風に切り替え
 set-window-option -g mode-keys vi
 set-window-option -g mode-mouse on
 
 # 代替画面バッファを使わないようにする(親端末のTERMがxtermの場合)
 set -g terminal-overrides 'xterm*:smcup@:rmcup@'
```
繰り返し処理内での「Fatal error: Cannot redeclare」

繰り返し処理内で関数を定義したら繰り返しの2回目以降の処理で
以下のエラーが発生

``Fatal error: Cannot redeclare
``

調べてみると同じ名前の関数は定義できないよ！というエラーらしい。
繰り返し処理の1回目で呼び出した関数が、2回目以降の呼び出し時に
定義済みとされているみたい。

ググってみて以下の記事を参考に修正しました。
<a href="http://php1st.com/1326/">「Fatal error: Cannot redeclare」と表示されるとき</a>

function_exist関数で関数が定義済みかを判定した後に
未定義の場合のみ関数を定義するという処理です。

なんか個人的にはイマイチしっくり来てないので
もし、もっとスマートな解決方法をご存知の方がいたら教えてください。

とりあえず、先人の知恵に感謝！
Agreeing to the Xcode/iOS license... のエラーがでた時の対処法

なにかのコマンドを実行した時に

```
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
```

というエラーが表示されることがあります。
こういうときは、まあメッセージにある通りなんですけど Xcode のライセンスに同意する必要があるので、Xcodeを起動して出てきたダイアログの "Agree" を押せばOKです。

![Xcode and iOS SDK License Agreement](https://qiita-image-store.s3.amazonaws.com/0/11852/e41d9f04-1bcc-46f6-878c-78016a24f601.png "こんなダイアログが開くはず")

コマンドライン上からやりたいときは `sudo xcrun cc` です。

```
$ sudo xcrun cc

WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.

To proceed, enter your password, or type Ctrl-C to abort.

Password:


You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.

Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'
```

Enterを押すとライセンスが表示されて、最後に

```
By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel]  
```

と聞かれるので指示通り ```agree``` と入力すればOKです。