OmniAICreator/Qiita-1.07M huggingface dataset:
AWS VGWに複数接続を作成する際のルーティングについて

VPCとオンプレの間の接続をVPNから[Direct Connect](https://aws.amazon.com/jp/directconnect/?nc2=h_l3_n)(DX)に移行しました
その際にVGWのルーティングで悩まされたポイントのメモ

1つのVPCにアタッチできるVGWは1つだけとなります。
つまり、VPCに対し複数のVPNあるいはDXの接続を作成した場合には全ての接続が1つのVGWによって束ねられることになります。
しかし、VPCのroute tableで制御できるのは、特定のネットワークアドレスに対する宛先をVGWに向けることだけです。
VGWの先に複数の接続がある場合にどの経路に対しルーティングが行われるかは、VPN接続、DXのそれぞれの設定に依存することになります。

複数の接続先が全く異なるネットワークアドレスであれば特に問題ないのですが、バックアップ回線による冗長化や今回のようにVPNからDXへの移行時など、同じ宛先経路を持つ場合、ルーティングはどのように制御されるのかを調べてみました。

AWSの[公式FAQ](https://aws.amazon.com/jp/directconnect/faqs/)には下記のような記載があります。

Q: AWS Direct Connect と VPN 接続を同時に同じ VPC に使用することはできますか?

A: はい。ただし、フェイルオーバーシナリオのみで可能です。Direct Connect パスが確立されると、AS パスプリペンドに関係なく、常に Direct Connect パスが優先されます。

この記載によると、VPN接続とDXでは問答無用にDXが優先されるようです。
普段はDX側にトラフィックを流し、バックアップ回線としてVPNを使うケースを想定してるようです。
この仕様だと、すでにVPN接続があるオンプレ環境に対しDXを接続すると、即座にDXの方にルーティングが向いてしまいますので、使用中の回線を切り替える場合には注意が必要そうです。
そして、今回は自前で回線・ルータを用意する占有型ではなくAWSパートナーの回線からVirtual Interfaceを割り当ててもらう共有型の接続のため、BGPのコネクションが確立されるタイミングが正確に予測できず、Virtual Interfaceの承諾操作も開通日前に事前に実施しておかなければいけないという事情がありました。
現時点でサービスに仕様しているVPN接続を、疎通テストもしていない回線にタミングも読めずいきなり切り替えられるのはリスクが高すぎます。
回避策がないか調べたところ、ありました。
VGWの経路優先度
----
DXが優先されるのはあくまでも、プレフィクス長を含めた同じ宛先サブネットの場合であり、プレフィックス長が異なる場合にはロンゲストマッチが有効なようです。
それぞれで下記のようなルートを持っていたとすると、

DX:192.168.0.0/24
VPN:192.168.0.0/24

この場合は192.168.0.0/24に属する宛先への通信はすべてDXに流れますが、

DX:192.168.0.0/24
VPN:192.168.0.0/24,192.168.0.1/32,192.168.0.2/32

とすると、192.168.0.1と192.168.0.2宛の通信はVPNを通り、それ以外の192.168.0.*への通信はDXを通ることになります。

移行手順
----
という訳で、VPN接続からDXへの移行いんあたっては以下のステップを踏むことで既存の通信への影響を最小限に抑えることができます。

1. 既存のVPN接続で必要な宛先IPについてすべて/32のルーティングを追加
2. DXを開通
3. 空いているIPを使ってDXの通信テスト
4. VPN接続で/32のルーティングを削除

1をいてれおくことで、2のタイミングで既存サービスの通信がDXへ向くことを抑止し、諸々の準備が整ったところで任意のタミングで4を実施すれば切り替え完了です。

補足
----
一般的なルータであれば同じ宛先に対する経路の決定は以下の優先度で決定するはずです。

1. ロンゲストマッチ
2. アドミニストレーティブディスタンス（AD値）
3. メトリック

今回の件でVGWのルート決定においてロンゲストマッチとメトリックが有効であるとわかりました。
では、AD値による優先度はあるのでしょうか？
同じプレフィックス長であればDXが優先されるというのは、VPN接続とメトリックが比較されていると思われます。
VPN接続ではBGP意外にStatic Routeも設定可能ですが、仮に、AD値も有効だとすると、DX（BGP）とVPN接続（Static）で同じ宛先を設定した場合にはVPN接続側が優先されそうな気がします。

検証してみたいところですが、DXはなかなか気軽に触れず、情報があれば頂けると幸いです。

また、BGPの制御などはNWエンジニアでないとハードルが高い部分もありますので、DX/VPNの各接続に対しVGWでStatic Routeを設定できるような機能もあると嬉しいと思いました。
docker execでWARNING: terminal is not fully functionalが出るのを回避する

`docker exec` に `-t` オプションをつけて起動しても、コンテナ内で `less` を実行すると `WARNING: terminal is not fully functional` という警告が出て困っていました。
`less` の動作自体は大丈夫なのですが、警告の後returnキーを押す必要があって、その手間が面倒です。

以下のように `env` コマンドで `TERM` 環境変数を指定すれば回避できました。

```shell-session
docker exec -it コンテナ名 env TERM=xterm bash
```

あるいは、dockerイメージを自分でビルドする場合は、Dockerfileに

```
ENV TERM xterm
```

と書いておきます。すると `docker exec` は単に

```shell-session
docker exec -it コンテナ名 bash
```

でOKです。

## 参考
* [exec does not set TERM env when -t passed · Issue #9299 · docker/docker](https://github.com/docker/docker/issues/9299#issuecomment-141901075)
* [dumb terminal when using docker exec · Issue #8631 · docker/docker](https://github.com/docker/docker/issues/8631#issuecomment-161834839)
brew upgrade && brew updateに失敗してlinuxbrewが壊れた

# 最初に

linuxbrewの最近の更新によるもの？っぽいですが、どれが原因かわかっていません。。



# 背景

- Linuxbrewでgitとかtigとかrubyとかpythonとかもろもろインストールしていた

# とある昼下がり

コーヒーをすすりながらいつも通り

```
$ brew update
$ brew upgrade
```
をしたところ、gitのアップデートで見慣れないエラーメッセージ。

どうやら依存関係のglibcのインストールにコケたよう。
あまり気にせずgitコマンド叩いたところ

```
$ git checkout master
git: segmentation fault とかなんとかかんとか
```

なんじゃこりゃ…

# 結局

~/.linuxbrewをリネームして必要なものを再度インストールし直しましたとさ。
原因なんだったんでしょう
考察 > Sublime Text > レイアウト > グリッドで使用 (8ファイル)

```txt:動作確認
Sublime Text2 on Windows 7 pro
23 inch モニタ
C++/Python/Arduino ino/C#/組込み用C/などのコーディング
```

- グリッドにする
- グリッドサイズ
  - 上２つのHeight `<<` 下2つのHeight
  - 左2つのWidth == 右2つのWidth
- メインウィンドウ: 左下
  - 一番対面になる位置
- 参照ウィンドウ : 右下
  - ヘッダ記載のインターフェイス確認などに使う
- サブ参照ウィンドウ : 上の2つ
  - ファイル名だけである程度機能を確認できる
  - 5行程度で読めるものを配置 or 右下に移すためのスタンバイ状態にする
- テンポラリ参照 : Findで開くタブ
  - その場の作業だけで使う情報を保持

上のウィンドウに置いておいた関連ヘッダの詳細を見たいときには、それを右下にドラッグする。
参照が不要になり次第、上のウィンドウに移動する。

これでそのときの作業に関連するだいたい8つの(ソース、ヘッダ)を開いていもコーディングしやすい。
Raspberry PiからWOL(Wake On Lan)

Raspberry PiからLAN内PCへのWOL(Wake On Lan)を可能にします。

今回は下記のツールを使用させていただきます。

http://www.gcd.org/sengoku/docs/wol.c

1.Raspberry Piにログインし、ツール(Cファイル)を取得

```
$ wget http://www.gcd.org/sengoku/docs/wol.c
```

2.Cファイルをコンパイルし、実行ファイルを作成

```
$ gcc wol.c -o wol
```

3.起動したいPCのIPアドレスとMACアドレスを指定して実行
※IPアドレスはブロードキャストアドレス(192.168.1.255等)でも構いません

```
wol 192.168.1.2 xx:xx:xx:xx:xx:xx
```

これでRaspberry PiからWOL可能になりました。

外から自宅内のRaspberry Piに接続して、WOLを実行すれば自宅内のPCを起動できます。
私はAndroidからRaspberry PiにSSH接続して、Raspberry PiからWOLを実行して、Windows端末を起動しています。

シェル等を作成した方が楽です。

```
#!/bin/bash

wol 192.168.1.2 xx:xx:xx:xx:xx:xx
```


以上！
jsの数値でのソート

jsでソートは、文字列に変換されソートされるので、数値でソートする場合は比較関数が必要。

```js
[30,4,1,2,10].sort()
// [ 1, 10, 2, 30, 4 ] 
[30,4,1,2,10].sort((a, b) => a - b)
// [ 1, 2, 4, 10, 30 ]
```
updatedb.mlocateを消す

毎朝6時ぐらいから1〜2時間ほどIO負荷が急上昇していたら、犯人はupdatedb.mlocateかもしれません。

これはファイルを高速に検索するlocateコマンドのためのインデックス作成タスクで、MacでいえばSpotlightみたいなものですね。

ubuntu desktopならともかく、サーバー用途では基本的には不要だと思います。なんでubuntu serverに入ってるのかな...

とりあえず、mlocateを実行しないようにするには、`/etc/cron.daily/mlocate`を削除すればokです。

完全に削除するには `apt-get purge mlocate`でok
技術英語 > and when it's finished they feel [a sense of ownership]. / a sense of direction / a sense of humor

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> We work with the client and insist they be involved. ... and when it's finished they feel <font color=red>a sense of ownership</font>

仕事に実際に参加してもらうことで、a sense of ownership を持つことができる、ということ。

<hr>
関連して思い出したのは

a sense of direction

> http://eow.alc.co.jp/search?q=sense+of+direction&ref=sa

道によく迷うので、このフレーズはすぐに覚えた

<hr>
関連して思い出したのは

a sense of humor

> http://eow.alc.co.jp/search?q=sense+of+humor
Unityの既存のプロジェクトにLive2Dを組み込む方法（速さ重視）

やってしまいました、公式のこれです、[これとほぼ同じ](http://sites.cybernoids.jp/cubism2/sdk_tutorial/platform-setting/unity/csharp/sampleapp1)！（悲しい）

#モチベーション
* ハッカソン関係で試した

#手順
Live2DのSDKをダウンロードしてくる
今回はLive2D_SDK_Unity_2.1.00_1_jp.zipを使った

例えばキューブがあるだけのこんな既存のプロジェクトにLive2Dを追加してみる
![2016-02-28_06h31_25.png](https://qiita-image-store.s3.amazonaws.com/0/76553/5d37ee86-00b4-ba92-7a05-4eb175351e14.png)

禁じ手かもしれないけど、エクスプローラーで
SDKのsample\SampleApp1\Assets以下のファイルをすべてコピー
すると以下のように勝手にプロジェクトを読み込み始める
![2016-02-28_06h34_31.png](https://qiita-image-store.s3.amazonaws.com/0/76553/eb6f0ab3-b12b-47f1-3e34-29bea4ba685d.png)

一瞬エラーが出るけど、シェーダが見つからないとかそんな感じで削除のメッセージっぽい
![2016-02-28_06h35_14.png](https://qiita-image-store.s3.amazonaws.com/0/76553/245246f0-0329-e4e9-c081-f19c6d728a0f.png)

この時点で既存のプロジェクトにSampleApp1のいろんな機能が追加される
メニューバーにもエディタ拡張のLive2Dのメニューが出現！！
これはLive2Dのモデルを描画するためのキャンバスを作ってくれるそんなエディタ拡張で、
sample\SampleApp1\Assets\EditorのCreateCanvas.csによるもの

ここからは、
![2016-02-28_06h38_56.png](https://qiita-image-store.s3.amazonaws.com/0/76553/83c7ec55-772e-7001-c5bd-ca5b8ecb479c.png)
を押して、HierarchyにLive2D_Canvasを置く

Inspectorにモデルのパスを書く
![2016-02-28_06h40_27.png](https://qiita-image-store.s3.amazonaws.com/0/76553/9070a396-b5b2-fb28-be45-ab1ba1b4af47.png)

実行でモデルの表示まで行ける
![2016-02-28_06h41_04.png](https://qiita-image-store.s3.amazonaws.com/0/76553/d9adf319-ff3a-b5a7-9dd2-b505aaacc159.png)

で、タッチの判定とかモーションの再生とかうまいことやるために、Scripts\sampleにあるMyGameControllerをMainCameraにアタッチする
![2016-02-28_06h42_02.png](https://qiita-image-store.s3.amazonaws.com/0/76553/1fc95dc6-e914-95f1-af92-24d6cf39b029.png)

これで一通り動かせそうな雰囲気（とりあえずなら動きそう？）

pathに設定したmodel.jsonはhttp://sites.cybernoids.jp/cubism2/modeler/export/moc-export
あたりに書いてある、.moc書き出し時に出力できる。
jQuery ポップアップ

#href使わずにpopup
**jsめも**
javascript:void(0) は値を何も返さないが、hoverでリンク先表示されるとキモい
これでhref使わずにできる↓
data-target=""は-の後に任意の値、.data('target') で値をとる
（業務においては新しくコーディングルールをつくらないといけないので）
汎用性を考えると、dataを使うのは微妙
状況に応じて使う

```html:html
<p class="table-bottom-text"><a class="popup" href="javascript:void(0)" data-target="#construction-popup">> 詳細をみる</a></p>
```

```js:js
$(function () {
	$('.popup').click(function(){
		var target = $($(this).data('target'));
		target.fadeIn();
		target.find('.close,.bg').click(function(){
			target.fadeOut();
		});
		//return false;
	});
});
```


もとのjs、汎用性を考えた実装

```js:js
$(function () {
	$('.popup').click(function(){
		var target = $($(this).attr('href'));
	// これはボタンおして、ﾍﾟｰｼﾞ遷移する前に実行される
		target.fadeIn();
		target.find('.close,.bg').click(function(){
			target.fadeOut();
		});
		return false;
		// これでハッシュつけないようにできる、
		// この後つづけて$('.popup').click(function(){ のイベント設定するとリターンフォルスで実行されない
	});
});
```
jQuery tab切りかえ

#tab切りかえ
**jsめも**
each使ったらthisもつかう

```js:js
$(function(){
	$("#price-tab li").click(function(){

		var tab_img = $(this).parent().find("img");
		var _this_img = $(this).find("img");
			// tab_img.attr("src",tab_img.attr("src").replace("-on.", "-off."));
		tab_img.each(function(){
			$(this).attr("src", $(this).attr("src").replace("-on.", "-off."));
		});
			_this_img.attr("src", _this_img.attr("src").replace("-off.", "-on."));

		var index = $(this).index();
		$("#price-list li").hide();
		$("#price-list li").eq(index).show();
	});
});

```

タブ用とコンテンツ用のul,liを用意
相対するタブとコンテンツが同じ順に並ぶようにhtmlをかく

tab押したら、tabのli全部非アクティブの画像に切り替える
そのあと押したとこだけアクティブに

コンテンツも一度全部非表示にする
タブのliが何番目かしらべてそれに対するコンテンツを表示する
IntelliJ IDEAのインストールと日本語化

## 概要
IntelliJ IDEAをMacにインストールする際の手順

## 実行環境
macOS Mojave バージョン 10.14.5
IntelliJ IDEA Version 2019.1.3

## ダウンロード
[公式サイト](https://www.jetbrains.com/idea/#chooseYourEdition)よりダウンロードを行う。
※ダウンロードを行うのはUltimateエディション。

## インストール
ダウンロードしたdmgを使ってインストールを行う。
特に難しくはないので詳細な手順は省略する。

## 起動時の設定（起動時のメモリサイズ割当と日本語化）
快適な環境で開発を行う為に起動時の設定を行っておく。
ここで行うのは日本語化とメモリサイズ割当の変更。

### 日本語化する
~~有志の方が作成している日本語化用のjarがあるのでそれを利用させてもらう。~~
~~https://github.com/yuuna/IDEA_resources_jp.git~~

~~手順としては非常に単純で上記のGitRepositoryに含まれるresources_jp.jarを/Applications/IntelliJ\ IDEA\ 15.app/Contents/lib 配下にコピーするだけで実現可能である。~~

~~日本語化はある程度しか出来ない、今後IDEA_resources_jpがメンテナンスされていく保証はないので慣れてきたら英語のメニューに戻して利用する事をオススメする。~~

#### 2020-08-19 日本語化についての追記

[Japanese Language Pack EAP](https://plugins.jetbrains.com/plugin/13964-japanese-language-pack-eap) が出ている。（コメントで教えて頂きました。）

まだ早期アクセスプログラム（EAP）だが日本語化するなら、今後はこれを利用するのが良いと思われる。

#### 2019-07-22 日本語化についての追記

https://github.com/yuuna/IDEA_resources_jp.git は現在メンテナンスが行われていない。

今日本語化するなら、下記で紹介されているPleiadesをインストールする方法が良さそう。

https://pleiades.io/pages/pleiades_jetbrains_manual.html

ちなみに筆者はもう長く英語のメニューに慣れていて、上記の手順は試していないので、そこはご了承願いたい。

### 起動時のメモリサイズ割当
お使いのPCのメモリに余裕がある場合はメモリサイズの割当を行っておく事をオススメする。
私の場合以下の設定を行った事で動作が大分快適になった。

1. Help > Edit Custom VM Options... を選択する。 ※[こちらの記事](http://qiita.com/kazuki43zoo/items/49c90e5f05397c694d26)に詳しい解説があります。
2. 各パラメータを以下のように編集する。

```text:idea.vmoptions（変更前）
-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops
```

```text:idea.vmoptions（変更後）
-Xms2048m
-Xmx2048m
-XX:MaxPermSize=512m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops
```

※ちなみにそれぞれのパラメータは下記のような意味だそうだ。

|項目名|説明|
|-----------|------------|
|Xms|起動時のヒープサイズ。起動時のメモリ割り当て数。|
|Xmx|最大ヒープサイズ。この値までヒープは拡大する。Xms と同じ値にするとヒープサイズ調整時のオーバーヘッドがなくなり、パフォーマンスが向上することがある。|
|XX:MaxPermSize|クラスファイルをメモリ上にロードするための領域として使用される。一般にこれらの値が小さいとGCが頻発するので大きめに設定する。|
|XX:ReservedCodeCacheSize|予約コードキャッシュサイズ。実は、何に使っているかよく分からない。|

## アンインストール手順
何らかの事情によりアンインストールをする場合は以下の手順の通りに関連ファイルを全て削除する。

```bash:
rm -rf /Applications/IntelliJ\ IDEA.app
rm -rf ~/Library/Preferences/IntelliJIdea2019.1
rm -rf ~/Library/Preferences/com.jetbrains.intellij.plist
rm -rf ~/Library/Application\ Support/IntelliJIdea2019.1
rm -rf ~/Library/Caches/IntelliJIdea2019.1
rm -rf ~/Library/Logs/IntelliJIdea2019.1
```

## 参考資料
- [IntelliJ IDEA 日本語ドキュメント](https://pleiades.io/help/idea/discover-intellij-idea.html)
p5.jsでGoogle Mapsっぽいインタフェースを作る

p5.jsはProcessingのようなビジュアル表現をJavaScriptで実現するライブラリ。描画だけでなく、マウス操作も充実しているので、Google Mapsのようにドラッグすると地図が動くといったインタフェースを簡単に書けるかな？と試してみた。

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.4.22/p5.min.js"></script>
<script>

    var map,press;
    function posSet(x,y){
        this.x = x;
        this.y = y;
        this.set = function(x,y){
            this.x = x;
            this.y = y;
        }
    }

    function mousePressed(){
        press.set(mouseX - map.x, mouseY - map.y);
    }

    function mouseDragged() {
        map.set(mouseX - press.x, mouseY - press.y);
    }

    function preload(){
        map_image = loadImage('./map.png');
    }

    function setup(){
        map = new posSet(0,0);
        press = new posSet(0,0);
        createCanvas(1000,500);
    }

    function draw(){
        background('#eee');
        image(map_image,map.x,map.y);
    }

</script>
```

ポイントはmouseDragged()でクリックした位置の分だけ引き算してあげること。そのあたり、ちょっと頭が混乱するが、意外に短時間で実装できた。建物内の案内とかイベント会場とかをGoogle Mapっぽく見せるのに使えるかも。
AutoHotkeyと無変換でAlt+Tabとおさらばする


# Alt+Tabの使い辛さ

ウィンドウを複数開いている状態でウィンドウの切り替えを行いたい時、大抵Alt+Tab、もしくはWin+Tabで切り替えるが、ウィンドウの数が多いとよく迷子になります。
何気ないことだけど地味にめんどくさいので、指定のウィンドウを一発でアクティブ化出来るようにAutoHotkeyのスクリプトを書いてみます。

# スクリプト

```
captureOrActive(ByRef id)
{
  if GetKeyState("ctrl", "P") {
    WinGet, id, ID, A
  } else {
    WinActivate, ahk_id %id%
  }     
  return
}

; 無変換(vk1Dsc07B)
vk1Dsc07B & 1:: captureOrActive(id1)
vk1Dsc07B & 2:: captureOrActive(id2)
vk1Dsc07B & 3:: captureOrActive(id3)
```

# 操作方法

無変換 & Ctrl & 1で、現在アクティブのウィンドウを記憶
無変換 & 1で記憶したウィンドウをアクティブ化


自分はグループ分けの意味合いを込めた変換と、数字キーも5まで使い、合計10個まで一発でアクティブ化出来るようにしてます。
これでAlt+Tab迷子とおさらば！
Rails Viewの表示のためにDecoratorを用意してHelperとModelを助ける

# こんなことありませんか？

Modelの情報を少し加工してViewに表示したいことってありますよね？
例えば、ArticleというModelがあってその情報を少し加工してViewに表示したい、という以下のような場合があると思います。

```erb
<%= publication_status(@article) %>
```

```rb:app/helpers/articles_helper.rb
def publication_status(article)
  if article.published_at?
    "Published at #{article.published_at.strftime('%A, %B %e')}"
  else
    "Unpublished"
  end
end
```

ただし、これだと違和感があって、BookというモデルもArticleモデルと同じようなメソッドを作ろうとしたときに、少しだけしかフォーマットの仕方を変えないのに同じようなメソッドを作る必要が出てきます。
```book_publication_status``` や ```article_publication_status``` のような2つのメソッドになるかと思いますが、グローバルな空間にこのように同じようなメソッドを作り続けるのは嫌ですね。

だったらModelで定義してしまえ！とModelで定義して下記のように呼び出すことも出来るかと思います。ただし、このメソッドはViewの表示部分のロジックを担っているわけで、その責務をModelには持たせたくない。

```erb
<%= @article.publication_status %>
```

そこで登場するのが ***Decorator*** というわけです。Decoratorは対応したModelのViewへの表示フォーマットのためのロジックを請け負ってくれます。

それではどのように使っていくか見ていきましょう。

>
以上の導入の例は以下のdraperのREADMEの導入部を使用させて頂きました。　
[drapergem/draper](https://github.com/drapergem/draper)
ただし、今回実装で使用するのは下記のactive_decoratorになります。
[amatsuda/active_decorator](https://github.com/amatsuda/active_decorator)

# 実際の使い方

今回、decoratorを導入するために以下のactive_decoratorを使用します。
[amatsuda/active_decorator](https://github.com/amatsuda/active_decorator)

使い方は簡単で
### 1. gemの 「active_decorator」をbundle

```rb
gem 'active_decorator'
```

### 2. decoratorのファイルを作成

```rb
rails g decorator article # 対応するモデルに合わせて。
```

### 3. decoratorのファイルにメソッドを記述

```rb
# app/models/article.rb
class Article < ActiveRecord::Base
end

# app/decorators/article_decorator.rb
module ArticleDecorator
  def publication_status
    if published?
      "Published at #{published_at.strftime('%A, %B %e')}"
    else
      "Unpublished"
    end
  end
end

# app/views/articles/show.html.erb
<%= @article.publication_status %>
```

# Decoratorの利点
これまでの説明から、Decoratorの役割はイメージ出来たかと思います。Modelに対応したViewへのロジックをModelと切り離して書けていい感じですよね。
このDecoratorのいいところは、

1. Modelに書かずにModelに対応したViewへの表示フォーマットを用意出来ること
2. Decoratorの中にActionViewのhelperを使用することが出来ること

だと思っています。

1のほうはいいとして、2のほうはactive_recordで登場する例を用いると以下での ```link_to```のようなhelperをDecoratorの中に直接書けるということです。
[amatsuda/active_decorator](https://github.com/amatsuda/active_decorator)

```rb:app/decorators/user_decorator.rb
module UserDecorator
  def full_name
    "#{first_name} #{last_name}"
  end

  def link
    link_to full_name, website
  end
end
```
```erb:app/views/users/index.html.erb
<% @users.each do |user| %>
  <%= user.link %><br>
<% end %>
```

なかなかに便利だと思うので是非導入して見てください
テキストエディタ「Atom」のインストールから日本語化まで

#Atomのインストール
- 「Atom」をダウンロード公式サイトにアクセスする
-  https://atom.io/
- 「DownLoad for Mac」をクリック
- zipファイルをダウンロードしたら、 解凍してAtomのアイコンが表示する
- そのアイコンをアプリケーションフォルダにドラッグ＆ドロップ
- インストール完了

##日本語化
- Atomを起動する
- メニューバーにあるHelp→WelComeGuideをクリック
- 「Install a Package」をクリック
- 「Open Installer」をクリック
- 左側の上の方にフォームがあるのでそこに「japanese」と入力し、「Packages」をクリックします。
- パッケージが表示されるので、「japanese-menu」の「Install」をクリックしましょう。
- 日本語化完了
jQuery アコーディオン

#アコーディオン
**jsめも**
所謂アコーディオンとかいう
dt押したらddでてきて、その中に閉じるボタンがある的なやつ
toggle使うだけでいけそうだけど、ボタンのアイコンとか変えるのにif文がいるんだったと思う


```js:js
$(function(){

	var dt = $(".js-dt");
	var dd = $(".js-dd");
	var _close = $(".js-close a");
	dd.hide();
	dt.click(function(){
		var _this_dt = $(this).parents("dl").children("dt");
		var _this_dd = $(this).parents("dl").children("dd");
		if(_this_dd.css('display') != 'none'){
			_this_dd.slideUp(function(){
				_this_dt.removeClass("active");
			});
		}else{
			_this_dt.addClass("active");
			_this_dd.slideDown();
		};
	});
	_close.click(function(){
		var _this_dt = $(this).parents("dl").children("dt");
		var _this_dd = $(this).parents("dl").children("dd");
		_this_dd.slideUp(function(){
			_this_dt.removeClass("active");
		});
	});
});

```
って超絶ムダなスクリプトかいてたのを修正

```js:js
$(function(){
	$(".js-dd").hide();
	$(".js-dt, .js-close a").click(function(){
		var _this_dt = $(this).parents("dl").children("dt");
		var _this_dd = $(this).parents("dl").children("dd");
		if(_this_dd.css('display') === 'none'){
			_this_dt.addClass("active");
			_this_dd.slideDown();
		}else{
			_this_dd.slideUp(function(){
				_this_dt.removeClass("active");
			});
		};
	});
});

```

if文は`if(hoge.css('display') != 'none')`より`if(hoge.css('display') === 'none')`の方がわかりやすいかも
parentsとchildrenがキモい。.each()使ったらいいとおもうけど、とりあえずここまで
Backlogの課題をTodoistに連携させる

結構な企業でBacklogを利用していると思いますが、タスク管理ツールとの連携サービスがあまりありません。というか殆どありません。特に[IFTTT](https://ifttt.com/)とか[Zapier](https://zapier.com)とか。

んで、どうにか[Todoist](https://todoist.com/)と連携できないかと探ってましたが、できました。

## Googleカレンダー + Zapier

BacklogにはGoogleカレンダー連携があるので、Googleカレンダー経由でZapierからTodoistにタスクを流そうということです。IFTTTでも試みましたが、IFTTTは自由度が低いのと、Googleカレンダーで読み込んでる外部のスケジュールは引っ張れないと判ったので、今回はZapierを利用します。

### Googleカレンダー設定

Backlogのダッシュボード画面にある「自分の課題」からカレンダーのURLをコピーしてGoogleカレンダーに登録します。
詳しくはBacklogのFAQを読んでください。

http://www.backlog.jp/faq/service/calendar.html

### ZapierでZapを作る

![スクリーンショット 2016-02-26 14.32.10.png](https://qiita-image-store.s3.amazonaws.com/0/105635/c7ebe4ae-a7d0-245a-c754-20b949bbba56.png)

ざっくりと流れはこんなところです。

まず、[Dashboard](https://zapier.com/app/dashboard)でMake a New Zapしたあと、Trigger Appを検索してGoogle Calendarを選択します。

![スクリーンショット 2016-02-26 14.33.26.png](https://qiita-image-store.s3.amazonaws.com/0/105635/31a249f7-0c05-4acd-4c26-8fd114f6b651.png)

TriggerはNew Eventを選択。

![スクリーンショット 2016-02-26 14.35.37.png](https://qiita-image-store.s3.amazonaws.com/0/105635/d4106206-1ff0-4c24-3632-eed736da0001.png)

Continueするとカレンダーを選択できるので「●●さん担当の課題」というカレンダーを選択
※この名前はuniqueじゃないと思うのでBacklogってどっかに入れるべきですよね。

![スクリーンショット 2016-02-26 14.53.15.png](https://qiita-image-store.s3.amazonaws.com/0/105635/cc767bce-74d0-3240-a40e-6a5c5a57f340.png)

あとはテストして云々してTriggerできました。

Actionの前半はTriggerとほぼ同じなので割愛。

TodoistのTaskの設定は、こんな感じ。

![スクリーンショット 2016-02-28 0.54.19.png](https://qiita-image-store.s3.amazonaws.com/0/105635/30c9cab1-bcc9-de4c-5c61-80539cd22450.png)

Googleカレンダーから拾える値がアレなんで、自由度はそこまで高くないけど、複数のBacklog（元請けのとか）を利用する場合も振り分けられると思うし、最近Zapierはタスクを数珠繋ぎにしてひとつのZapにできるので、一連のオートメーションをまとめられて管理しやすいね。
ActiveJobでメソッドの遅延実行

メソッドの遅延実行とは何か。
つまるところ、同期的な処理を非同期に処理をしたい。

## `.delayed`でメソッドの実行を遅延する

パッと探した感じ見当たらなかったので、gemを入れるだけで簡単に導入できるようにした。
[activejob-delayed_execution](https://github.com/alpaca-tc/activejob-delayed_execution)を入れるだけで、メソッドを非同期に実行することができる。

```
gem 'activejob-delayed_execution'

# Railsなら config/initializers/activejob_delayed_execution.rb
# Define .delayed method
ActiveRecord::Base.include(ActiveJob::DelayedExecution)


item = Item.first
item.generate_manuscript # めっちゃ重い処理。ブロッキングする
item.delayed.generate_manuscript # ( ﾟ∀ﾟ)o彡ﾟ非同期に実行される
```

ActiveJobに乗っているため、Sidekiqの[Delayed extension](https://github.com/mperham/sidekiq/wiki/Delayed-extensions)と比べてredis等のメモリ消費が少なくてエコである。(3~10倍ほど変わる)

思いついて1時間ほどでProductionへ導入したのだけれど、今のところ元気に動いている。
ActiveJob便利。

---

お仕事では[pixivFACTORY](https://factory.pixiv.net/)というサービスで、ユーザーさんにグッズづくりを楽しんでもらっています。 

このサービスでは印刷用のデータを生成するために、複雑で重い処理をしている。

```
# だいたいこんなイメージ
class Item < ActiveRecord::Base
  def generate_manuscript
    # 画像などを生成するめっちゃ重い処理
  end
end
```

こういった処理を書くのに`ActiveJob`を使うのだろうけれど、メソッドを呼び出すだけの処理をわざわざJobを定義するのは冗長だ。

こういった仕組みで簡単に遅延処理ができるようになったのは嬉しい。
Qiita:Team の Export data をmarkdownに変換


Qiita:Teamでは、契約に対しての人数の制限があるので社内でも他の部門等へ見せたい場合などに少し手間がかかります。Qiita:Teamの機能でデータのExportができますのでその内容(json)を変換したいと思いググってみるとありました。


* http://blog.kyanny.me/entry/2015/07/30/020046

すこし古い様でQiitaのフォーマットが変わっておりそのままでは動作しなかったので一部修正しました。以下のファイルを `Rakefile`として保管する。あとは`rake`コマンドで実行する。もしかするとライブラリとか足りないかもしれないのでその時には `gem install json`などとして導入する。


* [変更点](https://gist.github.com/tokida/c495c072c49bdf8c73c4/revisions)


```rb

require 'json'
require 'yaml'
require 'nokogiri'
require 'uri'
require 'faraday'
require 'ostruct'
require 'pry'
require 'time'

def y data
  puts YAML.dump data
end

def fetch_img(item)
  html = Nokogiri::HTML.parse(item.rendered_body)
  html.css('img').each_with_index do |node, i|
    uri = URI.parse(node[:src])
    if uri.host.to_s.match(/qiita-image-store/)
      filename = "#{item.id}-#{i}#{File.extname(uri.path)}"
      File.binwrite("./images/#{filename}", Faraday.get(uri).body)
      item.body.sub!(/#{uri}/, "./images/#{filename}")
    end
  end
end

def fetch_icon(item)
  name = item.user.id
  url = item.user.profile_image_url
  filename = "#{name}#{File.extname(url)}"
  unless File.exists?(filename)
    File.binwrite("./images/#{filename}", Faraday.get(url).body)
  end
  "./images/#{filename}"
end

desc ''
task :default do
  system "rm -rf ./data"
  system "mkdir -p ./data"

  data = JSON.parse(File.read('data.json'), object_class: OpenStruct)

  Dir.chdir('./data') do
    data.articles.each do |article|
      body = ''

      author = article.user.id
      title = article.title.gsub(/[\p{P}]/, '-').gsub(/[[:blank:]]/, '-')
      print("title¥n")
      created_at = Time.parse(article.created_at)
      day = created_at.strftime('%F')
      filename = "%s-%s-%s.md" % [day, author, title]

      year = created_at.year
      month = created_at.month
      system "mkdir -p #{year}/#{month}/images"
      Dir.chdir("#{year}/#{month}") do

        body << "# #{title}\n\n"
        fetch_img(article)
        body << "#{article.body}\n\n"
        icon = fetch_icon(article)
        system "mogrify -resize 32x #{icon}"
        body << "Posted at #{created_at} by <img src=\"#{icon}\"> #{author}\n\n"

        if article.comments.length > 0
          article.comments.each do |comment|
            body << "<hr>\n\n"

            fetch_img(comment)
            body << "#{comment.body}\n\n"

            icon = fetch_icon(comment)
            system "mogrify -resize 32x #{icon}"
            body << "Comment posted by <img src=\"#{icon}\"> #{comment.user.url_name}\n\n"
          end
        end



        File.write(filename, body)
      end
    end
  end
end

```

必要に応じてドキュメントの構成とかREADME.mdつけたりとかすればよいかと。
Sass・Compass clearfixの使い分け

#Sass・Compassでclearfixを使う
Compassにはいろいろなmixinが用意されている
sassを書くとき`@import "compass";`で最初にcompassをインポートしてやれば使えるようになる
##clearfixする
`@include clearfix;`をつけると自動で`overflow: hidden;`をcssとして吐き出してfloatを解除してくれる
通常はこれだけ使うけど、レイアウトによっては`overflow: hidden;`してほしくない
そんなときは**pie-clearfix**

##mixinのclearfix
Compass mixinには3つのclerafixが定義されている

- clearfix
- legacy-pie-clearfix
- **pie-clearfix**

それぞれ出力されるcssはというと
clearfix

```css:css
.hoge {
  overflow: hidden;
  *zoom: 1;
}
```

legacy-pie-clearfix

```css:css
.clearfix {
  *zoom: 1;
}
.clearfix:after {
  content: "\0020";
  display: block;
  height: 0;
  clear: both;
  overflow: hidden;
  visibility: hidden;
}
```

**pie-clearfix**

```css:css
.clearfix {
  *zoom: 1;
}
.clearfix:after {
  content: "";
  display: table;
  clear: both;
}
```

###ということで、ocerflow: hidden; させたくないときは**pie-clearfix**を使う
Sketchで設定したショートカットキー

## ^A (Ctr+A)
Insert->Shape->Arrow

## ^D
Edit->Set Style as Default

## ^F
Plugins->Icon Font->Grid Insert->FontAwesome

## ^N
Layer->Round to Nearest Pixel Edge

## ^M
Arrange->Make Grid...

## ^H
Layer->Transform->Flip Horizontal

## ^.
Layer->Paths->Rotate Copies
Ubuntu14.04でiostatやsarなどのパフォーマンス分析に使うコマンドを導入する


[6万ミリ秒でできるLinuxパフォーマンス分析](https://yakst.com/ja/posts/3601?platform=hootsuite)という良記事があります。
ところが、Ubuntu14.04では、上記の記事で言及されているiostatなど一部のコマンドがインストールされていません。

そんなときは、**sysstat**をインストールしましょう。

```
apt-get install sysstat
```

これでiostatやsarなどが使えるようになります。
Swift アラートでおみくじ

#1. おみくじを引くボタンを作成

ユーティリティエリアのObjectライブラリからButtonを選んで配置します。
"おみくじを引く"というテキストに変更しました。

<img width="200" alt="スクリーンショット 2016-02-27 23.50.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/eeabd7d9-2f1f-54fb-935a-9802247a8ef9.png"><img width="400" alt="スクリーンショット 2016-02-27 23.50.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/15fb9b7c-0901-247a-200e-3ed0d07fae18.png">


#2. ボタンを接続

おみくじを引くボタンをAction接続します。
関数名はshowAlertにしました。

<img width="831" alt="スクリーンショット 2016-02-27 23.51.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/63e5ca53-92f1-8105-8cf0-1d8c87879b1e.png">


#2. コードを書く

ボタンをタップした時のshowAlert()のコードを記述します。


```swift:omikuji

import UIKit

class ViewController: UIViewController {

    // ボタン押した時
    @IBAction func showAlert(sender: AnyObject) {
        
        // アラートを作る
        let alert = UIAlertController(title: nil, message: nil, preferredStyle: .Alert)
        
        // 運勢配列の中からランダムでおみくじ取得
        let luckArr = ["大吉", "吉", "中吉", "小吉", "凶"]
        let r = arc4random_uniform(UInt32(luckArr.count))
        let randLuck = luckArr[Int(r)]
        
        // タイトル、メッセージのセット
        alert.title = "おみくじの結果は"
        alert.message = randLuck
        
        // 閉じる為のボタン作成
        alert.addAction(
            UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)
        )
        
        // アラートを表示
        self.presentViewController(alert, animated: true, completion: nil)
        
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```




#4. 完成

<img width="200" alt="スクリーンショット 2016-02-28 0.03.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/29ac8607-fd7b-8b51-0d1e-3c75fb281a48.png">
kubernetes: コンテナイメージにログインする

kubernetesで起動したコンテナにログインする方法

① pod名確認

```
$ kubectl get pod
NAME                   READY     STATUS    RESTARTS   AGE
nginx                1/1       Running   0          10m
```


② kubectl execコマンド実行

```
kubectl exec -it <Pod名> /bin/bash
```

ログオフする時はexitコマンド

例

```
$ kubectl exec -it nginx /bin/bash
root@nginx:/# 
root@nginx:/# ls
bin   dev  home  lib64	mnt  proc  run	 srv  tmp  var
boot  etc  lib	 media	opt  root  sbin  sys  usr
root@nginx:/# exit
```


kubectlコマンドが発行できるサーバ（Masterなど）でログインできる。
asset_sync manifest fileを整形して、commit時にdiffを見やすくする

asset_syncのmanifest fileがyamlからjson(1行に出力)になり、diffが読みづらくなったので対応
shellでjqを使ってjsonを整形してからコミットするようにした。
asset_sync job自体は自動化している。

```bash:job
for file in `\find ./public/assets/.sprockets-manifest-*.json -maxdepth 1 -type f`; do
    cat $file | jq '.' > out
cat out > $file
rm out
done
```
オリジナルのAMIをPackerでさくっと作成


## 説明
今回のAMIには以下を組み込んだものを作成します。

- CloudWatch CustomMetrics
- AWS CodeDeploy Agent
- Amazon EC2 Simple Systems Manager


今回は、「Amazon Linux AMI 2015.09.2 (HVM), SSD Volume Type」```ami-59bdb937```を指定する。ついでにtimezone変更とロケール変更もしちゃいましょう。

以下の指定はそれぞれの環境に合わせること

- region
- availability_zone
- ami_name
- security_group_id
- ssh_keypair_name
- subnet_id
- vpc_id
- ssh_private_key_file
- ami_description


```packer_create_golden_image.json
{
  "variables": {
    "aws_access_key": "",
    "aws_secret_key": ""
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "ap-northeast-1",
    "availability_zone": "ap-northeast-1c",
    "source_ami": "ami-59bdb937",
    "instance_type": "t2.micro",
    "ssh_username": "ec2-user",
    "ami_name": "packer-image-{{timestamp}}",
    "associate_public_ip_address": true,
    "security_group_id": "sg-xxxx",
    "ssh_keypair_name": "awskey",
    "ssh_private_ip": false,
    "subnet_id": "subnet-xxxx",
    "vpc_id": "vpc-xxxx",
    "ssh_private_key_file": "/Users/hogehoge/.ssh/awskey.pem",
    "ssh_timeout": "10m",
    "ami_description": "packer-image-{{timestamp}}",
    "ssh_pty" : "true",
    "tags": {
      "Name": "packer-golden-ami"
    }
  }],
  "provisioners": [{
     "type": "shell",
     "execute_command": "{{ .Vars }} sudo -E sh '{{ .Path }}'",
     "scripts": [
       "script/script.sh"
     ]
  }]
}
```

```script/script.sh
#!/bin/bash
yum -y update
yum -y groupinstall 'Development tools'

# cloudwatch custom metrics
wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip -P /opt/aws
cd /opt/aws/
unzip CloudWatchMonitoringScripts-1.2.1.zip
rm -f CloudWatchMonitoringScripts-1.2.1.zip
(crontab -l; echo "*/5 * * * * /opt/aws/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --disk-space-util --disk-path=/ --from-cron") | crontab -

# service start
service crond restart

# install codedeploy-agent
aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1
chmod +x ./install
./install auto

# amazon-ssm-agent install
mkdir /tmp/ssm
curl https://amazon-ssm-ap-northeast-1.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o /tmp/ssm/amazon-ssm-agent.rpm
yum install -y /tmp/ssm/amazon-ssm-agent.rpm

# for JST setting
cp /usr/share/zoneinfo/Japan /etc/localtime
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
sed -i -e "s/ZONE=.*$/ZONE=\"Asia\/Tokyo\"/" /etc/sysconfig/clock
sed -i -e "s/UTC=.*$/UTC=false/" /etc/sysconfig/clock
echo 'ARC=false' >> /etc/sysconfig/clock
```

## 確認
```
packer validate -var 'aws_access_key=xxxx' -var 'aws_secret_key=xxxx' packer_create_golden_image.json
```

```Template validated successfully.```が出たらOKです。

## 実行
```
packer  build -var 'aws_access_key=xxxx' -var 'aws_secret_key=xxxx' packer_create_golden_image.json
```

```
（長いので省略）
==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:

ap-northeast-1: ami-xxxxxx
```
このような出力がされたらAMIが正常に作られています。
Groongaで学ぶ全文検索 2016-02-26


[Groongaで学ぶ全文検索 2016-02-26](https://groonga.doorkeeper.jp/events/39274)に参加しました。4回目の参加です。

先日ドキュメントを読んでいたら、「select」はとても重要なコマンドだと書いてあったのでselectについて知りたいと思いました。ということで今回は **「selectでできること」** を教えていただきました。



なんでselectコマンドが重要なのか
--
Groongaの「コマンド」はRDBMSでいう「SQL」にあたります。
テーブルを作成する「table_create」、データを読み込む「load」、データを検索する「select」などがあります。

Groongaは全文検索エンジンなので欲しい情報を取得できることが大事です。だから「select」コマンドが大事なのです。seletを使いこなすことはGroongaを使いこなすことにつながるんだと思います。

selectでできること
--
selectでできることはこんな感じです。

* 全文検索（絞り込み）
* 完全一致検索
* ソート
* 途中から結果を出せる（オフセット）
* **検索結果を特定のキーワードでハイライトさせたりできる（snipet_html）**
* カラムでグルーピングしてレコード一覧出力できる
* **クエリー言語として解析できる**
* 集計できる
 * カウント
 * 合計
 * 平均
 * 最大値
 * 最小値
* **クエリー展開できる**
* カラムの重みづけができる
* **重みの底上げができる**


太字部分に関してピンとこなかったので説明して頂きました。以下に書いていきます。

**検索結果を特定のキーワードでハイライトさせたりできる（[snippet_html](http://groonga.org/ja/docs/reference/functions/snippet_html.html)）**
Groongaには`snippet_html`という関数があります。引数にキーワードを指定すると
`<span class="keyword">キーワード</span>`という形式で返してくれます。アプリケーションでcssを指定することでハイライトさせる等の見せ方が可能です。`snippet_html`ではタグの指定はできませんが、通常はこれで十分です。タグを指定できるプロ仕様の関数もあるそうです。

**クエリー言語として解析できる**
例えばGoogleの検索欄に「A B」と入力すると「A AND B」の条件に一致する検索結果が返されます。「A AND B」と入力した場合も同じです。また、「A OR B」と入力するとAかBいずれか一方でも含まれれば検索結果に出力されます。こんなことがGroongaでもできます。

```
・「A AND B」と入力　→　AとBを含むデータが出力される
・「A OR B」と入力　→　AかBどちらか一方でも含まれれば検索結果として出力される
・「（A OR B）- C」と入力　→　AかBが含まれるデータのうち、Cが含まれないものが検索結果として出力される
・「[カラム名]:[キーワード]」→　カラムを指定して完全一致検索される
・「[カラム名]:@[キーワード]」→　カラムを指定して全文検索される
```

ユーザーが検索条件を柔軟に指定することができるので、アプリケーション側で様々な条件に対応した検索のためのインターフェースを用意していなくても、入力内容によって柔軟な検索が可能になります。


**クエリー展開**
焼き肉のお店を探していて、検索キーワードに「焼き肉」と入力したとき、「焼き肉」、「焼肉」、「やきにく」全部ヒットして欲しい場合があるとします。そのときユーザーが「焼き肉 OR 焼肉 OR やきにく」と入力すればOKですが、入力するのは大変です。そこでGroongaでは、「焼き肉」と入力されると「焼き肉 OR 焼肉 OR やきにく」と自動的に展開するしくみを用意できるようになっています。展開するキーワードとして適切なものはアプリケーションに依存するので、アプリケーション作成者が任意で指定する必要があります。


**重みの底上げ**
カラムの重み付けを利用して検索することで重みが決まりますが、そのあと調整することもできるそうです。
例えばキャンペーンカラムというものがあって、「”春のキャンペーン”が入っていたらそのレコードの重みに+10する」などの指定が可能です。
重み付けはカラムに対してですが、重みの底上げはレコードに対して行うものです。
　　
まとめ
--
* selectでできることがわかりました。試してみたくなりました。
* selectでできることを利用したい場面に直面したとき、適切なものを選択できる気がします。
* `snippet_html`を使って実装した例を[@KitaitiMakoto](http://qiita.com/KitaitiMakoto)さんが見せてくださったのでイメージがわいてすごくわかりやすかったです！
* 会中、隠しきれないほど絶え間なくお腹がなってしまいました。。次回からはお菓子食べてから行きます(>_<)
PythonでSlackに投稿する

機械学習の学習が終わったあと、結果を通知して欲しくて、調べたんでメモ。

Incoming Webhookを使う。
詳しくは、[マニュアル](https://api.slack.com/incoming-webhooks)で。

# SlackでIncoming Webhookの登録をする

1. Slackのアプリで、「Add an app or custom integration」を押す。
2. ブラウザが立ち上がるんで、右上にある「Build your own」を押す。
3. 「Make a custom integration」を押す。
4. 「Incoming Webhook」を押す。
5. 投稿先のチャンネルを選んで作成すると、URLが出てくるんでコピーしとく。

# Pythonを書く

実質、ワンライナー。

[requests](http://requests-docs-ja.readthedocs.org/en/latest/)を、pipとかで入れとく。

```py
import requests
import json

requests.post('上でコピったURL', data = json.dumps({
    'text': u'Test', # 投稿するテキスト
    'username': u'me', # 投稿のユーザー名
    'icon_emoji': u':ghost:', # 投稿のプロフィール画像に入れる絵文字
    'link_names': 1, # メンションを有効にする
}))
```

使える絵文字リストは[こちら](http://www.emoji-cheat-sheet.com/)。
`icon_url`でプロフィール画像を指定することもできる。

`link_names`に関しては、[ここ](https://groups.google.com/d/msg/slack-api/HBmj2XaG_g0/ezVyvfUSOmIJ)にこっそり書いてた。
Vue.js Componentは、何らかのタグでラップしよう

## コンポーネントでテンプレートを設定する場合
少し戸惑った内容を備忘録としてメモします。vue.jsのcomponent周りのprop伝達作法を使った場合ですので、ver0.12以降が対象です。

```
<div id="contents">
 <componentHoge item={{fuga}}></componentHoge>
</div>
<script>
var main = new Vue({
  el: "#contents",
  data: {
    fuga: 1
  },
  components: {
    'component-hoge': {
       replace: true,
       props: ['item'],
       template: "#for-hoge",
       data: function () {
         return { item: null}
       }
  });
</script>
<script type="text/x-template" id="template-combine-table">
  <div>hogehoge</div>
</script>
```
のようなベーシックな構造を書いた場合で、例えば、fugaが1以外の場合のみ表示する「v-if」を描こうとした場合、

```
<script type="text/x-template" id="template-combine-table">
  //item（fuga）が1ではない時だけ表示
  <div v-if="item != 1">hogehoge</div>
</script>
```
とかいても、うまく反映されません。実際に書き出されるコードをみると、

```
<div item="1"></div>
```
と書きだされてしまいます。これは、componentのreplaceフラグをtrueとしていることで、<componentHoge></componentHoge>が<div ~>に置き換えられているためです。正しく動作させる場合は、置き換え用のタグでラップしてあげましょう。

```
<script type="text/x-template" id="template-combine-table">
<div>  
    <div v-if="item != 1">hogehoge</div>
</div>
</script>
```
もしくは、単に、

```
<componentHoge v-if="fuga != 1" item={{fuga}}></componentHoge>
```
と、componentタグ側に指定してあげても大丈夫です。
3日目 => デザインパターン（コンストラクタパターン）

# はじめに
今日はデザインパターン。


# コンストラクタパターン
## オブジェクトコンストラクタ
特定の型のオブジェクトを作成するために使用

```js
var obj = {};

var obj = new Object();
```

## オブジェクトにキーと値を割り当て

```js
var obj = {};

// ドット構文
obj.name = "SAMPLE";


// 角括弧構文
obj["age"] = 16;


// definePropertyの利用
var obj2 = {};
Object.defineProperty(obj2, "mother", {
  value: "お母さん",
  writable: true, // 値が変更可能かどうか
  enumerable: true, // 指定されたプロパティが列挙可能かどうか
  configurable: true // falseだとdeleteできない・再定義不可
});

for(var key in obj2){
  console.log(key);
}
// enumrableがtrueだと'mother'が出力される


// definePropertiesの利用
var obj4 = {};
Object.defineProperties(obj4, {
  sister: {
    value: "妹",
    writable: true
  },
  brother: {
    value: "兄",
    writable: true
  }
});
```

JavaScriptには基本的にクラスというものがないけど、
コンストラクタ関数を用いることで似たようなことができる、と。

```js
// コンストラクタ関数
function CreateHuman(name, age){
  this.name = name;
  this.age = age;
  this.introduction = function(){
    console.log("私は" + this.name + "。年齢は" + this.age + "歳です。");
  }
}

var hanako = new CreateHuman("花子", 16);
hanako.introduction();
```

```js
// プロトタイプを利用
CreateHuman.prototype.toString = function(){
  return console.log("私は" + this.name + "。年齢は" + this.age + "歳です。");
}

var taro = new CreateHuman("太郎", 18);
var jiro = new CreateHuman("次郎", 15);

taro.toString();
jiro.toString();
/*
私は太郎。年齢は18歳です。
私は次郎。年齢は15歳です。
*/
```

# おわりに
definePropertyは知らなかった。こんなのもあるのかー。

# 参考
* [Object.defineProperty()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
* JavaScriptデザインパターン
Java の JSON Class 自動生成

# Overview
最近 Android アプリを作成してまして、そうなると必然的に API から JSON
を受け取ることも多々あるわけです。
手作りのクラスもいいですが、私はめんどくさがりなので、サンプルの JSON があったら
そこから自動でクラスを生成してくれる、そんな方法を探してみました。
また、ブラウザに貼り付けて生成するようなやり方ではなく、全てローカル内で完結します。
Windows でやろうとすると面倒かもしれないです・・・。
私の環境は debian8 です。
各OSで適宜読み替えてください。

## Class を生成したい sample.json を手に入れる
今回使用するサンプルは以下にしました。
http://json.org/example.html
`cat sample.json`
code だと空白が無視されて見づらいので、JSON は画像にしてあります。
![Screen Shot 2015-11-26 at 12.18.27 AM.png](https://qiita-image-store.s3.amazonaws.com/0/40532/0846f62a-8b3f-1a1e-d153-028ccf684d96.png)


## 見やすいようにフォーマットを適用する
`cat sample.json | python -m json.tool > sample_formatted.json`
リダイレクトする前のフォーマットされた JSON は以下です。
![Screen Shot 2015-11-26 at 12.21.47 AM.png](https://qiita-image-store.s3.amazonaws.com/0/40532/f63e0666-df13-4af2-3379-ce0d2d2a1c9a.png)
いつもフォーマットを適用していると見慣れてくるので安心です？

## sample.json から sample.schema を生成する
[json-schema-generator](https://github.com/maxlinc/json-schema-generator)を利用します。
rubyの実行環境が必要になります。

```bash:generate-json-schema
gem install json-schema-generator
json-schema-generator sample.json > sample.schema
```

少し長いですが、以下のような json schema が出力されます。
リダイレクトして sample.schema として保存します。
![Screen Shot 2016-02-27 at 10.58.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/40532/1acda48a-f38e-a52a-dff0-b634302ebda2.png)

## sample.schema から Java Class を生成する
[jsonschema2pojo](https://github.com/joelittlejohn/jsonschema2pojo/wiki/Getting-Started#the-command-line-interface)を利用します。
以下から最新の jar ファイルをダウンロードします。
https://github.com/joelittlejohn/jsonschema2pojo/releases
ダウンロードしたら、適当なディレクトリに解凍します。
Java Class を生成してみます。

```bash:generate-java-class
jsonschema2pojo --source sample.schema --target java-gen
ls java-gen
GlossDef.java   GlossDiv.java   GlossEntry.java GlossList.java  Glossary.java   Sample.java
```

`@Override`で自動生成されるメソッドがありますが、特に使う必要がない場合は削除した方がいいです。
利用しようと思ったら`commons IO`が必要になるかと思います。
あとは作成された .java ファイルを利用したい Android Project にコピーしたら終わりです。

## Android Project で必要な Jackson library
以下が Jackson を利用にあたって必要になるライブラリです。
バージョンは利用する際に最新にした方がいいですね。

```gradle:jackson-libraries
    compile 'com.fasterxml.jackson.core:jackson-core:2.7.1'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.1'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.7.1'
```
Eclipse 4.5でRuby開発環境を整える

## 概要
Eclipse4.5を利用してRubyの環境を作成するまで。

## 実行環境
OS X El Capitan‎ 10.11.3
Eclipse 4.5

## Ruby開発ツールをEclipse上にインストールする
「ヘルプ」→「新規ソフトウェアのインストール」の画面を開く。
作業対象を "--すべての使用可能なサイト--" にしてしばらく待つと下記の画像のようになる。

<img width="867" alt="EclipseRuby.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/60525136-a62e-a010-995e-e5b035b13647.png">


「Ruby開発ツール」「Ruby Development Tools SDK」を選択し次へ進んでいく。

## Eclipseの再起動
Eclipseを再起動されるように促されるので再起動を行う。

## Rubyプロジェクトの作成が出来る事を確認する
「ファイル」→「新規 →「Rubyプロジェクトの作成」よりプロジェクトの作成を行う事が可能になっている。

<img width="583" alt="EclipseRuby2.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/a5cea17d-9c18-014e-1be3-2c026107e1bc.png">

## インタープリターの追加
次にインタープリターの追加を行う。
事前にrbenv等を利用してインストールを行っておく必要がある。
（参考）[rbenvを使ってSinatraの実行環境を整えるまで](http://qiita.com/keita-nishimoto/items/8a89a176943a44adbebb)

###「Eclipse」→「環境設定」→「Ruby」→「インタープリター」の順に開いていく。

<img width="446" alt="ruby_interpreter1.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/bb5e6870-67f8-5bfd-e10f-cf82007decfc.png">

###「追加」をクリックする。
<img width="742" alt="ruby_interpreter2.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/76f5f48b-4511-87af-b2f7-e9d49ed3aca4.png">

### 下記の画面でインストールされているRubyのパスを選択する。
※私の場合はrbenvを使ってインストールしたので、/Users/nishimotokeita/.rbenv/shims/ruby を選択した。

<img width="601" alt="ruby_interpreter3.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/cbc0e4ee-d99a-23ff-e5b2-e75996fa1a7d.png">

## Rubyプロジェクトを作成する
「ファイル」→「新規」→「Rubyプロジェクト」を選択する。

<img width="446" alt="ruby_interpreter1.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/0ff1fbfb-ed0a-c0e9-a27d-c1208d4dd577.png">

プロジェクト名を入力して「完了」をクリックする。
<img width="557" alt="create_ruby_project2.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/957da73e-7304-6c94-22e8-cdacd4f2e3a8.png">

これでEclipseでRubyの開発が出来るようになる。
元々Git上に管理されているRubyプロジェクトをEclipseに取り込みたい場合もある。
その場合は一度、Eclipseに通常のプロジェクトとしてインポートした後に、.buildpathと.projectを以下のように編集する事でRubyのプロジェクトと認識された。

※rubytestは自分のプロジェクト名に合わせてね。

```xml:.buildpath
<?xml version="1.0" encoding="UTF-8"?>
<buildpath>
	<buildpathentry kind="src" path=""/>
	<buildpathentry kind="con" path="org.eclipse.dltk.launching.INTERPRETER_CONTAINER"/>
</buildpath>
```

```xml:.project
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>rubytest</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.dltk.core.scriptbuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.dltk.ruby.core.nature</nature>
	</natures>
</projectDescription>
```
Swift - 观察者模式(属性监听)


```Swift
//  Created by Kxx.xxQ 一生相伴 on 16/2/22.
//  Copyright © 2016年 Asahi_Kuang. All rights reserved.
//

import Foundation

// Swift-观察者模式(属性监听),当给对象的属性赋值时，可以用willSet和didSet进行对象属性值变化的观察。
// willSet表示属性即将改变通知回调方法，didSet表示属性已经改变通知回调方法。
// warning!: 观察者模式不能用于懒加载的类属性。

class student {
    var stuName: String = "" {
        willSet {
            print("姓名即将修改,新值为:\(newValue)")
        }
        didSet {
            print("姓名已经修改,旧值为:\(oldValue)")
        }
    }
    
    var stuID: String = "" {
        willSet {
            print("学号即将修改,新值为:\(newValue)")
        }
        didSet {
            print("学号已经修改,旧值为:\(oldValue)")
        }
    }
    
    init(name: String, id: String) {
        stuName = name
        stuID   = id
    }
    
}


let stu = student(name: "邝清旭", id: "20161991")
print(stu.stuName," ", stu.stuID)

stu.stuName = "夏小秋"
stu.stuID   = "20161993"

print(stu.stuName," ", stu.stuID)
```
Swift - 泛型


```Swift
//  Created by Kxx.xxQ 一生相伴 on 16/2/27.
//  Copyright © 2016年 Asahi_Kuang. All rights reserved.
//

import Foundation

// Swift - 泛型

// 泛型是根据需求定义的，适用于任何类型的，灵活且可重用的函数和类型，可以避免重复的代码，用一种清晰和抽象的方式来表达代码的意图。
//泛型可以让代码更加简洁，避免代码重复，类型检查更加的严格。

// 交换值。ps. 参数的类型必须一致，Swift是类型安全的语言，不允许不同类型互换值。
func swapTwoValues<T>(inout a: T, inout b: T) {
    let temp = a
    a = b
    b = temp
}


// 可以交换任意相同类型的两个值
var a: Int = 15
var b: Int = 26
swap(&a, &b)    //inout关键字 必须取地址
print(a, b)
// 输出 26 15

var string1: String = "Hello"
var string2: String = "World"
swap(&string1, &string2)
print(string1, string2)
// 输出 World Hello



// 泛型类型
struct stack<T> {
    var items = [T]()
    mutating func push(item: T) {
        items.append(item)
    }
    mutating func pop() {
        items.removeLast()
    }
}

var stackObject = stack<String>(items: ["Hello", "World"])
stackObject.push("NewString")
stackObject.push("NewStringTwo")
stackObject.pop()
print(stackObject.items)
// 输出   ["Hello", "World", "NewString"]

// 扩展泛型类型
extension stack {
    var topItem: T? {
        return items.isEmpty ? nil : items[items.count - 1]
    }
}
var test = stack(items: ["1", "2", "3"])
print("the top item in stack.items is \(test.topItem!)")
// 输出  the top item in stack.items is 3



// 类型约束。可以将泛型强制约束为指定类型
func findIndex<T: Equatable>(array: [T], valueToFind: T) ->Int? {
    for (index, value) in array.enumerate() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

let values = ["sd", "ge", "xx"]
let index = findIndex(values, valueToFind: "ge")
print(index)
// 输出   Optional(1)
```


![pic url](https://raw.githubusercontent.com/Asahi-Kuang/picture/5505275c3acc85b4b89220705cc98376c20e902f/805A5E36-1284-4068-819D-BE1B071FD1E8.png)
Jupyter上でmatplotlibのアニメーションを再生する


# デモ
![demo_nb.gif](https://qiita-image-store.s3.amazonaws.com/0/40987/9eda5f23-ff36-09c5-a8f5-e58f87881e8d.gif)

# 方法
```py
%matplotlib nbagg
```
を加えることで、matplotlibの__nbagg__が有効になり、Jupyter上でアニメーションが再生できます。

[matplotlibの公式の説明](http://matplotlib.org/users/whats_new.html#the-nbagg-backend)によると、__nbagg__はmatplotlib 1.4で新たに追加された機能で、Jupyter上でのインタラクティブな画像表示を実現するための機能だそうです。

以下はデモのソースコードです。

```py:demo.py
%matplotlib nbagg

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
x = np.arange(0, 10, 0.1)

ims = []
for a in range(50):
    y = np.sin(x - a)
    im = plt.plot(x, y, "r")
    ims.append(im)

ani = animation.ArtistAnimation(fig, ims)
plt.show()
```

# 参考
Matplotlib animation not working in IPython Notebook (blank plot) - Stack Overflow
http://stackoverflow.com/questions/25333732/matplotlib-animation-not-working-in-ipython-notebook-blank-plot

What’s new in matplotlib — Matplotlib 1.5.1 documentation
http://matplotlib.org/users/whats_new.html#the-nbagg-backend

Pythonで簡単なアニメーションを描いてみる - Qiita
http://qiita.com/Tatejimaru137/items/3fdcc38cf8247b7056aa
Moveit 使用時に，Rviz 上の Octomap が更新されない場合の処置方法

# はじめに
`Moveit`において，経路計画で障害物を避ける際に，Octomapの情報を使っています．これが`Moviet setup assistant`で出力されたデフォルトの設定だと`Rviz`上で更新されずにハマったので，メモを残します．

# 手順
- 適切な手順で`ロボット名_moveit_config/launch/moveit.rviz`を開く．
- 起動されたRvizにて，「MotionPlanning」→「Planning Scene Topic」を確認する．
![octomap.png](https://qiita-image-store.s3.amazonaws.com/0/110138/ca71bd6c-ed77-43d3-3993-47b0330baacb.png)

- この設定が，`Moviet setup assistant`で設定した直後だと，`/planning_scene`というトピック名になっている場合がある．これだと，初期値のみ表示され，更新が行われない．

- これを，`/move_group/monitored_planning_scene`に変更すれば，Octomapが定周期で更新される．なお，更新周期は`publish_planning_scene_hz`というトピックで確認できる．

# 終わりに
本件，何故かドキュメントが見つからず，関係者みんなで困っていました．

Octomapの出力先のトピック名さえ分かれば良かったのでしょうが，`Planning Scene Topic`という設定項目名や，`monitored_planning_scene`というトピック名が，直感的にOctomapと結びつかなかったのは，私達だけでしょうか^^;

海外のフォーラムでも同じネタで多いに盛り上がって，頑張ってソースコードを変更しようと試みていた例もありました．意外と罠かもしれません．

ということで，念のためメモを残したということです．
お寺用

#お寺用
2016/02/28　コピーするように修正
元フォルダの内容をリスト化、
リスト項目が指定したディレクトリ以下で見つかればコピー
リスト項目内容が新規であれば別フォルダにコピー

```applescript
on open myDrop
	display dialog "ドロップしたフォルダ内の項目を元に振り分けます"
	set myEPSCount to 0
	set myJPEGCount to 0
	set myDrop to POSIX path of myDrop
	set myList to paragraphs of (do shell script "find " & myDrop & " -iname \"*.*\"")
	set myFindDir to POSIX path of (choose folder with prompt "epsのある上位フォルダ")
	set myOutDirEPS to POSIX path of (choose folder with prompt "既にある処理済みEPSをコピーするフォルダ")
	set myOutDirJPEG to POSIX path of (choose folder with prompt "処理依頼JPEGをコピーするフォルダ")
	
	repeat with i in myList
		set iJPEG to do shell script "echo " & i & " | sed \"s|.*/\\(.*\\)\\..*|\\1|\""
		set iEPS to do shell script "echo " & iJPEG & " | sed \"s|\\(.*\\)|\\1\\.eps|\""
		do shell script "find " & myFindDir & " -iname \"" & iEPS & "\""
		if result is "" then
			do shell script "cp " & quoted form of i & " " & quoted form of myOutDirJPEG
			set myJPEGCount to myJPEGCount + 1
		else
			do shell script "cp " & quoted form of result & " " & quoted form of myOutDirEPS
			set myEPSCount to myEPSCount + 1
		end if
	end repeat
	display alert "JPEGファイルを" & myJPEGCount & "個、EPSファイルを" & myEPSCount & "個コピーしました"
end open
```


↓要求仕様読み違えてた




```applescript
on open myDrop

---　デスクトップに作るファイル名を指定
	set myEPStext to "~/Desktop/filename_EPS.txt"

	tell application "Finder"
		activate

--　処理ファイル数リセット
		set myCount to 0

--　ドロップしたフォルダ内のファイルを取得
		set myFile to every item of folder (myDrop as string)

--　findコマンドで検索するフォルダを指定。このフォルダから下を全て検索する
		set myPath to POSIX path of (choose folder with prompt "切り抜きしたEPSのあるフォルダの最上位フォルダを選択")

--　検索実行＆拡張子を除くファイル名だけをデスクトップに書き出し
		do shell script "find " & myPath & " -iname \"*.eps\" | sed \"s|.*/\\(.*\\)\\..*|\\1|\" > " & myEPStext

--　ドロップしたフォルダ内の項目の数だけリピート処理
		repeat with i in myFile

--　ドロップしたファイル名から拡張子を削除
			set myName to do shell script "echo " & (i's name) & " | sed \"s|\\(.*\\)\\..*|\\1|\""

--　on errorを使うためのtry
			try

--　ドロップしたファイル名と同じファイル名が、デスクトップに書き出したファイルリストに存在するか？
				set i to do shell script "grep -ixFc " & quoted form of myName & " " & myEPStext

--　ない（エラーが帰る）
			on error

--　ラベル付けとカウンタアップ
				set label index of i to 2
				set myCount to myCount + 1
			end try


		end repeat
		display dialog "切り抜きしていないファイル　" & myCount & "個にラベルをつけました"
	end tell
end open
```

スクリプトエディタにコピペ、保存時にファイルフォーマットをアプリケーションにして保存