OmniAICreator/Qiita-1.07M huggingface dataset:
Git Tips


### バージョン管理されていないファイルを削除
自動生成とかで間違って大量のファイルを作った時に使う

```
# 確認
git clean -n
# 削除
git clean -f 
```

### マージしたものをrevertしたいとき
```
# 1:マージされたブランチ
# 2:マージするブランチ
git revert -m 1 <Hash>
```

### リモートリポジトリのコミットIDを取得する
```
git ls-remote -h origin
```

### マージ済みのブランチを一括削除

```bash
# gb はgit branch
gb --merged | egrep -v "(master|develop)" | xargs git branch -d
```

### ブランチ名変更

```
git branch -m <branch_name>
git branch -m <current_branch> <new_branch>
```

### oh-my-zshで使いそうなコマンド

| alias|gitコマンド| 
|:-----------|:------------|
| gb | git branch |
| gst | git status|
| gco | git checkout |
| ga | git add |
| gm | git merge | 
|ggpur | git pull --rebase origin $(current_branch)|
|ggpush | git push origin $(current_branch)|
|grbi | git rebase -i |
|grbc | git rebase --continue | 
|grba | git rebase --abort |

### gitのPR時に使っているブックマークレット

```
javascript:(function() {var t = document.getElementById('pull_request_title');if(t){t.value +=' (x/xリリース)';} var e = document.getElementById('pull_request_body');if (e) {e.value += '## %E6%A6%82%E8%A6%81\n\n## %E5%BD%B1%E9%9F%BF%E7%AF%84%E5%9B%B2\n\n## ER%E5%9B%B3(%E5%AE%9F%E8%A1%8C%E8%A8%88%E7%94%BB)\n\n## %E9%96%A2%E9%80%A3%E3%83%AA%E3%83%B3%E3%82%AF\n\n'}})();
```
homebrew-caskのdevelopmentとproductionの切り替えをdirenvでやってみた

[homebrew-cask/doc/HACKING.md at master · phinze/homebrew-cask](https://github.com/phinze/homebrew-cask/blob/master/doc/HACKING.md#how-should-i-set-up-a-development-environment)にhomebrew-caskをforkしてgitのプライベートレポジトリで開発するときの切り替え手順が説明されています。

gitのプライベートレポジトリ内の```developer/bin/develop_brew_cask```を実行すると開発モードになって/usr/local/以下のbrew-caskの一部のディレクトリがgitのプライベートレポジトリ内のディレクトリへのシンボリックリンクになります。

gitのプライベートレポジトリ内の```developer/bin/production_brew_cask```を実行するとプロダクションモードに戻ります。

開発モードの状態だと、brew updateは安全に実行できないという注意書きがあります。私の場合、開発モードにしたまま、うっかり忘れてやってしまいそうです。

そこで、[zimbatm/direnv](https://github.com/zimbatm/direnv)を使って切り替えをするようにしてみました。

以下の説明ではgitプライベートレポジトリが~/mysrc/homebrew-caskとします。

```text:~/mysrc/homebrew-cask/.envrc
if ! brew list brew-cask | grep -q production_rubylib; then
  ./developer/bin/develop_brew_cask
fi
```

```text:~/.envrc
if brew list brew-cask | grep -q production_rubylib; then
  ~/mysrc/homebrew-cask/developer/bin/production_brew_cask
fi
```

これで~/mysrc/homebrew-caskにcdしたら開発モードになり、cd ..などで外に出るとプロダクションモードに戻ります。
ただ、他でシェルを開くとプロダクションモードになってしまうので、その場合は~/mysrc/homebrew-caskで開発を続けるときに

```
. .envrc
```

として開発モードに切り替える必要があります。ちょっと面倒な気もしますが、間違って開発モードのままbrew updateするよりはいいので、とりあえずこれで使ってみます。
お役立ちコマンドプロンプトのコマンド

* hogeディレクトリのファイル一覧をフルパスで出力
`dir /b /s D:\hoge > dir.txt`

* ディレクトリのフォルダ＆ファイル一覧を並び替えてテキストファイル出力
`dir /b /on > list.txt`

* Dドライブ直下にhogeフォルダが存在してる場合のみ、フォルダ＆ファイル一覧を並び替えてテキストファイル出力
```IF EXIST D:\hoge (
  dir D:\hoge /b /on > list.txt
)```

* ツリー構造でフォルダ+ファイル一覧
`tree /f`

* 再起動
`shutdown /r`

* コマンド履歴（history）を表示する
`「F7キー」 コマンドだと doskey /h`
OpenSUSE 13にErlang 17.0をソースからインストールする

私的にOpenSUSEが使いやすいので、以前からErlangをインストールしてたまに趣味で使っていたのだが、なぜかErlang16Bだとdebuggerを閉じるとErlangコンソールごと異常終了するという問題が解決できなくてしばらく放置していた(OpenSUSEは、erlang-solutionsでの実行形式配布対象になっていないので、最新版を使いたければソースからビルドしなければならない)。

17.0がリリースされたので、あらためてチャレンジしてみたところ、debuggerの問題も解決したっぽいので、今回使ったコンフィグのパラメータを記録しておく。

もちろんErlangのビルド前に必要なライブラリの類(ncursesやらopenSSLやらopenGLやらjavacやらwxWidgets)は、インストール済みである。

./configure --enable-threads --enable-smp-support  --enable-kernel-poll --enable-hipe --enable-native-libs --enable-builtin-zlib --enable-m64-build 

ちなみに、Ubuntu、CentOS、Debian、FedoraやMacOSはerlang-solutionsのウェブサイト(URLは以下)で実行形式パッケージがダウンロードできるので、そちらからインストールすればビルドの手間が省ける。ただ、CentOSで試してみたところ、なぜかtoolbarが起動できなくなっていた。debuggerは起動できたので、大きな問題ではないがなぜだろう？
https://www.erlang-solutions.com/downloads/download-erlang-otp
clang を docker container で動かす


漢なら clang(C/C++ compiler) を docker container で sandbox 実行したいですね!

世界って広いわ. すでにありました. 3.4.1. pocl 付き(Portable OpenCL).

https://github.com/bamos/docker-llvm-polly-pocl/tree/master/llvm-3.4


ビルドして docker index にイメージ上げときました.

https://index.docker.io/u/syoyo/llvm3.4-polly-pocl/

イメージは 1.5 GB くらいあるので注意ください.

これでたくさん C++ コードをコンパイルできますね!
Ember.js の URL を hash sign から普通の URL にする

まずここにある内容は、このページに全て書いてあります。この記事が古くなっている場合、直接こちらを読む方が正確です。

http://emberjs.com/api/classes/Ember.Location.html

あと、私は Ember.js 学び始めたばかりの人間なので、もし内容におかしなところがあったら、ぜひご指摘ください。

### hash sign がデフォルト

例えば、以下のように `http://localhost/` でアクセス可能な普通に Ember アプリをつくると以下のような例の場合（サンプルは CoffeeScript で書いています）

```coffeescript
window.App = Ember.Application.create()
App.Router.map ->
  @route("about")
```

以下のような例の場合 `link-to 'about'` は `http://localhost/#/about` へのリンクになります。

```xml
<script type="text/x-handlebars" data-template-name="application">
  <p>{{#link-to 'about'}} About {{/link-to}}</p>
  <p>{{outlet}}</p>
</script>
```

`http://localhost/#/about` にアクセスすると `{{outlet}}` に `about` と data-template-name が指定された handlebars のテンプレートを埋めた状態で表示されます。

これを `http://localhost/about` へのリンクにする場合は、以下の二つのことが必要です。

### hash sign? hashbang?

・・と、その前に少し余談ですが。

昔 twitter.com など多くのサイトが採用していた twitter.com/#!/foo のような URL を hashbang と呼びますが Ember のデフォルトは /#/foo なので hashbang ではなく hash sign と呼ぶようです。hashbang にしたいんだけど、という場合は以下のように HashLocation を拡張すると良いようです。

http://stackoverflow.com/questions/14929170/hashbang-urls-using-ember-js


### hash sign をやめる

#### HistoryLocation を使う

App.Router の設定をデフォルトの HashLocation から HistoryLocation に変更します。

http://emberjs.com/api/classes/Ember.Location.html

```coffeescript
window.App = Ember.Application.create()
App.Router.map ->
  @route("about")
App.Router.reopen
  location: 'history'
```

こうすると `link-to 'about'` は `http://localhost/about` に変わり、また表示も特に問題ないようです。ただ、これでめでたしめでたし・・とはまだいきません。

#### サーバサイドで /about への応答

別ブラウザや別タブから `http://localhost/about` へアクセスしてみてください。先ほどは JavaScript History API のおかげでアクセスできていましたが、今回は Ember アプリが処理する前にサーバサイドが 404 Not Found で応答してしまいます。

ここにある注意書きはそういう意図ですね。

http://emberjs.com/api/classes/Ember.Location.html#toc_historylocation

>Keep in mind that your server must serve the Ember app at all the routes you define.

やるべきことは単純で `http://localhost/about` へのアクセスに `http://localhost/` と同じ Ember アプリを含むページを応答するだけです。

これでうまくいくようになりました。

また（当然と言えば当然ですが）サーバサイドの実装を持たず HTML ファイルだけで実装された Ember アプリの場合 HashLocation でなければうまく動作しないということがわかります。

### ちょっと待って、古い IE のこと考えてる？

IE9 以下は JavaScript の history API をサポートしてないため HistoryLocation で IE9 からアクセス来ると NoneLocation になってしまい、うまくいかないようです。

それをよしなにやってくれるのが AutoLocation で、基本は HistoryLocation でふるまいつつ IE9 以下からのアクセスの場合は HashLocation で動作するようです（今 IE 9 環境が手元にないので実際に確認はしていないですが）。

http://emberjs.com/api/classes/Ember.Location.html#toc_autolocation

最終的にはこのようになりました。

```coffeescript
window.App = Ember.Application.create()
App.Router.map ->
  @route("about")
App.Router.reopen
  location: 'auto'
```
Railsでタスク管理アプリを作成_9（ラスト）

# タスク管理アプリを作ってみよう(ラスト)

## 1. 前置き

### 1. 前提・事前作業

 * [こっちの投稿](http://qiita.com/fujimohige/items/192d7a3c32e2acd42129)
 * 例によって[ドットインストール](http://dotinstall.com/lessons/basic_rails_v2/24901)の写経
 * [#28 Tasksの数を表示させよう](http://dotinstall.com/lessons/basic_rails_v2/24928)を実施



## 2. Tasksの数を表示させよう

* プロジェクト一覧画面にタスクの消化状況を表示する
* `/home/vagrant/taskApp/app/views/projects` の `index.html.erb` を弄る。

```erb:ERB(index.html.erb)

  <% @projects.each do |project| %>
  <li>
    <!-- 登録情報参照ページへのリンク -->
    <%= link_to project.title, project_path(project.id) %>
    <!-- タスクの消化状況を表示 -->
    <!-- (残件数/総数) -->
    (<%= project.tasks.unfinished.count %>/<%= project.tasks.count %>)
    <!-- 編集ページへのリンク -->
    <%= link_to "[Edit]", edit_project_path(project.id) %>
    <!-- 削除リンク -->
    <!-- methodにdeleteを指定することで、Destroyアクションと紐づけられる -->
    <!-- dataで確認メッセージを指定 -->
    <%= link_to "[Delete]", project_path(project.id), method: :delete, data: {confirm: "are you sure?"} %>
  </li>
  <% end %>
</ul>

<p><%= link_to "Add New", new_project_path %></p>


```

* `/home/vagrant/taskApp/app/models` の `task.rb` を弄る。
 * `unfinished` を追加

```rb:ruby(task.rb)
class Task < ActiveRecord::Base
    belongs_to :project # projectに属してるよ。という情報
    # 必須チェック メッセージの設定はなし
    validates :title,
        presence: true
    # 未完了タスクデータ取得
    # scopeで、検索条件を指定した場合のデータを定義する(unfinishedを定義)
    scope :unfinished, -> { where(done: false) }
end
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/40160/3fd8940b-2b36-1842-af45-41b01c81b13d.png)

終わり
Javaでラムダを使用したFizzBuzz

便乗してFizzBuzz

```FizzBuzz.java
package basic;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.IntStream;

public class FizzBuzz {
    public static void main(String... args){
        Map<Integer, String> map = new LinkedHashMap<>();
        map.put(15, "FizzBuzz");
        map.put(5, "Buzz");
        map.put(3, "Fizz");
        IntStream.rangeClosed(1, 100).mapToObj(x -> {
            Map<Integer, String> m = new LinkedHashMap<>(map);
            m.putIfAbsent(x, String.valueOf(x));
            return m.entrySet().stream().filter(s -> x % s.getKey() == 0).findFirst().get().getValue();
        }).forEach(System.out::println);
    }
}
```

結果は

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```
Rで決定木。日本語小説を世界観設定別に切り分けるキーワードを探る。

#概要
[前回](http://qiita.com/nezuq/items/99a599587b1e48705c65)、世界観設定別に日本語小説を分類するRコードを書いたが、
機械がどのような基準でそれらを分類しているかは説明しづらい。
決定木では、少ない変数（未集約）で分類するモデルを作るので、それが説明しやすい。
試してみる。

#処理
[前回](http://qiita.com/nezuq/items/99a599587b1e48705c65)の処理と同じ。
ただし、Rコードの中身は下記のものに変更する。
又、用意する文書は訓練データ(train)だけで良い。

```r:NEZUQ_差分ワード抽出器.R
#NEZUQ_差分ワード抽出器.R
#Copyright (c) 2014 nezuq
#This software is released under the MIT License.
#http://opensource.org/licenses/mit-license.php

library(RMeCab)
library(mvpart)

#基盤フォルダ
path <- "."
#訓練データフォルダ
path.train <- paste(path,"train",sep="/")

#結果フォルダ
path.result <- paste(path,format(Sys.time(), "%y%m%d%H%M%S"),sep="/") 
dir.create(path.result)
#途中データ格納用フォルダ
path.input <- paste(path.result,"input",sep="/") 
dir.create(path.input)
#分類済みデータ格納用フォルダ
path.output <- paste(path.result,"output",sep="/") 
dir.create(path.output)

#ファイル名分割記号
sep <- "_"

#訓練データファイルを一時フォルダに移動
gather.files <- function(from, to, prefix="", sep="_"){
  for(fname in dir(from, recursive=T)){
    fname.full <- paste(from, fname, sep = "/")
    fname.to <- gsub("/", sep, fname)
    #接頭辞指定の場合は、ファイル名に付与
    if (0 < nchar(prefix)) {fname.to <- paste(prefix, fname.to, sep = sep)}
    fname.to.full <- paste(to, fname.to, sep = "/")
    file.copy(fname.full,fname.to.full)
  }
}
gather.files(path.train, path.input, sep = sep)

#単語別頻度表を作成
d.origin <- t(docMatrix2(path.input, pos = c("名詞"), weight = "norm"))
#記号が含まれる単語頻度列を削除したデータフレームに変換
ptn.rmv <- "^([a-zA-Z0-9｡-ﾟぁ-んァ-ヶー一-龠])+$"
d <- as.data.frame(d.origin[,regexpr(ptn.rmv,colnames(d.origin)) > -1])
#列名に接頭辞を付与 ※列名が数値だと他パッケージの関数でエラーを起こす。
colnames(d) <- paste("d.", colnames(d), sep = "")
#訓練データを取得
d.info <- do.call(rbind, strsplit(rownames(d), sep))
d["s.tag"] <- factor(d.info[, 1])

#モデルを作成 
d.rp <- rpart(s.tag~., data = d)
#モデルを文字表示
d.rp

#途中データフォルダを削除
#file.remove(dir(path.input,full.names=T))
#file.remove(path.input)
```

#出力イメージ
コンソールの最後に文字で表示される。

```
n= 16 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 16 8 現在設定 (0.5000000 0.5000000)  
  2) d.高校< 0.002960446 8 0 現在設定 (1.0000000 0.0000000) *
  3) d.高校>=0.002960446 8 0 未来設定 (0.0000000 1.0000000) *
```

#感想
現在設定(高校生設定)か未来設定(社会人設定)かの分類を試したので「ですよねー」が感想。
キーワード「高校」が出現する頻度を使えば分類できる事が分かった。
VsVimのC-[を使えるようにする

VsVimのC-[がうまく動かない
-----
Visual Studioの拡張で、VsVimがある。
Vimと同じ操作ができていい。

だけど、C-[がうまく動いてくれない！


直す方法
-----
1. Visual Studioのオプション画面を開く
2. 環境→キーボードを開く
3. 「編集.選択解除」コマンドを選ぶ
4. ショートカットキーの枠内で「C-[」を押す
5. 割り当てボタンを押す

その他
-----
他に、もっとい方法があると思う。。
golangで配列と配列の連結

さきほどいきなりgolangをはじめたニワカgolangerです。

随時メモをしていきます。

## 配列と配列を連結させたい。

`[[1,3,4][2,5,6]]`とかではなく、`[1,3,4,2,5,6]`みたいな感じに連結したいわけです。

で、

```go
slice1 = append(slice1, slice2)
```

と書いてもだめなのですが、なんと２つ目のsliceに`...`をつけるとうまくいきます。

```go
    slice1 := []int{0, 1, 2, 3, 4}
    slice2 := []int{55, 66, 77}
    fmt.Println(slice1)
    slice1 = append(slice1, slice2...) // The '...' is essential!
    fmt.Println(slice1)
```

なにこれこんなの普通みつかんないからね！

参考
http://blog.golang.org/slices
NSAffineTransformのメモ

場所をずらしながら繰り返し描画を行おうとして、 NSAffineTransformで原点移動すればいいじゃないかと思い実装して失敗した時のメモ。

サンプルのスクリーンショットは以下のとおり。左のようなものを作ろうとして正しく実装できたのが真ん中、勘違いで正しく描画出来てなかったのが右側。

![2014_04_27_11_59.png](https://qiita-image-store.s3.amazonaws.com/0/3847/ee15cda5-1094-5c69-3a89-6b4b6246f642.png)

コード : https://github.com/Nunocky/AffineTransformStudy001

## 正しい書き方

```objc
    NSAffineTransform *trans1 = [NSAffineTransform transform];
    [trans1 translateXBy: 10 yBy: 10];
    
    [trans1 concat];
    [self drawLineWithColor:[NSColor redColor]];
    
    [trans1 concat];
    [self drawLineWithColor:[NSColor greenColor]];
    
     // .....
```

## 間違った書き方

```objc
    NSAffineTransform *trans = [NSAffineTransform transform];
    
    [self drawLineWithColor:[NSColor blackColor]];
    
    [trans translateXBy: 10 yBy: 10];
    [trans concat];
    [self drawLineWithColor:[NSColor redColor]];
    
    [trans translateXBy: 10 yBy: 10];
    [trans concat];
    [self drawLineWithColor:[NSColor greenColor]];
    
     // .....
```

## 反省

分かってしまえばそりゃそうだろってことなんだけど

* NSAffineTransformは変換行列を定義するもの
* concatメソッドは現在のコンテキストに対して座標変換を適用するもの。感覚的には [[NSColor blackColor] set]に近い。
* translateXBy:yBy: メソッドは 座標変換の行列を追加するもの。間違った例のようにすると、変換行列 = A * A * A*.... とどんどんずれ幅が大きくなっていく。
ifとかswitchを使わずにFizzBuzz


まず、if文を使った場合、例えばこんな感じ。

```java
/**
 * FizzBuzz
 */
public class FizzBuzz {
	final String F = "Fizz";
	final String B = "Buzz";
	public void fizzBuzz(int number) {
		for (int i = 1; i < number + 1; i++) {
			boolean fizz = (i % 3 == 0);
			boolean buzz = (i % 5 == 0);
			if (fizz && buzz) {
				output(F);
			} else if (fizz) {
				output(B);
			} else if (buzz) {
				output(F + B);
			} else {
				output(Integer.toString(i));
			}
		}
	}
	private void output(String str) {
		System.out.println(str);
	}
	public static void main(String[] args) {
		new FizzBuzz().fizzBuzz(Integer.parseInt(args[0]));
	}
}
```

System.out.println が4回も出てくるのでリファクタリングしてみた。
次に、if文のところを ```?``` と ```:``` で置き換えてみたもの。

```java
/**
 * FizzBuzz 2
 * if文使わないバージョン
 */
public class FizzBuzz2 {
	final String F = "Fizz";
	final String B = "Buzz";
	public void fizzBuzz(int number) {
		for (int i = 1; i < number + 1; i++) {
			boolean fizz = (i % 3 == 0);
			boolean buzz = (i % 5 == 0);
			System.out.println(
				fizz && buzz ? F + B
				: fizz ? F
				: buzz ? B
				: Integer.toString(i)
				);
		}
	}
	public static void main(String[] args) {
		new FizzBuzz2().fizzBuzz(Integer.parseInt(args[0]));
	}
}
```

インデント工夫してみたけど、やはり伝わりづらいか。。。
Shift キーを押す回数を減らせるので、コーディングは100倍楽に感じる。
一般ユーザーで MySQL を立ち上げる

以下のように my_mysql.cnf を作成する。

```
[mysqld]      
  skip-networking
  pid-file = /tmp/my_mysql.pid
  socket   = /tmp/my_mysql.sock
  datadir  = /tmp/my_mysql_data/ 
  skip-character-set-client-handshake
  character-set-server = utf8
  collation-server = utf8_general_ci
```
この場合は datadir が /tmp/my_mysql_data となっているのでこのディレクトリを作成しておく必要がある。



次に mysql_install_db を実行して mysql を利用する準備を行う

```
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql/ --defaults-file=/path/to/my_mysql.cnf
```

basedir は自分で mysql を自分でコンパイルしている場合は上のように指定する必要があった。場合によっては指定しなくてもいいかも。

あとは設定ファイルを指定して MySQL を起動するだけ

```
/usr/local/mysql/bin/mysqld --defaults-file=/path/to/my_mysql.cnf
```
非CommonJSモジュールなJavaScriptコードを本体変更無しにCommonJS対応にする


## 背景

最近TypeScriptコンパイラ触る時とかPEG.jsで生成したパーサを使う時とかに、トップレベルに`TypeScript`とか`PEG`とかいう変数がポコンと作られるだけのコードがあります。

こう…俺はこういうコードを追加してほしいんだよ…！！みたいな気持ちになります。

```javascript
(function (global) {
	var lib = ...; // なんか適当にライブラリの定義

	if (typeof define === 'function' && define.amd) {
		define(function() { return lib; });
	} else if (typeof exports === 'object') {
		module.exports = lib;
	} else {
		global.lib = lib;
	}
})(this);
```

ライブラリ本体にpull request送ったりして根本的に解決すれば幸せになれるんですが、とりあえず使えるようにしたい時に便利なテクを最近知ったので紹介します。

今まで、僕は上記のようなコードを末尾にconcatするgruntタスクとかを作っておいて、連結後のコードを参照するようにしていました。
ただ、ライブラリや自動生成されたコードを自分のプロジェクト内で弄くるのってなんか罪悪感ありますよね？僕はあります。

## 解決方法

Node.jsには[vmモジュール](http://nodejs.org/api/vm.html)というものがあります。
ぶっちゃけた話、安全なevalみたいな感じです。

Node.jsに新しく実行コンテキストを作らせて、そのサンドボックスの中でコードを実行し、終了後に残った変数を地引網的に回収します。
これから出す例では、sandbox変数が実行コードのグローバルオブジェクト的に使われますので、テキトーに回収します。

実際に最近作ったTypeScriptコードはこんな感じです。

```typescript
/// <reference path="../typings/node/node.d.ts" />
/// <reference path="./PEG-definition.d.ts" />

import vm = require("vm");
import fs = require("fs");

var fileName = __dirname + "/../resources/grammer.js";
var pegCode = fs.readFileSync(fileName, {encoding: "utf-8"});

var sandbox: { PEG: typeof PEG; } = <any>{};
vm.runInNewContext(pegCode, sandbox, "grammer.js");
var PEG = sandbox.PEG;

export = PEG;
```

未だにTypeScriptをやってない人向けにコンパイル後のJavaScriptコードも一応置いておきます。

```javascript
var vm = require("vm");
var fs = require("fs");

var fileName = __dirname + "/../resources/grammer.js";
var pegCode = fs.readFileSync(fileName, { encoding: "utf-8" });

var sandbox = {};
vm.runInNewContext(pegCode, sandbox, "grammer.js");
var PEG = sandbox.PEG;

module.exports = PEG;
```
業務システム向け HTML5 JavaScript UIライブラリ

# UIライブラリ

簡単に見た目のデザインを良くして、レスポンシブなサイトを作れるフレームワーク

* Bootstrap
 * http://getbootstrap.com/

* Wijmo Enterprise（ウィジモ）
 * http://wijmo.c1.grapecity.com/
 * Wijmo 5 Wijmo 3 を含む
 * オープンソース（GPLv3）と商用のデュアルライセンス

* IgniteUI
 * http://jp.igniteui.com/
 * 一部がOSSとなりました
 * https://github.com/IgniteUI/ignite-ui

* Semantic UI
 * http://semantic-ui.com/

* KendoUI
http://www.telerik.com/kendo-ui

* ZinoUI
http://zinoui.com/

# スプレッドシート・Excel系

* SpreadJS 9J（2016/01/28 発売）
http://jp.spread.grapecity.com/spreadjs/

* SpreadJS
http://wijmo.c1.grapecity.com/products/spreadjs/

---

* Sencha Ext JS
http://www.sencha.com/products/extjs/

Sencha Extベース

* Ext Gantt
* Touch Scheduler
* Ext Scheduler
* Kanban Task Board
 * http://www.bryntum.com/products/

# Java


* Vaadin - thinking of U and I - vaadin.com
 * https://vaadin.com/home

---

* Leading Enterprise Java Web Framework | ZK
 * http://www.zkoss.org/

---

# 番外（HTML5/JavaScriptではない）

* Forgancy（フォーガンシー） グレープシティ株式会社
 * http://www.forguncy.com/
 * 有償アプリ
 * ExcelのようなインターフェースでデザインしてWebアプリとして動作することができるツール
一般ユーザーで Apache を立ち上げる

以下の内容を my_apache.conf として保存

```
Listen 52828
ErrorLog /tmp/my_apache_error.log
PidFile /tmp/my_apache_pid
```

そして my_apache.conf と同じディレクトリで、次のようにして実行する

```
/usr/sbin/apache2 -k start -d . -f my_apache.conf
```

あとは my_apache.conf に virtualhost 設定したりお好きにどうぞ。
一般ユーザーで MongoDB を立ち上げる


以下のようにすると一般ユーザーでも起動できる。ポート番号は適当です。
この例だと /tmp/my_mongod というディレクトリを事前に作成しておく必要があることに注意

```
/usr/bin/mongod --unixSocketPrefix=/tmp/my_mongod --dbpath=/tmp/my_mongod --port=35274 --fork --logpath=/tmp/my_mongod/mongod.log --pidfilepath=/tmp/my_mongod/mongod.pid
```

どこかしらのポートで LISTEN するのをやめたいのけど、それはできない模様。


テスト用途であれば以下のように --noprealloc と --nojournal もつけておけば効率的かも

```
/usr/bin/mongod --unixSocketPrefix=/tmp/my_mongod --dbpath=/tmp/my_mongod --port=35274 --fork --logpath=/tmp/my_mongod/mongod.log --pidfilepath=/tmp/my_mongod/mongod.pid --noprealloc  --nojournal 
```
私が使っているキーボードでのアプリケーション、ウィンドウ切り替え方法

個人メモです。

特殊キーのシンボルは[The Apple Logo in Unicode](http://hea-www.harvard.edu/~fine/OSX/unicode_apple_logo.html)にまとまっていました。

# よく使うアプリケーションを1アクションで起動／切り替え

* [Spark](http://www.shadowlab.org/Software/spark.php)をインストールします。
* [Preferences]/[General]/[Start Spark Daemon at login]にチェックを付けておきます。

私は以下のHotKey設定にしています。

|キー|アプリケーション|
|:--|:--|
|^⌘1|KeePassX|
|^⌘2|Skype|
|^⌘3|HipChat|
|^⌘E|Firefox|
|^⌘R|Finder|
|^⌘A|Safari|
|^⌘C|Google Chrome|
|^⌘V|MacVim|
|^⌘T|iTerm2|

# アプリケーションとアプリケーション内でのウィンドウの切り替え

|キー|操作|
|:--|:--|
|⌘⇥|次のアプリケーションに切り替え|
|⇧⌘⇥|前のアプリケーションに切り替え|
|⌘` (*1)|アプリケーション内の次のウィンドウに切り替え|
|⇧⌘` (*1)|アプリケーション内の前のウィンドウに切り替え|

(*1): デフォルトでは`ではなくf1ですが押しにくいので変更しています。
[システム環境設定]→[キーボード]→[キーボードショートカット]→[キーボードと文字入力]→[次のウィンドウを操作対象にする]で変更します。

# ウェブブラウザでのタブ切り替え

Chrome, Firefox, Safariで共通です。

|キー|操作|
|:--|:--|
|⌘N|新しいウィンドウを開く|
|⌘T|新しいタブを開く|
|^⇥|次のタブに切り替え|
|⇧^⇥|前のタブに切り替え|
|⌘W|タブを閉じる|
|⇧⌘W|ウィンドウを閉じる|
angularjsのrepeatで、ng-clickで呼び出すメソッドにindexを渡す

# サンプル
```html
<div ng-controller="SampleCtrl" data-ng-init="init()">
  <table>
    <tr ng-repeat="item in items">
      <td ng-click="methodA($index)">
        {{item.id}}
      </td>
      <td>{{item.firstName}}</td>
      <td>{{item.lastName}}</td>
    </tr>
  </table>
</div>
```

```js
app.controller('SampleCtrl', function($scope) {
  $scope.items = [];
  $scope.init = function() {
     $scope.items = []; // TODO itemsに値を詰める
  };
  $scope.methodA = function(index) {
      alert($scope.items[index]);
  };
});
```

`ng-click="methodA({{$index}})"`とやってしまうと、エラーになるので注意
TimeLineで駄目だった非同期メモ

非同期処理をTimeLineでやっていたが、
オブジェクトが多くなってくるとやっぱりバグりだしたので、

EventEmitterとDeferredを使った発見のメモ


```test.js
A = (width, height) ->
    dfr = $.Deferred()
    aa = new AA()
    aa .init()
    return dfr.promise()

B = (width, height) ->
    dfr = $.Deferred()
    bb = new BB()
    bb .init()
    return dfr.promise()

C = (width, height) ->
    dfr = $.Deferred()
    cc = new CC()
    cc .init()
    return dfr.promise()

promises = [
    A(@w, @h)
    B(@w, @h)
    C(@w, @h)
]


$.when.apply(@, promises).done (args...) =>
    a = args[0]
    b = args[1]
    c = args[2]
    @DOC_ObjectPool_Body.addChild a.movieclip
    @DOC_ObjectPool_Body.addChild b.movieclip
    @DOC_ObjectPool_Body.addChild c.actionclip
    Stage.addChild @DOC_ObjectPool_Body
    dfr.resolve a, b, c
```
[教えて下さい]aptitudeの開発が止まっていると聞きました！


## きっかけ
Pressoでいつものようにはてぶを見ていたら、aptitudeの開発が止まっている、と。
参照：[該当ツイートのはてぶページ](http://b.hatena.ne.jp/entry/twitter.com/shyouhei/status/458966530802216960)

## 調べてみた！
・aptitude user's manual http://aptitude.alioth.debian.org/doc/en/
確かにCopyrightも2004-2008の状態だ...

・Debian 開発者情報 / aptitude terminal-based package manager
http://packages.qa.debian.org/a/aptitude.html
stable:0.6.8.2-1 これが出たのはMon, 05 Nov 2012...
testing / unstable:0.6.10-1 最近も開発はされているのかな？？
(testingとか、パッケージでの位置づけがよく分かっていません><)

## 周りの声
ただ、Ubuntuでもaptitudeはインストールしないとデフォルトでは入ってないと聞く。

知っている方がいらっしゃいましたら教えて下さい！
vimperator の外部エディタに gnome-terminal + vim を指定

# Ubuntu 環境下では

デフォルトの外部エディタは GVim (vim-gnome)。

CUI な vim を使いたい。

# ググったら

ドンピシャな記事があった。

- [LinuxのGnome上でVimperatorから外部エディタとしてCUIのVimを使う方法 | PCと遊ぶ日々の記録](http://calcurio.com/wordpress/?p=244)

上記の通りでおkだが、微妙に改良できたのでメモっておく。

# 結論

```vim
set editor='gnome-terminal --hide-menubar --disable-factory --geometry=119x57 --execute vim -c "set ft=markdown" '
```

gnome-terminal の設定

- `--hide-menubar`
    - メニューバーを消す
- `--disable-factory`
    - プロセスをフォークさせない?
- `--geometry=NxN`
    - ウィンドウサイズの指定
    - タイル型ウィンドウマネージャを利用していれば無縁な話
- `-x, --execute`
    - 以降の引数等を指定したコマンドに渡して実行

vim の設定

- `-c`
    - ファイルが読み込まれた後に、指定のコマンドを実行
- `"set ft=markdown"`
    - ファイルタイプを Markdown に固定

vim はファイルタイプを拡張子で判断しているが、作成される一時ファイルの名前が `vimperator-localhost.tmp`

最近は Markdwon ばかりなので固定しておく。

# さらに

vimperator のショートカットを追加

```vim
nnoremap gI gi<C-i>
```

`gI` と打つと「最初の入力欄を外部エディタで編集」する。

# geometry の求め方

滅多にやらないなのでメモっておく

- 対象ウィンドウを希望のサイズに調整
- `wmctrl` などを使って対象ウィンドウの Window ID を得る
- `xwininfo -id WID` の geometry 欄をコピペ
htmlディレクトリをvagrantディレクトリのシンボリックリンクすにするcookbook

vagrantを起動してcookした時に`/var/www/html`が`/vagrant`のシンボリックリンクになっていると何かと楽なので作ってみました。

cookbookの該当箇所
---------

<pre class="brush:ruby">
directory '/var/www/html' do
  action :delete
  not_if { File.symlink?('/var/www/html') }
end

link "/var/www/html" do
	to "/vagrant"
	link_type :symbolic
end
</pre>

参考ブログ参照しながら作業してたけど、少しずつChefのドキュメントが読めるようになってきた。慣れだな。

参考
----

- [Chef | resources | directoryでディレクトリ操作 - tbpg’s programming memo](http://d.hatena.ne.jp/tbpg/20131105/1383663450)
- [link — Chef Docs](http://docs.opscode.com/resource_link.html)
SublimeTextを開くコマンドを作成する

コマンド作成方法
--------------

コマンドの作成方法はこれ。

<pre class="brush:bash">
$ ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl
</pre>

コマンドは既にアプリケーションの中に用意されているので、そのシンボリックリンクを作る形になります。`~/bin/subl`の部分はPATHに設定されているディレクトリならどこでもOK。僕の場合は`~/tools/bin/`に設定しました。

オプション
---------

オプションもいくつかある様子。Sublime Text3でも問題なく動作しました。

<pre class="brush:bash">
$ subl --help
Sublime Text build 3059

Usage: subl [arguments] [files]         edit the given files
   or: subl [arguments] [directories]   open the given directories
   or: subl [arguments] -               edit stdin

Arguments:
  --project <project>: Load the given project
  --command <command>: Run the given command
  -n or --new-window:  Open a new window
  -a or --add:         Add folders to the current window
  -w or --wait:        Wait for the files to be closed before returning
  -b or --background:  Don't activate the application
  -s or --stay:        Keep the application activated after closing the file
  -h or --help:        Show help (this message) and exit
  -v or --version:     Show version and exit

--wait is implied if reading from stdin. Use --stay to not switch back
to the terminal when a file is closed (only relevant if waiting for a file).

Filenames may be given a :line or :line:column suffix to open at a specific
location.
</pre>

参考
----

- [OS X Command Line - Sublime Text 2 Documentation](https://www.sublimetext.com/docs/2/osx_command_line.html)
Shell Tips


##はじめに

思いつく限りシェル(コマンド)で使える技を並べていきます。補完の方よろしくお願いします。

##空白を削除する

```bash
$ tr -d ' '
```

##出力結果を表示しないようにする

```bash:
$ echo test > /dev/null 2>&1
```

##改行も含め出力する

```bash:
$ cat << EOF
a

b

c
EOF
```

ちなみに、出力結果は、以下のようにして保存できます。


```bash:
$ cat << EOF > ~/hoge.txt
a
b
c
EOF
```

##bashで現在地のパスを取得する

```bash:
$ dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
```

##zshで現在地のパスを取得する

```bash:
$ dir=${0:a:h}
```

##変数のクォーテーションなどを取り除く

```bash:
$ com=test
$ com="eval echo '$'$com"
```

##curlで連続保存する

```bash:
$ curl -O https://hoge.txt -O https://huga.txt
```

##curlをサイレントにする

```bash:
$ curl -s -O https:/hoge.html
```

##sedで連続置換する

```bash:
$ sed -e 's/hoge/huga/g' -e 's/huga/hugahuga/g'
```

##sedで上書き保存する

```bash:
$ sed -i "" -e "s/hoge/huga/g" test.txt
```

`-i`はバックアップを作ります。作りたくないので、`null`にしています。

通常なら`-ie`でいけたと思っていたのですが、Macでは上手く行かなかったような気がします。

##jqで括弧を取り除く

```bash:
$ echo {"hoge":"huga"} | jq -r .
```

##改行をスペースに変換する

```bash:
$ perl -p -e 's/\n/ /g'
```

##出力しない一括設定

```bash:
#!/bin/zsh
exec > /dev/null 2>&1

ls -a .
pwd
```

##区切りを設定し、値を取得する

```bash:
$ echo ho,ge,hu,ga | cut -d ',' -f 3
```

この場合、`hu`が取得されます。

##行末の改行コードを削除する

```bash:
$ ruby -0777 -ne 'print $_.chomp("")'
```

##パス内から優先順位が高いものを実行する

```bash:
#!/usr/bin/env ruby
```

`env`がそうです。

##指定した行を抜き出す

```bash:
cat test.txt | awk 'NR==3'
```

`test.txt`の`3`行目を抜き出します。


##引数によって処理を変える

```bash:
#!/bin/zsh

if (( ${#*} == 2 )); then
    echo $1 $2
else
    echo no
f
```

`$2`です。

##ファイルの有無によって処理を変える

```
#!/bin/zsh

sc="../script"
if [ -e $sc/path.sh ];then
    echo ok
else
    echo no
fi
```

`-e`です。

##結果によって処理を変える

```bash:
#!/bin/zsh

if ls ~/test.txt;then
    echo ok...test.txt
else
    echo no...test.txt
fi
```

または、以下の様な書き方もできます。

`if [ $# == 0 ]; then`

`if [ $# -eq 0 ]; then`


##何もしないコマンド

```bash:
:
```

##タイムスタンプの変更

```bash:
touch *
```

##以外の文字を検索する

```bash:
$ echo "test ok hoge huga" | grep -v -e zsh
```

##一致した行の上下を含める

```bash:
$ grep -a -B 25 -A 100 
```

`-A`が下で`-B`が上です。

##重複していないものを抜き出す

```bash:
$ sort test.txt | uniq -u
```

##キーの入力待機

```bash:
#!/bin/zsh

echo enter!
read key
```

##前のコマンドの引数以外を抜き出す

```bash:
$ !:-
```

##前のコマンドの引数を実行する

```bash:
$ !$
```

##前のコマンドの引数ヘッダを抜き出す

```bash:
$ !$:t
```

##xargsを任意の位置に置く

```bash:
find . -name "*.rb" -type f | xargs -I {} echo Hello, {} !
```

##追記
###出力しないようにする

[LINK](http://qiita.com/syui/items/3ca5bda7608de2cccdea#comment-5393a6bbf7811ef715c7)

```bash:
$ echo test &>/dev/null
```
Ubuntu のログインパスワードを忘れた

# Ubuntu 14.04 が公開されたことだし

いい加減、VirtualBox 上の不要な仮想マシンを削除しようと思い立った。が、ログインパスワードが全く思い出せん。削除する前に中身をチェックしておきたいのだが...

パスワードをリセットするしかないか。

# ググると

情報は多いが、ドンピシャなものは見つからなかった。

いくつかを組み合わせたら上手くいったのでメモを残しておく。間違いや、より簡単な方法があれば、ご指摘していただけるとありがたい。

# 環境

- (VirtualBox 上の) Ubuntu 13.10
    - GRUB は `2.00-19ubuntu2.1` と出ている

# 概要

書き込み可能なリカバリーモードで root 権限を使い、当該アカウントのパスワードを新たなパスワードで上書きする。

# まず GRUB のメニューを編集する

- マシンの起動開始後 `shift` を押しっぱなしで GRUB のメニューを表示
- `Advanced options for Ubuntu` にフォーカスし
- `e` でメニュー項目の編集画面に入る

(Emacs-like だと... ぐぬぬ)

# リードオンリーなリカバリーモードを書き込み可に

ここがちょっとややこしい

- 編集対象はメニュー項目のうち `(recovery mode)` となっているものから選ぶ
- `linux` で始まる行の `ro` を `rw` にする
- 編集後 `Ctrl+x` で GRUB メニューへ戻る
 
手順や変更箇所が異なるが [Linuxだからできないなんて言わないよ Ubuntu 13.04 ログインできなくなったら…](http://tenten909.blog.shinobi.jp/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%96%A2%E9%80%A3/ubuntu%2013.04%20%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%89%E2%80%A6) のスクリーンショットが参考になるかもしれない

# リカバリーモード起動

- 先ほど書き換えた項目を選択・起動
- CUI 上で GUI のリカバリーメニューが表示される
- `root` を選択
- 画面下部にプロンプトが表示される
- `passwd USER` を実行 (USER は適宜置き換えること)
- 新しいパスワードを2回入力し、成功すると `passwd: password updated successfully` と表示される
    - リードオンリーだとここでコケる
- `exit` > (GUIで) OK を2回 > Ubuntu が起動するので(念の為)一度シャットダウン
- 新しいパスワードでログイン

ここでの手順は [[Linux] Ubuntuでパスワードを忘れた場合の対処法](http://www.ipentec.com/document/document.aspx?page=linux-ubuntu-forget-password) のスクリーンショットが参考になるかもしれない

# 肝は書き込み可だった

リードオンリーだと `passwd USER` で

```
passwd: Authentication token manipulation error
```

などと怒られる。このエラーメッセージでググると、ファイルの整合性が取れていない場合の対処法ばかりがヒットする。

整合性が取れていない場合の対処法 `pwconv` を実行しても

```
pwconv: cannot lock /etc/passwd; try again later. 
```

と怒られるだけ。

[kakakikikekeのブログ: Ubuntu10.04でシングルユーザーモードでログインする方法](http://kakakikikeke.blogspot.jp/2012/04/ubuntu1004.html) のおかげで助かった。


# 他に参考になったサイト

- [UbuntuTips/Others/Password Forgot - Ubuntu Japanese Wiki](https://wiki.ubuntulinux.jp/UbuntuTips/Others/Password%20Forgot)
zshのcd


##z

`autojump`の挙動が少し変だったので、[z](https://github.com/rupa/z)に変更してみました。zは、移動履歴を検索し、頻度によって候補を表示するプラグインです。

```bash:~/.zshrc
# z
source $HOME/dotfiles/.zsh/tools/z/z.sh
compctl -U -K _z_zsh_tab_completion ${_Z_CMD:-z}
alias j="z"
```

私の場合は、`brew`を使って入れましたので、以下の様な感じかと思います。

```bash:~/.zshrc
. `brew --prefix`/etc/profile.d/z.sh
compctl -U -K _z_zsh_tab_completion ${_Z_CMD:-z}
```

##cd -

`cd -<Tab>`で直近の移動候補を表示したりできます。ちなみに、`cd -`では、前のディレクトリに移動です。

##pushd

上の階層や下の階層に移動するには、`pushd`や`popd`を使います。

```bash:~/.zshrc
# pushd
# http://www.ayu.ics.keio.ac.jp/~mukai/tips/zshdir.html
setopt AUTO_PUSHD
alias gd='dirs -v; echo -n "select number: "; read newdir; cd +"$newdir"
setopt PUSHD_IGNORE_DUPS
```

##^で上の階層へ移動

```bash:~/.zshrc
# ^を押すと上の階層へ
# http://qiita.com/items/b01536fa63d9f8fadf4f
cdup() {
    if [ -z "$BUFFER" ]; then
        echo
        cd ..
        if type precmd > /dev/null 2>&1; then
            precmd
        fi
        local precmd_func
        for precmd_func in $precmd_functions; do
            $precmd_func
        done
        zle reset-prompt
    else
        zle self-insert '^'
    fi
    ls -a
}
zle -N cdup
bindkey '\^' cdup
```

ちなみに、`^`入力は、`sed`とかでたまに使うので、そういう時は、キーバインドでも変更してみてください。[こちら](http://qiita.com/syui/items/254c0aa70a865e939b06)にまとめました。
Linuxコマンド集


###ディレクトリ

####作成
mkdir []

####削除
rmdir []

<br>
###ファイル

####編集
vim []

####コピー
cp [] []
cp test.txt test1.txt

####移動/名前変更
mv [] []
mv test.txt home
mv test.txt test1.txt
####削除
rm []
-d ディレクトリの削除
-r 配下のディレクトリごと削除

####検索
find []


####検索(ファイルの中身を検索対象に)
grep [検索対象] [範囲]


####検索(検索対象をカウント)
grep -c [検索対象] [範囲]


####検索(ディレクトリも含む)
grep -r [検索対象] [範囲]


####閲覧
cat []

<br>
###便利系

####ワイルドカード(任意の文字いくつでも)
*
rm *.txt(.txtを全消し)

####ワイルドカード(任意の文字一つ)
?
rm test.te?t(?に以外が同じものを消す)

####履歴
history
→!番号　実行
→!文字列　一番最後の候補を実行
→!文字列:p　コマンドの内容表示

####マニュアル
man [コマンド]

####ツリー構造
tree

####時間表示
date

####カレンダー
cal

####ファイルの情報
wc
Xcode5でCodeSnippetsをgit管理する

今日の勉強会でCodeSnippetsの機能の紹介を見て、後回しにしていたことを思い出して書き出してみることにしました。XcodeのCodeSnippetsのgit管理についてです。

CodeSnippets機能の簡単な説明
---------------------------

CodeSnippetsは、Xcodeのスニペット機能で、if文やinline Blockなどデフォルトで幾つか用意されています。利用時はこのようになります。

<img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.morizotter.com/wp-content/uploads/2014/04/morizotter_blogif.png" alt="If" title="if.png" border="0" width="390" height="94" />

一覧はここにあります。

<img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.morizotter.com/wp-content/uploads/2014/04/morizotter_blogsnippets.png" alt="Snippets" title="snippets.png" border="0" width="264" height="382" />

ここに書いたコードをドラッグ&ドロップするとカスタムのスニペットを追加することができます。更に、`<# #>`でくくると、スニペットを利用した際にその部分にコードを挿入することができるようになります。その部分の利用方法は下記のブログがわかりやすいです。

- [Cocoaの日々: [iOS][Mac] Xcode4 : カスタムなコードスニペットの作成](http://cocoadays.blogspot.jp/2011/06/iosmac-xcode4.html)

スニペットに関してはこちらが参考になると思います。

- [Xcode-Snippets/README.md at master · mattt/Xcode-Snippets](https://github.com/mattt/Xcode-Snippets)

CodeSnippetsをgitで管理する
----------------------------

さて、本題です。このCodeSnippets、マシンを変えたりするともちろん利用できないんですね。あと、Xcodeのメジャーアップデートの際などに消えてしまったような気もします（確証ないですが、そのあたりのタイミングでまっさらになりました）。そんな、不安定さがありあまり使っていなかったんですが、ちゃんとgitで管理しちゃえば不安とはおさらばできます。

まず、このファイルがどこにあるか。

<pre class="brush:bash">
~/Library/Developer/Xcode/UserData/CodeSnippets
</pre>

ここにあります。カスタムのスニペットが一つでもあると表示されます。中身はxmlで記述されています。この **CodeSnippets** ディレクトリの中で、`git init`してbitbucketだとかGithubにpushしておけば管理開始です。簡単ですね。

僕の場合は、こういう管理対象のファイルは`~/tools/Xcode`ディレクトリにまとめて入れていて、そこからシンボリックリンクをXcodeの中に張っています。こうすることで管理対象を見失わないようになるかななんて思ってます。

<pre class="brush:bash">
$ ln -s ~/tools/Xcode/CodeSnippets ~/Library/Developer/Xcode/UserData/CodeSnippets
</pre>

おまけ: CodeSnippetsをDropboxで共有する
------------------------------

同じような発想なんですが、Dropboxで共有することもできます。Dropboxのディレクトリの中にCodeSnippets本体を入れておき、`~/Library/Developer/Xcode/UserData/CodeSnippets`にシンボリックリンクを作成すれば複数端末でCodeSnippetsを同期することができます。

お好きな方を〜。小ネタですがQiitaデビューとして書いてみました。

参考
----

- [Cocoaの日々: [iOS][Mac] Xcode4 : カスタムなコードスニペットの作成](http://cocoadays.blogspot.jp/2011/06/iosmac-xcode4.html)
- [mattt/Xcode-Snippets](https://github.com/mattt/Xcode-Snippets)
- [yidev@恵比寿勉強会 : ATND](http://atnd.org/events/49477)
Windowsの標準のコンソールが糞なのでより良い物を探したけど見つからなかった

自分のブログに書いたものそのままなのですが、うちのブログにはほとんど人がこないのでこちらに記事を作りました。
http://programming.ironsand.net/2014/please-tell-me-better-console-in-windows/

### 基礎知識

**コンソールとシェルは別物です**

`bash`とか`nyaos`とかコンソールウィンドウの中で動くものがシェルです。この用語の違いをわかってないとそもそもコンソールというものを探すことができないので必須の知識になります。

### シェルは nyaos がオススメ

Windows上で使うシェルはcygwinの`bash`とかGit付属の`bash`とかMSYSあたりの`bash`とか試してみましたが、結局はちゃんとWindows用に作られてる`nyaos` が一番便利だという結論にたどり着きました。

### コンソールを変えよう

標準のcmd.exeで起動するコンソールウィンドウは文字幅が固定でコピペもまともに出来ない何かの罰ゲームではないかという出来なので別のものを探します。

候補はこんな感じ

- ConEmu
- Console 2
- ckw-mod
- ColorConsole
- PowerCmd

### ConEmu

現在一番よさそうなコンソールです。タブが使えて、新しいタブを開くときに現在のディレクトリを残したまま開けるのもポイントが高い。

`Ctrl-a`で行頭に移動とかそういうのも実装されてるし日本語も使えるし開発もさかんでStackoverflowに質問すると製作者が該当タグをウォッチしてるらしく直接回答をもらえる率が高いです。

ただ、何故か自分の環境だと時折動きがカクカクしだしビープ音が連続で鳴り響く時があります。間違えて大量にイベントが飛んでるくさいんですが、これが発生するとイライラするので使うのを控え中。

*2014/04/29追記*
作者さんの話によるとコンソール側にはビープ出力の機能がそもそもないらしいです。あとよくこの状態になるのは`C-a`などでのカーソル移動時で、この機能は`nyaos`の物なので、`nyaos`側の問題なのかもしれません。でも、再現がうまくできずにバグ報告ができない状態です。

### Console 2

動作も安定してるしタブも使える海外では定番のコンソールのようですが日本語が入力できません。はい詰んだ。

### ColorConsole, PowerCmd

この2つはそもそもシェルの変更ができませんでした。

### ckw-mod

日本人が作られてるらしいので日本語周りのバグはなさそうなのですが、いかんせんタブがない。古くからのタブ信者である自分には使いづらい。

### 結論

誰かよいWindows上で使えるコンソールを教えてください。
Eclipse を黒くする

# Overview

とりあえず黒くないと始まらないでしょ、ということで。

# How To

## プラグインのインストール

* メニューから [Help] -> [Eclipse Marketplace...] を選択
* Eclipse Marketplace ダイアログで、"eclipse color theme" などのキーワードで検索

![search_color.png](https://qiita-image-store.s3.amazonaws.com/0/41691/fb753b55-3a7d-2312-2684-7705fd582f32.png)

図ったように、今回入れたいプラグインが並んでヒットしました。（もちろん常にそうなっているという保証はありませんけどね。）
というわけで、Eclipse Color Theme と Eclipse Moonrise UI Theme をインストールします。
それぞれインストールするたびに再起動が促されますが、もちろん両方入れてから一度だけ再起動する方が効率がよいです。

## 設定

### Eclipse Moonrise UI Theme

* メニューから [Window] -> [Preferences] を選択
* 左ツリーから [General] -> [Appearance] を選択
* Theme で "MoonRise" を選択

![moonrise.png](https://qiita-image-store.s3.amazonaws.com/0/41691/658dd788-e0e4-41d7-aaf6-51109a618d04.png)

はい、黒くなりました。

### Eclipse Color Theme

* メニューから [Window] -> [Preferences] を選択
* 左ツリーから [General] -> [Appearance] -> [Color Theme] を選択
* 左の一覧から好きなテーマを選ぶだけ

![color_theme.png](https://qiita-image-store.s3.amazonaws.com/0/41691/bb864f71-b181-5006-3041-f6f0861cc52a.png)

デフォルトで選択できるテーマにびびっとこなかった場合や、他のエディタで使ってるあのカラースキーマじゃないと嫌だ、という場合、ダイアログの下の方にリンクがある [eclipsecolorthemes.org](http://eclipsecolorthemes.org/) から選び放題です。いや、放題かどうかは知りませんけど。
なお、eclipsecolorthemes.org から選ぶ場合は、XML をダウンロードしてきて、Preferences の Color Theme の下の方にある [Import a theme...] からインポートしてあげればよいです。

# Summary?

よき黒き Eclipse Life を!

![62f60eab-0866-e4f9-c76d-3cb09a079eb0.png](https://qiita-image-store.s3.amazonaws.com/0/41691/e134dd1f-b36c-bc86-78cb-17dc8914e552.png)
DBの正規化について

データベースの正規化に関してもう一度勉強しなおしたのでそのまとめとして．

## 正規化とは
データ設計手法の1つで関連するデータ項目毎にテーブルとして独立させつ作業の事．

## 正規化を行う目的
データの一貫性を保つこと．
なるべく修正する箇所は1箇所に留めたい!

## 非正規形
1つの列に複数のデータが登録されてしまっている状態．

## 第1正規形
各フィールドに1つしかデータがない状態になったテーブルの事をいう．

|生徒|高校|予備校|科目|担当講師|
|:------|:-----|:-----|:--|:--|
|佐藤栄作|長岡高校|川東校|国語|木村|
|佐藤栄作|長岡高校|川東校|英語|大橋|
|佐藤栄作|長岡高校|川東校|日本史|伊集院|
|鈴木一郎|長岡高校|川東校|英語|ボブ|
|鈴木一郎|長岡高校|川東校|数学|渡辺|
|高橋トミ子|王手高校|川北校|英語|大橋|
|高橋トミ子|王手高校|川北校|国語|木村|
|田中達也|広陵高校|川西校|英語|ボブ|
|田中達也|広陵高校|川西校|数学|渡辺|
|田中達也|広陵高校|川西校|理科|林|

## 第2正規形
ある項目が分かれば自動的に他の項目もわかるのであれば，同一のテーブルで管理しないほうが良い．
ユニークキーによって分割されている表の事を第2正規形と呼ぶ．

*イタリック体がユニークキー*

|*生徒*|高校|予備校|
|:------|:-----|:----|
|*佐藤栄作*|長岡高校|川東校|
|*鈴木一郎*|長岡高校|川東校|
|*高橋トミ子*|王手高校|川北校|
|*田中達也*|広陵高校|川西校|

|*生徒*|科目|担当講師|
|:------|:--|:--|
|*佐藤栄作*|国語|木村|
|*佐藤栄作*|英語|大橋|
|*佐藤栄作*|日本史|伊集院|
|*鈴木一郎*|英語|ボブ|
|*鈴木一郎*|数学|渡辺|
|*高橋トミ子*|英語|大橋|
|*高橋トミ子*|国語|木村|
|*田中達也*|英語|ボブ|
|*田中達也*|数学|渡辺|
|*田中達也*|理科|林|

## 第3正規形
1つのデータから推移的に別のデータがわかる場合，それを別の表に分割する作業を第3正規化という．
推移的にわかるデータが存在しない表を第3正規形という．

|*生徒*|高校|
|:------|:-----|
|*佐藤栄作*|長岡高校|
|*鈴木一郎*|長岡高校|
|*高橋トミ子*|王手高校|
|*田中達也*|広陵高校|

|*高校*|予備校|
|:-----|:----|
|*長岡高校*|川東校|
|*王手高校*|川北校|
|*広陵高校*|川西校|
GruntでJSファイルからconsole.logを消す方法


概要
------------------------
本番環境にアップしたさいに console.log をうっかり消し忘れて、ログ出っぱなしでIEとかでうわああああを防ぐ方法です。

![grunt-chan-log.png](https://qiita-image-store.s3.amazonaws.com/0/20773/40ec80b9-68bb-a728-ba9e-8858c50de5a4.png "grunt-chan-log.png")

Grunt プラグインの [grunt-contrib-uglify](https://www.npmjs.org/package/grunt-contrib-uglify) はJSファイルの結合や圧縮だけでなく、使われていないコード、デッドコードを削除する機能があります。これを利用して本番環境では必要のない console を取り除きます。

Grunt実行時にデバッグ用フラグをスイッチして、console.log をデッドコードにしてしまおうという仕組みです。

デバッグ用コードを準備する
------------------------
Grunt と grunt-contrib-uglify はインストール済みという前提です。

次のようなjsがあったとします。

````javascript:index.js
console.log('hello!');

if (DEBUG) {
    console.info('console.info');
}

DEBUG && console.debug('console.debug');
````

肝は DEBUG というグローバル変数です。
このグローバル変数を uglify で値を入れ替えてデッドコードを意図的に作り出すのです。

Gruntの設定
------------------------
Gruntfile.js に uglify のタスクを2つ作成します。

````javascript:Gruntfile.js
module.exports = function (grunt) {

    grunt.loadNpmTasks('grunt-contrib-uglify');

    grunt.initConfig({
        uglify: {
            //デッドコードの削除を有効にする
            options: {
                compress: {
                    dead_code: true
                }
            },

            //【開発版】変数 DEBUG を true に定義
            dev: {
                options: {
                    compress: {
                        global_defs: {
                            "DEBUG": true
                        }
                    }
                },

                files: {
                    './index.min.js': ['./index.js']
                }
            },

            //【公開版】変数 DEBUG を false に定義
            app: {
                options: {
                    compress: {
                        global_defs: {
                            "DEBUG": false
                        }
                    }
                },

                files: {
                    './index.min.js': ['./index.js']
                }
            }
        }
    });
};
````

DEVタスク実行時に true を DEBUG に代入するので、当然 console の箇所は実行されます。

もう一方の APPタスクは DEBUG を false にします。これもコードを見たとおり console は実行されません。つまりデッドコードになるので圧縮時にはコード上から削除されるのです。

この方法のよいところは、ifブロックもまるごと削除されるので、ログだけでなく開発時にだけ必要なコードを分離しておくのにも便利です。

Gruntタスクで出し分けする
------------------------

````sh
$ grunt uglify:dev
````

DEVタスクを実行させます。
出力後のコードはたぶんこんな感じになります。

````javascript:index.min.js
console.log("hello!"),console.info("console.info"),!0&&console.debug("console.debug");
````

細かいとこは uglify のバージョンで変わりそうですが、3つの console があることには変わりないと思います。

````sh
$ grunt uglify:app
````

APPタスクを実行させてみましょう。

````javascript:index.min.js
console.log("hello!");
````
デバッグ用のコードがきれいに取り除かれて、ただの console.log のみになっているはずです。

変数による出し分けよりもはるかに安全で、無駄なコードもなくなるのでおすすめです。
nil や false でも遅延初期化したい！

今 [リファクタリング:Rubyエディション](http://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-Ruby%E3%82%A8%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3-Jay-Fields/dp/4048678841) の輪読会をやっているんですが、
本日この本で知った小ネタをメモしておきます。

Ruby でインスタンス変数を遅延初期化するときには、 `||=` というイディオムをよく使いますよね。
ここでの遅延初期化とは initialize (コンストラクタ) で事前にインスタンス変数を初期化しておくのではなく、
インスタンス変数に初めてアクセスする際に初期化することです。

```rb
class SoulGem
  def clearness
    @clearness ||= 100
  end

  def get_polluted
    @clearness = clearness - 1
  end
end
```

初回のアクセスでインスタンス変数に値が代入され、以降のアクセスでは既に代入された値が返されます。

ただし代入された値が nil や false (すなわち偽) の場合は、毎回右辺の値が代入されてしまいます。

```rb
class Magica < ActiveRecord::Base
  def best_friend
    # Magica.find_by 実行時には SQL が発行される。
    @best_friend ||= Magica.find_by(best_friend_id: self.id)
  end
end
```

~~Magica オブジェクトが (叛逆公開前の) マミさんの場合など~~
`Magica.find_by(...)` の結果が nil の場合、
せっかく遅延初期化をしようとしているのに best_friend が呼ばれる度に find_by が実行されます。
その結果、毎回 SQL が発行されてしまいます。あたしってほんとバカ……。

その場合は `Object#instance_variable_defined?` を使うと幸せになれそうです。
インスタンス変数が定義されていない場合のみ初期化するのです。

```rb
class Magica < ActiveRecord::Base
  def best_friend
    unless instance_variable_defined?(:@best_friend)
      @best_friend = Magica.find_by(best_friend_id: self.id)
    end
    @best_friend
  end
end
```

これで初期化時の値が nil や false になりうる場合でも、安心して遅延初期化ができますね！

### 参考

* [instance method Object#instance_variable_defined?](http://docs.ruby-lang.org/ja/2.1.0/method/Object/i/instance_variable_defined=3f.html)
構造的部分型について


[Structural Subtyping とは](http://igeta.cocolog-nifty.com/blog/2008/05/subtyping.html) - いげ太のブログ

> structural subtyping （構造的部分型）とは、強い型付けによる恩恵は魅力的やな、でも型は定義しても継承関係までは定義したくない、制限による堅さに利はあるけど柔軟性を失いすぎるのもちょっとな、インターフェースばっかりいくつも定義するのもアホらしいし、その時々で適当なインターフェース割り振るようにしたらステキやん、というシグネチャ至上主義だ。


[構造的部分型の比較](http://d.hatena.ne.jp/osiire/20091105) - まぁ、そんなもんでしょう

> * OCamlは全て型推論してくれる代わりに部分型への変換は明示的。部分型変換ができるバリアントがある。
* haXeは全て型推論してくれて、かつ部分型への変換も暗黙的にできるけど、場合によってはコンパイルがとまらない
* Scalaは型推論は(完璧には)してくれないけど、部分型への変換は暗黙的


## Scalaの構造的部分型

http://www.ne.jp/asahi/hishidama/home/tech/scala/type.html

```
// クラスAとBには継承関係は無い
class A {
  def zzz() = println("aaa")
}

class B {
  def zzz() = println("bbb")
}
```

```
scala> var z : { def zzz() } = _
z: AnyRef{def zzz(): Unit} = null

scala> z = new A
z: AnyRef{def zzz(): Unit} = A@61064425

scala> z.zzz()
<console>:9: warning: reflective access of structural type member method zzz should be enabled
by making the implicit value scala.language.reflectiveCalls visible.
This can be achieved by adding the import clause 'import scala.language.reflectiveCalls'
or by setting the compiler option -language:reflectiveCalls.
See the Scala docs for value scala.language.reflectiveCalls for a discussion
why the feature should be explicitly enabled.
              z.zzz()
                ^
aaa
```

上の警告は

```
$ scala -language:reflectiveCalls
```
で除ける。明示的に機能をオンにしないといけないのは、
リフレクションを使っていいよっていう許可を与えるため。

```
scala> class A { def zzz() = print("aaa") }
defined class A

scala> class B { def zzz() = print("bbb") }
defined class B

scala> val list = List[{ def zzz() }](new A, new B)
list: List[Object{def zzz(): Unit}] = List(A@f1da57d, B@194fad1)

scala> for(z <- list) z.zzz()
aaabbb
```

```
scala> def callzzz(x:X) = x.zzz()
<console>:7: error: not found: type X
       def callzzz(x:X) = x.zzz()
                     ^

scala> def callzzz(x:{def zzz()}) = x.zzz()
callzzz: (x: AnyRef{def zzz(): Unit})Unit

scala> callzzz(new A)
aaa
scala> callzzz(new B)
bbb

```

`X`の部分を型推論させることはできないのかな？

## HaXe

構造体(匿名オブジェクト)
http://haxe.org/manual/struct?version=17720

```
class Person { // Personクラスはname関数を持っている
  public function new() { }
  public function name() { return "osiire"; }
  public function age() { return 20; }
}
class Test {
  public static function main() {
    print(new Person());
  }
  public static function print( n ) { // name関数があればいい
   trace(n.name());
  }
}
```

結果

```
osiire
```

`Person`クラスが`name`メソッドを持っていないとコンパイルエラー

```
class Person {
  public function new() { }
  public function age() { return 20; }
}
```

```
Build failure
Test.hx:10: characters 10-22 : Person should be { name : Void -> String }
Test.hx:10: characters 10-22 : Person has no field name
Test.hx:10: characters 10-22 : For function argument 'n'
```


## OCaml

## TypeScript

http://yaakaito.org/blog/2013/05/02/typescript-subtyping/
初めてハッカソンに参加して絶望を経験する．


昨日，東京で2日間にわたって行われたハッカソンに参加して学んだ事を経緯を追って書いていきたいと思います．
2日間の大まかなスケジュール
### 1日目
| 時間 | 内容 |
|:------------|:-----------------|
|11:00 - 12:00|開発              |
|12:00 - 13:00|昼食              |
|13:00 - 18:00|アイデア企画・DB設計|
|18:00 - 19:00|夕食              |
|19:00 - 21:00|開発              |
### 2日目
|時間        |内容        |
|:----------|:----------|
|10:00 - 12:00|開発|
|12:00 - 13:00|昼食|
|13:00 - 16:00|開発|
|16:00 - 20:00|プレゼン&懇親会|

## 第1章 事前MTG

ハッカソン当日までにメンターの方も交えてのSkypeMTGを3回ほど行いました．
そこではどんなアプリケーションを作りたいかをテーマに沿って決めていき，いくつかの候補に絞られた．
そして開発環境の確認等も済ませた．

## 第2章 アイデア企画で行き詰まる

メンターの方やエンジニアの方のアドバイス等を頂きながら，何を作ったら良いのか分からなくなってくる．
そして，他のグループが開発を始めたような中，自分たちはまだアイデア企画を練っていた．

## 第3章 開発環境の切り替え

事前MTGではRuby on RailsでWEBアプリケーションを作成するとなっていたが，指摘を踏まえてフレームワークのSinatraを使う事となり，Sinatraの勉強からスタートとなった．

## 第4章 絶望の前兆

FacebookのAPIの仕様変更に気づかず，自分のアカウントに登録されている全友達を取得しようと試みる．
しかし...プログラム上では私には友達がいない．返ってくる配列には何も入っていない空の配列が返ってきた．
実際は200人以上は友達が登録されているのになぜ...
あらゆるエンジニアの方のサポートも受けながら，友達のリストを取ってこようと粘って約6時間が経過した．

## 第5章 絶望

会場を変えて，あるエンジニアの方と公式Docを読んでいた．すると気になる文章が...
これが絶望の始まりであった．
時間は既に夜の11時.
先程の文章が確かなのか検証を行った．すると仮説通りの動きをしてしまった．
ここで大きくこのアプリケーションの仕様変更をする事となった．

## 第6章 睡魔

まぶたが重くなっていくなか，Facebookの公式Docを読みながら開発を進めた．
そしてまだ開発は途中までしかいってない中，とうとう睡魔に負けてしまった．
約1時間寝た．

## 第7章 DB接続に行き詰まる

DBと接続しないと次の工程に移れない中，SinatraとDB接続の設定に行きづまってしまった．
またまたこれに約数時間を要してしまった．

## 第8章 焦り

DB接続の設定が終ったのが発表準備の約1時間前であった．
ここでDB設計どおりにテーブルを作成し，そこにサンプルデータを入れていったのであった．

## 第9章 嫌な予感

無事にテーブルの作成も終わり，サンブルデータも入れ終わった．
という事でロジックを書いていこうとした時だった．
DB設計の紙を見ていたら，何か嫌な予感がよぎった．
そう...あるデータとユーザモデルの情報を紐付ける事が出来ないのである．

## 終章 撃沈

紐付けが出来ない事に気付いたのは発表準備の約15分前の事であった．
エンジニアの方もこれはもう無理だね．となった．
そして，プレゼンに望む事となった...

# 考察
今回のハッカソンで学んだ事．

* エラーが出たら，エラー文をまず読み，ググる．
* それでも分からなければ公式リファレンスを読む．
* それでも分からなければ，そのライブラリのソースコードを読む．
* 英語の文章を嫌でも読め．
* FacebookのAPIは仕様変更が多いので危険!

以上
名前渡し必要なメソッドのモックが地獄

名前渡しするメソッドをもつやつのモックを定義しようとしたら地獄だった。

```scala:モック化する奴
trait Foo {
  def nyan(s: => String, repeat: Long)
}
```

このモックを `verify` しようとするとこんな風に書かないといけなくなる:

```地獄.scala
import org.mockito.ArgumentMatcher
import org.scalatest.FunSuite
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito._
import org.mockito.Matchers._
import org.mockito.Matchers

class MockingWithByName extends FunSuite with MockitoSugar {

  test("mocking with a by-name param and AnyRef param") {
    val foo = mock[Foo]
    val sound = "nyaaaaan"
    val repeat = 1111L

    //

    foo.nyan(sound, repeat)

    //

    // ダメ
    //verify(foo, times(1)).nyan(sound, repeat)
    // => Argument(s) are different! Wanted:
    // 問答無用で Function0 にラップされて nyan に渡されるので、
    // 実際に呼ばれた時と、verify 時で、違う Function0 のインスタンスになってしまうため。

    // じゃあこうすると ...
    classOf[Foo].getMethod("nyan", classOf[Function0[_]], classOf[Long])
      .invoke(
        verify(foo),
        argThat(new ArgumentMatcher[Function0[_]] {
          override def matches(argument: Any): Boolean =
            argument.asInstanceOf[Function0[_]].apply() == sound
        }),
        //Matchers.eq(repeat) // ダメ
        // ↑ invoke の第二引数以降は AnyRef 期待されてるんだけど、
        // nyan 自体は scala.Long (AnyRef でないクラス)を期待してるので無理
        Matchers.eq(new java.lang.Long(repeat)) // こうする必要がある
      )

    // 完
  }
}

// モックにするやつ
trait Foo {
  def nyan(s: => String, repeat: Long)
}
```

スタブ作ったり、`when` で返り値の定義をする時にも同様の書き方が必要になります。

つらすぎる。今回使った Mockito 以外にも Java 向けのモックフレームワークを薄くラップしてる系のものは同じ悩みを抱えるはずなんですが、もっとスマートに書かける方法／モックフレームワークないの。