OmniAICreator/Qiita-1.07M huggingface dataset:
OculusRift DK2は知っていてもこれは知られてない！？便利すぎるRuntimeスイッチャー

![image](https://qiita-image-store.s3.amazonaws.com/0/71326/5bbccc96-deac-94a1-6386-7fa5925f6ad0.png)

#バージョン断絶の救世主
　OculusRiftを動かすのに必須なRuntimeのver.0.8と、製品版であるver.1.3には互換性がありません。0.8で作られたものは1.3で動きませんし、逆も然りです。悲しい仕様ですがそういうものなので仕方ありません。

過去に公開されたソフトをVRでもう一度プレイしたいってのありますよね。でもいちいちアンインストールしてインストールし直して…というのは手間です。
**Runtimeを切り替えできたら便利**だと思いません？

てのを実現した方が海外にいらっしゃいましたので紹介します。

##Oculus Runtime Switcher
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Oculus Runtime Switcher (0.5/0.6/0.7/0.8/1.3) with GUI<a href="https://t.co/8QCvhdaTze">https://t.co/8QCvhdaTze</a><br>のセットアップ終了。<br>0.8と1.3をワンクリックで切り替えて運用できる環境ができた。めちゃ便利。</p>&mdash; にくきう @次は札幌でMikuExpo (@shiftsphere) <a href="https://twitter.com/shiftsphere/status/716674835594674176">2016年4月3日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

[App] Oculus Runtime Switcher (0.5/0.6/0.7/0.8/1.3) with GUI
https://forums.frontier.co.uk/showthread.php?t=240613
Oculus Runtime Switcher V2.zip
https://www.sendspace.com/file/e3xkdj
![image](https://qiita-image-store.s3.amazonaws.com/0/71326/52ed85ad-023a-0d2d-e11f-4ce86abe0023.png)

ver.0.5から1.3までのランタイムをワンクリックで切り替えできるツールです。
切り替えするスクリプトをGUIで扱えるようにしたラッパーソフトといったところです。

###インストール手順
1. 最新版(1.3)を標準フォルダへインストール
2. 過去バージョンを以下の各フォルダへインストール
3. スイッチャーを起動して切り替えたいバージョンをクリック

（２）のインストールフォルダは

```lang:Readme.txt
	For 0.5 install to c:\program files (x86)\Oculus_0500
	For 0.6 install to c:\program files (x86)\Oculus_0600
	For 0.7 install to c:\program files (x86)\Oculus_0700
	For 0.8 install to c:\program files (x86)\Oculus_0800
```
となっています。
うまいことインストールできたら切り替え簡単環境のできあがりです。



###問題発生（未解決）
うちの環境(win10 64bit v1511 build 10586.164, Nvidia 361.91)だと、
**0.6以下をインストールするとOS自体が起動しなくなる**という洒落にならない現象が起きます。
こうなった場合は電源と同時にshiftキー長押しで復旧メニュー出してセーフモード再起動を掘り掘り選び、ランタイムをアンインストールすると戻ります。戻らないことも…あります…

実行ファイルの互換モードでWindows8にするとかビデオドライババージョンを古いものにするとか対処があるようですが完全には試しておりません。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">0.6のOculus RuntimeインストールがWindows10でうまくいかなかった。<a href="https://t.co/DXOTGNoJwI">https://t.co/DXOTGNoJwI</a><br>ここ見て半分真似てみたけどOS自体が起動しなくなる現象を回避できず。<br>Nvidiaドライバもダウンさせないとダメか…</p>&mdash; にくきう @次は札幌でMikuExpo (@shiftsphere) <a href="https://twitter.com/shiftsphere/status/716676833710714880">2016年4月3日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

どうしても！という方はチャンレンジしてみてはいかがでしょうか。


#オススメVRアプリ

Steam：Virtual Desktop
http://store.steampowered.com/app/38211
1.3向け 有料。VR空間にPC画面を浮かべて操作できます。この状態で動画見たりゲームしたりもちろんこの記事だって書けちゃいます。マルチモニタモードにすると横長や縦長な表示も可能！

StreetView VR
http://www.streetviewvr.net/
0.8向け 無料。Google MapのストリートビューをVRで見られるアプリです。UIが使いやすく地球上のあちこち飛び回って観光しにいけます。ドローンで空撮したポイントも結構あるのでいくらでも見て回れますね。


この2つをランタイム切り替えて使ってます。
Xamarinが気になる（VisualStudio2015_update2 インストールまで！！！）

Visual Studio 2015のupdate2が公開されたのでインストールしてみることにした。


![20160404_1.png](https://qiita-image-store.s3.amazonaws.com/0/120004/dee55c9a-50ed-aab0-053c-6b1d323b338a.png)


まずググる！

![20160404_2.png](https://qiita-image-store.s3.amazonaws.com/0/120004/2e1a85ca-eeb4-c878-72ab-477bfe922665.png)

そしてダウンロード

ダウンロードしたのを実行し入れたいものを適当に選択

![20160404_3.png](https://qiita-image-store.s3.amazonaws.com/0/120004/70aece69-7c20-5711-1188-91183539e88e.png)


暫し待つ

![20160404_4.png](https://qiita-image-store.s3.amazonaws.com/0/120004/36477ab2-f774-9d79-6175-c0a2bef45f0b.png)

まだ待つ（その間に記事を書く）

![20160404_5.png](https://qiita-image-store.s3.amazonaws.com/0/120004/f4e957d0-2b63-a276-6dfc-a29c39bc7998.png)

ということでマシン再起動

再起動後VisualStudio2015を探して起動![20160404_6.png](https://qiita-image-store.s3.amazonaws.com/0/120004/15b5e1ee-4f89-6277-1a6e-e44d34457ae5.png)


ここまででインストールは終了
ESP-WROOM-02 Arduino互換ボードでサーボモーターを回す

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# ESP-WROOM-02 Arduino互換ボードでサーボモーターを回そう
ESP-WROOM-02 Arduino互換ボードでサーボモーターの回転角度を制御する仕組みを作ります（ネットには接続しません）。細かな設定は記事「[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)」をご覧ください :eyes: 

# 電子部品リスト
ESP-WROOM-02 Arduino互換ボードと電子工作に必要なもろもろの道具以外に必要な電子部品のリスト。

| 部品名 | 個数 | 価格 |
|:-----------|:------------|:------------|
| [サーボモーター](http://akizukidenshi.com/catalog/g/gM-01726/) | 1 | 1,300円 |

# 配線図
サーボモーターの信号線はIO12へ接続します。  
<img alt="img03.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/a05438ef-70db-aad7-9577-53ceb322d246.png">

※[Fritzing](http://fritzing.org/home/)にESP-WROOM-02 Arduino互換ボードのパーツがないため、Arduino Unoを見た目上使用しています :bow: 

# スケッチ
```cpp
// サーボモーター用ライブラリの読み込み
#include <Servo.h>

// モータードライバーのIN1を接続するピン
const int servoPin = 12;

// サーボモーターのインスタンス
Servo servo;

void setup() {
  // デジタル3番ピンをサーボモーター用として設定
  servo.attach(servoPin);
}

void loop() {
  // 回転角度
  int angle = 0;

  // 0度から180度まで1度ずつ回転
  for (angle = 0; angle <= 180; angle++) {
    // サーボモーターを回転
    servo.write(angle);
    // 処理を10ミリ秒停止
    delay(10);
  }

  // 180度から0度まで1度ずつ回転
  for (angle = 180; angle >= 0; angle--) {
    // サーボモーターを回転
    servo.write(angle);
    // 処理を10ミリ秒停止
    delay(10);
  }
}
```
ESP-WROOM-02 Arduino互換ボードと曲げセンサーで曲がり具合を検知する

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# ESP-WROOM-02 Arduino互換ボードと曲げセンサーで曲がり具合を検知しよう
ESP-WROOM-02 Arduino互換ボードと曲げセンサーを使って、センサー本体を曲げたらLEDを点灯、そうでなければ消灯する仕組みを作ります（ネットには接続しません）。細かな設定は記事「[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)」をご覧ください :eyes: 

# 電子部品リスト
ESP-WROOM-02 Arduino互換ボードと電子工作に必要なもろもろの道具以外に必要な電子部品のリスト。LEDはボードに搭載されているものを光らせます。

| 部品名 | 個数 | 価格 |
|:-----------|:------------|:------------|
| [曲げセンサー](https://www.switch-science.com/catalog/126/) | 1 | 1,900円 |
| [10kΩ抵抗](http://akizukidenshi.com/catalog/g/gR-25103/) | 1 | 実質1円 |

# 配線図
曲げセンサーの信号線はA0へ接続します。  
<img alt="img02.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/f958defb-99f7-5692-a43a-3fcb5ff92a6d.png">

※[Fritzing](http://fritzing.org/home/)にESP-WROOM-02 Arduino互換ボードのパーツがないため、Arduino Unoを見た目上使用しています :bow: 

# スケッチ
```cpp
// 曲げセンサーを接続するピン
const int sensorPin = A0;
// LEDを接続するピン
const int ledPin = 14;

// 曲げセンサーの閾値
const int threshold = 300;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  // 曲げセンサーの値を取得
  int sensorValue = analogRead(sensorPin);

  // シリアルモニターに光センサーからの値を表示
  Serial.print("sensor = ");
  Serial.println(sensorValue);

  // 曲げているなら
  if (sensorValue < threshold) {
    // LEDを接続しているピンをHIGH状態に変更（点灯）
    digitalWrite(ledPin, HIGH);
  }
  // 曲げていないなら
  else {
    // LEDを接続しているピンをLOW状態に変更（消灯）
    digitalWrite(ledPin, LOW);
  }

  delay(200);
}
```
ESP-WROOM-02 Arduino互換ボードと圧力センサーで圧力を計測する

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# ESP-WROOM-02 Arduino互換ボードと圧力センサーで圧力を計測しよう
ESP-WROOM-02 Arduino互換ボードと圧力センサーを使って、圧力が加わればLEDを点灯、そうでなければ消灯する仕組みを作ります（ネットには接続しません）。細かな設定は記事「[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)」をご覧ください :eyes: 

# 電子部品リスト
ESP-WROOM-02 Arduino互換ボードと電子工作に必要なもろもろの道具以外に必要な電子部品のリスト。LEDはボードに搭載されているものを光らせます。

| 部品名 | 個数 | 価格 |
|:-----------|:------------|:------------|
| [圧力センサー](http://akizukidenshi.com/catalog/g/gP-04002/) | 1 | 500円 |
| [10kΩ抵抗](http://akizukidenshi.com/catalog/g/gR-25103/) | 1 | 実質1円 |

# 配線図
圧力センサーの信号線はA0へ接続します。  
<img alt="img02.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/86e96942-b229-e3ed-d82d-4cfd514da9b0.png">

※[Fritzing](http://fritzing.org/home/)にESP-WROOM-02 Arduino互換ボードのパーツがないため、Arduino Unoを見た目上使用しています :bow: 

# スケッチ
```cpp
// 圧力センサーを接続するピン
const int sensorPin = A0;
// LEDを接続するピン
const int ledPin = 14;

// 圧力センサーの閾値
const int threshold = 300;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  // 圧力センサーの値を取得
  int sensorValue = analogRead(sensorPin);

  // シリアルモニターに光センサーからの値を表示
  Serial.print("sensor = ");
  Serial.println(sensorValue);

  // 圧力を加えているなら
  if (sensorValue >= threshold) {
    // LEDを接続しているピンをHIGH状態に変更（点灯）
    digitalWrite(ledPin, HIGH);
  }
  // 圧力を加えていないなら
  else {
    // LEDを接続しているピンをLOW状態に変更（消灯）
    digitalWrite(ledPin, LOW);
  }

  delay(200);
}
```
testing > 試験確認項目

自分が作成したソフトの動作確認用資料を作成した。

以下の項目を記載した。

- No: インデックス
- テスト項目: どの機能かなど (例: 時計機能)
- 確認内容: テスト項目の概要 (例: 時刻同期)
- 確認方法: (例: xxしてyyしてzzする)
- 想定結果: (例: xxのタイミングでyyする)
- テスト結果: OK or NG
- テスト実施日: (複数日かかる場合など考慮して項目ごとに持つ)
- 備考: 想定結果と異なる結果のメモ (xxとなった. yyは本来4つzzであるが、5つzzした、など)

上記の項目を資料に用意した根拠としては、いくかの市販の資料作成ソフトの出力を参考にした。自分がこれから試験しようとしている試験内容に適合しているように思う。
(試験内容が変わればまた別の項目が必要となる)
10年前の日本人はPerlが好きだった？

#日本人はPythonが好きじゃないのか？？
[日本はプログラミング言語の面でもガラパゴス化しているのかもしれない](http://qiita.com/blog3nt/items/5dceb6407bff11adff52)を見ても、なんとなくピンと来なかった。

いつだったかあまり覚えていないが、私がPythonを始めたときは、雰囲気としては「Perlか？　いや、今更Perlって。Rubyだろ。」って雰囲気があった。
その頃には既に、PythonはGoogleで使われている言語として認識されており、KEKも使っていると言われていたのだが、少なくとも日本では、王者のPerlと、それを追うRubyが注目されており、Python? なにそれ? って感じだった。

その後、Ruby on RailsでRubyが注目され、Pythonはさらに日陰者となった。
なのに最近、なんかしらんけどPythonが妙に持て囃されている。俺に言わせりゃ、なんなんだこれ、なんでこんな流行ってるんだって感じだ。なので、日本でPythonが不人気かのような書き方の記事には、すごく違和感があった。むしろ大絶賛流行中じゃないか。

#Googleトレンドで調べてみた。

[Googleトレンド](https://www.google.co.jp/trends/)で、キーワードをカンマ区切りで打ち込んで検索すると、具体的に何をどう数値化したものかは知らないが、ともかく、キーワードの人気度が数値化されて出てくる。
特定の国の結果を抜き出すことだってできる。

ということで。Perl,Ruby,Python のトレンドを調べてみた。コメント欄に、アメリカは統計がうんぬんってのも書かれていたので、すべての国、日本、アメリカの3地域を調べてみた。
そして、2016年3月と、10年前の2006年3月とのデータを、LibreOffice Calc (Excelっぽいソフト)で集計してみた。

比べやすいように、2006年3月のPerlを100となるように正規化して、グラフを描いたら、こうなった。

![スナップショット58.jpeg](https://qiita-image-store.s3.amazonaws.com/0/88256/f31bc862-c30b-853e-f2e9-c7c0d02ee5be.jpeg)

**これ、めっちゃ意外じゃないですか？？**

日本人はRubyが人気？　Pythonが不人気？
いえいえ、とんでもない。日本のかつての人気言語はPerlで、今の人気言語はPythonでしたよ！

#とんでもないオチ

途中で気づいたのだが。これは「すべての国」と「アメリカ」の結果に関しては、当てにならない可能性がある。
なぜなら、ruby, pythonは一般名詞であり、プログラミング言語以外も含みうるからだ。
とはいえ、ここ10年で、世界的に宝石や蛇への関心が高まっている、という話は聞かないので、数字の増減した量に関しては、ある程度当てになるかもしれない。
心配なのは、日本で、これら汎用スクリプト言語への関心が低くなっていることだ。
まぁ、最近はJavaScript (ECMAScript)もブラウザ専用言語ではなくなりつつあるし、スクリプト言語だけがプログラミング言語ではないし、杞憂なのかもしれないが。

#おまけ

それにしても、Perlの人気の、指数関数的減衰具合は清々しいですね。(日本のトレンド)
![スナップショット59.jpeg](https://qiita-image-store.s3.amazonaws.com/0/88256/d77bdd77-54d2-8b99-74c6-521422b39577.jpeg)
そして、Rubyは全盛期にはPerlを追い抜くことができず、Perlが落ち目になってきた5年くらい前にようやく追い抜いたみたいです。
ログイン画面

# index.html
基本画面を作成。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Login</title>
  </head>
  <body>
    <form action="login.php" method="post">
      User<input type="text" name="user" value=""><br>
      Password<input type="password" name="password" value=""><br>
      <input type="submit" name="login" value="Login">
    </form>
  </body>
</html>
```
## form method
### GET
URLに値が表示される。
### POST
URLに値が表示されない。
passwordとか送るときは、POSTにする。

# login.php
認証するためのphpを作成。

```html+php
<?php
session_start();

$_SESSION["user"] = $_POST["user"];
$_SESSION["password"] = $_POST["password"];

$mysqli = mysqli_connect("localhot", "root", "password", "db");
if($mysqli) {
 echo OK;
} else {
 echo NG;
}

$result = mysqli_query($mysqli, "SELECT DATABASE()");
$row = mysqli_fetch_row($result);
printf("%s", $row[0]);

if(isset($_POST["user"])) echo $_POST;

?>
```

## session_start()
セッションを開始する。

## $_SESSION
すべてのセッションデータを格納する。

## $_POST
POSTメソッドで要求されたときに格納する。

## mysqli_connect()
mysqlに接続する。

## mysqli_query()

## mysqli_fetch_row()

## isset()
変数がセットされていることを確認する。
ESP-WROOM-02 Arduino互換ボードと圧電スピーカーで振動を検知する

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# ESP-WROOM-02 Arduino互換ボードと圧電スピーカーで振動を検知しよう
ESP-WROOM-02 Arduino互換ボードと圧電スピーカーを使って、圧電スピーカーに与えた振動の大きさをArduino IDEのシリアルモニターに表示します（ネットには接続しません）。細かな設定は記事「[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)」をご覧ください :eyes: 

# 電子部品リスト
ESP-WROOM-02 Arduino互換ボードと電子工作に必要なもろもろの道具以外に必要な電子部品のリスト。

| 部品名 | 個数 | 価格 |
|:-----------|:------------|:------------|
| [圧電スピーカー](http://akizukidenshi.com/catalog/g/gP-04228/) | 1 | 100円 |
| [ツェナーダイオード](http://akizukidenshi.com/catalog/g/gI-00584/) | 1 | 実質25円 |
| [1MΩ抵抗](http://akizukidenshi.com/catalog/g/gR-25105/) | 1 | 実質1円 |

# 配線図
圧電スピーカーの信号線はA0へ接続します。  
<img alt="img03.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/14fe4d6b-b831-047f-b342-f79a34d158d2.png">

※[Fritzing](http://fritzing.org/home/)にESP-WROOM-02 Arduino互換ボードのパーツがないため、Arduino Unoを見た目上使用しています :bow: 

# スケッチ
```cpp
// 振動センサーを接続するピン
const int sensorPin = A0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  // 振動センサーの値を取得
  int sensorValue = analogRead(sensorPin);

  // シリアルモニターに光センサーからの値を表示
  Serial.print("sensor = ");
  Serial.println(sensorValue);
}
```
PHPでImageMagick、正確にはimagickを使ってビットマップをJPEGに変換してみる


###やりたかった事

GD(プラスアルファ)を使用してビットマップをJPEGに変換できたので、
今度はImageMagick(正確にはimagick)で試してみた。

###結果と今後

50MB位のビットマップ画像を、10秒程度で変換したので、まずはよいとします。
後は本来の意味でサムネイル画像を作成するのと、
サムネイル既存ならそちらを使う様に改善するのと、

hoverで拡大画像を表示できたらいいなぁ。

###先に全体のコード

```displayimgs.php
<?php
print <<< _HTML_
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>ビットマップ画像を表示</title>
</head>
<body>
<h1>ビットマップ画像を表示する</h1>
_HTML_;

$work_dir = opendir('work/');

if (isset($_GET["imageno"])) {
  $imageno = $_GET["imageno"];
  $image = $imageno;
}
while (false !== ($file[] = readdir($work_dir)));
closedir($work_dir);
natsort($file);
reset($file);
$reverse = array_reverse($file, true);
if (!isset($imageno)) {
  $imageno = 0;
  $image = 0;
}
$pageline = 4; //1ページに表示させる枚数
$imagecount = 0;
while (false !== ($bmp = each($reverse))){
  if (preg_match ("|.bmp$|", $bmp[1])) {
    $imagecount++;
    if ($imageno == ($image+$pageline)) {
      break;
    }
    if ($imagecount > $image) {
      print "<div style='float:left;margin-right:4px;margin-bottom:8px;'>\n";
      print "<table cellspacing='0' cellpadding='0' border='0'>\n";
      print "<tr>\n";
      $work_dir2 = "work/";
      $work_img= dirname(__FILE__)."/".$work_dir2.$bmp[1];
      $imagick = new Imagick();
      $imagick->readImage($work_img);
      $imagick->writeImages('temp.jpg', false);
      if('temp.jpg' !== FALSE){
       print "<td><img src=\"temp.jpg\" alt=\"".$bmp[1] ."のサムネイル\"></td>\n";
      }
      print "</tr>\n";
      print "<tr>\n";
      print "<td align='left'>" . $bmp[1] . "</td>\n";
      print "</tr>\n";
      print "</table>\n";
      print "</div>\n";
      $imageno++;
    }
  }
}

echo '<div style="margin-top:12px;clear:both;">';
echo '<p class="txt">';

$page = $imageno+$pageline;
if ($imageno > $pageline) {
  $backno = $imageno-($pageline*2);
  print "<a href='displayimgs7_2.php?imageno=" . $backno . "'>back</a>";
}
if ($imageno < $imagecount) {
  print "<a href='displayimgs7_2.php?imageno=" . $imageno . "'>next</a>";
}
echo '</div>';

echo '<a href =./index.html>トップへ戻る</a>';

echo '</body>';
echo '</html>';

?>
```

###軽く解説

初めの方は主にヘッダの部分で、いちいちエコーするのが面倒で、
 枠としてHTMLの記載にしてます。

その後、画像のあるディレクトリを開き、画像数を数え、
 画像のリストを出して整形、
 指定するページ数に合わせて、
ビットマップ画像を表示してます。

今回のメインになるのは、こちら。

```displayimgs_part.php
      $work_dir2 = "work/";
      $work_img= dirname(__FILE__)."/".$work_dir2.$bmp[1];
      $imagick = new Imagick();
      $imagick->readImage($work_img);
      $imagick->writeImages('temp.jpg', false);
      if('temp.jpg' !== FALSE){
       print "<td><img src=\"temp.jpg\" alt=\"".$bmp[1] ."のサムネイル\"></td>\n";
      }
      print "</tr>\n";
      print "<tr>\n";
      print "<td align='left'>" . $bmp[1] . "</td>\n";
```

###メインの解説

HTMLタグは無視するとして。

なんと、readImage()は、フルパスもしくは、\$\_SERVER['DOCUMENT_ROOT'].でないと読んでくれなかった。
ただ、開発環境と実稼働の環境が異なり、\$\_SERVER['DOCUMENT_ROOT'].が環境毎に異なるが、
コードをその為に書き換えるのは嫌です。
幸い、dirname(\_\_FILE\_\_).が通ったので、何とかなった。

他に意外とはまったのは、'temp.jpg' !== FALSEでシングルクォートが抜けてた事。
しっかりみると、temp.jpgなんて書いた日には、tempなる定数と、jpgなる定数を、つなぎ合わせた定数になってしまうので、なんのことやら、である。
スクリーンバッファというもの

cmdやらで表示されている文字はスクリーンバッファと呼ばれるバッファに保存されている文字を表示しているだけのようです。

スクリーンバッファは表示されているものとは別にも作成することができるようです。

裏でバッファに書き込んで、表のバッファと差し替えることでちらつきを防止する等の使い方ができるようです。

Windows では以下のサイトが詳しそう？

http://eternalwindows.jp/windevelop/console/console03.html
Rで、相関係数を求めて、csv出力したかったのです。

#Rで、相関係数

Rで、相関係数（cor関数のデータ）を求める方法は、数多くあります。（私的に実用的か、どうか？という観点のメモです）　　
　
baseのデモをやってみましたレベルです。
csv出力したかったのです！
（Excelでも同じことは出来るようですが、Rなら、より簡単に作業をする方法だと、思います。）
例として、irisデータの1行目から4行目のベクトルについての相関係数を、網羅的に求める方法のスクリプトコードです。

#スクリプトコード（irisデータに対しての例）

```R:correlation_iris.R
x <- data.frame(cor(iris[1:4]))
x <- round(x, digits = 2)
View(x)
write.csv(x, file = "cor_iris.csv")
```
Rでは、マトリックス形式（行列）でもベクトルと同じように処理してくれますよね。
行列形式も、縦ベクトルが並んでいるということで、irisデータの１から４列目が、マトリックス形式なので、それに対して、cor関数を作用させて、データフレームとします。
（とは言え、上記のスクリプトでは行列（matrix）でもデータフレーム(data.frame)でも、結果は同じでしょうね。）
そのデータフレームに対して、round, write.csv の処理をおこなっていました。
　　

パスに注意して、出力を確認しました。
出来ました。
csvファイルをエクセルで開いたスクリーンショットです。
![スクリーンショット 2016-04-04 19.55.33.png](https://qiita-image-store.s3.amazonaws.com/0/22082/03066040-d987-a677-048a-0dc1098762be.png)

　　

##☆参考にしたページ

cor関数の使い方の詳細は、下記が参考になります。

複数の変数間の相関係数をイチドキに求める

http://monge.tec.fukuoka-u.ac.jp/r_analysis/descriptive_statistics22.html

　　
##ちなみにirisとは？
上述のリンク先にもirisの説明がありますが、三種類[setosa・versicolor・virginica]がどんなものかは、下記のリンク先の方が、わかりやすかったです。
詳細は、下記を参照下さい。

- irisの正体 (R Advent Calendar 2012 6日目) http://d.hatena.ne.jp/tsutatsutatsuta/20121206/1354737461

- 下記のスライドの３ページ目に写真があります。
http://www.slideshare.net/DavidGerster1/gerster-hands-on-machine-learning-v2

普段、Excelを使っている人が、irisデータを実感するには、
下記のコマンドを実行して、開くか実際にExcel経由でどんなものか、みるのがよいかもです。

##irisデータを実感する手段は？
下記の作業をすると、私の場合は、分かりやすいです。

```R:iris.R
#Rstudioで見るとき。
View(iris)
#エクセルに出力したいとき。
write.csv(iris, file = "iris.csv")
``` 

出力結果は、略します。
php artisan queue:restartについて

```
php artisan queue:restart
```
1. restartなのに、実際は停止するためのコマンドです。起動は別に考えないと！　
例えばsupervisorに任せる。
2. ```php artisan queue:work --daemon```で起動したworkしか停止できない。

* ドキュメント：　https://laravel.com/docs/5.1/queues#deploying-with-daemon-queue-listeners
* 関連コード:　https://github.com/laravel/framework/blob/c6c15de8dcaf849434238bcc258ec4ab67b526b2/src/Illuminate/Queue/Worker.php#L93
* 開発者らのやりとり：　https://github.com/laravel/framework/issues/6950
Cloud Storage(SoftLayer Object Storage / S3)へ高速にファイルアップロードする方法

dashDBからCloud Storageへファイルをアップロードする方法はいくつかありますが、特にサイズが大きいファイル（5GB以上）を高速にアップロードする場合の話

スクリプトを実行すると、入力ファイルをgzipで圧縮分割し、アップロードします

①スクリプトをダウンロードする。
　IBM Knowledgecenterで『moveToCloud』と検索し、スクリプトをダウンロードする
　　http://www.ibm.com/support/knowledgecenter/SS6NHC/com.ibm.swg.im.dashdb.kc.doc/welcome.html?lang=ja

②perl/Curlが実行可能な環境を用意する。
　※今回はsygwin(https://www.cygwin.com/)をインストール
　　パッケージはPerlと、Net以下のcurl Multi-protocol file transfer toolを選択

③moveToCloudのパッケージを実行環境以下へ配置

④下記のように認証ファイルcredentials.txtを作成する

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/116483/fefb2e0d-012a-407f-f15d-6dcc103796b5.png)


⑤テスト実行
<pre>
$ ./moveToCloud.pl -test -target softlayer::\<auth_url>::\<container>::/\<upload後のファイル名> -cred credentials.txt
</pre>

下記メッセージが出れば接続成功
Test successful. Upload may proceed.

⑥アップロード実行
<pre>
$ ./moveToCloud.pl -source \<upload対象のファイル名> -target softlayer::\<auth_url>::\<container>::/\<upload後のファイル名> -cred credentials.txt
</pre>
下記メッセージが出ればアップロード成功
Successfully uploaded to "\<upload対象のファイル名>.gz"

以上。
ESP-WROOM-02 Arduino互換ボードと焦電センサーで動体を検知する

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# ESP-WROOM-02 Arduino互換ボードと焦電センサーで動体を検知しよう
ESP-WROOM-02 Arduino互換ボードと焦電センサーを使って、検知範囲で動体(人体)が動いていないか検知して、動いたらLED点灯、動いていなかったらLEDを消灯するしくみを作ります（ネットには接続しません）。細かな設定は記事「[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)」をご覧ください :eyes: 

# 電子部品リスト
ESP-WROOM-02 Arduino互換ボードと電子工作に必要なもろもろの道具以外に必要な電子部品のリスト。

| 部品名 | 個数 | 価格 |
|:-----------|:------------|:------------|
| [焦電センサー](http://akizukidenshi.com/catalog/g/gM-09750/) | 1 | 480円 |
| [LED](http://akizukidenshi.com/catalog/g/gI-01170/) | 1 | 実質20円 |
| [抵抗 180Ω](http://akizukidenshi.com/catalog/g/gR-25181/) | 1 | 実質1円 |

# 配線図
焦電センサーの信号線はIO12へ、LEDはIO14へ接続します。  
<img alt="img04.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/e102a2dc-982c-6c63-131f-66282bedc5e6.png">

※[Fritzing](http://fritzing.org/home/)にESP-WROOM-02 Arduino互換ボードのパーツがないため、Arduino Unoを見た目上使用しています :bow: 

# スケッチ
```cpp
// 焦電センサーを接続するピン
const int sensorPin = 12;
// LEDを接続するピン
const int ledPin =  14;

void setup() {
  // デジタル2番ピンを入力用として設定
  pinMode(sensorPin, INPUT);
  // デジタル13番ピンを出力用として設定
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 焦電センサーの状態を取得
  int sensorState = digitalRead(sensorPin);

  // 動きを検知したら
  if (sensorState == HIGH) {
    // LEDを接続しているピンをHIGH状態に変更（点灯）
    digitalWrite(ledPin, HIGH);
  }
  // 動きがないなら
  else {
    // LEDを接続しているピンをLOW状態に変更（消灯）
    digitalWrite(ledPin, LOW);
  }
}
```
ESP-WROOM-02 Arduino互換ボードで温湿度センサーを使う

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# ESP-WROOM-02 Arduino互換ボードと温湿度センサーを使ってみよう
ESP-WROOM-02 Arduino互換ボードとタクトスイッチを使って、温湿度センサー(DHT11)で取得した温度・湿度・体感温度をArduino IDEのシリアルモニターに表示します（ネットには接続しません）。細かな設定は記事「[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)」をご覧ください :eyes: 

# 電子部品リスト
ESP-WROOM-02 Arduino互換ボードと電子工作に必要なもろもろの道具以外に必要な電子部品のリスト。

| 部品名 | 個数 | 価格 |
|:-----------|:------------|:------------|
| [温湿度センサー](http://akizukidenshi.com/catalog/g/gM-07003/) | 1 | 300円 |
| [10kΩ抵抗](http://akizukidenshi.com/catalog/g/gR-25103/) | 1 | 実質1円 |

# 配線図
温湿度センサーの信号線はIO12へ接続します。  
<img alt="img02.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/81661145-e59f-4477-7241-8b07a45321b3.png">

※[Fritzing](http://fritzing.org/home/)にESP-WROOM-02 Arduino互換ボードのパーツがないため、Arduino Unoを見た目上使用しています :bow: 

# スケッチ
[DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library)をArduino IDEにインストールしてください。

```cpp
// ライブラリを読み込む
#include "DHT.h"

// 温湿度センサーを接続するピン
#define SENSOR_PIN 12
// 温湿度センサーの種類
#define DHT_TYPE DHT11
// 温湿度センサーのインスタンス
DHT dht(SENSOR_PIN, DHT_TYPE);

void setup() {
  Serial.begin(115200);
  // 温湿度センサーを初期化
  dht.begin();
}

void loop() {
  // DHT11のサンプリング間隔が2秒以上のため、
  // 処理を2秒間止める
  delay(2000);

  // 湿度を取得
  float humidity = dht.readHumidity();
  // 温度を取得
  float temperature = dht.readTemperature();

  // センサーから値を取得できたか判定
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("sensor error.");
    // loop()関数の始めに戻る
    return;
  }

  // 湿度と温度を基に体感温度(熱指数)を算出
  float heatIndex = dht.computeHeatIndex(temperature, humidity, false);

  // シリアルモニターに値を表示
  // 湿度
  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.print(" % ");
  // 温度
  Serial.print(" Temperature: ");
  Serial.print(temperature);
  Serial.print(" *C ");
  // 体感温度(熱指数)
  Serial.print("HeatIndex: ");
  Serial.print(heatIndex);
  Serial.println(" *C");
}
```
ESP-WROOM-02 Arduino互換ボードで光センサーを使う

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# ESP-WROOM-02 Arduino互換ボードと光センサーを使ってみよう
ESP-WROOM-02 Arduino互換ボードと光センサー(CdSセル)を使って、Arduino IDEのシリアルモニターに値を表示します（ネットには接続しません）。細かな設定は記事「[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)」をご覧ください :eyes: 

# 電子部品リスト
ESP-WROOM-02 Arduino互換ボードと電子工作に必要なもろもろの道具以外に必要な電子部品のリスト。

| 部品名 | 個数 | 価格 |
|:-----------|:------------|:------------|
| [CdSセル](http://akizukidenshi.com/catalog/g/gI-00110/) | 1 | 30円 |
| [10kΩ抵抗](http://akizukidenshi.com/catalog/g/gR-25103/) | 1 | 実質1円 |

# 配線図
光センサーの信号線はA0へ接続します。  
<img alt="img01.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/14b522f4-4652-2449-ff14-f0bffcff20ab.png">


※[Fritzing](http://fritzing.org/home/)にESP-WROOM-02 Arduino互換ボードのパーツがないため、Arduino Unoを見た目上使用しています :bow: 

# スケッチ
```cpp
// 光センサーを接続するピン
const int sensorPin = A0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  // 光センサーの値を取得
  int sensorValue = analogRead(sensorPin);

  // シリアルモニターに光センサーからの値を表示
  Serial.print("sensor = ");
  Serial.println(sensorValue);

  delay(200);
}
```
RaspberryPi初期設定（SSH接続まで）

※自分用のメモとして書いたものです。
# 目的と必要なもの
目的：Piを遠隔操作が出来るようにする。

必要なもの
- RaspberryPi
- LANケーブル
- HDMIケーブル（初期状態はディスプレイに接続する必要があるため）
- SDカード（サイズは任意）

※Rasbianのインストールについて
[このサイト](http://techblog.clara.jp/2015/02/raspberry-pi-2-model-b_install_and_ssh_connect/)が分かりやすいので参考にしてください。

## 設定の前にやっておきたいこと
初期の状態のRasbianですと、何かと不便なので以下のコマンドを実行してください。

```lang:rasbian
sudo apt-get update
sudo apt-get upgrade
```

## ネットワーク設定

```lang:rasbian
sudo su -
vi /etc/dhcpcd.conf
```

上記の操作をすると、viというテキストエディタが起動されます。
viは癖があるので、操作が苦手な方はviの部分をnanoにしてください。
※初期ではviなので、vimが欲しい人はインストールしてください。

少し前のバージョンだと、/etc/network/interfacesに設定していたのですが、
最近では、設定を全て同じファイルで書くのではなく、分けるという流れから、
/etc/dhcpcd.confに書くことになっています。（推測）
※前のファイルの場所でも書けないことないですが、
優先度低いせいか毎回読み込む必要があります。

```lang:/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.0.2/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```

上記の記述を一番下に追加します。
addressは設定したいRaspberryPiのアドレスです。
routersはデフォルトゲートウェイ（ルータとか）を指します。
domain_name_serversはDNSを指します。
再起動をして、以下のコマンドでアドレスが変わったことを確認してください。

```lang:rasbian
ifconfig
```

ついでに、導通確認のためにpingを飛ばしてみましょう。

```lang:PC
ping 192.168.1.254
```

## SSH接続してみよう

Windowsの場合は、teratermなどで接続をしてください。
Macの場合は以下のコマンドで接続します。

```lang:PC
ssh pi@192.168.1.254
```

もし、接続ができなかった場合は以下のことを疑ってください。
- PiかPCのLANが何かしらの不具合
- アドレスの設定が間違い

現状でも使えますが、
セキュリティ的にはよろしくない状態ですので、気をつけて下さい、
Windowsソフト間通信 > Link > ウィンドウメッセージ / その他いくつか

```txt:実装環境
C++ Builder XE4 on Windows 7 pro
```

同一PC上で複数ソフト間の通信を実装することになった。これまでの経験としてはUDP通信を主にしていたが、同じPC上で異なるソフト間通信の場合は、UDPではできない。

ウィンドウズメッセージ(詳しくない)を使うことになるだろうか。
http://chokuto.ifdef.jp/advanced/copydata.html
自分の記事があった(忘れていた) http://qiita.com/7of9/items/14e6aff2c825256e1a75

いくつか方法について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=19495

.NETFrameworkでないので、使えるものは制限される。

MSMQについて
http://stackoverflow.com/questions/400115/what-is-microsoft-message-queuing-msmq-how-does-it-work

WPFだと以下もある
http://qiita.com/bamchoh/items/be3ca5d915cc54e62278

C#：WPF：SendMessageによるプロセス間通信まとめ。
http://qiita.com/TakujiMiyamoto/items/247b75a027155081e53d
> メッセージ送信側へ任意の戻り値を返すことも可能。

ウィンドウメッセージは一方的に送る方法は過去記事で実装していたが、返信処理は上記を参考に実装することになりそうだ。
ESP-WROOM-02 Arduino互換ボードでタクトスイッチを使う

# スイッチサイエンス製 ESP-WROOM-02 Arduino互換ボード
スイッチサイエンスから[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)が発売されました。今まではESP-WROOM-02(ESP8266)をArduinoのスケッチを書き込んで使うためには、モジュールをはんだ付けしてブレッドボード上で使用したりと少々使いづらい部分がありました。それをこの互換ボードが解消してくれます :pray: 

[ESP-WROOM-02 Arduino互換ボード](https://www.switch-science.com/catalog/2620/)
![2620_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/0694e9d1-177b-dedb-000d-38c2446ce73b.jpeg)

# ESP-WROOM-02 Arduino互換ボードとタクトスイッチを使ってみよう
ESP-WROOM-02 Arduino互換ボードとタクトスイッチを使って、タクトスイッチを押したらLチカするようなしくみを作ります（ネットには接続しません）。細かな設定は記事「[ESP-WROOM-02開発ボードをArduino IDEで開発する方法](http://trac.switch-science.com/wiki/esp_dev_arduino_ide)」をご覧ください :eyes: 

# 電子部品リスト
ESP-WROOM-02 Arduino互換ボードと電子工作に必要なもろもろの道具以外に必要な電子部品のリスト。LEDはボードに搭載されているものを光らせます。

| 部品名 | 個数 | 価格 |
|:-----------|:------------|:------------|
| [タクトスイッチ](http://akizukidenshi.com/catalog/g/gP-03647/) | 1 | 10円 |
| [10kΩ抵抗](http://akizukidenshi.com/catalog/g/gR-25103/) | 1 | 実質1円 |

# 配線図
タクトスイッチの信号線はIO12へ接続します。  
<img alt="img01.png" src="https://qiita-image-store.s3.amazonaws.com/0/55103/deb23910-d6fc-91bc-9ab4-518dd4c65f86.png">

※[Fritzing](http://fritzing.org/home/)にESP-WROOM-02 Arduino互換ボードのパーツがないため、Arduino Unoを見た目上使用しています :bow: 

# スケッチ
```cpp
// タクトスイッチを接続するピン
const int switchPin = 12;
// LEDを接続するピン
const int ledPin =  14;

void setup() {
  // デジタル2番ピンを入力用として設定
  pinMode(switchPin, INPUT);
  // デジタル13番ピンを出力用として設定
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // タクトスイッチの状態を取得
  int buttonState = digitalRead(switchPin);
  // タクトスイッチの状態をLEDに反映
  digitalWrite(ledPin, buttonState);
}
```
凄い事例がまた一つ。ChatWorkのデスクトップアプリもElectronで作られていた

本日（2016/04/04）、人気のコミュニケーションツール「ChatWork（チャットワーク）」のデスクトップ版アプリがリリースされました（※）。 その挙動が**HTML+Node.jsでデスクトップアプリケーションを作る「[Electron(エレクトロン)](http://electron.atom.io/)」ではないか？** と感じたので調べてみました。

※ [デスクトップ版アプリをリリース | ChatWorkブログ](http://blog-ja.chatwork.com/2016/04/cwblog28.html)

# Elecron製のアプリかどうかを調べてみた
OS Xにて、あるアプリがElecron製かどうかを調べるには、アプリケーションファイルを右クリックし、中身を見てElectron.exe（またはそれに当たるもの）があるかどうかで判断できます。ChatWorkがElectron製かどうかを調べてみましょう。

■ 手順
① チャットワーク.appを右クリック（多くの場合、Applicationフォルダに格納しているでしょう）し、[パッケージの内容を表示]を選択する。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/60d102d8-df51-92c7-2a36-2f2b737f4d07.png)

② ChatWork.app/Contents/MacOS フォルダに「Electron」ファイルがあったので、Electron製のアプリだと判断できる。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/888e6f8c-381b-6ef7-19c4-dd31407e8278.png)

# Eletronの注目すべき事例がまた一つ増えた

**ElectronはJavaやObjective Cといったネイティブの言語を使うこと無く、HTMLとNode.jsだけでクロスプラットフォームのアプリケーションを作ることのできるフレームワーク**です。Microsoft社製のコードエディター「[Visual Studio Code](https://code.visualstudio.com/)」や、Slack Technologiesのチャットツール「[Slack(スラック)](https://slack.com/)」といった有名なアプリでも、Electronを採用しています。ChatWorkのElectron採用により、また一つElectronの注目すべき事例が増えました。
Visual Studio 2015の見た目を自分好みにする

# 見た目：
![image](https://qiita-image-store.s3.amazonaws.com/0/100271/5b76d03e-398a-847b-c709-75b98f480483.png)

# ClaudiaIDE
テキストエディタに萌えが足りないのでなんか萌え画像を置いてます。
https://visualstudiogallery.msdn.microsoft.com/9ba50f8d-f30c-4e33-ab19-bfd9f56eb817

#設定
Tools -> Options -> ClaudiaIDE -> General
にて
![image](https://qiita-image-store.s3.amazonaws.com/0/100271/3d860511-770b-923f-ad24-11184e7d0747.png)
このようなメニューが出ます。
SingleImage のファイルパスを好みの画像に設定すれば薄く出てきます。

スライドショーもできるそうですが浮気はダメ、絶対。

# Visual Studio 2015 Color Theme Editor 
https://visualstudiogallery.msdn.microsoft.com/6f4b51b6-5c6b-4a81-9cb5-f2daa560430b

これを入れてちょっと設定するだけです。

# 設定
Color Theme Editorを入れた後に、テーマを選んだり、色を設定するには Tools -> Customize Color で開くウィンドウを使います。
C#の編集中、演算子の色が薄くて見えにくいので設定しなおしました。あと、BreakPointとかが出るIndicator Barってところの色も変えました。

![image](https://qiita-image-store.s3.amazonaws.com/0/100271/0bb93815-ad53-e473-0953-280659d5f407.png)
青ペンの丸のボタンを押すとカラースキームを複製することができるので、Solarized(Dark)を複製して「Solarized Dark Fixed」とかにします。
赤ペンのボタンを押すとそのカラースキームの編集タブが開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/100271/512300d6-fe33-fda4-ca92-cf8247a7ea05.png)
精査するには数が多すぎるので検索します。

- C# 演算子は　Text Editor -> Operator -> Foregroundで字の色を変えられます。僕は FF839496にしています。
- Breakpointとかのバーは Text Editor -> Indicator Margin -> Background で変えられます。僕はFFA2A4A5にしています。
Swift on Linux

# Swift on Linux

Linux 版の Swift2.2 がリリースされているので、それらを試食してみる。

[Welcome to Swift.org](https://swift.org/)


## インストール

* [Ubuntu 14.04 にインストール。](https://swift.org/getting-started/#installing-swift)
* [Snapshot 版をインストールする場合は証明書のインストールが必要そう](https://swift.org/download/#using-downloads)

Linux の場合、tarball を取得して、そのまま展開、パスの設定だけすれば、REPLが利用可能になる。

## サンプルコード

衝撃受けたのが、OS X 版と Linux 版とではコードの書き方が異なること。どうも Linux 名版の Swift は iOS、OS X のアプリケーションを記述する為の言語ではない模様。

import 文から、違うものを読み込んでる。まー仕方ないのかな。。。
**On OS X**

```
1> import Darwin
2> arc4random_uniform(10)
$R0: UInt32 = 4
```

**On Linux**

```
1> import Glibc
2> random() % 10
$R0: Int32 = 4
```

今日はここまで。。。また、明日。
namedtupleのドキュメントをsphinxで作成するためのdocstringの書き方

主題を達成する方法の模索。


# やりたいこと
`namedtuple`のドキュメントをdocstringから作成したい。

```python:sample.py
NamedTuple = namedtuple("NamedTuple", "aaa bbb ccc")
```

上記のような`namedtuple`を定義するとき、
docstringをどうやって書けばいいのかという課題。


# 試行その1
前述の`NamedTuple`を、そのまま`autoclass`を使い`sphinx`でドキュメントを`make`するとどうなるか。

```rst
.. autoclass:: simplesqlite.sample.NamedTuple
    :members:
    :undoc-members:
```

以下のようになった。
メンバが表示されるが、メンバの説明が自動出力されるもののみだと情報量が無い。

![ss_0.png](https://qiita-image-store.s3.amazonaws.com/0/107537/0608da07-0c7f-fe5e-db47-6f0d16c1bef6.png)


# 試行その2
同じ課題を抱えている人がいた。

Adding docstrings to namedtuples in Python? - Stack Overflow
http://stackoverflow.com/questions/1606436/adding-docstrings-to-namedtuples-in-python

複数のやり方が回答されている。
`namedtuple`を継承したクラスを定義して、クラスにdocstringを書く方法をやってみる。

```python
class NamedTupleWithDocstring1(namedtuple("NamedTuple", "aaa bbb ccc")):
    """
    hogehoge
    """
```

これを`sphinx`で`make`すると

![ss_1.png](https://qiita-image-store.s3.amazonaws.com/0/107537/e868fabd-66f6-ff11-842d-47de91034c3d.png)

これにメンバの説明を追記すれば良さそうだ。


# 最終

```python
class NamedTupleWithDocstring2(namedtuple("NamedTuple", "aaa bbb ccc")):
    """
    hogehoge

    .. py:attribute:: aaa

        Description of the ``aaa``.

    .. py:attribute:: bbb

        Description of the ``bbb``.

    .. py:attribute:: ccc

        Description of the ``ccc``.
    """
```

![ss_2.png](https://qiita-image-store.s3.amazonaws.com/0/107537/259cd2f9-68f8-63af-2a8b-cf9a6d56774d.png)
npm version, preversion, postversionの使い分け

[**npm-version**](https://docs.npmjs.com/cli/version)（`$ npm version [major|minor|patch|...]`）は「package.jsonのバージョンを上げてGitのコミットとタグを追加する」というコマンドですが、pre/postフックと組み合わせると結構いろいろなことができます。
テスト・ビルド・デプロイを絡めて、新しいバージョンのリリース自動化にも使えます。

[npm-scripts](https://docs.npmjs.com/misc/scripts)のドキュメントだと、"perversion"と"version"の説明がどちらも「パッケージをバージョンアップする前」に実行されるとしか書かれておらず、いまいち使い分けがわからなかったのですが、[npm-version](https://docs.npmjs.com/cli/version)のページには詳細が載っていました。

## 処理の流れ
`$ npm version [major|minor|patch|...]`を実行すると、このような順で処理が走ります。

1. **Gitのワーキングディレクトリがクリーンになってるか確認する**
2. "preversion"のスクリプトを実行する
3. **package.jsonのバージョンを上げる**
4. "version"のスクリプトを実行する
5. **Gitコミット作成＆タグ追加する**
6. "postversion"のスクリプトを実行する

太字（1, 3, 5）が本来の`npm version`の処理で、npm-scriptsに何も定義していなければ1, 3, 5だけが実行されます。"preversion", "version", "postversion"を定義すると、それぞれ2, 4, 6のタイミングでスクリプトが走ります。

特に"version"スクリプトは、**package.json更新の後、コミットの前**に実行されるので、「バージョン番号付きのファイルを出力する」といったビルドタスクは、pre/postフックではなく、"version"に定義する必要があります。
"version"スクリプトは、本来の`npm version`の処理を上書きするわけではありません。

一方、"preversion"はバージョンを上げる前の状態で実行されます。

## サンプル
[公式ドキュメント](https://docs.npmjs.com/cli/version)のサンプルが結構実践的な内容になってました。

```json
"scripts": {
  "preversion": "npm test",
  "version": "npm run build && git add -A dist",
  "postversion": "git push && git push --tags && rm -rf build/temp"
}
```

- ワーキングディレクトリがクリーンじゃないときは、何もしない
- テストが通らなかったら、package.jsonは更新しない
- ビルドは新しいバージョン番号を参照して実行する
- コミットにビルドで生成したファイルも追加する
- 正常に完了したら、リモートにプッシュして一時ファイルを削除する

このように、実行条件や順序が大事なリリース処理も、"preversion", "version", "postversion"のタイミングを理解すると綺麗に定義することができます。

## まとめ
各スクリプトはこのように使い分けるのが良さそうです。

- **preversion**
  - package.jsonを更新する前に完了させたいこと（テストなど）
- **version**
  - 新しいバージョンとして実行し、リリースのコミットに含めたいこと（ビルド、CHANGELOGの生成など）
- **postversion**
  - 正常に完了した後に実行したいこと（リリース、一時ファイル削除など）
Fedora 23で最新nginxのrpmを作成

### 概要
Fedora 23では、nginx 1.8系のパッケージしか提供されていない[^1]ので、RHEL7向けのsrpmをビルドしようという話
23以下でも動くと思うます。

# tl;dr

```shell-session
curl -fsSL https://gist.githubusercontent.com/eru/84fafee9a695aa1e90b3054e02334977/raw/build-nginx-rpm-fedora.sh
# ビルドまで終わるので、後は必要なパッケージを自分でインストールすること。
```

# 解説

### yumか、dnfか

```shell-session
PKGCMD="yum"
if type dnf >/dev/null 2>&1; then
  PKGCMD="dnf"
fi
```

23向けなので、dnfだけでもいいんですが、少しだけ前方互換。

### rootユーザ以外向けにsudo付ける

```shell-session
if [ ${EUID:-${UID}} != 0 ]; then
  PKGCMD="sudo ${PKGCMD}"
fi
```

必要なパッケージインストールする時に、root権限で実行する必要があるので。

### SPECファイルのパスを設定しとく

```shell-session
SPECFILE="${HOME}/rpmbuild/SPECS/nginx.spec"
```

2回以上使う固定値は変数化しておきたい。

### 必要なパッケージのインストール

```shell-session
${PKGCMD} install rpm-build GeoIP-devel gd-devel libxslt-devel openssl-devel pcre-devel perl-ExtUtils-Embed perl-devel zlib-devel gcc make which
```

Docker container上で確認したので、Fedora 23については、これで間違いなく足ります。

### 最新バージョンの検出

```shell-session
NGINX_VERSION=(`curl http://nginx.org/packages/mainline/rhel/7/SRPMS/ | sed -nre 's/<a href="nginx-([0-9\.]+-1)\.el7\.ngx\.src\.rpm">.*/\1/p' | sort -t . -n -k 1,1 -k 2,2 -k 3,3 -r | head -n 1`)
```

srpmが置いてあるページ(Directory index)から、置換して、ソートして、一番新しいのを取得する。
sort時に、バージョン番号分割してソートするのがポイント。

### srpmパッケージのインストール

```shell-session
rpm -ivh http://nginx.org/packages/mainline/rhel/7/SRPMS/nginx-${NGINX_VERSION}.el7.ngx.src.rpm
```

やっぱり最新版だよね！

### SPECファイルの加工

```shell-session
sed -i -e 's/^\(%if 0%{?rhel}  == 7\)$/\1 || 0%{?fedora} >= 18/g' ${SPECFILE}
```

RHEL5, 6, 7と、Suse用のしかないので、RHEL7と同じのを使うようにする

### ビルド

```shell-session
LC_ALL=C rpmbuild -bb ${SPECFILE}
```

`LC_ALL=C`をつけていないかつ、日本語環境の場合、[ココ](https://github.com/nginxjs/nginScript/blob/master/nxt/auto/clang#L24)で、`gcc バージョン 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)`みたいな、期待したい値が返ってくるせいで、コンパイラが取得できなくてビルドに失敗する。

### 後片付け

```shell-session
unset PKGCMD
unset SPECFILE
```

使った変数は消しておく。

[^1]: 執筆時点では、1.8.1
exportで設定した環境変数はログアウトの度に消えるので注意


railsで環境変数を扱うことはしばしばあるが、
exportコマンドで環境変数を設定してもサーバーからログアウトした時点で消えてしまう。
bash_profileやbashrcにexportコマンドを記述しておくことで、起動する度にexportが実行されるので、環境変数が無くなる心配がない。
rake notesがviewファイル(.html.erb)で出てこない時の対処法


modelやcontorollerで

```rb:hogecontroller.rb
#TODO
```

などのようにアノテーションコメントを記述して、ターミナルで

```bash
$ rake notes
```

と叩くと、ソースコードの中の`TODO`と書いた場所を探して、表示してくれます。
modelやcontorollerのファイルでは`#TODO`でコメントアウトすればもちろん問題なく表示されるのですが、`view(html.erb)`で

```rb:hoge.html.erb
<!-- TODO -->
```
のように記述すると、`rake notes`と叩いても検索してくれません。

その時の記述は,

```rb
<% #TODO ここを直す %>
```
のように記述しましょう。

ちなみに他にも下記のようなアノテーションコメントを使用できます。

|キーワード|内容|
|:--|:--|
|TODO|不足している時|
|FIXME|修正するべき箇所|
|OPTIMIZE|最適化するべき箇所|
|HACK|リファクタリングするべき箇所|
|REVIEW|レビューするべき箇所|
リモートサーバ（ubuntu）に docker をインストールしたらサーバと接続できなくなる場合の対応（ネットワークが原因）

# 概要

docker 公式サイトに載っている手順の通りに、リモートサーバ（ubuntu 14.04 LTS） にdocker をインストールしたところ、以下のコマンドを打った直後にリモートサーバと通信できなくなりました。

```
sudo apt-get install docker-engine
```

ssh をしても、リモートデスクトップ接続をしても、接続できません。
クラウドのサーバだと終了ですね。

原因と回避方法について説明します。

# 原因は docker が作成するサブネットとクライアントのIPアドレスが被っていること

docker をインストールする前に、クライアントのIPアドレスを確認します。

リモートサーバに ssh でログインして、接続を確認します。

```
$ netstat -ta
tcp        0    320 リモートサーバのIP:ssh      172.17.ほげ.ほげ:53563      ESTABLISHED
```

docker が作成するサブネットは 172.17.0.0/16 なので、上記のケースだと被っています。そのため、docker daemon を起動するとリモートサーバと通信できなくなります。

# 対応

docker のサブネットの設定を変更すれば良いのですが、apt でインストールすると、デフォルトでは自動で docker が初期設定で起動してしまい、接続が切断されてしまうのですよね。というわけで、自動起動しないように設定します。

docker-engine をインストールする前に、以下の設定を入れて、自動起動を防止します。

以下、root ユーザで実行してください。

```
cat << EOF > /usr/sbin/policy-rc.d
#!/bin/sh  
exit 101
EOF
chmod +x /usr/sbin/policy-rc.d
```

docker-engine をインストールします。

```
apt-get install docker-engine
```

docker daemon が起動しないので、接続が切断されません（嬉）。

docker のサブネットの設定を変更します。

```
echo 'DOCKER_OPTS="--bip=172.100.42.1/16"' >> /etc/default/docker 
```

docker daemon を起動します。

```
service docker start
```

OKです！
AWS CLI の S3コマンド の include オプションには注意が必要

表題通り。  
`include` オプションは、`exclude` オプションに対して適用されるみたいなので、
両方設定しないと上手く動作しません。
※ `exclude` で対象外にしたファイル（オブジェクト）に対して、
　`include` で対象にしたいファイル（オブジェクト）を指定するみたい。

## 例

```
aws s3 rm --region ap-northeast-1 s3://mybucket/ --recursive --exclude "*" --include "empty" --include "*/empty" --dryrun
```

↑のコマンドは、
mybucket 内から empty という名前のファイルを再帰的に削除するという意味で、
それぞれのオプションの意味は、

`--recursive` … 再帰的に実行
`--exclude "*"` … 全てのファイルを対象外に
`--include "empty"` … mybucket 直下の empty ファイルを対象に
`--include "*/empty"` … ディレクトリ以下の empty ファイルを対象に（↑と両方入ります）
`--dryrun` … テスト実行

上記コマンドから `--exclude "*"` がないと `--include` が無視され、
全ファイル（オブジェクト）が削除されるので注意！
Raspberry Pi セットアップマニュアル（備忘録）Part 5

今後の再セットアップやメンテ時に役立つよう、作業記録をマニュアル化したいと思い作成した自分用の備忘録メモ的な記事です。
##**Raspberry Pi セットアップマニュアル（備忘録）Part 5**
#####**〜Samba(SMB)でのファイル共有〜**

これまでターミナルでSSH接続し、そこからさらにコマンドを利用してVNCサーバを立ち上げて画面共有をした。
しかし、ファイルサーバとして簡単にフォルダをマウントして母艦PCとやりとりできるように、Sambaネットワークを設定する。

-----
######使用機種・環境（2016年3月〜4月現在）
```
Raspberry Pi 2 B+
OS:Raspbian Jessie（NOOBS 1.8.0にてインストール）
microSDカード：32GB（class10）
USBキーボードとUSBマウス（インストールおよび初回起動時に必要）
USBメモリ(16GB) （外付けhdd的用途で使用予定）
micro USBケーブルとUSB電源アダプタ
※電源アダプタはスマホ充電用のものとかでOK。あるいはPCのUSB端子でもいける。

母艦PC／Mac mini (Late2012)
OS:OS X El Capitan 10.11.3
```
-----

#####**sambaのインストールと設定**

>まずは今まで通り、母艦MacのターミナルからSSH接続する。

```
~ (user名)$ ssh pi@192.168.1.210
pi@192.168.1.210 password:
```

>samba のインストール

```
pi@raspberrypi:~ $ sudo apt-get install samba
```

>smb.conf設定ファイルを編集

```
pi@raspberrypi:~ $ sudo nano /etc/samba/smb.conf
```

```
（略）
#======================= Global Settings =======================

[global]

## Browsing/Identification ###

# Change this to the workgroup/NT-domain name your Samba server will part of
   workgroup = WORKGROUP <<-- 母艦PCと同じワークグループ名か確認。もし違ってたら書き直す。

（略）
####### Authentication #######

（略）
# This option controls how unsuccessful authentication attempts are mapped
# to anonymous connections
#   map to guest = bad user <<-- ゲストユーザを無効にする場合はこの行の先頭に # をつけてコメントアウト。

（略）
#======================= Share Definitions =======================

[homes]
（略）
# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
   read only = no <<-- ホームフォルダの書き込みを許可する場合は yes を no に変更。

（略）
↓ファイル末尾に以下を追加。piユーザでのアクセス許可。

[pi]
path = /home/pi
read only = No
guest ok = No
force user = pi

以上の書き込みが終わったら、キーボード操作　control+o, control+x で nanoエディタ終了。

```

>SMB接続用パスワードの設定

```
pi@raspberrypi:~ $ sudo smbpasswd -a pi
New SMB password:
Retype new SMB password:

※ smbpasswd と ユーザ名 pi の間に -a を付けないとエラーがでてしまうことがある

SMB用にパスワードを作成してもいいし、sshや本体ログイン用のパスワードと統一してもいい。
（自分は後者にしている）

Added user pi. と表示されたらOK

```


>sambaを再起動...だがうまくいかないことがあるので本体ごとrebootしたほうが無難

```
pi@raspberrypi:~ $ sudo reboot
```

---

#####**母艦Macから接続**

_Finderメニューバー > 移動 > サーバへ接続..._
またはキーボードで command+k

サーバアドレス欄に _smb://( Raspberrypi のIPアドレス )_ を入力して「接続」ボタンをクリック。

```
smb://192.168.1.210
```

 「サーバ"192.168.1.210"用の名前をパスワードを入力してください」 とダイアログが出るので、以下を入力。

```
ユーザの種類：登録ユーザ
名前：pi
パスワード：（先ほど設定したパスワード）
```

「"192.168.1.210"上のマウントするボリュームを選択してください」というダイアログが出るので、該当のディレクトリ名を選択して OK ボタンをクリック。
（現在は pi のみ。他に設定していれば複数表示されるので、マウントしたいディレクトリを選択する）

![pi_mount.png](https://qiita-image-store.s3.amazonaws.com/0/115994/a04cf73d-8616-dbf4-9909-7c7991161678.png)

このようにデスクトップにアイコンが表示されればOK。
MacのFinder上でファイルを開いたりドラッグ＆ドロップで直接ディスク上にファイルのやりとりができるようになる。


今回は以上。
ec2で運用中のWordPressをKUSANAGIにしたらびっくりするくらい早くなった話


## 始めに
ec2上でWordPressを運用しています。最近アクセスが増えまして、t2系ですので[負荷の制限にかかって重くなってしまうこと](https://aws.amazon.com/jp/ec2/instance-types/)が多々ありました。


クラウドの良い所であるスケーラビリティがあまり活かせず、単純にインスタンス上げるだけだとお金だけかかってコスパが悪かったです。
「改善の為にKUSANAGI良いらしいよ」と聞いたので乗り換えることにしまして、その作業ログです。

何か間違いなどがあれば、指摘して頂ければと思います。

## 結果
ec2のデフォルトのモニタリングでのCPU使用率が __30%__ から __3%__ になりました！！

## KUSANAGIとは
> プライム・ストラテジー株式会社が開発、構成するWordPressを高速に動作させるための仮想マシンおよびそのイメージです。WordPressの実行時間3ミリ秒台、秒間1000リクエストをページキャッシュ非使用で実現する世界最高速クラスのWordPress実行環境です。

[https://kusanagi.tokyo/about/](https://kusanagi.tokyo/about/)


## 作業ログ
### 1.awsでec2を立ち上げます
[オフィシャル](https://kusanagi.tokyo/cloud/kusanagi-for-aws/)の言ってる通りにKUSANAGI for AWSを使いつつ立ち上げましょう。
ストレージサイズ・セキュリティグループ等は既存のec2を参考に設定してください。
ここで注意点ですが、sshの際のuser名はec2-userではなく __centos__ です！

ここで立ち上げたものを __kusanagi.example.com__ としましょう。既存のサーバーは __wp.example.com__ とします。

### 2. wp.example.comのファイルをkusanagi.example.comに移行する
まず、wp.example.com から kusanagi.example.com にscpできるようにします。
wp.example.com でssh keyを作っていない場合は `$ ssh-keygen -t rsa` など行って、それでできたpublic keyを kusanagi.example.com の `~/.ssh/authorized_keys`に貼り付けます。

無事に2つのサーバーがsshで繋げられるようになったら、移行予定のファイルをzipしましょう。
`$ zip -r wordpress.zip /var/www/wordpress/`

zipが完了しましたらscpでwp.example.comからkusanagi.example.com へファイルをコピーします
`$ scp wordpress.zip centos@kusanagi.carnny.com:~/`

これでファイルの移行が完了です。

### 3. kusanagi.example.comでWordPressの起動準備をする

kusanagiを使ってのもろもろのインストールがあります。[オフィシャル](https://kusanagi.tokyo/cloud/kusanagi-for-aws/)に従って進めてください。
kusanagiの準備が完了したら、あとは届いたファイルをunzipして通常通りwordpressの起動準備をしてください。

## 参考
[オフィシャル](https://kusanagi.tokyo/cloud/kusanagi-for-aws/)
括弧の山と戦ってみた：ダイクストラ法って何だよ，分かんねぇよ。

#1. この記事で学べること・学べないこと
学べること

- 何もない。

#2. 実際のコード
　ダイクストラ法というものを理解しようと書いてみたけれど，分からな過ぎて投げた。
　自分があとから見返して，笑える日が来るように貼るだけ貼っておく。

```lisp:dijkstra.lisp
(defparameter *nodes* '(tokyo takasaki nagano nagoya niigata hukui kyoto))
(defparameter *edges* '((tokyo takasaki 110) (takasaki tokyo 110) (tokyo nagano 230) (nagano tokyo 230) (tokyo nagoya 350) (nagoya tokyo 350) (takasaki nagano 130) (nagano takasaki 130) (nagano nagoya 280) (nagoya nagano 280) (takasaki niigata 210) (niigata takasaki 210) (nagano hukui 330) (hukui nagano 330) (nagoya kyoto 160) (kyoto nagoya 160) (niigata hukui 250) (hukui niigata 250) (hukui kyoto 190) (kyoto hukui 190)))

(defun edges-from (node edges)
  (labels ((start-with-p (edge)
	 (eq (car edge) node)))
   (remove-if-not #'start-with-p edges)))

(defun edge-length (edge)
  (cadr edge))

(defun adjacent-edges (nodes edges)
  (let ((ret '()))
	(mapc (lambda (node)
			(mapc (lambda (edge)
					(push edge ret))
				  (edges-from node edges)))
		  nodes)
	ret))

(defun remove-visited-edges (visited-edges edges)
  (let ((not-visited '()))
	(mapc (lambda (edge)
			(labels ((visited-p (edge visited-edges)
								(member edge visited-edges :test #'equal)))
			  (if (visited-p edge visited-edges)
				t
				(push edge not-visited))))
		  edges)
	not-visited))

(defun equivalent-edge (edge)
  `(,(cadr edge) ,(car edge) ,(caddr edge)))

(defun shortest-edge (edges)
  (let ((shortest (car edges)))
	(mapc (lambda (edge)
			(if (< (caddr edge) (caddr shortest))
			  (setf shortest edge)
			  t))
		  edges)
	shortest))

(defun visited-nodes (visited-edges)
  (let ((nodes (mapcar (lambda (edge)
						 (car edge))
					   visited-edges)))
	(remove-duplicates nodes)))

(defun dijkstra (start-node nodes edges)
  (labels ((main (visited-nodes visited-edges)
				 (let* ((not-visited-edges (remove-visited-edges
											 visited-edges 
											 (adjacent-edges visited-nodes edges)))
					   (shortest (shortest-edge not-visited-edges)))
				   (push shortest visited-edges)
				   (push (equivalent-edge shortest) visited-edges)
				   (push (cadr shortest) visited-nodes)
				   shortest)
				 (if (equal nodes visited-nodes)
				   visited-edges
				   (main visited-nodes visited-edges))))
		   (main start-node nil)))

(princ (dijkstra '(tokyo) *nodes* *edges*))
```

# 3. 雑感
　今度はPythonとかでやってみる。
APK で使われている OpenSSL のバージョンを確認する

結構前に出したアプリに対してグーグル先生から警告メールが来た。
**Google Play warning: You are using a vulnerable version of OpenSSL**
ざっくり翻訳すると「あなたのアプリで使用されている OpenSSL のバージョンが古いから新しくしてくれ」という内容。
Adobe AIR を使用していたアプリだが、結構前のものなので完全に忘れていた。
まぁ普通に AIR のバージョンを上げればよさそうだが、今後何かで役に立つかもしれないので、今かき出されている APK で使われてる OpenSSL のバージョンがいくつだったのかを確認しておこうと思う。

メールにはやり方が書いてあった。さすがグーグル先生。

```
$ unzip -p YourApp.apk | strings | grep "OpenSSL"
```

なるほど。でも **Windows 環境**です先生。おとなしく Sygwin とか入れればいいけどめんどくさい。
ってことで、Windows 環境で Sygwin とか入れるのがめんどくさい人のためのやり方。


1. APK は普通に ZIP 解凍できるので解凍する
1. コマンドプロンプトで解凍したディレクトリに移動する
1. 以下のコマンドを実行する

```
findstr /S OpenSSL *.so > result.txt
```

メールに書いてあったこととやっていることはあまり変わらないはず。
それで出来た result.txt の中身をテキストエディタでチェックすれば OpenSSL のバージョンがどこかにあると思う。（無かったら *.so を *.* とかにしたら出てくるかも）
その後 Adobe AIR のバージョンを上げた後、同じ方法で OpenSSL のバージョンを確認したら 1.0.2f になっていたので多分大丈夫なはず。

こうした方が分かりやすいとかあったら教えてください。