OmniAICreator/Qiita-1.07M huggingface dataset:
IPython Notebookのスライドを(無理やり)pdf化する方法

## はじめに

以前[IPython Notebookで卒論発表したいんじゃ](http://qiita.com/ssh0/items/8ae76ca0a0df1569462a)というエントリーを書かせていただきましたが、先日無事卒論発表が終わりましたので、事後報告をさせていただきます。

結論から言うと、IPython Notebookは、**チームメンバーや研究室内での情報共有、プログラムのデモンストレーションには最適だが、卒論発表のような、時間を掛けてスライドを作成するような場合には、かけた努力に対する利益は少ない**です。

そう思った理由は以下の通り。

- 図の配置やオブジェクトの設置に関する自由度が低い
- こまごまとした設定ファイルの編集が必要
    - プロジェクターの解像度、ボタンの非表示
- 編集のたびにコマンドを実行し、ブラウザを立ち上げる必要がある
    - 自動化は可能だが、スライドのファイルを編集用のアプリケーションで開くのと比べると面倒
- 環境のある(つまり自分の)PCでしか編集、実行できない
- pdfファイル化するのに苦労する

いくつかの問題については以前の記事にも書いてあるので、解決はしてるわけですが、それでも、最初の項の自由度が低い、という点に関しては、PowerPointやKeyNoteのようにグラフィカルに編集できるものに比べると、どうしても見劣りしてしまいます。LaTeXのBeamerの代わりくらいにはなるかなという感じ(でもBeamerの方が自由度はさらに高い)。

今回は最後の「pdfファイル化するのに苦労する」の部分を、少しでも和らげるためのスクリプトを紹介します。

## IPython Notebookのスライドを(無理やり)pdf化する方法

私の環境:
OS: Ubuntu 14.04
WM: Xmonad 0.11
必要なコマンド:
- `import`(パッケージ:imagemagick)
- `convert`(パッケージ:imagemagick)
- `xte`(パッケージ: xautomation)

スクリーンショットを撮ってjpgかpng形式で保存していき、連番になったそれらの画像群を、`convert`コマンドで一つのpdfファイルにする、というものです。

[`xte`](http://linux.die.net/man/1/xte)はUbuntuだとxautomationというパッケージに含まれているコマンドで、シェルからキーボードの操作やマウスの操作が行えるというものです。この機能を使ってスクリーンショットを撮る動作を自動化すれば、煩わしい操作からは開放されます。それに、何もせずとも画面が動いていく様子は、気持ちがいいです。

以下に、作成した簡単なスクリプトを載せます。各自の環境で読み替えてください。

```bash
#!/bin/bash

folder=$(pwd)
num=40
xte 'keydown Super_L' 'key 4' 'keyup Super_L'
for t in `seq 1 ${num}`
do
    name=$(printf screen_%03d.jpg $t);
    sleep 0.5
    import -window root -quality 0 ${folder}/${name}
    xte 'key Right'
done
xte 'keydown Super_L' 'key 3' 'keyup Super_L'
exit 0
```

### 使い方

事前に、モニタの解像度をプロジェクターの解像度に合わせてください。
`xrandr --output HDMI1 --mode 1024x768`
などです。

次に、別のワークスペースでNotebookのスライドモードに入り、全画面表示させておきます(この画面全体のスクリーンショットを撮るため)。

スクリプトを呼び出す際のディレクトリ内に画像が保存されますので、新規作成したディレクトリの中からスクリプトを呼び出すのがいいと思います。`num`はスライドの枚数にしたがって、各自変えてください。次の行のxteを使った操作は、ブラウザが立ち上がっているワークスペースに移動するものです。矢印キーで移動する方はそのように書き換えてください。

スクリプトを実行すると、スライドを表示しているワークスペース4に移り、`import`コマンドで、圧縮なしで全画面のスクリーンショットを撮り、→キーを押して次のスライドにうつります(PageDownにすればSubslideを含ませることも可能)。これを繰り返して、所定の枚数撮り終わったら、ワークスペース3に戻ってきます。

スライドが撮り終わったら、いらないスライドを削除したりしてpdfの順番になっているか確認した後に、

```
convert -page 1024x768 -gravity Center *.jpg out1.pdf
```

のようにしてpdfファイル化します。


# まとめ

自分の場合、Notebookで発表はできましたが、誰からもその点に関するツッコミはなく、ちゃんと研究に関する質問がされました。すこしさびしいんですが、当然です。pdf化した資料は研究室の中での発表ではよく使うので、まだ使う機会はあるのかもしれません。でも、やっぱり素直にLibreOfficeのImpressでスライド作った方がいい気がしますね。Notebookは自分用の下書きと、プログラムのチュートリアルくらいに使うのが、あってる気がします。
Twitterの30秒動画の撮影機能(video.twimg.com)のiphoneアプリでの現状の仕様まとめ

Twitterの公式アプリから３０秒の動画を撮影できるようになりました。
https://blog.twitter.com/ja/2015/0127video

iphoneで使用してみたところ以下の仕様が今のところあるようです。

* 1ツイートに投稿できる動画は１つのみ
* 1ツイートに写真と動画を混ぜて投稿することはできない（これはアプリの仕様でJSON構造上は可能になっている。Twitter公式アプリで制限をいずれ解除するものと思われる）
* 1ツイートに写真を選択し、ビデオを撮影し投稿しようとすると先に選択した写真は解除される
* 1ツイートに写真を投稿できるのは４枚まで（これは今までと変わらない仕様
* 動画は投稿されるとTwitterサーバー側で複数のフォーマットに変換される（投稿された動画は様々なデバイスに対応しており、ユーザーが動画フォーマットを気にする必要はない）
* 動画サイズのためか、フォーマット変換をかけているためかはわからないがツイッターに動画を投稿するのはレスポンスが重い。気軽にツイートをする感じが損なわれている。
* 感覚的にはYoutubeに動画を投稿するのと変わらないイメージ。
Pepper のカメラ映像をライブ配信する実験 その3 (いったん整理・まとめ)


## はじめに

* まだまだ実現はできていないのですが、何となく可能そうな方法は見えてきた感じはします。
* ただ、すぐに確認に使える Pepper 実機もないし、いったん内容を整理・まとめておこうと思います。

## 前提

* Pepper のカメラ映像を、外部の PC やタブレットのブラウザで、html5 の video タグを使用して表示することを想定します。
* Pepper とクライアントのみで構成できるのなら、そのほうが良いのですが、間にサーバも入る構成も検討します。


## 1. NAOqi API を使用する

### 方法

以下のどちらかの API を使用し、一定のタイミングで画像を取得し、クライアント側での表示画像を更新します。

#### 1.1 ALPhotoCaptureProxy::takePicture(s)
#### 1.2 ALVideoDeviceProxy::get(DirectRaw)Image(Local|Remote)

### メリット・デメリット

#### メリット

* 比較的手軽に実現可能と思われます。
* ALFaceDetection 等、他の画像認識系 API との相性は良いと思われます。

#### デメリット

* fps は出ない(出せない)ように思いますので、頑張ってもパラパラ漫画でしょう。


## 2. NAOqi API を使用しない

### 方法

API は使用せず、ビデオデバイス直のデータを処理します。以下のどちらかのコマンドを使用し、適当な形式でデータを出力し、適当な方法で配信します。

#### 2.1 FFmpeg を使用
#### 2.2 GStremer を使用

### 適当な形式、適当な配信方法

#### 適当な形式

Pepper 内蔵の FFmpeg, GStreamer で実行可能な、設定項目の形式を選択します。
あるいはサポート可能な外部サーバを用意して、Pepper と連携して処理します。

* 映像サイズ
* フレームレート
* ビットレート
* ファイル形式
* コーデック

#### 適当な配信方法

Pepper 内蔵の FFmpeg, GStreamer で実行可能な配信方法を選択します。
あるいはサポート可能な外部サーバを用意して、Pepper と連携して可能な配信方法を選択します。

* HTTP Live Streaming (HLS)
* MPEG-DASH
* Real Time Streaming Protocol (RTSP)

Pepper 単体では HLS・DASH は難しそう。RTSP はもしかしたら、という感じでしょうか。

### メリット・デメリット

#### メリット

* そこそこの fps は出せるのではないかと思われます。

#### デメリット

* 映像・音声配信に関する知識がそれなりに必要になります。
* 構成要素が多く、そこそこに見られるレベルの組み合わせを探すのが大変。
* ヘタなコマンドを実行すると、Pepper のカメラ機能が停止したり、接続が切れたりします。さらに Pepper の再起動が必要になるケースも発生します。原因は不明。
* 問題なく実行できたような場合でも、カメラに影響が出ているケースがあります。Choregraphe のビデオモニターが表示されなくなったり、映像が乱れたりします。原因は不明。

## 感想

* 何か 2 は大変なだけな感じもしてきましたが、やはりそこそこキレイな映像を見たい。
* もう少し映像・音声関連知識とコマンドの使い方を勉強しないといけない。
Rubyの多次元配列で最初の要素を加工して返したい(tap/break等について)


|問題|http://nabetani.sakura.ne.jp/hena/ord28spirwa/|
|:--|:--|
|シミュレーション (Python/Ruby/C++)|http://qiita.com/cielavenir/items/8c77a158136bd668a27b|
|規則性 (Python/Ruby/C/C#/Java)|http://qiita.com/cielavenir/items/a285b0cea4a26ff886b8|
|規則性 (D/Go/Swift/PHP/ **Vala** )|http://qiita.com/cielavenir/items/edb1daff9ea861a418ec|
|規則性 (VB/F#/Perl)|http://qiita.com/cielavenir/items/0c84af4049ab161f82c1|
|規則性 (PowerShell)|http://qiita.com/cielavenir/items/d9ef9f12068e99e888f2|
|規則性 ( **AIR-lang** )|http://qiita.com/cielavenir/items/d804f61412fb4f07ba06|
|規則性 (Crystal/Perl6)|http://qiita.com/cielavenir/items/13896a662b05da8b77a2|
|Rubyの多次元配列で最初の要素を加工して返したい<br>(tap/break等について)|http://qiita.com/cielavenir/items/3f209351b924e2615f5e|

- ※※※ こちらは、答案のディスカッションで出たネタとなります。 ※※※

「配列coordinatesの最初の要素を、その第一要素に1、第二要素に2を足して返す」という問題を考える。
この問題には複数のアプローチが存在する。

- 普通に1要素ずつ取る
  - 最も移植性が高い
  - タイプが冗長になる

```rb
[coordinates[0]+1,coordinates[1]+2]
```

- 足す数を配列として持ち、混成する
  - ある程度読みやすく、変数名変更に対してロバスト
  - `[[0,-1],[0,1],[-1,0],[1,0]][0]`みたいなのに強い

```rb
coordinates[0].zip([1,2]).map{|e|e.reduce(:+)}
```

- tap/break
  - break値がtapの返し値になることを利用
  - 慣れていないと読みにくい

```rb
coordinates.tap{|e|break [e[0]+1,e[1]+2]}
```

- ~~[find_yield](https://github.com/rubyworks/facets/blob/master/lib/core/facets/enumerable/find_yield.rb)~~ [ergo](https://github.com/rubyworks/facets/blob/master/lib/core/facets/kernel/ergo.rb)
  - 多分一番直感的
  - facets gemが必要になってしまう
  - ~~案1〜3と異なり、`boolean_array.find_yield{|e|!e}`とすると誤作動する。boolean_arrayは多次元配列ではないのでfind_yieldを使おうと思う人はいないと思いますが。ちなみに数値についてはRubyだと0は真なので大丈夫。~~

```rb
coordinates.ergo{|e|[e[0]+1,e[1]+2]}
```

- [yield_self](https://docs.ruby-lang.org/ja/latest/method/Object/i/yield_self.html)
  - Ruby 2.5でよければこれ1択

```rb
coordinates.yield_self{|e|[e[0]+1,e[1]+2]}
```

案3で解いている人がいたので。tap/breakの使い方を知った。
勉強会会場では誤って案1をお薦めしてしまったが、案2にするべきだった--;;
Xamarin Studio で svn のコンフリクトを解決する方法 (未解決)

こんにちは。エクセルソフトの田淵です。

先日 [テスト用に Linux で Subversion を最速で最低限の設定で稼働させる方法 - Qiita](http://qiita.com/ytabuchi/items/d13688503b5da52c14bf) こんなエントリーを書きましたが、これは Xamarin Studio と Visual Studio で svn などの VCS システムでコンフリクトが発生した場合にどう対処するのか？の調査に svn が必要だったからです。こちらが本編です。
Git では試していないのですが、分散管理だからまた別の感じになるのかもしれません。

Windows と Mac で同じレポジトリを見ていて、両方の環境で同じ行を編集してそれぞれで Commit すると、コンフリクトが発生します。Visual Studio が後に Commit したケース、Xamarin Studio が後に Commit したケースを試してみました。

# Visual Studio でコンフリクトを解決する方法

Visual Studio が後だった場合です。開発者の皆様であればご存知かと思いますが XS との比較のために一応動作を記録しておきます。

1. Commit が失敗します。
![tor02.png](https://qiita-image-store.s3.amazonaws.com/0/32453/5896d8b9-d1b5-d890-0bd9-b7dd722c9274.png)

1. Update する？と聞かれるので Update します。
![SvnConflict_VS02.png](https://qiita-image-store.s3.amazonaws.com/0/32453/52b91d79-7293-07c7-f565-7d8c2f59556b.png)

1. VS で何が変わってるのかなどをチェックできます。
![SvnConflict_VS03.png](https://qiita-image-store.s3.amazonaws.com/0/32453/a0afb1f4-5fdf-e38b-e8ea-6c2232883c12.png)

1. ソリューションエクスプローラーから赤く印が付いているファイルを右クリックし ``Edit Text Conflicts``` を選択します
![SvnConflict_VS04.png](https://qiita-image-store.s3.amazonaws.com/0/32453/bfff9edc-e0ae-682e-2635-c8bb836fe0e4.png)

1. 赤い列のチェックボックスを付けるとどっちを採用して結果どうマージされるか？が下のペインでわかるようになっていますので、左上の ```マージの許可``` からマージしてコンフリクト解消です
![SvnConflict_VS05.png](https://qiita-image-store.s3.amazonaws.com/0/32453/b7c48a3a-41b9-0bc9-7b33-3257aafba9b8.png)

手順が分かってさえしまえば簡単ですね。分割ビューでチェックできるのもステキです。

# Xamarin Studio でコンフリクトを解決する方法

1. Commit が失敗します。
![xs_conflict01.png](https://qiita-image-store.s3.amazonaws.com/0/32453/d24ac928-5f97-1c10-8caf-af8ee865b4b9.png)

1. (どうやるか忘れてしまった…ッ！再確認して更新します。)何かしてこの画面にして、対象ファイルを右クリックして ```更新``` をクリックします。(上にある ```最新の状態に更新``` ではなぜか更新出来ないっぽいです…)
![xs_conflict02.png](https://qiita-image-store.s3.amazonaws.com/0/32453/d22eed8d-2f00-f79b-2962-286d1cf4fc14.png)

1. ソリューションからファイルを開くと Visual Studio と同じように何が競合しているのかが分かります。
![xs_conflict03.png](https://qiita-image-store.s3.amazonaws.com/0/32453/b210f574-27b4-8bbe-3496-9cd17765a37f.png)

1. 下の方に Merge というタブが見えるのでクリックすると、やはり Visual Studio と同じようにどの部分でどちらを反映させるか？を ```>>``` や ```<<``` で選べる感じがします。よね…？
![xs_conflict04.png](https://qiita-image-store.s3.amazonaws.com/0/32453/01fb5842-27e5-a614-5bc9-bd442f537872.png)

1. ッ…！！！！！？？？？？
![xs_conflict05.png](https://qiita-image-store.s3.amazonaws.com/0/32453/2c6cd73a-8de2-ec44-2a5d-ff2122f73eb0.png)


バグなのか、仕様なのかは分かりませんが、2015/2/8 現在の Xamarin Studio ではマージは出来ないようなので、3. の時点でどちらを採用するかを確認し、**別のファイルに変更内容をコピーした後で**、```Revert file``` でファイルを戻して、手動で変更内容をアップデートする必要があるようです。
バグっぽいですよねぇ… 報告されてるか？などは確認して追記します。

# Xamarin 気になった方は

是非 [ダウンロード(直接)](http://xamarin.com/download) / [ダウンロード(弊社経由)](https://www.xlsoft.com/jp/products/download/index.html?option=Xamarin&r=ythb) して触ってみてください。
[学習用リソース](http://ytabuchi.hatenablog.com/entry/2014/08/26/191759) や [JXUG リンクページ](http://jxug.org/links.html) に参考資料を纏めてますので併せてどうぞ。

以上です。
ウィンスリー要件定義


サイトリニューアルの前に。

■貴社のビジネス：
貴社のビジネスはデジタルマーケティング業界にて従事している優秀な人材を獲得し。例えば電通系のデジタルマーケティング実務会社等に紹介し、貴社が利益を得る。

■システムの概要/システムの構想

１）本WEBサイトの目的（価値）：
デジタルマーケティング業界に従事しており、転職を希望、もしくは、本WEBサイトを見て転職を喚起させ、貴社WEBサイトに対し問い合わせを起こす。
※貴社WEBサイトに来た問い合わせからの実際の転職というコンバージョンは

２）本WEBサイトにデジタルマーケティング業界の優秀な人材に「ウィンスリー」というブランド認知と、サイト認知、貴社サービス認知を知ってもらう為、情報のHUBとしての機能を持たせる。
（現構想では第一にTwitter拡散から本サイト内のブログ情報的サイトに流す。Google＋からも同様。Facebookは性質が違うためかなり難しいが、Facebookページを活かす事によりFacebookの弱点カバーできる。Goolge系対策はGoogleMyBusinessを活用）

尚転職決定にてのコンバージョンに際してのプロセスは現状通り、貴社代表黒瀬様、貴社関係者にて行う。

■外部システムとの連携

■本サイトはどのように使われるのか
現状、案件紹介、業界情報ブログ等のWEBサイトがあるが、想定どおりの期待値に達していない。そこで、リニューアルをする。
リニューアルの際、増え続けるインターネットユーザーでのデジタルマーケティング業界人材にての転職希望者をウィンスリーにてリーチし、囲い込みをする。または、サイトからの情報により転職を喚起し、転職人材への切り替えを行う。その場合、必ず、ウィンスリーを経由して転職ができる導線を作り、コンバージョン率を上げる。
・案件情報の掲載
・人気のある電通系のデジタルマーケティング子会社に転職したい場合は「ウィンスリー」でという認知度を上げる。
・ソーシャルメディアへのデジタルマーケティング情報のHUBとして機能するようにする。

・システムとの接点

・その時の入出力情報

・システムに必要な機能

・その機能が使用するデータ


その場合の今回のWEBリニューアルにたいして期待していること。

1 ターゲットを明確にする

その為に何を定義する必要があるか。



１）ターゲット人材の明確化を行うことにより、インターネットユーザーでの貴社希望該当人材を狙いうち的な獲得、また獲得数の母数を増やす。
定義要件：そのターゲット層は今どこにいて、どのポジションで働いている人なのか。

貴社が想定している点の確認

・貴社及び貴社のクライアントが求める人物は、今どこにいて、どのポジションで働いている人か
→属性をWEBに反映させるため

・デジタルマーケティング業界で必要などんなスキルを持ち、どのような志向の持ち主が必要なのか

クライアントにも大きく左右されると思いますが、必ず、人材案件にても、必要なスキル・経験があると考えられます。

想定するWEBサイトに掲載する内容として
・「MUST」事項　（業界内でもテクニカル系、企画系・アナリスト系等別れると思いますが）


・「WANT」事項


人材要件定義はスタートします。まずは、募集求人の仕事内容からスキル・経験や志向を「MUST」と「WANT」に分けましょう。
[baserCMS]ユーザー別にアクセス制限設定を調整したいとき


baserCMSでは、ユーザーグループ別に、機能単位や画面単位でアクセス制限を設けて、不要なメニュー表示を調整したり、余分な機能を扱わせないようにすることで、管理システム利用者にとってシンプルで扱い易い管理システムを提供することができます。

- アクセス制限設定の一覧画面URL例: /admin/permissions/index/2
 - システムナビ → ユーザーグループ一覧 → ユーザーグループの鍵アイコンへアクセス

この **アクセス制限設定は、ユーザーグループ単位** となっているため、ユーザー単位で調整するには少しカスタマイズが必要です。
その方法ができたんでシェア。イベント処理使って調整できます。


## 必要な状況
- baserCMSのアクセス制限設定を、ユーザー単位で調整入れたいとき
 - 例: Aグループでは固定ページ機能を許可するが、Aグループ内のhogeユーザーには許可したくない場面


## 環境

- baserCMS 3.0.6.1
- PHP 5.4.19


## 前提条件
- ユーザーグループでのアクセス制限設定の調整を行っていることが前提
- 紹介しているやり方はプラグイン・イベント

## ファイルの作成
プラグイン内に ModelEventListener 作ります。

- /app/Plugin/HogePlugin/Event/HogeModelEventListener.php

```php
<?php
/**
 * [ModelEventListener] Hoge
 *
 */
class HogeModelEventListener extends BcModelEventListener {
/**
 * 登録イベント
 *
 * @var array
 */
	public $events = array(
		'Permission.afterFind',
	);

/**
 * permissionBeforeFind
 * ユーザーIDが2のユーザーでは固定ページ管理へのアクセスを不可にする
 * 
 * @param CakeEvent $event
 */
	public function permissionAfterFind(CakeEvent $event) {
		$Model = $event->subject();
		if (!BcUtil::isAdminSystem()) {
			return;
		}

		$user = BcUtil::loginUser();
		if ($user['id'] != '2') {
			return;
		}

		foreach ($event->data[0] as $key => $permission) {
			if ($permission['Permission']['url'] == '/admin/pages/*') {
				$event->data[0][$key]['Permission']['auth'] = false;
			}
		}
	}
	
}
```


### 何をやっているの？
アクセス制限設定は、/lib/Baser/Controller/BcAppController.php の beforeFilter() でチェックされており、beforeFileter() では、Permissionモデルの check() が走ってます。
check() では、ログイン中ユーザーのユーザーグループIDから、そのユーザーグループのアクセス制限設定の全データを取得してます。
そのため、find したあとのタイミングを利用して、ユーザーIDをもとに、取得したアクセス制限設定の中身を書換えることで、任意のユーザーIDのアクセス制限を設けることを実現してます。


### その他のアプローチ
- ID判定じゃなくても、ユーザーアカウント名での判定でも良い
- 権限設定の1行分のデータを配列で作成して追加するやり方でも良い
 - けど、グループで既に設定済みのを使う方がラクだよね
[baserCMS]アップローダを有効化してもアップローダ側のJSでSyntaxErrorが出て動かない場合


アップローダプラグインを有効化したbaserCMSをサーバに設置した際に、まれーに、
```SyntaxError: Unexpected end of input```
というエラーが出て、アップローダが正常に動作にしない場合があります。


## 発生状況

1. サーバ上にbaserCMSを設置して、Uploaderをインストールして有効化する
2. 記事編集画面にアクセスし、アップロード用のボタンをクリックすると画面真っ白け

### 環境

- Kagoya: http://www.kagoya.jp/
 - PHP 5.4.24
 - baserCMS 3.0.5.1


## 原因

Chromeで確認すると uploader_list.js と ckeditor_uploader.js で「SyntaxError: Unexpected end of input」が発生している。

- /Plugin/Uploader/webroot/js/ckeditor_uploader.js
- /Plugin/Uploader/webroot/js/uploader_list.js


## 対処
上記の原因となる対象ファイルを作り直すと解消できました。
単純に上書きではなく、直接ファイルを開いて、ソースをコピペして保存し直し。

- /Plugin/Uploader/webroot/js/ckeditor_uploader.js
- /Plugin/Uploader/webroot/js/uploader_list.js


まれーにこんなことあるとひでぶしますね。
[MQL4] DST (サマータイム) 判定

ちょっと前になりますが、Twitterを見ていたらサマータイムの判定をどうするかという話が出ていました。
鬱陶しいですよね、サマータイム。
私はどんな理由を付けられても時計をずらすことには賛成できません。

時間帯による特性を気にされる方はみなさん独自に対処しておられると思いますので今さらですが、私の判定関数も晒しておきます。

米国式2006年以前や英国式にも対応しています。
英国式はアルパリで使うためだったんですけど(泣)

```mql4:MQL4

bool IsDST(datetime CurrentTime, bool IsUK){
   datetime StartDate;
   datetime EndDate;
   bool DST;
   
   string CurrentYear = (string)(TimeYear(CurrentTime));

   if(!IsUK && (int)CurrentYear >= 2007){
      StartDate = (datetime)(CurrentYear + ".3." + (string)(14 - TimeDayOfWeek((datetime)(CurrentYear + ".3.14"))));
      EndDate = (datetime)(CurrentYear + ".11." + (string)(7 - TimeDayOfWeek((datetime)(CurrentYear + ".11.7"))));
   }else{
      if(IsUK){
         StartDate = (datetime)(CurrentYear + ".3." + (string)(31 - TimeDayOfWeek((datetime)(CurrentYear + ".3.31"))));
      }else{
         StartDate = (datetime)(CurrentYear + ".4." + (string)(7 - TimeDayOfWeek((datetime)(CurrentYear + ".4.7"))));
      }
      
      EndDate = (datetime)(CurrentYear + ".10." + (string)(31 - TimeDayOfWeek((datetime)(CurrentYear + ".10.31"))));
   }


   if(CurrentTime >= StartDate && CurrentTime < EndDate) DST = true;
   else DST = false;
   
   return(DST);
}

```
Rictyのインストール（MAC yosemite）


RictyDiminished使うのが楽だけど
Rictyのインストール方法をメモしておく

brewのインストールは割愛

http://levien.com/type/myfonts/inconsolata.html
OpenTypeFileクリック

http://mix-mplus-ipa.sourceforge.jp/migu/
migu 1mダウンロードをクリック

解凍したファイルを/Library/Fontsに移動

```
brew install caskroom/cask/brew-cask
brew cask install xquartz
brew install fontforge
git clone https://github.com/yascentur/Ricty.git
cd Ricty
./ricty_generator.sh auto
mv *.ttf /Library/Fonts/
```
Linuxで、直下のディレクトリーの使用量を見る

```console
$ du -d1
897248  ./alpha
16648   ./bravo
328536  ./charlie
137872  ./delta
662032  ./echo
8       ./mbox
```

大きい順に並び替えて、スクロールとかできるようにする。

```console
$ du -d1|sort  -nr|less
897248  ./alpha
662032  ./echo
328536  ./charlie
137872  ./delta
16648   ./bravo
8       ./mbox




:
```
手っ取り早く管理者権限のメモ帳などを起動する


1. `Win`キーを押してスタートメニューもしくはModernUIを開く
(Winキーが付いてない場合は `Ctrl`+`Esc`)

2. 「`notepad`」や「`cmd`」など起動したいものを入力
(Win8の場合入力欄出てませんがそのまま打てます)

3. `Ctrl`+`Shift`+`Enter` で起動
(Win8で検索結果画面が出てきた場合はそっちの画面で`Ctrl`+`Shift`+`Enter`です)

管理者権限のメモ帳に関してはたぶんhosts弄る目的だと思いますので
`notepad drivers\etc\hosts` とファイル名まで打ってしまうのが早いと思います。(System32などは省略できます)

※これはWin7/Win8向けの操作で、XPでは「ファイル名を指定して実行」から同じことが行えていました。

※Win8.1のコマンドプロンプトに限ってはスタートボタン右クリックメニューに便利なのが居ます。

※hostsはよく使うので大抵どこかにショートカット作ってあるんですが、稀に他人のPCで触ったりするのでそんな時のためです。
$_と関数型Perl

Perlの関数には引数を省略した場合に`$_`が引数として与えられたものとして振る舞う関数があるが、この性質を使うと気持ち悪いほどHaskellっぽいコードをPerlで書くことができる。

逆に、自分のようなPerlプログラマーがHaskellに入門する時は、「あーここでは`$_`が省略されてんのね」って考えるとポイントフリー記法とか理解しやすいと思った。

# map

まずは基本中の基本のmap。

**Perl**

```perl
$, = ",";  ## リスト出力のセパレータ (以下同様)
$\ = "\n"; ## 出力行の末尾 (以下同様)

my @fruits = qw(apple orange strawberry);

print map { length } @fruits;  # => 5,6,10
```

**Haskell**

```haskell
fruits = ["apple", "orange", "strawberry"]

main = print $ map length fruits  -- => [5,6,10]
```

Perlは無名関数のブロック記法と`$_`の省略により、極限までHaskellに近くなっている。

# grep / filter

正規表現によるフィルタリング。

**Perl**

```perl
my @fruits = qw(apple orange strawberry);

print grep { /berry/ } @fruits; # => strawberry
```

**Haskell**

```haskell
import Text.Regex.PCRE

fruits = ["apple", "orange", "strawberry"]

main = print $ filter (=~ "berry") fruits  -- => ["strawberry"]
```

Haskellで正規表現を使うには外部ライブラリをimportする必要がある。

Perlではマッチング演算子(`=~`)ごと省略する。こうして見るとやはりPerlでは正規表現が優遇されている。

# for

for文。

**Perl**

```perl
my @fruits = qw(apple orange strawberry);

for (@fruits) { print }
## => apple
## => orange
## => strawberry
```

**Haskell**

```haskell
import Control.Monad

fruits = ["apple", "orange", "strawberry"]

main = forM_ fruits putStrLn
-- => apple
-- => orange
-- => strawberry
```

これは非常によく似ている。


# join / intercalate

文字列処理では頻出の、mapからのjoinパターン。`join`は`$_`を使うわけではないが、これもPerlとHaskellでだいぶ書き方のパターンが似てくる。

**Perl**

```perl
my @fruits = qw(apple orange strawberry);

print join ":", map { uc } @fruits; ## => APPLE:ORANGE:STRAWBERRY
```

**Haskell**

```haskell
import Data.List (intercalate)
import Data.Char (toUpper)

fruits = ["apple", "orange", "strawberry"]

uc = map toUpper

main = print $ intercalate ":" $ map uc fruits -- => "APPLE:ORANGE:STRAWBERRY"
```

Perlの`join`関数と同等のHaskell関数は`intercalate`という、聞いたこともないような英単語の関数である(自分はこれの名前が分からなくて数十分、Hackageをウロウロしたことがある)。

また、`Data.Char.toUpper`は`Char`を対象とする関数なので、`String`を対象とするには`map`で持ち上げる必要がある。

# reduce / foldl

リストを連想配列に変換する。

**Perl**

```perl
use List::Util qw(reduce);
use Data::Dumper;

my @fruits = qw(apple orange strawberry);

print Dumper reduce { push @{$a->{length($b)}}, $b; $a } {}, @fruits;
## => $VAR1 = {10 => ['strawberry'], 6 => ['orange'], 5 => ['apple']};
```

**Haskell**

```haskell
import qualified Data.Map as M

fruits = ["apple", "orange", "strawberry"]

main = print $ foldl (\a b -> M.insertWith (++) (length b) [b] a) M.empty fruits
-- => fromList [(5,["apple"]),(6,["orange"]),(10,["strawberry"])]
```

ここまで来るとちょっと無理があるかな・・・しかも`$_`使ってないし。。

Perlのコードではハッシュ要素(`$a->{length($b)}`)に対していきなり`push`しているが、まだ要素がない場合でもautovivificationにより勝手に配列を生成してくれる。

Haskellでこういったことをやるには`insertWith`関数が便利だ。これは挿入するキーに対応する要素がMap内にまだ存在しない場合は指定の値をそのまま突っ込み、存在する場合は指定の関数(今回の場合は`(++)`)で既存の要素と新規要素を結合する。

あと、Perlではハッシュオブジェクトは組み込みで使えるが`reduce`はimportする必要がある一方、Haskellでは`foldl`は組み込みで使えるものの連想配列をimportする必要があるあたりが面白い。
lolipopでpythonの日本語を表示する方法

LolipopでPythonのCGIを動かすと
どうやら普通にprint文で日本語を記述してもエラーになって表示できない。

#原因
標準出力がパイプ扱いになってエンコードの指定が無視されてらしい

```wk.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, locale, codecs

print "Content-Type: text/html\n\n"
print 'sys.stdin.encoding:      %s\n\n' % sys.stdin.encoding
print 'sys.stdout.encoding:     %s\n\n' % sys.stdout.encoding
print '%s\n\n' % sys.getfilesystemencoding()
print '%s\n\n' % sys.getdefaultencoding()
print '%s\n\n' % sys.stdin.encoding
print '%s\n\n' % sys.stdout.encoding
print '%s\n\n' % sys.stderr.encoding
```

を実行すると、下記の結果になる。

```
sys.stdin.encoding: None
sys.stdout.encoding: None
ANSI_X3.4-1968
ascii
None
None
None
```

#解決策
強制的にエンコードを使って、print文の出力先の変更する。

```
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, locale, codecs
print "Content-Type: text/html\n\n"

wk = u"日本語を表示"

Writer = codecs.getwriter('utf-8')
stdout = Writer(sys.stdout)
print >>stdout, u"%s" % (wk) 
```

結果として下記の行が表示される。

```
日本語を表示
```
AWS Classic Linkのネットワークパフォーマンスをnetperfで簡単に計測してみた

# 背景
今、[うちの会社（Gengo）](http://gengo.com/ "Gengo")では、いくつかのClassic EC2インスタンスをVPCに移行する作業を行う必要があります。どういうように移行するのがいいのかに関しては、いくつかのベストプラクティスのような物が公開されており、昨年のre:Invent 2014でもそのためのセッションがいくつか存在しました。そういった折、AWSの方で[「Classic Link」](http://aws.typepad.com/aws_japan/2015/01/classiclink.html)という新機能が発表され、これはシームレスな移行には持って来いだと感じ、さっそく使おうと考えたのですが、その前に、[「Classic Link」](http://aws.typepad.com/aws_japan/2015/01/classiclink.html)のネットワークパフォーマンスってどの程度なのか軽く知っておきたいと感じました。

# 前提
* リージョン
  * Virginia （うちの会社で使ってるので）
* インスタンス
    * m3.midiumで全統一（Classic EC2インスタンスもあるので）
* OS
    * Ubuntu 14.04
* 配置
    * アクセス元
        * AZ-Aに配置
    * アクセス先
        * AZ-Eに配置
    * AZ-AとAZ-Eに一台ずつClassic EC2インスタンスを配置
    * AZ-AとAZ-Eにサブネットをそれぞれ持つVPCを配置。
        * サブネットはプライベートサブネット
    * それぞれのサブネットに一台ずつVPC EC2インスタンスを配置。
        * EIPもなく外部からはアクセス不可
    * 作成したVPCとアクセス元であるAZ-AのClassic EC2インスタンスの間にClassic Linkを作成する。

# テスト方法
![Classic Link test plan network.png](https://qiita-image-store.s3.amazonaws.com/0/26290/2f67098d-ece0-71c0-6901-4e9cc08c67b9.png)

* テスト#1
    * Classic EC2 => Classic EC2
    * Classic EC2どおしのグローバルIPを使った通信テスト
* テスト#2
    * Classic EC2 => VPC EC2
    * グローバルIPを持ったClassic EC2からClassic Linkを通してVPC内のプライベートIPしか持たないEC2インスタンスへの通信テスト
* テスト#3
    * VPC EC2 => VPC EC2
    * VPC内のインスタンス通しの通信テスト
* netperfを使い簡単にThroughputとLatencyをテスト。上記テストを各10回ずつやり、その平均を比較。

### Throughput（例）

```bash

netperf -f M -H cl-test-classic-app-02
```

### Latency (例)

```bash

netperf -t omni -H cl-test-classic-app-02 -- -d rr -T TCP -k MIN_LATENCY,MEAN_LATENCY,MAX_LATENCY
```

# テスト結果

### Throughput

| Test | Result Average (MB/Sec)|
|:----:|:----------------------:|
|Classic EC2 => Classic EC2|44.272|
|Classic EC2 => VPC EC2 (Classic Link)|43.41|
|VPC EC2 => VPC EC2 (VPC Inside)|45.864|


### Latency

|Test | Result Average (Microsec)|
|:---:|:------------------------:|
|Classic EC2 => Classic EC2|1246.827|
|Classic EC2 => VPC EC2 (Classic Link)|884.26|
|VPC EC2 => VPC EC2 (VPC Inside)|877.985|


# 感想
* それぞれのテスト10回の平均ではあるが、10回それぞれの中でもばらつきはほとんどなかった。
* もちろんもっと正確かつ詳細に調べることはできると思うが、この簡単なテストから見ても、Classic Linkは特に大きくネットワークパフォーマンスが劣るようなところは見られなかった。
Windows用パッケージ管理ソフトChocolateyは神

Windows 8.1 での[HHKB設定](http://qiita.com/hachi8833/items/c7e45c926647c80ce690)が解決したので、今度は Linux 環境というか bash シェル環境を作ることに。cygwinが重たいという話をあちこちで見かけたので、それを避けてもっと軽いものをいろいろ探した。

久々の Windows 環境なので、試行錯誤の上以下のものをインストールしてみた。

- [GOW](https://github.com/bmatzelle/gow/wiki) -- 軽量なシェル環境
- [Clink](http://mridgers.github.io/clink/) -- タブ補完など
- [ConEmu](http://tech.nitoyon.com/ja/blog/2014/03/07/fancy-git-bash/) -- ターミナルソフト

参考: [僕が思う最強のWindowsコマンドプロンプト](http://d.hatena.ne.jp/necoyama3/20140313/1394689366)
# Chocolateyですべてインストール

しかしその後に[Chocolatey](https://chocolatey.org/)というWindows環境用のパッケージ管理ソフトを知って、上のソフトは全部Chololateyでインストールする方が幸せになれることがわかった。何しろ Evernote や Firefox までインストールできてしまうのだから。その気になればcygwinもインストールできる。

そこでさっきのソフトはいったんすべて削除し、Chocolateyをインストールしてからインストールし直した。`choco search <ソフト名>`で探し、`choco install <ソフト名>`でインストールするだけ。[Webサイト](https://chocolatey.org/packages)で検索してもよい。

これでMacのHomebrew並にパッケージを使えるようになった。GitもRubyもRubygemsもBoot2DockerもpecoもThe Silver Searcherもインストールできる。Rubyがまだ2.2になっていないなど、バージョンがあまり新しくないのが少し残念ではあるけど。

# 注意

ここでいくつか注意。

- Chocolateyをインストールする方法はトップページに書いてあるとおりにすればよいのだけど、インストールするときにはコマンドプロンプトまたはPower Shellは「管理者として実行」しないこと。そして以後は逆にコマンドプロンプトを「管理者として実行」してそこで作業する。自分はConEmuを使っているのでConEmuを「管理者として実行」で起動している。
- Gowでどうしてもbash自身が起動できず、はまった。実は[Gow のインストールディレクトリにetcディレクトリを作成しておく必要があった](http://vogel.at.webry.info/201409/article_11.html)。

# 今後の課題

- ConEmuのフォントが汚いのを直したい
- UTF-8の日本語が化けるのを直したい

たぶん割りとしょうもないところではまっていると思われる。
PreferenceActivityで区切り線の色を変える方法

res/valuesの中に、prefs_custom.xmlなどの名前を付けてstyleファイルを作ります。

中身に以下を書きましょう。

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="prefs_custom" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:listViewStyle">@style/ListView</item>
</style>
<style name="ListView" parent="@android:style/Widget.Holo.Light.ListView">
<item name="android:divider">#EEEEEE</item>
<item name="android:dividerHeight">1px</item>
</style>
</resources>
```


これをManifestで実行すれば反映されます。

**ハマったこと**
色だけ指定して、
`
<item name="android:dividerHeight">1px</item>
`
を書かないとラインが消えます。
RStudio から shinyapps.io に簡単にデプロイできるようになってた件 #rstatsj

Shiny アプリのホスティングサービス shinyapps.io について以前記事を書いたのですが、デプロイするのが結構面倒でした。

- [RStudio Shiny ホスティングサービス ShinyApps.io の使い方](http://qiita.com/hoxo_m/items/c71beb71386f10272378)

しかし、最近気付いたのですが、RStudio で Shiny アプリを開発していると、上の方に Publish というボタンが出てきます。

![shinyapps_deploy1.png](https://qiita-image-store.s3.amazonaws.com/0/2570/6386d9e8-963c-7bc4-58da-3a58f2f7a011.png)

これを押すと、shinyapps.io に一発でデプロイできるようになっていました。

![shinyapps_deploy.png](https://qiita-image-store.s3.amazonaws.com/0/2570/ced80b18-9b7f-281c-b17c-229aea66d067.png)

便利ですね！

### 追記

@teramonagi さん情報によると、`app.R` ではこのボタンが表示されないということです。
確認しましたが、その通りのようです。
`ui.R` と `server.R` がないと、Run App ボタンすら表示されません。
RStudio の次期バージョンに期待しましょう。
scalaz - Task

## Task

[前回のFuture](http://qiita.com/ryoppy@github/items/d896c0b577b6edee9dbd)に続き、今回はscalaz.concurrent.Taskを見てみよう。

Taskは、scalaz.concurrent.Future(以下Future)の例外処理を扱う版だ。([ソースコード](https://github.com/scalaz/scalaz/blob/series/7.1.x/concurrent/src/main/scala/scalaz/concurrent/Task.scala))

```scala
class Task[+A](val get: Future[Throwable \/ A])
```

Futureは例外が起きてもスルーされるみたいだ。

```scala
scala> Future("a".toInt).start
res1: scalaz.concurrent.Future[Int] = Suspend(<function0>)
```

scala.concurrent.Future(以下scala.Future)も例外処理を扱うので、scala.Futureの代わりに使うならTaskだ。

## 使ってみよう

run: 同期実行。例外が飛ぶ。runAsyncで非同期。

```scala
scala> Task("a".toInt).run
java.lang.NumberFormatException: For input string: "a"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
...
```

attemptRun: 同期実行し\/で取得できる。

```scala
scala> Task("a".toInt).attemptRun
res5: scalaz.\/[Throwable,Int] = -\/(java.lang.NumberFormatException: For input string: "a")
```

非同期にattemptRunする場合は、attemptしてrunAsync。

```scala
scala> Task("a".toInt).attempt.runAsync { case \/-(a) => println(s"success $a") case -\/(e) => println(e) }

success -\/(java.lang.NumberFormatException: For input string: "a")
```

handleWith: エラーハンドル。

```scala
scala> Task("a".toInt).handle { case e: Throwable => 0 }.run
res16: Int = 0
```

or: 失敗したら渡したTaskを返す。

```scala
scala> Task("a".toInt) or Task(1) attemptRun
res20: scalaz.\/[Throwable,Int] = \/-(1)
```

もちろんforも使えるので、順番に実行できる。

```scala
scala> for { a <- Task(1); b <- Task("b".toInt) } yield a + b
res21: scalaz.concurrent.Task[Int] = scalaz.concurrent.Task@758debda

scala> .attemptRun
res22: scalaz.\/[Throwable,Int] = -\/(java.lang.NumberFormatException: For input string: "b")
```

scala.Futureと違って都度forkしないので効率的なはず? というかそもそもcompleteしてから次の処理を実行するからforkする必要ないし、スタックレスなトランポリンは最適なのか。

まとめて結果を取得するものもある。この辺はFutureと同じ。

```scala
scala> Task.gatherUnordered { Task(1) :: Task(2) :: Task(3) :: Nil }.run
res33: List[Int] = List(1, 2, 3)
```

こけた場合

```scala
scala> Task.gatherUnordered { Task(1) :: Task("a".toInt) :: Task(3) :: Nil }.attemptRun
res35: scalaz.\/[Throwable,List[Int]] = -\/(java.lang.NumberFormatException: For input string: "a")
```

ほとんどの場合、Taskを使うことになるんじゃないだろうか。

細かいところまで見れてないが、今日はここまで。
セキュリティエンジニア向けツール（Linux編）

すぐ使えるインシデントレスポンス用の汎用的なツールを主に書いています。
フォレンジックやバイナリ・プロトコル解析，ペネトレーションテストなど
専門性の高いツールについては，触れていません．すみません．
Windows編は[こちら](http://qiita.com/osada/items/4e5965e6cebc74633de4)

(3月完成予定)

---
**疎通確認** nping http://nmap.org/nping/
任意のパケットを定期的に送ることが可能．nmapのサブセット．
pingで用が足りず，telnetが面倒なときに利用すると便利．
最近は開発が止まっているらしく，hping3の方が高機能．

**経路確認** mtr http://www.bitwizard.nl/mtr/
tracerouteを何度も繰り返すことで，RTTの統計値を取得するツール．
割と高負荷になるため，利用時は注意．

**パケットスニファ** dsniff http://www.monkey.org/~dugsong/dsniff/
タップやミラーポートが使えない環境で，パケットをスニファするツール．
ARP偽装をするため，本番環境での利用は要注意．悪用厳禁．

**認証情報確認** ettercap http://ettercap.github.io/ettercap/
認証情報（ユーザ名やパスワード）が安全な状態でネットワーク通信されているか
確認するためのツール．Windowsでも動くらしい．これもARP偽装する．

**疎通確認（その２）** nc (netcat / ncat) http://netcat.sourceforge.net/
即席のエコーサーバ．-lオプションでサーバとして動く(LISTEN)．-pでポート指定．
クライアントとして使う場合は，httpリクエスタで便利．catと同じように使う．
名前がいろいろあるのは，バージョン？の違いらしい．学習にも使える．

**パスワード安全性確認** John the Ripper http://www.openwall.com/john/
LinuxやUNIXで設定されているパスワードの強度を確認するためのツール．
shadowファイルを使っている場合は，同梱のunshadowを使ってから，johnを使う．
\> unshadow /etc/passwd /etc/shadow | john 的な．

**ハニーポット** dionaea http://dionaea.carnivore.it/
未使用のIPアドレス宛てに到着した不審なパケットを収集するツール．攻撃者の存在や手口を知るためのツール．
作りこみが必要だが，プロトコルごとに特定に応答パケットを送ることも可能．
インタラクティブな応答生成には向かない．（できなくはない）

**ネットワークスキャナ** nmap
ネットワークの脆弱性（不要なオープンポートなど）を発見することができる．
最近はＯＳのバージョンやアプリケーションのバージョンを調べるオプションが標準である．
調査にはそれなりの帯域を使うことがあるので，よく理解してから使うこと．
 -o: OS検知
 -v: アプリケーションのバージョン　など
ためしに使ってみたいときは，"scanme.nmap.org"宛てにスキャンしてみるとよい．
（高負荷のかかるスキャンはＮＧ） 

**脆弱性スキャナ**
* Nexpose Rapid7社の脆弱性スキャナ．Community（無償）版は32IPまで使用可能．仕事で使う場合は，Enterprise版がおすすめ．３０日は無償トライアル可能．
* Nessus 個人で使用するときは無償．
* OpenVAS NessusからForkしたオープンソース版．ただ，NessusはFork後，コードを書き直したそうで，共有しているコードはないとのこと．クラサバで運用．

**無線LAN調査（アクティブスキャン）** NetStumbler http://www.netstumbler.com/
無線LANを可視化するツール．あるメッセージを発信すると，辺り一帯が通信でなくなるので，その調査などで使用する．

**無線LAN調査（ステルススキャン）** Kismet https://www.kismetwireless.net/
無線の傍受のみを行う．通常はこちらを行って調査．どうしても必要な時に，アクティブスキャンを行う．

**Bluetoothスキャナ** Bluescanner http://sourceforge.net/projects/bluescanner/
最近はBluetoothから情報漏洩が起こることもあるので，利用状況を調査するためのツール．
但し，Bluetooth通信していないときには見つけることができない．
Javaで動くため，Windowsでも動作可能．

**WEP調査ツール** WEPWedgie http://sourceforge.net/projects/wepwedgie/
無線LANでWEPを使っている場合，簡単に暗号を解くことができる．
WEPは使わないようにしましょう．
helm-buffers-listとhelm-migemo


[Emacs - helm-migemoでさらにはまった - Qiita](http://qiita.com/duloxetine/items/6713737ae87d647e0083)
で偽りの解決をしました。

まずその解決では他のhelmコマンド ```helm-find-files``` などでの
挙動がおかしくなってしまいます。補完が効かなくなってしまいます。

これはまずい。ということで ```helm-buffers-list``` の時だけ
helm-migemoが使えるようにしてみました。

```el
(defun helm-compile-source--migemo (source)
  (if (not (featurep 'migemo))
      source
    (let* ((match-identity-p 
            (or (assoc 'candidates-in-buffer source)
                (equal '(identity) (assoc-default 'match source))))
           
           (matcher 'helm-mp-3migemo-match)
           (searcher (if (assoc 'search-from-end source)
                         
                           'helm-mp-3migemo-search-backward
                         'helm-mp-3migemo-search)))
      (cond (helm-use-migemo
             `((delayed)
               (search ,@(assoc-default 'search source) ,searcher)
               ,(if match-identity-p
                    '(match identity)
                  `(match ,matcher ;; helm-string-match-with-migemo))
                          ,@(if (eq (cdr (assoc 'match source)) 'helm-buffers-list--match-fn)
                               '(helm-string-match-with-migemo)
                              (assoc-default 'match source))))
               ,@source))
            ((assoc 'migemo source)
             `((search ,searcher)
               ,(if match-identity-p
                    '(match identity)
                  `(match ,matcher))
               ,@source))
            (t source)))))
(add-to-list 'helm-compile-source-functions 'helm-compile-source--migemo t)
```

なんかその場限りの解決ですけれども。

でもう一つの偽りの解決というのは ```helm-buffers-list--match-fn``` がかなり労作の関数なんですね。
なんかバッファのモードで絞り込めるようにコメントが書かれているのです。でもhelm-migemoの環境ではそれも動作しない。

なので、偽りの解決とは承知しつつ、バッファの名前だけでmigemoが使えればいいやと割り切りました。
CentOS7にPHP5.6をインストールする。


remiのrpmパッケージを使ってインストールを進めていく。
前提として、CentOSにはPHP5.4など古いバージョンがインストールされていない想定です。

##epelとremiのリポジトリをインストール
リポジトリをインストールします。
※URLはリンク切れしていないか確認しましょう。

```
$ sudo rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```
##PHP5.6のインストール
yumからPHP5.6をインストール

`$ sudo yum install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof`


##インストール後の確認
PHPのバージョンの確認をしておく

```
$ php --version
PHP 5.6.5 (cli) (built: Jan 21 2015 17:39:53) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.7, Copyright (c) 2002-2015, by Derick Rethans
```
PHPファイルでJavascpritを使ってコンソールデバックしたいとき

対象ファイルに以下のコードを入れる。

```php
<?php

echo <<<EOM
<script type="text/javascript">
  alert( "debug" )
</script>
EOM;

?>
```

用途としては例えばフォームの確認画面へ遷移しているのかしていないか確認したいときなど。画面上は同じに見える場合、コンソールを使用すると便利です。

Javascriptではなく直接PHPを利用した簡単なコンソール出力デバックの方法などあれば教えていただけると幸いです。
cloudinary multiple fileupload field

Default cloudinary js will trigger upload event on every file upload fields (selected with ```"input.cloudinary-fileupload[type=file]"```). To solve this, we just need to add ```each``` and ```dropzone``` option.

change:

```js:jquery.cloudinary.js
$("input.cloudinary-fileupload[type=file]").cloudinary_fileupload();
```
to

```js:jquery.cloudinary.js
$("input.cloudinary-fileupload[type=file]").each(function() {
 $(this).cloudinary_fileupload();
})
```

and in the cloudinary_fileupload function, add ```dropZone``` option. From:

```js:jquery.cloudinary.js
if (initializing) {
      options = $.extend({
        maxFileSize: 20000000,
        dataType: 'json',
        headers: {"X-Requested-With": "XMLHttpRequest"},
      }, options);
    }
```
to

```js:jquery.cloudinary.js
if (initializing) {
      options = $.extend({
        maxFileSize: 20000000,
        dataType: 'json',
        headers: {"X-Requested-With": "XMLHttpRequest"},
        dropZone: this // <-- this
      }, options);
    }
```
CircleCIでherokuのprebootの設定を自動で行う


## Motivation
migrationが不要な場合はprebootを有効にしたい

## Solution

とりあえず動く版。

理想としては以下2つですが、

- ~~NEED_MAINTENANCE_MODEをscriptから直に取得する~~
- NEED_MAINTENANCE_MODEをGlobalな環境変数とする

circleciのmachine/environmentには動的に値を設定出来ないっぽいので悩んでいます。

注意事項として、testコマンドを利用するとfalseの場合にCircleCIの処理が終了してしまうのでifかcaseを利用しましょう。

```bash:script/circleci.sh
#!/bin/bash

# get compare SHA1
compare_url=$CIRCLE_COMPARE_URL
compare_ids=${compare_url#*compare/}

# set NEED_MAINTENANCE_MODE if schema.rb is changed
if git diff --name-only $compare_ids | grep -q 'schema.rb'; then
  echo 1
else
  echo 0
fi
```

```circle.yml
deployment:
  production:
    branch: master
    commands:
      - NEED_MAINTENANCE_MODE=`./script/circleci.sh`; if [ $NEED_MAINTENANCE_MODE -eq 1 ]; then heroku features:disable preboot --app production; else heroku features:enable preboot --app production; fi
      - NEED_MAINTENANCE_MODE=`./script/circleci.sh`; if [ $NEED_MAINTENANCE_MODE -eq 1 ]; then heroku maintenance:on --app production; fi
      - NEED_MAINTENANCE_MODE=`./script/circleci.sh`; if [ $NEED_MAINTENANCE_MODE -eq 1 ]; then heroku scale worker=0 --app production; fi
      - git push -f git@heroku.com:production.git $CIRCLE_SHA1:refs/heads/master
      - NEED_MAINTENANCE_MODE=`./script/circleci.sh`; if [ $NEED_MAINTENANCE_MODE -eq 1 ]; then heroku run 'rake db:migrate' --app production; fi
      - heroku run 'rake db:seed' --app production
      - NEED_MAINTENANCE_MODE=`./script/circleci.sh`; if [ $NEED_MAINTENANCE_MODE -eq 1 ]; then heroku maintenance:off --app production; fi
      - NEED_MAINTENANCE_MODE=`./script/circleci.sh`; if [ $NEED_MAINTENANCE_MODE -eq 1 ]; then heroku features:enable preboot --app production; fi
```
bash > 1つ目以外の引数全部を変数として取得する > echo $@ | sed "s/$1//g"

    $ bash test_exec 1 2 3
と実行した時、"1 2 3"という引数を取得したい時があった。

```bash:test_exec
#!/bin/env bash

params_2nd_later=$(echo $@ | sed "s/$1//g")
echo $params_2nd_later
```

上記でできるようだ。

引数1だけ空文字にするということをしている。
bash > 文字列を1行目として追加する > sed -i '1s/^/line to insert\n/' test.txt

「line to insert¥n」という文字列を一行目としてtest.txtに追加するには、以下のようにするようだ。

    $sed -i '1s/^/line to insert\n/' test.txt


Link: [Ten tips for wonderful bash productivity](https://developer.atlassian.com/blog/2015/02/ten-tips-for-wonderful-bash-productivity/)

<hr>
上記をもとにbash scriptを作ってみた。

```bash:add_line_exec
#!/bin/env bash

ops="1s/^/$2\n/"
sed -i $ops $1
```
を
  
    $ bash add_line_exec test.txt add_this_please
とすると`add_this_please¥n`が`test.txt`に追加される。

2個目以降の引数すべてを追加できるようにすれば便利そうだが、`$2`の部分をどう変えればいいか、よくわかっていない。
golang-goclipseの環境設定メモ

goclipseは非常に使い易いですが、環境設定が上手く行かないと補完出来ないなどの問題がありましたので、設定時のメモを残します。

###gcc,gdb環境

一部のgo のbuildには、gccが必要になります。またDebugにはgdbが必要ですが、Windows環境で上手く動かないものもあります。

win-builds http://win-builds.org/ が非常に簡単に Install出来、相性が良かったです。

![win-builds1.jpg](https://qiita-image-store.s3.amazonaws.com/0/20387/791cb4b7-fda0-f059-d242-18d630a36e62.jpeg)


画面から必要なものを選んで、ボタンを押すだけです。

###コード補完について

gocodeを使えば上手く補完出来ます。このInstall方法は下記の通りです。

go get -u github.com/nsf/gocode

go build github.com/nsf/gocode

これで作成された gocode.exeをEclipseで指定すれば補完される様になります。

###テストの実行について

EclipseのExternal Toolに登録しておくと簡単です。

Locationに go.exeを設定します。

working DirectoryにGOPATHのDirectoryを設定します。

Argument.のサンプルは下記の通りです。

test -v github.com/mikeshimura/...
_.forEachをCoffeeScriptで使うときの注意点



## tl;dr
もったいぶって書いてますが、`CoffeeScript`の関数の最後の値がなんであっても`return`されます。
`_.forEach`であればコールバックで`return false`されると巡回が終わってしまう。これに最後の行に`bool = false`的なものを書くと`return bool = false`となり、意図せず`false`が`return`されてしまうので、気を付けましょう。

## lodashの_.forEachがすべての要素を巡回しない問題
例えば全部の`active`プロパティを`false`にしようとします。

```coffeescript:example.coffee
describe '_.forEach', ->
    objects = null

    beforeEach ->
        objects = [
            id: '1'
            active: true
        ,
            id: '2'
            active: true
        ,
            id: '3'
            active: true
        ]
```

### case1
```coffeescript:example.coffee
    it 'should make all inactive', ->
        _.forEach objects, (obj)->
            obj.active = false

        expect object[0].active
        .toBe false
        expect object[1].active
        .toBe false
        expect object[2].active
        .toBe false
```
あれ？失敗するぞ。

### case2
```coffeescript:example.coffee
    it 'should sweep all element', ->
        count = 0
        _.forEach objects, (obj)->
            count = count + 1
            obj.active = false

        expect count
        .toBe 3
```
あれれ？また失敗するぞ。

### case2を修正
```coffeescript:example.coffee
    it 'should sweep all element', ->
        count = 0
        _.forEach objects, (obj)->
            obj.active = false
            count = count + 1

        expect count
        .toBe 3        
```
おっ、成功した。
`count = count + 1`と`obj.active = false`を入れ替えると結果が変わる。
ああ、いつでも忘れてはいけないこの仕様……


## JavaScriptを見てみる

```javascript:example.js
  it('should sweep all element', function() {
    var count;
    count = 0;
    _.forEach(objects, function(obj) {
      count = count + 1;
      return obj.active = false;
    });
    return expect(count).toBe(3);
  });
```

```javascript:example.js
  it('should sweep all element', function() {
    var count;
    count = 0;
    _.forEach(objects, function(obj) {
      obj.active = false;
      return count = count + 1;
    });
    return expect(count).toBe(3);
  });
```

そう、犯人は`return obj.active = false;`です。

## lodashのドキュメントに書いてあります

> Iterates over elements of collection invoking iteratee for each element. The iteratee is bound to thisArg and invoked with three arguments; (value, index|key, collection). Iterator functions may exit iteration early by explicitly returning false. 

<https://lodash.com/docs#forEach>

`_.forEach`のコールバックで`return false`すると巡回を止めてしまいます。

```coffeescript:example.coffee
    it 'should make all inactive', ->
        _.forEach objects, (obj)->
            obj.active = false
            true

        expect objects[0].active
        .toBe false
        expect objects[1].active
        .toBe false
        expect objects[2].active
        .toBe false
```
これでOK。


### ちなみに
`jQuery`の`$.each`も同じ仕様のようですが、`AngularJS`の`angular.forEach`は巡回をやめないようです(！！)
Eclipseのエディタにおける出現箇所の強調を目に優しくする

Eclipseの小ネタ

## 出現箇所の強調の彩度を下げる

出現箇所マークのトグル（Alt+Shift+O）を使うと、選択したフィールド等がどこで利用しているかわかりやすいが、デフォルト色はドギツイので色を変えたい。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/4d6444c6-b3d9-7bc5-9fc0-60bfaaa962a7.png)


### 設定変更

Eclipseの設定から、以下の項目を開く。

- 一般 > エディター > テキスト・エディター > 注釈

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/2e5d8de2-6d55-49c3-4590-87719134437d.png)

ここの「出現箇所」と「書き込み出現箇所」を以下の値に変更する。

  - 出現箇所  
![image](https://qiita-image-store.s3.amazonaws.com/0/38957/e0b9f735-c54c-2177-b02e-e005b37a9372.png)
<br>

  - 書き込み出現箇所  
![image](https://qiita-image-store.s3.amazonaws.com/0/38957/23520207-3c59-2d66-b745-86cccc21cb18.png)


## その結果

個人的にだいぶ落ち着いた色味になったと思う。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/874eb028-1f22-0c72-ea61-6b5a93d26a15.png)


## 一点不便があるとすると

出現箇所を灰色にするとスクロールバーの右横に出ているマークも灰色になるため、新規編集コードの場合、薄い青に紛れて少し見辛くなる。
気になるようであれば、補色となる黄色系の色にすると見やすくなるはず。
Node-RED on Docker - Part1: インストール

Node.jsでつくるIoTのサーバーサイドにNode-REDを使います。MQTTからメッセージを取得してMongoDBに保存する処理をワイヤリングします。IoTプラットフォームはDockerコンテナで構築していきます。


## google/nodejs-runtimeのDockerイメージ

[google/nodejs-runtime](https://registry.hub.docker.com/u/google/nodejs-runtime/)を使う場合の前提条件は以下です。

* package.jsonがあること
* エントリーポイントのserver.jsまたは、package.jsonにscriptsの記述があること
* アプリのportは8080でlistenしていること

## Node-REDのGitHubリポジトリ

Node-REDの[リポジトリ](https://github.com/node-red/node-red)を確認して、google/nodejs-runtimeの仕様にあわせます。

[package.json](https://github.com/node-red/node-red/blob/master/package.json)にエントリーポイントの指定があります。

``` js:package.json
...
    "scripts"      : {
        "start": "node red.js",
        "test": "./node_modules/.bin/grunt"
    },
...
```

エントリーポイントの[red.js](https://github.com/node-red/node-red/blob/master/red.js)を見ると、設定ファイルはデフォルトでカレントディレクトリのsettings.jsを参照しています。

``` js:red.js
...
var settingsFile = "./settings";
...
Usage: node red.js [-v] [-?] [--settings settings.js] [flows.json]
...
```

[settings.js](https://github.com/node-red/node-red/blob/master/settings.js)のポート指定は1880なのでEXPOSEに追加します。


``` js:settings.js
...
module.exports = {
    // the tcp port that the Node-RED web server is listening on
    uiPort: 1880,
...
```

## Dockerfileのビルド

Node-REDを`git clone`します。

``` bash
$ cd ~/docker_apps
$ git clone https://github.com/node-red/node-red.git
$ cd node-red
```

Dockerfileを作成して、`docker build`を実行します。

``` bash
$ cat << 'EOF' > Dockerfile
FROM google/nodejs-runtime
EXPOSE 1880
EOF
$ docker build -t node-red .
```

## コンテナの起動

使い捨てのコンテナを起動して、1880ポートをDockerホストにマップします。

``` bash
$ docker run --rm --name node-red -p 1880:1880 node-red
```

ブラウザで動作確認をします。

http://10.1.3.67:1880

![node-red.png](https://qiita-image-store.s3.amazonaws.com/0/43745/9eaaa477-0ffe-f738-76a5-a5f08b838a29.png)
why-run 時に execute リソースのコマンドを実行する whyrun_safe_execute

深遠な理由があって、why-run の時も execute リソースのコマンドを実行したい。


Convergence フェーズで実行したいので shell_out! ではダメ。


# コード

ちょっとしたトリックではできなさそうだったので、自分で書いてみた。

* https://github.com/sonots/chef-resource-whyrun_safe_execute/blob/master/resources/whyrun_safe_execute.rb
* https://github.com/sonots/chef-resource-whyrun_safe_execute/blob/master/providers/whyrun_safe_execute.rb

[whyrun_safe_ruby_block リソース](http://qiita.com/sonots/items/2b9089820e26419d2a14) を参考にしている。

# おためし実行

これで、こんなレシピを書いて

```ruby:recipes/test.rb
whyrun_safe_execute "foo" do
  command "ls /tmp"
end
```

```
$ chef-solo -c solo.rb -o {cookbook}::test -l info
$ chef-solo -c solo.rb -o {cookbook}::test --why-run -l info
```

として実行すると why-run 時にも ls /tmp されることが確認できるはず。

さらに `if Chef::Config[:why_run]` とかすると why-run 時にだけ実行する謎リソースとかも実現できる。

```ruby:recipes/test.rb
if Chef::Config[:why_run]
  whyrun_safe_execute "foo" do
    command "ls /tmp"
  end
end
```


# おわりに

cookbook レポジトリとして作ってあるので、Berkshelf かなにかで cookbook として取り込めばご利用いただける  https://github.com/sonots/chef-resource-whyrun_safe_execute
VirtualBoxでVM毎のポートフォワーディング設定を一覧表示させてみる

# VirtualBoxでVM毎のポートフォワーディング設定を一覧表示させてみる

VirtualBoxでVMを作成する際、NAT接続にする場合があります。その場合、ssh等をポートフォワーディングさせる設定にするのですが、VMが多くなると、ホスト/ゲストでのポート番号の対応が分かりづらくなってきます。

VMの設定画面を一つ一つ開いて確認すれば良いのですが、これはなかなか面倒です。そこで、シェルスクリプトでVM毎のポートフォワーディング設定を一覧表示させてみました。

## VM毎のポートフォワーディング設定の一覧表示

スクリプトは以下の場所に置いてあります。

 * list_port_forward_setting.sh
   * https://gist.github.com/furandon-pig/f101b5f3f7eea8284378

実行例を以下に示します。VM毎にVM名、ホストポート番号、ゲストポート番号を列挙します。

```shell-session
$ ./list_nat_setting.sh 
#VM name,host port,guest port
railsenv2,,
nbsd615_dev2,9922,22
IE11 - Win8.1,,
nbsd615_test2,9923,22
osvdev2,9999,22
NetBSD-6.1.5-amd64,2222,22
fedora21,2223,22
nbsd515,2224,22
nbsd615lua,2225,22
redmine,2226,22
```

"-t"オプションを付与すると結果をHTMLで出力するので、w3m等で見やすく整形できます。

```shell-session
$ ./list_nat_setting.sh -t | w3m -T text/html -dump 
┌──────────────────┬─────────┬──────────┐
│VM name           │host port│guest port│
├──────────────────┼─────────┼──────────┤
│railsenv2         │         │          │
├──────────────────┼─────────┼──────────┤
│nbsd615_dev2      │9922     │22        │
├──────────────────┼─────────┼──────────┤
│IE11 - Win8.1     │         │          │
├──────────────────┼─────────┼──────────┤
│nbsd615_test2     │9923     │22        │
├──────────────────┼─────────┼──────────┤
│osvdev2           │9999     │22        │
├──────────────────┼─────────┼──────────┤
│NetBSD-6.1.5-amd64│2222     │22        │
├──────────────────┼─────────┼──────────┤
│fedora21          │2223     │22        │
├──────────────────┼─────────┼──────────┤
│nbsd515           │2224     │22        │
├──────────────────┼─────────┼──────────┤
│nbsd615lua        │2225     │22        │
├──────────────────┼─────────┼──────────┤
│redmine           │2226     │22        │
└──────────────────┴─────────┴──────────┘
```

## まとめ

ちょっとしたシェルスクリプトですが、個人的には作業効率がUPする便利スクリプトになっています。スクリプトの内部で利用しているVBoxManageコマンドは他にもいろいろ機能があるようなので調べてみると面白そうです。
AutoReleasePoolとCrashOfApplication

特に 2.x 系向けの話となります。

※3.x系にはDirector::getInstance()->getScheduler()->performFunctionInCocosThreadという便利なのもありますね

非UIスレッドから、cocos2d-xでお馴染みの
create系メソッドをコールするのは危険です。
> CCObject::create() 等
> ※CREATE_FUNC等で定義されているアレ

特にAndroid版実装においては、
課金や通知、サード製のライブラリを実装する際に
JNIでC側のメソッドをコールする事があると思いますが、
JNIのメソッドは、UIスレッドとは別のスレッドから
コールされるものが多々あります。

create系のメソッドは、内部で autorelease() をしているので
AutoreleasePoolのグローバルなリストへ登録されます。

UIスレッドでは、毎フレームの最後の方に
AutoreleasePoolへ登録されているオブジェクトの整備をしているので
retainされていないオブジェクトは削除されます。

その為、例えば以下の様なコードは、アプリがクラッシュする可能性を秘めています。

```cpp
static void crashTestThread(){
    while(1){
        auto dic = cocos2d::CCDictionary::create();
        
        // 待てば待つほどクラッシュ確率が上がる
        usleep( 1000 * 10 );
        
        dic->release();
    }
}
static void testCrash(){
    auto th = std::thread( crashTestThread );
    th.detach();
}
```

問題は、AutoreleasePoolに起因する事なので、
上記コードも以下のように書けばクラッシュを免れます。

```cpp
static void crashTestThread(){
    while(1){
        auto dic = new cocos2d::CCDictionary();
        
        // 待てど暮らせどクラッシュしない
        usleep( 1000 * 10 );
        
        dic->release();
    }
}
```

```cpp
static void crashTestThread(){
    while(1){
        cocos2d::CCDictionary dic;
        
        // 待てど暮らせどクラッシュしない
        usleep( 1000 * 10 );
    }
}
```
Eclipseのビルドパスでプラグイン依存関係が解決されない場合の対処

Eclipseのプラグイン開発における小ネタ。

## プラグイン開発用のクラスが見つからない問題

新しくダウンロードしたEclipse 4.4でプラグイン開発のプロジェクトを作成したら、

    AbstractUIPlugin を型に解決できません

というように、プラグイン開発のライブラリが見れなくなっていた。

プロジェクトのプロパティから「Javaのビルド・パス」の「プラグイン依存関係」を確認したところ、jarが全く読み込まれていなかった。

## 対処

Eclipseメニューの「ウィンドウ」 > 「設定」から

- プラグイン開発 > ターゲット・プラットフォーム

を開くと、ターゲット定義が「ターゲット・プラットフォーム」という、設定値が空のものがアクティブとして選択されていた。
「実行プラットフォーム」を選択し、OKボタンを押下すると、プラグイン依存関係が解決され、無事にビルドすることができた。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/4c221fdd-6993-a5ea-b115-9e27a74a22b7.png)