OmniAICreator/Qiita-1.07M huggingface dataset:
Chromebookで使えるテキストエディタ

# はじめに
Chromebookを開発で使いたい気持ちもあるけど、ディベロッパーモードで使うほどでもない。でも、たまにテキストエディタでいろいろ書きたいこともあるので、少し調べて試してみた。ちなみに、自分はEmacsユーザー。Emacsキーバインド好き。たまにAtomも使う。

# Text (デフォルトのテキストエディタ)
色つけてくれる。JavaScriptも色つけてくれそう。
ちょっと読むくらいなら使えそう。
![Desktop screenshot (2).png](https://qiita-image-store.s3.amazonaws.com/0/184221/7dbd56a0-11dd-eb7a-b5e2-12f6a3ecb2f8.png)
ちなみに、ローカルのHTMLファイルもブラウザで見れる。
![Desktop screenshot (3).png](https://qiita-image-store.s3.amazonaws.com/0/184221/7b4de384-daae-467b-55a9-2ca5be822188.png)

markdownも色つけてくれる。
![Screenshot 2018-03-21 at 23.10.45.png](https://qiita-image-store.s3.amazonaws.com/0/184221/6abcebe8-2bfc-c3e1-274e-2391bc1d9073.png)

# Caret
ChromeOSのテキストエディタ。結構人気みたい。設定もいじれる。
[Caret - Chrome ウェブストア](https://chrome.google.com/webstore/detail/caret/fljalecfjciodhpcledpamjachpmelml)

[Caret - Professional Text Editing for Chrome and Chrome OS](http://thomaswilburn.net/caret/)

![Desktop screenshot (4).png](https://qiita-image-store.s3.amazonaws.com/0/184221/b1e0c4f0-a024-dd88-4ed2-e8b53c31ed27.png)

日本語切り替え用のCtrl+Spaceのキーバインドが上書きされちゃうけど、設定で変えれる。
![Desktop screenshot (5).png](https://qiita-image-store.s3.amazonaws.com/0/184221/e6fd667b-29cb-a15b-6c35-2d9ce4334863.png)

markdownも色つけてくれる。
![Screenshot 2018-03-21 at 23.10.57.png](https://qiita-image-store.s3.amazonaws.com/0/184221/2e856cba-a499-522d-d7f2-3b8844792f4b.png)

ちなみに、キャレットは、校正時の挿入記号とか縦棒のカーソルのことをいうらしい。
[キャレットとは - IT用語辞典 Weblio辞書](https://www.weblio.jp/content/%E3%82%AD%E3%83%A3%E3%83%AC%E3%83%83%E3%83%88)

# Caret Mod
日本人が作ってる。
完全じゃないけど、Emacsキーバインド使える。すばらしい。
なぜか、デフォルトだとアニメのキャラクターがずっと右下にいる。消せるけど。
Windows上のchromeだと、動かなかった。

[Caret Mod - Chrome ウェブストア](https://chrome.google.com/webstore/detail/caret-mod/gabonaaippccpnmchaejchebibdoipfp)
![Screenshot 2018-03-22 at 22.58.25.png](https://qiita-image-store.s3.amazonaws.com/0/184221/31726efc-b7d3-1b9b-734a-00956bde6d53.png)


# まとめ
しばらく、Caret ModかCaret使ってみよっと。
Java 10 で変わる Java のバージョン表記

（この記事は [地平線に行く](http://d.hatena.ne.jp/chiheisen/20180321/1521641625) とのマルチポストです）

Java は、バージョン 10 以降タイムベースリリースに変わりました。
それに合わせて、バージョン表記がまた変わったので概要をまとめました。[^1]

[^1]: とはいえ、Java 9 とほぼ一緒

詳細は [JEP 322: Time-Based Release Versioning](http://openjdk.java.net/jeps/322) を参照。

## バージョン番号

`$FEATURE.$INTERIM.$UPDATE.$PATCH` という4つの表記になります。
具体的には、 `10.0.1.2` のような表記です。
（Java 8 までの Update ～ という表記はなくなりました）

| |意味|タイミング|次回予定|内容 |
|:---|:---|:---|:---|:---|
|`$FEATURE`|機能リリース|半年ごと|2018年3月|内容にかかわらず半年ごとにリリース<br/>機能追加や互換性のない変更、機能の削除[^del]を含む|
|`$INTERIM`|中間リリース|予定なし|-|互換性のあるバグ修正と機能強化[^enhancements]<br/>（標準APIの変更を含まない）|
|`$UPDATE`|アップデートリリース|機能リリースの1ヶ月後、およびそれ以降3ヶ月ごと|2018年4月<br/>2018年7月|セキュリティの修正<br/>最新機能のバグ修正|
|`$PATCH`|パッチリリース|必要時のみ|-|重大な問題を解決するための最低限の修正|

[^del]: この場合、少なくとも1つ前の機能リリースで予告されます。
[^enhancements]: JDK1.4.1, JDK1.4.2 のようなケースを想定しているそうです。

## 細かいルール

- ある桁以降がすべて 0 なら、省略して表記する
    - 例: 11.0.0.0 → 11
    - 例: 11.0.2.0 → 11.0.2
- `$FEATURE`, `$INTERIM` がインクリメントされた場合、それ以降の数字はリセットする
    - 例: 11.0.2 → 11.0.2.1 → 11.1 → 11.1.1
- バージョン番号以降には、以下を付与する
    - プレリリース識別子（optional）
        - 例: 11.0.2-ea
    - ビルド番号
        - 例: 11.0.2+13
    - LTS などのオプション情報（optional）
        - 例: 11.0.2+13-LTS


## プログラム上での取得

これらは、[Runtime.Version](https://docs.oracle.com/javase/10/docs/api/java/lang/Runtime.Version.html) クラスの各メソッドで取得できます。

```
jshell> Runtime.version().feature()
$1 ==> 10

jshell> Runtime.version().interim()
$2 ==> 0

jshell> Runtime.version().update()
$3 ==> 0

jshell> Runtime.version().patch()
$4 ==> 0

jshell> Runtime.version().pre()
$6 ==> Optional.empty

jshell> Runtime.version().build()
$5 ==> Optional[46]

jshell> Runtime.version().toString()
$7 ==> "10+46"
```

あるバージョンよりも新しいか？古いか？を確認するなら、上記で一つづつ比較するよりも `compareTo` メソッドで比較したほうが確実です。

```
jshell> Runtime.version().toString()
$1 ==> "10+46"

jshell> Runtime.version().compareTo(Runtime.Version.parse("10.0.1")) > 0
$2 ==> false

jshell> Runtime.version().compareTo(Runtime.Version.parse("9.0.1")) > 0
$3 ==> true
```

ただ、 `Runtime.Version` は Java 9 で追加されたクラスです。
もし、Java 8 以前にも対応する必要があるならば、システムプロパティ `java.version` から取得するしかないのでご注意ください。

```
jshell> System.getProperty("java.version")
$4 ==> "10"
```

## ちなみに

「リリース日[^3]」「ベンダーバージョン」がシステムプロパティに追加されました。
Oracle JDK の場合、ベンダーバージョンは当初予定されていた `リリース年.リリース月` という表記のままのようです。

[^3]: 正確には GA の日付。なので、Eary Access 版だと未来の日付になります。

```
jshell> System.getProperty("java.version.date")
$1 ==> "2018-03-20"

jshell> System.getProperty("java.vendor.version")
$2 ==> "18.3"
```
[Ruby]defについて

#defを使うとメソッドが作れる
「こんにちわー」と表示する、helloメソッドを作るとするなら

```
def hello
    puts "こんにちわー"
end

hello         #←helloメソッドを呼び出している
```

通常、プログラムを実行させると上から順に実行されますが、 def と end の間はメソッドの定義なので呼び飛ばされます。最初にhelloメソッドが実行されて、def　と　end　の間の処理が行われて「こんにちわー」が表示されます。
小ネタ・覚え書き

#前書き
完全に個人的な覚書。雑記。
「こんなことはおそらく周知の事実」というようなことも追加していく

##配列の宣言で変数が使える

```cpp:ijk_in_data

int i = 5,
    j = 3,
    k = 2;

int data[] = {i,j,k};
```

dataの中身は`{5,3,2}`となる。
宣言された後は、i j k とは無関係なので、上の宣言に続けて

```cpp:change_i
i=1;
printf("%d",data[0]);
```

としたら、出力されるのは1でなく5。

### 「参照値渡し」とか絡めながら補足
C(++),Java,C#では、基本的に変数は、中に入っている「値」を渡すようにしている。
プリミティブ型だとか値型だとか基本データ型だとか言われるものは、指定しない限り「値渡し」で考える。

「参照型変数」とか、「ポインタ」とか(これらふたつは別のもの)は「参照値」を「値渡し」する場合もある。
この場合、渡された参照値を上書きしない限りにおいて、参照先のデータにアクセスできる。

上書きした場合には、別のデータを参照することになる。
「ガベージコレクション」等と呼ばれる機能を有していない言語においては、メモリリークの原因となるので、
確実にメモリの解放をするように注意する必要がある。

「参照渡し」を行う場合では、値型でも参照型でも関係なく、該当する値の動向に気を配る必要がある。
一方で、より厳密なシングルトンを表現できるので、欠点ばかりとはいえないかな、とも思う。
詳細は別述するかもしれないし、しないかもしれない。

Javaでは参照渡しをサポートしていないので、厳密なシングルトンの作成は（多分）できない。

<details><summary>javaシングルトンについて</summary><div>
クラス外でオブジェクトを参照する変数を持ったまま、新しくインスタンスを生成するような動作を行った場合に、
以前作成したオブジェクトを確実に排除する手立てがない（多分）ため

...一応ほんとに作れないか、軽く調べた
[JavaのSingleton実装方法５つとメリットデメリット使用場面とかいろいろ書いてみる](https://qiita.com/Munchkin/items/b7a90dd2c262e5ee0ada)
「リフレクションでアクセス可能」がちょっとよくわかんないけど
（リフレクションを使えばクラスのメンバをのぞき見できるそうな）
enumを使わないと厳密につくるのはムリよーってことらしい。
(enumで作ってるのキモいキモいって言ってるけど、本当にキモいな...)
</div></details>

##戻り値を「参照で返す」機能を使った、多分厳密なシングルトンの作成例
一応他の人が記事にしてるのもあります。
[デザインパターン・Singleton(シングルトン)パターンの実装](http://hobbydevelop.info/design-pattern-singleton)

一応こちら、見ないで思いついたものです。
僕はぺぇぺぇなので、間違えてる可能性が限りなく100%なので、上記とかも見ようね。

```cs:C#で
class Singleton{
  private static Singleton InstanceHolder = null; // インスタンスを保持する

  public static ref Singleton getInstance(){
    if( InstanceHolder == null){           // インスタンスが未生成の場合のみ生成
      InstanceHolder = new Singleton();
    }
    return ref InstanceHolder;             // インスタンスを参照で(refで)返す
  }

  private Singleton(){ /* 生成時処理 */ }   // コンストラクタはprivate
}
```

ライブラリにある抽象クラスを継承して作るときに、
staticにしたかったんだけど、許されなかった(実態のあるなし考えたら当然)ので
仕方なくなんちゃってSingletonもどきにしたときは、
「同時には存在しないけど別のインスタンスを後から生成する可能性があった」ので、

```cs:
public static ref Singleton renewInstance(){
  InstanceHolder = new Singleton();
  return ref InstanceHolder;
}
```

とか作って、getInstanceメソッドにはご退場願った

# Oracle

## 登録しているストアドの内容を全出力する

```sql
SELECT REPLACE(REPLACE(TEXT, CHR(10)), CHR(9), '    ')
FROM USER_SOURCE
WHERE SUBSTR(REPLACE(TRIM(TEXT), CHR(9)), 1, 2) <> '--'
  AND LENGTH(TRIM(TEXT)) <> 1
ORDER BY TYPE
       , NAME
       , LINE
;
```

`CHR(9)`: タブ文字
`CHR(10)`: 改行文字
`LENGTH(TRIM(TEXT)) <> 1` : 改行うざい死すべし
`SUBSTR(REPLACE(TRIM(TEXT), CHR(9)), 1, 2) <> '--'`: どうせしょうもないコメント死すべし
`ORDER BY TYPE`: PACAKGEとPACKGE BODY で同じNAME(関数名他)なのでキーに必要

上記で出せば1列のタブなしになるので、TSV的に取り出せばそのまま.sqlな感じで読める。
CREATEとかはしないのでExportではない。ので、バックアップとしては良くない。

#記事にするかも？
覚えてて、気が向いたらする
##fseek関数のストリーム指定の引数にstdinを指定したらなんかいけた
Windows7(32bit)のIE11検証用Virtualboxイメージ作成メモ

#経緯
作っていたWEBアプリのIE11動作確認が必要になったため、Virtualbox＋Selenium＋IE11のWebdriverの環境構築を行ったメモ。

書いていたら[ここ](https://3u3.org/968)とほとんど一緒だったから、手抜き気味に:sleeping:

#VMイメージ取得
昔でいう[modern.IEのページ](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)からイメージをダウンロード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81968/3b26b811-1137-8a80-9e6f-5bc3ffc3ec1a.png)

#日本語パック一式取得
[①Windows7の32bit用言語パック](http://download.windowsupdate.com/msdownload/update/software/updt/2011/02/windows6.1-kb2483139-x86-ja-jp_bc46078938ae9129c7ce86a9c176fa517e4c0a3d.exe)をダウンロード

[ここから](https://www.microsoft.com/en-us/download/confirmation.aspx?id=40904)から②IE11の日本語パック（IE11-Windows6.1-LanguagePack-x86-ja-jp.msu）をダウンロード

[参考](https://www.technize.net/windows-7-sp1-language-packs-direct-download-links-kb2483139/)

#インストール
以下の二つをインストール
①Windows7の32bit用言語パック
②IE11の日本語パック

タイムゾーンを変更
```tzutil /s "Tokyo Standard Time"```

地域と言語を設定
```control intl.cpl```
XMLファイルをインポートとして設定できるようだが、XMLファイルのエクスポート機能がなかったので手動で設定。
Powershellの6.0ならコマンドがあるのだが・・・
スクリーンショットが設定後だった・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81968/f91f1f33-b8c6-e59c-f1ef-acd733024aea.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81968/4c8df386-3f8e-4136-ee41-271a4d91010a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81968/2737b418-fc2c-53fe-c74c-bdef32c7c10d.png)

#NodeJSとSeleniumをとってくる
リモートデバッグが楽そうなのでNodesJSの「selenium-webdriver」を利用する。

[Nodejs](https://nodejs.org/ja/download/)をインストール（v7.6以降。今回は8.1をインストール）

適当なフォルダでselenium-webdriverを準備
```npm install selenium-webdriver```

[IEのドライバー](http://selenium-release.storage.googleapis.com/3.9/IEDriverServer_Win32_3.9.0.zip)をダウンロードして展開して同じフォルダに配置する。

#Seleniumのサンプルを実行
2018/03/21時点で「selenium-webdriver」の公式ページに書いてあるサンプルに無駄な「;」があって実行できないので若干修正。
asyncはnodeの7.6以降で標準採用されているので、新しめのnodeを使いましょう。

node app.js

```app.js
const {Builder, By, Key, until} = require('selenium-webdriver');

(async function example() {
  let driver = await new Builder().forBrowser('internet explorer').build();
  try {
    await driver.get('http://www.google.com/ncr');
    await driver.findElement(By.name('q')).sendKeys('webdriver', Key.RETURN);
    await driver.wait(until.titleIs('webdriver - Google Search'), 1000);
  } finally {
    await driver.quit();
  }
})();
```
Windowsで簡単にAI開発の環境構築＜人工知能を体験したい人向け＞

# やりたいこと

- Windows上でAI (ディープラーニング) で株価予測するツールを作りたい
- そのために、開発用のライブラリなどの環境構築をする
- できるだけ簡単にディープラーニングを使えるようにしたい

# 使用する人工知能関係のライブラリ

- Tensor Flow + Keras
- Python
    - Numpy
    - Matplotlib
    - scikit-learn
    - Pandas etc..

# 環境構築

以前は、Windows上でTensor Flowなどを使用するためにはDockerなどの仮想環境が必要でしたが、Anacondaを使用するとWindows上でもかなり簡単に開発環境を構築できます。

詳しくはこちら:
[Windows版AnacondaでTensorFlow環境構築](https://qiita.com/exy81/items/48314b968d9fad6170c8)

### 1. ライブラリのインストール
Anacondaと一緒に大抵のライブラリがインストールされますが、パッケージをすべて最新版にしておくと安心です。
Anaconda Promptから:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80231/01e93abf-e1e1-a729-6d3a-dcc5c7805de9.png)

まずは、Pythonがインストールされているか確認。エラーで出ずに、Pythonの対話モードが起動されたらOK。対話モードを終了するときはExit()で終了します。

```console:Anaconda_Prompt

> python 

```

下記のコマンドでライブラリを最新にできます。

```console:Anaconda_Prompt

> conda update --all

```

### 2. TensorFlowのインストール

まずは、TensorFlowから。下記のコマンドを入れるだけ。かなり簡単にインストールできる

```console:Anaconda_Prompt

> pip install tensorflow

```

正しくインストールされたかの確認。Pythonの対話モードで確認します。

```console:Anaconda_Prompt

> python

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'        # 表示されれば成功

```

### 3. Kerasのインストール

次に、Kerasのインストール。下記のコマンド1行でインストールできる。

```console:Anaconda_Prompt

> conda install keras

```

正しくインストールされたかの確認。Pythonの対話モードで確認します。

```console:Anaconda_Prompt

> python

>>> import keras as ks
UsingTensorFlow backend.      # 表示されれば成功

```

# どのフレームワークを使用するか?

TensorFlowが有名だが、TensorFlowを直接操作して人工知能を体験するのはかなり難しいです。
そこで、TensorFlowのラッパーとしてKerasを使用することがおすすめです。簡単に人工知能のモデルを操作できるので、挫折せずに色々試すことができます。ただ、内部でどういう操作をしているかを含めて調整したい場合は、TensorFlowやほかのフレームワークも検討したほうがいいでしょう。
何れにせよ、入門用にKerasで全体像を理解するというのがおすすめです。


[【ディープラーニングフレームワーク】Chainer, Keras, TensorFlowとfast.aiが選んだPytorch](http://s0sem0y.hatenablog.com/entry/2017/09/25/031200)

[各機械学習ライブラリの比較をまとめる](https://qiita.com/jintaka1989/items/bfcf9cc9b0c2f597d419)

# 参考
TensorFlow + Kerasでまずは人工知能を体験するなら:
[いちばんやさしい ディープラーニング 入門教室](http://amzn.to/2FZPCSI)
Unity の Shader コードだけでカメラのアスペクト比を得る

# 概要
　現在レンダリング中のカメラのアスペクト比を Shader コードだけで完結して得る。 `_ScreenParams` を用いると求める値が得られないシチュエーションが存在するため、代わりの計算手法としてプロジェクション行列の逆行列を用いる。

# 問題
　Unity の [Built-in shader variables](https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html) にアスペクト比を得るための `_ScreenParams.xy` が用意されているが、これはあくまで RenderTarget の解像度であるためカメラのアスペクト比とは一致しない。
　一致しない状況としてたとえば、あるオフスクリーンレンダリング用のカメラにセットされたレンダーテクスチャの解像度は 1024x1024 だが、カメラのアスペクト比自体は 16:9 である、が挙げられる。その疑似コードを以下に示す。

```csharp
// MonoBehaviour

var camera = GetComponent<Camera>(); // オフスクリーンカメラ

camera.targetTexture = new RenderTexture(1024, 1024, 16);  // RenderTarget は 1024x1024

camera.aspect = 16f / 9f; // カメラのアスペクト比は 16:9
```

```c
// ShaderLab HLSL

float aspect = _ScreenParams.x / _ScreenParams.y; // -> 1.0    :(
```

# 手法
　プロジェクション行列の逆行列 `unity_CameraInvProjection` が用意されているため、プロジェクション空間での近平面のもっとも右上の頂点を用意してビュー空間に逆変換する。

```c
// ShaderLab HLSL

// 右上なので (x, y) = (1, 1)
// かつ近平面に存在するので z は DirectX のとき 0, OpenGL のとき -1
// w は nearClip の値
float4 projectionSpaceUpperRight = float4(1, 1, UNITY_NEAR_CLIP_VALUE, _ProjectionParams.y);

// プロジェクション行列の逆行列で変換
float4 viewSpaceUpperRight = mul(unity_CameraInvProjection, projectionSpaceUpperRight);

// 幅 / 高さ でアスペクト比
float aspect = viewSpaceUpperRight.x / viewSpaceUpperRight.y;
```

# まとめ
　プロジェクション行列の性質を利用してアスペクト比を計算した。プロジェクション行列の周りは DirectX や OpenGL の違い、Reversed Z の違いによる環境依存が大きいので、もうちょっと賢い方法があったら教えて欲しい。
[Ruby]ハッシュオブジェクトについて

#ハッシュオブジェクトのデータの持ち方
ハッシュオブジェクトは「データ」と「キー」でデータを管理します。これをキーバリューストアと言います。
#キーについて
キーは「文字列オブジェクト」でも「シンボルオブジェクト」でも良いです。

```
hash1 = {"name" => "hoge"} #文字オブジェクトの書き方
hash2 = {:name => "hoge"}  #シンボルオブジェクトの書き方　その１
hash3 = {name: "hoge"}     #シンボルオブジェクトの書き方　その２


#それぞれの値の取得は

puts hash1["name"]
puts hash2[:name]
puts hash3[:name]

```
#文字オブジェクトとシンボルオブジェクト、どっちがオススメ？
どちらでも良いが「シンボルオブジェクト」の方が実行速度が速いので「シンボルオブジェクト」で書くことをオススメします。
「シンボルオブジェクト」は文字の様に見える数値である。
raspbianへのpulseaudioインストール方法のオレオレマトメ

#経緯
pulseaudioとshairport-syncでMulti-roomなAirPlay環境を作ろうとしたが、頓挫した。
ただ、pulseaudioのインストール方法についてマトメていたので、一応メモ。
そもそもRaspbianのJessie以降だっけ？pulseaudio使わなくなったというのもあり、そもそもイケてないと思われるのであんまり使うことはないんだろうな。。。。

#メモ


pulseaudioいんすとーる

```
sudo apt-get install pulseaudio pulseaudio-module-zeroconf alsa-utils avahi-daemon
```

設定ファイル

```/etc/pulse/default.pa 
load-module module-native-protocol-tcp
load-module module-zeroconf-publish
load-module module-alsa-sink device=hw:1,0
```

とした。
alsa-sinkのhw:1,0の１については、DAC差した後にaplay -lで出てくるデバイスの番号を入れる。
例えば

```
pi$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 6/7
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 0/1
  サブデバイス #0: subdevice #0
```

これでカードが１、デバイスが０なのでhw:1,0となる。
デフォルトのDACだとノイズが凄すぎて話にならない。ただ、alsa単体でデフォルトのDACつかってもノイズは乗らない。pulseaudio以外にalsaを直接つつこうとするやつがいるとそうなるとか記述をどこかで見たが、そうなのかもしれないし、ただ単なるCPUパワーの問題なのかもしれない。謎。
pulseaudioのときは外付けDACを使う、ということだけを覚えておけばOK牧場。

```/etc/pulse/daemon.conf
exit-idle-time = 10800 # 3 hours
log-level = info
```

デーモンとして実行

```
pulseaudio -D
```
ROSとGazeboによる自律移動シミュレーション 〜SLAMの実装〜

# はじめに
■ROSとGazeboによる自律移動シミュレーション
[1.モデル作成](https://qiita.com/Crafty_as_a_Fox/items/1f1db7f4ed042ac300b4)
[2.SLAMアルゴリズムの比較の導入](https://qiita.com/Crafty_as_a_Fox/items/cc3a1e768c390fdc96c9)
3.SLAMの実装　←　今ココ

前回はSLAMアルゴリズムの比較を行いました。なので今回は実際にSLAMを実装してシミュレーションと実機上で動かしてみたいと思います。
今回用いるSLAMライブラリは以下にしようと思います。

| SLAMライブラリ | 採用理由 | 
|:-----------:|:------------|
| Google Cartographer | 前回の比較動画より、マッピングと自己位置推定の精度が良いように感じられたから。また、個人的にGraph-basedアルゴリズムを使ってみたいというのもあります。 |

# 導入環境
 * OS：Ubuntu 16.04
 * ROSバージョン：Kinetic
 * ロボットシミュレータ：Gazebo

# ROSパッケージ
SLAMを実装するに当たり、以下のROSパッケージを作成しました。

 - [SLAM-Robot_Code](https://github.com/takuyani/SLAM-Robot_Code/tree/bb245a756b35f26f859bd1fa3ce9f157f91332d5)

SLAM-Robot_Codeパッケージには以下のサブパッケージが含まれます！

|サブパッケージ|用途|
|:--:|:--:|
| slambot_controller | SLAMロボット実機のコントローラー|
| slambot_description | SLAMロボットモデルの描写 |
| slambot_gazebo | gazeboでのシミュレーション |
| slambot_navigation | ナビゲーション（パス・プランニング等） |
| slambot_sensing | センサ起動 |
| slambot_slam | SLAM実行 |
| slambot_teleop | テレ・オペレーション用<br>(PS4コントローラ、キーボード) |


# 実行方法
デプス・カメラで障害物を認識しつつ、SLAMで自己位置推定しながら障害物を回避する動作をシミュレーションと実機で動かしてみました。

## ①シミュレーションの場合
![1](https://farm5.staticflickr.com/4447/37236781390_2646290337.jpg)

__＜実行手順＞__
以下3つのlaunchを実行する。

```bash
$ roslaunch slambot_gazebo vehicle_controller_sim.launch
```
　→　gazeboシミュレータ起動（車輪制御、デプス・カメラ）

```bash
$ roslaunch slambot_navigation navigation_without_map.launch
```
　→　SLAM起動

```bash
$ roslaunch slambot_navigation user_interface.launch
```
　→　Rviz起動（ユーザーによるゴールの設定が可能）

全てのlaunchを起動すると以下のようなノードグラフとなります。

__＜ノードグラフ＞__
![1](https://c1.staticflickr.com/1/817/27066674358_6732b74315_o.png)

__＜実行結果＞__
（画像をクリックするとYouTubeへジャンプします。）
[![obstacle_avoidance_simu](https://farm5.staticflickr.com/4782/40228978464_fe9c3c07b8.jpg)](https://youtu.be/i-9VPLeamHE)


## ②実機の場合
![1](https://farm1.staticflickr.com/814/39090977590_e4636c4cfb.jpg)

__＜実行手順＞__
以下4つのlaunchを実行する。

```bash
$ roslaunch slambot_controller vehicle_controller_node
```
　→　車体（車輪）制御起動

```bash
$ roslaunch slambot_sensing xtion_pro_live.launch
```
　→　デプス・カメラ起動

```bash
$ roslaunch slambot_navigation navigation_without_map.launch
```
　→　SLAM起動

```bash
$ roslaunch slambot_navigation user_interface.launch
```
　→　Rviz起動（ユーザーによるゴールの設定が可能）

全てのlaunchを起動すると以下のようなノードグラフとなります。

__＜ノードグラフ＞__
![1](https://c1.staticflickr.com/5/4779/39128270360_59924e768e_o.png)

__＜実行結果＞__
（画像をクリックするとYouTubeへジャンプします。）
[![obstacle_avoidance_hw](https://farm1.staticflickr.com/806/40043269195_be75d0b959.jpg)](https://youtu.be/vOMjZb0RXsY)
※動画ではホイールが車体の中心に取り付けられていますが、現在は車体前方に取り付けられています。

# さいごに
いかがでしたでしょうか？
シミュレーション、実機共に見事障害物を避けて目標地点に到達することができました。
今回、SLAMアルゴリズムとしてGoogle Cartographerを用いましたが、次回以降はgmappingや他のアルゴリズムも試してみたいと思います。

余談ですが、私の開発アプローチとしてまずはシミュレーションで狙い通りの動作をすることを確認した後に、実機で動作確認を行ってます。
このアプローチ方法の利点として、不確定要素の多い実機で動作確認するよりモデル上で動作確認した方が不具合の発見が容易になる利点があります。
皆さんも是非お試しください(^^)v
でも、今回作成したモデルのパラメータは結構適当なのであしからず！
この項目のプロパティは利用できません

ある日突然Cドライブのプロパティが見れなくなりました。
Cドライブ→右クリック→プロパティ
「この項目のプロパティは利用できません」のエラーメッセージが表示される。
最終的にはレジストリを弄って解決しました。

実行する前に
<font color="red">HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers</font>
をバックアップすること！

以下のコードをテキストエディタに張り付けて.regファイルに保存して実行すればOK。

```register
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers]
@="{5F5295E0-429F-1069-A2E2-08002B30309D}"

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\Sharing]
@="{f81e9010-6ea4-11ce-a7ff-00aa003ca9f6}"

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{1f2e5c40-9550-11ce-99d2-00aa006e086c}]

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{4a7ded0a-ad25-11d0-98a8-0800361b1103}]

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{55B3A0BD-4D28-42fe-8CFB-FA3EDFF969B8}]

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{5F5295E0-429F-1069-A2E2-08002B30309D}]

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{7988B573-EC89-11cf-9C00-00AA00A14F56}]
@=""

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{ECCDF543-45CC-11CE-B9BF-0080C87CDBA6}]

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{ef43ecfe-2ab9-4632-bf21-58909dd177f0}]
@=""

[HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\{fbeb8a05-beee-4442-804e-409d6c4515e9}]
@=""
```

ここを参考しました。
https://answers.microsoft.com/en-us/windows/forum/windows_10-hardware-winpc/cannot-access-hard-drive-properties-in-windows-10/28d3d187-ef0a-4f5b-83eb-199aacf001f0
ミニゲームを作ってUnityを学ぶ！  [ 3Dマインスイーパー編 - イントロダクション ]

前回[「タンクウォーズ編」](https://qiita.com/YzRoid/items/544426ceffd4283d6977)に続いて第2弾！
今回はもう少しシンプルなお題を選びました。



#Unity初心者の筆者
チュートリアルの[「玉転がし」](https://unity3d.com/jp/learn/tutorials/projects/hajiuni-jp)と[「シューティングゲーム」](https://unity3d.com/jp/learn/tutorials/projects/2d-shooting-game-jp)は完成した！
次はミニゲームを自作してUnityで出来ることを増やしていこう！

そんな経緯がありまして、後学のために開発したゲームっぽい何かの作り方を1から解説していきます。
＊使用言語はC#で解説内容は上記2点のチュートリアルが完了していることを前提としています。



# お題：3Dマインスイーパー
**どんなゲーム？**
おなじみ、かつてはWindowsにプリインストールされていた地雷撤去ゲーム。

正方形のマスが並んだフィールド内でプレイヤーはそのマスを1つ1つ開けていく。
マスは地雷マスと通常マスの2種類があり、地雷マスを開けてしまうとゲームオーバー。
地雷マスを1つも開けずに通常マスを全て開けることができればゲームクリア。

また、通常マスを開けた場合はヒントとして隣接1マス以内にある地雷の数が示される。
プレイヤーはマスを開けるアクションの他に、地雷だと思われるマスにマーカーを付けることができる。

**スクリーンショット**
![unity_sweeper_ss_0.jpg](https://qiita-image-store.s3.amazonaws.com/0/239877/a9fdd5bd-9fb4-7aff-475e-849b184883e6.jpeg)


**完成品をプレイ(PC専用 -- WebGL)**
[こちらから（少し読み込み時間があります）](http://yzroid.jp/unity/csg_unity_sweeper/app/index.html)

難易度を選択したらSTARTボタンを押して開始。

[W/A/S/D] カメラ移動
[左クリック] マスを開ける
[右クリック] マスにマーカーを付ける 



#作り方
[**1. 下準備**](https://qiita.com/YzRoid/items/0ae6783beaee6d2bb840)

[**2. ブロックを作る**](https://qiita.com/YzRoid/items/850bfa0bd972b63fd388)

[**3. フィールドを作る**](https://qiita.com/YzRoid/items/c9611c67ac303d4d925e)

[**4. ブロックを操作する**](https://qiita.com/YzRoid/items/0e0173e7ffbb68a49c5f)

[**5. ゲームの進行**](https://qiita.com/YzRoid/items/cfd6caca066757e3e3ff)

[**6. 機能の追加**](https://qiita.com/YzRoid/items/35fec02289e65a899fb8)



#スクリプト
[3Dマインスイーパーのスクリプト（GitHub）](https://github.com/YzRoid/UnitySweeper3D)

上記リンクより今回のスクリプトをダウンロードすることができます。
記事内ではどうしてもコードが飛び飛びになってしまって全体像が掴みずらいため、解説がわかりにくい場合なんかはこちらを見たら解決するかもしれません。

尚、こちらのコードは今回の解説用に書き直したモノではなく実際のWebGLアプリに実装されているコードのため、コメントアウトされた未使用のメソッドがあったり、そもそものメソッド名・フィールド名が異なる場合があるかもしれません。
その場合は記事の内容を優先してください。

<Br><Br>
【初学者向け】Python 基礎3  pipによるサードパーティーモジュールのインストール方法

#これまで

[・【初学者向け】Python 基礎1 関数定義と呼び出し](https://qiita.com/ryo_xsjsj/items/c0b64f3679da9d168aaa)
[・【初学者向け】Python 基礎2  ブロックとfor文if文](https://qiita.com/ryo_xsjsj/items/a9eda646bd5e2379d41f)

間違いやもっと良い方法などありましたらご指摘頂けると嬉しいです。

▽環境
Python 3.6.4

#pip
Pythonで例えばエクセルを読み込んだり書き込んだりするためにはデフォルトのモジュールだけでは足りず、「openpyxl」というモジュールをインストールする必要があります。（importして使う）

pipを使えば簡単にモジュールのインストールができます。

###pip自体が入っているか確認

```:コマンドプロンプト
C:\>py -m pip --version
pip 9.0.2 from C:\Python\Python36\lib\site-packages (python 3.6)
```
Python導入時に自動的に入っているようです。

###openpyxlのインストール

```:コマンドプロンプト
C:\>pip install openpyxl

  ～
   100% |████████████████████████████████| 1.4MB 546kB/s
  ～こんな感じでインストールされる
```

**※プロキシ設定されているとpip時にエラーが出る場合がある**
５回ほどRetry後、こんなエラー

```
Could not find a version that satisfies the requirement
```
業務で使いたいのに会社でツールが作れない；

その場合は↓の３つのtar.gzをダウンロードしてsetup.pyでinstallすればOK

・[openpyxl](https://pypi.python.org/pypi/openpyxl)
・[jdcal](https://pypi.python.org/pypi/jdcal)
・[ex_xmlfile](https://pypi.python.org/pypi/et_xmlfile)

```
python setup.py install
```

#openpyxl
>階層
lib/
 └ site-packages/
　　└ openpyxl/
Juniperに保存したPKI関連のデータを全部クリアする

JuniperでPKIの設定をしていて証明書や認証局まわりを一度全部やり直したくなった場合のクリア方法。

```
clear security pki crl all 
clear security pki local-certificate all 
clear security pki certificate-request all 
clear security pki ca-certificate all 
clear security pki key-pair all
restart pki-service
```

上記コマンドで、Juniperに保存されていたキーペアやCAの情報は消えるが、configはそのまま残るので要注意。

## 参考

[PKI - Error: Local Certificate doesn't exist](https://forums.juniper.net/t5/Routing/PKI-Error-Local-Certificate-doesn-t-exist/td-p/296961)
ubuntu16.04にＧｒａｄｌｅを入れてHelloWorldをビルドしてみた。


Groovyで書けるビルドツールというのが魅力的で使ってみたくなったのでメモ。

##環境##
<dl>
<dt>OS</dt>
<dd>ubuntu 16.04LTS</dd>
<dt>Gradle</dt>
<dd>Gradle 4.6</dd>
<dt>JAVA</dt>
<dd>OpenJDK 1.8.0</dd>
</dl>

##準備##

###1.Gradleインストール###

```terminal:Console
//Gradleが公式レポジトリにあるか確認
$ apt search gradle

//インストールを開始する
$ sudo apt install gradle

//インストールできたか確認
$ gradle

//こんな感じになってればＯＫ
Task :help 

Welcome to Gradle 4.6.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

For troubleshooting, visit https://help.gradle.org

```

###2.プロジェクトの作成###
こんな感じのシンプルなプロジェクトを作る。

```
└── src
    └── main
        └── java
            └── hello
```

```tesrminal:Console
$ mkdir -p src/main/java/hello
```

javaのプログラムを作る。




```java:src/main/java/hello/HelloWorld.java
package hello;

import org.joda.time.LocalTime;

public class HelloWorld {
  public static void main(String[] args) {
    LocalTime currentTime = new LocalTime();
    System.out.println("The current local time is: " + currentTime);

    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}
```



```java:src/main/java/hello/Greeter.java
package hello;

public class Greeter {
  public String sayHello() {
    return "Hello world!";
  }
}
```

##Gradleのタスクの実行##
###ビルドファイルの準備###
タスクの実行には<strong> build.gradle </strong>というファイルを作業ディレクトリに配置して、依存関係などを書きます。このプロジェクトでは<strong> joda.time </strong>というライブラリが必要です。

以下のように書きます。

```gradle:build.gradle
apply plugin: 'java'

//以下の２行のように書くことで、Gradleからコードを実行できるようになる。
apply plugin: 'application'
mainClassName = 'hello.HelloWorld'

// MavenCentralというレポジトリから依存関係にあるファイルを取ってくるように設定。
repositories {
    mavenCentral()
}

// ビルドされるjarファイルの名前を指定できます。
jar {
    baseName = 'gs-gradle'
    version =  '0.1.0'
}

//依存関係にあるライブラリを列挙します。
dependencies {
    compile "joda-time:joda-time:2.2"
    testCompile "junit:junit:4.12"
}
```
また、以下のようにどのタイミングで参照されるべきなのかを指定できるみたいです。

| compile |  testCompile |  providedCompile |
|:-----------------:|:------------------:|:------------------:|
|    コンパイル時と実行時に必要なライブラリ   |   テスト時のコンパイルにのみ必要なライブラリ    |  コンパイル時は必要だが、実行時はコンテナによって提供されるライブラリ      |


###実行###

作業ディレクトリに移動し、以下のコマンドを実行します。

```terminal:Console
$ gradle build
```

これでjarファイルが作成されたはずです。実行してみましょう！！。

```terminal:Console
$ gradle run

> Task :run 
The current local time is: 22:16:19.473
Hello world!

```

####ラッパークラスを使う場合####
ラッパークラスをプロジェクトに配置することで、どの環境でも同一のコマンドでビルドが実行できるようになります。

```terminal:Console
//ラッパークラスを配置する
$  gradle wrapper --gradle-version 4.6

//ビルドする。./を忘れないように。。。
$ ./gradlew build

//実行する。
$ ./gradlew run 
```

##感想##
楽しかった。

参考
https://spring.io/guides/gs/gradle/
ローカル -> docker-compose の移行でmysqlがコケた話


# はじめに

Macのローカルに構築していたMysqlへの接続をやめて、
dockerのMysqlコンテナを使用する修正を実施しました。
接続元はJavaのSpringDataJPA(Hibernate)からです。
WebApplication立ち上がった後に、Select文を１回発行すると落ちてしまいました。
※ たちあがる前のDBMigration(Flyway)は異常終了等はしていませんでした。

# 色々修正した後のdocker-compose.yml

```yaml:docker-compose.yml
services:
  mysql:
    image: mysql:5.7.21
    container_name: mysql
    ports:
      - 3306:3306
    volumes:
      - ./mysql/init:/docker-entrypoint-initdb.d
      - ./mysql/conf/:/etc/mysql/conf.d
    networks:
      - sonarnet
    environment:
      MYSQL_ROOT_PASSWORD: root
    restart: always
```

```text:./mysql/conf/custom.cnf
[mysqld]
character-set-server=utf8
lower_case_table_names=1
explicit_defaults_for_timestamp=true
```

# 原因と対応内容

[9.2.2 識別子の大文字と小文字の区別](https://dev.mysql.com/doc/refman/5.6/ja/identifier-case-sensitivity.html)


上記リファレンスによると、下記の挙動をとるようです。

|OS|大文字と小文字|
|:--|:--|
|OSX|区別されない|
|Unix|区別される|


ターミナルからMysqlコンテナにログインし、テーブル検索したところ、たしかに大文字小文字の区別をしていました。
取り急ぎの処置として、`lower_case_table_names=1`にて対処しました。

[サンプル・コード](https://github.com/mabubu0203/ItemControl)
【Ansibleで警告対処】[DEPRECATION WARNING]: [defaults]hostfile option, The key is misleading as it can also be a list of hosts, a directory or a list of paths【ansible ver.2.4.3.0】

## 概要

Ansibleを実行した際、以下のような警告が出力された場合の原因と対策。

```
[DEPRECATION WARNING]: [defaults]hostfile option, The key is misleading as it can also be a list of hosts, a directory or a list of paths . This feature
will be removed in version 2.8. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
```

## 原因

`ansible.cfg` に非推奨となっている `hostfile` というオプションを設定していることが原因。

設定例：

```
hostfile = ./hosts
```

※インベントリーファイルを指定する（デフォルトの/etc/ansible/hosts以外のインベントリーファイルを使う）際のオプション

出力の通り、 `Ansible version 2.8` では廃止されるオプションなので使うべきではない。

## 対策

`hostfile` ではなく、 `inventory` を使う。

設定例：

```
inventory = ./hosts
```

これで警告が出なくなる。

## 検証環境

ansibleのバージョン2.4.3.0で検証した。
この事象はバージョン1.9以降で発生する。

```
$ ansible --version
ansible 2.4.3.0
```
ChainerRL を使って atari のゲームの学習を Colaboratory 上でする

# TL;DR

* Colaboratory で、ChainerRL を動かして、DQN のサンプルを動かした
* ALEの環境を使って、breakout のゲームを学習した
* https://colab.research.google.com/drive/1FHHHQJ1vVfG2w2ID8D9oEcuLX5qt_uek

[![https://gyazo.com/712ac8285af2f22d5954113615065dc1](https://i.gyazo.com/712ac8285af2f22d5954113615065dc1.gif)](https://gyazo.com/712ac8285af2f22d5954113615065dc1)



# Atariのゲームを学習させたい

[前回](https://qiita.com/ikeyasu/items/ec3c88ce13a2d5e41f26)では、CarPole を動かしていましたが、それではちょっとつまらないですね。
せっかく強化学習をするのですが、DQNを使って、Atariのゲームをやって見ます。

# Colaboratory

夢のような（[略](https://qiita.com/ikeyasu/items/ec3c88ce13a2d5e41f26#colaboratory-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

動かし方は、[ChainerRL を Colaboratory で動かす](https://qiita.com/ikeyasu/items/ec3c88ce13a2d5e41f26) を参照してください。
今回のノートは以下のURLですので、以下を開いて、コピーし、作業してください。

https://colab.research.google.com/drive/1FHHHQJ1vVfG2w2ID8D9oEcuLX5qt_uek

基本的な解説は上記のノートに書いてあります。

# 工夫したところ

今回は、Open AI Gym ではなく、ChainerRL の chainerrl.envs.ale の環境を使っているのが大きな違いです。chainerrl.envs.ale には、render() が実装されていなかったので、前回の方法でアニメーション作成はできませんでした。
代わりに、aleには、getSreenRGB() があるので、それを使って、アニメーションを作成しています。


# Chainer Colab Notebook リポジトリ

[Chainer Community](https://chainer.connpass.com/)では、Colaboratory を使った Hands-on 資料を作成しています。Contribution も受け付けていますので、Github の Pull-requestからお願いします！

@keisuke-umezawa さんによる紹介記事： https://qiita.com/keisuke-umezawa/items/4e99c2a4f5f07567444c

Google drive: https://drive.google.com/drive/u/0/folders/1GdwW9HmKfKfo6E-K81YKuURh-XheCGDR

Github: https://github.com/chainer-community/chainer-colab-notebook
【Web】MVCフレームワーク

#MVCフレームワーク
webアプリケーションを,モデル・ビュー・コントローラの3つの要素で
分割して処理するフレームワーク

<center>
<img width="352" alt="mvc.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/956a34eb-ea12-e498-7d8c-d5395ec4e562.png">
</center>

##Model
データベースにアクセスし,データの入出力についての処理を行う

##View
HTMLを生成し,Webブラウザに送信

##Controller
モデルやビューを制御

##MVCの対応
基本的に 
　　　　 DBのテーブル1つ → モデル1つ
　　　　 アクション1つ → ページ1つ
　　　　 ビュー1つ  → アクション1つ
といったように対応している

<img width="830" alt="スクリーンショット 2018-08-07 22.21.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/f001d1a0-e71e-1a57-ecd3-c953e9b97e21.png">
BearSSLについて

[蟹さん](https://qiita.com/yamori813/items/c1d8111a3f45c5a74655)にSSLを話させようと思いついて、調べていたところaxTLSというスタックが見つかったのだが、ビルドを試したところいろいろ手をいれないと使えなさそうだった。たまたまこれについて調べていたところBearSSLという実装がある事を知った。この実装は比較的新しい物のようです。

https://bearssl.org/

組み込み用のオープンソースのTLSのコードは他にはmbedTLS(旧PolarSSL),wolfTLS,matrixSSLなどがある。

BearSSLはカナダの人がおそらく一人で作られたMITライセンスのコードで、ざっくりみたところ非常に奇麗に書かれています。

現在のところTLS 1.0, 1.1, 1,2に対応しています。

コードは全て公開されていて、ライブラリのビルドに必要なコードはCなのですが、一部C#で書かれたプリプロセッサーでCコードを生成しているようです。

FreeBSD 11/amd64でmakeしたところすんなりビルドが通りました。

Mac OS X/Intel(雪豹)でビルドするとso作ろうとしてこけますが.aはできます。

Mac OS X/PPC(10.5)でもビルドできました。

ビルドするとbuildディレクトリにlibbearsslができます。sampleディレクトリにhttpsなサーバとクラインとのサンプルのコードがあります。

```makefile:Makefile
all:    client_basic server_basic

client_basic:   client_basic.c
        cc -I../inc -L../build -lbearssl -o client_basic client_basic.c

server_basic:   server_basic.c
        cc -I../inc -L../build -lbearssl -o server_basic server_basic.c
```

このサンプルプログラムを実行してみます。FreeBSDの場合はLD_LIBRARY_PATHをbuildディレクトリに通してsoを読めるようにしておきます。

サーバ側

```
bash-3.2$ ./server_basic 8080
binding to: 0.0.0.0
bound.
accepting connection from: 127.0.0.1
SSL closed (correctly).
```

クライアント側

```
bash-3.2$ ./client_basic localhost 8080
connecting to: 127.0.0.1
connected.
HTTP/1.0 200 OK
Content-Length: 46
Connection: close
Content-Type: text/html; charset=iso-8859-1

<html>
<body>
<p>Test!</p>
</body>
</html>
closed.
```

サーバ側にはlocalhostの証明書が貼ってあるので、クライアント側からIPアドレスでのアクセスはエラーになります。

違うホストからのアクセスを確認したい場合はclient_basic.cを以下ようにします。

```
        br_ssl_client_reset(&sc, "localhost", 0);
```

client_basicで一般のサイトをアクセスするには乱暴かもしれませんが、以下のようにするとできます。

```
bash-3.2$ curl https://curl.se/ca/cacert.pem > cacert.pem
bash-3.2$ ../build/brssl ta cacert.pem > cacert.h
```

出来上がったcacert.hをclient_basic.cにハードコードされたTAと入れ替えてコンパイルします。

```
bash-3.2$ ./client_basic www.yahoo.co.jp 443
connecting to: 182.22.25.252
connected.
HTTP/1.0 200 OK
Date: Sun, 25 Mar 2018 01:26:17 GMT
```

まだ蟹さんでは動いていませんが、ちょっといじってみるつもりです。
シェルスクリプトのtrapほかの落とし穴

シェルスクリプトを書いていたところで、`set -e`や`trap`の挙動に引っかかってしまいました。

なお、「特定の環境で動けばいい」という前提なので、[シバンの段階で`#!/bin/bash`と決め打っています](https://qiita.com/jkr_2255/items/84366f677be3365331cd)。POSIXへの準拠性などは考えません。

# 関数化したら、意図しない動作に

似たような動作をするシェルスクリプトがあったので、一部を関数にして切り出すことにしました。`set -e`と`trap ERR`の組み合わせで、エラー時の終了処理はもともと組んでありました。

```bash

# main.sh

source ./functions.sh

failure() {
  echo エラー発生！
}

trap failure ERR

set -e

func

echo 正常終了

# functions.sh

func() {
  # 処理失敗のシミュレーション
  false 
  echo 'func complete'
}
```

さて、上のコードを実行すれば、何を表示するでしょうか。意図としては、「エラー発生！」だけになってほしいのです…が、なんと**何も表示せず終了してしまいます**。

# 動作確認と狙い通りな形への改造

何が起きたのかと調べてみると、以下のような動作をしていたのでした（[man](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)より）。

* `set -e`…関数内まで適用される
* `trap ERR`…関数内にはデフォルトでは**適用されない**

ということで、関数内のエラーでは`trap`に入らず即座に終了してしまう、という挙動となっていました。

そして、`set -E`とすれば`trap ERR`が関数にも適用される、ということでやってみたら、今度はエラーが2回表示されるようになりました。今回の場合、一度`trap ERR`に入れば復帰する目がなかったので、そのまま`trap`の関数の中で`exit`させることで、2回目が来る前に終了させて解決しました。

```bash
set -E

failure() {
  echo エラー発生！
  exit 1
}
```

# 教訓

いざという時、`man`は役に立つ
Ubuntuにgit-secretsを導入する

# 目的

数十番煎じだが、備忘録のためgit-secretsのインストール手順を記載する。

# やったこと

## git-secretsをインストール

```
git clone https://github.com/awslabs/git-secrets.git
cd git-secrets
sudo checkinstall
```

## 全体にgit-secretsを適用

AWSトークンに関するルールセットを導入

```
git secrets --register-aws --global
```

git initしたときなどのデフォルト

```
cp -r /usr/share/git-core/templates ~/.git_templates
mkdir ~/tmp_git-secrets
cd ~/tmp_git-secrets
git init
git secrets --install
cat .git/hooks/commit-msg >> ~/.git_templates/hooks/commit-msg
cat .git/hooks/pre-commit >> ~/.git_templates/hooks/pre-commit
cat .git/hooks/prepare-commit-msg >> ~/.git_templates/hooks/prepare-commit-msg
cp ~/.gitconfig ~/.gitconfig.bak
echo '\n[init]\n    templatedir = ~/.git_templates' >>  ~/.gitconfig
```
ゼロからはじめるデータサイエンス #1

#近くの丘に登ってみる
自分の周りの物事を客観的にとらえるための最も手近な方法は、対象となる物事から物理的な距離を置いてみることです。それはあたかも、近くの丘に登って街を見渡してみる事に似ています。この回では、簡単なpythonプログラムを書いて、実行してみる事を目指します。

#pythonでhello world
1.Macの一番下から、Finderをクリックしましょう。一番左にある顔が書いてる四角い形のものがFInderです。
![スクリーンショット 2018-03-21 20.53.08.png](https://qiita-image-store.s3.amazonaws.com/0/135380/582a45ca-3730-8cdd-ce1c-3ab8d9a481e9.png)


2.ターミナルを立ち上げましょう
FInderを立ち上げると、アプリケーション→ユーティリティ→ターミナルを選択してみましょう。
![スクリーンショット 2018-03-21 20.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/135380/1ece4c26-5ce6-bf56-4912-98612dc404df.png)

3.ターミナルにpythonと入力してみる
白く、四角い画面が立ち上がったら、pythonと入力してみましょう。
＞＞＞の印が画面左に出てきたら成功です。
![スクリーンショット 2018-03-21 20.57.20.png](https://qiita-image-store.s3.amazonaws.com/0/135380/61794695-f697-94b1-00f8-eaa568ea3396.png)

4.Hello World
下で書かれて居るように、入力してみてください。コピーして貼り付けるのはオススメしません。プログラミングは技術ですので、指を動かしてその意味を体で覚える必要があります。

```python:Helloworld
print('Hello World')
```
![スクリーンショット 2018-03-21 20.59.52.png](https://qiita-image-store.s3.amazonaws.com/0/135380/12f12ed2-4fe0-cca4-60e9-95112489545a.png)

5.確認
Hello Worldと表示されたら、この回は終了です。

#次回
Anaconda を使用して、開発環境を構築する事を目指します。

#ここまで来た人へのオススメ
Udemy という海外のプログラミングサイトがあります。
e-learningで技術を勉強したいのであれば、Udemyを利用するのがオススメです。
python で検索して、自分にあったサイトを見つけてみては如何でしょうか。
ゼロから作るDeepLearningを読んで1

# はじめに
　O'REILLYから出版されている「ゼロから作るDeepLearning」を読んで、自分なりに纏めた内容です。
　書籍には、PythonでDeepLearningを作成する手順や各種関数の説明などがありますが、主に理論寄りの内容を書いていきます。

# 活性化関数について
DeepLearningでは、複数の層からなるニューラルネットワークを形成し、入力層から出力層へ伝播する際に下図のように計算されます。
![活性化関数の略図.png](https://qiita-image-store.s3.amazonaws.com/0/164189/4f8716f6-ba86-0fe0-d4b3-f44b4399ea64.png)

```math
\begin{eqnarray}
a=b+w_{1}x_{1}+w_{2}x_{2}
\end{eqnarray}
```

```math
\begin{eqnarray}
y=h\left( a\right) 
\end{eqnarray}
```

[補足]
 　　 $ b $　:　 バイアス
  　　$ w_{1} $ :　 $ x_{1} $の重み
  　　$ w_{2} $ :　 $ x_{2} $の重み

上図の$ h\left( \right) $が活性化関数です。

# 活性化関数の例
## シグモイド関数
```math
\begin{eqnarray}
 h\left( x\right)=\dfrac {1}{1+\exp \left( -x\right) } 
\end{eqnarray}
```
![sigmoid_graph.png](https://qiita-image-store.s3.amazonaws.com/0/164189/20c181fd-5a4f-fafc-ce29-38d89a730372.png)

## ステップ関数
```math
\begin{eqnarray}
h\left( x\right) =\begin{cases}1\left( x >0\right) \\
 0\left( x\leqq 0\right) \end{cases} 
\end{eqnarray}
```

![step_function_graph.png](https://qiita-image-store.s3.amazonaws.com/0/164189/c68700c9-b72f-29a5-7c25-5b362d42a915.png)

## ReLU関数
```math
\begin{eqnarray}
h\left( x\right) =\begin{cases}x\left( x >0\right) \\
 0\left( x\leqq 0\right) \end{cases} 
\end{eqnarray}
```

![ReLU_graph.png](https://qiita-image-store.s3.amazonaws.com/0/164189/30781da7-9c07-538e-1a3e-6d0a837a7375.png)

# 出力層の設計
出力層の活性化関数($ \sigma \left( \right)  $とする)を変更することで、分類問題や回帰問題に使用できます。

- 分類問題：データがどの分類に属するかを判定(0-9の手書き画像から、その画像の数値を判定)
- 回帰問題:入力データから数値の予測(例：写真から値段や大きさを予測)

# 出力層の関数
## ソフトマックス関数
```math
\begin{eqnarray}
y_{k}=\dfrac {\exp \left( a_{k}\right) }{\sum ^{n}_{i=1}\exp \left( a_{i}\right) }
\end{eqnarray}
```

分類問題で使用されるよう。

## ソフトマックス関数の特徴
ソフトマックス関数の出力は0から1.0までの値になります。つまり、出力値は確率として解釈することが出来る。
aptコマンドメモ



###インストール###
Gradleというビルドツールをインストールしてみます。

```terminal:Console
//Gradleが公式レポジトリにあるか確認
$ apt search gradle

//インストールを開始する
$ sudo apt install gradle
```
***

###非公式のアプリをインストールしたい時###
ubuntuの公式にないアプリなどはＰＰＡ（Personal Package Archive）を使ってインストールが可能だそうです。

以下のサイトでアプリを検索すると出てくる。
https://launchpad.net/
例えばGradleをＰＰＡでインストールするときは、このようになる。

```terminal:Console
//ppaをセット
$ sudo add-apt-repository ppa:cwchien/gradle
//レポジトリの更新
$ sudo apt-get update
//インストール開始
$ sudo apt-get install gradle
```

また、要らなくなったＰＰＡは以下のようにして削除します。

```terminal:Console
//ppaを削除
$ sudo add-apt-repository -remove ppa:cwchien/gradle
```

***
###アンインストール###
Gradleを消します。--purgeオプションをつけると依存ライブラリまで消してくれるらしいです。

```terminal:Console
$ sudo apt --purge remove gradle
$ sudo apt autoremove
```
***
###中途半端な状態のインストールパッケージを削除する###
aptしてる時に、インストールに失敗したパッケージ等が残っているとこんな感じのエラーになる。

```terminal:Console
1 個のパッケージが完全にインストールまたは削除されていません。
この操作後に追加で 0 B のディスク容量が消費されます。

.
.
.


HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
2018-03-21 19:09:09 エラー 404: Not Found。
dpkg: パッケージ oracle-java7-installer の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
処理中にエラーが発生しました:
```
こんなものは消してしまえー！ということで、、、

```terminal:Console
//問題のやつを検索して
$ dpkg -l | grep java7-installer
iF  oracle-java7-installer                      7u80+7u60arm-0~webupd8~1                     all          Oracle Java(TM) Development Kit (JDK) 7

//削除
$ sudo dpkg -r oracle-java7-installer
```
WEBフロントエンド Androidでデバッグをしたい

特定のバージョンのAndroidでなぜかうまく動かない。。。
もう手詰まりだ。。

[フロントエンドエンジニアがAndroid標準ブラウザをデバッグする – T – Medium](https://medium.com/@TomonariTakai/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8Candroid%E6%A8%99%E6%BA%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%82%92%E3%81%99%E3%82%8B-d276dbd63f7)
Ansible TowerとAWXのAPIユーザー認証方法まとめ

Ansible TowerとOSS版であるAWXのAPIユーザー認証方法が違ったのでまとめておきます。

# 環境

| 項目          | バージョン               |
|:--------------|:-------------------------|
| Ansible Tower | 3.2.3                    |
| AWX           | 2018/3/21 時点での最新版 |

# ユーザー認証について

| 対象          | ユーザー認証                                                                       |
|:--------------|:-----------------------------------------------------------------------------------|
| Ansible Towre | JSONでユーザー情報を送信してTokenを発行し、そのTokenをヘッダに付与して処理を続ける |
| AWX           | Basic認証                                                                          |

## Ansible Tower ユーザー認証

```python
#!/usr/bin/env python3
import json
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

if __name__ == '__main__':
    # Ansible Towerログイン情報
    host = "Ansible Tower Host IP or FQDN"
    username = "admin"
    password = "redhat"

    # Token取得
    headers = {"Content-Type": "application/json"}
    url = "https://%s/api/v2/authtoken/" % host
    r = requests.post(url,
                      headers=headers,
                      data=json.dumps({"username": username, "password": password}),
                      verify=False)
    token = json.loads(r.text)['token']

    # ヘッダーにTokenをセット
    headers["Authorization"] = "Token " + token

    # Ansible Tower情報取得
    url = "https://%s/api" % host
    r = requests.get(url,
                     headers=headers,
                     verify=False)
    print(json.dumps(json.loads(r.text), indent=2))
```

**結果**

```json
{
  "available_versions": {
    "v1": "/api/v1/",
    "v2": "/api/v2/"
  },
  "description": "AWX REST API",
  "current_version": "/api/v2/"
}
```

Ansible Towerの設定で `HTTP BASIC認証の有効化` が `オン` になっていればBasic認証でも可能です。

![スクリーンショット 2018-07-14 20.26.46.png](https://qiita-image-store.s3.amazonaws.com/0/180118/91186d67-804d-efb9-b6e0-7025a51fb387.png)

## AWX ユーザー認証

```python
#!/usr/bin/env python3
import json
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

if __name__ == '__main__':
    # AWXログイン情報
    host = "AWX Host IP or FQDN"
    username = "admin"
    password = "password"

    # AWX情報取得
    headers = {"Content-Type": "application/json"}
    url = "http://%s/api" % host
    r = requests.get(url,
                     headers=headers,
                     auth=(username, password),
                     verify=False)
    print(json.dumps(json.loads(r.text), indent=1))
```

**結果**

```json
{
 "oauth2": "/api/o/",
 "description": "AWX REST API",
 "available_versions": {
  "v1": "/api/v1/",
  "v2": "/api/v2/"
 },
 "custom_login_info": "",
 "current_version": "/api/v2/",
 "custom_logo": ""
}
```
proxy環境でbuild-argを使ってもapt-getが失敗する

systemd経由でproxyの設定を書き、docker build時に`--build-arg`を使用したが、apt-getに失敗した
## 環境
環境は以下の通り
Host: ubuntu 16.04-1
container: ubuntu:16.04
docker 17.12-1ce
docker-compose

## 対策
###1. $HOME/.docker/config.jsonにproxy設定を記載する


```config.json
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://proxy.example.co.jp:8080",
     "httpsProxy": "http://proxy.example.co.jp:8080"
   }
 }
}
```

[config.jsonで使用できる項目](https://github.com/docker/cli/blob/master/cli/config/configfile/file.go)
###2. dns設定systemd経由で記載する
[systemd起動のDockerでdnsオプションを有効にする](https://qiita.com/hirosemi/items/0574a4b044f46c6ac5af)

###3. docker-composeの場合はargsを用いる
使用しているdocker-composeではconfig.jsonの結果が反映されないかった。
githubにて[issue #5601](https://github.com/docker/compose/issues/5601)が上がっていて、1.20.0にて修正されるらしい。



## 手順
systemd経由でdockerのproxy設定を書く
/etc/systemd/system/docker.service.d/http-proxy.conf

```/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
# 改行しない
Environment="HTTP_PROXY=http://proxy.example.co.jp:8080" "HTTPS_PROXY=http://proxy.example.co.jp:8080"
```

```
# systemdにconfファイルを読み直しさせる
$ sudo systemctl daemon-reload
# systemdに設定が反映されているか確認する
$ systemctl show --property=Environment docker
# docker daemonのリスタート
$ sudo systemctl restart docker
# dockerに設定が反映されているか確認する
$ docker info

```

```Dockerfile
FROM utuntu:16.04
RUN  apt-get update -y && apt-get install -y wget
```

```
$ docker build --build-arg HTTP_PROXY=http://proxy.example.co.jp:8080  --build-arg HTTPS_PROXY=http://proxy.example.co.jp:8080 -t proxy_test .
```
## 切り分け
###proxy設定がbuild時に見えているか？
->echoしてみる

```Dockerfile
FROM utuntu:16.04
RUN  echo "$HTTP_PROXY, $HTTPS_PROXY"
RUN  apt-get update -y && apt-get install -y wget
```
表示された!
`$HTTP_PROXY`や`$HTTPS_PROXY`に値は設定されているが、apt-getが失敗する。
apt-getにproxyの設定が反映されていない?
### apt.confのproxy設定が反映されるか?
```Dockerfile
FROM utuntu:16.04
RUN  echo -e "Acquire::http::proxy \"$HTTP_PROXY\";\nAcquire::https::proxy \"$HTTPS_PROXY\";" > /etc/apt/apt.conf

RUN  apt-get update -y && apt-get install -y wget
```
反映された。
ただし`--build-arg`を使って折角proxy設定をimageに含めないとしているのに入ってしまう。なるべく避けたい。
そこで、config.jsonを使用する。


# 参考
[systemd時代のDockerをProxy環境下で使う](https://qiita.com/whywaita/items/526f2eb0ab9f3fd3ea65)
[dockerのプロキシ設定](https://qiita.com/sch923/items/44ac748389dd68388467)
再帰関数

```c:test.c
#include <stdio.h>

void sub(int* dim, int dim_index, int* data, int y)
{
	int x_max = dim[dim_index];
	for(int x=0; x<x_max; x++)
	{
		int z = y * x_max + x;
		if(dim_index==0)
		{
			printf("data[%d]=%d\n",z,data[z]);
		}
		else
		{
			sub(dim, dim_index-1, data, z);
		}
	}
}

int main()
{
	int dim[] = {1,2,3,4};
	int size = 4;
	int data[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
	sub(dim, size-1, data, 0);
	return(0);
}


```
ゼロからはじめるデータサイエンス #0

#モチベーション
人類が進化を続け、その活動領域を広げる事が出来た理由の一つは、物事を客観的にとらえる力を持っているからだと思います。データサイエンスは、データを用いて、物事を客観的にとらえようとする行いだと思います。物事を客観的にとらえようとする人が、データを扱えるようになる手助けが出来れば良いと思い、このシリーズを書き始めました。

#内容
データを扱うための技術について纏めていきます。

#対象
物事を客観的にとらえたいと思っている人
（エンジニアのみを対象とはしていません）

#注意
内容を将来的に変更する可能性があります。あくまで、執筆時の筆者の個人的な意見です。
内容に理由付けはあえて書いていない場合が多いです。筆者が今まで出会ってきた、データサイエンティストと言われる人々や、機械学習エンジニアと言われる人たちに対する観察と、筆者の個人的な経験に基づく知見です。

#まずはゼロから
##道具を選ぶ
人よりも早い速度で成長したいのであれば、より良い道具を選ぶべきです。人生は有限なので、より高みを目指そうとする者は、道具（物）の手助けを借り、道具（物）に感謝する心を持っていたいものです。

###WindowsかMacか
最善策はMacbook proを買うべきです。
新品が無理なら、中古でも良いです。日本語キーボードよりは英字キーボードを選ぶべきです。
windowsではじめる位なら、アルバイトをして、中古のMacbookproを買いましょう。
現状ヤフオクがおすすめですが、メルカリでも良いと思います。

###クラウド環境を用いるべきか
クラウドサービスからはじめるべきではありません。
ローカルのMacbookproからはじめてみましょう。

###Macbookproの設定
購入後のMacbookproの設定方法
AppleID は携帯などのものを使い回しても、新規で取得しても良いと思います。
ApplePayは適当なカード番号を入れて置けば、後から設定することも出来ます。
中古のMacbookproを購入した場合にはOSをアップデートしておいた方が良いです。
（OSアップデートは必須ではありません。）
https://support.apple.com/ja-jp/HT205749

###この回のExit
MacBookProにログイン出来て居ること

###次回
pythonでHello World
Railsアプリ全ページ、まとめてニャアニャア言わせてやるぜ。

## `after_action`
今までcontrollerの`after_action`フィルタの使い方としてどんなことを思っていたかというと、メインの処理が終わったあとに、slackで通知するとかいう付帯的な処理をやるもんだと思っていました。
しかし[Railsガイド](https://railsguides.jp/action_controller_overview.html#after%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%A8around%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF)をよくよくみると…

> "after"フィルタの場合はアクションは既に実行済みであり、クライアントに送信されようとしている応答データにアクセスできる点が"before"フィルタとは異なります。

…応答データにアクセス？
`response`かね。

`response.body`って、整形済みのHTMLが入ってる。

[代入がある](http://api.rubyonrails.org/classes/ActionDispatch/Response.html#method-i-body-3D)！

## ニャアニャア言わせてやるぜ。
[![ニャアニャア言わせてやるぜ。](http://img.f.hatena.ne.jp/images/fotolife/k/ken1flan/20180321/20180321133655.jpg)](http://f.hatena.ne.jp/ken1flan/20180321133655 =200x)

### Gemfile
拙作の猫語変換用Gemを追加。

```Gemfile
    :
  gem kittenizer
    :
```

### ApplicationController
`response.body`を猫語に変換する`private`メソッドを作って、
`after_action`に指定するだけ。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
    :
  after_action :kittenize
    :
  private
  def kittenize
    response.body.kittenize!
  end
end
```

### ニャアニャア言わせた
[![ニャアニャアいわされた例](http://img.f.hatena.ne.jp/images/fotolife/k/ken1flan/20180321/20180321200502.png)](http://f.hatena.ne.jp/ken1flan/20180321200502)


### 注意
HTMLのタグに日本語がないからこんなに雑なことをやってるけど、ホントだったらちゃんとパースしたりなんだりして、やんないとダメだよね。

## 参照
[Railsガイド ActionControllerの概要](https://railsguides.jp/action_controller_overview.html#after%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%A8around%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF)