OmniAICreator/Qiita-1.07M huggingface dataset:
New Relic APM: 新しくなったエラー管理

Advent Calendar 18 日目は、New Relic APMの エラー管理機能について書きたいと思います。

New Relic は、アプリで発生したエラー(例外)を収集し、そのためのビューを提供しています。弊社では別にエラー管理ツールとして、`Honeybadger` を利用しています。類似サービスだと思ってもらえると分かりやすいかもしれません。

気づいている方も多いとは思いますが、エラー管理機能は、12/1 くらいに今までの APM の Events メニューの "Errors" とは別に、"Error analytics" メニューが増えています。これは、"Errors"のかわりになる新機能です。ここではそちらの新機能の説明をしていきます。

![apm_menu.png](https://qiita-image-store.s3.amazonaws.com/0/46003/efa4a4ea-b5d6-9399-c548-66cff1000fc6.png)


旧エラー管理（"Errors"）は、今度の4月に廃止する旨が、エラーページやドキュメントに記載されています。特に問題ないと思うので、今から新しい画面を使えばいいと思います。

ただし、いくか注意点があります。まず、.NET は2015年12月18日現在は、まだ使えないということです。そして、他のエージェントの場合も、対応したバージョンを使う必要があるとのこです。

# 対応エージェントバージョン
- Java: 3.21.0 以上 (3.21.0 は、2015/10/1 リリース)
- Ruby: 3.14.0.305 以上 (3.14.0.305 は、2015/10/19 リリース)
- PHP: 5.1.130 以上 (5.1.130 は、2015/11/17 リリース)
- Python: 2.58.0.43 以上 (2.58.0.43 は、2015/11/16 リリース)
- Node.js: 1.24.0 以上 (1.24.0 は、2015/11/18 リリース)

古いバージョンをお使いの方はこの機会に最新版にアップデートしてください。

# 画面

新しい画面の特徴は、ずばりフィルターです。どんどん条件を追加していき、エラーを簡単に絞り込んでいけます。それでは、新しくなった画面をみていきたいと思います。

左メニュー "Error analytics" を選択すると以下の画面が表示されます。

![apm_error.png](https://qiita-image-store.s3.amazonaws.com/0/46003/9b2b6649-d859-5679-bac0-e641969456cb.png)

ここでは、すでにエラークラス名で絞りまれた状態です。画面左のフィルターの箇所にある "< Back to groupings list" をクリックするとフィルターが掛かっていない状態に戻ります。

エラークラスの発生回数の多い順に表示されます。右のメインのグラフでは、クラス名の時系列グラフで、その下のグラフは、エラーの多いトランザクションTOP5の時系列グラフです。この並び順は、選択項目になっており、以下の項目が選べます。

![sort](https://qiita-image-store.s3.amazonaws.com/0/46003/cb969e3f-bb62-485b-9d0d-60751665be50.png)

次に、さらに下にあるエラークラス別の発生頻度の色のついたマスをクリックします。

![apm_error_2.png](https://qiita-image-store.s3.amazonaws.com/0/46003/8caabfdd-1a08-bfb9-9cb6-fd9d92cceecc.png)

マスの時間帯に発生したエラー一覧が表示されます。さらに、その中の１つをクリックします。

![apm_error_3.png](https://qiita-image-store.s3.amazonaws.com/0/46003/c74a0bea-48b9-b7d6-fb37-75c7e4ebe40b.png)

選択したエラーの詳細情報を確認できます。ここでは、かなり詳細なエラー情報がわかります。

また、新エラー画面は、フィルターが特徴と上でも述べました。絞り込んで行った結果の例が以下です。

![apm_error_4.png](https://qiita-image-store.s3.amazonaws.com/0/46003/ab3c1a56-c845-be7e-52b0-88651e2ff06d.png)

絞り込み条件の欄で、どんどん条件を追加できます。追加された条件は、紫のボックスで画面上に追加されていきます。これにより、簡単にエラーを絞り込んでいけます。

## 注意点

このようにエラーを絞り込めるのは、直近8日間のみとなります。8日より前の日付でこの画面にアクセスすると以下のように表示されます。

![apm_error_6.png](https://qiita-image-store.s3.amazonaws.com/0/46003/b92d7cb6-6c18-342c-f2d5-213cb8e31cdb.png)


# さいごに

どうでしたでしょうか？New Relic はエラー管理自体そこそこちゃんとしているので、エラー履歴を管理する必要がないのであれば、これだけでも十分かなという気も最近しています。スタックトレースもみれるので。

New Relic のブログでも、「[Advanced Error Analytics for New Relic APM Goes GA](https://blog.newrelic.com/2015/12/02/apm-error-analytics-ga/)」この新機能について紹介されていますので、そちらも参考にしてみてください。
AntでOutOfMemoryが出た件

Windowsコントロールパネル上でAntをしたところ、
OutOfMemoryが出てコンパイルに失敗したのでその時のメモ。

Windowsの環境変数でant実行時のJVMヒープサイズを大きくした所、
正常にantが完了した。

> 変数名: ANT_OPTS
変数値: -Xmx256m

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/106019/0387e4f6-2fe0-03f5-f28d-cd6361efad19.png)
Pukiwikiの「？」(はてな)がキライ

# Pukiwikiの「？」(はてな)を表示しないように

なんか英字にするとよく「？」が付くな思ってたんですが・・・
```
AbCd? ← 末尾に勝手につく「？」
```
これは大文字と小文字のアルファベットが混じった単語に付くそうです。

で、まあこいつがウザイので外したいなって思ったら意外と簡単でした。

```pukiwiki.ini.php
- // $nowikiname = 0;
+ $nowikiname = 1;  // 1に変更
```
Pukiwikiのインストールされてるフォルダなので、
おそらく
 /var/www/html/pukiwiki
以下にこのファイルがあるはずです。
phpなのでコンパイルとかもいらず、
書き換えてリロードしたら「？」は消えていると思います。
IEで最近のgoogle maps APIが上手く動かないとき

# 注意

2015年12月18日時点の情報です。あなたがこれを読んでいる頃には既にmaps APIの変更がexperimentalからリリースに反映されてるかも知れません。

# まずは

IE6,7,8あたりはサポートが終わるので捨てる(投げやり)

# APIのバージョンを指定する

[この辺](http://stackoverflow.com/questions/33974901/google-maps-script-error-in-onion-js)が解決のヒントになります。
google maps APIを読み込んでいる部分で、最近のexperimentalを読み込んでやります。

```html
<script src="http://maps.google.co.jp/maps/api/js?v=3.exp&key=XXXXXX" type="text/javascript" charset="utf-8"></script>
```

こんな感じ。

他にも原因あるかもですが、とりあえず私はこれで直りました。
Google ドキュメントでチェックリスト（的なものを）を使う

githubやEvernoteで使われているチェックリスト（チェックボックスが箇条書きであるやつ）を Google ドキュメントで使いたい場合、記号や絵文字（✅とか☑︎とか✔︎）を使うやり方も考えられますが、箇条書きにするなら以下の方法が紹介されています。

## 方法

1. 箇条書きの行頭記号を四角にする<br /><img width="157" alt="list1.png" src="https://qiita-image-store.s3.amazonaws.com/0/42210/3bd9a796-3f5c-fa73-ad01-bf87876d7711.png">
2. チェックしたい行の記号を選択し右クリックする<br /><img width="291" alt="list2.png" src="https://qiita-image-store.s3.amazonaws.com/0/42210/f2fea7bb-de14-a06b-8260-dd736a23b926.png">
3. 右下の「✔︎（チェック）」を選択すると、行頭記号が✔︎になる<br /><img width="165" alt="list3.png" src="https://qiita-image-store.s3.amazonaws.com/0/42210/7d8b5b69-3a1a-aea8-f6e9-2fe9a1be3032.png">

## 出典

[How to insert check box in google docs.. - Google プロダクト フォーラム](https://productforums.google.com/forum/#!topic/docs/IaMq7VqVIy8)
Google SpreadsheetでURLからタイトルに変換

URLからタイトルを取得するのはURLFetchAppを使うことで簡単に実現できる。
Spreadsheetでハイパーリンクとしたい場合も標準関数と組み合わせることで簡単に実現できる。

# GoogleAppsScriptの関数

```js
function URLtoTitle(url) {
  var response = UrlFetchApp.fetch(url);
  
  var myRegexp = /<title>([\s\S]*?)<\/title>/i;
  var match = myRegexp.exec(response.getContentText());
  var title = match[1];

  title = title.replace(/(^\s+)|(\s+$)/g, "");
  return(title);
}
```
#Google Spreadsheet内の利用

```
=URLtoTitle(セル)
```

## 利用例
![スクリーンショット 2015-12-18 11.55.22.png](https://qiita-image-store.s3.amazonaws.com/0/33915/09473c7f-48bc-9876-f30a-23b9464a6e54.png)
![スクリーンショット 2015-12-18 11.55.04.png](https://qiita-image-store.s3.amazonaws.com/0/33915/2fe70065-17e2-3d45-f438-040b82a553b8.png)

# アンカー（ハイパーリンク）を付加する場合
Google Spreadsheetのセルで以下のように標準HYPERLINK関数と組み合わせる。

```
=HYPERLINK(セル, URLtoTitle(セル))
```

##利用例

![スクリーンショット 2015-12-18 11.59.15.png](https://qiita-image-store.s3.amazonaws.com/0/33915/55dc2a6c-c06d-6f8c-6bab-8878976da18f.png)
![スクリーンショット 2015-12-18 11.59.27.png](https://qiita-image-store.s3.amazonaws.com/0/33915/83d21740-149e-8684-55fd-a62106bebb55.png)

# Markdown形式のアンカー（ハイパーリンク）記述にする場合
Google Spreadsheetのセルで以下のように標準のCONCATENATE関数と組み合わせる。

```
=CONCATENATE("[", URLtoTitle(セル), "](", セル, ")")
```

##利用例
![スクリーンショット 2015-12-18 19.43.52.png](https://qiita-image-store.s3.amazonaws.com/0/33915/a11f8b9f-1ff4-743f-d15f-9057743aa6a0.png)
![スクリーンショット 2015-12-18 19.44.15.png](https://qiita-image-store.s3.amazonaws.com/0/33915/3bf5cd36-6bb1-9cad-e1cd-78bcc4485bb3.png)
AWS PHPでS3のファイルを有効期限付きでアクセスできるようにする 

PHPでS3にあるオブジェクトを有効期限付きでアクセスできるようなURLを発行する方法です。

```php
		$config = array(
				"key"		=> "KEY_XXXX"
			,	"secret"	=> "SECRET_XXXX"
			,	"region"	=> "ap-northeast-1"
		);
		$s3 	= S3Client::factory($config);
		$url	= $s3->getObjectUrl($bucket, $name , "10 minutes");
		echo $url;

```
Warning (with-editor): Cannot determine a suitable Emacsclient への対処

### 問題
　magit バージョン 2 に移行してから、起動する度に下のメッセージが出るようになってしまった。環境は MacOS X Yosemite で emacs は homebrew からインストールしている。

```
Warning (with-editor): Cannot determine a suitable Emacsclient

Determining an Emacsclient executable suitable for the
current Emacs instance failed.  For more information
please see https://github.com/magit/magit/wiki/Emacsclient.
```

### 原因
　homebrew でビルドした emacs を `/Applications/Emacs.app` にコピーしているのが良くなかった。なぜそんなことをしていたのかというと spotlight に emacs を見つけさせるため。

### 対処
　下記のコマンドによって、コピーしていたファイルを削除し、シンボリックリンクと置き換える。今回の対処後も spotlight は変わらず動いていた。一度インデックスができると消えないのか、あるいは spotlight の仕様が変わったのかもしれない。

```
rm -r /Applications/Emacs.app/
brew linkapps emacs
```

### 参考
　github の issue <https://github.com/magit/magit/issues/2318>
AWS PHPからS3にJsonをアップロード

PHPでS3にJsonをアップロードした時のメモ。
S3にアップロードするとContentTypeがapplication/octet-streamになってしまってたのでその対処方法です。Putする時にパラメータを付与するだけ！
試してないけどStorageClassやMetadataも入れれると思います。

```php
		$bucket		= "testbucket";
		$tmpfile	= "/tmp/aaaaa.json";
		$key 	= basename($tmpfile);

		$config = array(
				"key"		=> "KEY_XXXX"
			,	"secret"	=> "SECRET_XXXX"
			,	"region"	=> "ap-northeast-1"
		);
		$s3 	= S3Client::factory($config);
		if($s3->doesObjectExist($bucket,$key)) {
			$s3->deleteObject(array("Bucket"	=> $bucket,"Key"	=> $key));
		}
		$rParams				= array(
			'Bucket'		=> $bucket
		,	'Key'			=> $key
		,	'ACL'			=> CannedAcl::PRIVATE_ACCESS
		,	'ContentType'	=> 'application/json; charset=utf-8'
		);
		$result = $s3->putObject($rParams);
		$url	= $result['ObjectURL'];
		echo $url;
```
現役女子大生がmyThingsとMESHで世界初を作ってみた。

*この記事はmyThings advent calender2015の12/18分の記事です。


#[ConnectlyLab.](http://www.connectly.net/)に[MESH](https://first-flight.sony.com/pj/4/MESH%20-%20%E8%AA%B0%E3%81%A7%E3%82%82%E7%99%BA%E6%98%8E%E5%AE%B6%E3%81%AB%E3%81%AA%E3%82%8C%E3%82%8BDIY%E3%82%AD%E3%83%83%E3%83%88)がやってきた！

こんにちは！リノベるでインターンをしている高橋です。
MESH全7種類がConnectlylabへやってきました。一気にConnectlylabが賑やかになりました！
[こちら](http://www.connectly.net/)からユーザー登録をすると誰でもご自由にMESHをはじめ、connectlylabに設置されているデバイスや、他の方が作成したアプリなどを使うことができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/104464/4b3946d1-d09e-3f2f-3775-8c95ecd60ccd.png)

##MESHと[myThing](http://mythings.yahoo.co.jp/)をつなげてみた

今回は、ポストに人感センサーのMESHを設置し、郵便物がポストに投函にされるとMESHのセンサーが反応してGmailに通知がきて、myThings経由でBOCCOが「郵便物が届いたよ！」と知らせてくれる世界初のシステムを作りました。

こんな感じです。
![スクリーンショット 2015-12-11 12.01.01.png](https://qiita-image-store.s3.amazonaws.com/0/104464/18734591-6d98-92cb-5ec2-d2a3a7d1a614.png)

#人感センサーが反応したらGmailが届く
MESHのアプリ上ににGmailの拡張タグをドラッグ＆ドロップします。
次に、人感センサーとGmail拡張タグを繋ぎます。(繋がったときの音が好きです)
![IMG_0057.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/26c9aff6-fe35-9053-eb94-b8794c97f9a6.png)



Gmailタグをクリックすると送信先と件名を打ち込めるので書きます。
送信先と件名に「郵便物が届いたよ！」と記入したらおっけいです。
![IMG_0046.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/c7e40a42-8e47-2da6-8518-ba9e8b24006a.png)


これでMESHでの作業はおしまいです。

#my Thingsを経由してGmailが届いたら[BOCCO](http://www.ux-xu.com/product/bocco)がしゃべる
早速、myThingsを使っていきましょう！
新しくファイルを開き、「トリガーを追加してください」をクリック！
![IMG_0048.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/686fa245-041e-a4d3-2cc5-4802d4ba7259.png)
<br>

Gmailのアイコンを選択します。(MESHからGmailを受け取ります)
![IMG_0049.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/1a30948a-0542-d8bf-4eb9-c38cc314dc44.png)
<br>

次にトリガーの選択をします。
「特定の誰かからメールを受信したら」を選択します。
![IMG_0050.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/165a9550-af10-8f39-df30-4a98a2de2eb7.png)

トリガーの詳細設定で先ほど使ったメールアドレスを入力します。
![IMG_0051.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/73db70b2-9ee8-33a8-63e2-65e8b2c726b0.png)



<br>
次に「アクションを追加してください」を選択します。

![IMG_0052.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/a0163c17-fd0c-365e-1dea-24991adb0977.png)

<br>
チャンネルの選択でBOCCOを選択します。
![IMG_0053.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/5d4d5c06-3607-56dc-e9b7-0c591e89a3f0.png)

<br>
アクション設定でBOCCOを選択し、メッセージ内容を記入。ここは{{件名}}にしておきましょう。
![IMG_0055.PNG](https://qiita-image-store.s3.amazonaws.com/0/104464/3101ab05-97e6-d4b4-570c-c40fa9c49775.png)

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/z-dBDxab9yE/0.jpg)](http://www.youtube.com/watch?v=z-dBDxab9yE) プレビュー

〜 １５分後 〜
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/3gn1Y86h0BM/0.jpg)](http://www.youtube.com/watch?v=3gn1Y86h0BM) プレビュー
**これで世界初のシステムの完成です♩**


# 最後に
今プログラミングを猛勉強中なのですが、わからないことが沢山で幾度となくmacを破壊したくなる衝動に駆られます。そんな私ですが、MESHやmyThingsを使ったことで２つの発見がありました。
１つ目は**プログラムを書いてないのにプログラミングした気分になれる**ということ。２つ目は、もっとこんながことしたい欲が湧いてきて、そのためにはプログラミングが必要なので**プログラミング頑張るぞという気持ちが生まれる**ということです。
myThingsとMESHを触ってプログラミング始めたい！もっと勉強したい！って思う人が増える理由が分かりました＾＾

最後までお読み頂いてありがとうございます！
「Expression resolves to an unused function」を回避したい

##概要
Swift でクロージャを返す関数を呼んだら、タイトルのとおりのエラーがでた
検索結果も英語ばっか
どーしよか

```swift
func createClosure() -> (Void) -> Void
{
    print("UNKO")
    return {() in print("OSHIKKO") }
}

override func viewDidLoad()
{
    super.viewDidLoad()
    self.createClosure()       // コンパイルとおらん
    // self.createClosure()()  // こういう風にすぐ中身実行させるんならコンパイル通る
}
```

##対応
とりあえずクロージャを変数につっこむことでエラーはなくなった
Objective-C なら、そんなんしなくても普通に通るのにね(´･ω･`)
「使用してない変数があるよ」レベルなら Warning ですむくせに・・・

```swift
override func viewDidLoad()
{
    super.viewDidLoad()
    let c: (Void) -> Void = self.createClosure()    // コンパイルとおった
}
```

上の例でいうと、`createClosure` の中の、UNKOだけを表示してOSHIKKOは表示しない
ということをしたい時、わざわざ `(Void) -> Void` とか書くのがすごい面倒
他に方法はないのかな・・・
ということでもう少し探った

##別解法
最も短い書き方はこういう感じか

```swift
override func viewDidLoad()
{
    super.viewDidLoad()
    _ = self.createClosure()
}
```

(;･\`ω･´)。o（え　アンスコって let とかなくても通るんだ・・・）
この書き方はよさげ
戻り値があることも、それはここで使わんよということもわかる
そして短い

でもこれだと型推論によるコンパイル遅延、みたいな問題が発生しそう
よく知らんが
Swift はその辺つらいらしいので、回避できるなら対処したい
なので型加えた上での短い文は・・・

```swift
override func viewDidLoad()
{
    super.viewDidLoad()
    let _:()->() = self.createClosure()
}
```

(´･ω･\`)。o（クロージャの型の書き方色々ありすぎじゃね？ `Void->Void` とかもいけたんだけど）
うん　やっぱめんどいね
もしかして `#define` とかで左辺省略をできるかな　と思ったけどやっぱダメ

##結論
というかアンスコは「この先使用しないよ」を意味してるので
だったら型なんか書かなくてもコンパイル速度とか大丈夫なんじゃない？
とは思うのだけど・・・

今のところは、**全部「_」で書いて、コンパイル遅いわ〜って思ったら、型つけなおす**という方法を取ろうかなと
なんかわかったら追記しましょう

もっと楽な方法あったらおしえて(´･ω･\`)
【勉強1日目】良記事を読む「多段 ssh / rsync するために ProxyCommand を使ってみる (2)」

# 目的

ネットでナレッジ系の記事を見つけても、斜め読みしていつまでも技術力に結びつかない。
なので、備忘録的な意味・きちんと調べて納得することを目的として記事を投稿します。
1日1記事が目標。（平日のみ）
**※個人的な満足のためなので、ナレッジにつながらないと思いますがご勘弁ください**

##サイト
[「多段 ssh / rsync するために ProxyCommand を使ってみる (2)」](http://d.hatena.ne.jp/dayflower/20080205/1202787479)

## 読もうと思った理由
多段SSHをよく利用するが、背景にある動き・仕組みについては全く理解していなかったため。


## 内容の総括
- `Proxycommand`はサーバへの接続に利用するコマンドを指定するconfigのオプション
 - `Proxycommand`で指定出来るコマンドは、標準入力から入力をうけつけ標準出力に出力するものである必要がある
- `nc`コマンドは**ネットワークのやりとりを標準入出力にリダイレクト**してくれる
- `nc`コマンドを介して多段SSHを実現する
 - 多段SSH時にはlocalに全ての秘密鍵をおいておける（gateway,targetに公開鍵を登録） 
- `ssh gateway ssh target`コマンドでも多段自体は成功する（ptyがアロケートされずプロンプトや行バッファ機能が無効になっている。解説は[ここ](http://d.hatena.ne.jp/lurker/20060728/1154096638)）
 - `ssh -t gateway ssh target`でアロケートすることが可能。
 - ただしこのケースの場合は、local→gatewayの通信とgateway→targetの通信の2種類が発生するため、local→targetが直接通信をしているわけではなく、秘密鍵をそれぞれ（localとgateway）に配置しておく必要がある
 - `nc`いらなくね…？　と思ったけど ⇡ の例があるので秘密鍵とか公開鍵を分散したくないなら`nc`使うほうが賢い

### 大事そうなやつを細かく見る　その１

```コマンド:bash
ssh -o 'ProxyCommand nc %h %p' remote hostname
```

1. sshクライアントが`nc`を起動する。
2. ncコマンドがremoteの22番ポート(sshd）に対して接続する。
3. sshクライアントが`hostname`コマンド標準出力で`nc`に渡し、`nc`がsshdに対して`hostname`コマンドを、標準出力で渡している。`sshd`は更にそれを受け取りコマンドを実行している

### 大事そうなやつを細かく見る　その２

```コマンド:bash
ssh -o 'ProxyCommand ssh gateway nc %h %p' target hostname
````

1. sshクライアントがgatewayのsshdを起動する。
2. sshd(gateway)が`nc target 22`を起動する。
3. ncコマンドがtargetの22番ポート(sshd）に対して接続する。
4. sshdが`hostname`コマンド標準出力で`sshd(gateway)に渡し、更に標準出力で`nc`に渡し、`nc`がsshdに対して`hostname`コマンドを、標準出力で渡している。`sshd`は更にそれを受け取りコマンドを実行している


## その他
- ncコマンドはネットワーク間の標準入出力が出来るということで、様々な用途で用いられるらしい
 - ポートスキャン
 - プロキシ
 - HTTP Request
 - ファイル転送　等

詳しくはこちらのサイトなど
[使いたいときに必ず忘れる便利なコマンド「nc」](http://ltside.com/kizyo/nc.html)
[俺的備忘録 〜なんかいろいろ〜](http://orebibou.com/2015/11/ncnetcat%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B98%E5%80%8B/)

次は積んでいたこの記事を読んでみよう
[最強のSSH踏み台設定](http://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8)
AWS　現在のサービス上限値確認方法

#AWSにはデフォルトのサービス上限値がある

##初期上限値
http://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html

##必要に応じてサポートに上限緩和申請を出す
https://aws.amazon.com/jp/contact-us/

#AWSアカウントに対する現在の上限値は？

##サポートに入っている人。
Trusted Advisor画面から確認する

awscliからも確認ができる

詳しくはこちら
http://dev.classmethod.jp/cloud/aws/gather-service-limit-via-aws-cli/

##サポートに入っていない人。
限定的だが、AWSCLIから確認ができる

```bash:awscli
aws ec2 describe-account-attributes --region ap-northeast-1 --output text
```
ViewPagerのEdgeEffectを無効にする

左右の両端に来た時に出る下記のようなエフェクトを無効にしたい。

![tmp2.png](https://qiita-image-store.s3.amazonaws.com/0/15000/076f9d0e-0c15-ba44-c377-9e19b0a9ba81.png)

cacheColorHintがViewPagerにはなかったので、普通にoverScrollModeをneverに設定した。

```xml
<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:overScrollMode="never"
    android:cacheColorHint="@android:color/transparent"
    />
```
Bonfire: Find the Longest Word in a String

##課題内容
`str`を引数としてとりその中で一番文字数がある単語をその単語の数で返してくれる関数を作る。

```
/*
Return the length of the longest word in the provided sentence.

Your response should be a number.
*/


function findLongestWord(str) {
  return str.length;
}

findLongestWord("The quick brown fox jumped over the lazy dog");

```

ということで大半を[この辺](http://stackoverflow.com/questions/17386774/javascript-find-longest-word-in-a-string)から持ってきてしまいましたが（笑）

```
function findLongestWord(str) {
  str = str.split(' ');
  var longest = 0;
  for (var i=0; i < str.length; i++) { // str.length = # of words in "" = 9
    if (longest < str[i].length) {
      longest = str[i].length;
    }
  } return longest;
} 

findLongestWord("The quick brown fox jumped over the lazy dog");

```

簡単な流れを解説すると、
1. `str`に"The quick brown fox jumped over the lazy dog"が入る。
2. `.split(' ')`で各単語が`str`配列に入る。
3. `longest` = 0, `i` = 0
4. `i < str.length`にしたのは`i`はカウンターとして置いていて配列の各単語を巡回する。つまりその回数=`str.length`が最大なので、`i` = `str.length`になるまで（９回）以下を実行しろということ。
5. `longest`(初期値は0）と各単語を比べてもし`longest`のほうが短かった場合はその単語の数を`longest`がコピーするイメージ。`str[i].length`とfor loopの`i=0`で処理毎に`i++`を使えば確かに単語を一個一個見ていくことが出来ると納得。
6. #5をひたすら繰り返して一番大きい単語の数は全ての処理が終わった後に返してくれる。

![Screen Shot 2015-12-17 at 5.11.31 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/336ed014-cf5c-d888-a221-5d9e65113d84.png)
BSD sed のラベルの後ろではコマンド区切りのセミコロンが使えない

BSD sed のワンライナーで小ハマりしたのでメモ

LinuxのGNU sedで期待通りに動いていた、全行読み込んでから改行を削除する定番イディオム

```shell-session
sed -e ':loop;N;$!b loop;s/\n//g'
```

が、なぜかMac OS XのBSD sedで期待どおりに動かなかった。
行の区切りにセミコロンを使わず、次のように複数個の -e で分割すると期待通りに動作した。

```shell-session
sed -e ':loop' -e 'N' -e '$!b loop' -e 's/\n//g'
```

試しに次のように分割してみると、 `'loop;s/\n//g'`という未定義ラベルに分岐しようとしていると見做された。どうやらラベルの後ろのセミコロンはコマンドの区切りとして解釈されないらしい。

```shell-session
sed -e ':loop;N' -e '$!b loop;s/\n//g'
sed: 2: "$!b loop;s/\n//g
": undefined label 'loop;s/\n//g'
```

次のように書けば期待どおりに動作するので、ラベルの定義および参照の後のコマンド区切りセミコロンさえ避ければよいらしいことがわかった。

```
sed -e ':loop' -e 'N;$!b loop' -e 's/\n//g'
```

## 結論

tr使え
RxJava 2.xについて


本稿ではRxJavaの2.x系について紹介します。間違っている箇所があればご指摘下さい。

### TL;DR

* 2.x系は[Reactive Streams](http://www.reactive-streams.org/)準拠に作りなおした実装 (Reactive Streamsと[Reactive Manifesto](http://www.reactivemanifesto.org/)は別物)
* ついでに1.x系よりもハイパフォーマンスな設計を目指している
* Java 1.8以上を対象としていて、将来的には1.9(JDK9)の[Flow API](http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/Flow.html)にも対応する予定がある
* 当分は1.x系と平行して開発していくので、2.x系に急いで乗り換える必要はない(まだ実用段階ではなさそう)

### 2.x系の開発の動機

Javaの非同期ストリーム処理の実装は、RxJava, Akka Streams and Reactorなどなど複数あります。少し前に、これら非同期ストリーム処理の基盤部分の標準化をしようという動きがあって、Reactive Streamsというプロトコルが生まれました。既に[reactive-streams](https://github.com/reactive-streams/reactive-streams-jvm/)という実装もあり、最近[1.0](https://medium.com/@viktorklang/reactive-streams-1-0-0-interview-faaca2c00bec#.90ghwkno2)を迎えています。:tada: :tada:  RxJavaもReactive Streamsに準拠したかったのですが、そのためにはPublicなインターフェースも変える必要がありました。そこでRxJavaのチームはReactive Streams準拠の別実装を2.x系として作ることになった..というのがどうやら経緯のようです。

ちなみに1.x系をReactive Streamsに変換する[RxJavaReactiveStreams](https://github.com/ReactiveX/RxJavaReactiveStreams)というライブラリもあります。これを使うとReactive Streamsとの相互変換が可能で、Reactive Streamsが用意しているTCK[^1]と呼ばれるテストスイートをパス出来ます。

[^1]: The Technology Compatibility Kit (TCK) is a standard test suite for conformance testing of implementations.

### Flow APIって?

Reactive Streams準拠のAPIが[Flow](http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/Flow.html)という名前でJava1.9(JDK9)に入るそうです。今のRxJavaの2.x系実装はreactive-streamsに依存していますが、java1.9(JDK9)がリリースされたら、1.9+用にreactive-streamsをFlow APIで置き換えた実装が提供されるそうです。もちろん1.8用にはreactive-streams使った現行の実装も提供され続ける予定はあります。 Flow APIの現状についての詳細は[メーリスのやりとり](http://cs.oswego.edu/pipermail/concurrency-interest/2015-January/013641.html)を御覧ください。

### Flow APIが使えるようになればRxJavaはオワコン?

どうもそんなことはないようです。Reactive Streams(Flow)自体はとても薄い実装な上、冗長なので何かでラップしたくなるでしょう。特にflatMap, merge, filter, take, zipなどのオペレータも提供されてないし、他の非同期処理ストリームと上手くやり取りが出来ません。なのでユーザーは何かしらの非同期ストリーム系ライブラリ(RxJava Akka..)を使う必要があるのではないかと言うことでした。というかAndroidでJava 1.9(Flow API)はいつ使えるようになるんだろう。。

### おわり

ざっくり2.x系について把握できたでしょうか？ Java本体にReactive Streamsが取り込まれるのは非常に良い流れだと思います。2.x系がAndroid環境をサポートするかはわかりませんが、どうにか使える未来がくるといいですね! 楽しみに待っていましょう。


### 関連記事

* [RxJava/wiki/Reactive-Streams](https://github.com/ReactiveX/RxJava/wiki/Reactive-Streams)
* [Java 9 Flow APIs](http://cs.oswego.edu/pipermail/concurrency-interest/2015-January/013641.html)
GASからDirectoryAPIのCalendarResourceAPIを叩く

以前にGASからCalendarResourceAPIを叩く記事を投稿していましたが、OAuthConfigがサポート終了して使えない状態になっていました。
↓該当記事
http://qiita.com/mistolteen/items/29655b1ec35392da55f6


12/15の記事でDirectoryAPIにCalendarResourceAPIが追加されたということで早速試してみました。
・Introducing the new Calendar Resource API
http://googleappsdeveloper.blogspot.jp/2015/12/introducing-new-calendar-resource-api.html

・新しい Calendar Resource API の導入について（上記ブログの日本語記事）
http://googleappsupdates-ja.blogspot.jp/2015/12/calendar-resource-api.html





#サンプルコード
他のDirectoryAPIと使い方はほぼ一緒なので、慣れている方はすぐわかると思います。


```js:コード.gs
function myFunction(){  
  var customerId = AdminDirectory.Users.get('hoge@example.com').customerId;
  var pageToken = '';
 
  do{
      var resources = AdminDirectory.Resources.Calendars.list(customerId, {pageToken: pageToken});
      var pageToken = resources.nextPageToken;      
      var items = resources.items;
      
      for(var i = 0; i < items.length; i++){
        var item = items[i];        
        Logger.log(item);
      }
    }while(pageToken);
}
```

##Resource.Calendarsの中身

こちらにあります。
https://developers.google.com/admin-sdk/directory/v1/reference/resources/calendars#resource

Descriptionは入力がないと空白ではなくundefinedとなるようです。


#その他の操作
用意されている関数は下記の通りでユーザーやグループと同じです。
使い方については他のDirectoryAPIの使い方の記事を参照してください。

- delete
- get
- insert
- list
- patch
- update

#Reference
https://developers.google.com/admin-sdk/directory/v1/reference/resources/calendars
Cloudera Manager勉強会 質疑応答集

[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の17日目です。

今日は、月次で開催しているCloudera Manager（以下CM）勉強会でした。20名以上の参加者の半数以上が既にCM利用中で、質疑応答も活発だったので、Q&Aという形で公開したいと思います。

### Q. 期待したバージョンのParcelが表示されない
A. Parcelのロケーションをバージョン固定で設定していると、そのバージョンしか認識されません。たとえば`http://archive.cloudera.com/cdh5/parcels/5.4.2`と設定していれば、CDH 5.4.2のParcelしか表示されません。一方、`https://archive.cloudera.com/cdh5/parcels/{latest_supported}/`と設定していれば、常に最新版のCDHのParcelが表示されます。デフォルトではこの値になっています。
また、CMの（マイナー）バージョンは常にCDHより上位とする必要があるので注意してください。

参考: Product Compatibility Matrix for CDH and Cloudera Manager
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/pcm_cdh_cm.html

### Q. AlertPublisherで、テストメールが送信できない
A. 手元の環境で試したところ、AlertPublisherが動作するホストでpostfixが起動していないケースでメールが飛ばないという事象が確認できました。この場合、AlertPublisherのログに以下の例外が出力されます。

```
2015-12-01 16:48:01,108 ERROR org.apache.camel.processor.DefaultErrorHandler: Failed delivery for exchangeId: ID-c5-demo-dev-44136-1448953081553-0-20. Exhausted after delivery attempt: 1 caught: org
.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
```

AlertPublisherが動作するホストでメールサーバ（postfixなど）がポート25で起動していることを確認してください。また、mailコマンドなどでそもそもメールの送信が可能かどうかも同時に確認してください。

参考: Configuring Alert Email Delivery
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_ag_email.html

### Q. ジョブの実行状況残り処理量を見ることはできるか
A. YARNアプリケーションページから進行状況を確認することが可能です（多少のタイムラグはあります）。SparkStreamingの処理には未対応です。

参考: Monitoring YARN Applications
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_dg_yarn_applications.html

### Q. ホストを追加するときにOSの言語を英語にしないと処理が進まないという問題がある
A. 現行のCMは、少なくともインストール時のセッションは英語である必要があります

参考: Cloudera Manager環境での言語設定について 
https://groups.google.com/a/cloudera.org/d/topic/cdh-user-jp/NTYbCY0u1xk/discussion

### Q. ジョブの実行中に、SLAに応じて自動的にノード追加するような機能はあるか
A. CMにそのような機能はありません

### Q. ディスク故障が発生している場合に、Cloudera Managerで検知する機能はあるか
A. CM自身にはありませんが、DataNodeレベルでは`dfs.datanode.failed.volumes.tolerated`にて障害を許容できるディスク本数を指定できます。CMでクラスタを構築すると、マウントされているディスク数の半数まで許容するよう設定します。

参考: Autoconfiguration
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_mc_autoconfig.html
> dfs.datanode.failed.volumes.tolerated - For each DataNode, set to (number of mountpoints on DataNode host) / 2.

### Q. Cloudera Manager自体のHA機能はあるか
A. ロードバランサを使用してHAを構築することになります

参考: Configuring Cloudera Manager for High Availability With a Load Balancer
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/admin_cm_ha_overview.html

### Q. 設定情報はすべてデータベースに入るか
A. CM自身の設定（どのデータベースを参照するか、など）以外は、すべてデータベースに保存されます

### Q. 設定情報は/etc配下に保存されるのか
A. CMではサービス設定とクライアント設定という考え方で設定ファイルを管理しています。詳しくは以下をご覧ください

参考: Cloudera Managerが管理する設定ファイルの違いについて
http://qiita.com/d1ce_/items/15b9e7cb58ff2289f3cb
業務でKotlinを書いている僕がKotlinを書く際に個人的に注意していること


[Kotlinアドベントカレンダー2015](http://www.adventar.org/calendars/857)18日目の記事です。

### はじめに
どうも、CyberAgentでAndroidエンジニアをしている[@magiepooh](https://twitter.com/magie_pooh)です。
現在、[AmebaFRESH!](https://amebafresh.tv/pc/index.html)という動画サービスをKotlinを使って開発中です。というわけで、業務でKotlinを書いている僕がKotlinを書く時に注意していることを幾つか書き留めればと思います。
※ かなり **個人的に** 注意していることなので「ふ～ん」程度に読んでいただけると有り難いです。

### 早期リターン
早期リターンはKotlinに限った話ではありませんが、JavaではよくNullチェックしてNullだったらreturnみたいなことをすると思います。
Kotlinでは`?:`(エルビス演算子)を使って、書くことができます。

```kotlin
fun hoge(name: String?) {
	name ?: return
	// something
}
```

```java
void hoge(String name) {
	if (name == null) {
		return;
	}
	// something
}
```

Javaに比べてかなり簡潔です

### Nullableな変数をNonNullなものに
Nullableな変数を仕様していると`?`だらけになってしまいます。先ほどの早期リターンと組み合わせてNullableな変数をNonNullなものに変えていくのもいいかもしれません。

```kotlin
fun hoge(name: String?) {
	name ?: return
	name.toUpperCase() // NonNullなので?が不必要
}
```

### Smartcastは地味に便利
Javaではよくcastを行ったものを変数に入れたりしていました。わざわざ変数に入れなくても解決する場面もあるかもしれません。

```kotlin
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
	holder as ViewHolder
	holder.hoge // ViewHolderクラスへSmartcastされている 
}
```

もちろん以下の様に、Stringじゃなかったらreturnなども可能です。ただ、必ずキャストしなければならない場合(あまりないですが)には、上記の方法もありかなと思います。

```kotlin
if (x !is String) return
print(x.length) // x is automatically cast to String
```

### スコープ関数を適切に使う
スコープ関数はご存知でしょうか？
知らない方はKotlinエバンジェリストたろうさんが[良記事](http://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e)を書いてくださっているのでそちらを御覧ください。

例としてAndroidのソースコードからViewの高さを変更する場合を考えてみます。方法としてはLayoutParamsをgetしてheightフィールドに値を入れて、再びsetしてあげることになると思います。

```java
LayoutParams layoutParams = targetView.getLayoutParams();
layoutParams.height = 100;
targetView.setLayoutParams(layoutParams);
```

Kotlinの場合は`apply`を使うと以下の様に書くことができます。

```kotlin
targetView.layoutParams = targetView.layoutParams.apply { height = 100 }
```

わかりやすい。
わかりやすすぎる。。
美しく書けます。特にAndroidでいうとIntentの生成を始め、何かを自身に設定するような場面でガンガン使えて、完結になっていくと思います。

また、`run`を使う例も考えてみましょう。今回は例として正規表現のテストを書くとします。

```kotlin
findChannel("$BASE_URL/hoge").run {
	assertTrue(find())
	assertThat(group(1), _is("hoge"))
}
```

このように簡潔に書くことができます。


### itに適切に名前を付ける
Kotlinを書いている時に以下のような時がよくあります。

```kotlin
hoge?.let {
	it.do()
	// ...
	// ...
	// ...
	it.complete()
}
```

このように処理が長くなる(もしくはネストが多い)場合に、itが何を指しているのかが分からなくなるかもしれません。そういう場合に関しては適切な名前を付けて読みやすくしてあげるといいでしょう。

```kotlin
hoge?.let { hoge ->
	hoge.do()
	// ...
	// ...
	// ...
	hoge.complete()
}
```

### ({ }) -> { }
Rxを使用している時によくあるのですが、ちゃんと省略できるところは意識しましょう。

```kotlin
.subscribe { // bad: subscribe({ ... })
	// ...
}
```

### setHoge -> Hoge property property access
Kotlinではプロパティをよく使います。getter,setterではなくできるだけプロパティを使ってあげる方がKotlinっぽくなると思います。

```kotlin
// bad
something.setListener(listener)
// good
something.listener = listener
```

### おわりに
KotlinをよりKotlinらしく書けるように意識している小さなTipsを紹介しました。個人的な意見なので間違ってるかもしれませんし、また、こうしてるよーという意見もあればどんどん勉強したいのでコメントいただけたら嬉しいです！


明日は @droibit さんです。
Unity csv読込

#メモ

現時点ではメモとして記録。あとでまとめる。

Unityでcsvを読み込む際に必要なライブラリは

```csharp:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
```

の４つ。

今回はcsvのデータが

```text:
0.00203,0.00203,0.00203,
0.02492,0.02492,0.02492,
-0.08662,-0.08662,-0.08662,
-0.11209,-0.11209,-0.11209,
-0.15269,-0.15269,-0.15269,
0.18988,0.18988,0.18988,
0.59541,0.59541,0.59541,
0.79057,0.79057,0.79057,
0.87872,0.87872,0.87872,
0.43291,0.43291,0.43291,
0.25082,0.25082,0.25082,
0.26784,0.26784,0.26784,
0.22023,0.22023,0.22023,
0.33144,0.33144,0.33144,
```
といったデータ。(iPhoneの加速度センサを利用して取得したX,Y,Z順のデータ)

ソース全体としてはこんな感じ。

```csharp:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
public class move : MonoBehaviour {

    string[] ad;
    string[] ad_x;
    string[] ad_y;
    string[] ad_z;

    int numberOfLines = 0;

    // Use this for initialization
    void Start () {

        TextAsset adTextFile = Resources.Load("text/AD", typeof(TextAsset)) as TextAsset;
        ad = adTextFile.text.Split("\n"[0]);

        ad_x = new string[ad.Length];
        ad_y = new string[ad.Length];
        ad_z = new string[ad.Length];

        for (int i = 0; i < ad.Length; i ++)
        {
            ad_x[i] = ad[i].Split(","[0])[0];
            ad_y[i] = ad[i].Split(","[0])[1];
            ad_z[i] = ad[i].Split(","[0])[2];
            numberOfLines++;
        }

        Debug.Log(numberOfLines);

        for (int i = 0; i< 2; i ++)
        {
            Debug.Log(ad_x[i]);
            Debug.Log(ad_y[i]);
            Debug.Log(ad_z[i]);
        }
    }
	
	// Update is called once per frame
	void Update () {
	
	}
}
```

Assetsフォルダ下に「Resources」フォルダを作成し、「Resources」フォルダの階層にさらに「text」フォルダを作成。

ここでポイントメモ。

```csharp:
ad[i].Split(","[0])[0];
ad[i].Split(","[0])[1];
ad[i].Split(","[0])[2];
```

と書くと、i行目の各成分を取得できる。

```csharp:
ad[i].Split(","[0]);
```

と書くと、i行目のすべての成分を取得できる。
なので、レコードとして取得したいときは

```csharp:
ad[i].Split(","[0]);
```

と書くといい。
正規表現に一致しない行を調べる grep -v

あるパターンに一致しない結果がほしい場合、複雑な正規表現を書くことになるが、 ``grep`` コマンドは ``-v`` オプションをつけるだけで、パターンに一致しない行を返してくれる。

```bash
grep -v PATTERN [FILE]
```

例

```bash
grep -v hoge foo.csv # hoge が含まれない行を foo.csv から返す
```
「「FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能」のつづき」のつづき


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の18日目

# 「「FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能」のつづき」のつづき

[「FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能」のつづき](http://qiita.com/or2/items/23b1dd62f967ca808957)の続き

昨日

> 忘年会がつづきおつかれ気味なのと、ここから別スクリプトに処理が移るのでまた明日

って書いていましたが、実際相当おつかれ気味なようです
「別スクリプト」ではありません

## ところでダウンロードしてきたアップデート用のファイルはどうなってんの？
今まで見てきたことから、現時点の最新のアップデート用のファイルは
[http://fmdl.filemaker.com/kk/conference/2015/dc2g-24.fmp12](http://fmdl.filemaker.com/kk/conference/2015/dc2g-24.fmp12)
からダウンロードできることがわかる
※アップデート番号：24の場合

![151218-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/ab95e081-f454-8ca6-b401-737c2a9eb3f2.png)

一連の動きを見ている中で保存されていたものをエクスポートしておきました

## まずは開いて見てみる
アップデート用のファイルをとりあえず開いて見てみる

テーブル
![151218-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/7d1f77e5-7974-88b3-0544-78bda635a03c.png)

ちなみにFMC2Goスケジューラーのテーブルは
![151218-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/120a4737-0134-dc1d-ce61-126a4d7b4ccc.png)
となっていたので、全く同じテーブル構造のデータではないようだ

リレーションシップグラフも見てみる
![151218-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/2638d12b-7c97-983e-08c8-3b2e9ea79a1a.png)

ついでに「Sessions」テーブル定義も見てみる
![151218-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/0a8139ac-f3ee-5a6b-baf9-720fa01122f3.png)

実際のデータはこういうものが入っている
![151218-06.png](https://qiita-image-store.s3.amazonaws.com/0/89027/8ab78088-9828-95cc-0e1b-108320012eb2.png)

![151218-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/b577a7f9-c079-983a-01a0-f28d34ba739e.png)

![151218-08.png](https://qiita-image-store.s3.amazonaws.com/0/89027/17692870-5cec-3e32-a760-6bb0b2f703db.png)

## どんな風に取り込むのか？
データベースの構造が違うものをどんな風に取り込むのか？気になるところ

とりあえずインポートの設定を見てみよう
![151218-09.png](https://qiita-image-store.s3.amazonaws.com/0/89027/0a118114-3bfb-61aa-a7a2-77a4c8ec30d4.png)

![151218-10.png](https://qiita-image-store.s3.amazonaws.com/0/89027/7cc197a7-31f0-3f01-9cda-1343ef803481.png)

いまいちわからないので、また明日
PlayGround ではボタンなどのインタラクティブな操作はできない

UIScrollView の動作を確認したくて PlayGrounde で試してみたが、どうにもスクロールできないのでおかしいなと思ったら、ボタンも押せなかった。
どうやら PlayGround ではイベントに反応するインタラクティブな動作の確認はできないらしい。

```swift
import UIKit
let vw = UIView(frame: CGRectMake(0,0,300,300))
vw.backgroundColor = UIColor(white: 0.9, alpha: 1.0)
let button = UIButton(frame: CGRectMake(10,10,100,100))
//button.buttonType = .System
button.setTitle("Push me!", forState: .Normal)
button.setTitleColor(UIColor.blackColor(), forState: .Normal)
vw.addSubview(button)

let scroll = UIScrollView(frame: CGRectMake(0,0,100,100))
scroll.scrollEnabled = true
scroll.contentSize = vw.frame.size
scroll.scrollEnabled = true
scroll.addSubview(vw)
// 操作できないスクロールとボタンが表示される
```
電子工作 > 箱(v0.2) > ミルクコーヒー + あずきバー

どんどん増える部品の整理を検討している。

![qiita.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/224483b3-fed1-47c1-cccd-4cb587c1a994.jpeg)

http://qiita.com/7of9/items/96d141ac0a4ffe9a05ed
で記載した箱は、あずきバーの箱にだいたい5列x2段で収まる（少し無理をすれば6列x2段も可能）ようだ。

左から

- 1000uFケミコン + ３端子レギュレータ
- ブレッドボード用ジャンパーワイヤー
- 可変抵抗, 10k固定抵抗
- XHPコネクタ
- チェックピン, ジャンパピン
- 1.1k固定抵抗

固定抵抗は箱の長さ６割り程度で収まる。
ジャンパーワイヤーは少し長いので、箱の中で少しカーブした状態。

ラベル用のビニルテープは黄色は目地が見えるので、薄い水色がよい。
使っている水色はおそらく以下の「11. VT-1916 空」のようだ。
http://www.nichiban.co.jp/stationery/vinyltape/index.html


箱が傷んだ時、交換品の再入手性を考えているが、どうだろう。
raspberry pi > RS-232Cシリアルラインモニタ作成中

[Raspberry Pi Advent Calendar](http://qiita.com/advent-calendar/2015/raspberrypi) 18日目の記事です。

## ことの経緯　

- 2015年7月18日
  - ふと、「もっと良いAPIを作れないだろうか」と思った。とりあえずよく使われているものでAPIを勉強しよう > Unityのdocumentを読み始める
  - documentだけ読んでも身につかないので、小さいソフトを作ろう > Unityインストール / Unity入門
  - UnityではC#というのを使うのか > C# 入門
- 2015年8月1日から
  - 描画関連でグラフとか作ってみよう > lineRendererを使ってグラフの実装を開始
- 2015年8月5日から
  - UDP通信などネットワークやってみよう > 小さいソフトを作成
  - UIまわりやってみよう
- 2015年9月17日頃
  - 通信関連のツールをUnityで色々実装できた
- 2015年9月末
  - RS-232C通信をUnityでやるやり方は見つかったが、デバイスごとの設定が面倒
  - もっと簡単なやり方はないだろうか
  - しばらくUnityから離れる間にぼんやりと考える
- 2015年11月07日
  - 前から気になっていた Raspberry PiでRS-232C通信やれば楽かも > Raspberry Pi入門
  - Rasbeppy Piではpythonを使うのか > python入門
  - Qiitaに 投稿する (http://qiita.com/7of9/items/028556c5a819a6a8de96) > 航海日誌として

## 現状

2015年12月13日現在、以下の機能を実装済みです。
不具合をつぶしていっている状況です。

- モニタリング
  - RS-232C通信を設定したUDP(IPアドレス,ポート)へ転送
- ロギング
  - raspbian内に保存
  - SFTP取り出し、またはUSBメモリ取り出し
- 設定機能
  - UDPポート7000で設定コマンドを受付
- 情報表示
  - 7セグメントLEDでIPアドレスを表示
- スイッチ
  - GPIOを使用したshutdownボタン
- UnityでのUI
  - androidスマホ / Mac / Windowsからの設定変更、通信モニタリング

## 関連プログラム

### メインプログラム

- [python-151113-lineMonitor](https://github.com/yasokada/python-151113-lineMonitor) : RPiで動かすソフト本体
- [unity-151117-linemonitor-UI](https://github.com/yasokada/unity-151117-linemonitor-UI) : androidスマホで動かすUIソフト (Mac, Winでも動く)

### 付随ツール

- [python-151127-7segLed_IPadrDisplay](https://github.com/yasokada/python-151127-7segLed_IPadrDisplay) : 7セグメントLEDでIPアドレスを表示する
- [python-151205-shutdownButton](https://github.com/yasokada/python-151205-shutdownButton) : GPIOでシャットダウンボタン
- [python-151212-logFolderCopier](https://github.com/yasokada/python-151212-logFolderCopier) : ボリューム名「COPYTO (全部大文字)」のUSBメモリを挿した時にUSBメモリにコピーする

- udpMonitor [@ Qiita](http://qiita.com/7of9/items/79b2f518a8dd2c9d5066) : UDPの送信を2つに分岐できる


### /etc/rc.local設定

http://qiita.com/7of9/items/46ae6752db57205fd5e7


## 終わりに

関連情報は[myLineMonitorタグ](http://qiita.com/tags/myLineMonitor)で投稿しています。

2月完成予定、としましたが自分が欲しい機能はほぼ実装でき、使い始めてます。あとは不具合をつぶすのと、UIを多少よくするかどうかです。

githubの方でドキュメントがさっぱりなので、そのあたりの整備をぼちぼちやります。

一番最初の目的「APIのデザイン能力の向上」の結果は、多少あったような気がします。
技術英語 > May I request that Kes be allowed to stay here with me?

@ Star Trek Voyager > TWISTED

打合せで方針が決まったクルーたち。そこでドクターが助手のKesについて発言をした。

> May I request that Kes be allowed to stay here with me?

上記のbeは`(should) + 原形動詞`なのだろう。

"request be 文法"で検索したらいくつか例が出てくる。
ディスク、ドライブ、ボリューム、パーティションの違い

## ディスクには「disc」と「disk」の2種類がある。

>disc は、オーディオ CD、CD-ROM、DVD-ROM、DVD-RAM、DVD-Video ディスクなどの光学式メディアを指します。
>disk はフロッピーディスク、コンピュータのハードドライブ内のディスク、外部ハードドライブなどの磁気メディアを指します。
https://support.apple.com/ja-jp/HT201697

Appleのページには磁気メディアのみをdiskと呼ぶと書いてあるようだが、SSDもdiskに含む場合が多いように思う。

## ディスクはメディア、ドライブはメディアを入れる装置

元々フロッピーディスクは1枚のディスクのこと、フロッピーディスクドライブはフロッピーディスクを入れるデバイスのことを指した。
だからハードディスクは略してHDD（Hard Disk Drive）になる。
しかし今ではこれらは混用されている。特に英語圏ではハードディスクのことをhard driveと呼ぶことが多いし。

## ボリュームとパーティションの違い
ボリュームとは**1個の**ファイルシステムを含むストレージ上の領域。
厳密に言えばボリュームとパーティションは違う。例えば1個のフロッピーディスクは1個のボリュームであるが、パーティションは存在しない（フロッピーディスクにパーティションを切ることはできないから）。また、ISOイメージやMac OS XのDMGはボリュームであるが、パーティションではない。
とはいうものの、これらの厳密な使い分けはOSによって異なると考えた方がよさそうだ。Linux LVMの物理ボリューム、論理ボリュームは「1個のファイルシステムを含む領域」ではないし。
https://en.wikipedia.org/wiki/Volume_(computing)
[小ネタ]C++のprivateは、同じクラスからなら、別オブジェクトからでもアクセスできる。

privateには、自分自身(`this->xxx`の形で書けるもの)からしかアクセスできないと勘違いしていたが、そうでもなかった、というメモ。

```cpp
class A
{
public:
	A(A* a) : a(a), x(1){ a = a; }
	int foo(){ if(a) return a->x; else return 0; }  // 同じクラス(A)のprivateにアクセス

private:
	int x;
	A* a;
};

int main(){
	A a1(nullptr);
	A a2(&a1);

	std::cout << a2.foo() << std::endl;  // 問題なくアクセスできる
}
```

上の例は実用性が皆無だが。木構造やリスト構造のように、同じクラスのオブジェクトに参照する場合は、多々考えられる。
木を辿るためのインタフェースがpublicでなくても、メソッドからなら、木を辿ることができる。
RPM build環境の構築

# 前提条件
　昔々はRPMのbuildは /usr/local/src/redhat だったのでrootで作ったりしていたが昨今は一般ユーザで作るのが常識らしい。
　RPMをbuildする為にはbuild用のディレクトリを作る必要があるが、これには怠惰なコマンドが用意されているらしい。

# CentOS 6, 7

## パッケージインストール
<pre>
 # yum install rpm-build
 # yum install rpmdevtools
 # yum install yum-utils
</pre>

## build環境の構築
<pre>
 $ rpmdev-setuptree
</pre>
- rpmdevtools パッケージに入っている怠惰なコマンド

## SPEC fileの書き方


## RPM build
* とりあえず試験をする際は、両方作ってもらわないと使い勝手が悪いので ba
<pre>
 $ rpmbuild -ba XXXX.spec
</pre>


# RPM rebuild guide
* https://fedoraproject.org/wiki/How_to_create_an_RPM_package
    * https://fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/RPMMacros
CPU使用率やメモリ使用量を調べる

mpstatやdstatを使うと,CPU使用率やメモリ使用量を調べることができる。

- mpstat

```bash
sudo yum install -y sysstat
```

-P ALL ですべてのコアの情報が表示される。

```bash
mpstat -P ALL
```

参考：Linux - CPUをコアごとに確認する - Qiita http://qiita.com/shohhei1126/items/4b54290a3604f63f52c8

- dstat

```bash
sudo yum install dstat
```

時間,CPU使用率,ロードアベレージ,メモリ使用量をファイルに保存するには

```bash
dstat -tclm --output dstat_log.csv
```

参考：dstat使ってみる - tweeeetyのぶろぐ的めも http://tweeeety.hateblo.jp/entry/20140121/1390275336
Perl6 プログラムの引数

こんばんは :whale2: 
[Perl 6 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl6)の17日目です。

こんかいはPerl6でのプログラム引数の受け方

## Perl5 だと

Perl5 で引数を解析するのには`Getopt::Std`モジュールや`Getopt::Long`モジュールを使っていました。

[15.1. Parsing Program Arguments - Perl Cookbook](http://docstore.mik.ua/orelly/perl/cookbook/ch15_02.htm) 

##### Getopt::Std

```pl
use v5.18;
use Getopt::Std;

getopts("vo:", \my %args); # -v, -o ARG, sets $args{v}, $args{o}

$args{'v'} && say 'v';
$args{'o'} && say $args{'o'} ;
say @ARGV;
```

##### Getopt::Long

```pl
use v5.18;
use Getopt::Long;

GetOptions( "verbose"  => \my $verbose,  # -v or --verbose
            "output=s" => \my $output ); # -o=string or --output=string

$verbose && say 'verbose';
$output  && say $output;
```

## Perl6 だと

##### multi dispatch

たとえば、以下のような書き方で`install`, `info`, `search`, `help`のオプション指定可能なプログラムができます。[^panda]

```pl:getopt.pl6
use v6;

multi MAIN ('install', *@modules, Bool :$notests, Bool :$nodeps) {}
multi MAIN ('info', *@modules, Str :$prefix) {}
multi MAIN ('search', $pattern = '', Str :$prefix) {}
multi MAIN ('help') {
  qq:x/ perl6 $*PROGRAM-NAME /.say;
}
```

そして、これを引数無しで実行すると「使い方」が出力されます。魔法みたい :camel: 

```bash:出力結果
$ perl6 getopt.pl6
Usage:
  getopt.pl6 [--notests] [--nodeps] install [<modules> ...]
  getopt.pl6 [--prefix=<Str>] info [<modules> ...]
  getopt.pl6 [--prefix=<Str>] search [<pattern>]
  getopt.pl6 help
```



`USAGE`サブルーチンを定義しておけば、「使い方」としてそれが実行されます。

```
use v6;

multi MAIN ('verbose') { }
multi MAIN ('help') {}

sub USAGE () {
note q:to/このプログラムの使い方だよー/.chomp;

　　　　 ⌒Ｙ⌒
　　　　　 ｜
(Ｙ)　 ／￣￣￣＼
｜(＿／　゜(ﾟДﾟ)ヽ
～　～～　～ ～　～

このプログラムの使い方だよー
}
```

すごい(小並感)
おわりです。

## 参考と注釈

* [Perl 6 Programming/Subroutines - Wikibooks](https://en.wikibooks.org/wiki/Perl_6_Programming/Subroutines)
* [Perl 6 の関数は sub だけじゃない - Qiita](http://qiita.com/uasi/items/1321325bc983c5ed971a)
* [Day 24 — Subs are Always Better in multi-ples - Perl 6 Advent Calendar 2011](https://perl6advent.wordpress.com/2011/12/24/day-24-subs-are-always-better-in-multi-ples/)
* [Day 2 – Interacting with the command line with MAIN subs - 
Perl 6 Advent Calendar 2010](https://perl6advent.wordpress.com/2010/12/02/day-2-interacting-with-the-command-line-with-main-subs/)
* [Day 6 – Running External Programs from Perl 6 - Perl 6 Advent Calendar 2014](https://perl6advent.wordpress.com/2014/12/06/day-06-running-external-programs-from-perl-6/)

* [How do I parse and validate command line arguments in Perl 6? - stackoverflow](http://stackoverflow.com/questions/29704106/how-do-i-parse-and-validate-command-line-arguments-in-perl-6)
* [Getopt::Tiny for Perl6 - tokuhirom's blog](http://blog.64p.org/entry/2015/10/06/131831)
* [tokuhirom/p6-Getopt-Tiny](https://github.com/tokuhirom/p6-Getopt-Tiny/)

[^panda]: `panda`コマンドを参考にしたものです。
carriewaveでExifの回転情報(rotation)をよしなに修正した後 Exif情報を除去する


Exifの回転情報をよしなにした後 Exif情報を除去するメソッドを書いてみた。

`回転情報をよしなに`と`Exif情報除去`を別々のメソッドにすると(manipulate!をそれぞれで呼び出すと)、画像ファイルのオープンとRMagick/MiniMagick等のオブジェクト生成処理もそれぞれで発生するので纏めたメソッドにする方が良いかと。。

``` app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  # Exif情報のOrientationから画像をよしなに修正した後、Exif情報を除去する
  process :fix_exif_rotation_and_strip_exif

  def fix_exif_rotation_and_strip_exif
    manipulate! do |img|
      img.auto_orient # よしなに！
      img.strip       # Exif情報除去
      img = yield(img) if block_given?
      img
    end
  end
end
```
Live2Dでパーツ表示・非表示させる2つの方法

[Live2D Advent Calendar 2015](http://www.adventar.org/calendars/935)の17日目の記事です。

意外と知られてなさそうなので、パーツの表示・非表示させる小ネタを紹介します。
やり方としては、以下の2つあると思います。

**１）Modelerでパラメーター制御する方法**
**２）pose.jsonで制御する方法（アプリを作る人のみ）**

# Modelerでパラメーター制御する方法
例えば、こんな感じのことをやりたい時
![001.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/780aba65-d0dd-ff75-4695-c557d10ef9f5.gif)
僕の場合は、まぶた部分のパーツの不透明度は以下のようにしています。

###◆まぶたAのパラメーター
![002_Parts_A001.png](https://qiita-image-store.s3.amazonaws.com/0/15028/cda72cfa-c934-8941-b024-35bbbd0d79bd.png)

![003_Parts_A002.png](https://qiita-image-store.s3.amazonaws.com/0/15028/4e2621b2-2fe9-6918-f09f-e5cbeeddff91.png)

![004_Parts_A003.png](https://qiita-image-store.s3.amazonaws.com/0/15028/25542e6a-a430-9a66-c119-a2ef381cee53.png)
まぶたAのパラメーターは-0.1〜1.0の間を持っていて、-0.1〜0.0の間で不透明度を0〜100%切り替えてます。

###◆まぶたBのパラメーター
![005_Parts_B001.png](https://qiita-image-store.s3.amazonaws.com/0/15028/94c25824-5881-470a-4594-b3c5a878f618.png)
まぶたBのパラメーターは-0.1のみあり、不透明度を100%にしてます。

**あくまで「こんな感じでできるんじゃね？」と思い設定したものなので、参考程度にして下さい。**


ちなみに閉じる口などは、口かぶせ用のパーツを作って再現できるかと。
Unityちゃんなどがそうなってますね。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/15028/1ac007ef-9f65-0118-0575-d0a60c805b60.png)


# pose.jsonで制御する方法

こちらが本題ですが、pose.jsonという便利なものがあります。
これはLive2D ViewerとAnimatorを使って制御します。サンプルのharuちゃんモデルがわかりやすいです。

この場合は、パラメータ制御しないので阿修羅状態にしておきます。
<img width="480" alt="007.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/d1cca7a4-a82f-7169-d9ee-fd3e9380fe3d.png">
そしてAnimatorではパーツを消してモーションを作ります。
<img width="600" alt="008.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/9e79a097-e374-869d-2fcb-dac3ea71d80d.png">
この場合、Live2D ViewerやSDKに組み込んだ際に、まだ阿修羅状態のまま・・・。
![009.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/d516ab51-edfb-fc47-b578-aea6994fa174.gif)

**ここで必要になるが「pose.json」です！**
pose.jsonはLive2D Viewerから作る事ができます　→　[Live2D Manual - ポーズの設定](http://sites.cybernoids.jp/cubism2/live2dviewer/pose-setting)
ポーズを作り、グループ分けします。
<img width="363" alt="010.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/5a21ceac-fcc6-c720-e9b9-4c306c2bc5d8.png">
そうするとちゃんとモーションにあったポーズがされますねっ！
<img width="769" alt="011.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/7e067a46-6fb1-0ce0-2e51-0d22d2383813.png">

# おまけ
パーツ表示・非表示と関係ない内容ですが、ポリゴンの消しゴム機能が追加されてました（つい最近知りましたw）
![012.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/daa58314-f1e9-e575-c89a-defbf121d5f7.gif)

ただ、[マニュアルの注意事項](http://sites.cybernoids.jp/cubism2/modeler/tmp/beginner-tutorial/03)にもある通り、最低２点は残しましょう。
これで「点を増やす」と合わせれれば、ポリゴンを増やしたり削除したりが思いのままですね♪
Qiitaに投稿する記事の書き方に望むこと

大上段から構えて書いてみました。
寝る前に書いてるポエムだからいいんです（先に謝っておきます すみませんm(_ _)m

#他人が見れる記事なのだから他人の目を意識した書き方をしよう
Qiita は（Team は知りませんが）プライベートモードが使えないので、どんな記事を書いても他の人から見られます。しかも Qiita は（意外にも）人気サイトです。 PageRank も高めです。

そのため、自分だけ分かってる文脈で記事を書いたとしても、他の人からは「これは何か一般的なことを言ってるのかも」と勘違いされることがあります。そして「これは役立ちそう」と（勘違いされて）ストックが増えてしまうこともあります。
また、自分のやったことをそのまま書いておくのは、作業履歴としてはいいのですが、行った手順全てを書くと、無駄な部分も含むことが多いです。できれば無駄な部分は削るほうがいいでしょうし、削っておいたほうが（読み返した）自分にも分かりやすくなります。
そして（ここは大きく強調したいのですけど）**誤字脱字** にも注意したほうがいいです。必ず読み返しましょう。

記事に誤りが入っていると「こんなことも知らんのか」とツッコミが入ったりします。また、間違いが含まれた記事を見て「人気サイトの Qiita で見かけた内容だから間違いないだろう」などと変な信頼性が付いてしまった状況で学習する人も出てきたりします。ツッコミがあるのはまだマシです。Qiita に間違った記事を載せていると（意外に PageRank が高いので）ググったときに上位にきてしまったりします。**間違いの大元が自分の記事** なんてことはあまり嬉しくないですよね。なので、公開するときにはちゃんと検証するようにしましょう。

また **1か月後の自分は他人** とよく言われるように、記事を書いたときには分かっている前提条件も、1か月経ってしまうとすっかり忘れてしまいます。「この記事の前提条件って何だっけ…？」なんてことが生じないよう、未来の自分のために、できるだけ前提条件を記載しておきましょう。

#参考記事へのリンクは張っておこう
他で見かけた記事をまるごとコピペしたりすると著作権的に問題があります[^1] 。引用の範囲を超えるほどコピペするならばプライベートなブログにでも貼っておきましょう。
そして、参考にした記事へのリンクを張っておくと、その記事への謝意になります。また、もしも Qiita に書いた自分の記事に勘違いが含まれていたとしても、大元の記事が正しければ、そちらを見て正しく理解してくれることも期待出来ます。場合によっては、誤りをちゃんと指摘してくれる読者も居ます。
[^1]: 実際にコピペのみの記事もあったのです。ネットで見かけた記事のブックマークや書き控えのつもりだったようです。

#記事のスクリプト/プログラムはちゃんと動作するように検証しよう
残念なことに、記事に書いてある内容だけでは動作しない場合があったりします。ちゃんと動作するように検証してから「投稿」ボタンを押しましょう[^2]。
[^2]: もちろん投稿後に気付くことも多いです。誤りに気付いたら、すぐに編集しましょう。

#Markdown を活用した書き方をしよう
Markdown を使えば、他の人に書いている内容が明確に伝わるようにできます。
ときどき、コードを引用的に使っているひとを見かけます。やはり `code` はコードとして使ってほしいです[^4]。
また、リンクはできればリンク先のタイトルを付記してほしいです。タイトルがあればいちいちリンク先を見にいかなくても内容が分かります。

[^4]: コード記法をエスケープ記法的に使うこともありますけど、例外的ですね。
##Markdownの例

```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
`インラインコード`
*斜体*
**強調**

> 引用

- 箇条書き

[リンク](http://qiita.com/)
```
は↓のようになります。

---
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
`インラインコード`
*斜体*
**強調**

> 引用

- 箇条書き

[リンク](http://qiita.com/)

---

Markdown記法の詳細はこちらをご覧ください。
[Qiita - Markdown記法 チートシート - Qiita](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)

#などと勢いで書いたら
[良い記事を書くためのガイドライン - Qiita:Support](http://help.qiita.com/ja/articles/qiita-article-guideline)
がありました。ひとまず、投稿する前にこれ読みましょうw

>### 具体的で簡潔なタイトルをつける
- タイトルを見ただけで記事の中身を想像できるように

>### 環境や前提条件を説明する
- 適切なタグをつける
- 特定のバージョンについて話をするときは、タグにバージョンを

>### 引用元や参考元へのリンクを書く
- 文章を引用したらそのページへのリンクを
- 記事の内容を理解する助けになるページがあればリンクする
 
>### 著作権に気をつける
- 著作権で認められた引用の範囲を超えないように

>### ライセンスや秘密保持契約に気をつける
### （Qiita の）利用規約を守る

#補足：投稿しっぱなしではなく更新もしよう
Qiita では1年間更新が無いと
> この記事は最終更新日から1年以上が経過しています。

と（最近になって）出るようになりました。
継続的に更新してあるとこれが出ないので「ああ、投稿日は古いけど、ちゃんとメンテナンスされてるから今でも役立つ記事なんだな」と記事の信頼度が向上します。
なお、更新した場合には、更新した部分を明記しておくとハッキリして分かりやすいです。

#関連記事
ずーっと前に書いた記事（これもポエムタグつけておいたほうがいいかもw）
[Qiita - 誤記の指摘はコメント欄じゃなく「編集リクエスト」を使いましょう - Qiita](http://qiita.com/riocampos/items/977b1cb7c8d49fa8840d)
Vimでウィンドウサイズの変更を簡単・高速にするプラグイン



VimやMacVimなどでウィンドウを分割して利用していると、サイズの変更のしたいことはよくありますね。

`Ctrl-W`+`>`, `Ctrl-W`+`<`, `Ctrl-W`+`-` , `Ctrl-W`+`+` で少しずつ変更することはできますが、ちょっと面倒。。

## :spades: **簡単・高速にウィンドウサイズを変更する**

ウィンドウサイズの変更を楽にするプラグイン [winresizer](https://github.com/simeji/winresizer) の紹介です。
(もともと別アカウントで開発していたものを、最近こちらのアカウントにTransferしました)

このプラグインではVimの操作と同じ、 `h`, `j`, `k`, `l` で直感的に、連続的にウィンドウサイズを変更していくことができます。（リサイズモード）

最近、MacVim 自体のウィンドウサイズも変更できる機能をつけましたので、合わせて紹介します。


## :four_leaf_clover: **デモ**

おそらく見てもらったほうがイメージが湧くと思います。

### **Vim**


デフォルトのキーマップだと `Ctrl-E` でリサイズモードを開始できます。

![demo-for-vim](https://raw.githubusercontent.com/wiki/simeji/winresizer/images/demo-for-terminal.gif)


### **MacVim**

上記のCUIと同じ `h`, `j`, `k`, `l` でのウィンドウサイズの変更に加えて MacVim自体のウィンドウサイズの変更もできます。

デフォルトのキーマップだと `Ctrl-E` でリサイズモードを開始、 `Ctrl-A` でMacVim自体のウィンドウサイズのリサイズモードとなります。

![demo-for-macvim](https://raw.githubusercontent.com/wiki/simeji/winresizer/images/demo-for-gui.gif)


## **インストール方法**

NeoBundle などのプラグインマネージャーを利用しているのであれば以下のように記述し、`:NeoBundleInstall` してください。

```.vimrc
NeoBundle 'simeji/winresizer'
```

それ以外の方も、通常のプラグインインストール方法と変わりません。


## **操作方法**

### **リサイズモードの開始**

`Ctrl-E` で開始です。 (デフォルト設定、設定で変更化)

MacVimの場合は `Ctrl-A` でMacVim自体のウィンドウサイズを変更する リサイズモード を開始します。

### **リサイズモードの操作**

`h`,`j`,`k`,`l` : それぞれのキーでウィンドウをリサイズします。

`Enter` : リサイズした状態を確定します

`q` : キャンセルします。ウィンドウサイズは変更前のものに戻ります。

これらのキーは後述の vimrc の設定で変更可能です。

**Enter (リサイズの確定)**
![enter](https://raw.githubusercontent.com/wiki/simeji/winresizer/images/demo-enter.gif)

**q (キャンセル)**
![cancel](https://raw.githubusercontent.com/wiki/simeji/winresizer/images/demo-cancel.gif)


### **その他設定など**

こちらに書いてありますので、こちらを見てください。

https://github.com/simeji/winresizer#customize-options


## **最後に**

AdventCalender見て、より強く思うのですが、
やっぱりVimは人によっていろいろなVimの形があってすごくいいなぁと思います。