OmniAICreator/Qiita-1.07M huggingface dataset:
ネガポジ判定を行うGemを使ってみた


ネガポジ判定を行う必要性があったので、ruby gemを探してみたところ下記がみつかりました。
[ネガポジ判定を行うGem作ってみた](http://qiita.com/moroku0519/items/e6352d31311418f38227)

install手順が、記載の内容から更新があったようなので、まとめてみます。

# 環境
* MacBookAir
	* OSX 10.12.6


# 手順
1. [homebrew](https://brew.sh/index_ja.html)をinstall

  ```
  $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  ```

2. 形態素解析エンジンをinstall

 ```
$ brew install mecab
$ brew install mecab-ipadic
 ```

3. [rbenv](https://github.com/rbenv/rbenv#homebrew-on-mac-os-x)をinstallして、最新versionのrubyをinstall(systemに元々はいっているruby2.0.0でも動くだろうけど、せっかくなので))

 ```
$ brew update
$ brew install rbenv
$ rbenv init
$ rbenv install -l 
$ rbenv install 2.4.1
$ rbenv versions
$ rbenv global 2.4.1
$ ruby -v
 ```

4. 事前に必要なgemをinstall

 ```
$ gem install natto
$ gem install bundler
 ```

5. negapoji gemをinstall

 ```
$ git clone https://github.com/hatt0519/negapoji.git
$ cd negapoji
$ bundle install
$ gem build negapoji.gemspec
$ gem install negapoji
Successfully installed negapoji-0.1.0
Parsing documentation for negapoji-0.1.0
Done installing documentation for negapoji after 0 seconds
1 gem installed
 ```

6. サンプルスクリプトを用意

 ```test_negapoji.rb
# coding: utf-8
require "negapoji"
while text = STDIN.gets
  p Negapoji.judge(text) if text.is_a?(String)
end
 ```
7. サンプルスクリプトを実行

 ```
$ ruby test_negapoji.rb
おはようございます。
"positive"
痛いです
"negative"
 ```

以上
デザインパターンを勉強してみる--第2回 Facadeパターン--

# Facade(ファサード)パターンとは
どもども。ここではFacadeパターンを学ぼうと思います。

突然ですが、皆さんカレーは好きですか？自分で作ったりしますか？

カレーの作り方も家によってさまざま。。
料理の手順が違ければ、隠し味も違ったりしますよね！
うちの父は酢と飲むヨーグルトを最近使ってました。(自分的には意外だったんですが、
酸っぱいものを加えるとカレーの味から角がとれてまろやかになるとのこと。実際その通りでした。)

さて、カレーも自分でうまく作れればいいですが、
失敗したものを家の夕飯で出したりしては目も当てられません。
それならいっそのこと、他の家族に作ってもらったほうがよほどマシではないですか？

今回学習するFacadeパターンも、「自分でやるより任せた方が」って発想のパターンです。

# サンプルケース
ではカレー作りを例にとり説明していきます。
その前に調理手順のクラスを用意します。

・1:野菜を切る

```java:ToCutVegetables.java
public class ToCutVegetables {
  public void exec () {
    System.out.println("1:野菜を切ります");
  }
}
```
・2:肉を切る

```java:ToCutMeat.java
public class ToCutMeat {
  public void exec () {
    System.out.println("2:肉を切ります");
  }
}
```
・3:野菜と肉を炒める

```java:ToFryVgtblsAndMeat.java
public class ToFryVgtblsAndMeat {
  public void exec () {
    System.out.println("3:野菜と肉を炒めます");
  }
}
```
・4:ルーを入れる

```java:ToPutRoux.java
public class ToPutRoux {
  public void exec () {
    System.out.println("4:ルーを入れます");
  }
}
```
・5:隠し味にヨーグルト

```java:ToPutYoghurt.java
public class ToPutYoghurt {
  public void exec () {
    System.out.println("5:隠し味にヨーグルトを入れます");
  }
}
```
・6:水を入れて煮る

```java:ToBoilAfterAddingWater.java
public class ToBoilAfterAddingWater {
  public void exec () {
    System.out.println("6:水を入れて煮ます");
  }
}
```
以上が調理手順になります。

ではここからが本題。
例えばある家の息子が、夕食にカレーを作ろうとしますよね。
しかしこやつ、いまいち作り方がわかってないのです。
隠し味のヨーグルトを忘れているのです。(私的にはNG)

・息子

```java:Son.java
public class Son {
  public static void main(String[] args) {

    // カレーを作ります。
    // 1:野菜を切ります。
    (new ToCutVegetables()).exec();

    // 2:肉を切ります
    (new ToCutMeat()).exec();

    // 3:野菜と肉を炒めます
    (new ToFryVgtblsAndMeat()).exec();

    // 4:ルーを入れます
    (new ToPutRoux()).exec();

    // 5:隠し味にヨーグルトを入れます
    // (入れてない)

    // 6:水を入れて煮ます
    (new ToBoilAfterAddingWater()).exec();
  }
}
```
見て分かるように、息子は調理手順のメソッドを呼び出し
調理をこなしていきますが、肝心の隠し味を入れ忘れています。

でも、母親は違います。
・母

```java:Mother.java
public class Mother {
  // カレーを作ります。
  public void makeCurry() {
    // 1:野菜を切ります。
    (new ToCutVegetables()).exec();

    // 2:肉を切ります
    (new ToCutMeat()).exec();

    // 3:野菜と肉を炒めます
    (new ToFryVgtblsAndMeat()).exec();

    // 4:ルーを入れます
    (new ToPutRoux()).exec();

    /** 5:隠し味にヨーグルトを入れます(これがなくちゃ！) **/
    (new ToPutYoghurt()).exec();

    // 6:水を入れて煮ます
    (new ToBoilAfterAddingWater()).exec();
  }
}
```
makeCurryメソッドを見ると、
きっちり5番目で隠し味を入れるメソッドを実行してくれましたね。

**「これ、もう母親につくってもらったらww」**

この発想がFacadeパターン！！

・息子

```java:Son.java
public class Son {
  public static void main(String[] args) {
    // 母に頼んでカレーを作ってもらいます
    new Mother().makeCurry();
  }
}
```
母のmakeCurryメソッドを呼ぶことで、
完璧なカレーが出来上がります。

-実行結果-

```
1:野菜を切ります
2:肉を切ります
3:野菜と肉を炒めます
4:ルーを入れます
5:隠し味にヨーグルトを入れます
6:水を入れて煮ます
```

# まとめ
要は、facadeパターンとは「各クラスのメソッドをまとめて実行しなければならない時に、
まとめて一括で実行できる、**窓口**となるクラスを用意するパターン」なのです。(サンプルだと母がそれ。)

今回の各調理手順クラスのメソッドも全て呼び出さないと
カレーが出来ませんが、そういう「全てのクラスの処理を呼ばないと意味がない」ような場合に
便利なパターンです。窓口クラスのメソッドを実行するだけでいいんですから。
また、呼び出す順序にルールがあるなら窓口のクラスの中で順に呼ぶようにすればよいです。

私もコーディングしていると、「いくつもメソッド作ったけど、こいつらまとめて呼ばないと
意味ないんだよな。。」って状況にしばしば出会うので、使いどころの多そうなパターンかと思います。
まとめて実行できるようにしておけば、後でコーディングする人達も助かるでしょう。

(ちなみに、facadeとはフランス語を語源とする単語で「建物の正面」という意味です。)

# 次回
Compositeパターン。。かな？
VBAメモ　JavaScriptイベントを強制的に発火させる

ブラウザ操作を自動化して欲しいって依頼を受けたので、
エクセルからインターネットエクスプローラーを操作するマクロを組んだ。

```
Excel2016
InternetExplorer11
```

ウェブ上のフォームに値を自動で入力したかったのだが、
JavaScriptが発火しなくて困った。
selectタグで選んだoptionによって、
項目が動的に変化するようなよくあるパターン。

どうやらoptionを選択するだけではイベントが発生しないようだ。

ググると出てくるのが`fireEvent`

こんな感じで使う。

```vbnet
' <option value="1">1</option>を選択する

With ie.Document.getElementById("mySelect")
    .Value = "1"
    .fireEvent ("onchange")
End With
```

でも、これ`select`に`oncahge`イベントが仕込まれてないと発火しない。

今回は外部のJSファイルにある関数を実行させたい。

で、見つけたのがこれ。
https://msdn.microsoft.com/ja-jp/library/ff975247(v=vs.85).aspx

```vbnet
Dim evt As Object
Set evt = ie.document.createEvent("HTMLEvents")
evt.initEvent "change", True, False

With ie.Document.getElementById("mySelect")
    .Value = "1"
    .dispatchEvent evt
End With
```

これで、ようやくJSが発火するようになった。
やれやれ。


----------------------------------------------------


エクセルからブラウザ操作を自動化したいという需要ってけっこうあるのかしら。
頼まれたのは２回目。。。
pickleでエラーが発生する特殊なケース

[pickle](https://docs.python.org/3/library/pickle.html)は、ファイルなどに保存するために、Python オブジェクトをバイト列にシリアライズするための標準ライブラリです。

どのようなオブジェクトがpickleできるかは[pickleのレファレンス]
(https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled)に記述がありますが、相互に参照しているオブジェクトがうまくunpickle出来ない現象が起きたので調べたところ、[こちらのイシュートラッカー](https://bugs.python.org/issue1761028)にあるとおり未解決の問題があるようです。

次のスクリプトを実行すると、`pickle.loads`でunpickleする際に、```AttributeError: 'Node' object has no attribute 'i'```となります。

```py3:
# modified from https://bugs.python.org/file2428/circle.py

import pickle

class Node(object):
    def __init__(self, i):
        self.i = i

    def __cmp__(self, other):
        return cmp(self.i, other.i)

    def __hash__(self):
        return hash(self.i)

n = Node(12)
n.next_nodes = set((n,))

byteobj = pickle.dumps(n)
unpickled = pickle.loads(byteobj)
```
このエラーが起こるのは、Nodeオブジェクトの`n`が次の条件にあてはまるからで、このような条件にあてはまるオブジェクトはpickle/unpickle出来ない可能性があります。

* ``__hash__``メソッドで、自らのメンバー`i`を使用している。
* `n`は、`n.next_nodes`の`set`オブジェクトの要素として、自らを循環参照している。
* 循環参照の過程で、(`set`の要素であるから)``__hash__``メソッドが使用されている


2007年に報告されたバグですが、[イシュートラッカー](https://bugs.python.org/issue1761028)では、レアなケースだし、修正するのは大変なので修正しないと開き直っており、未だ解決されていないようです。
iPhoneのSafariで開いているページをWebインスペクタでPCからデバックする方法

# 概要
WEBサービス開発が進み始め、スマホでの実機確認の機会も増えてきたので
iPhone の実機で表示確認テストをおこなうときに、PCブラウザでデバックできる方法を調べました。

すごく簡単だったので、実機デバックに活用いただければ幸いです。

# 準備するもの
- iPhone
- Mac 端末
- iPhone　と PC を繋ぐためのケーブル (純正じゃないとうまくいかない可能性もあるかも？）

# 手順
## 物理作業
- Mac 端末と iPhone をケーブルで接続する。

## 端末設定
- 設定 -> Safari -> 詳細 を開き 「Webインスペクタ」 を ON にする

<img width="375" alt="iphone01.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/132495/65488446-0d12-40ea-5377-a031fcf2e643.jpeg">

## Mac設定
- Safari の 環境設定 -> 詳細 から 「メニューバーに"開発"メニューを表示」 にチェック

![mac01.png](https://qiita-image-store.s3.amazonaws.com/0/132495/6b8a9221-de84-0fce-c1b1-128803eea6c7.png)

- 開発メニュー -> iPhone から 「JSContextsのWebインスペクタを自動的に表示」 にチェック

![mac02.png](https://qiita-image-store.s3.amazonaws.com/0/132495/88fe9fcd-f4ae-3e71-42fd-baaf2d5386e0.png)

## 完成
たったこれだけで iPhone で開いている Safari 上でデバックする準備が整いました。
# 実際画面
iPhone の Safari で Github ページを見てるときのイメージです。
### 端末キャプチャ
<img width="375" alt="iphone02.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/132495/daa704f4-e889-b5a5-bb8b-1e90053b2a9d.jpeg">
### PC側のWebインスペクタ画面
![PC01.png](https://qiita-image-store.s3.amazonaws.com/0/132495/9ffbe7cb-9e52-c5b7-eed8-42af14215942.png)
[Unity](初心者向け)Retry(リトライ)ボタンを作る

<h1>Retryボタンの仕組み</h1>
サーバーサイドは一切ないです。クライアント側のみのちょっとしたゲーム作りには有効です。
全てのオブジェクトを初期の位置に戻したり増えたオブジェクトを削除したりはしません。
**シーンの再読み込みをすればいいという感じです。**

```c#:I_am_hentai.cs
using UnityEngine.SceneManagement;//クラス名の上に追加してください

string sceneName;

void Start(){
  sceneName = SceneManager.GetActiveScene ().name;
}

public void RetryButton(){
	SceneManager.LoadScene (sceneName);
}
```

sceneNameで現在のシーン名を取得し、次の行では通常のシーン遷移処理の中に先ほどのsceneNameを引数とすることで、
LoadScene("GameScene");のようになる。

**シーン名を取得してその値を使うので、どのシーンでも使うことができます。**

このスクリプトをボタンにつけることによって実装できる。

<h1>感想</h1>
重要なのは、リトライする方法よりも、シーン名取得方法ですね。
シーン名が取得できるので、いろいろ応用できますね。(例えば、シーンによってBGM変えてみたり)
ちょっとずつ読むドメイン駆動設計 まえがき5

# 再設計を積み重ねる

> 継続的なリファクタリングは細かい再設計の積み重ね

リファクタリングはコードをきれいにする、読みやすくする作業と思われがちだけど、本質は『再設計』。
だから・・・

> だが、開発者が確固とした設計原則を持っていないと、理解するのも変更するのも難しいコードベースを作り出してしまう。

『開発者』が設計原則を持つというのが大事かと。

"役割も設計と実装を切り離せない" から当然といえば、当然。

そして、このことは開発初心者も設計原則を学ぶ必要があるということを意味しています。

ということで学びましょう。そしてコードを書きましょう。
> 何かを学ぶためには、自分で体験する以上にいい方法はない。
The only source of knowledge is experience
(アルベルト・アインシュタイン)

学びのベースはいっぱいあります。

- [現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法](www.amazon.co.jp/dp/477419087X)
- [リファクタリング](www.amazon.co.jp/dp/427405019X)
- [オブジェクト指向エクササイズ](https://www.oreilly.co.jp/books/9784873113890/)


継続的なリファクタリングを通じて、顧客の真の要求に適した設計に到達する。
【メモ】EGit使い始めたフレンズのおぼえがき。

### ■まえがきてき

[以前](http://qiita.com/ryo1224/items/34a607a96efb7d32dad3)、GitHubに登録して頑張って英訳しながらチュートリアルをクリアし、
ついにねんがんのりぽじとりをてにいれたフレンズが、EGitに手を出し四苦八苦しながら書き留めるメモ。

いずれ、きちんと体系的に纏めて綺麗な記事に書き起こしたいな、という夢を見る契約者がこれを書いています。

**※メモタグを付けている通り、内容的には全然纏められてないし検証・調査・学習も不十分な、タイトル通りの覚書ですので、ご注意ください。今後、ちょくちょく更新していきます。**


### ■ぎっとぱーくの地図（環境メモ）

- Eclipse *（pleiades-e4.4-ultimate-32bit-jre_20150310.zip）*
- EGitプラグイン
- GitHubリポジトリ *（[前回投稿記事を参照してね！](http://qiita.com/ryo1224/items/34a607a96efb7d32dad3)）*

Eclipseはめんどくさかったので、いわゆる ```all-in-one``` のやつを拾ってきました。

![EclipsePleiades-AllInOne](https://qiita-image-store.s3.amazonaws.com/0/170347/33f25d52-4080-35b5-70c5-456622671715.jpeg)


なお、出来るだけシンプルな環境構成で、必要最小限でやりたい（敷居を下げるために）ので、色々と追加インストールするのは見送りたいと思ってます。

今の所見送っているもの。

- Git自体。
- SourceTree
- TortoiseGit（亀さんは是非とも入れておきたい気がする）

こいつらは一通り触った後で改めて、って感じかなぁ、。
※どう考えても先に入れといた方が良い物だったりしたら、コメントとかで教えてください


### ■今使ってるリポジトリ

https://github.com/sugaryo/sharp4j



### ■ここんとこEGitこねくりまわしてみた所感。

なんか **Git用語とEGit用語（Eclipse上での表記）が異なる** せいで、どれとどれが対応してるのかがイマイチ良く解らない。
これは、もう少し理解が進んだら用語の対応表とか作りたい。（若しくは、探したい）

**今までハマった用語の違い：**

- Gitで言う「リモートリポジトリへプル」する事を、EGitでは「アップストリームへプッシュ」だったりして、なんか・・・うーん。
- Gitで言う「クローン」が「URIの複製」と言うのが・・・。
- Gitで言う「ステージング」が「Git索引へ追加」・・・。


**所感：**

「URIの複製」って言われてもピンとこないし、ユーザフレンドリに表現するなら「URIを指定して複製」とかじゃないかなぁ。。。
ステージングは別名インデックスと言うらしい（それも違和感）ので、たぶんそれを直訳して「索引へ追加」だったりしてるんだろうけど、

ぼく自身が英語苦手なふれんずだから大きな声では言えないけど、、、さすがに直訳過ぎんか・・・(´・ω・`)

それにしても・・・Git/GitHubも初心者なので、EGitが用語を合わせてくれてないのが本当に苦痛・・・、凄く混乱する。(´・ω・`)
詳しくないものと詳しくないものをマッピングしながら試行錯誤してるので、精神的な負担が結構でかいなこれ・・・。



### ■Eclipse設定＞チーム＞Git＞構成＞ユーザー設定

「作成者」と「コミッター」に設定される、ユーザアカウント名とメールアドレスの設定。
デフォルトでは「端末名」と「ログインユーザ名」から **login-name < machine-name >** 形式で推測されるけど邪魔くさい。

**設定するキーと内容：**
- user.name　ユーザアカウント名
- user.email　メールアドレス

![ユーザー設定](https://qiita-image-store.s3.amazonaws.com/0/170347/0dd29095-7910-f593-49fd-2bb478715350.jpeg)


### ■リポジトリのクローンの作り方（作業初手）

まず初っ端。

Gitのパースペクティブを開いて、「Gitリポジトリー」とかいうビューが初期状態でこんな感じになってる筈。

![EGit-Repositry](https://qiita-image-store.s3.amazonaws.com/0/170347/3dc220d6-c0b9-3a5a-d79d-32901ffe44a8.jpeg)

この「Gitリポジトリ―の複製」を選ぶとこんなんが出るので「URIの複製」を選ぶ。
どうやらGit用語で言う所の「クローン」を「URIの複製」と言っているようだ。

![EGit-Clone](https://qiita-image-store.s3.amazonaws.com/0/170347/4afe074d-826d-f284-ebd9-2f7efa47f594.jpeg)

**上の方でも書いたけど、なんか、、、モヤっとする・・・。(´・ω・`)**



### ■SSHまわりがよくわからん。【未解決】

鍵の設定とかは出来たし、GitHub側にも鍵設定した筈なんだけど、SSH認証でうまく動かなかった。
要調査。

現状はとりあえずHTTPSで運用中。



### ■Revertしたい

Subversionで言うところのRevert、変更を元に戻す、とか、何かそういうのを探してみたが見当たらない。

#### 答え：

コンテキストメニューの「チーム」配下を探してたのがダメで、
どうやらEGitでは「置換」メニューからRevertを行うようだ。

「コンテキストメニュー＞置換＞HEAD改訂」と選ぶ事で、変更前の最新ソースに戻す事ができた。

なんか、、、全体的に直感的でないと言うか何と言うか・・・。
Google Spreadsheet用のORマッパー作った

需要があるか分かりませんが、Google Spreadsheet用のORマッパーライブラリを作りました。厳密に言うと、Object-Spreadsheet Mapperですね。

# [Tamotsu(保つ)](https://github.com/itmammoth/Tamotsu)

RailsのActiveRecordみたいに使用できるGoogle App Script用のライブラリです。シートの１行目をカラム名と見立ててDBテーブルの用に扱うことができます。なお`#`はID列です（変更可能）。

![シート例](https://raw.githubusercontent.com/itmammoth/Tamotsu/master/images/Agents001.png)

```js
Tamotsu.initialize();
var Agent = Tamotsu.Table.define({ sheetName: 'Agents' });

var agent = Agent.find(1);
Logger.log(agent); //=>  {#=1.0, First Name=Charles, Last Name=Bartowski, Gender=Male, Salary=100.0, ...}
```

もうちょっと色んなサンプル

```js
// You have to invoke this first.
Tamotsu.initialize();
// Define your table class
var Agent = Tamotsu.Table.define({ sheetName: 'Agents' }, {
  fullName: function() {
    return [this['First Name'], this['Last Name']].join(' ');
  },
});

Agent.first(); //=> {#=1.0, First Name=Charles, ...}
Agent.find(2); //=> {#=2.0, First Name=Sarah, ...}
Agent.last();  //=> {#=3.0, First Name=John, ...}

Agent.find(1).fullName(); //=> "Charles Bartowski"

Agent.where({ Gender: 'Male' })
     .order('Salary DESC')
     .all();  //=> [{#=3.0, First Name=John, ...}, {#=1.0, First Name=Charles}]

Agent.sum('Salary');  //=> 600

Agent.create({
  'First Name': 'Morgan',
  'Last Name': 'Grimes',
  'Gender': 'Male',
  'Salary': 50,
}); //=> {#=4.0, First Name=Morgan, ...}
    //   and the data will be appended to the sheet.

var agent = Agent.where(function(agent) { return agent['Salary'] > 150; })
                 .first(); //=> {#=2.0, First Name=Sarah, ...}
agent['Salary'] = 250;
agent.save(); //=> The salary on the sheet will be updated.
```

# インストール方法

1. スクリプトエディタのメニューから「リソース」→「ライブラリ」を選択する
2. プロジェクトキー(`1OiJIgWlrg_DFHFYX_SoaEzhFJPCmwbbfEHEqYEfLEEhKRloTNVJ-3U4s`) を「ライブラリを追加」の中に入力する。そして追加をクリック。
3. Tamotsuの一番最新のバージョンを選択する
4. 保存する

# 以上

App Scriptでゴリゴリとシートの値を編集するのって結構面倒なので作ってみました。よければ使ってみてください。

* Tamotsu(保つ) - https://github.com/itmammoth/Tamotsu
【PowerBIメモ】インタラクティブな決定木をつくろう！

とある変数（データ）に影響を与える要因を分析したい・・・。
PowerBIでは通常どうしても２～３変数程度の分析・可視化しかできず、歯がゆい思いをしたことがある人もいるかもしれません。

厳密にはベイジアンネットワークとか、構造方程式モデリングとか色々あるのですが、
比較的簡単に実装し、かつクライアントや上司などにも説明しやすい「決定木」をPowerBIで作ってみます！


#対象読者
PowerBIの基本的な操作が分かる
ちょっと統計解析を踏まえたビジュアライゼーションをしてみたい

#データセットの準備
今回は、有名なタイタニック号の死亡・生存データを使います。（暗いデータですみません…）
有名なデータサイエンスのコンテストサイト「kaggle」からダウンロードしましょう。
[https://www.kaggle.com/c/titanic/data](https://www.kaggle.com/c/titanic/data)

#PowerBIに取り込み
データはこんな感じです。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/165789/bf7991b7-ed8a-bb7a-8c4b-30c96520b728.png)

　 

今回はデータセット上の[Survived]の要因を可視化します。
0,1だと分かりづらいので、DAX関数のswithを使い、
生存できたか？⇒　0:No　,　1:Yes　に置き換えましょう。

```
SurvivedJp = SWITCH([Survived],0,"No",1,"Yes")
```
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/165789/5cfed8e0-59a8-32a7-dd67-9788f3ce8ff4.png)




　
#Rcodeを書こう！
データセットの準備が整ったので、Rで決定木を作成するスクリプトを作ります。
実質２行でいいので、ホントに簡単！決定木大好きです。

```DecisionTree.r
library(rpart) #決定木モデルを作るパッケージ
library(partykit) #決定木を描写するパッケージ
dataset.tree <- rpart::rpart(SurvivedJp ~ . - PassengerId, data = dataset, method = "class")
plot(partykit::as.party(dataset.tree))

```
ID以外の投入した変数すべてを説明変数とし、
生存（Yes）と死亡（NO）の結果に影響した順番に、要因を可視化します。

今回は「Sex」,「Age」,「Pclass（客室のランク）」を説明変数に組み込んで、こんな図ができました。
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/165789/665c0828-df19-4db6-9a17-546d4f759b76.png)

普通のPowerBIのビジュアルと比べて寂しいのは見逃してください（笑）
もうちょっと詳しく調べれば、改良できるかも・・・？
　
上記図の見方ですが、まず性別（sex）の男性か、女性かが生存に影響があるようです。
男性は年齢が6.5歳より高いか低いかが生死に影響しているようです。
6.5歳以上なら死亡（No）、
6.5歳以下なら生存（Yes）の割合が高いことがわかります。
一番生存率が高いのは、女性（female）で客室（Pclass）が２等以下のケースのようです。

比較的理解しやくす、説明しやすい決定木はPowerBIに向いているかもしれませんね。
数値データ、カテゴリカルデータいずれも読み込めます。
※もちろん、上記分析結果はその他の要因を検討したりすると、より詳細に区分できるかもしれません。
　あくまで解釈の仕方の一例です。



#決定木がインタラクティブに作れるよ
以前の記事でも取り上げましたが、Rビジュアルがインタラクティブに操作できるのがいいところ。
今回のようにモデル作成のスクリプトをビジュアルに組み込んでおけば、
値フィールドに変数を入れたり抜いたりするだけで分析結果を表示できます。

![メディア1.gif](https://qiita-image-store.s3.amazonaws.com/0/165789/810f9435-14ae-91c2-b885-4e1fbe08c6d6.gif)


#終わりに
以上、PowerBIで決定木を使った要因分析を実施してみました！
Rは、比較的簡単なコードでビジュアライゼーションを実装できるので、ぜひ試してみてください。
通常のPowerBIのビジュアルと組み合わせて使えば、分析用途の幅が広がりますよー。
[クイズ]javascriptと仲良くなるための一歩　第３２話「apply,call」

#整理：applyとcall

```js
function f(){ console.log(this.x); }
var obj = { x:1 }

f();          //=> undefined
f.apply(obj); //=> 1
f.call(obj);  //=> 1
```

```js
var obj = {
           x:1,
           doit: function(){ console.log("Hi! " + this.x); }
          }
var obj2 = { x:2 }

obj.doit();           //=> Hi! 1
obj.doit.apply(obj2); //=> Hi! 2
obj.doit.call(obj2);  //=> Hi! 2
```

#問題「引数の渡し方の違い」

```js
function f(a, b){ console.log("this.x=" + this.x + ", a=" + a + ", b=" + b) }
f(1,2);                //=> this.x=undefined, a=1, b=2
f.apply(?); //=> this.x=10, a=1, b=2
f.call(?);   //=> this.x=10, a=1, b=2
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```js
function f(a, b){ console.log("this.x=" + this.x + ", a=" + a + ", b=" + b) }
f(1,2);                //=> this.x=undefined, a=1, b=2
f.apply({x:10}, [1,2]); //=> this.x=10, a=1, b=2
f.call({x:10}, 1, 2);   //=> this.x=10, a=1, b=2
```
OpenSSLでX.509 v3の証明書を作成する

OpenSSLを勉強して、X.509 v3の証明書を作ってみたかったのでメモ。

## extension fileを作成
以下のファイルを作成します。

```text:v3.txt
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
```

それぞれの値の意味はここら辺にあります。`m(_ _)m`
https://www.openssl.org/docs/manmaster/man5/x509v3_config.html

参考サイト
[https://stackoverflow.com/questions/18233835/creating-an-x509-v3-user-certificate-by-signing-csr](https://stackoverflow.com/questions/18233835/creating-an-x509-v3-user-certificate-by-signing-csr)

## 証明書作成のコマンドを実行
ポイントは`openssl x509`コマンドを実行するときに、`-extfile`オプションを指定することです。
これ「`-extfile v3.txt`」を追加します。

全体としては、以下のコマンドになります。

```:
$ openssl x509 -in server.csr -req -out server.crt -days 365 -signkey server.key -sha256 -extfile v3.txt
```

確認...

```
$ openssl x509 -in server.crt -text | grep Version
        Version: 3 (0x2)
```
Slackで直前のメッセージを置換するslashコマンド

他のチャットツールにもある直前のメッセージ置換機能がSlackにもあります。
ヘルプにはないようです。

`This is a pen.`というメッセージを送信したとして、
`/s/This/That`というslashコマンドを実行すると、
送ったメッセージが`That is a pen.`へと編集されます。

###条件

* 変換元は単語単位で認識される。単語の一部の文字だけを指定しても変換されない
  * 上記なら、`s/Thi/Tha`は変換できない
  * 単語はスペース区切りで認識されるため、日本語メッセージ(スペース区切りではない)の置換は実用的ではない
* 単語は大文字小文字を区別して指定する必要がある
* 1箇所だけ変換できる
* スペースを使うことで複数の単語を変換することもできる
  * 上記なら、`/s/is a pen/cake tastes good` => `This cake tastes good.`
Threejsで正距円筒図法


ThreejsのCubeCameraとPostProcessingを使い、360度映像でよく使われる正距円筒図法（Equirectangular）でレンダリングできるようにした。キャプチャすれば360度動画も作れるだろう。

![image](https://camo.githubusercontent.com/6087f2a5e50e2b5465911695fa8bceffc00a6f29/68747470733a2f2f692e6779617a6f2e636f6d2f62613333326561393162366263656463336139626136336564376164353062312e676966)

## 実装方法
[こちら]( https://github.com/spite/THREE.CubemapToEquirectangular) を参考にした（というかほぼパクリだ）。PostProcessingで使えるようにTHREE.ShaderPassに渡せるシェーダーとして書き直した。THREE.CubeCameraから、samplerCube（キューブ上のテクスチャ）が得られるので、それをglslのtextureCubeというメソッドを使って色取得＆平面にマッピングしている（ようだ）。

```js
//ref https://github.com/spite/THREE.CubemapToEquirectangular

THREE.EquirectanglarShader = {

	uniforms: {
		"map": { type: "t", value: null }
	},

	vertexShader: [
				"varying vec2 vUv;",
				"void main()  {",
					"vUv = vec2( 1.- uv.x, uv.y );",
					"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
				"}"
	].join("\n"),

	fragmentShader: [

				"uniform samplerCube map;",
				"varying vec2 vUv;",
				"#define M_PI 3.1415926535897932384626433832795",
				"void main()  {",
					"vec2 uv = vUv;",
					"float longitude = uv.x * 2. * M_PI - M_PI + M_PI / 2.;",
					"float latitude = uv.y * M_PI;",
					"vec3 dir = vec3(",
						"- sin( longitude ) * sin( latitude ),",
						"cos( latitude ),",
						"- cos( longitude ) * sin( latitude )",
					");",
					"normalize( dir );",
					"gl_FragColor = vec4( textureCube( map, dir ).rgb, 1. );",
				"}"

	].join("\n")

};

```

## 使い方

```js
//準備
equirectanglerEffect = new THREE.ShaderPass( THREE.EquirectanglarShader );
effectComposer.addPass( equirectanglerEffect );
```

```js
//毎フレームcube cameraの結果を渡す
cubeCamera.updateCubeMap(renderer,scene);
equirectanglerEffect.uniforms[ 'map' ].value = cubeCamera.renderTarget;

```

## サンプルコード
https://github.com/kitasenjudesign/THREE.EquirectanglarShader
WordPressで「テーマが壊れてます」といわれた場合の対処法

WordPressのテーマ一覧画面に遷移した時、こんなメッセージが表示された。

__「使用中のテーマが壊れているため、デフォルトのテーマに戻します。」__

これが出ると、WordPressのデフォルトのテーマに強制的になってしまい、サイトレイアウトが崩れてしまう。

## 原因確認
テーマ一覧画面を見てみる。
マルチサイトの場合は、「サイトネットワーク管理」のテーマリンクで閲覧できる。  

この画面上で、なぜ「壊れている」と判定されたのかが記載されている。
自分の場合は、「スタイルシートが見つかりません」と表示された。

## 対処法
WordPressの

>wp-content/themes/{target theme dir}

というディレクトリの配下に

* index.php
* style.css

が存在しない場合、テーマが壊れていると判定されてしまう。  
今回はstyle.cssが存在しないためエラーとなっていた。

style.cssを追加したところ、正常にテーマを読み込めた。
SRE本の日本語訳が出たので印象に残ったフレーズを記録していく

https://www.oreilly.co.jp/books/9784873117911/

まだ第二部(約100頁)しか読めてないのでのちほど追記・まとめ予定。

## どんな本？

- googleの運用チームにおけるいろんなベストプラクティスを束ねた本
- 小論文を束ねたような形式で、ひとりの著者により一貫して書かれた本ではない

## 印象に残ったフレーズ

---

- 『GoogleではすべてのSREに対して、チケット・オンコール・手作業といった運用業務の合計を50%にするよう上限を設けました』
    - 残りの時間はサービス運用のための開発に充てるらしい
    - 「開発／運用の分断による機能不全を回避」
    - 運用業務にかけた時間を測定している

---

- 『DevOps? それともSRE?』
    - この本ではDevOpsを「SREの中核的な方針のいくつかを幅広い組織・管理の構造・個人に対して一般化したもの」として捉えることもできると述べている。

---

- 『サービスの可用性が99.99%ということは、0.01%は利用できないということです。仕様できないことが許容されるこの0.01%が、このプロダクトのエラーバジェットです。このバジェットは超過しない限り、必要に応じて何にでも使うことができます』
- 『エラーバジェットは、SREとプロダクト開発者との間でインセンティブを一致させると共に、共同所有ということを強調します。エラーバジェットによって、リリースの頻度を判断することや、サービス障害に関するステークホルダとの議論を効果的に落ち着かせる』
    - 不稼働率を『使う』というポジティブな言い方に変えているのが面白い。
    - これによって開発に伴う「新しいサービス提供に伴う不稼働率」と運用に伴う「故障等による不稼働率」を同じ土俵に上げて論じている。

---

- 『モニタリングにおいては、アラートの領域のどの部分をとっても人間の解釈が必要であってはならない』
    - 思想は理解するけど難しそうだなあ
    - モニタリング出力を「アラート（すぐ対応）」「チケット（あとで対応）」「ロギング（ログるだけ）」の3段階に仕分けて出力するという思想はよさそう

---

- 『SREは、およそ70%のサービス障害は、動作中のシステム変更によって生じていることを発見しました』
    - 定量的に分かっているの素晴らしい。7割かー

---

- 『キャパシティは可用性にとってきわめて重要なので、SREチームがキャパシティプランニングを受け持つことは自然なことです』
    - 可用性が主でキャパシティが従という考えが面白い。

---

- 『可用性に関する限り、Googleでは通常、時間を基にしたメトリクスは意味を持ちません。（中略）代わりに、私たちはリクエスト成功率という観点から可用性を定義しています。』
    - 可用性といえば時間という思い込みがあったけどそりゃあ場合によって違うか。

---

- 『私たちは概して、値の集合の平均よりも、パーセンタイルを優先的に扱います。そうすることで、データポイントのロングテイルの部分を考慮できるようになります。この部分は（中略）特徴を持っていることが多いのです。』
    - 中央値と平均値ぐらいが一般的かと思っていたけど、パーセンタイルもなかなか一般的なのね。

---

- 『私たちは、閾値を学習したり、自動的に因果関係を検出したりするような「魔法の」システムは避けています。』

---

- 『こういった自動化のステップはすべて価値あるもの（中略）ですが、理想の世界では、外部に自動化の仕組みをもつ必要すらないでしょう、実際のところ、（中略）グルーとなるロジックをまったく持つ必要がないシステムのほうがいいのです。（中略）そうするためには、グルーとなるロジックのユースケースを挙げて、直接アプリケーション内で処理する方法を見つけ出す必要があります。』

---

- 『すなわち、システムが手動、自動、自律という階段を上がっていくについれて、自己検査のための能力がなければ生き残れないのです。』
開発者の心得（新人や未経験者がツールや技術を習得する前に・・・）


##TL;DR
昨今では、プロジェクト管理、コミュニケーション、IDE、DevOpsのツール類が成熟してソフトウェア開発は非常に便利な世の中となってきました。

ですがこれらのツールを使いこなす前に各フェーズ毎の心得を並べてみました。各プロジェクトでフェーズは様々だと思いますが、2週間から1ヶ月くらいのスプリントでチームではなく個人に割り振られたタスクをこなすための心得としています。


##工数見積
> ソフトウェア見積りの主目的は、プロジェクトの結果を予言する事ではない。見積りを行うのは、プロジェクトのターゲットがコントロールによって達成可能な程度に現実的なものかどうかを判断するためである。（スティーブ・マコネル）


+ 仕様書／チケットなどは必ず全て読む、不明点は理解するまで確認する。
（依頼者が記載することで伝えたと思っているケースが多い。ボリュームが大きい場合は依頼者と相談し報告時に確認した箇所を伝える）
+ 見積もりは粒度を細かくすることで精度が向上する。ただ細かくすることで見積もりに時間がかかるため状況に応じて行う。
+ 技術的不安要素がある場合はここで報告する。(改修案件であればソースの確認を怠らないこと)
+ 過去に類似の案件があった場合、算出した工数に乖離がないか確認する。
+ 目的を理解し完成形をイメージする。
+ 工数には設計する時間を考慮する。
（ボリュームによるが、ある程度の設計までイメージできれば尚良い）
+ 報告時には完了見込みスケジュールを添える。（自身の検証も終わりリリースできる状態）

##開発
+ 最初に手を動かさず設計から着手し、開発する順序、効率化を検討する。（テストコードを用意する前提ならこの段階で検討する）
+ 新規モジュールを作成する際は他モジュールを必ず参考にする。
（スタイルガイドがあれば遵守する）
+ コメントはソースを翻訳するのではなく、意味／経緯などを記載する。（コメントも間違っていれば不具合）
+ リリースできる状態をイメージする。（ボタンの位置などの細部は後で行うではなく、基本的にその場で行う。不足機能があっても主となる機能が完成していれば先行リリースが可能となる）
+ スケジュール遅延または工数超過の報告は事後でなく出来る限り早めに相談する。（スコープ内に収まる建設的な提案ができれば尚良い）
+ 技術調査に1時間以上かかる場合は相談する。
+ 開発ボリュームが大きい場合は適度なポイントで進捗を報告する。

## 検証
+ 基本的にこのタイミングではソースファイルを変更してはならない。（検証の意味がなくなる）
+ CIなどテストコードによるテストは主にリグレッションやデータ不整合をカバーするもので仕様バグは防げないことを留意する。
+ 作成ソースのカバレッジは基本的に100%を目指す。
+ 俯瞰的に確認を行い、実際のユーザーが利用する流れ（主目的）は必ず実施。
+ 境界値、水平検証などを検討し工数に見合った検証を行う。
+ 検証は細かく行う方が安心だが、工数に見合った検証を行う。
+ 既存／類似ソースの改修時は必ずDiffを確認する。

## リリース
+ 出来る限り手作業を減らす。
+ リリース後の影響は予め考慮する。
+ リリース後はユーザーに影響が出ない範囲で確認を実施する。
+ リリース後は振り返り、次回に活かす。

## さいごに
アジャイルサムライにて3つの真実として以下が記載されていました。

+ プロジェクト開始時点に全ての要求を集めることはできない
+ 集めたところで要求は必ず変わってくる
+ やるべき事は与えられた時間と資金より多い

上記を見直すと矛盾があり、全てをきちんと行うことは酷であるとも思います。
また各フェーズには様々なツールや手法がありますが、根本は同じで誰もが安心して効率よく品質のよいソフトウェアを開発するためのものです。プロジェクトは多種多様でいろいろな局面がありますが、これら心得を参考にしていただけたら幸いです。
【プログラマーのための統計学】目次 - データサイエンス

# プログラマーのための統計学 - 目次
機械学習を学ぶために必要だと思われるもの、関連しそうな統計学の知識です。
随時追加していきます。

## 関連記事
[【プログラマーのための数学】目次 - 機械学習のために](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)

## 目次
### 度数分布とヒストグラム
- [度数分布とヒストグラム](http://qiita.com/Esfahan/items/93550dab4fd60adb34ee)
- [ローレンツ曲線とジニ係数](http://qiita.com/Esfahan/items/b92ad4468b9e6b3ef0e6)

### 平均値について
- [平均値・中央値・最頻値](http://qiita.com/Esfahan/items/5ca15a334d22007e10ef)
- [平均値の算出方法は1つじゃない](http://qiita.com/Esfahan/items/fec6587bfc0227132856)

### データのばらつきを調べる
- [箱ひげ図](http://qiita.com/Esfahan/items/14811149a047c44956b6)
- [分散と標準偏差と変動係数](http://qiita.com/Esfahan/items/2e70635552d7d661bc6b)
- [共分散と共分散行列](https://qiita.com/Esfahan/items/b7261de0650ab3e7bbd3)

### ベイズの定理
- [事象とは](http://qiita.com/Esfahan/items/8cf3cf819d57e54ef970)
- [条件付き確率と乗法定理](http://qiita.com/Esfahan/items/4b410cebe0ebdce420fa)
- [ベイズの定理](http://qiita.com/Esfahan/items/0dbd81b7a2a0a92157a0)

### 確率変数と確率分布
- [確率変数と確率分布と確率密度関数](http://qiita.com/Esfahan/items/c4f9ddb15fd1957aed0d)

随時追加していきます。
How to re-generate DataSet.Designer.cs with Custom Tool : MSDataSetGenerator

## How to re-generate *DataSet.Designer.cs ##
In case of updating **DataSet.xsd** manually (i.e. editing SQLs ), those changes cannot be reflected to **DataSet.Designer.cs** automatically...

Here is how to fix it

- [ ] close VisualStudio solution/projects
- [ ] update SQL in **DataSet.xsd** with your favorite text editor
- [ ] remove/delete **DataSet.Designer.cs** 
- [ ] open the solution with VisualStudio
- [ ] ! exclamation on **DataSet.Designer.cs** <br> ![b4CustomTool.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/a8633c76-cea4-dc06-250f-438709c81f90.jpeg)
- [ ]  <br>![errCustomTool.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/5d68049b-0898-9329-d6a3-c640432667c4.jpeg)
- [ ] run Custom Tool  <br>![CustomTool.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/3d0bca39-586e-f507-5789-874ef19cd488.jpeg)
- [ ] **DataSet.Designer.cs** auto-generated  <br> ![aftCustomTool.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/92ad2946-6ca0-4db1-47d4-7fe8e9833e91.jpeg)


 :relieved:
ES6のClassの書き方をまとめてみた

## Class構文の基礎

``` javascript:sample
(function() {
  'use strict';
  
  class Country {
    constructor(name) {
      this.name = name;
    }
    greet() {
      return 'Welcome to ' + this.name + '!;'
    }
  }
  const country = new Country('Japan');
  console.log(country.greet()); //　⇛ Welcome to Japan!
})();
```

## 静的メソッド static

Class構文には静的メソッドを定義することができます。
静的メソッドとはClassのインスタンスを作らずとも呼べるメソッドのことを指します。

``` javascript:sample
(function() {
  'use strict';
  
  class Country {
    constructor() {}

    static planet(obj) {
      return obj;
    }
  }
  console.log(Country.planet('地球')); // ⇛　'地球'
})();
```

## get、setの書き方

``` javascript:sample
(function() {
  'use strict';
  
  class Country {
    constructor() {}

    get name() {
      return this._name;
    }

    set name(name) {
      this._name = name.toUpperCase();
    }
  }
  const country = new Country();
  country.name = 'japan';
  console.log(country.name); // ⇛ 'JAPAN'
})();
```

## 継承について


- 「class hoge extends fuga」でhogeにfugaを継承
- 継承元のコンストラクタを呼び出すには「super()」を使う
- 継承元のメソッドを呼び出すには「super()」を使う

``` javascript:sample
(function() {
  'use strict';
  
  class Country {
    constructor(name) {
      this.name = name;
    }
    greet() {
      return this.name + '!';
    }
  }
  
  class City extends Country { // Countryを継承
    constructor(name, city) {
      super(name);　            // Countryのconstructorを継承
      this.city = city;
    }
    greet() {
      return 'I live in ' + this.city + ', ' + super.greet(); // Countryのメソッドを継承
    }
  }
  const liveIn = new City('Japan', 'Tokyo');
  console.log(liveIn.greet()); // ⇛　"I live in Tokyo, Japan!"
})();
```

## 参考サイト

- [CodeGrid ECMAScript 2015の新機能 第4回 Class構文 1](https://app.codegrid.net/entry/es6-4)
- [CodeGrid ECMAScript 2015の新機能 第5回 Class構文 2](https://app.codegrid.net/entry/es6-5)
- [JavaScriptにもクラスがやってきた！JavaScriptの新しいclass構文をマスターしよう](https://html5experts.jp/takazudo/17355/)
Asciidoctor 1.5.6 で :xrefstyle が新規実装


## 概要
表題通りですが、最近、Asciidoctorが1.5.6.1にVer UPされ、クロスリファレンステキストのスタイルを決めるアトリビュートの:xrefstyleが実装されました。

## もう少し詳しい説明
もう少し説明すると、Asciidoctor 1.5.5までは、章節番号や図表番号は自動採番されていましたが、この自動採番された章節図表番号を呼び出す仕組みがありませんでした。つまり、”表＊＊に示すように”、”結果を図＊＊に示す”といった、報告書類などで多用する書き方が出来ませんでした。
（この点、例えばsphinxでは既に可能だったので、明確な弱点となっていたと思います。）

これに対して、[user manual](http://asciidoctor.org/docs/user-manual/#customizing-the-cross-reference-text)に示すように、ｖ1.5.6から可能になった、ということですね。

## 例
使い方は簡単で、ドキュメントアトリビュートとして、xrefstyleを定義したあと、本文中でクロスリファレンスを呼び出すだけ。

```
:xrefstyle: full
```
上記では、fullで定義しています。それ以外にshort、basicが選べます。詳しくは[user manual](http://asciidoctor.org/docs/user-manual/#customizing-the-cross-reference-text)で！

```
<<fig_azarasi>>による。

[[fig_azarasi]]
.close up the azarasi
image::azarasi.jpg[]
```
本文で上記のようにすると、<<fig_azarasi>>の部分が置換され、
```
図 1, “close up the azarasi”による。
```

となります。
コンマとキャプションが邪魔ならshortを選ぶと、
```
図 1による。
```
となります。

## pdfも
asciidoctor-pdfも同時にver upし、1.5.0.alpha.16となっており、この版でxrefstyleが動作するようです。クライアント提出分も書けそうですね。

## 追記
でもうちの環境ではasciidoctor-diagram v1.5.5でうまく動きませんでした。
もともとsvg出力時の日本語使用に難があり、あまり使っていませんが。

## 追記２（2017.9.25）
asciidoctor-diagram v1.5.5ではリグレッションの問題が起きていたようです。⇒[#164](https://github.com/asciidoctor/asciidoctor-diagram/issues/164)
ここに示されたPRを暫定的に適用したら解決しました。

ついでに再確認したところ、SVG出力時の日本語使用の問題についても、asciidoctor-diagramとasciidoctor-pdfで同じ日本語フォントを指定することにより、普通に動作しているようです。
これで、少々気になるなあと思っていた穴が、ふさがった、かな。
リストのインデックスを飛ばした場合の各 LL 言語の挙動の違い

「だから何」という話ではあるんだけども、各言語で挙動が違っておもしろいなぁ、と思ったので。

## JavaScript
``` js
var arr = [];
arr[100] = 'foo';
console.log(arr.length); //=> 101
console.log(arr[0]); //=> undefined
console.log(arr[101]); //=> undefined
```

未定義のインデックスは `undefined` を返す。

`"use strict";` を宣言しても実行結果は変わらない。

## Perl
``` perl
my @arr;
$arr[100] = 'foo';
print $#arr; #=> 100
print defined $arr[0] ? 1 : 0; #=> 0
print defined $arr[101] ? 1 : 0; #=> 0
```

JavaScript と同じく、未定義のインデックスは `undef` になるっぽい。

`use strict;` を宣言しても実行結果は変わらない。

## Ruby
``` ruby
arr = []
arr[100] = 'foo'
p arr.size #=> 101
p arr[0] #=> nil
p arr[101] #=> nil
```

JavaScript / Perl とだいたい同じだが `nil` になる。
`undefined` 相当のものが無いからだと思われる。

## PHP
``` php
$arr = array();
$arr[100] = 'foo';
echo count($arr); //=> 1
echo is_null($arr[0]); //=> 1
echo is_null($arr[101]); //=> 1
```

未定義のインデックスは `null` になる。

配列の長さは 1 になるのが他の言語とは違う。
PHP はリストもハッシュ(ディクショナリ)も `array` なのでこうなるのだと思われる。

### [追記]
未定義のインデックスへのアクセスは `E_NOTICE` レベルのエラーが発生するとのこと。(詳細はコメント欄を参照)

``` php
error_reporting(E_ALL); // E_NOTICE を出力するように設定

$arr = array();
$arr[100] = 'foo';
echo $arr[0]; //=> Notice: Undefined offset: 0
```

## Python
``` python
arr = []
arr[100] = 'foo' #=> IndexError: list assignment index out of range
```

存在しないインデックスに対して参照/代入しようとすると `IndexError` になる。
これが一番素直な挙動な気がしなくもない。
プログラミング 5 か月目

プログラミングを始めて 5 か月が経とうとしています。

　難しい概念も少しずつ理解が進み、以前よりも前進が大きい気がしています。今月はお盆もあり、その間に一気に学習を進めることが出来ました。今回も前回と同じような感じで書いていきたいと思います。

#:pencil2: 進捗状況

**Progate**

PHPⅡ~Ⅳ : オブジェクト指向（完走）
Ruby Ⅳ・Ⅴ ：オブジェクト指向（完走）
Swift : 今まで学習してきた言語の復習のようになってきています

☆ 9月下旬から SQL が新たに登場する予定


オブジェクト指向はかなり苦戦しましたが、一通りは理解できたような気がします。


**ドットインストール**

プログラミング系

Python : Progate よりも詳しいので、より深いところまで学習予定
Go言語・Kotlin　→　トレンドのようなので始めてみることに

コマンドライン系

Git入門・Unix入門： Progate よりも詳しいです
Vim 入門　：Git入門に少しだけ登場したのでついでに学習


※ CODEPREP は8/1 から有料プランを開始しました。無料で出来るものはいくつかあります。


#:pencil2: 新着事項
　5 か月目で新たに取り入れたことや、プログラミングで意識したことを書いていこうと思います。

###:arrow_forward: 覚えたての Unix コマンドを使ってみた
　プログラミングの練習をするとき Cloud 9 で行っているのですが、いつの間にか散在していました。
　
　そこで、ドットインストールで学習した Unix コマンドを使って整理してみたら、思いのほかマウスで操作するよりずっと早く出来るようになっていました。

　最初コマンドラインというのに戸惑って慣れないかもしれませんが、これを覚えるとかなり作業効率が良くなります！



###:arrow_forward: アルゴリズムに興味を持ち始めた
　 良いプログラムを書くために知るべきこととして**「アルゴリズム」**というのがあるようです。「アルゴリズム」という言葉は耳にはしていましたが、具体的にどういうものかは全く知りませんでした。

　最初はプログラミングを覚えてモノにすることに必死だったので、そういうのはあまり意識していませんでした。今は学習も進み一通り落ち着いてきたので、軽い好奇心でアルゴリズムの書籍を買って読み始めました。

#:star: 最後に
　
　オブジェクト指向を一通り理解できたのは、自分にとっては結構大きい気がします。何回も挫折しかけたのですが、あきらめずに続けた甲斐がありました！

　まだ分からないことがたくさんありますが、一日でも早く上達できるように頑張りたいと思います。
VBAでフォルダ再帰読み込んで、EXCELファイルを一つ読み込んでツール

機能仕様：１、フォルダ選択
　　　　　２、フォルダ再帰読み込み
　　　　　３、フォルダ配下全部ファイル読み込み、処理（自分追加）、TXTログファイルをローカルに出力

' シートに追加された処理開始ボタン
'''Private Sub btn_Generate_Click()

    If Len(inputFileFolder.Text) = 0 Then
        Call MsgBox("入力フォルダを入力してください。", vbOKOnly + vbCritical)
        Exit Sub
    End If
    
    Call mainPross(inputFileFolder.Text)

End Sub
' シートに追加されたファイル選択ボタン
Private Sub CommandButton1_Click()
    
    Application.FileDialog(msoFileDialogFolderPicker).InitialFileName = inputFileFolder.Text
    If Not Application.FileDialog(msoFileDialogFolderPicker).Show Then Exit Sub
    inputFileFolder = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
End Sub

※シートにファイルパスを表示用のTEXTBOX追加必要、NAMEはinputFileFolder

モジュールを新規して、下記のソースを書き込み。
Option Explicit

 Dim outSheet As Worksheet
 Dim inputFileFolder As String
 Dim path As String
 Dim fileExFlg As Boolean
 Dim SaveDir As String
  
 Public Sub mainPross(inputFileFolderP As String)
    Windows.Application.ScreenUpdating = False

    SaveDir = "C:\log\"
   ' Set outSheet = ActiveSheet
    
    inputFileFolder = inputFileFolderP
    Call ExecEachFolder(inputFileFolder, "**")
    
 End Sub
 
’入力ディレクトリ再帰して、全部ファイルを繰り返す。
Public Function ExecEachFolder(folderPath As String, kaku As String)
    
    Application.ScreenUpdating = False
    Dim FSO As New FileSystemObject

    ' フォルダ内のファイルを処理する
    Dim fe As FILE
    For Each fe In FSO.GetFolder(folderPath).Files
        Dim folderNm As String
        folderNm = Split(folderPath, "\")(UBound(Split(folderPath, "\")))
            Dim fp As String: fp = fe.path
            Dim en As String: en = LCase(FSO.GetExtensionName(fp))
　　　　　　’ファイル存在の場合、ファイルをOPENして、処理を行う
            doBlogic fe.path
        Set fe = Nothing
    Next

    ' サブフォルダに再帰的に検索する
    Dim fr As Folder
    For Each fr In FSO.GetFolder(folderPath).SubFolders
        Call ExecEachFolder(fr.path, kaku)
        Set fr = Nothing
    Next

    Set FSO = Nothing

a1:     Exit Function
End Function

’ファイルをOPENして、自分の業務処理ロジックを書く
Public Function doBlogic(filepath As String)
    Dim myBook As Workbook
    Dim mySheet As Worksheet
    On Error GoTo 1

    Dim c
    For Each c In Range("k7" & ":" & "k" & Selection.End(xlDown).Row)
       '業務処理（自分追加）
       'ログ出力
       WriteLog c.value
    Next c
1:
End Function

' ログ→TXTファイル出力
Sub WriteLog(msg As String)
    Dim FSO As Object, LOG As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    ''ログファイルがなければ作ります
    If dir(SaveDir, vbDirectory) = "" Then
        MkDir SaveDir
    End If
    If FSO.FileExists("C:\log\SuccessReport.log") = False Then
        FSO.CreateTextFile "C:\log\SuccessReport.log"
    End If
    ''追記で開きます
    Set LOG = FSO.OpenTextFile("C:\log\SuccessReport.log", 8)
    ''日時＋タブ＋メッセージを書き込みます
    LOG.WriteLine Now & vbTab & msg
    Set LOG = Nothing
    Set FSO = Nothing
End Sub
アプリケーションをつなぐIntegromatが素晴らしい


## 今まで実施していたこと

[Zapier](https://zapier.com)を利用し、BacklogのWebhookを利用して自動化を行っていました。
Zapierは、フリープランで以下のような制限があります。

- Zaps(自動化の設定のこと)が5つまで
- 1ヶ月のタスク(Zapsの実行)が100回まで

その為、複数アカウントを作成することで制限を超える度にタスク(Zapierの通知設定のこと)を切り替えていました。
また、WebhookでPOSTするJSONのデータを判定して通知の振り分けがしたいと考えていました。

Zapierでは、JSONを判定するような仕組みは無いので、自分で作るかーと思っていました。

## Integromatを見つけた

[最強連携サービス「Integromat」がZapier/IFTTTをあっさり超えるラスボス感](https://awe-some.net/2016/10/integromat/) でなんかスゴいタイトルだったのでなんだなんだと試してみたら。。。

本当にタイトル通り、あっさり超えて来ました。

基本的なことは、上記の記事でわかりますが、
「WebhookでPOSTするJSONのデータを判定して通知の振り分け」ができる！という機能を見つけました。

ラスボスどころか神でした。

## ZapierとIntegromatを比較した

### [Zapierでできない(または制限があって物足りない)こと]
・フリープランだと、タスクが 100回/月 であること
　→1ヶ月だと120回〜150回程度のタスクが必要そうだったので、物足りない
・Webhookで通知されるJSONパラメータ毎に判定できない
　→単純に通知されたJSONをそのまま通知することしかできない

### [Integromatでできること]
・フリープランでも、タスクが 1,000回/月であること
　→十分足りる
・WebHookで通知されるJSONパラメータに判定文を設定できる
　→新規発行された課題の担当者が◯◯さんの場合、Slackに通知する。ということができる。
　→かなり柔軟性があるので、アイデア次第で色々できそう
・ノンプログラミングでかなりのパターンの通知が作れる
・複数のアプリへ同時投稿が可能

### [Integromatのデメリット]
・全て英語で、日本のGoogle先生に聞いても情報が少ない
・UIがわかりづらい。慣れるまで時間がかかりそう。
　→ [Youtubeのチュートリアル動画(英語)](https://www.youtube.com/watch?v=61HQ_DWoFr8&feature=youtu.be) でなんとか理解した。

## やったこと

Backlogの課題発行時に、任意の担当者にアサインされた場合にSlackに通知する。

### 設定する前に

とりあえず、前述の記事と[Youtubeのチュートリアル動画(英語)](https://www.youtube.com/watch?v=61HQ_DWoFr8&feature=youtu.be) をざっと眺めることをお勧めします。

いきなり触ろうとするとなんだかよくわからなくなって疲れます。（疲れました）

### WebhookをURLを取得する

Moduleと呼ばれるオブジェクトの中で、Gatewayを選びます。
Gatewayでは、任意のデータ構造(Data structure)を追加し、Webhookを作成できます。

![Integromat00001.png](https://qiita-image-store.s3.amazonaws.com/0/6311/bedfdef8-0def-23bb-3c2c-7896d99a22cf.png "Integromat00001.png")

このWebhookを、BacklogのWebhookに登録します。

### JSONを判定する

Gatewayを配置した後、SlackのModuleを配置します。
GatewayとSlackの間にあるスパナアイコンをクリックすると、フィルターが設定できます。

![Integromat00002.png](https://qiita-image-store.s3.amazonaws.com/0/6311/139ee562-d0f2-f2e4-0ed8-8ee673235828.png "Integromat00002.png")

フィルター内のConditionにフォーカスを当てると、設定するJSONがホバーされます。
このJSONパラメータから任意のキーをドラッグ＆ドロップすると、設定できます。

任意の条件(Operatorsのcontent.assignee.userId)を選び、判定したいユーザIDを入力します。
（画像では、コメントが存在していない場合を追加しています）

### テストする

Run once で、1度だけテストすることが可能です。
再生ボタンをクリックし、Backlogで課題を追加すると、Webhookに通知が届き、動作を確認できます。

![Integromat00004.png](https://qiita-image-store.s3.amazonaws.com/0/6311/45e3bba2-bcef-d64f-f7e1-849c4bbd3965.png "Integromat00004.png")


上手く行かない場合は、問題がある箇所でエラー表示されます。

## まとめ

### で、どっちがいい？

単純にJSON判定などなく、Webhookをそのまま通知したい場合で、月のタスクが100未満ならZapierの方が使いやすいです。
複雑な条件で色々試したいのであれば、Integromatが神じゃないかと。
私は、Integromatを使い倒したいと思います。

### 補足

例で出した画像では、
BacklogからWebhook経由でSlackに3パターンの条件分岐を行ない、Trelloにも同時にカード作成してます。
この条件分岐に使ってる Router が肝ですね。

ちょっと走り書きっぽくなりましたが、
いろいろ試したらまた纏めたいなと思っています。
WPF OxyPlotをDataGridと連動させる


グラフが書けるライブラリ「OxyPlot」でトラッカーを動かした時にDataGridも連動させたかったのでやってみた
こんな感じで動いてくれる

![DataGridLinkeOxyPlotSample.gif](https://qiita-image-store.s3.amazonaws.com/0/145898/68752cf7-350f-0d95-3915-74ff618b17be.gif)

※OxyPlotについては[ドキュメント](http://docs.oxyplot.org/en/latest/)みればなんとなくわかると思うのでここでは使い方とかは解説しない
需要があればざっくりの使い方の記事書くかも

# やりかた

前提として、同じデータのコレクションがOxyPlotとDataGirdにバインドされていること

```csharp
    public class PointData
    {
        public double _X{ get; set; }
        public double _YA { get; set; }
        public double _YB{ get; set; }
        public double _YC{ get; set; }
        public double _YD{ get; set; }
        public double _YE{ get; set; }
        public double _YF{ get; set; }
    }
```

サンプルデータはこんな感じにしている
そんで

```csharp
    public class OxyPlot_Behavior : Behavior<Plot>
    {
        #region targetDataGridプロパティ
        public DataGrid targetDataGrid
        {
            get { return (DataGrid)GetValue(targetDataGridProperty); }
            set { SetValue(targetDataGridProperty, value); }
        }
        // Using a DependencyProperty as the backing store for targetDataGrid.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty targetDataGridProperty =
            DependencyProperty.Register("targetDataGrid", typeof(DataGrid), typeof(OxyPlot_Behavior), new PropertyMetadata(null));
        #endregion


        protected override void OnAttached()
        {
            AssociatedObject.ActualModel.TrackerChanged += ActualModel_TrackerChanged;
        }

        protected override void OnDetaching()
        {
            AssociatedObject.ActualModel.TrackerChanged -= ActualModel_TrackerChanged;
        }

        private void ActualModel_TrackerChanged(object sender, TrackerEventArgs e)
        {
            if (e.HitResult == null) return;
            var res = e.HitResult.Item as PointData;
            targetDataGrid.Focus();
            targetDataGrid.SelectedIndex = targetDataGrid.Items.IndexOf(res);
            targetDataGrid.CurrentCell = new DataGridCellInfo(res, targetDataGrid.Columns[0]);
        }
    }
```

こんな感じのBehaviorを作ってDataGridをバインドするだけ
ポイントは、
AssociatedObject.ActualModelのTrackerChangedイベントに処理を書くこと
実際にやってることはイベントから取れるItemの行をDataGrid内から探して、それを選択して移動してるだけ
Viewはこんな感じでバインドする

```xml
<i:Interaction.Behaviors>
    <be:OxyPlot_Behavior targetDataGrid="{Binding ElementName=DataGrid, Mode=OneWay}"/>
</i:Interaction.Behaviors>
```
ヒートマップ生成高速化の試行錯誤

0～255を取る値からヒートマップ（RGB）を算出するプログラムを作っていましたが、
最初に書いたソース（GPU+Cupy）が遅すぎたため、試行錯誤した結果を残します。

**※cv2.applyColorMap(grayscale_image,cv2.COLORMAP_JET)で全て解決でしたが、自作してしまいました（恥）。**

下記は、画像サイズ320x180に対する処理です。
コードは主要部分のみ載せています。
また、ヒートマップは近似値を求める簡易版（三角関数未使用）です
（[値の大きさをサーモグラフィのような色に変換する](http://qiita.com/krsak/items/94fad1d3fffa997cb651)の線形の図）。
![簡易版ヒートマップ](https://lh5.googleusercontent.com/-w2cYDUmcPE8/T2kUVxk59TI/AAAAAAAAAeg/lQw3vA7XL2g/s480/color2.png)

## GPU+Cupy(for)
元々書いていたコードです。
愚直にforで回して処理する[負け組コード](http://hamukazu.com/2013/12/20/tips-on-numerical-computation-in-python-numpy-scipy/)です。

```python
    def conv_v_to_heat(v):
        image = cuda.cupy.zeros((v.shape[0], array.v[1], 4))
        for i, w in enumerate(image):
            for j, h in enumerate(w):
                image[i,j,0] = get_heat_r(array[i][j])
                image[i,j,1] = get_heat_g(array[i][j])
                image[i,j,2] = get_heat_b(array[i][j])
                image[i,j,3] = array[i][j] # アルファは適当

    def get_heat_r(v):
        if v <= 127:
            return 0
        elif v <= 190:
            return (v-127)*4
        else:
            return 255
```
```bash
sec: 20.43495798110962
```

## CPU+Numpy(for)
for使うくらいならGPUやめてしまったほうがまだましなのでは？
と思ってCPUに変えました（ソース省略）。
```bash
sec: 0.6369609832763672
```
CPUのほうが全然速かったです。

## CPU+Numba+Numpy(for)
Numba入れてみました。

```python
    @jit
    def conv_v_to_heat(v):

    @jit
    def get_heat_r(v):
```
```bash
sec: 0.20061397552490234
```
更に速くなりました。

## CPU+Numba+Numpy(filter)
そもそも、Numpyにforを使う時点で負け組なので、
フィルタリングで対処するようにしました。

```python
    def conv_v_to_heat(v):
       image = np.zeros((v.shape[0], v.shape[1], 4))
        image[:, :, 0] = get_r(array)
        image[:, :, 1] = get_g(array)
        image[:, :, 2] = get_b(array)
        image[:, :, 3] = v

    def get_heat_r(v):
        out = np.zeros((v.shape))
        out[...] = 255
        out[(v<=190)] = (v[(v<=190)]-127)*4
        out[(v<=127)] = 0
        return out
```
```bash
sec: 0.0013210773468017578
```
圧倒的に速くなりました。

## CPU+Numpy(filter)
試しに、Numba外してみます。

```bash
sec: 0.001230478286743164
```
あれ、速くなりました。というか誤差レベルです。

## GPU+Cupy(filter)
じゃあGPUは？

```bash
sec: 0.008527278900146484
```
遅くなりました。

## まとめ

| 実装 | time(sec)|
|:--| --:|
|GPU+Cupy(for)|        20.43495798110962|
|CPU+Numpy(for)|         0.63696098327637|
|CPU+Numba+Numpy(for)|   0.20061397552490|
|CPU+Numba+Numpy(filter)|0.00132107734680|
|__CPU+Numpy(filter)__|  0.00123047828674|
|GPU+Cupy(filter)|      0.00852727890015|

CPU+Numpy(filter)が一番でした。
もっと速い実装はあると思いますが、個人的には満足行く速度になりました。
やっぱ、for使ったら負けすね。
[備忘録] 自作のVagrant Boxを小さくする(Debian系)

# 目的
自作のVagrant Boxをpackageするため、package後のファイルサイズが小さくなるようにする

# コマンド
```:bash
# 共有するBoxの場合、Vagrant Boxの鍵をinsecureなmaster keyに置き換えておく
curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub > ~/.ssh/authorized_keys && \
chmod 740 .ssh && \
chmod 640 .ssh/authorized_keys

# sudoして作業するのが面倒なので、
sudo -s
# 最新化
apt -qq update && apt -qq -y upgrade && \
apt -y --purge autoremove && apt autoclean && ¥
rm -rf /var/lib/apt/lists/* && \
apt-get clean

# 共有フォルダーをアンマウントしておく
umount /vagrant
rm -rf /vagrant/*

# /var/log の中を簡単にお掃除
cd /var/log
rm *.gz *.1
for dir in $(find /var/log -maxdepth 1 -type d); do cd $dir; rm *.gz *.1; done

# デフラグする
cd
e4defrag /

# 0埋めする
dd if=/dev/zero of=/EMPTY bs=1M || :; rm /EMPTY

# swapも0埋めする
swap_device_uuid=`sudo /sbin/blkid -t TYPE=swap -o value -s UUID | uniq`
swap_device_label=`sudo /sbin/blkid -t TYPE=swap -o value -s LABEL | uniq`
if [ -n "$swap_device_uuid" ]; then
  swap_device=`readlink -f /dev/disk/by-uuid/"$swap_device_uuid"`
elif [ -n "$swap_device_label" ]; then
  swap_device=`readlink -f /dev/disk/by-label/"$swap_device_label"`
fi
/sbin/swapoff "$swap_device"
dd if=/dev/zero of="$swap_device" bs=1M || :
/sbin/mkswap ${swap_device_label:+-L "$swap_device_label"} ${swap_device_uuid:+-U "$swap_device_uuid"} "$swap_device"

# もっかい /var/log をお掃除
find /var/log -type f | while read f; do echo -ne '' > $f; done

# historyを削除
echo "" > ~/.bash_history ; history -c
exit
echo "" > ~/.bash_history ; history -c
```
GulpでPugとSassをビルドしてBrowserSyncでライブプレビューする

2017年夏季時点の自分用の定番としてメモ。

※以下はGulp3の内容です。[Gulp4に対応した内容を新たに書きました。](https://qiita.com/KazuyoshiGoto/items/3059c99330cdc19e97ad)

## 前提

Nodeとnpmは扱えるものとします。

### ディレクトリ構成
```
dist/
├css/
└js/
src/
├pug/
└sass/
gulpfile.js
package.json
```
distに生成物、srcに編集用ファイルの構成。
pugビルド後のHTMLファイルはdist直下に作られる。

## nodeモジュール
```
npm i gulp -D
npm i gulp-notify -D
npm i gulp-plumber -D
npm i gulp-sass -D
npm i gulp-autoprefixer -D
npm i gulp-pug -D
npm i browser-sync -D
```

ビルドとライブプレビュー以外に、`gulp-plumber`と`gulp-notify`でエラー時の通知もするように。

## gulpfile

```gulpfile.js
var gulp = require('gulp');
var notify = require("gulp-notify");
var plumber = require("gulp-plumber");
var sass = require('gulp-sass');
var autoprefixer = require('gulp-autoprefixer');
var pug = require('gulp-pug');
var browserSync = require("browser-sync");

//setting : paths
var paths = {
  'scss': './src/sass/',
  'css': './dist/css/',
  'pug': './src/pug/',
  'html': './dist/',
  'js': './dist/js/'
}
//setting : Sass Options
var sassOptions = {
  outputStyle: 'compressed'
}
//setting : Pug Options
var pugOptions = {
  pretty: true
}

//Sass
gulp.task('scss', function () {
  gulp.src(paths.scss + '**/*.scss')
    .pipe(plumber({ errorHandler: notify.onError("Error: <%= error.message %>") }))
    .pipe(sass(sassOptions))
    .pipe(autoprefixer())
    .pipe(gulp.dest(paths.css))
});

//Pug
gulp.task('pug', () => {
  return gulp.src([paths.pug + '**/*.pug', '!' + paths.pug + '**/_*.pug'])
    .pipe(plumber({ errorHandler: notify.onError("Error: <%= error.message %>") }))
    .pipe(pug(pugOptions))
    .pipe(gulp.dest(paths.html));
});

//Browser Sync
gulp.task('browser-sync', () => {
  browserSync({
    server: {
      baseDir: paths.html
    }
  });
  gulp.watch(paths.js + "**/*.js", ['reload']);
  gulp.watch(paths.html + "**/*.html", ['reload']);
  gulp.watch(paths.css + "**/*.css", ['reload']);
});
gulp.task('reload', () => {
  browserSync.reload();
});

//watch
gulp.task('watch', function () {
  gulp.watch(paths.scss + '**/*.scss', ['scss']);
  gulp.watch([paths.pug + '**/*.pug', '!' + paths.pug + '**/_*.pug'], ['pug']);
});

gulp.task('default', ['browser-sync', 'watch']);
```

あとは `gulp` で実行。

## 補足
Sassはファイル名が `_` で始まるファイルはデフォでビルドされないがPugはビルドされてしまうので、Sass同様にファイル名が `_` で始まる場合はビルドから除外しています。
特定のSSIDの電波強度RSSIを表示する（raspberry pi(linux)）

rasbperry piにはiwconfigがあるけど、現在接続してないSSIDの強度が欲しかったので作る。
:::cd ../../usr/local/bin
:::sudo nano getsi

```shell-session:getsi
#!/bin/sh
sudo iwlist wlan0 scan | grep -e ESSID -e Quality
```
:::sudo chmod a+x getsi
できてるはず。
　　↓もっと楽な方法 (私が作りたいシステムではaliasじゃ動かなかったため、上のも残しておく)
<blockquote>[特定のSSIDの電波強度を表示する（mac）][a]のコメントにて指摘があった方法、aliasコマンドを利用することで、上のコマンド登録作業は不必要になります。

```
alias getsi="sudo iwlist wlan0 scan | grep -e ESSID -e Quality"
```
はいおしまい　これでgetsiの登録は完了（早）
</blockquote>


getsi叩いて確認しましょ。

私はプログラムの中で使いたかったので↓のようにテストしてみてます。

```python:test.py
import subprocess as spc
res=spc.check_output("getsi")
lis=res.split()
ss=lis.index('ESSID:"探したいSSID"')
ss=ss-2
ra=lis[ss].split("=")
RSSI=abs(int(ra[1]))
print RSSI
```

macと同じで0に近い方が電波強度は良いということですな。

python上でコマンド動かして出力を整形してるだけ（強引）

aliasでうまく動かなかったときは、
```unalias getsi```でそのコマンドを消して、上にあるようにパスのところに書き込む方式にすればうまくいくはず。
 
 [a]:http://google.com "Title"
linuxサーバで取得されたoracleDBのデータは読みにくいの対策

teratermにで、sqlplusをログインして、取得されたデータ（まだはteratermで保存のログ）は読みにくい
対策：
１、下記ソースをgetdata.sqlに書いて、linuxのDBに格納して、

SET ECHO ON
SET FEEDBACK OFF
SET HEADING ON
SET PAGESIZE 0
SET LINESIZE 6000
SET colsep ,
SET TERMOUT OFF
SET TRIMSPOOL ON

SPOOL /tmp/DB_20170818.txt

--TABLE_NAME1
SELECT * FROM TABLE_NAME1 where TIME >= '17-08-10 10:00';
--TABLE_NAME2
SELECT * FROM TABLE_NAME2 where TIME >= '17-08-10 10:00';
SPOOL OFF

２、teratermでDBをログインして、getdata.sqlを行って、DB_20170818.txtにデータを出力します。データの各列はカンマで分割されているんので、読みやすいです。
sqlplus user/password
@getdata.sql