OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftのローカルスコープで変数束縛したい場合


Objective-Cの場合は以下のようにシンプルに書けますが…

```objc
-(void) doSomething {
  NSMutableArray *items = [[NSMutableArray alloc] init];
  {
    NSString *str = @"a";
    [items addObject:str];
  }
  {
    NSString *str = @"b";
    [items addObject:str];
  }
  {
    NSString *str = @"c";
    [items addObject:str];
  }
}
```

Swiftでやる場合少し捻る必要があります。
4パターン考えてみました。

### if文のスコープを使う方法
```swift
func doSomething() {
  let items = NSMutableArray()
  
  if true {
    let str = "a"
    items.addObject(str)
  }

  if true {
    let str = "b"
    items.addObject(str)
  }

  if true {
    let str = "c"
    items.addObject(str)
  }
}
```

### switch文のパターンマッチを使う方法
```swift
func doSomething() {
  let items = NSMutableArray()
  
  switch ("a") {
  case let str:
    items.addObject(str)
  }

  switch ("b") {
  case let str:
    items.addObject(str)
  }

  switch ("c") {
  case let str:
    items.addObject(str)
  }
}
```

### 無名関数の引数束縛を使う方法
```swift
func doSomething() {
  let items = NSMutableArray()
  
  { (str) -> Void in
    items.addObject(str)
  }("a")

  { (str) -> Void in
    items.addObject(str)
  }("b")

  { (str) -> Void in
    items.addObject(str)
  }("c")
}
```

### 無名関数のスコープを使う方法
```swift
func doSomething() {
  let items = NSMutableArray()
  
  { () -> Void in
    let str = "a"
    items.addObject(str)
  }()

  { () -> Void in
    let str = "b"
    items.addObject(str)
  }()

  { () -> Void in
    let str = "c"
    items.addObject(str)
  }()
}
```

うーん、どれもいまいち綺麗に書けない。
crontabの書式


　過去メモを放流中。中身はちゃんと見てない。


##crontabコマンド

　crontabファイルの編集管理を行うコマンド。

<table class="table table-striped table-condensed">
<tr><th>オプション</th><th></th></tr>
<tr><td>`-e`</td><td>crontabファイルの編集を行う。</td></tr>
<tr><td>`-l`</td><td>crontabファイルを表示する。</td></tr>
<tr><td>`-r`</td><td>crontabファイルを削除する。</td></tr>
<tr><td>`-u username`</td><td>crontabコマンドでの操作を行うユーザを切り替える</td></tr>
</table>


##crontab設定ファイルの書式
　crontabファイルの操作は`$ crontab -e`と入力して行う。
編集内容は`/var/spool/cron/crontabs/`以下にユーザー名のファイルとして保管されるよう。

書式は各行に`実行サイクル コマンド`の形式で記述され、実行サイクル部は、

    min hour day month week command

という形で、6つのスペース区切りフィールドを用いる。

日時指定にはワイルドカード(*)が使用可能。分は0-59、時は0-23、日は1-31、月は1-12、曜日は0-6で指定するのが基本。加えて、

- 値は範囲指定(1-5)や、リスト指定(10,20,30...)が可能。
- 範囲とリストを併用(9-17,20,22)する事もできる。
- `/`キーワードで間隔指定可能。例えばhourの`9-17/2`は9-17時の2時間間隔を指す。
- 月は名前で指定可能(jan-dec)
- 曜日も名前で指定可能(Sun,Mon,Tue...)
- 曜日は7=Sunとしても使用可能。

##crontabを使わない方法

　`/etc/cron.hourly`,`/etc/cron,weekly`,`/etc/cron.monthly`といったディレクトリにスクリプトを置くだけで定期実行してくれる。超便利。これらの設定は、`/etc/crontab`を見ると載ってる。

##cronのメール設定

　メールなど環境変数の設定もcrontab内で行う。メールアドレスは

~~~
    MAILTO=user
~~~~

で指定する(アドレスではなくユーザ名指定)。ここで値を""にしてやるとメールを送らない設定になる。

基本的にはメールは無効にして、送りたいときは明示的に、`| Mail mail@adress.com` みたいなパイプつなぐほうがいいと思う。


###その他の設定項目
　もちろんMAILTOだけじゃなくSHELLやPATHなどの設定項目もあるが基本的な環境変数は外から引っ張ってくるみたい。
mysqlのユーザ管理


過去メモの放流中。mysqlでユーザを管理する方法のまとめ。

参考：[MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.1.3 GRANT 構文 :](http://dev.mysql.com/doc/refman/5.1/ja/grant.html)

##ユーザの登録
　ユーザ登録には,GRANT文を用いる。

    GRANT priv_type ON database.table　TO user_name　INDENTIFIED BY 'password';

###priv_type
　作成するユーザの権限を設定する。コンマ区切りで複数指定することも可能。

<table class="table table-condensed table-striped">
	<tr>
		<th>priv_type</th>
		<th>description</th>
	</tr>
	<tr>
		<td>ALL [PRIVILEGES]	</td>
		<td>一部を除く全てのシンプルな権限を設定します。</td>
	</tr>
	<tr>
		<td>ALTER	</td>
		<td>ALTER TABLE の使用を可能にします。</td>
	</tr>
	<tr>
		<td>CREATE	</td>
		<td>CREATE TABLE の使用を可能にします。</td>
	</tr>
	<tr>
		<td>CREATE TEMPORARY TABLES	</td>
		<td>CREATE TEMPORARY TABLE の使用を可能にします。</td>
	</tr>
	<tr>
		<td>CREATE USER</td>
		<td>CREATE USER、DROP USER、RENAME USER、REVOKE ALL PRIVILEGES の使用を可能にします。</td>
	</tr>
	<tr>
		<td>DELETE	</td>
		<td>DELETE の使用を可能にします。</td>
	</tr>
	<tr>
		<td>DROP	</td>
		<td>DROP TABLE の使用を可能にします。</td>
	</tr>
	<tr>
		<td>INSERT	</td>
		<td>INSERTの使用を可能にします。</td>
	</tr>
	<tr>
		<td>SELECT	</td>
		<td>SELECT の使用を可能にします。</td>
	</tr>
	<tr>
		<td>UPDATE	</td>
		<td>UPDATE の使用を可能にします。</td>
	</tr>
	<tr>
		<td>USAGE	</td>
		<td>「権限が無い」 の同義語です。</td>
	</tr>
</table>

###database.table
　権限を付与するデータベース名,テーブル名を指定する。ワイルドカード`*`が使用可能。

###user_name
　user_nameの項には,後ろに＠付きで続けることで,host_nameの指定も可能。コレによりホスト名に応じたアクセス権の供与が可能となる。引用符を用いる場合の書式は,`’sample_name'@'localhost'` のように＠の前後でそれぞれクオートする。

　ホスト名にはワイルドカード`%`が利用可能。ユーザ名でのワイルドカードは不可で,匿名ユーザは空文字列で作成する。匿名ユーザにもホストの指定は可能。

    ’test_user1’@'%.mkkn.info' --mkkn.infoのサブドメイン全てにマッチ
    'test_user2'@'192.168.0.%' --192.168.0.xxxの全IPにマッチ

###password
　パスワードは平文で記述すれば,自動的にハッシュ化された値が登録されるよう。なお,SET PASSWORD構文で後からセットすることも可能。

　SET PASSWORD FOR user_name = PASSWORD(’password’);

##ユーザの管理
###ユーザ権限の削除
　REVOKE構文を用いて行う。

    REVOKE ALL ON *.* FROM mkkn@localhost;

###ユーザの削除
　ユーザ情報は,userという名前のテーブルから確認できる。列はいろいろあるが,表示,確認の際には以下のコマンドで十分だろう。

    SELECT host, user, password FROM mysql.user;

ここから普通のテーブルと同様にDelete構文を実行すれば,ユーザを削除できる。

##ユーザ権限情報の更新
　mysql.userテーブルに変更を加えた場合,必ず以下のコマンドを入力すること。

    FLUSH PRIVILEGES;

これはDBのユーザ情報を更新する、という意味でコレを実行しないとDBに加えたユーザ除法の変更は反映されない。
CLIベースPHPのオプション


過去メモの放流。多分PHP5.3の時代に書いてるので`-S`がない。

##情報関連
<dl>
<dt>-i / --info</dt>
<dd>phpinfo()をコールし結果を出力する。</dd>
<dt>-l / --syntax-check filename</dt>
<dd>PHPの構文チェックを行う。-rとの共存不可</dd>
<dt>-w / --strip filename</dt>
<dd>コメントと空白文字を削除してソースを表示する。-rとの共存不可</dd>
<dt>-m / --modules</dt>
<dd>ロードされたモジュールの一覧を表示する。</dd>
<dt>-v / --version</dt>
<dd>バージョン情報を表示する。</dd>
<dt>--re / --rextension extention_name</dt>
<dd>指定したエクステンションのphp.iniオプション、定義済み関数、定数、クラスの一覧を表示する。</dd>
<dt>--ri / --rexinfo extention_name</dt>
<dd>phpinfoで表示される拡張モジュール情報を表示する。</dd>
</dl>

~~~bash
php -i | grep ini
php -m | grep gd
~~~

とかは色々捗る。ただし`php.ini`はcliのphpとwebのphpが異なるバイナリの可能性もあるので、注意(まぁそういう環境を作らないのが一番)。


##設定関連
<dl>
<dt>-c / --php-ini filename</dt>
<dd>php.iniを別途指定する。</dd>
<dt>-n / --no-php-ini</dt>
<dd>php.iniを完全に無視する。</dd>
<dt>-d / --define directive_name=value</dt>
<dd>php.iniのディレクティブに設定を書き込む。</dd>
</dl>

##実行関連

<dl>
<dt>-f / --file filename</dt>
<dd>指定したphpファイルを実行する。phpファイルに引数を渡す場合は下記注意参照</dd>
<dt>-r / --run 'code'</dt>
<dd>PHP上で指定したコードを実行する。`<?php`は不要。二重引用符内で$を使うとシェルによる変数展開が発生するため、コードは一重引用符をでくくるのがベター。</dd>
<dt>-d / --define directive_name=value</dt>
<dd>php.iniのディレクティブに設定を書き込む。</dd>
</dl>

php -r "code"の場合、なお二重引用符" "内の$varはsh/bashにより置換処理の対象となる。
$varを使用する場合一重引用符'　'を使うことが望ましい。
連想配列の添字のように$を使わないのであれば,二重引用符でも構わない。
Git のシンボリック参照についてまとめ


過去メモ整理中。多分内容は正しいはず。

[ 参考 ]
http://kozy4324.github.io/blog/2013/03/09/git-ref/
http://d.hatena.ne.jp/hokaccha/20120404/1333507076


## GIT と ハッシュ
GITはリビジョン管理をコミットのハッシュ番号で整理します。

4dda3528d5765aae856f8158e14e6ee217f05e24

みたいなあれです。指定するときは長いので先頭7文字とかで使ったりします。

GITにはハッシュの他にも、シンボリック参照というのがあったりします。

~~~:bash
$ git log 4dda352   # 4dda352までのログを表示
$ git log HEAD   # HEADまでのログを表示
$ git log dev   # devブランチのログを表示
~~~

### GITがシンボリック参照を追う流れ

GITは指定されたシンボリック参照<refname>に対して以下の順で追跡を行います。

1.  ファイル .git/<refname> が存在すれば、そのファイルに書かれたハッシュ文字を利用する。 
2. ファイル refs/<refname> が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
3. ファイル refs/tags/<refname> が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
4. ファイル refs/heads/<refname> が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
5. ファイル refs/remotes/<refname> が存在すれば、そのファイルに書かれたハッシュ文字を利用する。
6. ファイル refs/remotes/<refname>/HEAD が存在すれば、そのファイルに書かれたハッシュ文字を利用する。

これらのファイルはGITでの諸操作の際に自動的に生成され、対応するハッシュ値が書き込まれます。

#### .git/<refname>

　主に以下の様なファイルが該当します。

- HEAD
- FETCH_HEAD
- ORIG_HEAD
- MERGE_HEAD
- CHERRY_PICK_HEAD

自分で作成した場合には、そこに参照を維持することも可能です。

~~~~
$ cp .git/HEAD .git/MY_HEAD
$ git log MY_HEAD
~~~~

#### .git/refs/tags/<refname>

タグ作成で登録されるディレクトリ

#### .git/heads/<refname>

ブランチ作成で登録されるディレクトリ

#### .git/remotes/<refname>

リモート登録で登録されるディレクトリ

### シンボリック参照の中身を確認する。

シンボリック参照がどのハッシュ値として解釈されるのかを確認する場合、
ファイルを探してcatする、という手もありますが`rev-parse`コマンドを使うと便利です。

~~~~
$ git rev-parse master  # masterでの解釈
$ git rev-parse heads/master  # ブランチmasterの解釈
$ git rev-parse remotes/origin/master  # リモートoriginのmaster
~~~~

例えばシンボリックのmasterは通常ブランチmasterを意味しますが、
masterという名前のタグを作成した場合、そちらの参照が優先される事になります。

参照が実際に何を指しているのかを確認する場合に、`rev-parse`は非常に役立ちます。


### おわり

他にも参照名に`^n`などとつけてn個前の参照をたどる、など、GITには色々と便利なシンボリック参照が用意されれいます。

もっと知りたい、という人は
https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
あたりをご確認ください。
絵文字を表示するスクリプトを作ってみた


###注意
このページ、残念ながらmac上のchromeでは絵文字が見えません。safariでは見えることを確認しましたのでよろしければそちらでみてください。

##はじめに
twitterなどで?や?など、絵文字を見る機会が増えました。他にもどんな文字があるのか不思議におもってしらべたところスクリプトで簡単に表示できることに気づいたので作ってみました。

##インストール方法
python 2.* がある前提で、以下のコマンドを実行してください。

```
$ wget https://github.com/takekawa/emoji/raw/master/emoji
$ chmod 0755 emoji
```

以下のようにヘルプを実行して表示ができたら成功です。
 
```
 $ ./emoji -h  

     Usage: emoji [Options] [Message ...]
     Options:
        -h --help
           Print this message
        -l --list 
           Print all emoji-characters with the name 
        -a --all 
           Print all emoji-characters without the name 
```

##使い方

シンプルな例

```
 $ ./emoji sushi 
 ?
```

grepしてclockの名前の付く絵文字一覧を表示

```
 $ ./emoji -l | grep clock
 alarm_clock	⏰
 arrows_clockwise	?
 arrows_counterclockwise	?
 clock1	?
 clock10	?
 clock1030	?
 clock11	?
 clock1130	?
 clock12	?
 clock1230	?
 clock130	?
 clock2	?
 clock230	?
 clock3	?
 clock330	?
 clock4	?
 clock430	?
 clock5	?
 clock530	?
 clock6	?
 clock630	?
 clock7	?
 clock730	?
 clock8	?
 clock830	?
 clock9	?
 clock930	?
```

文字なので絵文字からの検索もできます。

```
 $ ./emoji -l | grep ?
 violin	?
```

[echo-sd](https://github.com/fumiyas/home-commands/blob/master/echo-sd) と組み合わせて 

```
$ ./echo-sd "突然の$(./emoji sushi)テロ"
＿人人人人人人人人＿
＞　突然の?テロ　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^￣
```

絵文字を見るだけでもたのしいのです。その場合はこちらがおすすめです。

```
./emoji -l
```


##コードの説明

1000行のうちほとんどは、絵文字名と文字コードのディクショナリです。コード本体は30行ほどしかありません。引数に応じて、特定の絵文字を出力したり、全部の絵文字を出力したりしています。コードポイントから文字を生成するのが簡単だったのでpythonを利用しましたが、どの言語でも簡単に実装できるとおもいます。

## 余談

絵文字のUnicode6.0の定義は[こちら](http://www.unicode.org/charts/PDF/Unicode-6.0/U60-1F300.pdf)ですが、抜き出しにくかったので、[FileFormat](http://www.fileformat.info/info/emoji/list.htm)を参考にしました。
Unicodeの7.0では[新規の絵文字が追加](http://www.unicode.org/charts/PDF/Unicode-7.0/U70-1F300.pdf)されていますが、こちらはmacではまだ実装されていなようでしたので今後の課題です。

Macで確認していますがデフォルトのterminal、およびiTerm2では絵文字は表示されました。
しかし、Emacs24.3.1、iTermでは表示されませんでした。あと、lessでも絵文字がうまく表示されませんでした。表示する方法をしっている方がいれば教えてください。
また、Chrome上でもこのページの絵文字は表示されません。コピーすると文字コードは正しく取得できているのでフォントの問題なのかもしれません。これもわかる方が入れば教えてください。

ではでは。
システム設計の流れ


昔のメモを整理してると出てきました。今となっては心底どうでもいい。

上流工程に関するあれこれ

## 大まかな流れ

基本的な流れとしては要件定義→外部設計→内部設計→開発の流れが採用される。
ここで外部設計は基本設計、内部設計は詳細設計とも呼ばれる。
一般にウォーターフォールモデルでの考え方では外部設計までが上流工程と考えられるようだ。

##要件定義

###要求開発(超上流工程)
[ 業務フロー ]　
業務とその流れを表現するもの。素人にもわかるように
　→ アクティビティ図　業務機能関連図
[ 業務モデル ]
業務を静的に表現する。
 →　ERD　クラス図

### 要件定義
システムの範囲を決定する。何を作って何を作らないかを明確にすること。

1.機能要件
　ユースケース一覧　機能一覧
2.非機能要件(FURPS+)
　>機能　機能要求
　>使用性　UIの指針、ユーザ教育、マニュアル
　>信頼性　管理、監視、保守、復旧
　>性能　実行性能、スケーラビリティ
　>保守性　信頼性、可溶性、セキュリティ
　>その他　ハードウェア構成、ネットワーク構成、ソフトウェア構成

##外部設計

外部設計（基本設計）では、要件定義をもとに開発しようとするシステムが外部にどのような機能を提供し、またどのようなインターフェイスを持つかを設計する。

基本設計の労力は要件定義の精度と反比例する。要するに要件定義フェーズの成果物たる機能要件、非機能要件、制約条件を、実際にプログラム可能な形にまで落としこむのが外部設計と考えて良い。要件定義で曖昧なまま進んだ項目や欠落した項目はここで再検討される必要がある。

外部設計は大きく３つの部分に分けて考えることができる。

### 方式設計(アーキテクチャ設計)
ハード/ソフトの構造や実装方針を決定する。
　→プラットフォーム設計（インフラ，ミドルウェア，プラットフォーム，フレームワークなどの決定）
　→アプリケーション・アーキテクチャ設計(アプリケーション全体の構造などの決定)
　→開発標準やテスト方式の決定

### 機能設計(アプリケーション設計)
システム全体をモジュール単位に分割し、各モジュールの外部仕様を決定する。
　→ビジネスロジック設計
　→データベース設計
　→画面・帳票設計
　→バッチ設計

### その他の設計
　→性能/信頼性設計
　→セキュリティ設計
　→移行設計（システム/業務）
　→運用設計（システム/業務）

## 内部設計

1.機能分割
2.物理データ設計
3.入出力詳細設計


##上流工程の手法：DFD

最も基本的な上流工程の方式としてDFD(Data Flow Diagram)モデルによる手法が挙げられる。

要件定義における成果物としてDFD４点セットを作成し，ここから外部設計において機能仕様を完成させるという手法が取られることが多い。

ここでDFD4点セットとは、DFD新論理モデル、データストア記述、データフロー記述、処理機能記述　の４点を指す。

###DFD新論理モデル
DFDでは「データフロー」「データストア」「プロセス」「外部エンティティ」の4つのオブジェクトで業務全体を描画していく。
　
現行業務のデータの流れ(現物理モデル)から本質的なデータのみを抽出したモデルを現論理モデルと呼び、これに新システムへの要件を加えたものを新論理モデルと言う。

要件定義から渡された新論理モデルに、アーキテクチャ等の物理的特性を加味し新物理モデルを生み出すのが外部設計の役目である。

###データストア記述
DFD図におけるデータストア部に関するリスト形式の記述。要件定義で作成されたデータストア記述を元に、正規化、ER図作成等の処理を経てデータベース定義が完成する。

###データフロー記述
DFD図における各データフローに対し，実際にフローの流れるデータをリスト化したものがデータフロー記述である。

外部設計においては画面や帳票設計に用いられる資料となる。
###処理機能記述
DFD図における各プロセスの内容を入力-処理-出力(IPO)の３列形式で記したもの。

外部設計においてはビジネスロジック設計等に用いられる資料となる。


## 参考URL
全体的な流れについて
http://salut.g.hatena.ne.jp/bbs/1/2

基本設計の方針について
http://itpro.nikkeibp.co.jp/article/lecture/20070702/276409/?ST=selfup

DFD
http://itpro.nikkeibp.co.jp/article/lecture/20070702/276410/?k2
mongoの使い方ー設定編


SimpleNoteの整理中。かなり昔のものなので、信頼性は微妙。役に立たないものなら破棄しますのでコメントくださいませ。

##mongodのコマンドラインオプション

mongodはmongoDBのサーバコマンド

多いので全体はhttp://www43.atwiki.jp/worknotes/pages/73.html で確認すること。

重要なものだけ

~~~~
--auth	セキュリティを使用して実行
--dbpath arg	データファイル用のディレクトリ
-f [ --config ] arg	追加のオプションを指定する構成ファイル
--repair 綺麗に終了しなかった時にはつけましょう。
~~~~

##mongo設定ファイル

ファイルベースの設定のほうが個人的には便利。

http://www.mongodb.org/display/DOCS/File+Based+Configuration

から確認できる。


## mongo　のコマンドラインオプション

mongoはmongoDBのクライアントコマンド


--shell
mongoを起動し、JavaScriptファイルを引数として指定する場合、または“mongo --eval”を指定する場合、--shellは、ファイルの実行完了後、ユーザーにシェルプロンプトを提供します。

--nodb
このオプションを使用して、シェルがどのデータベースインスタンスとも接続しないようにします。

--norc
デフォルトでmongoは起動時に、~/.mongorc.jsファイルを実行します。このオプションを使用して、シェルが起動時にこのファイルを使わないようにします。

--quiet
接続プロセス中にシェルからの出力を停止します。

--port <PORT>
mongodまたはmongosインスタンスがリッスンするポートを指定します。指定しない場合は、mongoはポート27017でmongodインスタンスに接続します。このポートはデフォルトのmongodポートです。

--host <HOSTNAME>
mongodまたはmongosが<HOSTNAME>として接続するホストを指定します。デフォルトでmongoはローカルホスト上で実行されるMongoDBプロセスに接続しようとします。

--eval <JAVASCRIPT>
このオプションの引数として指定されるJavaScriptを評価します。mongoは、コードを評価する際、それ自身の環境をロードしません。その結果、シェル環境がｒこと利用できないことがあります。

--username <USERNAME>, -u <USERNAME>
データベースが認証を必要とする場合、MongoDBインスタンスに認証するためのユーザー名を指定します。パスワードを指定するmongo --passwordオプションと共に使用します。

--password <password>, -p <password>
データベースが認証を必要とする場合、MongoDBインスタンスに認証するためのパスワードを指定します。ユーザー名を指定するmongo --usernameオプションと共に使用します。--usernameを--passwordオプションなしで指定すると、mongoは、インタラクティブにパスワード入力を求めます。

--help, -h
基本ヘルプおよび使用法のテキストを返します。

--version
シェルのバージョンを返します。

--verbose
接続プロセス中にシェルの出力における詳細度を高めます。

--ipv6
IPv6ネットワーク経由でmongoがMongoDBに接続できるよう、IPV6サポートを有効にします。mongoを含むすべてのMongoDBプログラムおよびプロセスでは、デフォルトでIPv6サポートが無効化されています。

http://www.mongodb.org/display/DOCS/Manual

## 参考サイト

mongo 系の プライベートwiki
http://www43.atwiki.jp/worknotes/pages/67.html
mongo のクエリー発行


SimpleNoteの整理中。 内容の正確さは保証しませんが、多分動くと思うよ。


## mongoクエリー

db.coll.find(creteria)で強力なクエリーを発行できる。クエリはJSONベースでパラメータを指定。


## 条件演算子

~~~~
db.collection.find({ "field" : { $gt: value } } ); // 大きい : field > value 
db.collection.find({ "field" : { $lt: value } } ); // 小さい : field < value 
db.collection.find({ "field" : { $gte: value } } ); // 以上 : field >= value 
db.collection.find({ "field" : { $lte: value } } ); // 以下 : field <= value 
db.collection.find({ "field" : { $ne: value } } ); // 否定 : field != value 
~~~~

~~~~
db.things.find( { a: { $all: [ 2, 3 ] } } );　//2,3を共にマッチするa要素のみマッチ
db.things.find( { a: { $in: [2,4,6] } } ); //2,3どちらかにマッチするa要素のみマッチ 
db.things.find( { a: { $nin: [2,4,6] } } ); //2,3どれにもにマッチしないa要素のみマッチ 
db.things.find( { a : { $exists : true } } ); // a要素が存在する場合,ドキュメントを返します。
~~~~

## 結果項目のフィルタリング

結果項目のフィルタリングを行う場合,findの第二引数を指定する。

~~~
 // last_name == 'Smith' なドキュメントのssnを取得
db.users.find({last_name: 'Smith'}, {'ssn': 1});
// すべてのドキュメントから、 thumbnail フィールドを*除いた*もの取得。
db.users.find({}, {thumbnail:0});
~~~

フィールドのうち、`_id` は、明示的に指定しなくても、常に返されます。

## 結果のソート

~~~~
// last_nameの昇順で取得する。
 db.users.find({}).sort({last_name: 1});
~~~~

結果をソートする場合,findにsort関数をチェーンする。
ここでsort関数の引数には,ソート対象をキーとし,昇順なら値を1に、降順なら0に指定する。

##skipとlimit

~~~~
db.users.find().skip(20).limit(10);
db.users.find({}, {}, 10, 20); // same as above, but less clear
~~~~
teratermマクロの組み方


SimpleNoteの整理してたらでてきた。
もうMacユーザなので必要ないので、Webに放流します。 

参考：　http://sourceforge.jp/magazine/10/01/08/0825239

## ssh公開鍵認証の自動化だけ

teratermマクロを用いれば、複雑なteratermの認証を自動化できる。
RSA秘密鍵の指定やポートの変更を行う場合などはおすすめ。

マクロはttlファイルで生成され,teratermのttpmacro.exeが処理する。
手間を省きたい場合はこれらの関連付けを行なっておくといい。

ssh公開鍵認証を用いてリモートログインを行うマクロの例

~~~~
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = '＜ユーザー名＞'
hostname = '＜接続先IPアドレスもしくはホスト名＞'
keyfile = '＜使用する秘密鍵のパス名＞'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password'

msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user=' ; 「/auth=publickey」で認証方法として公開鍵認証を指定
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd="'
strconcat msg inputstr
strconcat msg '"'
connect msg
~~~~

`strconcat value str`はvalueにstrを後方連結する文字列演算みたいです。
select文で order by 、 group by に選択列番号を指定する

以下のようなテーブルがあるとする。

```sql
create table a (id serial, name text);
```

以下のように選択列番号を指定して order by を記載すると、name の昇順で取得することが出来る。
選択列番号とは `select` から `from` の間に書いたカラムを1オリジンで数字を割り当てたもの。

```sql
select id, name from a order by 2;
```

なお `select *` を指定したときは、テーブルに定義された順にカラムが指定されたものとして動く。

これは group by にも使うことが出来る。 
以下は同じ長さの name のものがそれぞれ何件ずつあるかを多い順に出力する。

```sql
select length(name), count(*) from a group by 1 order by 2 desc;
```

ちなみにMySQLのサイトには、「選択列番号の指定はSQL標準から外れたから今後廃止されるかも」と書いてあったが気にしない。
Node.js で開発環境を整える

開発に集中するための諸設定をば。ログまわりは以下に書いた。

http://qiita.com/janus_wel/items/1deba15ddcbf172ef1ff

コードを書き換えたら自動的に再起動させる
----------------------------------------

node-supervisor を使う。

https://github.com/isaacs/node-supervisor

こんな感じ。

```sh
npm install supervisor
./node_modules/.bin/supervisor app.js
```

監視対象の拡張子を <kbd>-e</kbd> オプションで指定できる。デフォルトは node,js 。 json ファイルを追加したい場合、以下のようにする。

```sh
./node_modules/.bin/supervisor -e node,js,json app.js
```

無視するファイルとディレクトリの指定は <kbd>-i</kbd> オプション。 <kbd>npm install</kbd> や <kbd>npm prune</kbd> したときにすごい勢いで再起動がかかるのを避けるにはこうする。

```sh
./node_modules/.bin/supervisor -i node_modules app.js
```

似たようなことをするのがいくつかあるけど supervisor が一番よかった。

- nodemon
    - https://github.com/remy/nodemon
    - Vagrant の synced folder 経由で使う場合は遅くなるオプション -L を使わないと認識しない
        - https://github.com/remy/nodemon/issues/146
    - node 側で setuid したときにサーバープロセスをうまく kill できない
- PM2
    - https://github.com/Unitech/pm2
    - いらない機能詰め込みすぎで使いたくない


デバッグに Google Chrome の開発者ツールを使う
---------------------------------------------

node-inspector を使う。

https://github.com/node-inspector/node-inspector

以下を打つ。

```sh
npm install node-inspector
node-debug app.js
```

するとこんなんが出てくるので、表示されている URL を Google Chrome で開く。

```
Node Inspector is now available from http://localhost:8080/debug?port=5858
```

これでクライアント js と同じようにデバッグできる。


npm run-script で自動化する
---------------------------

<kbd>./node_modules/.bin/supervisor app.js</kbd> なんて長くていちいち打ってられない。そんなときに楽できるのが package.json で定義できるコマンドエイリアス。 package.json の scripts に書かれたコマンドを <kbd>npm run-script &lt;scriptname&gt;</kbd> で起動できる。

以下のような package.json を用意しておく。

```json:package.json
{
  "name": "app",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "NODE_ENV=production node ./app.js",
    "dev": "NODE_ENV=development supervisor -i package.json,node_modules -e node,js,json ./app.js",
    "debug": "NODE_ENV=development node-debug ./app.js"
  },
  "dependencies": {
    "supervisor": "*",
    "node-inspector": "*",
  }
}
```

<kbd>npm run-script dev</kbd> で開発用にアプリ立ち上げ、 <kbd>npm run-script debug</kbd> でデバッグ用に立ち上げ。
start だけは特別で、 run-script がいらない。 <kbd>npm start</kbd> で本番アプリが立ち上がる。

チーム開発してるときに起動時のコマンドを固定化できるというのが一番のメリットかも。
【AppleScript＋Illustrator】オーバープリントアイテムを選択

IllustratorのオーバープリントがONになっているアイテムを抽出し、選択した状態にします。

```applescript:
on run
	with timeout of (60 * 60) seconds
		try
			activate
			set start_dialog to display dialog "隠しとロックをすべて解除してから実行します。" with icon note giving up after 60 * 5
			if (gave up of start_dialog) then return
			
			tell application id "com.adobe.Illustrator"
				set ai_docs to documents
				if (length of ai_docs) is 0 then error "ファイルが開かれていません。"
				
				tell current document
					activate
					
					(*隠しとロックの解除*)
					set invisible_layers to (layers whose visible is false)
					repeat with invisible_layer in invisible_layers
						set properties of invisible_layer to {visible:true}
					end repeat
					set locked_layers to (layers whose locked is true)
					repeat with locked_layer in locked_layers
						set properties of locked_layer to {locked:false}
					end repeat
					
					delay 0.1
					
					set hide_items to (page items whose hidden is true)
					repeat with hide_item in hide_items
						set properties of hide_item to {hidden:false}
					end repeat
					set lock_items to (page items whose locked is true)
					repeat with lock_item in lock_items
						set properties of lock_item to {locked:false}
					end repeat
					
					delay 0.1
					
					(*パスアイテムチェック*)
					set overprint_items to (path items whose (((fill overprint is true) and (guides is false)) or ((stroke overprint is true) and (guides is false))))
					
					(*埋込画像チェック*)
					set overprint_items to overprint_items & (raster items whose overprint is true)
					
					(*テキストフレームチェック*)
					set text_frames to text frames
					repeat with text_frame in text_frames
						set overprint_chars to (characters of text_frame whose ((overprint fill is true) or (overprint stroke is true)))
						if 0 < (length of overprint_chars) then set overprint_items to overprint_items & {text_frame}
					end repeat
					
					(*対象の選択*)
					if 0 < (length of overprint_items) then
						set selection to overprint_items
					else
						error "オーバープリントは検出されませんでした。"
					end if
				end tell
			end tell
			
			activate
			set finish_dialog to display dialog "処理完了しました。" with icon note buttons {"OK"} default button 1 giving up after 60 * 15
			if (gave up of finish_dialog) then return
			
		on error err_txt
			activate
			display dialog err_txt with icon caution buttons {"OK"} default button 1 giving up after 60 * 15
			return
		end try
	end timeout
end run
```
qmail+vpopmail環境にIMAP（dovecot）を導入するときのTips

#### 前提条件：
・centos5x
・qmail+vpopmail環境導入済
・dovecotをSRPMで導入
・vpopmailが/home以下にインストールされている

###発生した事象：
・dovecotが起動しない
maillog:
`dovecot: Auth process died too early - shutting down`
`dovecot: auth(default): Unknown passdb driver 'vpopmail' 
(typo, or Dovecot was built without support for it? Check with dovecot --build-options)`

###対策：
vpopmail認証と連携させたければ、SPECファイルを、
`%configure                           \
    --with-vpopmail=/home/vpopmail`
のように、vpopmail認証の指定だけでなくパスも指定する必要があった
BasicObjectから例外を飛ばす

別に例外に限った話じゃないですが。

Rubyでプログラミングしてたら`BasicObject`からクラスを定義したくなることってよくありますよね。
僕は今日初めてありました。

------

さて、Rubyの例外を送出するときは `raise RuntimeError` みたいなことをしてやればいいんですが、この`raise`は[PHPの`throw`なんか](http://www.php.net/manual/ja/reserved.keywords.php)と違って予約語でもなんでもなくて、[Kernelモジュール](http://docs.ruby-lang.org/ja/2.1.0/class/Kernel.html)で定義された、ただのメソッドです。

といふことはクラス定義の中で`include Kernel`って書いてやれば万事解決しますね ヾ(〃＞＜)ﾉﾞ☆

`include`したくないときは、`::Kernel.raise`などと直接callしてやれば利用することができます。

```ruby
  class PoorClass < BasicObject
    attr_accessor :val
    def initialize (val)
      @val = val
    end

    define_method :class do PoorClass; end
    def is_a? (klass); self.class === klass; end
    def to_s; val.to_s; end
    def methods
      %i(:new is_a? to_s methods respons_to? ==)
    end
    def respond_to? (method_name)
      # ここでprintfデバッグ的なことがしたかった
      # ::Kernel.raise method_name.inspect
      methods.include? method_name
    end

    def == (other)
      other.is_a?(self.class) && self.to_s == other.to_s
    end
  end
```

あとがき
-------

本文中に「今日」とあるが、この記事は長いことQiitaの下書きに眠ってたので、いつ書いたのかまったく覚えてない。何の動機があって`BasicObject`なんて使ったのかもさっぱり記憶にない…
laravel(きれいに)アンインストールする方法


+ composer.jsonのrequireの中身を削除

```json
{
	"name": "laravel/laravel",
	"description": "The Laravel Framework.",
	"keywords": ["framework", "laravel"],
	"license": "MIT",
	"require": {
	},

```

+ ~/[project]/app/config/app.phpのproviders配列の中身を削除

```php
	'providers' => array(
	),
```

+ composerアップデート

```bash
composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Removing laravel/framework (v4.2.8)
  - Removing classpreloader/classpreloader (1.0.2)
  - Removing symfony/filesystem (v2.5.3)
  - Removing d11wtq/boris (v1.0.8)
  - Removing ircmaxell/password-compat (1.0.3)
  - Removing filp/whoops (1.1.2)
  - Removing jeremeamia/superclosure (1.0.1)
  - Removing nikic/php-parser (v0.9.5)
  - Removing monolog/monolog (1.10.0)
  - Removing nesbot/carbon (1.11.0)
  - Removing patchwork/utf8 (v1.1.25)
  - Removing phpseclib/phpseclib (0.3.7)
  - Removing predis/predis (v0.8.7)
  - Removing stack/builder (v1.0.2)
  - Removing swiftmailer/swiftmailer (v5.2.1)
  - Removing symfony/browser-kit (v2.5.3)
  - Removing symfony/console (v2.5.3)
  - Removing symfony/css-selector (v2.5.3)
  - Removing symfony/dom-crawler (v2.5.3)
  - Removing symfony/finder (v2.5.3)
  - Removing symfony/http-kernel (v2.5.3)
  - Removing symfony/event-dispatcher (v2.5.3)
  - Removing symfony/http-foundation (v2.5.3)
  - Removing symfony/debug (v2.5.3)
  - Removing psr/log (1.0.0)
  - Removing symfony/process (v2.5.3)
  - Removing symfony/routing (v2.5.3)
  - Removing symfony/security-core (v2.5.3)
  - Removing symfony/translation (v2.5.3)
Generating autoload files
```

+ laravelディレクトリ削除
AnsibleでWordPressサーバ構築


やっとAnsibleを仕事で使い始めました。
といっても、開発環境として、ですが。

今まで、WordPress案件の依頼を受けるたびに、開発環境を手作業で構築していました。
ローカルPC上にLAMP環境とか、安いレンタルサーバにファイルアップ＆MySQLデータベース構築などなど、、、
公開前のWebサイトをお客さんに確認してもらうために、Basic認証設定を追加したり、
毎回必要な作業、煩わしいですね。

そのような作業を楽にするため、
Ansibleを使って、GCE(GoogleComputeEngine)のクラウドサーバ上に構築するように実装しました。
GCEでプロジェクトを作成しておけば、いくつでもWordPress環境を追加できます。
お仕事が捗りますねｗ

そんなPlaybookをgithubにアップしておきました。
:octocat:  [ansible-gce](https://github.com/curious-eyes/ansible-gce)

* 動作確認環境

 - OS X 10.10.5
 - Python 2.7.10
 - Ansible 1.9.4
 - Apache libcloud 0.20.0


初期設定については、
[AnsibleでGCEインスタンスを管理する - Qiita](http://qiita.com/curious-eyes/items/c7feb3edbeb7c7c640e6)
を参考にしてください。

以下のコマンドでインスタンスが生成され、いつでもWordPressの環境が手に入ります。

```bash
$ gce_ansible.sh gce_wordpress.yml
```

あとは、ブラウザを起動して、生成したインスタンスのIPアドレスにアクセスすれば、いつものWordPress開始画面が表示されます。
* Basic認証かかってます(初期設定は、ID:demo, PW:demopass)
* ID/PWの変更は、`roles/wordpress/meta/main.yml` を編集してください（後述）

ローカルPCで開発したソースコードをsftpでアップするもよし。
Gitをインストールしているので、`git push`するもよし。<- :octocat: オススメ :+1:

２つ目の環境が欲しいなら、`/vars/target_wp.yml`で新しいインスタンス名を指定しましょう。

```yml:/vars/target_wp.yml
names: www-wp  <- インスタンス名
```

## このPlaybookで実行していること
- 生成したインスタンスのTimeZone & Locale設定
- Gitインストール
- Apacheインストール
- Basic認証設定
- MySQLインストール
- Create Database
- PHPインストール
- WordPress(ja)最新版ダウンロード
- wp-config.php設定


## 今回のポイント
1. `role`を使う
2. `dependencies`でWordPressに必要なroleを実行する
3. role実行時に変数を渡して、roleの動作を制御する

### 1. `role`を使う

roleは、Playbookのタスクを別ファイルに切り出して、再利用性を高める仕組みです。
`roles`ディレクトリを作成して、
`roles/wordpress/tasks/main.yml`
というファイルパスでタスクを記述していくと、
メインのPlaybook（今回でいうところの`gce_wordpress.yml`）からは

```yaml:gce_wordpress.yml
roles:
  - wordpress
```
というセクションを記述することで呼び出すことができます。


### 2. `dependencies`でWordPressに必要なroleを実行する

WordPressを使うには、ApacheやMySQL、PHPのインストールが必要になりますが、
Playbookで各々を指示する必要はありません。

`roles/wordpress/meta/main.yml`
というファイルを作成して、`dependencies`セクションを記述することで
Ansibleが、WordPressのタスクを実行する前に、`dependencies`セクションの各roleを実行してくれます。

```yaml:roles/wordpress/meta/main.yml
dependencies:
  - { role: apache,
      basic_auth_name: "demo",
      basic_auth_pass: "demopass"
    }
  - { role: mysql,
      mysql_db_name: "wordpress",
      mysql_db_user: "wpuser",
      mysql_db_password: "wppass1234"
    }
  - { role: php }
```

メインのPlaybook側はシンプルになりますし、別のPlaybookでも再利用しやすく、可搬性が高まりますね。

### 3. role実行時に変数を渡して、roleの動作を制御する

前述の`dependencies`セクションに必要なのは、`role`セクションだけですが、
`role: apache` の後に `basic_auth_name`や`basic_auth_pass`というセクションが続いています。
これらは `apache`roleに渡す変数を記述しています。

今回作成したApacheインストール用role `roles/apache/meta/main.yml` には、
Basic認証を設定するタスクを記述しています。
そのために必要な ID/PW の値を渡しています。

もし、`dependencies`の中で`basic_auth_name`や`basic_auth_pass`を指定せず
`- {role: apache}`
という記述だけにした場合、
純粋にApacheのインストールしか行わなず、Basic認証無しのWordPress環境が構築されます。
（Apacheインストール用role側で変数の指定有無をチェックしています）

同様にMySQLインストール用roleも、
変数に応じてWordPressに必要なデータベースを作成します。
（MySQL向けの変数を削除してしまうと、WordPressが動かないので注意！）


## 参考
- [Ansibleのroleを使いこなす : Qiita](http://qiita.com/hnakamur/items/63f2d94badf89246e04a)
- [Role Dependencies : Ansible Documentation](http://docs.ansible.com/playbooks_roles.html#role-dependencies)


あとは、
開発作業後に、本番へ移行する際もこんな調子でいきたいですね。
【ド素人メモ】findとgrepとワイルドカードの違いとか。（UNIXコマンド）

UNIXコマンドでファイル探すときにfindとかgrep使うのですが、シェルのワイルドカード`*`とgrepの中で使う正規表現のワイルドカード`*`が違うこととかしらなかったので、その辺に関するメモ。初心者。

# findの基本的なこと

```zsh
find . -name '*.php'
```

などと書きます。

`*` -> 任意の0文字以上。
`?` -> 任意の一文字。

なので、

```zsh
find . -name '???.txt'
```

などとすれば、3文字のファイル名のものを探してくる。

ちなみに、

```zsh
find . -name *.php 
```

などと書くと、unknown primary or operator というようなエラーなのかなんなのか、よくわからないのが出てきます。なので、ちゃんと`''`もしくは`""`で囲んでおきます。

# grepの基本的なこと

```zsh
grep piyo hoge.txt
```

などと書きます。

正規表現を使うと、

```zsh
grep 'p.*o' hoge.txt
```

と書きます。検索する文字列が単純な文字であれば`''`や`""`は無くても大丈夫です。けど、正規表現や検索文字の間にスペースなどが入る場合は、それらで囲む必要があります。

## grepのオプション

`-e` -> piyoもしくはfugaを含む行を検索するときに使う。

```zsh
grep -e piyo -e fuga hoge.txt
```

`-E` -> 正規表現の`+`とかが使えるようになる。（正規表現の拡張）

```zsh
grep -E 'p.+o' hoge.txt
```

逆に正規表現を使えなくするには、`-F`を使う。

# findとgrepを併用する。

どのファイルか分からないけど、Hogeディレクトリ配下で、piyoという文字列を含んでいる部分とそのテキストファイルを知りたい。

```zsh
find ~/Hoge -name '*.txt' | xargs grep piyo
```
GitHubのWikiに画像を貼付ける際にちょっと迷ったのでメモ。


GitHubのWikiに画像を普通に貼付けるにはImageボタンを使います。
ただこれ、ImageのURLを入力するようになってます。

![github_input_imageURL.png](https://qiita-image-store.s3.amazonaws.com/0/8868/c3d89fff-45a8-769a-02e5-1583a2dbb82f.png "github_input_imageURL.png")

GoogleDriveとかDropboxに共有設定で置いた画像のURLを入れてもいいですが、複数の場所に素材が分散するのはやな感じです。

どっかGitHub内のリポジトリに画像を入れて、そのURLを入れてもいいですがWikiでしか使わない画像が他のリポジトリに混ざるのもやな感じです。

こんな場合にはWikiのリポジトリをクローンして画像を追加する方法が向いているようです。

# Wikiのクローン&画像追加

リポジトリのWikiページに行きます。

![スクリーンショット 2014-08-30 16.02.57.png](https://qiita-image-store.s3.amazonaws.com/0/8868/33981fc4-f83c-f08d-7e24-c978c55d3873.png "スクリーンショット 2014-08-30 16.02.57.png")


Wikiをクローンします。

![スクリーンショット 2014-08-30 15.49.31.png](https://qiita-image-store.s3.amazonaws.com/0/8868/927d5c2a-54dd-d96b-50e3-fdeee7e43f7f.png "スクリーンショット 2014-08-30 15.49.31.png")

ローカルのリポジトリの中身です。

![スクリーンショット 2014-08-30 15.50.53.png](https://qiita-image-store.s3.amazonaws.com/0/8868/0b9a67a4-6f07-f53c-9c21-e81b3b9c501e.png "スクリーンショット 2014-08-30 15.50.53.png")

単純にmarkdownファイルが置いてあるだけなので大量にWikiを更新する際もクローンしてローカルで編集、アップすると良さげです。

ここに適当に画像を追加してcommit&push。

![スクリーンショット 2014-08-30 15.54.50.png](https://qiita-image-store.s3.amazonaws.com/0/8868/0fd0d38b-002a-e945-2c20-e5d27770349d.png "スクリーンショット 2014-08-30 15.54.50.png")

# 画像の使い方

上記test.pngを入れたいとき

```
![画像の説明](wiki/images/test.png)
```

※ハマったポイント

Wikiの編集時に便利なPreview機能がありますが、この方法で追加した画像はPreviewで表示されませんでした。「Save Page」で保存すると見れるようになりますが、ちょっと微妙ですね。。。

![スクリーンショット 2014-08-30 16.15.40.png](https://qiita-image-store.s3.amazonaws.com/0/8868/c28bac44-d804-163b-4005-9cf1ea6bcd6b.png "スクリーンショット 2014-08-30 16.15.40.png")

### 追記

当然ですが、絶対Pathで書くとWikiのpreviewでも画像表示でます。
この場合は書き方は

```
![画像の説明](https://github.com/[user]/[project]/wiki/images/test.png)
```
Xamarinで遊ぶ(3) objcの「デリゲート」とC#の「イベント」が干渉する

----
[←前](http://qiita.com/paming/items/025ff5d39ed3abd113db) [次→](http://qiita.com/paming/items/7317ea756a250143912e)


[Xamarin.iOSでUITableViewの罠 / Xamarinの進化に望む事](http://qiita.com/kochizufan/items/78b6b837beabcca7f362)に、C#のイベントとobjc(UIKit)のデリゲートを同時に使おうとすると罠にはまる、という記事がありました。ほうほうたしかにこれはハマりそうな所なので、実際どんな動きをしているのか確かめてみました。

TableView.WeakDelegateが切り替わってた
----
```csharp:UITableViewControllerを継承したクラスの中
public override void ViewDidLoad ()
{
	base.ViewDidLoad ();
	Console.WriteLine ("A1 delegate == nil? {0}", (this.TableView.Delegate == null) ? "YES" : "NO");
	Console.WriteLine ("B1 weakDelegate={0}", this.TableView.WeakDelegate.GetType ());
	this.TableView.DecelerationStarted += (sender, e) => {
		Console.WriteLine ("scrolled.");
	};
	Console.WriteLine ("A2 delegate == nil? {0}", (this.TableView.Delegate == null) ? "YES" : "NO");
	Console.WriteLine ("B2 weakDelegate={0}", this.TableView.WeakDelegate.GetType ());
}
```

TableView.Delegateは、A1,A2共にnilでした。ですがweakDelegateはB1とB2ではオブジェクトが切り替わっています。

```
 A1 delegate == nil? YES
 B1 weakDelegate=MyTasky.NumberTableViewControllerController
 A2 delegate == nil? YES
 B2 weakDelegate=MonoTouch.UIKit.UIScrollView+_UIScrollViewDelegate
```

Xcodeで書いてる時に馴染みのあるdelegateですが、MonoTouchのUITableViewではWeakDelegateが該当しているようです。objcの弱参照だから"Weak"Delegateなのでしょう。 

このWeakDelegateが、C#のイベント登録前後で切り替わっています。
推測ですが、以下の挙動をしています。

- 初期状態では、WeakDelegateが自分自身なので、デリゲートのコールバックは自クラスとなっている。
    - なので自クラスにデリゲート部分を実装していれば、それが呼び出される。 objcのUITableViewControllerにデリゲートメソッドを書くのと同じ感覚。
- C#のイベント登録 ```xxx += (sender, e) => {...}``` したタイミングで、WeakDelegateがC#のイベント登録されたDelegateにすり変わる。なので、自クラスのデリゲートのコールバックは呼ばれなくなる。

[元の記事](http://qiita.com/kochizufan/items/78b6b837beabcca7f362)にある「Objective-Cとc#でのイベント実装思想の違いを把握してないと気付けなさそう」はまさにその通りですね。


ではTableView.Delegateを使ったらどうなるのか？
---
WeakDelegateとDelegateがあるので、じゃあDelegateを使ったらどうなるか？と試したのですが、WeakDelegateの時と同じで、片方が片方を隠してしまいました。

- TableView.Delegate を登録してから C#のイベント を登録 → C#のイベントが有効
- C#のイベント を登録してから TableView.Delegate を登録 → Delegateのイベントが有効

混ぜるな危険って事なんですね。

この手の罠一覧が欲しい
----
「この先地雷原」が分かる、地図のような資料があれば、まず見ておきたい所です。

その他メモ書き
----
- objcのUIKitとMonoTouchのUIKitの、メソッド対応表というか「命名規則変換ルール」が欲しい。
    - objcの"will〜"はMonoの"〜Started"とか。
- C#のイベント登録 ```+=(){} ``` はまだよく分からない。
- XamarinStudioで、「このクラスのAPIリファレンス」を表示するショートカットキーは何所だ。
- XamarinStudioで日本語入力していると、変換直後のキー入力１個欠落してるみたい→コメントに日本語書いてると変になるのだけど、自分だけかな？
Qiitaの全投稿件数を確認する方法

<ins>[2014/10/01 追記]
Qiita API v2 がリリースされました。
v2ではTotal-Countレスポンスヘッダで全データ数が確認できます。
</ins>


サイト上にも載ってないしAPIにも件数を取得するものはないけど、最新投稿を取得するAPIのレスポンスで、Linkヘッダの最後のページのURLのpegeパラメータで確認できる。

1ページの取得件数を1にすることで、最終ページ=件数になる。

```:リクエスト
https://qiita.com/api/v1/items?per_page=1
```

```:レスポンスヘッダ
Link <https://qiita.com/api/v1/items?page=2&per_page=1>; rel="next", <https://qiita.com/api/v1/items?page=49257&per_page=1>; rel="last"
```
現在49,257件。
norikraざっくり起動する。


norikraとはCEP(複合イベント処理)向けソフトウェア。内部的にEsperを使っている。CEPをとても簡単に実現でき、応用も色々利く。
実例もネット上にチラホラ。詳細は [公式](http://norikra.github.io/) 参照。今回は、とりあえずnorikra起動する手順を残す。

実際は、norikraのデーモン化・データ永続化、ヒープ調整とかも必要で、
さらに、クエリ登録して、イベント流して・・みたいな感じになるが、それはまた今度。

# norikraざっくり起動する。

rbenvが既に入っている事とします

## jruby準備

norikraはjrubyで動く。jrubyを準備する。

使えるjrubyを確認

```
$ rbenv install -l|grep jruby
  
  ...
  jruby-1.7.9
```

最新のjrubyをインストール

```
$ rbenv install  jruby-1.7.9
```

一時的にjruby 1.7.9を使う

```
$ rbenv shell jruby-1.7.9
```

## norikraインストール、起動

norikraをインストール

```
$ gem install norikra --no-ri --no-rdoc
```

rbenv更新

```
$ rbenv rehash
```

norikra起動

```
$ norikra start
```


今回の方法だと、norikraはCtrl+Cで止まる。
RubyでGoogle Drive上のフォルダにスプレッドシートを作成する


## 背景
`Ruby`でデータソースからデータを引っ張ってきたときに、とりあえずの情報共有の場としては`Google Drive`の`spreadsheet`が便利かなと思った。
そしてどうせなら書き出すところまで`Ruby`で実装しようと思い調べてみた。

存在する`spreadsheet`に情報を書き出すのは他のサイトにも書いてあるのでここでは、`spreadsheet`を作成するまでを記載しておく。

以下環境情報。

* Ubuntu: 12.04
* Ruby: ruby 2.1.2p95
* gem: google_drive (0.3.10)

## 事前準備
`spreadsheet`を作成したいフォルダを調べておく。
マイドライブ直下に作成するなら調べる必要はない。

![20140830_google_drive.png](https://qiita-image-store.s3.amazonaws.com/0/46472/4e1559a7-63d6-424c-859b-70f5881d8691.png "20140830_google_drive.png")

今の例だと`https://drive.google.com/a/xxxxxxx/?usp=folder#folders/XXXXXXXXXXXXXXXXX`


## Script
以下のスクリプトを準備。

```script:createSpreadsheet.rb
#!/usr/bin/env ruby

require 'google_drive'

user = 'account@gmail.com'
passwd = 'password'
folder_url = 'https://drive.google.com/a/xxxxxxx/?usp=folder#folders/XXXXXXXXXXXXXXXXX' # Spreadsheetを作成したいフォルダ

session = GoogleDrive.login(user, passwd) # ログイン
folder = session.collection_by_url(folder_url) # フォルダ情報取得

session.create_spreadsheet(title='test', feed_url=folder.contents_url) # Spreadsheet作成
# マイドライブ配下に作成したい場合は以下でよい。 #
# session.create_spreadsheet(title='test')

```
実行してみる。

```cmd:./createSpreadsheet.rb
$ ./createSpreadsheet.rb
$ 
```

確認してみる。

![20140830_google_drive_after.png](https://qiita-image-store.s3.amazonaws.com/0/46472/00689cda-f23a-b90a-c881-c78568baf803.png "20140830_google_drive_after.png")

できてるっぽい。

おしまい。
他の人も納得できる折り紙の「コツ」の引き出し方

[平鍋さんの記事](http://qiita.com/kenjihiranabe/items/b2349449102b70f37bf5)でご紹介頂いた前回は、折り紙のかぶとを上手く折る「コツ」をGSNの文脈ノードとして引き出してみました。これによって自分の「コツ」を可視化することはできたと思うのですが、果たしてその「コツ」だけで他の人も納得する綺麗な折り紙のかぶとが折れるのでしょうか？今回は他の人も納得できる綺麗な折り紙のかぶとの折り方について考えてみたいと思います。
 前回の折り紙GSNで引き出した「コツ」は、１ステップ毎に綺麗なかぶとを折るために自分が「気をつけたこと」から引き出していますが、自分と他の人の綺麗に対する価値観が共有されていないと「気をつけたこと」が一致する可能性は低く、思いつきで書き並べた感は拭えません。この思いつき感をなくすためには、その「コツ」がどのように引き出されたのかを明文化して納得してもらうことが必要になると思います。

###「コツ」の引き出し方を考えてみる
 まず折り紙のかぶとの構造を以下のようにモデル化してみます。折り紙のかぶとは頂点と辺と面から構成される折り紙の特性を継承し、かぶと固有の部品である鉢、鍬形、鍬形台、眉庇で構成されています。また、破線矢印は折り紙を折る人の折り方によって大きさの比率に影響がある関係を示しています。このモデルでは当たり前のことを示していますので、おそらく他の人にも納得頂けると思います。

![OrigamiModel.png](https://qiita-image-store.s3.amazonaws.com/0/53108/fb105174-b12a-a8fb-9cc7-5ce373bc1337.png "OrigamiModel.png")
図 折り紙モデル

次に、この折り紙モデルを足がかりとして他の人も納得できる「コツ」の引き出し方を明文化していきましょう。折り紙モデルでは折り紙共通の構造とかぶとやツル固有の構造を示していますが、今回はかぶと固有の構造に着目した「コツ」の引き出し方をGSNで描いてみます。コツの引き出し方としては、綺麗の基準となるキーワードをかぶとの構造に照らし合わせることで導き出すことにしました。この引き出し方と引き出した「コツ」をGSNで描くと以下のようになります。

![CriteriaforKabuto.png](https://qiita-image-store.s3.amazonaws.com/0/53108/cca7b704-1b06-f915-08a6-5c5001724a42.png "CriteriaforKabuto.png")
図 かぶとを折るコツGSN

 それではこの「かぶとを折るコツGSN」を解説してみます。

1.	トップゴールは「綺麗なかぶとを折るコツに納得できる」としてゴールノード(G1)で示しています。
2.	綺麗の基準を引き出すキーワードとして「バランス」、「左右対称性」を採用し、文脈ノード(C1)で示しています。また、GSN全体で利用できるよう最上位に位置づけています。
3.	トップゴールは折り紙モデルのかぶとの構成を示す文脈ノード(C2)に基づいた戦略ノード(S1-3)に従って「部品」と「大きさの比率に影響のある部品の関係」に分解していきます。
4.	各サブゴールに対してキーワード(C1)を照らし合わせて引き出した「コツ」を証拠ノード(Sn1-6)のコメントで示しています。

###自分の前提と相手の前提の共有にGSNを活用
 今回描いたGSNで引き出した「コツ」に基づいて折られたかぶとであれば「コツ」の思いつき感は払拭できたのではないでしょうか？もちろん全ての人の思いつき感が払拭できるとは思っていません。ただ、今回描いたGSNを納得してくれた人とは綺麗に対する価値観を共有できているため、前回感じた「コツ」の思いつき感はかなり払拭できているように思っています。
 実際のソフトウェア開発においても前提を相手と正しく共有できていれば、認識相違に起因する手戻りの発生などを防ぐことができるように思います（例：仕事の入力となる仕様書を間違えて設計していた）。「自分の考えを可視化し、相手と正しい共通理解を形成すること」、この当たり前なのに難しい問題を解決する一つの手段としてGSNは有効であると考えています。

 最後に、チェンジビジョンさんが提供している[astah GSN](http://astah.change-vision.com/ja/product/astah-gsn.html)は、GSNを描く時のちょっとした困りごとに対して気配りある機能を提供してくれるため、ストレスなくGSNの作成に注力することができます。例えば、ゴールノードの妥当性を説明するためにたくさんの情報を証拠ノードに書き込むと、ノードのシェイプが大きくなってしまって見映えが悪くなりますが、この時、astah GSNが提供するコメント機能がとても便利です。今後もユーザに対する気配りに優れたツールであってくれることを期待しています。
ruby scriptをvimから実行すると、rbenvのrubyが読まれない


## require

- rbenv
- ruby
- bash or zsh


## 問題

ruby scriptをvimから実行すると、rbenvのバージョンのrubyが読まれない

## 原因

intractive shell起動じゃないから。

## 解決策

zshの場合は、zshenvに記載

```bash
$ vim ~/.zshenv
export PATH="$HOME/.rbenv/bin:$PATH"
```

boxenの場合はzshevnにこんな感じ

```bash
$ vim ~/.zshenv
source /opt/boxen/env.sh
```

その他shellの場合

[rbenv - Unix shell initialization](https://github.com/sstephenson/rbenv/wiki/Unix-shell-initialization)
（Djangoメモ）データベースにPostgreSQLを設定

[前回](http://qiita.com/juniskw/items/2eaa3212ea4ed6ef6915)と同様にVagrant環境で実験。PostgreSQLは既に入っていて、[Djangoのテストページまで表示できている](http://qiita.com/juniskw/items/b9278557daf471a89205)のが前提。

まずは **settings.py** 。

```py:settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
		  'USER':'vagrant',
		  'PASSWORD':'************',
		  'HOST':'',
    }
}
```

で、
```
python manage.py sql [APPNAME]
```

すると案の定一筋縄にはいかなかった。以下のエラーになる。

>django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named psycopg2

**pycopg2** というモジュールが無いとのこと。そこで以下を試す。

```
pip install psycopg2
```

が、どうも失敗しているっぽい。実行中の、ごちゃごちゃとメッセージが出てくる中に以下のような行も含まれていた。

>Error: pg_config executable not found.

```pip freeze```で確認するとやはり失敗している模様。上のエラーでググる。

これかな？
http://stackoverflow.com/questions/8237842/django-core-exceptions-improperlyconfigured-error-loading-psycopg-module-no-mo

以下を実行。

```
sudo yum install python-psycopg2
```

>Complete!

こっちは成功。そこでもう一度。

```
pip install psycopg2
```

ところがエラーメッセージは全く変わらず。 **pg_config** とはいかに？再度ググる。

これ？
http://stackoverflow.com/questions/11618898/pg-config-executable-not-found

試してみる。

```
sudo yum install postgresql-devel
```

>Complete!

三度目の正直。

```
pip install psycopg2
```

>Successfully installed psycopg2
Cleaning up...

できた！続いて以下にも再チャレンジ。

```
python manage.py sql [APPNAME]
```

>django.db.utils.OperationalError: FATAL:  database "myproject" does not exist

これは前にも見た。あとは **PostgreSQL** でデータベースを作れば問題なく動く。

こうしてやってみると **MySQL** のときと流れはほとんど一緒みたいだ。
go-toolのpresentで作ったスライドショーを公開する

http://talks.golang.org/ などにあるGoに関するスライドショー。

左右キーでページ送り出来るのですが、
スマホで見れなかったりして、
使いづらいのによくみんな使っているなあと思ってたら、
どうやらこのスライドはgo.toolsにある[present](http://godoc.org/code.google.com/p/go.tools/present)という
パッケージを使っているということに気づきました。

つまりは**「Goの勉強会で発表で使うと差がつけられる！」**ということのようです。
以下、作り方のメモ。

# ローカルで閲覧できるようにする

presentを使ってローカルにスライドショーを作成。

[present](http://godoc.org/code.google.com/p/go.tools/present)のインストール

```bash
$ go get code.google.com/p/go.tools/cmd/present
```

`present`が使えるようになります。

```bash
$ present --help
Usage of present:
  -base="": base path for slide template and static resources
  -http="127.0.0.1:3999": HTTP service address (e.g., '127.0.0.1:3999')
  -nacl=false: use Native Client environment playground (prevents non-Go code execution)
  -orighost="": host component of web origin URL (e.g., 'localhost')
  -play=true: enable playground (permit execution of arbitrary user code)
```

## .articleと.slide

presentは、スライドショーを作りたい場合はファイルの拡張子を`.slide`に。
記事を作りたい場合はファイルの拡張子を`.article`にします。

例えば、下のようにファイルを用意します。

```bash
$ touch article1.article slide1.slide
```

そして`present`を起動すると下のような画面が出てきます。
それっぽいのが出てきます。

![Screen Shot 0026-08-30 at 1.11.17 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3163/1277ca03-8d30-dd35-61c5-7a79afda9171.png)

# presentのフォーマット

各ファイルの頭は主に以下のようになります。

```
タイトル (必須)
サブタイトル
15:04 2 Jan 2006
Tags: タグ
<空行>
プロフィール
…
<空行>
内容
```

最初のタイトルが必須。それ以下はオプションです。。
またプロフィールは、タイトルの段落から空行を1行入れて記載していきます。
二段落目は、スライドの最初と最後に挿入されます。

## セクション

セクションは`*`表記です。

```
* スライドタイトル もしくはセクション
** サブセクション
*** さらにサブセクション
```

スライドショーの場合、`* タイトル`がページの区切りになる。
また、セクションを連続して指定した場合は、最初のセクションのタイトルが
下のほうに表示されるようになります。[例えばこれ](http://go-talks.appspot.com/github.com/hiroosak/go-slides/present-guide/main.slide#4)みたいなものです。

## 箇条書き

`-`で箇条書き

```
- オレンジ
- リンゴ
- バナナ
```

## テキスト

テキストは改行が普通に反映されます。

```
     インデントを行うとそのエリアが<pre>になります。
```

## コードの挿入

コードは 別ファイルに置きます。

```
  .code <ファイル名>
```

コードの一部を見せたい場合 後ろに

`/開始箇所/,/終了箇所/`で指定します

```
.code <ファイル名> /^func main/,/^}/ 
```

## Playgroundで実行出来るUIをつける

`.play`は`.code`とほぼ同じく、コード表示で使うのですが
右下にPlaygroundでの実行ボタンを加えることができます。

```
.play <ファイル名>
```

ただ、Playgroundで実行出来るようにする以上、
packageはmainでないと出来ません。

# スライドショーを公開する

http://go-talks.appspot.com というサイトでは、
GitHubとGoogle Project Hostingにある
presentファイルを動的に取得して表示をしてくれます。

## やり方

1. slideをgithubリポジトリに公開します。

例) https://github.com/hiroosak/go-slides/tree/master/present-guide

2. フォーマットに合わせたURLにアクセス

talk.appspot.comで、スライドを見たい場合
URLの`/`以下に指定されたフォーマットで表示されたいファイルを指定します。

`http://go-talks.appspot.com/github.com/<owner>/<project>/<file.ext>`

1で公開したファイルにアクセスしたい場合は、
http://go-talks.appspot.com/github.com/hiroosak/go-slides/present-guide/main.slide になります。

これで公開完了。

上のスライドのファイルは
[github.com/hiroosak/go-slides/prsent-guid/main.slide](https://github.com/hiroosak/go-slides/blob/master/present-guide/main.slide)にあります。

## 気になったこと

go-talks.appspot.com 元ファイルを編集しても、すぐ反映されないかも。

# 参考

http://godoc.org/code.google.com/p/go.tools/present
Greasemonkey最新版でLDRizeが死んだからGrant書いた


```diff
diff --git a/LDRize/ldrize.user.js b/LDRize/ldrize.user.js
index 655bce4..2844b50 100644
--- a/LDRize/ldrize.user.js
+++ b/LDRize/ldrize.user.js
@@ -2,6 +2,12 @@
 // @name           LDRize
 // @namespace      http://white.s151.xrea.com/
 // @description    j,k,v,p,o,:,f,? + l,s,i
+// @grant          GM_addStyle
+// @grant          GM_getValue
+// @grant          GM_registerMenuCommand
+// @grant          GM_setValue
+// @grant          GM_xmlhttpRequest
+// @grant          unsafeWindow
 // @include        https://www.google.*/search?*
 // ==/UserScript==

diff --git a/Minibuffer/minibuffer.user.js b/Minibuffer/minibuffer.user.js
index cb2c2fd..e4fe911 100644
--- a/Minibuffer/minibuffer.user.js
+++ b/Minibuffer/minibuffer.user.js
@@ -2,6 +2,10 @@
 // @name           Minibuffer
 // @namespace      http://white.s151.xrea.com/
 // @description    Minibuffer
+// @grant          GM_addStyle
+// @grant          GM_getValue
+// @grant          GM_setValue
+// @grant          GM_xmlhttpRequest
 // @include        *
 // ==/UserScript==
```
EC2インスタンス作成時にgithubから作業者のSSH公開鍵を登録

IAMが出てきて、AWSを操作するユーザのアカウントを個別に管理できるようになり、管理アカウント/アクセスキーの使い回しを回避できるようになりました。
IAMホントに便利ですね！

でもオペレータ用のSSHの秘密鍵/公開鍵はインスタンス作成時に指定したKeyPairを共有して使っていたので、ここも個人の鍵を使うように調整してみました。


### 手順とか

インスタンス起動時に既に公開鍵が登録されてないと作業ができないので、user_dataで取り込むようにします。
SSHの公開鍵は、今回はgithubから取得することにしました。
githubに登録されている公開鍵はこういうURLで取得できます。
https://github.com/mikeda.keys

サーバ上であればcurlでOK

```
$ curl https://github.com/mikeda.keys
ssh-rsa AAAAB3N...Jbw==
ssh-rsa AAAAB3N...Lg/0e/
```

今回はインスタンス作成スクリプトで、user_dataに公開鍵の取り込み処理を登録します。
ManagementConsoleからでも同じようにすればいけると思います。

```rb:create_ec2_instance.rb
#!/usr/bin/env ruby
require 'aws-sdk'

#...

operators = %w(mikeda kenjiskywalker)

user_data = <<END
#!/bin/bash
# 最初の1行(管理用Key Pair)だけ残して削除。カスタムAMI対応
sed -i '2,$d' /home/ec2-user/.ssh/authorized_keys

# 他のログインユーザの公開鍵をgithubから取り込み
for i in #{operators.join(" ")};do
  curl https://github.com/${i}.keys 2>/dev/null | sed "s/\\$/ ${i}/"
  echo ""
done >> /home/ec2-user/.ssh/authorized_keys
END

ec2 = AWS::EC2.new
instance = ec2.instances.create(
  image_id:        image_id,
  instance_type:   instance_type,
  key_name:        key_name,
  user_data:       user_data,
  security_group_ids: security_group_ids,
  iam_instance_profile: iam_instance_profile,
  block_device_mappings: [
    {
      device_name: '/dev/xvda',
      ebs: { volume_size: 30 }
    }
  ]
)
```
※今回の話に関係ないとこを抜いた不完全なコードです


これでインスタンスを作成後、個人の秘密鍵でEC2インスタンスにSSHログインできます。

```
$ export AWS_ACCESS_KEY_ID="xxx"
$ export AWS_SECRET_ACCESS_KEY="xxx"
$ ./create_ec2_instance.rb
$ ssh ec2-user@xxxxx

[ec2-user@xxxxx ~]$ cat .ssh/authorized_keys 
ssh-rsa AAAA.../+gux admin
ssh-rsa AAAA...Vbw== mikeda
ssh-rsa AAAA...AaqW3 kenjiskywalker
```
GAE で phpを使ってみた


# デプロイまで

* [Download the Google App Engine SDK](https://developers.google.com/appengine/downloads?hl=ja)

![1-gae.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9bf200e9-118d-d742-aeb2-bbc02a04a3cb.png "1-gae.png")

* dmgに以下が入っている。

![2-launcher.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0e55e1c2-0e2b-b605-3f6d-699de27feb98.png "2-launcher.png")


![4-launcher.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fd5e07a2-c275-9982-d171-3488d56dfe96.png "4-launcher.png")

Deployを行い以下にアクセスをするとページが表示されます。
http://{{Application Title}}.appspot.com/

![3-dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e3a65c81-bf39-04c6-0a3b-03e0f885264a.png "3-dashboard.png")

Dashboad を開くとこのような表示になります。


# phpinfoを表示させる

```diff:app.yaml
  application: php0830
- version: 1
+ version: 2
  runtime: php
  api_version: 1
  threadsafe: yes

  handlers:
  - url: /favicon\.ico
    static_files: favicon.ico
    upload: favicon\.ico

+ - url: /info\.php
+   script: info.php

  - url: .*
    script: main.php
```

1. app.yamlにルーティング追加と、version値を上げる。
1. phpinfoをinfo.phpに記述した。
1. phpinfo を使うには php.ini も一緒にUPLOADする。

```bash:php.ini
google_app_engine.enable_functions = "phpversion, phpinfo"
```

ここでデプロイしてinfo.phpにアクセスするもそのままでは表示されない。
version1がDefaultになっているからです。
version2をDefaultにしましょう。

![5-version.png](https://qiita-image-store.s3.amazonaws.com/0/25728/95dafdc8-fb12-41d3-dcf9-75f853100a69.png "5-version.png")

phpinfoの表示ができました。

![6-phpinfo.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fd70e6a8-7696-3906-9d83-e5654b658875.png "6-phpinfo.png")

# session使えました。

セッションについては以下が参考になる。
[PHPでセッションを完全に破棄する方法 - プログラマはサイコロを振らない](http://d.hatena.ne.jp/Kappuccino/20080726/1217049706)
Mac OS X 10.10 YosemiteにJDKを入れる

最近何を思ったか、Mavericksを消してYosemiteのみに環境を寄せてしまった。しかしJDKをインストールしようとしてもインストール出来なかった。
ここではその解決方法書いていこうと思う。

#普通にするとこうなる
![エラー画面](https://qiita-image-store.s3.amazonaws.com/0/36042/8522bd9f-91c0-457c-c0cf-e530bbafbffb.png)
10.7.3以降だぞと突っ込みたくなる。

#必要なもの
* [JDKのインストーラ](http://www.oracle.com/technetwork/jp/java/javase/downloads/jdk7-downloads-1880260.html)。今回はJDK7 Update67を用意
* エディタ。今回は[ATOM](https://atom.io/)を用意

#やり方
* ダウンロードしてきたDMGをマウントする
* Terminalで下記を実行する

```
pkgutil --expand "/Volumes/JDK 7 Update 67/JDK 7 Update 67.pkg" "/tmp/JDK 7 Update 67.unpkg
```

これをすることにより```/tmp/JDK 7 Update 67.unpkg/```にpkgファイルが展開されたものがコピーされる。
ここで驚いたのは、どうやら10.10 YosemiteではTerminal上でスペースを入力した際、エスケープ（バックスラッシュ）が必要ないということだ。

* エディタで```/tmp/JDK 7 Update 67.unpkg/Distribution```を開く
* 6行目にある```<installation-check script="pm_install_check()"/>```の```pm_install_check()```を```true```に書き換える。
5. Terminalで下記を実行する

```
pkgutil --flatten "/tmp/JDK 7 Update 67.unpkg" "/tmp/JDK 7 Update 67.pkg"
```

これで、バージョンチェックに常にtrueが返る```/tmp/JDK 7 Update 67.pkg```が作成できたはずだ。

* ```/tmp/JDK 7 Update 67.pkg```を実行する
* Terminalで```java -version```を確認する。下記のように出てきたらOKだろう

```
kuma:~ kuma$ java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
```
#最後に
この方法はJDKをインストールするときだけでなく、バージョンチェックに引っかかってしまう大半のpkgに対して有効なはずだ。しかし、中には理由があってバージョンチェックを行っているものもあるので自己責任で行いたい。