OmniAICreator/Qiita-1.07M huggingface dataset:
3d touchのショートカット機能


とりあえず3d touchを試すその３で
**Home Screen Quick Actions**
を試してみました。
参考のqiitaを見て守らればxmlで設定することはたぶんわかると思います。
**UIMutableApplicationShortcutItem**
の使い方はswiftの公式を見ながら適当に作り出しました。

```objc:AppDelegate.m
UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch]; // アイコンを作る xmlと同じ名前です。
    UIMutableApplicationShortcutItem *shortcut3 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"aaa" localizedTitle:@"title" localizedSubtitle:@"subtitle" icon:icon3 userInfo:@{@"key": @"あああ"}];
```
|    code    |     xml     |
|:-----------|------------:|
|initWithType|UIApplicationShortcutItemType|
|localizedTitle|UIApplicationShortcutItemTitle|
|localizedSubtitle|UIApplicationShortcutItemSubtitle|
|icon|UIApplicationShortcutItemIconType|
|userInfo|UIApplicationShortcutItemUserInfo|
って感じでコードでも
xmlでも設定するものは同じです。
サブタイトルいらない場合は
initWithType:localizedTitle:
UIApplicationShortcutIconにオリジナルを設定する方法までは調べてないです。
てかDropboxが既に実装されてますけど、これ遷移後の画面に飛ぶ場合はどうやってるんでしょうね。
公式のサンプルがしょぼいAlert出すだけだから感覚がつかめない。
DropboxはSearchAPIも対応してるし、すごいなーてか3d touchよりそっち調査したほうがよっぽど現実的だった。

こうやってるけど、やっぱり人の真似してるだけだなー　英語読んでない

[サンプルコード](https://github.com/kameware/UIApplicationShortcutSample)

参考
[3D Touch の Home Screen Quick Actions に対応する](http://qiita.com/takecian/items/d417498cfe6c3b52c4bc)
[iOS 9から追加された3D Touch shortcutsを実装してみる](http://qiita.com/koogawa/items/dd94a303c7852885f269)

リファレンス
[UIMutableApplicationShortcutItem Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIMutableApplicationShortcutItem_class/#//apple_ref/occ/instp/UIMutableApplicationShortcutItem/type)

公式サンプル(Swift)
[ApplicationShortcuts: Using UIApplicationShortcutItem](https://developer.apple.com/library/prerelease/ios/samplecode/ApplicationShortcuts/Introduction/Intro.html)
ISUCON 5予選に初参加してきた チーム名「Kossyとなかまたち」

ISUCON5予選に初参加してきましたのでふりかえります。
最終スコア4000弱で惨敗でした。

## 事前準備

顔合わせから(武さんとは初対面)、チームで集まってISUCON4予選を解いて、各々準備を進めて本番に望みました。当初予定していた担当と方針はこんな感じ。

- [@haman29](https://twitter.com/haman29) <- 僕
    - アプリケーション(Ruby), Redis
- [@Kshi_Kshi](https://twitter.com/Kshi_Kshi)
    - MySQL(my.cnf、インデックス両方), OSとか
- 武さん
    - Nginx

みんなアプリケーションエンジニアで普段使っている言語が Ruby, node.js, Java とバラバラだったこともあり、僕がRuby書きたい(あわよくばRedisも)というわがままを聞いてもらった。

- 最初の2時間でプロファイリング(kataribe, mysql slow log, top..)をして、ボトルネックを見つけ、TODOと優先度を決める
- 最後の1時間は再起動テスト

### 当日

-11:00

Rubyで行くことを選択していたのは運が良かった。

11:00-13:00

初期ベンチを回してスコア100くらいだったか。
プロファイリング取ろうと用意していたnginx.confを投入したらベンチ０点になったりとかで、結構ワタワタしていた。

僕はRubyコードを読んで仕様は把握に努めてた。
この時点で `relations` と `footprints` はRedisに乗せれるな〜と妄想してた。まだ手を動かしてない。

13:00-14:00

方針決め。とにかく `get '/'` が重いことが kataribe でわかり mysql slow log から `relations`, `entries_of_friends`, `comments_of_friends` のクエリチューニングしましょうという話になった。

15:08

one = ? or another = ? してたところを別々に取りunion
select * も select one か select another にした
この辺りで確かスコア500くらい

16:12

`entries_of_friends` のクエリ改善。

クエリ結果をループで回しさらにクエリを呼ぶお決まりの形になっていたので
friends の id リストを作って where in するようにした。

この辺りでスコア1500ぐらい

-18:00

続いて `comments_of_friends` のクエリもチューニングするぞ！と意気込んでたが、2時間ぐらい使って成果が上げられなかった、、

18:00

`def is_friends?` がたくさん呼ばれてて全体の20%ぐらい使われているとのことだったので、ここでRedis使って`is_friends?`の書き換え実装を始めた。設計は局所的に使うので簡単に。

`isu5:friends:<user_id>: user_id の Set`

19:00

実装終わったけど、ベンチ回せず...orz
不完全燃焼に終わった。

チームメンバがミドルウェアのチューニングを頑張ってくれて最終スコアは4000弱で落ち着きました。

## KPT

- Keep
    - setup.shという名の再起動スクリプトまとめを用意していたので、常に同じ条件でベンチが回せた
- Program
    - ピヨってしまった　場数が足りてない
    - 2時間も同じ問題に悩んでいた
    - アプリ１人はきつかった
- Try
    - 諦めること
Visual Studio Codeでフォントサイズをいい感じにする

Visual Studio Code 0.8.0、Mac環境です。

フォントサイズを変える場合、settings.jsonを変更すればOK

```json:settings.json
{
	"editor.fontSize": 14
}

```

と思いきや、これで変わらないところが結構あります。
わかりやすくフォントサイズを20にして確認してみます。

1. サジェストのリスト
![1-1.png](https://qiita-image-store.s3.amazonaws.com/0/19872/77e08101-9359-2678-43a3-01555bb8c543.png)

1. メソッドとかの情報
![1-2.png](https://qiita-image-store.s3.amazonaws.com/0/19872/b9f5ed04-1c56-a5ad-ea73-60236acbc6ee.png)

1. フォーカスを当てた時の情報
![1-3.png](https://qiita-image-store.s3.amazonaws.com/0/19872/ac0ec151-21ac-67fd-b73b-8bf7dbde608a.png)


この辺りは地味に不便なので、フォントサイズに合わせて変わるようにしたいところです。
こういった細かい部分の変更は、VSCode内のCSSファイル等を直接いじるしかありません。
今回は以下のCSSファイルを変更します。

`/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.css`

変更するのは以下の３箇所です。px直接指定になっているので、%指定に変えてみます。

```css:workbench.main.css

.monaco-editor .typeInfo {
	font-size: 95%;/*13px;*/
}

.monaco-editor .parameter-hints-widget {
	font-size: 90%;/*12px;*/
}

.monaco-editor.mac .suggest-widget {
	font-size: 85%;/*11px;*/
}

```

これで以下のようになりました。

![2-1.png](https://qiita-image-store.s3.amazonaws.com/0/19872/29439e61-2199-a8c5-c250-32e020722c90.png)

![2-2.png](https://qiita-image-store.s3.amazonaws.com/0/19872/450f233b-cd3c-9bb5-4798-2d9415642847.png)

![2-3.png](https://qiita-image-store.s3.amazonaws.com/0/19872/1df77ee6-c3c1-ab0e-fd65-a7dcef1e6fda.png)


だいたい良さそうですが、よく見るとサジェストの２行目が切れてしまっています。
これはフォントサイズを大幅に大きくしなければ、こうなることはないのですが、
**fontFamiry**を変えた場合はデフォルトのフォントサイズでは小さすぎることがあり、
その場合は対策が必要になります。

ここのフォントサイズはCSSではなくJSで直接指定されてしまっているため、そちらを修正する必要が有ります。
`workbench.main.css`と同じディレクトリにある、`workbench.main.js`を修正します。
JSは圧縮されているため見づらいですが、以下が修正する箇所となります。

```js:workbench.main.js
!e.isFocused(n)?19:35
```

35（px）がフォーカスが当たっている行となり、19（px）はそれ以外の行となります。
35pxで切れてしまっているので、50pxくらいにしてみます。
なお、同じコードが２箇所あるので、両方共修正します。

```js:workbench.main.js
!e.isFocused(n)?19:50
```

これで２行目が表示されるようになりました。

![3-1.png](https://qiita-image-store.s3.amazonaws.com/0/19872/05b50d66-d01f-a0a7-fcea-159d9996fade.png)


Visual Studio Codeはまだ0.8.0なので、今後はこういった細かい箇所も改善されていくかもしれません。
今回の方法は完全にバッドノウハウですが、見づらくて困っている方は試してみると良いかもしれません。

なお、「Command + Shift + P」で、コマンドパレットを開いて「Developer: Toggle Developer Tools」を開くと
ChromeでおなじみのDeveloper Toolsが開くため、今回のようにCSSを変えたいような場合は、
そこからクラス名等を調べることができます。


以上
「いずれかのカラムが空でなければ良い」というバリデーション


## 背景

年末も近づいてきて年賀状の送り先を管理しないといけないなぁ、と思ったので、簡易のアドレス帳サービスでも作ってみようとしたわけです。
そこで、連絡先のモデルとして、

```ruby:app/models/contact.rb
class Contact < ActiveRecord::Base
  validates :email, presence: true
  validates :phone, presence: true
end
```

みたいにしたんですね。ここで
> 住所`address` は必須だろう、けれど、メールアドレス `email` や `phone` はどちらかでいい。

という要求が出てきたわけです。

## `if` で`validates` を制御する方法

```ruby:app/models/contact.rb
class Contact < ActiveRecord::Base
  validates :email, presence: true, if: -> { phone.blank? }
  validates :phone, presence: true, if: -> { email.blank? }
end
```

みたいにすれば、それぞれが他方が無い時のみにバリデーションを実施できます。

ですが、これは何を判断しているのかが、ちょっとわかりづらい。。。
そして、両方が空だった時に、`contact.errors` に2つのメッセージが入ってしまい、いずれもが必須入力のように見えてしまいます。

## `validates`の対象になるメソッドを定義する

何言ってるかよくわからないと思うので、コードを載せます。

```ruby:app/models/contact.rb
class Contact < ActiveRecord::Base
  # シンボルで指定する。
  validates :email_or_phone, presence: true
  
  private
    def email_or_phone
      email.presence or phone.presence
    end
end
```

としておくと、`invalid`時のエラーメッセージは1つに集約できます。

国際化についても、

```yaml:config/locales/ja.yml
activerecorde:
  attributes:
    contact:
    　email: メールアドレス
    　phone: 電話番号
      email_or_phone: メールアドレスまたは電話番号
```

とすれば、エラーメッセージもそれっぽく見せられます。

## おわりに

それっぽいgemやtipsを見つけられなかったので、教えてもらえると嬉しいです。
iOS7以上におけるクエリストリングに対するパーセントエンコーディング

# 概要
iOS9・WatchOS2から`CFURLCreateStringByAddingPercentEscapes`はdeprecatedになってしまいました。。。
iOS7から使える`stringByAddingPercentEncodingWithAllowedCharacters`を使ってパーセントエンコーディングしたほうがよさそうです :smile: 

# 対応方法


### For Swift

```swift:code
static func escapeURLString(URLString: String) -> String {
    //Reserved characters defined by RFC 3986
    let genDelims = ":/?#[]@"
    let subDelims = "!$&'()*+,;="
    let reservedCharacters = genDelims + subDelims
    //URLQueryAllowedCharacterSetからRFC 3986で予約されている文字を除いたもののみエスケープしない
    let allowedCharacterSet = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as! NSMutableCharacterSet
    allowedCharacterSet.removeCharactersInString(reservedCharacters)
    return URLString.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacterSet) ?? string
}
```

### For Objective-C

```objc:code
+ ( NSString * _Nonnull )escapeWithURLWithString:( NSString * _Nonnull )URLString
{
    //Reserved characters defined by RFC 3986
    NSString *genDelims = @":/?#[]@";
    NSString *subDelims = @"!$&'()*+,;=";
    NSString *reservedCharacters = [NSString stringWithFormat:@"%@%@",
                                    genDelims,
                                    subDelims];
    //URLQueryAllowedCharacterSetからRFC 3986で予約されている文字を除いたもののみエスケープしない
    NSMutableCharacterSet * allowedCharacterSet = [NSCharacterSet URLQueryAllowedCharacterSet].mutableCopy;
    [allowedCharacterSet removeCharactersInString:reservedCharacters];
    return [URLString stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet] ? : URLString;
    
}
```

`NSCharacterSet`がもつ`URLQueryAllowedCharacterSet`はAppleのドキュメントによると、

> Returns the character set for characters allowed in a query URL component.
The query component of a URL is the component immediately following a question mark (?). For example, in the URL http://www.example.com/index.php?key1=value1#jumpLink, the query component is key1=value1.

とあり、この許可されている文字からRFC 3986で定義されているgenDelims、subDelims(合わせたものが予約文字)を除外したものが、エスケープしなくてよい文字になります。

# 実行例
試しに、`:/?#[]@!$&'()*+,;=あ-_~.` に対してエスケープをかけたところ
`%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%E3%81%82-_~.`と出力されることを確認しました。
`-_~.`はRFC 3986で非予約語として定義されているためエスケープされていなくて正解です :+1: 

# 参考資料
* NSCharacterSet Class Reference
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSCharacterSet_Class/#//apple_ref/occ/clm/NSCharacterSet

* RFC 3986 Internet Engineering Task Force
https://www.ietf.org/rfc/rfc3986.txt- https://www.ietf.org/rfc/rfc3986.txt
rvm 環境下の ruby では softlayer_api が動作しない件

# 問題と対策

原因を追求していませんが、時間を浪費しないために、経験をメモしておきます。
（その後、再現テストを実施しましたが、同環境では動作できませんでした。しかし、フレッシュ・インストールでは、正常に動作しましたので、コメントを参照してください）

rvm は、複数の ruby のバージョンをインストールしておき、コマンドで ruby のバージョンを切替えて使える便利なツールです。　ところが、この環境下で動作する ruby では、バージョンに関係無く softlayer_api が動作しません。 この softlayer_api は、GitHUB の https://github.com/softlayer/softlayer-ruby にある SoftLayerのAPI の ruby のコードで、 gem install softlayer_api でインストールできます。

softlayer_apiを動作させるには、Linuxのリポジトリから導入したrubyを利用する必要があります。


# 問題のエラー内容

rvm の環境下の ruby では、以下の様なエラーが発生して実行できない。

```
$ ./test1.rb
/home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/protocol.rb:158:in `rescue in rbuf_fill': Net::ReadTimeout (Net::ReadTimeout)
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/protocol.rb:152:in `rbuf_fill'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/protocol.rb:134:in `readuntil'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/protocol.rb:144:in `readline'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http/response.rb:39:in `read_status_line'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http/response.rb:28:in `read_new'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:1414:in `block in transport_request'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:1411:in `catch'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:1411:in `transport_request'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:1384:in `request'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:1329:in `request_post'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/xmlrpc/client.rb:482:in `do_rpc'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/xmlrpc/client.rb:286:in `call2'
	from /home/chef/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/xmlrpc/client.rb:267:in `call'
	from /home/chef/.rvm/gems/ruby-2.2.2/gems/softlayer_api-3.1.1/lib/softlayer/Service.rb:267:in `call_softlayer_api_with_params'
	from /home/chef/.rvm/gems/ruby-2.2.2/gems/softlayer_api-3.1.1/lib/softlayer/Service.rb:196:in `method_missing'
	from ./test1.rb:11:in `<main>'
```

この時のruby のパスは以下のとおりです。

```
$ which ruby
/home/chef/.rvm/rubies/ruby-2.2.2/bin/ruby
```




# エラー発生箇所
エラーの発生箇所は、11行目のメソッドをコールしている処で、前述の例外が発生しています。 この状況から例外のメッセージが、正しい問題原因を表しているとは思えないですね。

```lang:ruby
     1	#!/usr/bin/env ruby 
     2	# encoding: utf-8
     3	#
     4	require 'rubygems'
     5	require 'softlayer_api'
     6	
     7	USERNAME = '*********'
     8	API_KEY = '****************************************************************'
     9	
    10	client = SoftLayer::Client.new(username: USERNAME, api_key: API_KEY)
    11	resp = client['Account'].getObject
    12	p resp['firstName']
```

# Linuxディストリビューションの ruby から softlayer_api で実行した場合

Linux ディストリビューションのruby で実行した場合は、以下のとおり正しく動作します。

```
root@ChefSolo:/home/chef/python# which ruby
/usr/bin/ruby
root@ChefSolo:/home/chef/python# ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
$./test1.rb
"Maho"
```

# まとめ
rvm の ruby 環境下では、SoftLayer API の softlayer_apiが動作しない。　対策は、Linux ディストリビューションでインストールする ruby であれば、問題なく実行できる。
MongoDBのメモ

##mongodb
適当なメモです


##用語
| RDBでの呼称 | MongoDBでの呼称 |
|:-----------|:------------|
| database | database |
|table | collection |
|row | document |
|column | field |
|index | index |
|primary key | \_id field |

##install(ubuntu)
項目|コマンド
---|---
インストール | sudo apt-get install mongodb
本体起動| sudo service mongodb start
本体停止| sudo service mongodb stop
確認| mongo
web console | http://127.0.0.1:28017

##usage
項目|コマンド
---|---
ログイン | mongo
ログアウト | exit<br>quit() 
スクリプトの作成| vim ~/.mongo.js

##よく使うの（cli）
項目|値
---|---
db一覧| show dbs
db選択| use {databaseName}
db削除| db.dropDatabase();
コレクション生成| db.createCollection("members");
コレクション表示|  show collections
コレクション殺す| db.members.drop();
コレクション名前変更 |  db.members.renameCollection(“members2″);
ドキュメント挿入| db.members.insert({“name”:”hogefuga”, “email”:”hogefuga@hogefuga.jp”, “age”:”20″});
ドキュメント一覧表示 | db.members.find();
objectIDで検索 | db.scenarios.find({_id: ObjectId("5534adc9fc89eee71e2b1c40")}).pretty();
インデックスの確認|db.members.getIndexes()
その他|mongo hackerを入れると便利|

##BSON形式でバックアップ
```sh
$ # ダンプ(リモート)
$ mongodump  -h host.name.com -d db_name -c collectionname -o dump/
$ # リストア(ローカル)、※bsonと同じ位置にjsonも配置する
$ mongorestore -d db_name -c collectionname collectionname.bson
```

##JSON, CSV形式でバックアップ
```sh
$ # ダンプ(リモート)
$ mongoexport  -h db.hoge.jp \
--db my_production \
--collection hogecollection \
 -o output.json \
--query '{_id: ObjectId("55d6fdb70505e8ae209e1bb0")}'
$ # リストア(ローカル)、※bsonと同じ位置にjsonも配置する
$ mongoimport -d my_development -c hogecollection output.json
```

##Mongoose(method)
| RDB | Mongooseでのメソッド |
|:-----------|:------------|
|スキーマ|コレクションの中のドキュメントのデータ型とデータ構造のこと。 new Mongoose()でスキーマのクラスを作る。|
| create | スキーマのインスタンスを作成してsaveメソッドを叩く |
| update | スキーマのクラスメソッドのupdateのオプションに{update:true}をセットして実行 |
| delete | スキーマのクラスメソッドのremoveメソッドを実行 |
| select  | スキーマのクラスメソッドのfindを実行 |
| sort | スキーマのクラスメソッドのfind実行時のoptionに{ sort: { rate: -1, name: 1 } }を入れる |
| field | find実行時のfieldに{ _id: 1 } 的なのを入れる |
| virtual | スキーマのvirtualクラスメソッドを実行する。ただし、スキーマ自身にも設定をする必要がある。 |
| index | スキーマのクラスメソッドのindexを使う |
|スキーマのcollectionへの登録|mongoose.modelを使かって、コレクション名とスキーマクラスを結ぶ|
|フック処理|Schema.preを書く|

##レプリカセット


##参考文献
http://www.tkd55.net/blog/?p=732
http://gihyo.jp/dev/serial/01/mongodb
Googleのバグ予測アルゴリズムをGitBucket Pluginに実装してみた

バグ予測の新たな指標として、Googleがちょっと前に発表していたアルゴリズムを使って見えるようにしてみた。

以下のサイトを参考にさせていただきました。

* https://github.com/igrigorik/bugspots
* http://google-engtools.blogspot.jp/2011/12/bug-prediction-at-google.html
* http://qiita.com/okappy/items/e5fc62f9026e0d73c3e9

Pluginは、こちら。
https://github.com/yoshiyoshifujii/gitbucket-bugspots-plugin

## 使い方

Pluginを適用していただいたらすぐに使えます。
リポジトリの画面を開いていただくと、下図のサブメニュー位置にリンクが表示されます。

![root_sample.png](https://qiita-image-store.s3.amazonaws.com/0/24050/6460e57f-bb6c-d642-c9d0-7222abb20970.png)

リンクを押下して飛んでいただきますと、バグ予測アルゴリズムをリポジトリに適用して結果が表示されます。

![Bug_Spots.png](https://qiita-image-store.s3.amazonaws.com/0/24050/588a2b76-ea5c-b2e8-4081-baa8c0b67678.png)

アルゴリズムを適用した結果が降順で表示されます。

数値が1.0以上のソースはバグが混入されている可能性が高いため、レビュー時は重点的に見たほうが良いよって程度には使えるかなって思います。

また、テキストボックスに任意の正規表現パターンを記載して `Search` ボタンを押下されますと、過去のコミット内容を指定した内容で走査し、アルゴリズムを適用します。

プロジェクトによって、バグ修正を見分けるコミットコメントのキーワードが異なったりするかと思いますので、ここで調整いただければと思います。

## 今後

Search条件を保存できるようにしても良いかもしれません。

毎回、指定しなおすの面倒ですし。

以上です。
教師なし学習による異常値検知: マハラノビス距離 (理論編)

<b>マハラノビス距離</b>に基づく異常値検知について説明をします．
[実装編はこちら](http://qiita.com/shopetan/items/30f6e0932485c976a946)

これは，教師なし学習により，データのパタンを学習し，このデータから著しく外れたデータを異常値として検出する方法です．
マハラノビス距離とは，統計学で用いられる距離を表す手法の1つです．
似た距離の表す手法として<b>ユークリッド距離</b>がありますね．

# おさらい
まずはじめにユークリッド距離の説明をしておさらいをしたいと思います．
ユークリッド距離とは，いわゆる「一般的」な距離を表す手法です．
ピタゴラスの定理で求められることはご存知だと思います．
簡単に2次元平面で考えると，

```math
{ \displaystyle
p = (p_1,p_2)
}
```
および，

```math
{ \displaystyle
q = (q_1,q_2)
}
```
のとき，それらの距離は

```math
{ \displaystyle
d(p,q) = \sqrt{(p_1 - q_1)^2 + (p_2 - q_2)^2}
}
```

で求められますね．
これが一般的な距離計算の手法です．

# マハラノビス距離
マハラノビス距離は，先程も説明したように，統計学で用いられる距離を表す手法の1つです．
どういうタイミングで用いられるかというと，<b>多次元のデータが相関を持つ場合に使用される</b>機会が多いです．

仮に，データがn次元の連続ベクトルであるとして，得られたデータ列を，

```math
 x^m = x_1,x_2,…x_m
```
(これらは全てベクトルの集合と考えて下さい)として，

i番目のデータは，

```math
{ 
  x_i = \left(
    \begin{array}{c}
      x_i,_1 \\
      x_i,_2 \\
      \vdots \\
      x_i,_n
    \end{array}
  \right)
}
```

と記すとき，その平均値ベクトル

```math
μ
```
，分散共分散行列

```math
\sum_{}
```

は以下のように求められます．

平均値ベクトル

```math
{ 
  μ = \frac{1}{m} \sum_{i=1}^m x_i
}
```

分散共分散行列

```math
\sum_{} = \frac{1}{m}\sum_{i=1}^m (x_i - μ)(x_i - μ)^{\mathrm{T}}
```


そこで，θをしきい値パラメータとして，新しいデータxに対して，

```math
  θ < \sqrt{(x_i - μ) ^{\mathrm{T}}\sum{}^{-1} (x_i - μ) }
```

を満たすならば，xは異常値であると判定します．
この式の右辺がマハラノビス距離と呼ばれるものです．

# もっとマハラノビス距離
ここで，

```math
\sum_{}
```
が単位行列であるときは，ユークリッド距離の2乗が求まります．
<b>対角行列</b>であるときには，次元ごとのスケールが異なります．
<b>非対角行列</b>であるときは，これにさらに回転が加わることになります．

下記に示すのは，2次元ベクトル上でのマハラノビス距離に基づく外れ値検出のイメージ図です．
![20150704155700.png](https://qiita-image-store.s3.amazonaws.com/0/55673/06964005-b6f2-2a00-9140-829bfabd4554.png)


これは，プロットされた点が，データ点であり，そのデータ点を覆うように楕円が表示されています．

この楕円の中に含まれていない点が外れ値になります．
したがって，閾値θは，この楕円の大きさを示すものであり，どの程度許すかによって外れ値の割合が変化してきます．

# ユークリッド距離とマハラノビス距離の違い
![20150704160419.png](https://qiita-image-store.s3.amazonaws.com/0/55673/b6ef7702-0bec-103e-c5e8-4885784fa8a5.png)

この図を見てもらうのが分かりやすいです．
ユークリッド距離とマハラノビス距離の違いは，距離を定義する際に，多次元のデータの相関を考慮しているかいないかという点にあります．
マハラノビス距離において，相関が強い距離の方向とは，実際の距離よりも相対的に短くなるという考え方です．
ユークリッド距離の場合，距離はx軸，y軸ともに等しい距離になります．
しかしマハラノビス距離は，x軸，y軸ともに分散で形が定まっています．
つまり，<b>分散が大きいと，原点からの距離はあまり離れていない</b>と解釈することができますし，
<b>分散が小さいと，原点からの距離は大きく離れている</b>ということになります．

# もう少し詳しくマハラノビス距離
![20150704160726.png](https://qiita-image-store.s3.amazonaws.com/0/55673/f194f646-45ec-6b09-dc2d-03500c24c78f.png)

この図は，原点から楕円が複数にわたって描かれています．
この楕円の大きさが，異常値の閾値の大きさを示しています．
閾値が大きいと楕円が大きく，異常値の割合は少なくなります．

楕円の形は分散によって決まるという話をしましたが，この図を山の等高線のようなイメージで解釈してもらっても結構です．
等高線は，同じ高さにある山の部分をくくっています．
マハラノビス距離も同じです．
軸という概念を考えずに，同じ楕円で囲まれた範囲のものが閾値の値になっているという解釈をすれば，円の歪み方にも納得がいくのではないかと思います．

# マハラノビス距離の問題点
マハラノビス距離による異常値検出の手法では，平均値ベクトルと分数といった基本概念を通じて異常値の概念を定式化しています．
しかし，平均値自身は，異常値の影響を大きくウケるため，中央値の考え方を利用して異常値検出を行う方法も提案されていたりします．(ここでは割愛)

また，個人的に重要なのは，この<b>マハラノビス距離を用いた距離計算手法では，boolean値のみのデータは使えません．</b>
(1 or 0 の平均値から，1 or 0の論理値を引いて… という手法になるので，何が起きるかは考えてみてください…)

# まとめ

+ マハラノビス距離は，距離を一般化したものである．
+ マハラノビス距離は，各次元における相関を考慮した距離である．

次回は実装編ということでpythonで実際に[実装](http://qiita.com/shopetan/items/30f6e0932485c976a946)を行ってみます．
Mac で vim-tags を使うときは最低限 vim_tags_ctags_binary を設定しておけば OK

Mac で vim-tags を使う場合、デフォルトで入っている `/usr/bin/ctags` ではなく、Homebrew でインストールした Exuberant Ctags (`/usr/local/bin/ctags`) を使うようにする必要がある。

その方法をググると、ほぼ `vim_tags_project_tags_command` と、Ruby で Gem のタグも欲しいときはあわせて `vim_tags_gems_tags_command` に Exuberant Ctags を設定するやり方がヒットするけど、(少なくとも今は) `vim_tags_ctags_binary` だけを設定すればよい。

つまり、`.vimrc` なんかに

```vim
let g:vim_tags_ctags_binary='/usr/local/bin/ctags'
```

と書いておけば OK です。
Raspberry Pi 2（略してパイ２）でサーバ監視


# 概要
Raspberry Pi にNagiosをインストールして、インターネットサーバのHTTP監視を行います。

# 経緯
Raspberry Pi で何ができるかを考えていたのですが、一般的な公開サーバとして利用するにはスペックが貧弱で現実的ではないというところから抜け出せず。
それならば、スペックが低くても問題なく、低消費電力で公開サーバとは別インフラが望ましい外部からの監視用途として、HTTP監視を任せられるのではないかと考えました。

# Nagiosのインストール

```bash
$ sudo apt-get install nagios3
```

インストール途中で、Nagios管理画面へのログインパスワードを設定します。

![pi008.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/86e5cfd4-d4d0-88d8-6864-b095536f2b6a.png)

インストールが完了したら、ブラウザからNagios管理画面にアクセスしてみます。

http://raspberrypi.local/nagios3/

認証情報は、nagiosadminユーザととインストール時に設定したパスワードでログインできます。

# NagiosにHTTP監視を設定

サーバ毎の監視設定を行うために、設定ファイルを配置するディレクトリを決定します。

```bash
$ sudo vi /etc/nagios3/nagios.cfg
	#cfg_dir=/etc/nagios3/servers
	cfg_dir=/etc/nagios3/servers

$ sudo mkdir /etc/nagios3/servers
```

サーバ毎の設定ファイルを設定していきます。
ここでは「example.com」のHTTP監視を設定しています。
複数のURLを監視する場合は、同様の設定を追記していきます。

```bash
$ sudo vi /etc/nagios3/servers/my-server.cfg
	# host
	define host{
	    use        generic-host
	    host_name  example.com
	    address    example.com
	}

	# http
	define service{
	    use                     generic-service
	    host_name               example.com
	    service_description     HTTP example.com
	    check_command           check_http
	}
```

設定が完了したらNagiosをリロードして反映します。

```bash
$ sudo service nagios3 reload
```

Nagios管理画面にアクセスすると、追加したHTTP監視項目が表示されているはずです。

![pi010a.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/cbc72a42-2448-b03b-aeed-b8ac55b38198.png)

監視対象のサイトがダウンすると、デフォルト設定でroot宛にメールが送信されるようになっています。
メール送信はmailコマンドを使用するようになっているため、予めmailutilsパッケージをインストールしておく必要があります。

```bash
$ sudo apt-get install mailutils
```

# Raspberry Pi による監視の今後
ここまでの設定では異常検知時にメールを送信するだけですが、Raspberry Pi がサイレンを鳴らしたり、寝ているところを優しく起こしにきてくれたりする日が近いうちに実現する気がします。
deviseで会員登録後に確認メールを送ったあとの送信完了画面を表示させる

## 実装

``` ruby 
class Users::RegistrationsController < Devise::RegistrationsController

  def confirm
  end

  protected

  # The path used after sign up for inactive accounts.
  def after_inactive_sign_up_path_for(resource)
    confirm_users_sign_up_path
    # あとはroutingとviewを作る
  end
end
```

## 大体のことは...
overrideできるのでgithubを読むと良い
[devise/app/controllers/devise/registrations_controller.rb](https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb)
`couldn't understand kern.osversion '14.5.0'` でコンパイルエラーするときの対処法

自分の場合は、nativecodeをコンパイルする必要があるGemをインストールする時に、`couldn't understand kern.osversion '14.5.0'`というコンパイルエラーが発生しました。

```
make "DESTDIR="
compiling binder.cpp
couldn't understand kern.osversion `14.5.0'
cc1plus: error: unrecognized command line option "-Wno-ignored-qualifiers"
cc1plus: error: unrecognized command line option "-Wno-unused-result"
make: *** [binder.o] Error 1
```

グーグル先生に聞いてみてもなかなか答えが見つからずにハマりましたが、解決できたのでメモ。どうやらHomebrewで入ってたgccが原因っぽい。

# 環境情報
- OSX Yosemite 10.10.5
- Xcode 7.0

# Homebrewの `apple-gcc42` をアンインストール
色々探してたら「[xcode - Why does Homebrew report "couldn't understand kern.osversion `14.0.0'"? - Stack Overflow](http://stackoverflow.com/questions/28068383/why-does-homebrew-report-couldnt-understand-kern-osversion-14-0-0)」という記事を発見。Answerのコメントまで読み進みと、こんなコメントが。

> @SandeepM That's an interesting solution. But homebrew should stay out of /usr/bin, so my question would be whether your offending gcc was in /usr/local/bin instead. I guess the homebrew uninstall solution won't work for everyone, but it does show that Apple's gcc42 causes problems after updates. (the Homebrew apple-gcc42 formula says: "This formula contains compilers built from Apple's GCC sources, build 5666.3".) 

確認してみると自分の環境にも`apple-gcc42`を発見したので、アンインストールしてみる。

```
% brew list
apple-gcc42
% brew uninstall apple-gcc42
```

すると、エラー内容が変わった。

```
make "DESTDIR="
compiling binder.cpp
make: g++-4.2: No such file or directory
make: *** [binder.o] Error 1
```

# `g++-4.2`のシンボリックリンクを作成

`brew uninstall`で消えたようなので、xcodeで入っている`g++`へのシンボリックリンクを作成する。

```
%ln -s /usr/bin/g++ /usr/bin/g++-4.2  
```

これで無事にコンパイルが通った！
xubuntu 14.04.2 に VirtualBox と Vagrant をインストールする

[こちら](http://www.olindata.com/blog/2014/07/installing-vagrant-and-virtual-box-ubuntu-1404-lts)を参考にしました。リポジトリの追加は不要で、あっさりaptitudeでインストールできました。

```
$ sudo aptitude install virtualbox
以下の新規パッケージがインストールされます:
  dkms{a} fakeroot{a} libfakeroot{a} libgsoap4{a} libqt4-opengl{a} 
  libvncserver0{a} virtualbox virtualbox-dkms{a} virtualbox-qt{a} 
0 個のパッケージを更新、 9 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
21.7 M バイトのアーカイブを取得する必要があります。 展開後に 87.8 M バイトのディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] 
```

```
$ sudo aptitude install vagrant
以下の新規パッケージがインストールされます:
  bsdtar{a} curl{a} libruby1.9.1{a} libyaml-0-2{a} ruby{a} 
  ruby-childprocess{a} ruby-erubis{a} ruby-ffi{a} ruby-i18n{a} 
  ruby-log4r{a} ruby-net-scp{a} ruby-net-ssh{a} ruby1.9.1{a} vagrant 
0 個のパッケージを更新、 14 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
3,574 k バイトのアーカイブを取得する必要があります。 展開後に 18.2 M バイトのディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] 
```
ビットコインのウォッチ・オンリー(watch-only)ウォレットとは?

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-watch-only-wallet/" title="ビットコインのウォッチ・オンリー(watch-only)ウォレットとは?">ビットコインのウォッチ・オンリー(watch-only)ウォレットとは?</a>
nvmでバージョン管理の備忘録

##nvm

## install
| 項目   |    値      |
|----------|:-------------:|
| 移動 | cd |
| nvmのDL | git clone git://github.com/creationix/nvm.git ~/.nvm |
| ssの実行 | source ~/.nvm/nvm.sh |

##nodeのインスコ
| 項目   |    値      |
|----------|:-------------:|
| バージョン確認 | nvm --version |
| 利用可能なバージョン確認 | nvm ls-remote |
| nodeインストール |  nvm install v0.10.26 |
| nodeの使用 | nvm use v0.10.26 |
| バージョン確認 | node -v  |
| 利用可能なバージョン確認 | node ls  |
| パーミッション | chmod -R 777 .nvm  |
| エイリアス設定 | nvm alias default v0.10.26 default  |
| デフォルト設定 | nvm use default  |

##自動起動設定
| 項目   |    値      |
|----------|:-------------:|
| 移動 | cd |
| プロフ編集 | vim ~/.profile |
| コピペ | 以下のssを末尾についか |

##スクリプト

```
# nvmの設定
if [[ -s ~/.nvm/nvm.sh ]];
  then source ~/.nvm/nvm.sh
fi
```

##テスト
| 項目   |    値      |
|----------|:-------------:|
| 再起動 | shutdown -r now |
| nodeの起動確認 | node -v |
| 移動 | cd |
| ファイルの作成 | vim test.js |
| 編集 | 以下の内容をコピペ |
| 起動確認 | node test.js<br>#ブラウザから確認する |

## テストコード
```
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
```

##参考文献
http://nodejs.org/
よく使うけどよく忘れるコマンド備忘録

##silver shearcher
早いgrep

##インストール
|項目|コマンド|
|---|---|
|ubuntu| sudo apt-get install silversearcher-ag|
|homebrew | brew install ag #error

##コマンド
|項目|コマンド|
|---|---|
|ファイルの内容で検索| ag {word} {folder or file(s)}|
|ファイル名で検索|ag -g {fileName}|
|一致したファイル名のみで検索|ag -l {fileName}|
|一致していないファイル名のみで検索|ag -L {fileName}|
|正規表現を無視|ag -Q {word}|
|特定のファイルのみ検索|ag checkbox_label -G \\.js$|
特定の拡張子を持ち特定のワードを含むファイルの検索 | ag -L google -G \\.less$
|正規表現|ag "require\\( './actions/"|

##オプション
オプション | 意味
:-------:|----------
-a | 無視リストも対象
-u | 隠しファイルおよび無視リストも対象
-g | ファイル名で検索
-G | 検索対象の指定 [ag -G \*.css]
-l | 一致したファイル名のみ表示
-L | 一致していないファイル名のみ表示
-v | 不一致検索
-Q | 正規表現を無視
-z | 圧縮ファイルも対象
-S | 大文字小文字も曖昧に検索

## lsof
プロセスが使用しているポート

```
lsof -i
```

ポート番号から

```
lsof -i:3000
```




##参考文献
http://chaika.hatenablog.com/entry/2015/01/26/161538
http://qiita.com/0829/items/7053b6e3371592e4fbe6
http://hail2u.net/blog/software/ag-capital-g-cli-option.html  
https://qiita.com/sonoshou/items/cc2b740147ba1b8da1f3
Aureliaのskeleton-navigationの備忘録


Aureliaのnavigation-skeleton環境構築でつまづいたの備忘録。

対象バージョンはskeleton-navigation-0.16.2

##手順
[README](https://github.com/aurelia/skeleton-navigation/blob/master/README.md)に沿って行った。
*ただし、この手順では動かず。[Get Started](http://aurelia.io/get-started.html)が一部正しい。

```
# gulp
$ npm install \-g gulp
```

```
# jspm
# READMEの場合
$ npm install \-g jspm
# Get Startedの場合
$ npm install -g jspm@beta
```

実行した時に、READMEのinstallパッケージだと`http://localhost:9000/dist/main`が見つからないって怒られる。
実際、dist配下にmainディレクトリはできていないんだけど。

Get Startedの場合は正常に動作する。

jspmのinstallの後は手順通り・・・
Google Authenticator in Swift

　再現してたら1週間かかったのは秘密。

　なんかすごく時間がないので、詳しいことは来週加筆します。
　本当はもっとマトモなエクステンションにしたかったんです…　しかし時間が…　ｳｸﾞｯ

　挙動確認するときは認証アプリに手動でアカウント登録してくだしあ

``` bridging-header.h
#import <CommonCrypto/CommonHMAC.h>
```

``` main.swift 
import Cocoa

extension NSDate {
    static func google2FA(key: String) -> String {
        func base32decode(k: String) -> [UInt8] {
            func decode(c: CChar) -> UInt8? {
                switch c {
                case 50...55:
                    return UInt8(c - 24)
                case 65...90:
                    return UInt8(c - 65)
                default:
                    return nil
                }
            }
            func convert(raw: ArraySlice<CChar>, result: [UInt8]) -> [UInt8] {
                if let first = raw.first.flatMap(decode) {
                    return convert(raw.dropFirst(), result: result + [first])
                } else {
                    return result
                }
            }
            let nums = k.uppercaseString.cStringUsingEncoding(NSASCIIStringEncoding)
                .map(ArraySlice.init).map { convert($0, result: []) } ?? []
            var bs = [UInt8]()
            var buffer = 0
            var length = 0
            for c in nums {
                buffer = buffer << 5 | numericCast(c)
                length += 5
                if (length >= 8) {
                    bs.append(numericCast(buffer >> (length - 8)))
                    buffer -= (numericCast(bs.last!) << (length - 8))
                    length -= 8
                }
            }
            return bs
        }
        let secret = base32decode(key)
        
        var time = CFSwapInt64HostToBig(UInt64(NSDate().timeIntervalSince1970) / 30)
        var hash = [UInt8](count: numericCast(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
        CCHmac(numericCast(kCCHmacAlgSHA1), secret, secret.count, &time, sizeof(UInt64), &hash)
        
        let offset = Int(hash.last!) & 0xf
        let truncated = hash[offset...offset + 3]
        
        var t = 0
        for n in truncated {
            t = (t << 8) | numericCast(n)
        }
        return String(format: "%06d", (t & (0x7fffffff) ) % 1000000)
    }
}

// 使い方
print(NSDate.google2FA("aaaaaaaaaaaaaaaa"))
```
unity > RS-232C > COMポートのリストアップ

```txt:実装
Unity 5.1.3-f1 on MacOS X 10.8.5
```

その端末にどういうCOMポートが利用可能かのリストアップ

https://msdn.microsoft.com/ja-jp/library/system.io.ports.serialport.getportnames(v=vs.110).aspx

```MainCameraScript.cs
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using UnityEngine.UI;

public class MCscript : MonoBehaviour {

	public Text T_out;
	string s_outtext = "";

	void listAllPorts() {
		string [] ports = SerialPort.GetPortNames ();

		s_outtext = "";
		foreach (string port in ports) {
			s_outtext = s_outtext + System.Environment.NewLine + port;
			Debug.Log (port);
		}
	}

	void Start () {
		listAllPorts ();
	}

	void Update() {
		T_out.text = s_outtext;
	}
	
}
```

上記においてT_out.textへの出力をlistAllPorts()だけで実行するとWindows7実行時に画面に表示されなかった。
Update()内にテキスト出力を追加すると表示されるようになった。


Window7にて実行すると以下のようになった。

![listcoms.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/c06a9981-39f6-e6fa-6602-e66acbe1da74.jpeg)

COM5はUSBシリアルケーブルで追加したポート。

androidスマホでUSBシリアルケーブルを挿した時にCOMポートの表示がされるかの確認はUSBホストケーブルが届いてから。

<hr>
(追記 2015/10/01)
USBホストケーブルが届いたのでandroidスマホ (304SH) にUSBシリアルケーブルを挿してみた。COMポートリストアッププログラムを実行しても何も表示されなかった。

USBシリアルケーブルには電源が行っている(LEDが点灯）しているが、他に何か設定しないといけないのだろうか。

一応、304SHはUSBホスト機能には対応しているようではある。
X11でリモートのXをローカルで起動した時の✍

#x11forwading
macでx11でリモートのxをローカルで表示

#client(mac)
\#| todo
---|---
1| brew cask install xquartz
2| start xquartz
3 | .ssh/configのForwardX11 yesにする

#serverside(ubuntu)
\# | todo
---|---
1 | sudo apt-get install xorg openbox
2 | .ssh/configのX11Forwarding yesにする

#test
\# | todo
---|---
1 | xterm上でssh blogX
2 | sudo user:group ~/.Xauthority <br> sudo chmod 600 ~/.Xauthority
3 | 一旦exit 
4 | xterm上でssh blogXで再起動
5 | xclock

#tips
なお、loginが重くなったり変な場合はXauthorityを削除して再ログインする

#reference
http://www.cyberciti.biz/faq/x11-connection-rejected-because-of-wrong-authentication/
SSHFSの設定の備忘録

#TL;DR
SSHのプロトコル使って、リモートのFSをMacにマウントしたい時のSSHFSの設定の備忘録


##インスコ(ubuntu)
項目|値
---|---
ubuntu|sudo apt-get install sshfs

##インスコ(mac)
項目|値
---|---
brewから|brew install sshfs <br>#URLから入れろとエラー
osxfuseのインストール|http://sourceforge.net/projects/osxfuse/files/ <br> #URLからDLしてinstall
sshfsのインストール|https://github.com/osxfuse/sshfs/downloads <br>  #URLからDLしてinstall
確認|sshfs --version

##sshfsの基本
項目|値
---|---
マウントポイントの作成|mkdir mountpoint
マウント|sshfs [-p port] [user]@[hostname]:[/path/to/dir] mountpoint /local/mountpath/
秘密鍵指 定マウント|sshfs [-p port] [user]@[hostname]:[/path/to/dir] -o IdentityFile=~/.ssh/id_rsa  mountpoint /local/mountpath/
sshのconfigのblogを読み込みマウント | sshfs blog: ~/local/mountpoint
おすすめマウント方法| sshfs blog:  ~/local/mountpoint/ -oauto_cache,reconnect,defer_permissions,noappledouble,negative_vncache,volname=manual #Note: カンマの前に空白はダメ
アンマウント | diskutil unmount mountpoint/

## Vagrantを使う場合
```console
$ cd $project_directory
$ vagrant up # vagrantの立ち上げ
$ vagrant ssh-config >> ~/.ssh/config # sshの設定追加
$ mkdir ./mountpoint # マウントポイント用のフォルダを作成
$ sshfs XXX:/ ./mountpoint/ -oauto_cache,reconnect,noappledouble,negative_vncache,volname=MP
$ # NOTE: 
$ # - 第一引数のXXXはSSHのHOST名で、:/のスラッシュはXXXのルートディレクトリをマウントすることを意味する
$ # - 第二引数の./mountpoint/はマウントするフォルダを指定している
$ # - ルートディレクトリでdefer_permissionsを行なうと応答が帰ってこなくなるので、オプションから除く必要がある
```


##参考文献
http://qiita.com/xxthermidorxx/items/bb148530a55a4e55d99b
http://unix.stackexchange.com/questions/61567/sshfs-specify-key
http://blog.philippklaus.de/2011/07/sshfs-on-mac-os-x-10-6-8-with-fuse4x/
http://superuser.com/questions/549261/on-linux-how-do-i-prevent-the-creation-of-ds-store-files--
http://eddmann.com/posts/mounting-an-osx-ssh-volume-using-fuse-and-sshfs/
https://stackoverflow.com/questions/14870900/how-to-find-the-vagrant-ip
SSHの設定の備忘録（MAC->Ubuntu, Github）

##TL;DR
Mac->UbuntuのSSHの備忘録です。
図書館用に443(HTTPS)も開けています。

##クライアントの設定（Mac）
|項目|コマンド|
|---|---|
|ディレクトリの作成|mkdir ~/.ssh/|
|キーの作成| cd ~/.ssh/ <br> ssh-keygen -t rsa  #パスフレ無し|
|config作成|vim ~/.ssh/config #以下の設定内容を貼り付け|
|パーミッションの変更|sudo chmod -R 700 ~/.ssh/ <br> sudo chmod 600 ~/.ssh/id_rsa |
|公開鍵コピー|cat ~/.ssh/id_rsa.pub  |


##クライアントのconfigの設定内容
```:config
# server
Host blog
    HostName            123.456.789.012
    Port                22 #or 443
    IdentityFile        ~/.ssh/id_rsa
    User                john
    Protocol            2
    ServerAliveInterval 15
    ServerAliveCountMax 10

# gitlab
Host gitlab
    HostName            gitlab.com
    IdentityFile        ~/.ssh/id_rsa
```

##サーバーの設定(Ubuntu)
|項目|コマンド|
|---|---|
|ポート開放|sudo ufw allow 22/tcp|
|ポート開放(HTTPS)|sudo ufw allow 443/tcp|
|Firewallの有効化|sudo ufw enable|
|ディレクトリの作成|mkdir ~/.ssh/|
|ファイルの移動|cd .ssh|
|キーの追加|cat ~/id_rsa.pub >> authorized_keys|
|公開鍵の削除|rm ~/id_rsa.pub|
|パーミッションの変更|sudo chmod -R 700 ~/.ssh/ <br> sudo chmod 600 ~/.ssh/authorized_keys |

##SSHd側で443ポートの追加

|項目|コマンド|
|---|---|
|複数ポートでlisten|sudo  vi /etc/ssh/sshd_config # Port 443を追加する|
|再起動| sudo shutdown -r now|
|開放しているポートの確認| sudo lsof -i -nP # 443でlistenしてればOK |


##テスト（Mac）
|項目|コマンド|
|---|---|
|普通に接続|ssh -i ~/.ssh/id_rsa john@123.456.789.012 
|configで接続|ssh blog|
|設定ファイルを明示的に読み込んで接続|ssh -F ~/.ssh/config blog|
|REMOTE HOST IDENTIFICATION HAS CHANGEDの時|ssh-keygen -R 123.456.789.012 # ホストをknown_hostsファイルから削除|

##テスト(リポジトリ)
|項目|コマンド|
|---|---|
|接続テスト|ssh -T git@github.com
|アップストリームのorigin削除|git remove origin master
|アップストリームのorigin追加| git remote add origin git@github.com:{userName}/{repositoryName}.git |


##関係ないがオレオレ証明書のmemo
```:terminal
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
```

##参考文献
http://runble1.com/ubuntu-config-ssh/
http://superbrothers.hatenablog.com/entry/20090730/1248971671
http://serverfault.com/questions/518729/cygwin-ssh-issue-could-not-resolve-hostname-awshost1-hostname-nor-servname-pro
http://www.unixuser.org/~euske/doc/openssh/jman/ssh_config.html
http://qiita.com/tag1216/items/5d06bad7468f731f590e  
http://d.hatena.ne.jp/ozuma/20130511/1368284304
screenのコマンドの備忘録

#screen
screenの使い方について

##用語
| 項目   |    値      |
|----------|:-------------:|
| プリフィックスコマンド | ctrl + a |
| セッション | 仮想端末を管理する概念 |
| ウィンドウ | 一つの仮想端末のこと |
| ペイン | 分割された仮想端末画面のこと |
| リージョン | 分割された仮想端末画面領域のこと |
| レイアウト | 仮想端末画面領域の区切られ方 |
| アタッチ | セッションがフォアグラウンドで使用中のこと |
| デタッチ | セッションがバッググラウンドで使用中のこと |
| サスペンド | セッションを使用停止にすること |

##セッションの操作
| 項目   |    値      |
|----------|:-------------:|
| セッション開始 | screen |
| セッション一覧 | screen -ls |
| セッションの削除 | screen -r PID |
| セッションのデタッチ | screen -d PID |
| セッションのデタッチ(-dオプションでデタッチ出来ない場合) | ps x &#124; grep pts &#124; grep sshd <br> kill -KILL {PID} <br> # grepが走っていない擬似端末のPIDを切る|
| セッション名をつけてアッタチ | screen -S {セッション名} |
| セッションアタッチ（既にアッタチ済みは無理） | screen -r PID |
| セッション強制アタッチ | screen -d -r PID |
| セッション重複アタッチ | screen -x PID |
| 直前のセッションアタッチ | screen -R |
| 死んだセッションの削除 | screen -wipe |
| セッション一括削除 | screen -r -X quit <br> rm -rf /var/run/screen/S-名前/\* |
| マニュアル | man screen  |

##ウィンドウの操作
| 項目   |    値      |
|----------|:-------------:|
| ウィンドウ一覧取得 | ctrl+a w |
| ウィンドウ作成 | ctrl+a c<br>ctrl+a ctrl+a |
| ウィンドウ切り替え選択 | ctrl+a " |
| ウィンドウ切り替え | ctrl+a {画面番号} |
| 直前のウィンドウ切り替え | ctrl+a ctrl+a |
| 昇順にウィンドウの切り替え | ctrl+a space |
| 前方のウィンドウの切り替え | ctrl+a n |
| 後方のウィンドウの切り替え | ctrl+a p |
| ウィンドウ終了 | exit<br>ctrl+D<br>ctrl+a k  |
| セッションデタッチ | ctrl+a ctrl+d   |
| ウィンドウ全終了 | ctrl+a \ |
| セッションの停止 | ctrl+z |
| ウィンドウの名前変更 | ctrl+a + A |
| ウィンドウの初期化 | ctrl+a + Z |
| ウィンドウinfo表示 | ctrl+a + i |
| ヘルプ | ctrl+a ? |

##コピーモード
| 項目   |    値      |
|----------|:-------------:|
| コピーモードに入る | ctrl+a [ |
| 始点 | space |
| 終点 | space |
| コピーモード終了 | ctrl+a ] |
| バッファからペースト | ctrl+a ] |
| バッファを | ctrl+a ] |
| ペースト | ctrl+a ] |

##リージョン
| 項目   |    値      |
|----------|:-------------:|
| リージョンの横分割 | ctrl+a S |
| リージョンの縦分割 | ctrl+a | |
| リージョンの移動 | ctrl+a tab |
| 現在のリージョンの削除 | ctrl+a X |
| リージョンの削除 | ctrl+a x |
| リージョンを広げる | ctrl+a + |
| リージョンを狭める | ctrl+a - |
| カレントリージョン以外を一括削除 | ctrl+a Q |

##その他
| 項目   |    値      |
|----------|:-------------:|
| バージョン情報 | ctrl+a v |
| 時刻情報 | ctrl+a v |
| .screenrcの再読み込み | ctrl+a : source $HOME/.screenrc |





##参考文献
http://linuxjm.sourceforge.jp/html/GNU_screen/man1/screen.1.html
http://www.limy.org/program/screen.html
http://www.m-bsys.com/knowledge/linux-screen
http://note.crohaco.net/2015/gnu-screen-study/
http://www.akionux.net/wiki/index.php/screen%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%82%92%E4%BE%BF%E5%88%A9%E3%81%AB%E4%BD%BF%E3%81%86
http://www.ayu.ics.keio.ac.jp/~mukai/tips/screen.html
http://www.gnu.org/software/screen/manual/screen.html
http://netmark.jp/2011/12/gnu-screen-plusone.html
http://www.akionux.net/wiki/index.php/screenコマンドでターミナルを便利に使う#.E3.82.BB.E3.83.83.E3.82.B7.E3.83.A7.E3.83.B3.E3.82.92.E5.86.8D.E8.B5.B7.E5.8B.95.E3.81.97.E3.81.A6.E3.82.82.E5.89.8A.E9.99.A4.E3.81.95.E3.82.8C.E3.81.AA.E3.81.84.E3.82.88.E3.81.86.E3.81.AB.E3.81.99.E3.82.8B
JavaScript再入門~関数~

# 関数定義
まずは基本的なJavaScriptの関数の書き方は下記のような感じです。
'Hello'という関数を定義しています。

```javascript
function hello(name) {
    return "hello " + name;
}
var greet = hello("Tom");
console.log(greet);

// 出力
// hello Tom
```
nameをhello関数に渡すことによって、「hello name」という
文字列を返してくれます。

# ローカル変数
関数の中で定義された関数をローカル変数と言います。

```javascript
function hello() {
    var msg = "hello"; // ローカル変数
    console.log(msg); // 出力　「hello」
}
console.log(msg); // エラー
```

ローカル変数は関数の中でのみ有効なので、
関数外から呼ぶとエラーになります。


# 無名関数（匿名関数）
関数名を省略して変数に式を代入するやり方を無名関数or匿名関数といいます。

```javascript
var hello = function(name) {
    var msg = "hello " + name;
    return msg;
}; // ←[;]のつけ忘れに注意
var greet = hello("Tom");
console.log(greet);

// 出力
// hello Tom
```

呼び出し方、引数の付け方、結果は一番最初の関数と同じです。


# 即時関数
関数を定義してからすぐ呼び出せるのが即時関数です。
下記のように関数名を省略して、宣言直後に()をつけます。

```javascript
(function(name) {
    console.log("hello " + name);
})("Tom");

// 出力
// hello Tom
```

このコードの結果は今までと同じです。
この即時関数は自分が書いたプログラムの変数を、他の人のプログラムから影響を受けたり他の人の変数に影響を与えたりしないローカル変数にするためにもよく使われます。 

```javascript
(function() {
    var x = 10,
        y = 20;
    console.log(x + y);
})();

// 出力
// 30
```

このように使うことで、xとyを他のコードを気にせず安心して使うことができます。


参考：[http://dotinstall.com/lessons/basic_javascript_v2](http://dotinstall.com/lessons/basic_javascript_v2)
Moshの設定の覚書

##Moshとは何か
Macでスリープしてもセッションが切れないssh

##クライアント側
項目|コマンド
---|---
mac(client) | brew install mobile-shell

##サーバー側の設定
項目|コマンド
---|---
ubuntu (server)| sudo apt-get install mosh
接続ポートの解放|sudo ufw allow 60000:61000/udp

##Firewall設定
項目|コマンド
---|---
NSGの受信セキュリティ設定| 任意/60000-61000 allow


##Usage
項目|コマンド
---|---
接続| mosh blog #.ssh/configを読み込んでくれる

##セッションの切り方
項目|コマンド
---|---
コネクションの終了 | kill 21143 <br># 以下のようなセッション重複のメッセージがでた時は不要なセッションを切断する
全てのMoshコネクションの切断 | kill \`pidof mosh-server\`

```:terminal
Mosh: You have 2 detached Mosh sessions on this server, with PIDs:
        - mosh [21143]
        - mosh [26325]
```



##参考文献
http://gihyo.jp/admin/serial/01/ubuntu-recipe/0220
http://qiita.com/Vit-Symty/items/5be5326c9db9de755184
https://mosh.mit.edu/#usage
http://stackoverflow.com/questions/17857733/how-do-i-reattach-to-a-detached-mosh-session
SupportLibrary23.0.1のPreferenceFragmentCompatを試して死んだメモ

[[Android]SupportLibrary v23から追加されたPreferenceFragmentCompatを使ってみる - Qiita](http://qiita.com/wasnot/items/dfc33bb91f64abfec04c) を参考に PreferenceFragmentCompat を使ってみたときのメモ。

# PreferenceFragmentCompat を使ってみた

元々は 
[Android - appcompat 21+でPreferenceActivityを実現する方法 - Qiita](http://qiita.com/takke/items/27fe849e18b9890790c9) 
に書いていた [Machinarius/PreferenceFragment-Compat](https://github.com/Machinarius/PreferenceFragment-Compat) を使う方式を卒業して SupportLibrary 版を使いたいという思いから。

```android.support.v7.preference.PreferenceFragmentCompat``` を試してみたところ、下記のような感じでデザインが崩れまくった。

<img src="https://qiita-image-store.s3.amazonaws.com/0/39221/48c9cd21-101b-eac2-488b-610d1411d18a.png" width="300" /> ⇒ <img src="https://qiita-image-store.s3.amazonaws.com/0/39221/f14ad570-db48-b4d6-2456-788754c72354.png" width="300" />

例によって StackOverflow と Issue Tracker に載っていた。

- [android - PreferenceFragmentCompat requires preferenceTheme to be set - Stack Overflow](http://stackoverflow.com/questions/32070670/preferencefragmentcompat-requires-preferencetheme-to-be-set)
- [Issue 183376 - android - preference-v7 support lib design bug - Android Open Source Project - Issue Tracker - Google Project Hosting](https://code.google.com/p/android/issues/detail?id=183376)

ので workaround を適用しようと思ったけど、

>v7のPreferenceFragmentCompatを使っていてもとにかくv14版もgradleに書いて「PreferenceThemeOverlay.v14.Material」のstyleを適用すればだいぶマシになるけどアクセントカラーのミスとかBoldがItalicになるバグとか某背景色のミスとかあるんでそれらも修正しとけよ

とか書いてあったので諦めて 23.0.2 を待つことにしました。


# 参考

- [Issue 183258 - android - No documentation about preferenceTheme requirements w/ PreferenceFragmentCompat - Android Open Source Project - Issue Tracker - Google Project Hosting](https://code.google.com/p/android/issues/detail?id=183258&can=1&q=preference&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars)

# ちなみに ```android.preference.PreferenceFragment``` を使おうとしたところ

```AppCompatActivity``` と ```android.preference.PreferenceFragment``` を組み合わせてみたところ、そもそも getSupportFragmentManager() と getFragmentManager() の違いがあるので Fragment の管理が不整合状態になってしまい back で戻ったりできませんでした(おしまい)
csharp > 名前付き引数渡し > func1(y:1, x:2); > キーワード引数

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら

> ...引数は、「パラメータ名: 値」というように書くことで、任意の順番で値を渡すことができます。この場合、任意の場所の引数を省略できます。

http://ideone.com/8u4iCN

```csharp
using System;

public class Test
{
	public static void Main()
	{
		func1(1,2);
		func1(y:1, x:2);
		func1(y:4);
	}
	static void func1(int x=3, int y=1) {
		Console.WriteLine("x={0} y={1}", x, y);
	}
}
```

```txt:結果
Success	time: 0.04 memory: 23992 signal:0
x=1 y=2
x=2 y=1
x=3 y=4
```

func1()の三番目の呼び出しではxの値はdefault値(int x=3)が使われる。

default引数の使用はコードリーディングがしにくくなるので個人的には使わない。また、禁止しているコーディングルールもある。
そうなると、名前付き引数渡しの用途は以下だろうか。

- 引数の指定順序を変更可能
- 引数の名前を明確化

上記の二番目はReadable Codeなどで推奨している
`func1(/* x= */1, /* y= */2)`
という書き方を
`func1(x:1, y:2)`
で書けるということなのだろう。

以前、自分の記事に対して、Fortran90か95で名前付き引数の使い方をコメントいただいたが、検索しても出てこない。。。

RubyやFortranでは「キーワード引数」という用語のようだ。
csharp > パラメータ配列 > 可変(個の)引数を扱う

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら

> C#では、いわゆる可変引数を、パラメータ配列という仕組みを使って実現します。

http://ideone.com/6SBxFh

```csharp
using System;

public class Test
{
	public static void Main()
	{
		func1(1,2,3);
		func1(new[] { 1, 2, 3});
	}
	static void func1(params object[] p)
	{
		Console.WriteLine("number of parameters is {0}", p.Length);
	}
}
```

```txt:結果
Success	time: 0.04 memory: 23968 signal:0
number of parameters is 3
number of parameters is 1
```

本によるとfunc1()の２つの実行は同じ意味、ということだが、実行結果ではp.Lengthが異なって返っている。
Sakura VPSにubuntuインスコした時の覚書


##ubuntuの設定
前提としてさくらVPSと契約済み
##VPSの設定
サーバー情報->カスタムOSのインストール->ubuntu 14.04 AMD64  
VNCコントロールを起動  

## コマンドライン操作
| 項目   |    値      |
|----------|:-------------:|
| install |  installを押下 |
| 言語とキーボード | 日本語 |
| IP ADDR | IPv4のアドレスを参照 |
| Netmask | IPv4のネットマスクを参照 |
| gateway | IPv4のゲートウェイを参照 |
| Name Server ADDR | IPv4のプライマリDNSを参照 |
| User Name | you |
| Account Name | you |
| passwd | *** |
| home directory encrypt | no |
| unmount partition | yes |
| unmounting partitions do | yes |
| partitioning method | use entire disk |
| Partition Disk | virtual disk 1 |
| write the change disk | yes |

##日本語
| 項目   |    値      |
|----------|:-------------:|
| 日本語設定 | aptitude -y install language-spack-ja-base language-pack-ja |
| 日本語設定 | update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja" |
| 日本語設定 | source /etc/default/locale |
| フォルダ名は英語に | env LANGUAGE=C LC_MESSAGES=C xdg-user-dirs-gtk-update |


##参考文献
http://qiita.com/takehiro_t59/items/94130e8fc6ea50743a73
Raspberry Pi 2（略してパイ２）でLAMP


# 概要
Raspberry Pi 2でLAMP環境を構築します。

# Apacheのインストール

apache2.2系をインストールする場合はapache2パッケージをインストールします。

```bash
$ sudo apt-get install apache2
```

インストール完了後にバージョンを確認しておきます。
ブラウザからアクセスすれば「It works!」が表示されればOKです。

```bash
$ sudo apache2ctl -V
	Server version: Apache/2.2.22 (Debian)
	Server built:   Aug 18 2015 16:29:10
	Server's Module Magic Number: 20051115:30
	Server loaded:  APR 1.4.6, APR-Util 1.4.1
	Compiled using: APR 1.4.6, APR-Util 1.4.1
	Architecture:   32-bit
	Server MPM:     Worker
	  threaded:     yes (fixed thread count)
	    forked:     yes (variable process count)
	Server compiled with....
	 -D APACHE_MPM_DIR="server/mpm/worker"
	 -D APR_HAS_SENDFILE
	 -D APR_HAS_MMAP
	 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
	 -D APR_USE_SYSVSEM_SERIALIZE
	 -D APR_USE_PTHREAD_SERIALIZE
	 -D APR_HAS_OTHER_CHILD
	 -D AP_HAVE_RELIABLE_PIPED_LOGS
	 -D DYNAMIC_MODULE_LIMIT=128
	 -D HTTPD_ROOT="/etc/apache2"
	 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
	 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
	 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
	 -D DEFAULT_ERRORLOG="logs/error_log"
	 -D AP_TYPES_CONFIG_FILE="mime.types"
	 -D SERVER_CONFIG_FILE="apache2.conf"
```

# MySQLのインストール

mysql5.5系をインストールする場合はmysql-serverパッケージをインストールします。

```bash
$ sudo apt-get install mysql-server
```

mysqlコマンドで接続確認を行います。
つながればOKでしょう。

```bash
$ mysql -u root -h localhost -p
	Welcome to the MySQL monitor.  Commands end with ; or \g.
	Your MySQL connection id is 43
	Server version: 5.5.44-0+deb7u1 (Debian)

	Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

	Oracle is a registered trademark of Oracle Corporation and/or its
	affiliates. Other names may be trademarks of their respective
	owners.

	Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

	mysql> show databases;
	+--------------------+
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	+--------------------+
	3 rows in set (0.00 sec)

	mysql> quit
	Bye
```

# PHPのインストール

php5.4系をインストールする場合はphp5パッケージをインストールします。

```bash
$ sudo apt-get install php5
```

インストールが完了したらコマンドからバージョンを確認しておきましょう。

```bash
$ php -v
	PHP 5.4.45-0+deb7u1 (cli) (built: Sep 13 2015 17:25:45)
	Copyright (c) 1997-2014 The PHP Group
	Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
```

PHPからMySQLが扱えるようにphp5-mysqlパッケージもインストールしておきます。

```bash
$ sudo apt-get install php5-mysql
```

最後にテスト用のPHPプログラムを配置して最終確認を行います。
デフォルトのドキュメントルートは「/var/www/」になっているため、そこにtest.phpを作成します。

```bash
$ sudo vi /var/www/test.php
```

```php
<?php
    phpinfo();
```

ブラウザからアクセスすれば、phpinfoが表示されるはずです。
内容を確認し問題なければ完了です。

最後に、確認用に作成したtest.phpは削除しておきましょう。
これが公開されたままになっているサイトを見かけますが、バージョン情報等がバレてしまうため、セキュリティ的にまずいです。

```bash
$ sudo rm /var/www/test.php
```