OmniAICreator/Qiita-1.07M huggingface dataset:
npm publishの流れとそれを1コマンド行うnp

npm publishをする前の前提を確認してみます。

## npm publish前に確認すること

### 1. git status
gitにコミットしてないファイルがないか。
npm publishはgitの結果ではなく現在のファイルを公開するので、commitにファイルを変更していたらそれが公開されてしまいます。

### 2. git fetch
リモートレポジトリの方が進んでいないか。

### 3. node_modulesを削除しnpm installを実行
最新の依存関係で動作するか。

### 4. npm test
テストが通るか

### 5. バージョンを上げ、git tagを作成
```
$ npm version  [ major | minor | patch ]
```
npm versionを実行すると、タグ付けとコミットを自動で行います。
基本的にセマンティックバージョニングに従います。
いきなりメジャーバージョンを付加することは稀なので、はじめは`npm version minor`を実行しましょう。

### 6. npm publish
ここまで来たら安心してnpm publishができます。
が、今のところnode v6におけるnpm publishでバグがあり、node v5系でpublishした方が安全でしょう。

### 7. git push
バージョンアップをリモートレポジトリにも反映しておきます。

```
$ git push --follow-tags
```

以上でnpm publishの流れは完了です。


## np
さて、上記の処理を毎回行うのは非常に面倒ですが、それを1コマンド行ってくれるのがnpモジュールです。

[sindresorhus/np: A better `npm publish`](https://github.com/sindresorhus/np)

npmからダウンロードできます。

```
$ npm install --global np
```

npで実行できます。デフォルトでは、patchバージョンになります。

```
np [patch | minor | major | <version>]
# `patch` is default
```

新しいモジュールを作成したときは、minorで公開すると思うので、以下のコマンドを打てば公開できます。

```
$ np minor
```

他にもnpm pulishを便利にするライブラリはありますが、作者が安心と安定のsindresorhus(npmライブラリの1年間のダウンロード数合計が20億超えのnode.js界のユニコーン)なのでこれを使っています。
「サカナクションのライブのオセロのやつ」、processingで作ってみた。

#はじめに
![サカナクションのライブのオセロのやつ](http://image.emtg.jp/music.emtg.jp/datas/article/2272/lp_12_12_590.JPG)
「サカナクションのライブのオセロのやつ」は、上のこれです。
2013年のライブのアルデバランの時の写真です。
くっきりとしてないので見えにくいかもしれませんが、
ボーカル山口一郎の姿が、後ろのスクリーンでオセロの表裏を使って表現されてます。
今回はこれをprocessingで作る手順を紹介します！

ちなみに、完成品は下のような感じに動きます！
![OthelloScreen](https://i.gyazo.com/7dda06b0df4d732b7eac3ef4deec79f0.gif)

こんな感じにオセロがクルクルしています！
![demo OthelloScreen](https://i.gyazo.com/21c220071a599b6107efd078752ce521.gif)

#ちなみに、Processingとは
processingはプログラムでお絵描きできるやつです。
（参考：[プログラミング初心者でも大丈夫！Processingでデジタルアートを作ろう](http://liginc.co.jp/186614)）
modeを選べば、JavaやJavascriptやPythonなどでも書けるので、便利です！

#コードの説明
[Github] [OthelloScreen](https://github.com/namitop/OthelloScreen)
このProcessingのプロジェクトはGithubにあげたので、全体のコードはそちらをご参照ください！
この記事では要点をまとめたいと思います。
ちなみに、今回はmodeをJavaにして書きました。
結構シンプルなので、お暇なときに気軽にどうぞ！


###・全体の処理 
処理の流れは、
①カメラの画像を横方向だけ反転(Mirrorって言われるprocessingのデフォルトで入ってるやつ)
②指定した画像のpixelを明暗にする
③明暗の値をオセロの傾きに置き換えて、オセロを描画
です。

###・実行画面とオセロの大きさの設定
```java
int screenWidth = 1280;//checked 640, 1280
int screenHeight = screenWidth*3/4;
int cellSize = 20;
```

画面のサイズをここで、screenWidth(横)とscreenHeight(縦)で指定します。
オセロの大きさはcellSizeの値を変えることで変わります。
ただ値が小さすぎると処理が重くなるのでカクカク動いちゃいます。

###・ドラッグして向きを変えれるように・・・
```
    if(isMouseDragged){
      translate(width/2,height/2,0);
      rotateX(-(mouseY-height/2) / 150.0);
      rotateY((mouseX-width/2) / 200.0);
      translate(-width/2,-height/2,0);
    }
```
ドラッグすると見る向きを変えることができます。
ここは多分もっとライブラリうまく使ったら、かっこよくできるはずです。

###・カメラ画像のどのpixelの情報を処理するか＆カメラ画像をミラー
```java
int loc = (video.width - x - 1) + y*video.width; // Reversing x to mirror the image
```
colsとrowsの値は、実行画面とオセロの大きさに紐付いて決まります。
明暗を参照するピクセルをlocに代入しています。
この時、カメラ画像が横方向に反転するようになっています（ミラーと言われる処理みたいです）。
ミラーをすることで自分の体を左に傾けると、
自分の視点からだと映像の体は左に傾く(映像の自分の視点だと体が右に傾いている)ので、
違和感なく映像を見ることができます。


###・draw_othelloメソッドに画像の明暗の値を入れる
```java
othellos.get(i*(rows) + j).draw_othello(brightness(video.pixels[loc]));
```
pixelにある色情報をbrightnessで明暗だけにして、
Othelloクラスのarraylistのそれぞれの要素のdraw_othelloメソッドに明暗の値を入れています。

###・Othelloクラスのdraw_othelloメソッド
draw_othello_shapeメソッド前に、
黒か白を指定し、オセロにrotateで傾きをつけています。

###・Othelloクラスのdraw_othello_shapeメソッド
processingの基本図形では円柱状のものがないので、
長くなっちゃいますがこのメソッド内にあるように書きます。

###・pushMatrixとpopMatrix
全体でちらほら使っているメソッドですが、
pushMatrixで現在の座標を保存して、
popMatrixで保存した座標を再展開しています。

#終わり！
以上で[OthelloScreen](https://github.com/namitop/OthelloScreen)の要点の説明は終わりです！楽しんでください!
Python2でも愛が生まれた

元ネタ: http://qiita.com/dongri/items/041ff3e7dde6c99beeb0

Python2だとなんか面倒くさい。

```py
>>> print unichr(ord("生".decode("utf-8")) & ord("死".decode("utf-8")))
愛
```

- python3: http://qiita.com/gyu-don/items/e2ae15843049f617d500
- 解説: http://qiita.com/tienlen/items/44daf3a52eb872085556
GKE の小さいクラスタで rolling-update しようとして失敗していた話

## はじめに

弊社では GCP（Google Cloud Platform）上の GKE（Google Container Engine）を使用して幾つかのサービスを提供しています。docker を使う理由というのは以前にも何度か（Appendix参照）書いたので、そちらを参照していただければと思います。
付け加えるとすれば、環境の差異を吸収してくれるし、pod が落ちたら勝手に生き返らせてくれるし、デプロイするのにダウンタイムとかエラーとか気にしなくて良いし（これは後述します）、控えめに言って後戻りはしたくないです。

とは言うものの、まだ日の浅い技術なので運用していくと色々と問題が出てきます。
そこで、わりとクリティカルな表題の問題に当たったので、自身への備忘の意味も込めて書いておきます。

## 想定読者

* docker に関する基礎的な知識を有している人
* kubernetes を触り始めた人
* GCP（GKE）を使用している人

## rolling-update とは

Kubernetes を用いると、コンテナをアップデートする際にダウンタイムを無くすことができます。
内部的には、既存のコンテナが稼働しているのを検知すると、新しいコンテナを稼働状態（ただしサービスインはしない）にし、新しいコンテナでエラーがないかどうか確認します。

もしエラーが発生していた場合、新しいコンテナと入れ替える作業を停止します。これにより、エラーが発生しているコンテナをサービス前面に出してしまうのを防ぐことができます。

もしエラーが無ければ、新しいコンテナと古いコンテナとを並行稼動状態にし、その後古いコンテナを削除して通常状態に戻ります。

以上の流れによって、Kubernetes はコンテナのアップデートによってサービスにダウンタイムが生じるのを防いでいます。

※ [この issue](https://github.com/kubernetes/kubernetes/issues/16737) のコメントを読むと勉強になります

## rolling-update の失敗例 on GKE

ここから GKE に特化した話になります。
GKE で docker を使用して rollling-update する場合、イメージをプッシュして

```
$ kubectl rolling-update ${SERVICE_NAME} --image=asia.gcr.io/${PROJECT_ID}/${CONTAINER_TAG_NAME}:${CONTAINER_TAG_VERSION}
```

とすればアップデートできます（v1.2.3現在）。
ここで、幾つかのエラーによって、アップデート自体が失敗することがあります。
今まで私が観測した中で、最も多かったのは次のエラーです。

```
error: timed out waiting for any update progress to be made
```

求めているのはこの情報ではないと言いたくなるメッセージです。
そこで、ここから調査をするために、以下のコマンドを使用します。

```
$ kubectl get pods
# => 現在 GKE で稼働している pods を一覧する

$ kubectl describe pod ${POD_NAME}
# => pod の状態を詳細に見る
```

2つ目のコマンドでアップデートしようとしている pod を見ると、Events という項目がありエラーの詳細が書いてあります。
私が直近ハマったエラーは、以下のようになっていました。

```
Events:
  FirstSeen     LastSeen        Count   From                    SubobjectPath   Type            Reason                  Message
  ---------     --------        -----   ----                    -------------   --------        ------                  -------
  6m            4s              27      {default-scheduler }                    Warning         FailedScheduling        pod (ポッド名) failed to fit in any node
fit failure on node (ノード名): Node didn't have enough resource: CPU, requested: 100, used: 970, capacity: 1000
```

つまり、リソース（CPU）足りないからアップデートできないよ！と裏で訴えられていたのですが、気づかずに timeout のエラーをググッていました。

実は、このノードは幾つかのサービスを相乗りさせており、リソースもそれほど確保していなかったために、このようなエラーが発生していました。普段は 20% くらいしか CPU を使っていなかったので、気づくのが遅れました。

そこで、ノードの数を増やし、再度 rolling-update を行うことで、無事にダウンタイム無しでアップデートを行うことができました。

### 余談

これは余談ですが、ノード台数の上げ下げは、

```
gcloud compute instance-groups managed set-autoscaling ${INSTANCE_GROUP_NAME} --max-num-replicas=2
```

とかすると変更できます。詳しくは、 [set-autoscaling](https://cloud.google.com/sdk/gcloud/reference/compute/instance-groups/managed/set-autoscaling) 参照。

## まとめ

GKE上で docker + kubernetes運用をする際に現れるエラーの１つとその解決策、それから調査方法を書きました。


## Appendix

<aside id="internal-links">
<ol>
<li><a href="http://qiita.com/chase0213/items/6f08d5177e74f30b30f9">なぜベンチャーで docker を使うのか</a></li>
<li><a href="http://qiita.com/chase0213/items/f9019f745381c0cf1ff5">（続）なぜベンチャーで docker を使うのか</a></li>
</ol>
</aside>
MVCのModelって何なの問題


PHPのフレームワーク「Laravel」やiOSのデータベース「Realm」などではデータベースとオブジェクトを紐付けるORM(O/Rマッピング)をModelと呼びます。
そこでMVCのModel=ORMなどのDBのデータ+操作と勘違いしてしまいそうですが、MVC本来のModelはその他のビジネスロジックも含みます。

iOSやAndroidなどのアプリを例にとると以下もModelの仕事です
- 通信してデータを取得(通信処理はデータ層)、取得したデータをDBに入れたり(DBの処理もデータ層)メモリキャッシュする
- 値(Entity)をメモリキャッシュ、通信、DBなどから取得

※Androidのアーキテクチャで悩んだ時、以下のとおりに作れば問題なさそうです(2017年6月現在
https://developer.android.com/topic/libraries/architecture/guide.html


参考

- やはりお前らのMVCは間違っている
http://www.slideshare.net/MugeSo/mvc-14469802

- iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い
http://www.slideshare.net/mokemokechicken/iosandroidmodel

- O/Rマッピング技術の進化が皮肉にも助長している「えせMVC症候群」
http://satoshi.blogs.com/life/2009/10/ormappingmvc.html
swfファイルのバイナリからRubyで縦横のサイズを取り出す

http://doruby.kbmj.com/hal_on_rails/20100411/SWF_ を参考にコードを書いてみたのですが、使う機会がなかったのでここに残しておきます。

```rb:swf_file.rb
class SwfFile
  # @example:
  #   SwdFile.new("foo.swf")
  def initialize(path)
    @path = path
  end

  # @example:
  #   x_min, x_max, y_min, y_max = swf.stage_size
  def stage_size
    File.open(@path) do |io|
      io.read(8) # header

      # どんなに長くても 5+31*4 bitなので16byteで十分
      buf = io.read(16).bytes.map { |i|
        "%08d" % i.to_s(2)
      }.join

      # 最初の5bitが以降の区切りの長さ(bit)
      l = buf[0, 5].to_i(2)

      # 最初の5bitを消しておく
      buf[0, 5] = ""

      [
        buf[0, l], # x_min
        buf[l, l], # x_max
        buf[l * 2, l], # y_min
        buf[l * 3, l], # y_max
      ].map { |i|
        # 1pt=20twips
        i.to_i(2) / 20
      }
    end
  end
end
```
border-radiusで丸くした部分にoverflow:hiddenが効かない対処法


Wrapper要素にmask-imageを追加すると直ります。

```style.css

-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);

mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);

```
edisonをSDカードからブートする

[spakfanのモジュール]()を参考に秋月のパーツで作成して接続！
- [SDカードソケット](https://akizukidenshi.com/catalog/g/gK-05488/)
- [レベル変換IC](https://akizukidenshi.com/catalog/g/gM-04522/)

![IMG_4928.JPG](https://qiita-image-store.s3.amazonaws.com/0/92080/6c6285ea-589d-c902-da15-165ed18aa938.jpeg)
![IMG_4929.JPG](https://qiita-image-store.s3.amazonaws.com/0/92080/72c7d9af-2c62-ed86-4089-8740bd0925a1.jpeg)


/dev/mmcblk1として認識するのを確認したら、fdiskでフォーマットする。
元はFATだけど、起動ディスクとして使いたいので16GBを２つのパーティションにしておく。

それぞれext4でフォーマットしておく。

まずは、/dev/mmcblk1p2は/homeをごそっとコピーして、
/eyc/fstabを修正してhomeを拡張する。
```
$ sudo mount /dev/mmcblk1p2 /mnt
$ sudo rsync -rv /home/ /mnt/
$ sudo blkid
(SDカードのIDを取得してfstabに書く)
```

ブートするrootfsの変更は、
[こちら](http://sarweshcr.blogspot.jp/2015/11/Boot-Intel-Edison-from-SD-card-with-Debian-or-Ubilinux.html?m=1)を参考にして、
ますは、ubilinuxのイメージを[ここ]()から落としてきて拡張したhomeに展開。toFlashフォルダのなかのイメージをddでmmcblk1p1にコピーして、resize2fsで拡張する。
あとはubilinuxのubootの環境変数を以下のように書き換えて再起動。

```
edison@ubilinux:~$ diff uboot_org.txt uboot_sdc.txt
0a1
> boot_rootfs=PARTUUID=012b3303-34ac-284d-99b4-34e03a2335f412c13,15
< do_bootargs_rootfs=setenv bootargs_rootfs rootwait root=PARTUUID=${uuid_rootfs} rootfstype=ext4
---
> do_boot_rootfs_mmc=setenv boot_rootfs PARTUUID=${uuid_rootfs}
> do_boot_rootfs_sdc=setenv boot_rootfs /dev/mmcblk1p1
> do_bootargs_rootfs=setenv bootargs_rootfs rootwait root=${boot_rootfs} rootfstype=ext4
```

SDカードから起動する前にWiFiの設定を移しておく

```
sudo su
mount /dev/mmcblk1p1 /mnt
cp /etc/network/interface /mnt/etc/network
cp /etc/wpa_supplicant/wpa_supplicant.conf /mnt/etc/wpa_supplicant/.
```

あとは昔のメモを見ながらアプリの再インストールをしましょう。

```
su
dpkg-reconfigure tzdata # Asia/Tokyoにする
dog-reconfigure locales # ha-JP.utf-8にする
apt-get update
apt-get upgrade
apt-get install sudo

```

それとdropboxの設定をやり直し
vagrant box add が出来ない・・・（新しいPCに開発環境構築）

開発機で使用していた環境を新しいPCに作ってたのだが

vagrant box add　が上手く行かない 

症状は以下
<TABLE><TD>C:\work\VM\CentOS>vagrant box add CentOS ./package.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'CentOS' (v0) for provider:
   box: Unpacking necessary files from: file://C:/work/VM/CentOS/package.box
   box:
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.
</TD></TABLE>

「An error occurred while downloading the remote file.」
上記のエラーメッセージで検索して
以下記事を見たのだが
http://qiita.com/circled9/items/0bef6c6b5855ae189a49
「up」時であって「add」では無いね。
そもそも「~/.vagrant～～」とか出来て無いし
自分の求めてるのと症状違うよね・・・

「vagrant box 追加 エラー」
で再度検索

http://blog.naba.biz/entry/2016/01/19/220230
これですね。
たぶん間違いない。

https://www.microsoft.com/ja-jp/download/details.aspx?id=5555
Microsoft Visual C++ 2010 再頒布可能パッケージ 
が足りないらしい。2010に拘る必要ないと思うが

記事どおりにcurl.exe叩いたら同様のメッセージ出るし。
よしよし64bitOSだから64bit版をDLして試すもcurl.exe動かず
記事見ると32,64、両方入れたとか書いてあるし
しょうがなくx86をDLインスト。curl.exe動きました。
32bit版が正解らしい。

vagrant box add　も成功しました。
add時の画面はLOG垂れ流しで消えたのでlistを以下
<table><td>C:\work\VM\CentOS>vagrant box list
CentOS (virtualbox, 0)
</td></table>

参考記事に書いて在るけどLOGの出し方は
set VAGRANT_LOG=DEBUG

ちなみに、開発機にはVSとか色々入れてたのでVC++ライブラリが入っていて気づかなかった模様。
手元端末の秘密鍵を使って踏み台経由で目的のサーバにssh（screen併用）

#やりたいこと
![プレゼンテーション1.png](https://qiita-image-store.s3.amazonaws.com/0/29958/b7b165b4-8c0c-4fdc-dac9-4ad5f91dd3b1.png)

Windowsからputty/pageantでLinux踏み台経由で各サーバに行く場合、
screen/tmuxを踏み台で上げると便利ですが、ついでに手元のpageantの秘密鍵で
踏み台/各目的サーバに入れると便利ですね。
ついでにdetach/attachしても使えるといいです。今回はその辺りの要件を満たす方法を考えます。

#設定内容
##putty側設定
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/29958/b65fac24-95d9-94a8-9ac1-58a37aa40ea4.png)
まず、puttyのconnection->SSH->Authで「Allow agent forwarding」にチェックを入れます。
これだけで通常（screen等を使わない場合）は目的サーバへのログイン時でもpageantの秘密鍵を使うことが出来ます。

##踏み台サーバ側設定
上のputty側設定でscreenでdetach/attachしなければログインはできるのですが、
作業途中に端末-踏み台間接続が切れたりした場合はログインできなくなりますので、
なんとかしたいところです。

そこでたとえば下記のようなaliasを設定します。（bash用）
```bash:.bash_profile
alias ssh='SSH_AUTH_SOCK=`find  /tmp/ssh-* -user ${USER} |grep agent| head -n1` ssh'
alias scp='SSH_AUTH_SOCK=`find  /tmp/ssh-* -user ${USER} |grep agent| head -n1` scp'
```
この設定を入れることでscreen内で実行されたssh/scpがsshdの提供する仮想的なssh_agentを
見失わなくなり、detach/attachしても目的サーバにアクセスできるようになります。
Proxy環境下、Ubuntu16.04でdockerを動かす

いろいろ情報を探してましたが、公式のドキュメントに対応方法が載ってましたｗ

https://docs.docker.com/engine/admin/systemd/#http-proxy

daemonにproxyの環境変数を認識させる必要がありますが、systemdの流儀に則って指定しなければならないようです。


dockerサービス用ディレクトリ作成

```
# mkdir /etc/systemd/system/docker.service.d
```
dockerサービス用ディレクトリ下に、http-proxy.confファイルを作成

```
 # vi /etc/systemd/system/docker.service.d/http-proxy.conf
```
http-proxy.confファイルに下記の内容を入力し、保存

```
[Service]
Environment="HTTP_PROXY=http://(proxyのアドレス):(proxyのポート番号)/"
```
dockerサービスの再起動

```
# systemctl daemon-reload
# systemctl restart docker
```
Arduino M0 Pro でマルチタスクプログラミング : 優先度・スケジューリング

# はじめに
[TOPPERS/R2CA](http://dev.toppers.jp/trac_user/contrib/wiki/rtos_arduino)は，[Arduino M0 Pro](http://www.arduino.org/products/boards/4-arduino-boards/arduino-m0-pro) (以下，M0)上で，Arduinoライブラリ+[TOPPERS/ASPカーネル](http://www.toppers.jp/asp-kernel.html)ベースのマルチタスクプログラミング環境を提供するパッケージです．

この記事では，[マルチタスク](http://qiita.com/exshonda/items/7afb12b56696cf44895e)に続き，優先度やスケジューリングについて説明します．開発環境のインストールやビルド＆実行方法は[こちら](http://qiita.com/exshonda/items/093870ecdcda6c79678c)の記事を見て下さい．

# タスク

## タスク数
タスクの数の指定は，R2CA_NUM_TASKで指定します．0を指定すると追加タスク無しとなり，setup()/loop()のみが使用出来ます．setup()/loop()を実行するタスクをメインタスクと呼びます．

```r2ca_app.h
#define R2CA_NUM_TASK 0
```

指定可能な最大数は5でそれぞれタスク1,2,3,4,5と呼びます．

## タスク本体

それぞれのタスクが実行する関数名は次の通りである．

|タスク|関数|
|:-----:|:---:|
|メインタスク |	setup/loop|
|タスク1 |	loop1|
|タスク2 |	loop2|
|タスク3 |	loop3|
|タスク4 |	loop4|
|タスク5 |	loop5|

## タスクID

ITRON仕様ではタスクに対するAPIはタスクIDを指定して発行します．
各タスクのIDは次の通りです．

|タスク|タスク名|
|:-----:|:---:|
|メインタスク|R2CA_MAINTASK|
|タスク1 |R2CA_TASK1|
|タスク2 |R2CA_TASK2|
|タスク3 |R2CA_TASK3|
|タスク4 |R2CA_TASK4|
|タスク5 |R2CA_TASK5|


## タスク優先度

タスクの優先度を設定可能です．ディフォルトは5となっています．ITRONの優先度は1から15で，数値が小さいほど優先度は高いです．

優先度は，以下のマクロをr2ca_app.hに設定することで変更可能です．


|タスク|優先度|
|:-----:|:-------------:|
|メインタスク|R2CA_MAINTASK_PRI|
|タスク1     |R2CA_TASK1_PRI|
|タスク2     |R2CA_TASK2_PRI|
|タスク3     |R2CA_TASK3_PRI|
|タスク4     |R2CA_TASK4_PRI|
|タスク5     |R2CA_TASK5_PRI|

# スケジューリング

ITRONでは優先度ベースのプリエンプティブスケジューリングを行います．汎用OSのラウンドロビンとは異なり，優先度が最も高いタスクのみが実行されます．優先度の高いタスクが起動すると即座に実行されます．

また，同一優先度はFCFSでスケジューリングされます．すなわち最も起動が早いタスクのみが実行されます．R2CAにおいて，優先度を変更しなかった場合は，メインタスクのみが実行されます．

実行中のタスクが他のタスクに処理を明け渡すには，待ち状態や休止状態とすればよいです．R2CAではdelay()を実行することにより，一定時間待ち状態とし，他のタスクに処理を譲ります．


## ラウンドロビン

優先度ベーススケジューリングは予測可能性は良いのですが，適当にArduinoのサンプルをマルチタスクで動かすとメインタスクしか動作しないため，使い勝手が悪いときがあります．

そのような場合は，r2ca_app.h でR2CA_RR_SCHEDULE を定義すると同一優先度間は一定周期のラウンドロビンスケジューリングになります．R2CA_RR_SCHEDULE_PRIのビット0(LSB)が優先度1に対応しており，1とした優先度をラウンドロビンスケジューリングとします．周期はR2CA_RR_SCHEDULE_CYCLEマクロでms周期で設定可能であり，設定しない場合は1m周期となります．

下記の例は全ての優先度を対象に，10ms周期でラウンドロビンスケジューリングする設定となります．

```r2ca_app.h
#define R2CA_RR_SCHEDULE_PRI  0xff
#define R2CA_RR_SCHEDULE_CYCLE 10
```

# API発行

ITRON(正確にはASP)でサポートしているAPIは全て使用することが出来ます．各タスクのIDは上で示した通りです．

|API|機能|
|:-----|:---|
|slp_tsk()|タスクを待ち状態へ|
|wup_tsk(taskid) |待ち状態のタスクを起床する|
|act_tsk(taskid) |タスクの起動|
|ext_tsk() |タスクの終了|
|dis_int() |割込み禁止|
|ena_int() |割込み許可|

# おわりに

APIの使い方等を勉強したい方は，[組込みソフトウェア開発技術の基礎](http://www.nces.is.nagoya-u.ac.jp/NEP/materials/)というテキストが無償でダウンロード可能なので，参考にして下さい．
【CentOS6, ImageMagick6.9.3.10, yum】ImageMagickの脆弱性対応

# ご注意

CentOS6でかつImageMagick6系の対応になります。

# 脆弱性

http://internet.watch.impress.co.jp/docs/news/20160509_756408.html

ImageMagick（画像のファイルアップロードで使用）で脆弱性が発見されております。
その対応をやっていきます。

# 対応方法

推奨されているとおり対応方法として下記２点行います。

1. ImageMagickのバージョンを 6.9.3.10にあげる
2. policy.xmlに脆弱性を無効化する記述を追加する

## 1について

```
$ sudo yum remove ImageMagick
$ sudo yum install --enablerepo=remi ImageMagick-last
```

## 2について

### 確認

```
$ git clone https://github.com/ImageTragick/PoCs.git
$ cd PoCs
$ ./test.sh
```

UNSAFEがあることを確認。

### policy.xmlに修正を追加

```
sudo vi /etc/ImageMagick-last/ImageMagick-6/policy.xml

<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="URL" />
<policy domain="coder" rights="none" pattern="HTTPS" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="MSL" />
<policy domain="coder" rights="none" pattern="TEXT" />
<policy domain="coder" rights="none" pattern="SHOW" />
<policy domain="coder" rights="none" pattern="WIN" />
<policy domain="coder" rights="none" pattern="PLT" />
```

### 修正確認

```
$ ./test.sh
```

全てSAFEになっていることを確認する
Spine3へのアップデート

ちょいアップグレードにはまったのでメモ投稿です。

![done.png](https://qiita-image-store.s3.amazonaws.com/0/8302/52ca7d19-9d9b-e186-3ba9-4e35b7f6393e.png)

#アップデートできない

* 久々にVer.2.1.27を起動すると、新しいバージョンがあるのでライセンスページからダウンロードするか、過去バージョン立ち上げろとでる。

* サイトに行くが、ライセンスページがみあたらない。過去バージョン立ち上げて、リンクがあるのかと探すが見つからない。

* ライセンスページへのリンクはライセンス購入時のメールにしか記載していない事が判明。

* ライセンスページにあるリンクからアプリをダウンロードして再インストールするも、やっぱり新しいバージョンがあるので。。というダイアログが！無限ループか！

#解法

上記の手順まであってる。再インストール後に一度Ver.2.1.27を起動して、設定ダイアログから次回の起動を"Latest"に設定して再起動するとVer.3.2.01が立ち上がる。再起動後は同じ設定位置に3.2.01の選択肢が増えます。あとメニューがかってに日本語化されていた。

![settei.png](https://qiita-image-store.s3.amazonaws.com/0/8302/2ab7d383-0512-d966-5b8a-957c920276cb.png)

#その他
自分はEssentialアカウントなんですが、プロアカウントでも同じかと思われます。もしもライセンスページが真っ黒な場合はサポートに連絡すると新しいライセンスページリンクを教えてくれるようです。

以上！
Retrofit2 + OkHttpでオレオレ証明書のサーバと通信できるようにする

# Solution

~~~java
  private static OkHttpClient getUnsafeOkHttpClient() {
    try {
      // Create a trust manager that does not validate certificate chains
      final TrustManager[] trustAllCerts = new TrustManager[] {
        new X509TrustManager() {
          @Override
          public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
          }

          @Override
          public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
          }

          @Override
          public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[]{};
          }
        }
      };

      // Install the all-trusting trust manager
      final SSLContext sslContext = SSLContext.getInstance("SSL");
      sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
      // Create an ssl socket factory with our all-trusting manager
      final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

      OkHttpClient.Builder builder = new OkHttpClient.Builder();
      builder.sslSocketFactory(sslSocketFactory);
      builder.hostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
          return true;
        }
      });

      OkHttpClient okHttpClient = builder.build();
      return okHttpClient;
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  private Retrofit createRetrofit() {
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(Constants.API_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .client(getUnsafeOkHttpClient())
        .build();
    return retrofit;
  }
~~~

# 参考

- http://stackoverflow.com/questions/25509296/trusting-all-certificates-with-okhttp
Rails | 1コマンドでサーバープロセスを殺す

# 方法1

プロセスIDを見て、そいつを殺す。

```
kill $(cat tmp/pids/server.pid) 
```

# 方法2

## 注意!

ruby で走ってる他のプロセスも死んでしまうので、気をつけること。
開発環境でだけ使ったほうが良い。

## コマンド

コマンド名に対して kill する。

```bash
killall ruby
```

( rails ではなく ruby )

# でも止まらない場合

`kill -9` とか `killall -9` とかにすれば良い。

# 環境

- Ruby 2.3.1
- Rails 4.2.6



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
DockerでWekanを使う

# 初めに
AWS EC2のDocker上でWekan（かんばん式管理ツール）を作成する手順のメモ書きです。

こういうの。
![image](https://qiita-image-store.s3.amazonaws.com/0/76153/0885ea6c-8ca9-73ca-051d-f6df03e59457.png)


基本的には
https://github.com/wekan/wekan/wiki/Install-Wekan-Docker-in-production
を参考にしてます。

# インストール手順
## Dockerのインストール
```
sudo yum install -y docker
sudo pip install -U docker-compose
```

## Dockerのサービスを起動する
```
sudo service docker start
```

## Wekanをインストール
Wekan用ユーザーの作成

```
sudo useradd -d /home/wekan -m -s /bin/bash wekan
sudo usermod -aG docker wekan
sudo passwd wekan
New password:適当なパスワードを設定
```

Wekan用のDockerコンテナ定義ファイルを作成

```
sudo -u wekan vi /home/wekan/docker-compose.yml
```
中身は↓こんな感じで。環境が出来ると、http://(AWS EC2のIPアドレス):8081で接続出来るようになります。

```
wekan:
  image: mquandalle/wekan
  restart: always
  links:
    - wekandb
  environment:
    - MONGO_URL=mongodb://wekandb/wekan
    - ROOT_URL=http://localhost:8081
  ports:
    - 8081:80

wekandb:
   image: mongo
   volumes:
     - /home/wekan/data:/data/db
```

Wekan用のDockerコンテナ初回起動

```
su - wekan
docker-compose up -d
```

これでWekanコンテナのダウンロードと初期設定が完了します。
らくちん！


# 確認
とりあえず
`http://(AWS EC2のIPアドレス):8081`
に接続してみます（AWS EC2のセキュリティグループから8081ポートを開けるのを忘れずに）。

以下の様な画面が表示されていれば完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/76153/a9c758b0-e3bb-a994-360e-3dc2e8e7440a.png)

# おまけ
## アクティビティをメールで飛ばす
docker-compose.ymlに「MAIL_URL」の値を追加する。

```
su - wekan
vi /home/wekan/docker-compose.yml
```

```
￤
省略
￤
  environment:
    - MONGO_URL=mongodb://wekandb/wekan
    - ROOT_URL=http://localhost:8081
    - MAIL_URL=smtp://user:password@smtp.example.com:25
  ports:
    - 8081:80
￤
省略
￤
```
```
docker-compose up -d
```
以上。
※ただし、現時点(v0.10)ではメール通知機能が不完全です（例えばカードに書き込んだ内容の通知だとか）。次バージョンのv0.11で実装予定らしい。

## URLを変更する
docker-compose.ymlの「ROOT_URL」の値を変える。
fluentd-s3をkubernetesでアプリと同一podに格納してS3にログ転送

[前回の投稿](http://qiita.com/letusfly85/items/855e62706666f7433ebd)で、akka-slf4とfluentdを利用してログをS3に転送しました。

この際に、以下の２つのサービスが登場しました。

* akkaのアプリケーション
* fluentdのプロセス

上記を、kubernetes上でdeployするをどうしようかな、と考えましたが、集約的なcollectorを一つ配置するのではなく思い切って、アプリごとにfluentdのコンテナを付随させようと思いました。

メリットとしては以下のとおりです。

* logback.xmlの中で、fluentdのホストをlocalhostにしておける
* 一元的なfluentdサービスが不在になることで、どれかひとつのfluentdのpodがこけても他のサービスのロギングは継続される

デメリットとしては以下なのかな、と思いました。

* 各サービスに付随するfluentdの通信が途絶えた時に追跡しにくい
* AWSのリソース（S3)へのアクセス権限を持つpodが点在する

後者は、ちょっとうざったいので、もう一個何かをかますか、構成を変更するか、というところもあるので悩みどころです。

うだうだと書きましたが、下記のようなReplicationController用のYamlを用意することで実現が可能となります。

ご興味のある方はご利用ください。

```rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: triplew-app-name
  labels:
    app: triplew-app-label
    tier: triplew-app-tier
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: triplew-app-label
        tier: triplew-app-tier
    spec:
      containers:
      - name: fluentd-s3
        image: triplew/fluentd-s3
        env:
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              name: mySecretKey
              key: awsaccesskeyid
        - name: AWS_SECRET_ACCESS_KEY 
          valueFrom:
            secretKeyRef:
              name: mySecretKey
              key: awssecretaccesskey
        - name: FLUENTD_S3_BUCKET
          valueFrom:
            secretKeyRef:
              name: mySecretKey
              key: fluentds3bucket
        - name: FLUENTD_S3_REGION
          valueFrom:
            secretKeyRef:
              name: mySecretKey
              key: fluentds3region
        ports:
        - containerPort: 24224
      - name: triplew-app-name
        image: triplew/app:latest
        env:
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              name: mySecretKey
              key: awsaccesskeyid
        - name: AWS_SECRET_ACCESS_KEY 
          valueFrom:
            secretKeyRef:
              name: mySecretKey
              key: awssecretaccesskey
        - name: JAVA_OPTS
          value: -Dconfig.file=application.production.conf 
        ports:
        - containerPort: 8080
```

secretKeyRefについては、kubernetesがv1.2だと動作しますが、v1.0系だと未実装の状態ですのでご注意ください。

---

本日は以上となります。
Visual Studio CodeでMarkdown目次(TOC)を作成する便利Plugin

Visual Studio Codeを利用して、技術メモをMarkdown記法で記述しています。
Markdownの記述内容が多くなってくると目次が欲しくなるため、なにか便利なPluginが無いかと思っていたらありました。
目次 TOC(Table Of Contents)をMarkdownの内容から生成してくれるPluginです。

<a href="https://marketplace.visualstudio.com/items?itemName=AlanWalk.markdown-toc" target="_blank">Markdown-Toc | Visual Studio Marketplace</a>

<blockquote>
<p>Markdown-Toc <br>
MarkdownTOC(Table Of Contents) Plugin for Visual Studio Code.
</p>
<footer><cite title="Markdown-Toc | Visual Studio Marketplace">
<a href="https://marketplace.visualstudio.com/items?itemName=AlanWalk.markdown-toc" target="_blank">Markdown-Toc | Visual Studio Marketplace</a></cite>
</footer>
</blockquote>

# Install
コマンドパレット(cmd+P）を表示して次のコマンドを入力します。

```
ext install markdown-toc
```

# 使い方
## 目次の作成
Markdownファイルの目次を入れたい箇所にカーソルを移動して
コマンドパレット(cmd + Shift + P または F1）から次のコマンドを入力します。

```
>TOC Create
```



![vscode_markdown_toc.png](https://qiita-image-store.s3.amazonaws.com/0/100465/738e4504-c5ff-588e-4d60-746e1748eaaa.png)


すると、目次が生成されます！

![vscode_markdown_toc2.png](https://qiita-image-store.s3.amazonaws.com/0/100465/a1ea09e6-981b-22c3-d196-4bb6ab5b6249.png)


## 目次の更新
記事を追記や削除した場合など、次のコマンドで目次を更新できます。

```
>TOC Update
```

## 目次の削除
目次が不要になったら削除できます。

```
>TOC Delete
```

#感想
便利です！
メモ for GoogleEE #1: ピクセルを数える

Google Earth Engineでピクセル数をカウントする．

## (ImageObject).reduceRegion(ee.Reducer.count())
上記の関数を使うことで，(ImageObject)に含まれるピクセル数をカウントすることができる．

```
var countpixel=(imageobject).reduceRegion(ee.Reducer.count());
```
(imageobject)には，対象とするイメージオブジェクトを書く．

注意点：Google Earth Engine上ではズーム値によってピクセルサイズが決まるので，ズーム値をいくつに設定するかに気を付ける．
例えば，ズーム値が10だと153m/pxとなる．Inspectorから確認できる．


2016/05/14追記：
上の方法だと，領域が広くなった時に全ピクセル数が一定数を超えるとエラーが発生する．以下の方法だと上手くいく．

```js
var countpixel=(imageobject).reduceRegion({
reducer: ee.Reducer.count(),
maxPixels: 1000000000
});
print(countpixel);
```
maxPixelsの値をいじることで計算範囲を拡大できる．
Basic認証を付け加える一手間を最速で

Webページやサービスを作ってそれを顧客に見せる際に、一時的だけど一応Basic認証だけでもかけておきたい、という場合があると思います。
簡単な事なんだけど、なんだかんだ30分くらいかかってしまった、なんてことありませんか。
その手間を出来るだけ無くしたい。

ということで、簡単ではありますが、nginxにbasic認証をさせて、認証が通ったら、バックエンドサーバーに通信を流す、というDockerイメージを作成しました。

[Docker Hub](https://hub.docker.com/r/keisato/nginx-basic-auth-proxy/)
[GitHub](https://github.com/kei-sato/nginx-basic-auth-proxy)

# インストール

```bash
docker pull keisato/nginx-basic-auth-proxy
docker tag keisato/nginx-basic-auth-proxy nginx-basic-auth-proxy
```

# 基本的な使い方

```bash
# pseudo back end server (whatever you want)
docker run --name nginx -d nginx

# launch basic auth proxy with user and password
docker run --name nginx-basic-auth-proxy -d -p 80:80 --link nginx:backend -e USER=user1 -e PASS=pass1 nginx-basic-auth-proxy

# open in browser
open http://$(docker-machine ip)/
```

# バックエンドとポートを指定

```bash
docker run --name nginx -d nginx
docker run --name nginx-basic-auth-proxy -d -p 80:80 --link nginx:nginx -e BACKEND=nginx:80 -e USER=user1 -e PASS=pass1 nginx-basic-auth-proxy
```

# デフォルト値

```bash
BACKEND=backend:80
USER=supersecure
USER=itsnot
```
AWS EBS スナップショット　ボリューム拡張

EBSのスナップショットを取得するという話はよくきく。
スナップショットから復元というのも良くきくし、オペレーションも想像がつく。
復元時に容量を拡大したとき、OSから利用可能にするために一手間が必要。そんな話。

a. パーティションの拡大
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/storage_expand_partition.html#expanding-partition-parted

b. EBSの拡大
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-expand-volume.html


作業の流れはこんな感じ。

【作業前】

<pre>
df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       30G  4.7G   25G  16% /
/dev/xvdf1      100G  xxxG  xxxG  xx% /data/ebs
</pre>

<pre>
lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   30G  0 disk
 xvda1 202:1    0   30G  0 part /
xvdf    202:80   0 100G  0 disk
 xvdf1 202:81   0 100G  0 part /data/ebs
</pre>

1.パーティションをunmoutする
<pre>
[ec2-user ~]$ sudo umount /data/ebs
</pre>

2.デバイスに対してparted
<pre>
[ec2-user ~]$ sudo parted /dev/xvdf
</pre>
ここでパーティションの拡張をする。
繊細な作業なので詳細はaのドキュメント参照。

3.エラーチェック
<pre>
sudo e2fsck -f /dev/xvdf1
</pre>

4.パーティションをmount
<pre>
sudo mount /dev/xvdf1 /data/ebs
</pre>

この時点でlsblkとdf -hの結果はこんな感じ

【作業後1】

<pre>
df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       30G  4.7G   25G  16% /
/dev/xvdf1      100G  xxxG  xxxG  xx% /data/ebs
</pre>

<pre>
lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   30G  0 disk
 xvda1 202:1    0   30G  0 part /
xvdf    202:80   0 1000G  0 disk
 xvdf1 202:81   0 1000G  0 part /data/ebs
</pre>

これでパーティションが大きくなったので、拡張した部分について、
ファイルシステムでフォーマットをしてあげる。

<pre>
sudo resize2fs /dev/xvdf1
</pre>

これでばっちり

【作業後2】

<pre>
df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       30G  4.7G   25G  16% /
/dev/xvdf1      985G  xxxG  xxxG  xx% /data/ebs
</pre>

<pre>
lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   30G  0 disk
 xvda1 202:1    0   30G  0 part /
xvdf    202:80   0 1000G  0 disk
 xvdf1 202:81   0 1000G  0 part /data/ebs
</pre>
Eclipse + Maven でソース管理するときの最適解（と思われるもの）

EclipseとManven(m2e)を組み合わせた場合の最適解（と思われるもの）が得られたので記録。
知っている人には当たり前のことかもしれないし、試行錯誤の中で見つけた形なので間違いもあるかもしれない。

# 解決する課題
Maven(m2e)はMavenビルドで自動的に.classpathや.projectを書き換えるので、これらのファイルをどのようにソース管理するのかということについて解決する。

# 前提
開発環境は次の通り。

- Eclipse 4.5 Mars.2 
- Maven3 (Eclipse用Maven統合 1.5 + Java8 support for m2e for Eclipse kepler SR2) 
- Subversion 1.7

ソース管理はチーム開発することを前提に考えているが、Mavenやプロジェクトの設定は限定された人（管理者）しか実施しない前提。

というのも、メンバーはオフショア含めて40人規模。スキルはSubversionは使えるけど、Maven？ ナニソレ？という人が多数、.NET上がりでEclipseにもあまり慣れていないという理由から。

# 結論
Mavenによって書き換えられるファイルの変更差分がでないように、svn:ignoreか、無視するソースに登録する。具体的には、次のように設定する。

ただし、Mavenやプロジェクトの設定をする管理者は .project 等をコミットする必要があるので、この限りではない。

|ファイル      |リポジトリ登録 |svn:ignore |無視するソース         |
|:------------|:------------:|:---------:|:---------------------:|
|.project     |する　         |しない     |する(.project)|
|.classpath   |しない         |する　     |しない|
|.settings    |しない         |する　     |しない|
|target       |しない         |しない     |する(target, target/*)|

- svn:ignore ： SVNリポジトリに登録するもの。
- 無視するソース ： Eclipse > 設定 > チーム > 無視するソース に登録するもの。()内は登録パターン。

# ポイント
.project だけは管理者がリポジトリ登録しておく。これでチェックアウトするだけで管理者の設定した通りの内容で、プロジェクトがMavenビルドできるようになる。
.classpath、.settings はMavenビルドで作られるので基本的にリポジトリ登録しない。
targetは svn:ignore に何故か設定できなかった（グレーアウト）なので「無視するソース」に追加。

# 補足
.settings 以下にはプロジェクト固有の情報が書かれるため、svn:ignore にしてしまうと困る場合があるかもしれない。自分は自社開発ツールが該当してしまった。
そのような場合は、.project と同様にリポジトリ登録するが、無視するソースに指定すると良さそう。

この辺は、まだ試行錯誤が必要に感じる。良い情報あったら教えて下さい。

以上
GolangのフレームワークEchoの話とHelloWorldサンプルを読み解くだけ

#環境
Go  :go version go1.6.2 darwin/amd64
IDE :VSCode1.1.0
echo:Echo v2.(beta) 
俺  :Go初めて2日目

間違ってたらすみません。コメントなどで教えて下さい。
#Echoとは:
GolangのWebフレームワーク。
特徴として：
・リソースの量に比例して全体のスループットが向上するシステム（スケーラブル）でプログラムの外乱に対する抵抗性のある（ロバスト）なRESTAPIを作れる。
・スタンダードなHTTPサーバ(またはFastHTTPサーバ)で動作する
・URI (PATH)単位でなにか処理を入れられます
・ミドルウェアに対して拡張性がある。
・urlごとにログ出したり出さなかったりすることできる
・JSON,XML,フォームペイロードなどへのデータバインディングのサポートがある
・HTTPの様々なレスポンスを送るための使いやすい関数をサポート
・どんなテンプレートエンジンででもテンプレートレンダリングできる
・Loggerに対して任意の定義を行える
・カスタマイズ性が高い

RESTAPI向けに最適化されているフレームワーク

**RESTAPIとは：**
RESTの原則に沿った形で設計されたAPI
**RESTとは：**
・セッションなどの状態管理を行わない
・情報を操作する命令の体系が予め定義・共有されている（HTMLのPostやGetなど）
・すべての情報は汎用的な構文で一意に識別される（URLやURIなど)URL∈URI


#Echo-HelloWorld.
```sampleserver.go
package main

import (
	"net/http"

	"github.com/labstack/echo"
	"github.com/labstack/echo/engine/standard"
	"github.com/labstack/echo/middleware"
)

func main() {
	// Echo instance
	e := echo.New()

	// Middleware
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	// Route => handler
	e.GET("/hoge", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello,World");
	})
	e.GET("/piyo", func(c echo.Context) error {
		return c.String(http.StatusOK, "こんにちは世界");

	})
	

	// Start server
	e.Run(standard.New(":1323"))
}
```

##package mainとImport
main関数を用いているため、Packageはmainにする必要がある。

**fmtパッケージ**
フォーマットI/Oを実装している。ScanとかPrintとかできるのはこいつのおかげ。


##main関数内
**インスタンス作成**
`e := echo.New()`
Echoのインスタンス化
　
**ミドルウェアの使用宣言(Logger)**
`e.Use(middleware.Logger())`
デフォルトで存在するロガー
HTTPのリクエストをログとってくれて、コンソールに出力してくれる。↓
`time=2016-05-10T10:19:49+09:00, remote_ip=::1, method=GET, uri=/up, status=200, took=6.09µs, sent=7 bytes`
Time,Remote_IP,uri,method,path,status,response_time,response_sizeを出力してくれる。
　
**ミドルウェアの使用宣言(Recover)**
`e.Use(middleware.Recover())`
middleware.Recoverのコメントを見ると
Recover()はどこかでパニック(エラー)が起きたらそこから復帰したり、中央化されてるHTTPErrorHandlerを制御するミドルウェア。

少しRecover.goを見るとDefaultRecoverConfigというデフォルトの設定ででどのように復帰するかが書かれている。

まずどのようなエラーが出たのかを検査し、recover()をする。その時帰ってくる型がerrorだった場合とそうでない場合がある。
そうでない場合にはErrorとして扱われるように整形する。
　
その後、どちらの場合に対してもLoggerに対してエラー内容を出力する。その上でContextにErrorを格納する。
そのErrorをHandlerFuncに引数として渡し、それをReturnしている。
エラー出力をしつつ、エラーの内容をキャッチしてRecoverするミドルウェアであり、その使用を宣言している。

**ページのコンテンツの作成**
```e.GET("/hoge", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello,World");
	})
```
http://localhost:1323/hoge に対してHelloWorldを表示してる。

e.GETの引数として
”/hoge”：パス
func(c echo.Context):該当のリクエスト/レスポンスの情報が格納されるハンドラー

```
mainの中{
	e.GET("/piyo", hello)
}

func hello(c echo.Context) error {
		return c.String(http.StatusOK, "こんにちは世界");
	}
```
と同等。こっちのほうが理解がしやすいと思う。

　
**サーバ起動**
`e.Run(standard.New(":1323"))`
サーバーを起動。
ターミナルで`go run sampleserver.go`した後にブラウザでhttp://localhost:1323 にアクセスできるようになる。
今回はe.GETを2つ用意してあるのでそれぞれ
localhost:1323/hoge
localhost:1323/piyo
でそれぞれHello,World、こんにちは世界が出力される
nvidia-dockerでtensorflowを動かす

#はじめに
前回の [記事](http://qiita.com/ymfj/items/886941882c3132ea566f) ではtensorflow/tensorflowのイメージを元にdocker上でGPUモードのtensorflowを動かせる環境を構築しました．
先日，caffeのdocker環境を構築する機会がありまして，nvidia-dockerというものを使いました．nvidia-dockerを使うとdocker上から簡単にcudaにアクセスすることができます．今回はnvidia-dockerを使ってtensorflowを動かしてみようと思います．

**追記 - 現在はtensorflow公式のイメージもnvidia-dockerを使うようになっています．**

#nvidia-dockerの導入
dockerを導入した環境において，以下で導入できます．

```
$ git clone https://github.com/NVIDIA/nvidia-docker.git
$ cd nvidia-docker
$ make install
$ nvidia-docker volume setup
```

#Dockerfile
ベースイメージとして``nvidia/cuda:cudnn``を指定しています．バージョンを指定したほうが安心かもしれませんが．cuda，cudnnが導入されたイメージです．
``pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl``は普通の環境と同様の方法で導入しています．
tensorflow/のイメージだとjupyterが入っていたりしますが，個人的に使っていないので．

```Dockerfile
FROM nvidia/cuda:cudnn

RUN apt-get update
RUN apt-get install -y --no-install-recommends python-pip python-dev

RUN pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl

ENTRYPOINT ["/bin/bash"]
```

#起動
``docker``の代わりに``nvidia-docker``で起動します．device等を指定しなくてもいいので楽です．

```
nvidia-docker run -it image_name
```
GTM：ページを指定する変数

#ページを指定する変数の使い方メモ
##PageURL
"https://"も含めて全部を識別する。パラメーター(?以降)も読み込む。
("#"は識別しない)

トリガーを
**"PageURL | 等しい | https://www.test.com/"**
とした場合は、
"https://www.test.com/"
には反応するが、
"https://www.test.com/?utm_source=yahoo&utm_medium=cpc"
"https://www.test.com/contents/"
には反応しない。


##PagePath
ドメイン～パラメータの前までを識別する。

トリガーを
**"PagePath | 等しい |　/ "**
とした場合は、
"https://www.test.com/"
"https://www.test.com/?utm_source=yahoo&utm_medium=cpc"
には反応するが、
"https://www.test.com/contents/"
には反応しない。


#広告を色々回していてAnalyticsのパラメータを振っているが、どこから入ってきたかは問わずとりあえずTOPページを指定したい場合のトリガー
**"PagePath ｜ 等しい　｜　/ "**
Python on Rubyと怒りのRuby on Python


## ふいに見つけた

[python | RubyGems.org | your community gem host](https://rubygems.org/gems/python)

```
$ gem install python
$ gem specification python
--- !ruby/object:Gem::Specification
name: python
version: !ruby/object:Gem::Version
  version: 0.0.1
platform: ruby
authors:
- Kensuke Sawada
~
executables:
- python.rb
~
```

なんか実行できそう

## インタープリタ実行

```
$ python.rb
python.rb> 1+1
2
```

動いた



## 通常実行の動作実験

```
$ echo "print(1+1)" > test.py
$ python.rb test.py # 動いた
2
```

面白い

[sawaken/python.rb: Python in Ruby](https://github.com/sawaken/python.rb)

## 逆はないのか？

```
$ pip search ruby
~
pyruby (1.0.0)                           - Some Ruby for your Python
~
```

あるっぽい！

```
$ pip install pyruby
$ pip show pyruby
---
Metadata-Version: 1.1
Name: pyruby
Version: 1.0.0
Summary: Some Ruby for your Python
Home-page: http://github.com/danielfm/pyruby
Author: Daniel Fernandes Martins
Author-email: daniel.tritone@gmail.com
License: BSD
Location: /Users/him0/Desktop/venv/lib/python3.5/site-packages
Requires: 
Classifiers:
  Development Status :: 5 - Production/Stable
  Intended Audience :: Developers
  License :: OSI Approved :: BSD License
  Operating System :: OS Independent
  Programming Language :: Python :: 3
  Programming Language :: Ruby
  Topic :: Software Development :: Interpreters
```

[danielfm/pyruby: Some Ruby for your Python!](https://github.com/danielfm/pyruby)

```
$ echo '''import ruby
> puts "Hello!"'''>app.p
$ python app.py 
  File "app.py", line 2
    puts "Hello!"
                ^
SyntaxError: invalid syntax
```

あれ？

```
$ echo '''import ruby
print("Hello!")'''>app.py
$ python app.py
```

![venv_—_Terminal_—_-bash_—_157×47.png](https://qiita-image-store.s3.amazonaws.com/0/69007/e0f5b249-82cc-4977-2332-f0195deb5176.png "venv_—_Terminal_—_-bash_—_157×47.png")

...。

## 学んだこと

pipみたいなライブラリはどんなライブラリが登録されているのか分からない

今回は、あからさまなので良かったものの、見えないところで、悪いことやっているライブラリがあってもおかしくないので、盲目的に使うだけでなく、ちゃんとソースコードを読むべきだと学んだ

2016-05-10 追記 英語が逆だった
PlayFrameworkのWSで、GCPのMachine Instance IDを取得する

最近Google cloud platformをいじっているので、Tipsを自分のメモがてら投稿しようかと。

第一弾は、GCPの各インスタンスに割り当てられるMachine Instance IDの取得方法です。

まず、httpアクセスをするためにWebServiceを使えるようにします。
Activatorのテンプレートをそのまま使っていれば、すでに追加されているはずなので、この依存の追加は不要です。

```scala:build.sbt
libraryDependencies ++= Seq(ws)
```


では実際のコード

```scala

import play.api.libs.ws.WSClient
import scala.concurrent.Await
import scala.concurrent.duration._

val req = ws.url("http://metadata.google.internal/computeMetadata/v1/instance/id").
  withHeaders("Metadata-Flavor" -> "Google")

val res = Await.result(req.get(),10 seconds)
println("InstanceID:" + res.body)
```

このコードを、GCPのインスタンス上で実行することで、InstanceIDを取得出来ます。
Headerに"Metadata-Flavor: Google"が入っていない場合はエラーになります。
また、GCPのインスタンス上以外で実行すると、ドメインが見つからないのでエラーになります。

InstanceID以外にも、URLのPathの最後の部分を変えることでいろいろなメタデータを取得出来ます。
何が取れるかは[ドキュメント](https://cloud.google.com/compute/docs/metadata)を参照して下さい。
シェルの$PATHにパスを一時的に追加したり削除したりする

一時的にパスを通したい、その後削除したいとき、いちいち $PATH への追加、特に削除がめんどくさい。

適当に関数を追加する。

```bash
function addPath() {
  if [ -d $1 ]; then
    export PATH=$1:$PATH
  fi
}

function removePath() {
  if [ -d $1 ]; then
    export PATH=$(echo $PATH | sed -E -e "s;:$1;;" -e "s;$1:?;;")
  fi
}
```

これで

```
$ addPath ~/src/foo/bin
$ addPath ~/src/bar/bin
```

で一時的に追加し、

```
$ removePath ~/src/foo/bin
$ removePath ~/src/bar/bin
```

で削除するできるように。
SpannableStringでListViewの一部をリンク化

SapnnableStringを使って、ListViewの一部の文字列をリンク化する方法で、ListViewに表示する各セルの情報を結びつけるためのAdapterクラス内に記述します。

SpannableStringをセットして、クリックイベントでリンク先に遷移させる際、Adapterクラス内にmContextとしてデーターを保持する必要があります。

今回はListViewのテキスト部分の"Hand"という文字列をクリックするとgoogleのサイトに遷移するように設定しています。

```
public class MessageRecordsAdapter extends ArrayAdapter<MessageRecord> {

    private ImageLoader mImageLoader;
    private Context mContext;

    public MessageRecordsAdapter(Context context) {
        super(context, R.layout.message_item);
        
        mContext = context;
       
        mImageLoader = new ImageLoader(VolleyApplication.getInstance().getRequestQueue(), new BitmapLruCache());
    }
    
    ...
    
    private void setSpannableString(TextView textView) {

        String message = textView.getText().toString();

        // リンク化対象の文字列、リンク先 URL を指定する
        Map<String, String> map = new HashMap<String, String>();
        map.put("Hand", "http://google.com/");

        // SpannableString の取得
        SpannableString ss = createSpannableString(message, map);

        // SpannableString をセットし、リンクを有効化する
        textView.setText(ss);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
    }

    private SpannableString createSpannableString(String message, Map<String, String> map) {

        SpannableString ss = new SpannableString(message);

        for (final Map.Entry<String, String> entry : map.entrySet()) {
            int start = 0;
            int end = 0;

            // リンク化対象の文字列の start, end を算出する
            Pattern pattern = Pattern.compile(entry.getKey());
            Matcher matcher = pattern.matcher(message);
            while (matcher.find()) {
                start = matcher.start();
                end = matcher.end();
                break;
            }

            // SpannableString にクリックイベント、パラメータをセットする
            ss.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View textView) {
                    String url = entry.getValue();
                    Uri uri = Uri.parse(url);
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    mContext.startActivity(intent);
                }
            }, start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        }
        return ss;
    }
```
Docker 便利コマンド(1ライナー含む）


# 利用環境
- Mac OS 10.11.4
- Docker version 1.10.2, build c3959b1

# コンテナ、イメージの操作
- Docker の Container や image がたくさんたまってきた！なんとかしたい

```
# Container 全て削除
$docker rm $(docker ps -aq)
# 終了している Container だけ削除
$docker rm $(docker ps -aqf "status=exited"))
# image を全て削除
$docker rmi $(docker images -q)
```

# トラブルシューテイング
- docker ps とかしたら "Cannot connect to the Docker daemon. Is the docker daemon running on this host?" ってでた

```
# default 以外の環境を利用している時はその環境を指定。 ./bash_profile とかに書いとくと良いよ
$docker-machine env default
$eval $(docker-machine env default)
```
新しいAzureポータル（Azure RM）で作成したルートベースVPNへYAMAHA RTX1200で接続する

Microsoft Azureの新しいポータルで作成した仮想ネットワークへVPN接続します。

（古いAzureポータルを使う場合は、[YAMAHAのサイト](http://jp.yamaha.com/products/network/solution/dns_cloud/microsoft_azure/)に設定例があります）

AzureのVPN接続には2種類あります。

- ポリシーベース 一端末のみをVPN接続します。
- ルートベース ネットワーク単位でVPN接続します。

ここでは、YAMAHAのRTX1200を使用して、ネットワークごとVPN接続します。


早速ですが、設定内容はこんな感じです。

```text:rtx1200-config.txt
tunnel select 30
 ipsec tunnel 301
  ipsec sa policy 301 30 esp                <<<=== 暗号ペイロードのアルゴリズムをaes-cbc(初期値)にする
  ipsec ike version 30 2                    <<<=== IKEv2を使う
  ipsec ike keepalive log 30 off            <<<=== keepaliveログ出力しない
  ipsec ike keepalive use 30 on dpd         <<<=== keepaliveを使用する。DPD RFC3706方式
  ipsec ike local name 30 ルータのLAN側のIPアドレス ipv4-addr
  ipsec ike nat-traversal 30 on
  ipsec ike payload type 30 2 2             <<<=== IKEペイロードタイプをYAMAHA互換ではなく他の実装に合わせる
  ipsec ike pre-shared-key 30 ************* <<<=== 事前共有鍵の設定
  ipsec ike remote name 30 AzureゲートウェイのグローバルIPアドレス ipv4-addr
  ipsec auto refresh 30 on                  <<<=== 鍵交換を始動する
 ip tunnel tcp mss limit 1350
 tunnel enable 30
```

自信が無いので薄目で見てやってください。 :stuck_out_tongue_closed_eyes: 

:bulb: YAMAHAのルータは[Microsoftの検証済みルータ](https://azure.microsoft.com/en-us/documentation/articles/vpn-gateway-about-vpn-devices/)には**含まれておらず**、いつなんどきAzure側の仕様変更にさらされるかわからないので、試用にとどめるか割り切って使うのがよいと思われます。
スライドを画像に変換してから PDF に変換する

最近 SlideShare にオワコンぽい雰囲気を感じていて(※)、良い代替サービスを探しているのですがどなたかご存知でないでしょうか。

※ ヒラギノ角ゴ などの一部の日本語フォントを含むスライドをアップロードすると、文字が全く表示されない問題があり、改善される気配が一向にない

そのうち他のサービスに乗り換え or 自分でそれっぽいアプリを作ろうと思っているのですが、それまでの間は今までどおり SlideShare を使っていきたいわけです。

## スライドをすべて画像に変換する
フォント絡みの問題に直面したとき、最も簡単かつ暴力的に解決する方法は**すべて画像に変換する**ことです。

僕がスライド作成に使用している Keynote では `ファイル` > `書き出す` > `イメージ` からスライドを連番の jpg または png ファイルとして書き出すことができます。

PowerPoint のことはよく知らないのですが、おそらく同じようなことができるでしょう。

## 連番画像を PDF に変換する
画像に関することであればとりあえず ImageMagick に頼っておけば問題無いでしょう。

Mac OS X であれば Homebrew を使って `$ brew install imagemagick` でインストールできます。

ImageMagick とは名前の通り魔法のように不思議な画像処理ツールで、特にオプションなどを指定することなく

```
$ convert *.png out.pdf
```

これだけで連番画像の PDF を生成してくれます。

あとは生成した PDF を SlideShare にアップロードすれば、問題なく表示できるでしょう。
PostgreSQLテンプレートのUTF8化をスクリプトで行う

# 概要
Cloud9でPostgreSQLを利用する場合毎回templateの更新が必要なのが面倒になってきたのでスクリプト化します。

# 準備

Cloud9にてRuby on Railsのプロジェクトテンプレートを選択し新しいワークスペースを作成します。

```bash
$ sudo service postgresql start
# python2のpsycopg2はすんなり入らなかったのでpython3を利用します
$ sudo pip3 install psycopg2
```

# スクリプト

```py:change_template.py
import psycopg2
import psycopg2.extras

connect = psycopg2.connect(dbname='postgres')
cursor = connect.cursor(cursor_factory=psycopg2.extras.DictCursor)
old_isolation_level = connect.isolation_level
connect.set_isolation_level(0)

cursor.execute("UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1'")
cursor.execute("DROP DATABASE template1")
cursor.execute("CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE'")
cursor.execute("UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1'")
cursor.execute("VACUUM FREEZE")

app_name = "my_app_name"
password = "pass"

cursor.execute("create role " + app_name + " with createdb login password '" + password + "'")

connect.commit()
connect.set_isolation_level(old_isolation_level)
```

postgrsユーザでこのスクリプトを実行します。

```bash
$ sudo sudo -u postgres python3 change_template.py
```

# 動作確認

psqlを起動してtemplate1のEncodingがUTF8になっていることを確認します。

```bash
$ sudo sudo -u postgres psql
```

```psql
ユーザ情報を確認
\du
  Role name  |                   Attributes                   | Member of 
-------------+------------------------------------------------+-----------
 my_app_name | Create DB                                      | {}
 postgres    | Superuser, Create role, Create DB, Replication | {}
 ubuntu      | Superuser, Create role, Create DB              | {}
データベースを確認
\l
   Name    |  Owner   | Encoding  | Collate | Ctype |   Access privileges   
-----------+----------+-----------+---------+-------+-----------------------
 postgres  | postgres | SQL_ASCII | C       | C     | 
 template0 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8      | C       | C     | 
 ubuntu    | ubuntu   | SQL_ASCII | C       | C     | 
```

# Rails

ここからはデフォルトのsqlite3をpgに置き換えて動作確認を行います。

```rb:Gemfile
gem 'pg'
```

```bash
$ bundle install
```

```yaml:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: my_app_name
  password: pass
  host: localhost

development:
  <<: *default
  database: my_app_name_development

test:
  <<: *default
  database: my_app_name_test

production:
  <<: *default
  database: my_app_name_production
```

```bash
$ rails g scaffold Post title:string body:text
$ rake db:migrate
$ rails s -b $IP -p $PORT
```

cloud9のポップするURLをクリックするか、上のメニューからPreview -> Preview Running Applicationを選択しrailsを表示させます。
または直接
https://workspaceName-UserName.c9users.io/posts
で確認できます。
rails instance variables

https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/activesupport/lib/active_support/core_ext/object/instance_variables.rb

```rb
1.9.3-p551 :019 > a.instance_variable_names
 => ["@a", "@b"] 
1.9.3-p551 :020 > a.instance_variables
 => [:@a, :@b] 
1.9.3-p551 :021 > a.instance_variables.first
 => :@a 
1.9.3-p551 :022 > a.instance_variables.first[1..-1]
 => "a" 
```
エラーが出ます。どうすればいいでしょうか？

aberyuuokunoAir:mooovi ryuki$ bundle
Fetching gem metadata from https://rubygems.org/..Retrying dependency api due to error (2/4): Bundler::HTTPError Network error while fetching https://bundler.rubygems.org/api/v1/dependencies?gems=actionmailer%2Cactionpack%2Cactiverecord%2Cactiveresource%2Cactivesupport%2Crake%2Cactionwebservice%2Cbundler%2Crailties%2Csprockets-rails%2Cactionview%2Cactivemodel%2Cactivejob%2Cactioncable%2Csass%2Csprockets%2Ctilt%2Ctherubyracer%2Cexecjs%2Cjson%2Cmulti_json%2Ccoffee-script%2Cthor%2Crails-dom-testing%2Cturbolinks-source%2Cblankslate%2Crdoc%2Csanitize%2Cpry%2Cpry-doc
Retrying dependency api due to error (3/4): Bundler::Fetcher::NetworkDownError Could not reach host bundler.rubygems.org. Check your network connection and try again.
Retrying dependency api due to error (4/4): Bundler::Fetcher::NetworkDownError Could not reach host bundler.rubygems.org. Check your network connection and try again.

Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (4/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Could not fetch specs from https://rubygems.org/