OmniAICreator/Qiita-1.07M huggingface dataset:
node-redisは「2つの呼び出し方」だけでOK

#node-redis触った
node.js触りたての頃弄ってたくらいで、正直、RDBSばっかり使ってた。で、改めてドキュメントを読んだり、色々なラッパーを書いては崩し、ソースを読み（とは言っても、大事な部分は全部index.jsに書いてある楽ちん仕様だ）という感じで付き合ってみたが、結局、2つの用法だけで良いらしい。

大体、DELコマンドとか、redisclient.del("key1","key2","key3",...,callback)っちゅー形では、ほとんど直値でしかアクセスできない。可変個にアクセスするなら、どう考えたって配列アクセスだろう。プログラムで生成した引数を渡すよね、普通。そして、内部のソースを見ると、常に配列に放り込んでパーザに渡しているのだ。「probably the fastest way」とかコメントにも書いてある。厳密に言えば、redisclient.del(["key1","key2","key3",...],callback)の形が一番速いようだが、まあそれはそれ。お好みで。

```coffeescript
redis = require("redis")
rcli = redis.createClient()

rcli.on "error", (err)->
  console.log("Error " + err);

rcli.multi([
  ["mget", "multifoo", "multibar"],
  ["incr", "multifoo"],
  ["incr", "multibar"]
]).exec((err, replies) ->
  console.log "err: "+err?.toString()
  console.log "reply: "+replies?.toString()
)

rcli.send_command "del",["key1","key2","key3"],(err,reply)->
  console.log "err: "+err?.toString()
  console.log "reply: "+reply?.toString()
```

つまり、この2形式だけ知っておけば良い。後者はコマンドを直接メソッド名にして同じ形式でやった方が、タイプ量もちょっと少ないかな。

だいぶ気楽になりました。

コマンドは、なんか、目的別にまとめて覚えた方が良さそうね。KVStoreとして使うとき、MessagePassingに使うとき、排他制御に使うとき、などなど。そこはイディオムを覚えろってことね。

以上。今日は寝る。
在 Swift 中使用 Protocol


主要紀錄一下從 Objective-C 中的使用習慣出發，轉換到 Swift 裡面該怎麼作，不含有 Swift 中才有的行為。

# 宣告

## 最簡易的宣告

``` swift
protocol MyProtocol {
	/// ...
}
```

## 繼承 `NSObjectProtocol`

和 Objective-C 中不一樣，要繼承 `NSObjectProtocol` ，而非 `<NSObject>`，在被當成 delegate 的時候，才有辦法使用 `respondsToSelector(_:)` 來檢查使用的 class 有沒有實作指定的 method 。

``` swift
protocol MyProtocol: NSObjectProtocol {
	/// ...
}
```

### 用了 `NSObject` 的話

如果繼承了 `NSObject` 的話， Xcode 則是會抱怨 MyProtocol 不是一個  class ，不能繼承身為 class 的 `NSObject`：

![](https://c1.staticflickr.com/1/345/18643398565_de02b0b45d_o.png)

在[官方文件](https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html)中也有提到：

> 　
> **Note**
> This protocol is imported into Swift with the name `NSObjectProtocol`.
> 　

# optional

這裡講的 optional 不是 Swift 的 optional ，Swift 中 protocol 預設的行為，在 conforming 的 class 中就是都要一定要實作所有的 methods 。

如果真的要指定某個 method 是 optional 的話，宣告的前面就要掛上 `@objc` 才可以使用


``` swift
@objc protocol MyProtocol {
    optional func optionalMethod()
}
```
バッチファイルを作るときに見た・考えたことメモ

# 全体

[開発に役立つ，BATファイルの書き方・パターン集　（コマンドプロンプトの定石を体系的に学び，バッチ中級者になろう） - 主に言語とシステム開発に関して](http://d.hatena.ne.jp/language_and_engineering/20130502/PatternsOfMSDOSorBAT)

# サブルーチン

- ローカル変数を有効にする。
- 戻り値は return など決まった変数で返す。

```bat

call :sub
set ret=%return%

:sub
setlocal
:: サブルーチンの中身
endlocal & set return=%return%
exit /b
```
## 参考
[バッチファイルで、setlocal～endlocal内での変数の値を外部に引き継ぎたい！IIJIMASの日記](http://d.hatena.ne.jp/IIJIMAS/20101023/1287772847)

# ファイルパスから拡張子を取り出す

パスの加工は（変数ではなく）引数で行う（？）ので、一旦サブルーチンに飛ばす。

```bat
call :get_extension hogehoge.ext
echo %return% 
exit /b

:get_extension
set return=%~x1
set return=%return:~1%
exit /b
```
##参考
[バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法 - みちしるべ - ](http://orangeclover.hatenablog.com/entry/20101004/1286120668)
[BATファイルで文字列の切り出し](https://www.upken.jp/kb/kZwpzAqblKfZDjtMXuWuwioeExKNdE.html)

# IF の比較演算子

[If - DOS コマンド一覧](http://pf-j.sakura.ne.jp/program/dos/doscmd/if.htm)
garageとrails-apiを組み合わせる時のメモ

## 結論

から言うと、

```ruby:Gemfile
gem 'rails-api' # 投稿時点で 0.4.0
gem 'garage', github: 'cookpad/garage'  # 投稿時点で v1.5.0(tag)
gem 'responders', '~> 2.0', require: false
```

```config/initializers/_rails_api.rb
class ActionController::API
  include ActionController::MimeResponds
  include ActionController::ImplicitRender
end

require 'responders'
```

こういう感じになる。(色々ツッコミ所はあるのは認めます)

## なんでこうしたのか?

garageで使われているrespondersでは、controllerで`respond_to`メソッドを使用しています。
rails-apiでこのメソッドを使う為にはドキュメントにもあるように、
`ActionController::MimeResponds`, `ActionController::ImplicitRender`が必要になります。

> ActionController::MimeResponds (and ActionController::ImplicitRender for Rails 4): Support for content negotiation (respond_to, respond_with).

そんな訳で、

```app/controllers/application_controller.rb
class ApplicationController < ActionController::API
  include ActionController::MimeResponds
  include ActionController::ImplicitRender

  include Garage::ControllerHelper
end
```

と書きたくなるのだが、読み込み順の問題でこれでは思ったような結果にはなりませんでした。

全部追った訳ではないのでただの予想ですが、
少なくとも`config/initializers/garage.rb`などで`Garage`の設定をする前に必要な各モジュールを`include`しておけば問題なさそうです。
なので、`config/initializers/_rails_api.rb`などと`_`から始まる名前にして早く読み込まれるようにしました。

----

別の話ですが、garageのgemspecにhamlとかsassとか入ってるの、なんだこれ?って思ってたんですが中に便利そうなRails Engineが入ってる為でした。

今回は用途が用途(API onlyなのでjsもcssもhtmlも不要…)なだけに、
ここを切り出して別途gemにしようと考えました。
が、garage自体が良い感じにrubygemsに登録されてないので、
切り出したgemのdependencyにgarageを書けない→テストしづらいっていう悲しみに…
秀丸エディタでshebangに応じて強調表示切り替え


# 背景
「シェルスクリプトを書いて自前のコマンドを作りたい」誰もが抱く、人間の根源的な願望です。

shebang（1行目の`#!/bin/bash`など）を書いておけば拡張子が`.sh`でなくてもbashで実行されるので、
1. コマンドっぽいファイル名にして
2. 実行権限を付与して
3. パスの通ったディレクトリに置いておく

これで自作のコマンドが作れます。

適当なファイル名をつけて、秀丸エディタで開いて...
あれ？いつも使っているシェルスクリプト用のファイルタイプ別設定が有効にならない？

秀丸エディタは「シェルスクリプトかどうか」を拡張子で判別しているので、これはまったく当然の動作です。

# 対処方針
秀丸エディタでファイルを開いた時、拡張子で判別不可 ＆ shebangが書かれている 場合、
シェルスクリプト用のファイルタイプ別設定を使う。

という秀丸マクロを用意します。

# マクロ作成

あらかじめ、シェルスクリプト用のファイルタイプ別設定は`ShellScript`という名前で登録しておきます。
以下のマクロで設定を切り替えます。

```c
// shebangを解釈する

// 先頭行の文字列を取得
moveto 0,0;
$LINE = gettext(0,0,linelen2,0,1);

if( currentconfigset == "" ){
	// ファイルタイプ別設定が空（＝共通設定）の場合のみshebangをチェック
	if ( $LINE == "#!/bin/bash" ) {
		// とりあえず暫定的に完全一致のみ見ている 改善の余地があるかも
		// 一時的な設定 として"ShellScript"を適用する
		configset "ShellScript", 0;

	}else if ( $LINE == "#!/bin/sh" ) {
		configset "ShellScript", 0;

	}
}
```
とりあえず`#!/bin/bash`と`#!/bin/sh`だけ対処しました。

# マクロ登録
これを秀丸エディタで以下に登録します。

    メニュー＞マクロ＞マクロ登録＞自動起動＞ファイルを開いた直後

これで自作コマンド作りが捗りますね。

# 補足
新しくshebangを書いたファイルは一度開き直さないとファイルタイプ別設定が有効になりません。
ファイル保存時に自動起動するマクロも登録できるので、そちらに登録しても良いかも。
開発を効率的に行うためのTips黙示録

個人的に開発をしたり、仕事の中で感じた効率的な開発を行うためのちょっとしたTipsを書き留めておく。

#１．デザインは最低限、機能の実現を優先
　作ろうとしている機能は今の自分には難易度が高すぎたり、APIの関係で実装不可能だったりもする。
　実装が変わればそれを乗せるデザインも当然変わる。
　開発の中でもっといいデザインを思いつくことも多い。
　デザインが変わればそれまで費やした時間は無駄になってしまう。
　デザインは大事だけど中身がなければ始まらない。

#２．車輪の再発明をしない
　名著「リーダブルコード」曰く、「簡潔なコードを書くのに欠かせないことは、ライブラリが何を提供してくれるかを知ることだ。」
　開発に使っている言語やライブラリが提供してくれるメソッドや機能を使わない手はない。
　ドキュメントを眺めて、API名から「だいたいこんなことができる」ということをわかっておくといいかもしれない。
　車輪の再発明に割く時間を削減すれば、開発独自のロジックに注力できるしバグも減る。

#３．「誰かが使うかも」とか「あったらいいな」は切り捨てる
　そういうのはだいたい要らないようだ。再び「リーダブルコード」の言葉を借りると、

　　「その機能の実装について悩まないで　――きっと必要ないから」

ということ。でも開発者（特に私なんか）は得てして「この機能は絶対に必要だ」とか、「こうやるしかない」とか思い込んでしまう。目の前のコードを何とかすることに囚われてしまう。
　難しくて時間のかかる実装に必死こいて取り組む前に、一步下がって、一呼吸置いて考えてみよう。

　「もっと簡単な方法はないか」
　「そもそも必要なのか」

時間をかけてやっと実装した機能が実はいらないものだった、なんてのは悲惨だ。

#４．エディタの機能をフル活用する
　開発に使用しているエディタやIDEの機能にある程度習熟しておくこと。
　人気の高いプラグインを入れておくことは元より、ちょっとした文字列編集を行うためのキーバインドは使いこなせるとかなり便利。
　行の入れ替えとか、連番作成とか、機会の多い割に煩雑な操作は特に。

#５．急がば回れ
　ちょっと面倒だけどちゃんとやっておけば後々時間の節約になることは多い。
　例えば次の３つなんかどうだろうか。

###・エラーログを読む
　ちゃんと読んでみると、結構いいことを言っている。
　手当たりしだいに怪しいところをいじってみるより、解決への近道になることは多いと思う。
　英語でもそんな難しい言葉は使っていない。
　
###・自作スニペットを作る
　Dashとかのスニペット管理ツールを使って過去に書いたコードの断片をすぐ呼び出せるようにしておく。
　私自身の傾向として、過去に書いたのと似たような処理を書くことはよくある。
　そしてそのほとんどはどうやって書いたのかわからないものが多い。

###・便利と言われているツールを導入する
　新しいツールの導入には学習コストがかかるがその分得られるメリットは無視できない。
　そのツールが話題になっているのにはやはり理由がある。
　学習コストと効率化のメリットは釣り合わないことが多い。そのほとんどはいい方向にだ。

#６．BGMをYouTubeで探さない
　底なし沼だぞ。
bash で ls 結果を配列に入れる


いつも無駄にIFS変更とかしていたので。

# 結論

```bash
eval ARRAY=("$(ls --quoting-style=shell)")
```
`--quoting-style=shell`を指定すると必要に応じて`'`でクォートしてくれるため、
スペースや特殊文字に気を使わなくてよくなります。

# 動作考察
内部的には大体こんな感じで動作しているようです。
`file name1`、`file name2`というファイルがある場合。

```bash
① 初期状態
    eval ARRAY=("$(ls --quoting-style=shell)")
② プロセス置換
    eval ARRAY=('file name1' 'file name2')
③ evalによる再評価
    ARRAY=('file name1' 'file name2')
```
気になる場合は`set -xv`して追いかけてみてください。

# 補足

「必要に応じて」と書きましたが「ファイル名にスペースはアスタリスクなど、特殊な文字が入っていた場合」
と考えれば良いと思います。

そのあたりの曖昧さが気に入らない場合、`--quoting-style`は`shell-always`指定でもよいです。ファイル名がどんな文字かに関わらず`'`でクォートしてくれます。

```bash
eval ARRAY=("$(ls --quoting-style=shell-always)")
```

隠しファイル（ファイル名が`.`で始まるファイル）も対象にする場合は`-A`で。

```bash
eval ARRAY=("$(ls -A --quoting-style=shell-always)")
```
ハッカーが使うインターネットブラウザdwb


## はじめに

ここで言うハッカーというのは、単にコンピュータに深い知識と技術を持った人を言います。あと、私はハッカーではありません。コンピュータのことはよくわかっていませんが、コンピュータを使う上で便利なツールに興味があり、それに詳しい人がこういうのを使っているらしいので、それを紹介します。

今回紹介するのは、`dwb`というものです。Linuxで動きますが、他のOSでもフォークとかあるかもしれませんが調べていません。

皆様は、インターネットブラウザをシンプルに、便利に使えているでしょうか。例えば、操作性に関して、`Vimperator`や`Vichrome`を入れていませんか?

わざわざこういうツールを入れるのは面倒だし、良くないのはわかっているのだけど、どうしても操作性が不便で入れているという人は多いのではないでしょうか。

そんな場合は、`dwb`がシンプルで良い使い心地だと思います。

## dwbの操作性

dwbのインストールは、以下の様な感じでパッケージマネージャーからインストールします。

```bash:
$ sudo pacman -S dwb
```

Arch Linuxの場合は、ソースからビルドしてもいいです。Bitbucketからソースを持ってきてコンパイルします。

```bash:
$ yaourt -S dwb-git

# 内容
#git clone https://bitbucket.org/portix/dwb
#cd !$:t
#make 
#sudo make install
```

まずは、`C-h`でスタートページを表示しますが、そこにメニューがあります。通常は、そのメニューの`Keys`からキーをカスタマイズすると同時に、昨日を確認できます。

| keys | general |
|---|---|
| ;; | リンクを選択クリックする|
| f | リンクを選択クリックする|
| F | リンクを選択クリックし、タブで開く|
| ;b | リンクを選択クリックし、タブで開くがフォーカスしない|
| ;y | リンクを選択し、クリップボードにコピーする|
| : | コマンドモードを使う|
| j | 下スクロール|
| k | 上スクロール|
| H | 戻る|
| d | タブを閉じる|
| K | タブ移動|
| v | テキストモードで選択できるようになります(キーバインドはviと同じ)|
| yY | urlをクリップボードに保存する|

すごく便利です。URLやテキスト、リンク、タイトルのコピー、編集から通常操作まで非常にやりやすいし、カスタマイズ性に優れています。

スクロールサイズ等は、メニューの`Settings:scroll-step`にて変更可能です。私の場合、`100.00`にしています。

検索については、[dwb - ArchWiki](https://wiki.archlinux.org/index.php/Dwb)を参考に以下を設定します。

```bash:~/.config/dwb/settings
# 検索キーワードに指定するキーを設定する
searchengine-submit-pattern=XXX
```

```bash:~/.config/dwb/searchengines
sp https://startpage.com/do/search?q=XXX
wp https://en.wikipedia.org/w/index.php?search=XXX&title=Special:Search
aw https://wiki.archlinux.org/index.php?title=Special:Search&search=XXX
rfc http://www.rfc-editor.org/search/rfc_search_detail.php?rfc=&title=XXX
```

これで、`o`を押して、アドレスバーを表示し、そこで検索をかけられるようになります。ちなみに、先頭に書いた`sp`, `wp`というのは、検索エンジンを指定するために使われるキーです。指定しなければ一番上の検索エンジンが使われますが、指定すると、例えば、`url:wp archlinux`とすると、`wikipedia`で`archlinux`が検索されます。

ちなみに、[https://startpage.com](https://startpage.com)は、完全に履歴を残さない検索サイトです。非常に便利なので、Googleではなくこちらを使用しましょう。

使える追加機能は、`$ dwbem -a`で確認できます。Adblockも使用できます。

```bash:
$ dwbem -i adblock_subscriptions
```

[https://code.google.com/p/adblock-plus-japanese-filter/wiki/OtherJapaneseFilters](https://code.google.com/p/adblock-plus-japanese-filter/wiki/OtherJapaneseFilters)

```bash:
adblocker-filterlist=~/.config/dwb/adblock_lists
```
「したほうがいいこと」「すべきこと」のレベル感


プログラムを組み立てる上で、「こうしたほうがいい」とか「こうすべき」とかいうことは、いろいろと出てきます。ただし、それぞれのレベル感に気をつけたほうがいいです。

# RFC 2119
RFCを読んでいると、よく、「SHOULD」とか「MUST」とか、すべき度合いを表現する形容詞が大文字で表記されています。そして、これらの文言があるRFCには、

>  The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.

というような定型文が付いています。それではこのRFCを確認してみましょう。

* [IETFの原文](https://www.ietf.org/rfc/rfc2119.txt)
* [IPAによる和訳](http://www.ipa.go.jp/security/rfc/RFC2119JA.html)

##絶対的要求
**MUST**、**REQUIRED**、**SHALL**といった単語は、「そのとおりに実装しなければならない」という絶対的な指示で、逆に**MUST NOT**や**SHALL NOT**といった表現は「それをしてはならない」という絶対的な禁止となっています。これらの単語については、「相互運用性確保のために不可欠である場合や、 有害である可能性がある動作を制限するために限って、使用されるべき（**MUST**）」とされています。

## 推奨事項
**SHOULD**や**RECOMMENDED**、逆の**SHOULD NOT**や**NOT RECOMMENDED**については、守らなければ直ちにRFC違反となるわけではないのですが、もちろん推奨するからにはそれ相応の理由があるわけで、あえて外れる場合には「慎重に重要性を判断しなければならない」ものです。

#日常文の中で
日常使われる文章中では、「したほうがいい」と「すべき」の明確なラインはないので、両方を一緒に考えて問題はないでしょう。それぞれ推奨される理由別に、どこまで従うべきなのか考えていきます。なお、以下の文で太字の**しなければならない**はRFCでの**MUST**相当、**すべきだ**はRFCでの**SHOULD**相当と考えてください。

## 従わなかった結果が致命的となりかねない場合
XSSやSQLインジェクションなど、不正アクセスにつながるような脆弱性は何が何でも潰さ**なくてはなりません**。放置すれば情報漏えいや改ざん等、取り返しのつかない事態となります。脆弱性自体の教材にするような特殊な事例は別として、有用な機能がその状況を使って動作している場合であっても、別な手法に切り替え**なければならない**でしょう。

## 相手のある場合
通信プロトコルやファイルフォーマットなどは、当然相手に読めるもので**なくてはなりません**し、規格がある場合は、基本的に従う**べき**ものです。ただし、HTMLなどではよくある話ですが、本来のフォーマットに対して拡張してあるもので、「拡張自体が有用」かつ「拡張を認識できる相手としかやり取りしない or 拡張を認識できない相手でも、拡張以外は認識できる」ような状況なら、厳密には規格違反でも拡張を利用して問題はないでしょう。

## ベストプラクティス
プログラミングでの「ベストプラクティス」は、長い間に多様なプログラムの中で醸成されてきたものなので、何も考えずに無視する**べきではありません**。Railsで言えば「レールに乗る」と言われるようなプログラミングプラクティスですが、[自分自身も触れたように](http://qiita.com/jkr_2255/items/46dfc85e6e05bdf1f8e6)何から何までそのとおりに組む必要はもちろんありません。「それに従うメリット」「従わないメリット」を踏まえて判断しましょう（なお、「保守性」などは最初の段階では軽視されがちですが、あとあとになると重要になってきます）。

## やらないメリットがほぼ皆無なもの
中には、「それをしてもあまり意味がないこと」もあります。例えば、[TRACEメソッドの件](http://blog.tokumaru.org/2013/01/TRACE-method-is-not-so-dangerous-in-fact.html)のように、「これが脆弱性となりうる環境はごく少ない」ケースです。ただ、この例では少ないとはいえリスクがありますし、逆にTRACEメソッドを有用な目的に使うことのほうが皆無に近いので、何かのついでに「やっておいたほうが良い」とは言えるでしょう。

「HTTPヘッダから詳しいバージョンを消す」なんてことが言われることもありますが、本気の攻略者にしてみればバージョン特定は別ルートで可能でしょうし、「セキュリティ対策」として意味があるかは疑問です（ヘッダが少し縮むのはメリットかもしれませんが）。

#まとめ
「すべき」ことを何も考えずにただやるのは、すべきことをしないのと比較できる程度に危険な態度かもしれません。それをなぜ「すべき」なのか、するにしてもしないにしても理由は踏まえて進みましょう。
Swift2.0のError Handlingを試してみる


Swift2.0からエラーハンドリングができるようになった。

```swift
// 独自のエラータイプはErrorTypeプロトコルに準拠する
enum MyError: ErrorType {
    case Error1, Error2(message: String), Error3
}

// エラーを投げる可能性のあるメソッドにはthrowsをつける
func test(e: MyError?) throws {
    if let error = e {
        throw error
    }
        
    print("成功")
}


do {
    // エラーを投げる可能性のあるメソッドを呼ぶときはtryをつける
    try test(.Error2(message: "メッセージ"))
    // ここは呼ばれない
}catch MyError.Error1 {
    // switch文のようにエラーのタイプごとにcatchできる
    print("Error1")
}catch MyError.Error2(let message) {
    print("Error2")
    print(message)
}catch {
    // catchで具体的なエラータイプを指定しなかった時、errorで投げられたエラーを取得できる
    print(error)
}
```

`try`をつけてメソッドを呼ぶ場合、必ず、`do`で囲って、`catch`でエラーを補足する必要があるようです。

ただ、場合によって絶対にエラーを投げないんだよなって時もある。
そんな時は`try!`にすると`do`と`catch`を省略できる。

`try!`付きで呼んだメソッドがエラーを投げるとランタイムエラーになる。

```
try! test(nil)
```

詳しくは [iBooks The Swift Programming Language (Swift 2 Prerelease)](https://itunes.apple.com/us/book/swift-programming-language/id1002622538 'Swift2')
[Linux]仮想ディスクイメージのパーティション毎にファイルシステムを構築

ディスクイメージはfdsikでパーティション分けしてある。

空いているループバックデバイスにディスクイメージを繋げる。
`losetup -f disk_image`
使用中のループバックデバイスを確認
`losetup -a`
ループバックデバイスを通してディスクイメージのパーティションを確認
`kpartx -l /dev/loop0` (`disk_image`に直接`fdisk`と同じ)

ループバックデバイスのパーティションをディスクイメージのパーティションに合わせて設定する。
`kpartx -a /dev/loop0` (各パーティションは`/dev/mapper`とかに出来る。分からなくなったら、`lsblk`でシステム中のブロックデバイスを全部確認できる。)

後は各パーティションに対して`mkfs`とかしていけば良い。

戻す時は
`kpartx -d /dev/loop0`
`losetup -d /dev/loop0`
とする。
新しいデベロッパープログラム


今日、Appleから届いたメールによると、いままでプラットホーム毎に分かれていた[デベロッパープログラム](https://developer.apple.com/programs/)が単一のプログラムに統合されるとのことです。OS Xのプログラムにしか入っていなかったけど、いつのまにかiOSもOKになった模様 :smile: 

    We are excited to announce the new Apple Developer Program, which combines everything you need to develop, distribute, and manage your apps on all Apple platforms into one single program. Your developer program membership has been automatically updated to the new Apple Developer Program. 
    
    This new program provides:
    Distribution of your apps to over a billion Apple customers around the world on the App Store for iPhone, iPad, Mac, and Apple Watch.
    More continuity capabilities for iOS and OS X, including app extensions  and Handoff.
    The latest beta releases of iOS, OS X, and watchOS announced today, so you can get started on your next app.
PHPリリース年表




| 年 | バージョン | 備考 |
|:-----------|------------|------------|
| 1995       | PHP 1.0 |
| 1996       | PHP 2.0 |
| 1997       | PHP 3.0|
| 1998       |  |
| 1999       |  |
| 2000       | PHP 4.0.0|
| 2001       | PHP 4.1.0|
| 2002       | PHP 4.2.0|
|            | PHP 4.3.0|
| 2003       | |
| 2004       | PHP 5.0.0 |オブジェクト指向|
| 2005       | PHP 4.4.0| 
|            | PHP 5.1.0|PDO、タイプヒンティング|
| 2006       | PHP 5.2.0|
| 2007       | |
| 2008       | |
| 2009       | PHP 5.3.0| 名前空間 、クロージャ|
| 2010       | |
| 2011       | |
| 2012       | PHP 5.4.0| トレイト|
| 2013       | PHP 5.5.0| ジェネレータ | 
| 2014       | PHP 5.6.0|
| 2015       | PHP 7.0 (予定)|
Ubuntuに２行で最新のNode.jsを入れる

```bash

curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash -
sudo apt-get install -y nodejs
node -v
# v0.12.4
npm -v
# 2.10.1
```
PPAやnvmから入れる方法が散見されますが、リモートやdocker内部ではこの方が楽ですね。nodesource.comはナウでヤングなNodeバイナリ配布サイトらしいです。
sbtのマルチプロジェクトを試す（build.sbt編）

## まえがき

sbtを使って[Akkaのギッハブ](https://github.com/akka/akka)みたいにカッコ良くマルチプロジェクトをキメてみたいですよね？
sbtは `build.sbt` と `Build.scala` の2つの設定の記述方法がありますが、まずは `build.sbt` でマルチプロジェクトを作ってみましょう。

## こんな雰囲気で作りたい

```
/app-root
│
├── activator                       # <- activator起動スクリプト
├── activator-launch-1.3.2.jar
├── build.sbt                       # <- 全モジュールをまとめるbuild.sbt
│
├── modules
│   ├── app1                        # <- commonに依存している
│   │   └── build.sbt               # <- app1用のbuild.sbt（存在しない場合もあり）
│   │
│   ├── app2                        # <- commonに依存している
│   │   └── build.sbt               # <- app2用のbuild.sbt（存在しない場合もあり）
│   │
│   ├── common                      # <- 共通ライブラリ
│   │   └── build.sbt               # <- common用のbuild.sbt（存在しない場合もあり）
│   │
│   └── ...
│
├── documents
│   └── ...
│
└── etc
```

#### 前提
- modulesディレクトリ配下に各モジュールを配置する
- app1はcommonライブラリに依存している
- app2はcommonライブラリに依存している

## いざ構築

```このような構成.

/parent
│
├── activator
├── activator-launch-1.3.2.jar
├── build.sbt                       # <- parent用のbuild.sbt(A)
│
├── modules
│   ├── app1                        # <- commonに依存している
│   │
│   ├── app2                        # <- commonに依存している
│   │
│   ├── common                      # <- 共通ライブラリ
│   │
│   └── ...
│
├── documents
│   └── ...
│
└── etc
```

そして、作成するファイルの内容は以下の様な感じ

```build.sbt(A)  
name := "root"

version := "0.2.0"

lazy val app1 = (project in file("modules/app1"))
  .enablePlugins(PlayScala)  // Playアプリケーションの場合
  .dependsOn(common)

lazy val app2 = (project in file("modules/app2"))
  .dependsOn(common)

lazy val common = project in file("modules/common")
```

### 動作チェックしてみます

##### 1. 全プロジェクトまとめてビルドする

    ./activator package

or
  
    ./activator dist

で実行が可能

##### 2. モジュール単位でのビルド実行をする

    ./activator
    > project {target-project}  <- projectコマンドの引数にモジュール名を渡してプロジェクトを切り替える
    > package

      or

    > dist

で実行が可能

## 良い所・悪い所

##### よいところは

- 一つののプロジェクトとしてまとまっているため、IDEのリファクタリングの際に依存しているライブラリの修正が利用している側に反映される 
- 冗長なbuild.sbtの記述を排除できる。（同じような設定は共通化できる）
- (Build.scalaと比較すると)build.sbtに慣れている場合の学習コストが抑えられる。

##### わるいところは

- 複数のプロジェクトを別ブランチを作成して並行して作業するばあい、行ったり来たりが面倒。

## 総評

Akkaのプロジェクトもマルチプロジェクトになっていることを考えると、やり方としては正しそうな気がする。
`file(git://hoge/huga.git)`のように依存ライブラリを直接gitで取得できるようなので後々試してみたい。

## 次回

次回は `Build.scala` を使ったマルチプロジェクトを試します。
oFでShader(GLSL)を使うメモ

チュートリアルは英語だし、
WEBGLの記事ばかりで、やっとoFで噂のShaderを書いて動かす方法が
わかったのでメモ。。

こちらの連載がおすすめです。
oF流に書き直して学んでます。
http://qiita.com/doxas/items/00567758621bb506e584

bin/data/の中に
shadersGL2/shader.frag
shadersGL2/shader.vert
を追加


```cpp:ofApp.cpp
#include "ofApp.h"

ofShader shader;

//--------------------------------------------------------------
void ofApp::setup(){
    // #120のバージョンにします。
    shader.load("shadersGL2/shader");
}

//--------------------------------------------------------------
void ofApp::draw(){
    
    // begin()とend()で挟んだ中が適用される
    shader.begin();
    
    // timeという変数名で第二引数の値を送れる
    shader.setUniform1f("time", ofGetElapsedTimef());
    
    ofRect(0, 0, ofGetWidth(), ofGetHeight());
    
    shader.end();
    
}
```

```lang:shader.vert
#version 120

void main()
{       
	gl_Position = ftransform();
}
```


```lang:shader.frag
#version 120

uniform float time;

void main()
{
    // oFから来たtimeによって色かえる
    float r = abs(sin(time));
    float g = abs(cos(time));
    float b = (r + g) / 2.0;
    gl_FragColor = vec4(r, g, b, 1.0);

    // gl_FragColorに最終的な色を突っ込む
}
```
vvvv Newbiesのための13の基礎操作

**vvvv Newbiesのための13の基礎操作**
これだけ覚えれば、あなたもvvvv Patcher!!

1.ウィンドウを閉じる
**Control + W**
![control+w.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/e4773ff2-d600-ffe3-45c8-0391bdb230e0.gif)
***
2.ファイルを保存する
**Control + S**
![sss-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/346f6332-f740-57f9-c7da-b1a2abbf3fdc.gif)

***
3.ノードを出す
**左ダブルクリック**
![1.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/ee306464-d990-2378-9ce2-4116a3eb6815.gif)
***
4.ノード同士をつなぐ
**左クリック＋左クリック**
![2.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/4378afef-2126-88ec-0dc0-8ed4492a8dff.gif)
***
5.範囲を指定してノードを選択 / ノードの移動
**左ドラッグ / 左ドラッグ**
![3.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/f94b1c82-9762-1bb4-2ceb-ad59de3133de.gif)
***
6.I/O BOX(数値入力の箱) / Toggle、Bangなどのボタンを出す
**右ダブルクリック / 右ダブルクリック＋左クリック**
![4.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/9d37466d-3269-0029-4bb5-7ab34e481954.gif)
***
7.I/O BOXへの数値入力
**左ダブルクリック**
![5.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/efae4787-9e3c-ea6b-ae9a-fba921b6d742.gif)
***
8.I/O BOXの数値をマウスで調整、パッチ画面内での移動
**右ドラッグ**
![6.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/707189a6-993d-f26b-5f71-1f2394ceb5f8.gif)
***
9.インスペクタの出し方（ノードの細かい設定）
**Control + I**(インスペクタ内は右クリックで操作)
![7.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/c00763ab-5ebc-d8e4-138e-cd44510cd776.gif)
***
10.ヘルプパッチの出し方
**F1**(MacのBootの場合 Fn + F1 )
![8.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/5f263246-f26c-b74b-04d4-61c70c84f36b.gif)
***
11.コピー / ペースト
**Control + C / Contorl + V**(範囲選択は左ドラッグ)
![9.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/be66e1cf-8410-53c5-102b-e7c5fe6d8cdb.gif)
***
12.ノードを消すとき / 操作を一つ戻るとき
**クリックorドラッグで選択 + Delete / Control + Z**
![10.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/4f8d6b33-06df-3c60-49b5-ef91d588dbea.gif)
***
13.メインメニューの出し方
**マウスのセンターボタン or Space + 右クリック**
![11.gif](https://qiita-image-store.s3.amazonaws.com/0/37495/408021fb-242c-c153-6a4e-a2d26de35cf4.gif)

***

**さぁ、たのしくパッチングしましょう！！**
Debian7にtrema0.4.7をインストールしました

#trema導入方法

##①tremaをインストールする前に、必要となるパッケージをインストール
    $ sudo apt-get install gcc make git ruby rubygems ruby-dev libpcap-dev libsqlite3-dev libglib2.0-dev


##②gemのバージョンを合わせる

    $ sudo gem install rubygems-update -v 1.8.25
    $ sudo update_rubygems


tremaのインストールを行う前にgemのバージョンを1.8.25かそれ以上にする必要があるそうです。そのままtremaをインストールしようとするとエラーになりました。


##③RubyGemsのコマンドでtremaをインストール

    $ sudo gem install trema
    $ trema --version
    trema version 0.4.7

これでtremaの導入は完了です。意外とアッサリ！
APK拡張ファイル

## jobbツールとは

OBB(Opaque Binary Blob)フォーマットのイメージファイルを作成するツール。Android SDKに含まれる。`%ANDROID_HOME%/tools`内にある。

    jobb -d ディレクトリ名のフルパス -o 出力先ファイルのフルパス -pn パッケージ名 -pv パッケージバージョン

例:対象フォルダが`D:\contents`、出力先が`D:\obb\output.obb`、パッケージ名が`com.myapp.test`、パッケージバージョンが`1`の場合

    jobb -d D:\contents -o D:\obb\output.obb -pn com.myapp.test -pv 1

### 注意点

* `jobb`の`-d`,`-o`にはフルパスを指定しないと正しく処理されない。相対パス指定だと`%ANDROID_HOME%/tools/`からの相対パスになってしまう。
* JOBBツールはある程度の容量の.obbファイルを出力しないとエラーメッセージを出す

## アプリケーションからの利用方法

```java
OnObbStateChangeListener listener = new OnObbStateChangeListener() {
  @Override
  public void onObbStateChange(String path, int state) {
    // state == 1 (OnObbStateChangeListener.MOUNTED) ならマウント完了
  }
};
StorageManager storageManager = ((StorageManager) context.getSystemService(Context.STORAGE_SERVICE));
String path = "path/to/obbFile"; // .obbファイルへのフルパス
storageManager.mountObb(path, null, listener); // obbファイル作成時にキーを指定した場合は、第二引数に指定する
```

### 注意点

* jobbツールで作成時に指定したパッケージ名と異なる場合は`onObbStateChange`の`state`が`25(OnObbStateChangeListener.ERROR_PERMISSION_DENIED)`となる。

## Google Play Expansion Filesとして使用する

OBBファイルは以下の命名規則に則っていなければいけない。

    [main|patch].<expansion-version>.<package-name>.obb

例:

    main.1.com.myapp.test.obb

OBBファイルはAPKをアップロードするときに追加でアップロードする。OBBファイルだけを更新することはできない。

OBBファイルはアプリダウンロード時に`%外部ストレージ%/Android/obb/パッケージ名`ディレクトリにダウンロードされる。
CentOS6.6で unite.vim does not work this version of Vim "702". って怒られたから最新版のVimを入れた

CentOS6.6のデフォルトで入っているVimにもろもろプラグインを入れてVimを起動したら、unite.vimから`unite.vim does not work this version of Vim "702".`って怒られた。

どうやらCentOS6.6にデフォルトで入っているVimは7.2で、unite.vimは[ここらへん](https://github.com/Shougo/unite.vim/blob/3df34fd28ae65e1b34d67bd838cd94b011511751/autoload/vital/_unite.vim#L5)見た感じ7.2.051 以上じゃないとエラーになる模様。

ソースコード持ってきて最新ビルドするかーと`mercurial`をインストールしようと思ったけど、GitHubに[Vimのリポジトリ](https://github.com/vim/vim)が出来てたから`git`でやることにした。

インストールはこんな感じ。
オプションとかは各自好きな感じで。

```bash
$ sudo yum -y install git
$ sudo yum -y install ncurses-devel
$ git clone https://github.com/vim/vim.git
$ cd vim
$ git tag -n
$ git checkout -b 7-4-729 refs/tags/v7-4-729
$ ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local
$ sudo make && sudo make install
```
PHPでハノイの塔

# ハノイの塔をPHPで解く
![hanoi3.png](https://qiita-image-store.s3.amazonaws.com/0/25382/4c721ad9-5c72-ee36-9993-8a41c3889402.png)
##問題
台の上に３本の棒 A，B，Cが固定されている。
うちの1本に何枚かの円盤が重ねられている。
円盤は下へいくほど半径が大きい。
この時、次の規則に従って，円盤をＡからBに移動する。
 1. 1回に 1枚の円盤しか動かしてはいけない。
 2. 移動の途中で円盤の大小を逆に積んではいけない
　常に大きい円盤が下になるようにする
 3. 棒 A，B，C以外のところには円盤を置けない

##ポイント
　・小さい数で検証する事
　・分割統治法を使う事
　・正しい動作をする関数を定義する事
　・円盤のnを小さい順から定義する事

##n=2の時の答え
　1. 1の円盤をAからCへ移動する
　2. 2の円盤をAからBへ移動する
　3. 1の円盤をCからBへ移動する

##解き方
問題を小さい問題に分割して解く。
 1～n-1の円盤を一塊にして
 1～n-1の円盤とn番目の円盤の2つで考える。
ここで、関数を定義するhanoi($n, $a, $b, $c)
n枚の円盤を$aから$bへ移動する。$cが補助として使える
　
 2枚の円盤の場合は
　hanoi($n-1, $a, $c, $b) = $n-1枚の円盤の塊を$aから$cへ移動する。補助として$bが使える
　次にn番目の円盤を$aから$bに移動する = f($n, $a, $b)
　次にhanoi($n-1, $c, $b, $a) = n-1枚の円盤の塊を$cから$bへ移動する。補助として$aが使える。
 $aには何も無いから自由におけるし、$cの円盤は$bにある円盤よりも小さいので問題ない。
 これで2枚の円盤の時は終了。

これを式で表すと
Hanoi($n, $a, $b, $c) = hanoi($n-1, $a, $c, $b) + f($n,$a, $b) + hanoi($n-1, $c, $b, $a)
後はこれをn=1まで再帰で解いてOK。

##n=2の時の検証
①hanoi(2, “A”, “B”, “C”) = **hanoi(1, “A”, “C”, “B”)** 
        + 2番目の円盤1をAからBへ移動
 	+ **hanoi(1,”C”, “B”, “A” )**


②**hanoi(1, “A”, “C”, “B”)** = hanoi(0, “A”, “B”, “C”)
        + 1番目の円盤をAからCへ移動
        + hanoi(0, “B”, “C”, “A”) 


③**hanoi(1, “C”, “B”, “A”)** = hanoi(0, “C”, “A”, “B”)
        + 1番目の円盤をCからBへ移動
        + hanoi(0, “A”, “B”, “C”) 
ここでhanoi(0,xx,xx,xx)の時は何もしない
①～③を合わせると (分割して最後に合わせる) = 分割統治
1番目の円盤をAからCへ移動
2番目の円盤をAからBへ移動
1番目の円盤をCからBへ移動
n=2の時はOK

##コード

```php

hanoi(2,"A", "B", "C");
echo '<br>';
hanoi(3,"A", "B", "C");

function hanoi($n, $a, $b, $c) {
    if ($n > 0) {
        hanoi($n-1, $a, $c, $b);
        echo $n .'番目の円盤を' . $a . 'から' .$b. 'に移動する';
        echo '<br>';
        hanoi($n-1, $c, $b, $a);
    }
}

```

##コードとドキュメント
https://github.com/Khanashima/algorithm
AtomでMarkdown+数式を利用する

`ぶっちゃけqiitaで数式書けるのでqiitaで書いてスライドモードにするのがいいよ`


#INTRODUCTION
##Markdownとは
文書を記述するための軽量マークアップ言語です。
要するにHTMLをもっと簡単に書けるようにしたものです。

##ATOMとは
[Github](https://github.com)の開発するテキストエディタ
多くのプラグインが利用出来る
https://atom.io

##LaTeX
レイテックス
数式を記述出来るマークアップ言語
厳密にはTeX+マクロと言う感じなので、Tex以上に必要とされるスキルは無い

#導入

https://atom.io
からATOMをダウンロードしてインストール
![スクリーンショット 0027-06-09 午後8.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/24979/8c4581a7-35f6-1ab6-8c53-eac4d6a67e1a.png)

ATOMを起動し、Preferences(設定)を開く。

![スクリーンショット 0027-06-09 午後8.48.10.png](https://qiita-image-store.s3.amazonaws.com/0/24979/ed3ce83e-4758-fa9a-89fb-3c9d70a89f08.png)

Installタブに移動し**markdown-preview-plus**を検索しInstall

![スクリーンショット 0027-06-09 午後8.49.34.png](https://qiita-image-store.s3.amazonaws.com/0/24979/ddb3ff5c-3c5f-ca16-78d1-35c514e1c295.png)

**mathjax-wrapper**も検索してInstall

![スクリーンショット 0027-06-09 午後8.50.19.png](https://qiita-image-store.s3.amazonaws.com/0/24979/7ad7b3be-4a25-e07b-5d8a-46654e25c5d2.png)

次にpackageタブに移動して**markdown-preview**で検索し、markdown-previewを無効にします。（markdown-preview-plusはそのまま）

![スクリーンショット 0027-06-09 午後8.53.01.png](https://qiita-image-store.s3.amazonaws.com/0/24979/a6af0395-78db-e9a5-408d-3142a512d54a.png)

以上で準備は完了です。

sample.mdなど、拡張子mdのファイルを作ってマークダウンを書いていきます。

```sample.md
#タイトル
##サブタイトル

文章です。

文章の中に$\Delta{x}$のように数式も入れられます。

$$\frac{x}{t}$$

ドルマーク２つで囲えば行全体に、１つで囲めば文中に数式が書けます。
```

![スクリーンショット 0027-06-09 午後8.57.54.png](https://qiita-image-store.s3.amazonaws.com/0/24979/75b4e299-ac0c-7df3-bbb9-89e9f34a4497.png)

このように書き込んだら、`Ctrl+Shift+M`でプレビューを出せます。（markdown-preview-plusの機能です）
この後、`Ctrl+Shift+X`で数式もプレビュー出来るようになります。（mathjax-wrapperの機能）

![スクリーンショット 0027-06-09 午後8.59.41.png](https://qiita-image-store.s3.amazonaws.com/0/24979/4eb5447a-fdba-2d8b-f6dd-e2834440c4ed.png)

以上です。

#付録
マークダウンの書き方
http://qiita.com/Id_Seth/items/b684cfabe0f2fde0c67b

LaTeXの書き方
http://www.latex-cmd.com/index.html#equation
「特異メソッド」は誤訳か

**注意**　この記事は当初，「Ruby の用語として，singular method を特異メソッドと訳したのは妥当でなかったのでは」というモチーフのもとに書いたものですが，コメントのやりとりを見ていただくと分かるように，英語を和訳したのではなく，日本語の「特異メソッド」が先にあったようです。従って「誤訳か」という記事名は適切ではありませんでした。（2016年10月20日付記）

ソフトウエア工学とやらを学んだこともなく，プログラミング用語に詳しいわけでもなく，英語が得意でもないので，的外れなことを書いているかもしれません。乞うご批判。

ほかのプログラミング言語でどうなのかは知らないので，Ruby だけを考えます。

### 追記（2021 年 8 月 4 日）

本記事では Ruby における「特異メソッド」の英語として一貫して「singular method」を採っていますが，どうやら圧倒的に「singleton method」のほうが流通しているようです。前者が間違いというわけではないようですが，後者のほうが少なくとも普通ではあるようですね。
この記事を書いたのは 2015 年。六年以上も前のことなので，何を見て「singular method」としたのかもはや思い出せません。

# 特異メソッドのおさらいと名称への疑問

メソッドはクラスやモジュールに書くこともできますが，以下のように特定のオブジェクトだけに持たせてやることもできます。

```rb
str = "yada"

def str.spam
  puts self * 1024
end

str.spam #=> yadayadayadayadayadayadayadayadayadayadayadayada...

"yada".spam #=> NoMethodError（別のオブジェクトなので）
```

このようなメソッドをそのオブジェクトの「特異メソッド」と呼ぶわけですが，この名称は妥当なんでしょうか。

「特異」は「フツーじゃない」「けったいな」「そいつだけ変」という意味ですよね。特異メソッドってそんなに変か？

# 英語は singular method

「特異メソッド」は英語では「singular method」と言います。

singular という単語には，確かに「特異な」という意味があります。

数学で singular point は「特異点」。関数が微分可能でない点などをそう呼びます。まさにフツーじゃない点ですね。

また，人間の行動について，a singular behavior は「奇行」（奇妙な振る舞い）だそうです。

# 文法の「単数」も singular

でもふと思い出しました。英語などの文法で「単数形」「単数の」は singular ですよね。

single と関係のある語ですね。

# 英和辞典を引く

そこで思い立って『ランダムハウス英語辞典』で singular を引いてみると，「唯一の」とか「個々の」「各自の」といった意味が挙がっています。

また，論理学用語で「ある1個の対象に属することについていう」として，a singular concept（単独概念）という例が挙がっています。
単独概念というのは，「ナイル川」とか「このペン」といった概念のことだそうです。カテゴリー（「川」「ペン」）に対するインスタンスとも言えますね。

さらに，廃語ですが「個人所属の」といった意味も挙がっています。

「singular method」における「singular」って，まさにこの節で挙げたような意味ではありませんか。

singular method は特異なメソッドではなかったんですよ！　「特異メソッド」という訳語に強い疑問を抱きました。

いやもちろん，翻訳ルールとして，上記のような意味の singular を「特異」と訳すことに決めてしまう（その場合，日常語の「特異」からは意味が広がるけれども）という方針もあり得ないことではないでしょう。

学術用語はしばしばそのように，（日常語の語感に照らした自然さを犠牲にして）機械的に訳語を対応づけることがあります。

# 理解を妨げてない？

特異メソッドは初心者に理解しづらいようです。私も初めのうち，よく分りませんでした。

〈名称の悪さが理解を妨げている〉とまでは思いません。特異メソッドを学んでいて混乱する原因は主に，クラスも Class クラスのインスタンスだとか，クラスメソッドも実はクラスの特異メソッドなんだとか，特異メソッドも実はオブジェクトの特異クラスというものに定義されたインスタンスメソッドなんだとか，というメタメタな話に行っちゃうことなんだろうと思います。

ただ，「特異」という言葉は何かちょっと〈得体の知れないもの〉というイメージを喚起しませんか。それと，やはり特異メソッドの説明と名称とがなかなか結びつかなくて，モヤモヤした気持ちになりますよね。

# では何と訳す？

「特異メソッド」に変わる用語として，これというアイデアはないのですが。

「個別メソッド」はどうでしょうか。

あるいは「個体メソッド」はどうでしょう。

「個体ってインスタンスじゃねえの？」と訊かれそうですが，「instance」はクラスに視点を置いた用語で，あらわに書かなくても常に「○○クラスのインスタンス」という含意があります。それに対し，ここでいう「個体」はクラスとの関係はどうでもよくて，「他ならぬそのオブジェクト」というニュアンスです。

たぶん，だれも賛同してくれませんね。

# 【余談】有理数と無理数

「特異メソッド」という名称について考えているうち，こんな話を思い出しました。

数学用語の「有理数」「無理数」はそれぞれ，rational number，irrational number の訳語であるようです。

「rational」には確かに「理に適った」「理性ある」という意味があります（irrational はその反対）。
「有理」「無理」は「理が有る」「理が無い」という意味なので，当てはまっていそう？

しかし，有理数の定義（整数の比で表せる数）を思えば，rational は「比（ratio）」から来ていると考えるべきでしょう。

実際，「比数／非比数と訳すべきだった」という数学者もいました。この訳語の支持者は少なくないようです。

※もっとも，上記を踏まえつつ，なお「有理数」「無理数」をうまい訳だと言っている人もいます。
「参照の値渡し」とかゆーのやめよーぜ

#正直見かけるたびにしんどい
Javascriptの配列やオブジェクトは「参照の値渡し」とかゆー人がいるけど、わけわかめ。

「スマートポインタの複製」だろ常識的に考えて。参照しているポインタがなくなったらメモリが解放されてGCの対象になるとか、まんまスマポじゃん。

#コメって嬉しいですね
コメ読んで改めて仕様書読んで思ったけど、「参照の名前渡し」ってどうよ。と思ったら、「名前渡し」の「名前」が衝突していたようだ。これもまたコメで教えて頂いた。

で、ファイナルアンサー。やっぱり結局「参照渡し（ただしスマポ）」と呼ぶしかなさそうだ。

#で、続きがまたも
ファイナルがファイナルでない、いつものこと。スマポでイメージが沸くのは母語がC++の人だけ、というのはさもありなん。「共有渡し」によろめこうかとも思ったが、それはそれで shared_ptr の訳語の香りがするよねえ。

すると、「**参照渡し（渡すのは名前であって、誰かに名前を所有されているなら、きっと存在している）**」でどうだろう。もう叙述的にするしかないかな。「きっと存在している」というあたりに、「存在を保証する場合のみ規定し、それを解放するかどうかは実装依存」という要素を織り込んでみたのだが。**叙述的な名付けってのも、ライトノベルっぽいよね。** とはいえ、妹とか異世界とかはさすがに織り込むすきまがない。

この調子（ラノベ風）でいけば、その他の参照、例えば「参照の所有者が、他の参照の所有者の有無に関わりなく参照を未定義にしうる参照」、とかでも何とかなりそうな気がしてきたぞ。
Androidのユニットテストを高速化する Robolectric編

## はじめに

前回の記事[Androidのユニットテストを高速化する](http://qiita.com/numa08/items/7ee78a0f29a4bc728f48)で[Robolectric](http://robolectric.org/)を利用すると良いのでは？って書いたので使ってみました。この方法を実践することでAndroidのユニットテストをJVMで実行することができ、テストの高層化につながります。

Andrroid gradle pluginが1.1以上であればInstrumentation Testと共存できるのでバージョンの確認を行いましょう。

## やりかた

Android gradle pluginのバージョンが1.1以上になっているのが望ましいです。1.1以前だと、Instrumentation Testと共存することができないっぽいです。

```gradle
buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}
```

次に依存関係を解決します。バージョンなどは公式サイトやリポジトリを見て読み替えてください。

```gradle
dependencies {
	testCompile 'org.robolectric:robolectric:3.0-rc3'
}
```

これで準備ができました。Android Studioを利用している場合は`Build Variants`の`Test Artifact`を`Unit Tests`に変更します。

## テストを書く

テストのソースコードは`src/test/java`以下へ格納し、JUnit4の形式でテストを書きます。Robolectricを利用するテストクラスはクラスのアノテーションに`RunWith(RobolectricTestRunner.class)`が必要です。また必要に応じて`Config`アノテーションで設定をすることでAPIのバージョンの指定などができます。


```java
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildCOnfig.class)
public class MyClassTest {

	private String json;

	@Before
	public void loadJSON() {
		json = loadJson();
	}

	@Test
	public void initiJson() {
		assertThat(TextUtils.isEmpty(json), is(not(true)));
	}
}
```

## 制約とか

Robolectricではネイティブライブラリを読むことができません。またこれはRobolectricだけでなく前回紹介したJVM上でのテスト実行でもサポートされていないそうです。そのため、ネイティブライブラリに依存する機能のテストはInstrumentation Testで行う必要があるようです。


## 終わりに

Robolectricを利用したテストの方法を紹介しました。エミュレータやデバイスを利用しないので高速に動く分、ランタイムがJVMになる点については注意が必要かもしれません。そういった部分を意識しつつも高速に高品質なアプリを作っていきたいですね。
supervisorの設定ファイルを編集した際に起きたエラー(no such process)

supervisorの設定ファイルでプロセス名を編集して、supervisorを起動`(sudo supervisorctl start myapp)`しようとすると以下のようなエラーが発生しました。

```
myapp: ERROR (no such process) 
```

設定ファイルを編集しただけだと、過去のキャッシュが呼ばれるんですね。
そこで、以下のとおり`reread`をしてあげることで、解決することが出来ました。

```
sudo supervisorctl reread
sudo supervisorctl reload
```
TreasureDataでHiveクエリを書くとき - TD_X_RANKを利用しよう

# はじめに
Treasure DataはHiveの関数以外に独自関数を。。。（略

[ドキュメント：Supported Hive UDFs](http://docs.treasuredata.com/articles/udfs)

ドキュメントを見れば、ここから下は不要だ。

# TD_X_RANK
とあるグループの中で並べられた要素に番号を振っていく関数です。まず、Order byかCluster byとかで関連カラムを並べ替える必要があります。全体に順番つけるの無理なので注意してください。

```sql:Signature
long TD_X_RANK(keys)
```

# 利用例
下のような成績データがあります。AクラスとBクラスの成績です。
これをクラス、成績で並べ替えます。

|time|class|id|score|
|:----:|:----:|:----:|:----:|
|2015-06-09|A|1|90|
|2015-06-09|A|2|95|
|2015-06-09|A|3|90|
|2015-06-09|A|4|30|
|2015-06-09|A|5|40|
|2015-06-09|A|6|75|
|2015-06-09|A|7|99|
|2015-06-09|A|8|89|
|2015-06-09|A|9|75|
|2015-06-09|A|10|80|
|2015-06-09|B|1|50|
|2015-06-09|B|2|95|
|2015-06-09|B|3|90|
|2015-06-09|B|4|90|
|2015-06-09|B|5|40|

並べ替えます。td_x_rankに指定するのはclassなんで注意してください。scoreを囲みたくなりますが、class....

```sql
select class,td_x_rank(class) as rank , score,id
from ( select class, score ,id from testx order by class ,score desc,id) t
```

各クラスで成績が良い順に番号が付きましたね！

|class|rank|score|id|
|:----:|:----:|:----:|:----:|
|A|1|99|7|
|A|2|95|2|
|A|3|90|1|
|A|4|90|3|
|A|5|89|8|
|A|6|80|10|
|A|7|75|6|
|A|8|75|9|
|A|9|40|5|
|A|10|30|4|
|B|1|95|2|
|B|2|90|3|
|B|3|90|4|
|B|4|50|1|
|B|5|40|5|

# まとめ
なんで同じ点数なのに番号増えているの？的な話は下の記事を読むとさらに理解が深まります。（私が書いたんじゃないですが。。）

[TreasureDataのUDFとPrestoでのRank関数の挙動について](http://qiita.com/toru-takahashi/items/9db66a223c2913c42b45)
タイムゾーンのずれで Oracle Database が起動しない時

Oracle がインストール時に自動設定するタイムゾーンと、サーバーのタイムゾーンの不一致で、Oracle Database が起動しない場合があります。

環境情報
----------

- Oracle Database 11g R2
- Microsoft Azure 仮想マシン Windows Server 2008 R2 SP1

現象
---------

インストール時に以下のような警告が表示されます。

> Enterprise manager configuration succeeded with the following warning-
>
> Error starting Database Control. Please execute the following command(s).
>
>   1) Set environment variable ORACLE_UNQNAME to Database unique name
>   2) C:\app\<username>\product\11.2.0\dbhome_1\bin\emctl.bat start dbconsole

インストールが環境しても、 Enterprise Manager に接続はできるものの、データベースが起動しません。 リスナーやエージェントにも接続できません。

上記の警告にあるように、環境変数 `ORACLE_UNIQNAME` を設定して、 `emctl start dbconsole` を実行しても、 `dbconsole` は起動しません。。

原因
-----

`C:\app\<username>\product\11.2.0\dbhome_1\<servicename>_<SID>\sysman\log\emdb.nohup` を確認すると、以下のようなログが確認できました。

> ----- Tue Jun  9 07:33:30 2015::tzOffset for -04:00 is -240(min), but agent is runnning with tzOffset 0(min)

Oracle のインストール時に、自動的にタイムゾーンが設定されるのですが、この設定と、サーバーのタイムゾーンがミスマッチしているため、起動しないようです。

自動設定されるタイムゾーンは、以下のコマンドで確認できます。

```
emctl config agent getTZ
```

手元の環境では、ローカルのタイムゾーンは UTC なのですが、上記コマンドは `America/Rio_Branco` (-04:00) を返していました。


対応方法
-----------

Oracle のインストール時に設定される `C:\app\<username>\product\11.2.0\dbhome_1\<servicename>_<SID>\sysman\config\emd.properties` をローカルのタイムゾーンに設定します。

```emd.properties
agentTZRegion=+00:00
```

以下のコマンドで、 dbconsole が無事に起動すれば OK です。

```
emctl start dbconsole
```

念のため、 OS を再起動して、 Oracle が正常に自動起動するか確認しておきましょう。

参考
-----

[12.1.5.4 管理サービスのタイムゾーンに関する問題のトラブルシューティング](http://otndnld.oracle.co.jp/document/products/oem/10203/doc_cd/server/E05062-02/postinstall_config.htm#402607)
【Unity】UnityでParseを使って幸せになろうよの巻

# はじめに
スコアランキングやセーブデータなどなど、Unityに限らずゲームやアプリを作っているとネットワーク側に色々なデータを置きたくなります。
そういう時にMBaaSの導入を検討するわけですが、今までは無料利用枠が微妙とか導入がめんどくさいとかカスタムしづらいとかで敬遠していました。

そんな怠惰な自分が今日Parseを触ってみてテンションめっちゃ上がったので、まとめて書きなぐりますですハイ。
# Parseってなんぞや
MBaaSで、データストレージ・ファイルストレージなどなどいい感じの機能が揃っているサービスです。
Facebookに買収されて成長しまくってるらしいです。
Unityだけじゃなく、AndroidやiOSその他もろもろで使えるよー
https://parse.com/products
# どんくらい無料？
現時点では、
・秒間30APIリクエスト
・データストレージ20GB
・ファイルストレージ20GB
・ファイル転送2TB
夢かこれは。夢だこれは。
https://parse.com/plans
# 導入の手順は？
1.サービス登録
~~2.SDK落とす~~
~~3.UnityにDLL放り込む~~ ([Android実機で問題が出たので、Assetでの導入がオススメです](http://qiita.com/Ijoru/items/56e7bff5ccfab2714cb2))
4.イニシャライズ用GameObject作って終わり

はいカンタン。
↓に沿って進めたら迷うことなく速攻終わりました。データストレージのいじり方も記載されています。
素晴らしい記事。ありがたやありがたや。
http://kan-kikuchi.hatenablog.com/entry/Unity_Parse_Data
# 他には何が出来るの？
## データストレージをWeb側で見る
テーブルの中身直で見れます。いじれます。
## Push通知
月間100万人（100万件じゃなく100万人）に無料で送れるそうです。
そんなにユーザいません。orz
## ファイルストレージ
GUIは多分無いのかな？APIを直で叩いてファイルアップロードが可能。
20GBもあるのでAssetBundleとか余裕で置けそう。
使い方は↓。
https://parse.com/docs/rest/guide#files
## クラウドコード
サーバ側でのプログラム実行みたいなもん。
jsで書いて、cronみたいに定期処理も可能らしい。
http://qiita.com/key/items/3043a04b8adaf8311a31
## その他
他にもAnalyticsがあったりREST APIが沢山あったり。
これが無料で使えるなんてタマランですな！
フォォォォオー！！
MHA - DBサーバのレプリケーション確認コマンド

MHAで監視するDBサーバのレプリケーションに問題無いか確認するコマンド

#### MAHレプリケーション確認コマンド

```
masterha_check_repl --conf=/etc/caesaruser02.cnf
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/06/09/194824
MHA - MHAサーバ - DBサーバ間のSSH疎通確認コマンド

MHAはMHAサーバ - DBサーバ間でSSHで接続できる必要がある
その疎通に問題無いか確認するコマンド

#### MAH疎通確認コマンド

```
masterha_check_ssh --conf=/etc/master.cnf
```

#### ※参考
http://makaaso.hatenablog.com/entry/2015/06/09/194730
Azure CLIの公式Docker image を使う

Microsoftよりazure-cliのDockerコンテナがリリースされています。
https://registry.hub.docker.com/u/microsoft/azure-cli/
http://azure.microsoft.com/blog/2015/06/08/run-azure-cli-as-a-docker-container-avoid-installation-and-setup/

# 使い方
Dockerインストール済みの環境なら以下のコマンド一発で最新のazure-cliが利用できます。

```
$ docker run -it microsoft/azure-cli
```

実行後は普通のazure-cliの使い方と一緒です。
`azure login`や`azure account import`で認証後、イメージ化すれば次回起動以降の認証が省けます。
ただし、__認証済みのコンテナをパブリックなリポジトリにPUSHしないよう注意しましょう。__

# どんなコンテナか
Dockerfileは至ってシンプル。
今のところubuntu に nodejs,npm,azure-cli をインストールしただけです。

```:Dockerfile
FROM ubuntu:14.04

RUN apt-get update && \
        apt-get -qqy install --no-install-recommends nodejs-legacy npm && \
        sudo npm install --global azure-cli@0.9.4 && \
        azure
```
Chrome拡張機能メモ

# Chrome拡張機能メモ

Chromeに入れておきたい拡張機能のメモ。
Mac、Windows両方で使う際に共有できると便利。

## Adblock Plus

優秀な広告ブロッカー。
サイト閲覧時の余分な広告をカットしてくれます。

https://chrome.google.com/webstore/detail/adblock-plus/cfhdojbkjhnklbpkdaibdccddilifddb

## Evernote Web Clipper

WEBページをEvernoteに保存するのに便利。
Gmailのスレッドも保存できますね。

![スクリーンショット_060915_070055_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/82166/427f68bf-a057-e4ac-8c54-34fc2a3bd40e.jpeg)

[Appページ](https://chrome.google.com/webstore/detail/evernote-web-clipper/pioclpoplcdbaefihamjohnefbikjilc)

## LastPass

WEBページのパスワード管理をできるツール。
定期的にパスワードを変更しないといけないページとかで重宝してる。
パスワード変更履歴も出るらしいけど、試してないな。

![スクリーンショット_060915_070344_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/82166/5441056c-b1c1-9d38-8211-53a852b99622.jpeg)


[Appページ](https://chrome.google.com/webstore/detail/lastpass-free-password-ma/hdokiejnpimakedhajhdlcegeplioahd)

## Proxy SwitchySharp

Proxyをかませる開発をするときにすぐ切り替えられて便利。

![スクリーンショット_060915_070639_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/82166/89a73bb1-e2e0-b284-2b21-ba3b68189cc9.jpeg)


[Appページ](https://chrome.google.com/webstore/detail/proxy-switchysharp/dpplabbmogkhghncfbfdeeokoefdjegm)

## Google Mail Checker

メール件数を表示してくれるやつ。

![スクリーンショット_060915_070708_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/82166/cf057d8a-9a48-6693-cfd3-9d7c40ad4dfb.jpeg)


[Appページ](https://chrome.google.com/webstore/detail/google-mail-checker/mihcahmgecmbnbcchbopgniflfhgnkff)

## Incredible StartPage - Productive Start Page

新規タブが少しオシャレになって、付箋メモついてたり、ブックマーク、アプリ、閲覧履歴が見やすくなる。

![スクリーンショット_060915_070812_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/82166/f19ec0e9-8b6f-e02e-f568-c7dec2628625.jpeg)


[Appページ](https://chrome.google.com/webstore/detail/incredible-startpage-prod/ncdfeghkpohnalmpblddmnppfooljekh)

## SearchPreview

Google検索でページサムネイルが表示されるようになる。
探しものが捗ります。

![スクリーンショット_060915_070928_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/82166/009577c1-cdd5-8f21-f3de-0e2801e7b6d5.jpeg)


[Appページ](https://chrome.google.com/webstore/detail/searchpreview/hcjdanpjacpeeppdjkppebobilhaglfo)

***

別現場で作業等で新しいPCが支給されたときに、何入れてたっけな？ってなったとき用のメモでした。
ubuntu14.04 をアクセスポイントにしてandroidにプロキシ通す

# ubuntu14.04 をアクセスポイントにしてandroidにプロキシ通す

ソフトウェアアクセスポイントで ubuntu をルータにするやつ。
ASUS の zenbook ux303ln に入れた `ubuntu14.04` で試した。

アクセスポイントにするので力を使い果たしたので
プロキシ周りなんぞほぼオマケな内容になってしまった…まぁしょうがない。

気が向いたらandroidからプロキシ通して通信を眺める記事別途書くかも。

追記@2015/06/16
iptables + 透過型プロキシでやるやつ。
http://qiita.com/arc279/items/944cd8bb0f438cb6dde1

## 前提

* 無線LANのNICがある(wlan0) ← 試してないけどたぶんドングルでも可
* 有線LANのNICがある(eth0) ← USBのアダプタでも可

無線で受けて有線で外に流す。
macとiphoneのネットワーク共有みたいな感じ。

## ap-hotspot を入れる

* dnsmasq : 名前解決するやつ(?)
* hostapd : ソフトウェアアクセスポイントするやつ

をうまいことまとめてくれる感じ。


この辺を参考に
http://www.webupd8.org/2013/06/how-to-set-up-wireless-hotspot-access.html

```bash
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install ap-hotspot
```

## hostapd 入れ替え

なんか 14.04 だと `apt` で入る`hostapd` のパッケージがぶっ壊れてて起動時にこんなエラー出るらしい。

```text:こんなエラー
nl80211: Could not configure driver mode
nl80211 driver initialization failed.
hostapd_free_hapd_data: Interface wlan0 wasn't started
```

ので、ここから落としてきて手動で入れ替える。
http://ftp.ubuntu.com/ubuntu/pool/universe/w/wpa/

とりあえず自分のとこだとコレ入れたらいけた。

```bash
sudo apt-get remove hostapd
sudo dpkg -i hostapd_2.1-0ubuntu7_amd64.deb
```

## wlan0の設定

↓これでいけるっぽい。
※あんまよくわかってない

```bash
sudo nmcli nm wifi off
sudo rfkill unblock wlan
```

## 起動

の前に、configureしておく。
しなくても初回起動時に訊かれるけど。

```bash
sudo ap-hotspot configure
```

とりあえず全部デフォルトでENTER連打。

で、起動してみる。

```bash
sudo ap-hotspot start
```

これでアクセスポイントとして認識できるようになるはず。
ログは `/tmp/hostapd.log` に出てる。

設定がデフォルトなら、

```ini:/etc/ap-hotspot.conf
# WiFi Hotspot
interface=wlan0
driver=nl80211
#Access Point
ssid=myhotspot
hw_mode=g
# WiFi Channel:
channel=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=qwerty0987
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
```

こうなってるので、接続先はこう。

* ssid : myhotspot
* passphrase : qwerty0987

## 止める

```bash
sudo ap-hotspot stop
```

で止まってくれそうだけど、止まってくれない微妙にポンコツなので、手動で。

```bash
sudo pkill -KILL -f "ap-hotspot"
sudo pkill -KILL -f "hostapd"
sudo pkill -KILL -f "dnsmasq"
```

### 後片付け

pidファイルが残ってると次回起動できないのでハマる。

```bash
sudo rm /tmp/hotspot.pid
sudo rm /tmp/hostapd.log
```

## androidからプロキシ通す

上記アクセスポイントにandroidから接続して、
wifiの設定でプロキシを通す。

デフォルトの設定なら

* Gateway: 192.168.150.1

になってるはず。

プロキシはmitmproxyなりcharlesなり好きなのを。
iOSでもやり方は同じ。

## https

httpsをプロキシする場合の、オレオレ証明書のインストールはこのへんを参考に
http://akasaka-taro.blogspot.jp/2012/04/android.html

mitmproxy ならこれ。
`~/.mitmproxy/mitmproxy-ca-cert.pem`


## 手でやるのがめんどくさい

しょうがないなぁ。

```bash:wlan_hostpot.sh
#!/bin/bash

(
sudo pkill -KILL -f "ap-hotspot"
sudo pkill -KILL -f "hostapd"
sudo pkill -KILL -f "dnsmasq"
sudo rm /tmp/hostapd.log /tmp/hotspot.pid
) 2>/dev/null

sudo nmcli nm wifi off
sudo rfkill unblock wlan

sudo ap-hotspot start
```

なんか2回に1回失敗する。なんで？
CoffeeScriptハマリどころ撰集

#ぽすけて
ってなるときのための、プチはまりをノウハウ化しようというページ。このページに完成はありません。私がCoffeeScriptを放棄したとき、多分、更新が止まるって感じ。項目を足すような更新を行う度に通知にするんで、それがウザいってひとはストックしない方が良いよ。

#コンパイルエラー関係
<dl>
<dt>なんちゃらOUTDENTとゆわれるんだけど、インデントは綺麗だよ</dt>
<dd>thisを使わないといけない場面じゃないかい？　もしくは、ダブルアローで束縛しなくちゃいけない場面じゃないかい？</dd>
<dt>変数を「知らん」ゆわれる</dt>
<dd>存在確認演算子使え</dd>
</dl>

#正規表現マッチ
<dl>
<dt>思ったやつにマッチしない</dt>
<dd>それ、JavaScriptでもやったでしょ！　えーと、直書きのときと違って、文字列リテラルのときは2重にエスケープが必要だよ。バックスラッシュが2倍になる。あと文脈的なもんにマッチさせたいときは、「\b」とか役に立つから思い出しておこう。</dd>
<dt>やっぱり正規表現マッチの後、結果にアクセスしたら墜ちる</dt>
<dd>それ、JavaScriptでもやったでしょ！　マッチしなかったときの返値はnullだよ。見つからないときの返値が-1なのは、アレだ。indexOf</dd>
</dl>

#レースコンディション
<dl>
<dt>なんか、次のコードが先行して走ってるんだけど</dt>
<dd>ひとつはインデントミス。並行実行になってる。次は、```setTimeout (->FUNC()),0```とやろうとして矢印忘れるケース。似てるけど、```setTimeout FUNC,0```とやろうとして()付けちゃうケース</dd>
</dl>

#クラスと関数
<dl>
<dt>クラスメンバにアクセスできない</dt>
<dd>thisを使わないといけない場面じゃないかい？　もしくは、ダブルアローで束縛しなくちゃいけない場面じゃないかい？　この辺、かなり色々ありそうだ。</dd>
<dt>クラスメソッドにapplyを使うと挙動が違う</dt>
<dd>それ、メソッドに見せかけた怪しいやつです。Function.prototype.apply.callを使いませう。
</dl>

#配列
<dl>
<dt>なんか、思ってたのと違うもんが出てきた</dt>
<dd>Javascriptでも同じ！　とりあえず、メソッドを連鎖させてかっこつけるのやめれ。```.shift()```の返値は先頭にあった1要素だけなんで、```array.shift().shift()```なんて多重配列の場合しかあり得ないよ。後は、.concat()の結果を代入するのは意味ナッシングだからやめれ。同じものを参照しているので、混乱の元だ</dd>
</dl>

#とりあえずここまで
現状の凶悪さランキングとしては、レースコンディションの項かな。
Polymer1.0でのデータの流れをメモる

```
<!-- 呼び出し部分 -->
<layout-header
    title="Quick Start Sample"
    desc="Here is Initial Sample Pages.">
</layout-header>


<!-- コンポーネント -->
<dom-module id="layout-header">
  <template>
    <h1>{{title}}</h1>
    <p>{{desc}}</p>
    <hr/>
  </template>
</dom-module>

<!-- 定義部分 -->
<script>
  Polymer({
    is: "layout-header",
  });
</script>
```

属性としてdom-moduleに投げたものは、その属性名でそのまま取り扱うことが可能。
Coqコーディング規約

#全般

- コンパイルできないコードはコミットしない
- 使用しているCoqのバージョンをREADMEに書く

#タクティックに関すること

- bulletを使う (https://coq.inria.fr/refman/Reference-Manual009.html#sec332)
- 同じ時点でできたサブゴールは、同じインデントにする
- サブゴールの末尾はterminatorまたはnowタクティカルを使う
- 新しく生成される変数名、仮定の名前を明示する
  - 例: introsタクティックでは引数を明示し、数と名前を指定
  - 例: destructタクティックではasで新しくできる変数名を明示
- optional(セミコロンは前半のタクティックでサブゴールが増える場合以外は使わない)
Mackerelでインスタンスを再作成しても同じホストと認識させたい

# 公式のhelp

http://help-ja.mackerel.io/entry/faq

> インスタンスの再作成をする際に、再作成前後で同じホストと認識させたい場合はホストID（デフォルトでは/var/lib/mackerel-agent/idに保存されています。詳しくは用語集のホストの項目を参照ください）が記録されたファイルを再作成前に退避しておき、再作成した時にそのファイルを配置することで対応できます。

ほとんど上記のとおりですが、1つ注意点がありました。

# 気をつけるポイント

`/var/lib/mackerel-agent/id` は `noeol` で作ります。
ファイルを退避せずにIDだけメモしてコピペしたらダメでした。

下記のような感じで作ったらうまくいきました。

`echo -n "aaaaaaaaa" > id`

viならファイルを開いて下記コマンドで改行無しのファイルを作れます。

`:set binary noeol`

パーミッションは適宜調整してください。
そのあとは普通に mackrel-agent を `start` してください。
続きからグラフが描画されるはずです。
Vimで複数行の行末に拡張子を付ける

# 前置き
環境として MacVim を使用しています。
筆者はKaoriya版を使用しておりません。

# 概要
Vimで複数行の行末にヤンクした拡張子を貼り付ける方法です

# やり方

1,
![c_step1.png](https://qiita-image-store.s3.amazonaws.com/0/76065/1403925f-c94e-ebf0-5801-c93e10918f14.png)
こんなファイルが有ります。

2,
![c_step2.png](https://qiita-image-store.s3.amazonaws.com/0/76065/c1769b91-e022-4b33-6964-c95e9cce16ea.png)
".txt" の . にカーソルを置き、`vey` とキーを押して拡張子をヤンクします。
`v` = ビジュアルモードにする
`e` = 単語の終わりまでカーソルを移動
`y` = ヤンク（コピー）

拡張子が *.txt.temp.hoge* の様に単語が複数並ぶ拡張子の場合などは、
`e` の代わりに行末まで一気に行ける `$` を押しても構いません

3,
![c_step3.png](https://qiita-image-store.s3.amazonaws.com/0/76065/de4cf316-b197-00f3-88ef-0edbdd11afd1.png)
`0` を押して行頭にカーソルを戻します

4, 
![c_step4.png](https://qiita-image-store.s3.amazonaws.com/0/76065/b5c2dd6c-63da-15af-6ca4-77cbfe534c32.png)
拡張子を付けたい行へジャンプします。
今回の場合 `4gg` で指定行へのジャンプが出来ました。

5,
![c_step5.png](https://qiita-image-store.s3.amazonaws.com/0/76065/1361d4cd-1131-c118-31e5-5cfcfaf93631.png)
`C-v` で矩形ビジュアルモードにします。

6,
![c_step6.png](https://qiita-image-store.s3.amazonaws.com/0/76065/2e3e02a0-0556-dc1c-aa71-918b4dd9a640.png)
`G` を押して最終行までジャンプします。
今回はファイルの最終行までを指定していますが、`jk` キーで拡張子をつける行を任意に選択して下さい。

7, 
![c_step7.png](https://qiita-image-store.s3.amazonaws.com/0/76065/5b62cde6-efc1-ae2b-d3b4-fb95b91351ba.png)
`$` を押してそれぞれ最終行まで選択します。

8, 
![c_step8.png](https://qiita-image-store.s3.amazonaws.com/0/76065/3a06e09b-8a78-98a0-ed50-4cdaff46c8a4.png)
`A` を押して、入力モードにします。
画像では見えてませんが、カーソルは選択した一番上の行の行末にあります。

9, 
![c_step9.png](https://qiita-image-store.s3.amazonaws.com/0/76065/7bdd4ccd-3a0c-67ba-6025-7db414cff496.png)
ここからが重要です。
先ほどヤンクした拡張子を `C+r` `"` の順で入力しペーストします。
`C+r` = ~~レジスト~~レジスタから何か呼び出す準備です。
`"` = 最後をヤンクを~~レジスト~~レジスタから呼び出します。

どうしてかは分からないのですがここで通常の ~~`Ctrl+v`~~ **`Command+v`** をすると選択した行で失敗します。
なので、クリップボードからのコピペではなく、~~レジスト~~レジスタからペーストして下さい。

10,
![c_step10.png](https://qiita-image-store.s3.amazonaws.com/0/76065/c7d0dd2c-180b-c8b3-a49f-b57b6cb6018b.png)
`ESC` キーを叩いて入力モードを抜けます。
そうすると綺麗に選択した行の行末に拡張子が付いているはずです。


# おわり
vimから特定のファイルをリストしているファイルがあって、それに*ファイル名＋拡張子*としたかったのですが、
今回の操作方法を調べていた所 **9,** の項目で「入力したい文字をタイプする」と書かれた記事は多く出てきましたが
ペーストして出来る内容の記事が探せませんでした。

vimに詳しい方いらっしゃいましたら、なぜ ~~`Ctrl+v`~~ **`Command+v`** のペーストだとダメなのか教えてもらえると嬉しいです。

以上、参考になると嬉しいです。

---

### 追記：
打ち消し線で一部単語を修正しました。
レジスト > **レジスタ**　に修正
macなので、Ctrl > **Command** に修正

ご指摘有難うございました。