OmniAICreator/Qiita-1.07M huggingface dataset:
Cling on Jupyter [C++] 環境づくり

# はじめに

**2020/06/29追記** : 以下の内容は古く 2020/06/29 現在では再現できないものとなっています. (バイナリ配布ページからバイナリが消えていたため.)

　C++がJupyter上で動かせるという話を聞いて実行してみたいと思ったのですが環境構築に手間取ったので書いておきます。（他の記事に書いてあるとおりにやったらエラーが出て断念）
　このやり方は記事を探してもがいていて、手法を組み合わせたらなんとなくできたものなので正規のやり方では無い可能性の方が高いです。そのことを承知の上ご覧ください。
<a href="https://github.com/root-project/cling">Cling - The Interactive C++ Interpreter - GitHub</a>

# 環境
- Ubuntu16.04 LTS
- Python3 (install済み)
- Jupyter (install済み)

# Clingダウンロード
<a href="https://cdn.rawgit.com/root-project/cling/master/www/index.html">Cling's Web Page</a>
上のリンクがClingの公式ページです。HOMEの下の方にDOWNLOADがあるので、<a herf="https://root.cern.ch/download/cling/">そのリンク</a>先から自分のOSに合ったものをダウンロードします。
　自分はcling_2018-03-02_ubuntu16.tar.bz2をホームディレクトリにダウンロードしました。

```
~/cling_2018-03-02_ubuntu16.tar.bz2
```

まず、解凍・展開します。

```
$ cd ~
$ bzip2 -d cling_2018-03-02_ubuntu16.tar.bz2
$ tar xvf cling_2018-03-02_ubuntu16.tar
```

すると、`cling_2018-03-02_ubuntu16/`ができます。

# Cling実行
まずは普通にClingを実行してみます。

```
$ ./cling_2018-03-02_ubuntu16/bin/cling

****************** CLING ******************
* Type C++ code and press enter to run it *
*             Type .q to exit             *
*******************************************
[cling]$ 
```

指示どおり`.q`あるいは`Ctrl+c`を実行すると抜けます。
次にこのパスを通しておきましょう。<username>は自身のユーザー名に置き換えてください。

```
$ export PATH=/home/<username>/cling_2018-03-02_ubuntu16/bin:$PATH
```

　ただ、これではシェルを閉じてしまえばまた実行しなければならなくなるのでログインシェルの一番下あたりに上の一文を追加しておくといいと思います。
　たとえば、bashを使っていれば`.bashrc`ファイルを開いて一番下に追記

# Jupyter-kernel準備
それではJupyter上で実行できるようにします。
（sudo権限が無いといけなかったので更新しました。

```
$ cd cling_2018-03-02_ubuntu16/share/cling/Jupyter/kernel
$ sudo pip3 install -e .
$ sudo jupyter-kernelspec install --user cling-cpp11
$ sudo jupyter-kernelspec install --user cling-cpp14
$ sudo jupyter-kernelspec install --user cling-cpp17
```

# Jupyter実行
```
$ cd
$ jupyter-notebook
# (または jupyter notebook)
```
さて、ここまでやればJupyter上で実行できることが確認できます。
ちゃんとKearnelもReadyになりました。

- C++11
- C++14
- C++17

が確認できればOKです。
![cling-on-jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/195174/c40c2025-f560-bdef-5e59-5b50c806cdd8.png)


![cling-on-jupyter_sample.png](https://qiita-image-store.s3.amazonaws.com/0/195174/98c3b3ed-2487-5512-cec7-822412eca6bc.png)


今回はこんな感じです。
お疲れ様でした。

# 参考
<a href="http://shuvomoy.github.io/blog/programming/2016/08/04/Cpp-kernel-for-Jupyter.html">C++ Kernel for Jupyter Notebook</a>
github projectsのissueをモーダルで開くchrome extension

github projectsでは、waffle.ioやzenhub、zubeのようにカードからissueをモーダルで開くことができません。
github projectsのissueをモーダルで開くchrome extensionを作りました。

## 使い方
1. 使い方は以下からextensionをインストールする。
https://chrome.google.com/webstore/detail/open-modal-github-project/epnkdndkebiemmlilflelekhipnienpi

2. github projectsを開く
3. issueのリンクをクリック

だけです。

## デモ
github projectsでissueのリンクをクリックすると以下の用にissueがモーダルで表示されます。

<img width="1919" alt="open_modal_github_projects_issue.png" src="https://qiita-image-store.s3.amazonaws.com/0/74514/f7ffcf1e-8235-71fd-a15a-d433156a84cf.png">


<img width="1919" alt="スクリーンショット 2018-03-03 22.09.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/74514/8524631e-ca25-27a9-efeb-4e0b109ccfdf.png">


## コード
コードは以下のリポジトリ
https://github.com/katsuyan/open_modal_github_projects_issue

## まとめ
github projectsのissueをモーダルで開くchrome extensionを作りました。
まだまだ、今は単純にモーダルでissueを表示するだけとなっています。また、一部errorが発生してしまっています。今後も修正・開発を行っていきます。
UbuntuでDual Shock4 コントローラを振動させる

UbuntuでPS4用のDual Shock4 V2を振動させる方法です。

##環境
- Ubuntu 16.04 LTS
- Linux Kernel: 4.13.-36-generic
- DS4との接続：USB, Bluetoothどちらでも可能

##接続したDS4のイベント番号を確認する

ターミナルで以下のコマンドを実行し、Ubuntuで認識されているデバイスを確認します。

```bash
$ cat /proc/bus/input/devices
```

すると以下のような結果が表示されます。

- USB接続の場合
![USB.png](https://qiita-image-store.s3.amazonaws.com/0/172499/f26296cd-7c6b-b109-9b09-f9d13fb79058.png)

- Bluetooth接続の場合
![Bluetooth.png](https://qiita-image-store.s3.amazonaws.com/0/172499/bdde7efa-e3c9-1d01-4a3f-44a4fe59015a.png)

ここから、Wireless Controllerという名前のeventを探します。Handlerの箇所で確認できるevent番号は、USB接続、Bluetooth接続ともに__event24__となっていることが分かります。

###DS4の振動コマンド
fftestに先ほど確認した__event24__を指定して実行します。

```bash
$ fftest /dev/input/event24
```
すると以下のような表示がターミナルに現れます。

![fftest.png](https://qiita-image-store.s3.amazonaws.com/0/172499/4e723bb4-b4e8-71f2-fb85-625015b99bc5.png)

下側に__Uploading effect__と書かれている行の最後に__OK__と
表示されている振動をDS4へ指示することができます。

この場合だと以下の３つの指示ができます。
1. #0のPeriodic sinusoidal
2. #4のStrong rumble, with heavy motor
3. #5のWeak rumble, with light motor

0,4,5の数字をいずれかをターミナルに入力すると、DS4を振動させることができます。


このように、DS4を振動させることが出来れば、自分のプログラムでDS4を振動させることが出来ます。
こちらについてはまた次回。
PocketMine-MPでAsyncTaskを使ってみる

#まずAsyncTaskとは
AsyncTaskは別スレッドで動くタスク、サーバーのスレッドとは切り離されているもの。
IOとかに使う。

##'AsyncTask'はどのあたりがうれしいのか
非同期だから、サーバーに影響がないこと
例えばデータベースのデータを取得するとき、同期的な処理(onEnableから直接呼び出したりするとき)だと固まる。特にデータの数が多い時は非常にまずい。
そういったときに使えるのがAsyncTask

###サンプルコード
https://gist.github.com/famima65536/00e655754585016d59dddbaaa69950c5 より

```php5:SampleCode

<?php
/**
 * Created by PhpStorm.
 * User: tokai
 * Date: 2018/03/01
 * Time: 19:35
 */
namespace MasterF\PocketMineGUI\task;
use pocketmine\scheduler\AsyncTask;
use pocketmine\Server;
class GUIConnectionTask extends AsyncTask
{
    /**
     * Actions to execute when run
     *
     * @return void
     */
    public function onRun()
    {
        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        socket_connect($sock, "127.0.0.1",20132);
        $message = socket_read($sock, 512, PHP_NORMAL_READ);
        $this->setResult($message, false);
    }
    public function onCompletion(Server $server)
    {
        $message = $this->getResult();
        $server->getLogger()->info("From PocketMineGUI: ${message}");
    }
}
```

このコードではソケットを使っているため、`socket_connect()` `socket_read()`の部分で一時的に動作が止まる
もし、これをサーバーと同じスレッドで実行してしまうとサーバーに入れないどころか、サーバー自体の動作も停止してしまう。
そのためにIO関連ではAsncTaskを使う。
しかしうれしくない点もある。

##onRunの中ではサーバー側のスレッドにアクセスできないこと
一見便利に見えるがonRunの中ではサーバー側のメソッドなどが実行できない。
その対策として`onComplete()`と`setResult(), getResult()`がある。
これらを使うことでこの問題は解決する

`onComplete()`はAsyncTaskの実行が終了してから呼び出される。このメソッドはサーバーと同じスレッドで動くため、サーバー側のアクセスすることが可能だ。
`setResult(), getResult()`を活用すると`onRun`と`onComplete()`の間で値の橋渡しができる
これでサーバー側に結果を送り付けることができる。やったぜ。

こんな感じでAsyncTaskの使い方の解説を終わります。
MySQL で特定のユーザのプロセスを一括で削除する

結論から

```
mysql -h {DB_ENDPOINT} {DB_NAME} -u {USER_NAME} -p -N -e "SELECT GROUP_CONCAT(ID) FROM information_schema.PROCESSLIST WHERE \`USER\` = '{USER_NAME}';"| awk '{print $1}' | xargs -I{} mysqladmin kill {} -h {DB_ENDPOINT} {DB_NAME} -u {USER_NAME} -p
```

# MySQL
`-N` のオプションをつけることで、ヘッダー出力をさせないようにすることができます。

`-e` のオプションで任意のSQLを実行。

`SELECT GROUP_CONCAT(ID) FROM information_schema.PROCESSLIST WHERE \`USER\\` = '{USER_NAME}';`
特定ユーザの実行プロセスを取得してカンマ区切り(,)で表示

# awk
`awk '{print $1}'` 取得結果が　`| 1,2,3,4 |` のようになるので真ん中だけ取得するために実行

# xargs
`-I` のオプションで引数として渡す位置を指定できるパラメータを指定。今回は `{}`

# mysqladmin
mysql のコマンドではプロセスキルの kill を複数IDに対して実行できなかったが、mysqladminなら実行できたので使用。
【初学者向け】Pythonプログラムを作成＆実行する方法

#目的
Pythonプログラムをファイルで保存し実行する。
 インストールは[【初学者向け】Pythonのインストール方法(GUI Windows)](https://qiita.com/ryo_xsjsj/items/673d284cc360a7dde02c)で。

#エディタの準備
調べてみると多数ありますが、、

- IDLE  
 Python標準エディタであり本体と同時インストールされる。なんか色々できそう。
  
> IDLEというのを起動すると、スクリプト書いて実行したり、ファイル開いて実行したり、コマンドプロンプトを起動したりできます。
> タスクバーにピン止めしておくと便利です。

- sakuraエディタ  
 直観的で軽いのが良い。タイプ別設定でキーワード強調も可。  
 お試しには充分か。
- Visual Studio Code

>Visual Studio Code is a ***lightweight but powerful*** source code editor which runs on your desktop and is available for Windows, macOS and Linux. It comes with ***built-in support***...

- Eclipse  
 重そう。。
- Atom  
など  

Visual Studio Codeを使っていきたいと思います。
(イマイチ使い方が解っていませんが)

#作成→実行方法
1. 下記内容で、「test1.py」ファイルとして保存します。  
    
    ```python:test1.py  
    from datetime import datetime  
    dt = datetime.today()  
    print('今日は%s年%s月%s日' % (dt.year, dt.month, dt.day))  
    ```
1. VSCodeを使っているので右クリック「ターミナルでPythonファイルを実行」を選択

    ```:結果
    今日は2018年3月3日
    ```

拡張子を「py」とすることでPythonのPGと見做されます。
AndroidアプリからTwitterの公式クライアントのツイート画面をIntentで起動する

Twitterクライアントを作っていると全ての機能を作り込むのが大変で、公式のクライアントに処理を任せたい時があります。

公式のツイート画面を開きたい時は以下のURIをIntentに渡せば大丈夫です。

```Java
Uri uri = Uri.parse("https://twitter.com/intent/tweet");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
```

正式には [Tweet Web Intent](https://dev.twitter.com/web/tweet-button/web-intent) という機能を実現するためのURIのようですが、Intentという名前だけあって公式クライアントも対応しているようです。
Truffleでデプロイ時「Network up to date.」しか表示されない

Truffleでデプロイする際、 `Network up to date.` しか表示されずデプロイされない場合があります。

```bash
$ truffle deploy
Using network 'development'.

Network up to date.
```

以下2つのどちらかの対策で改善する、はず。

# 対策1
`--reset` オプションを使う。

```bash
truffle deploy --reset
```

# 対策2
`build`以下をすべて削除してからデプロイしてみる。

```bash
rm -fr ./build/*
truffle deploy
```

# 備考
- 以下の環境で再現
    - Parity: `1.9.4`
    - Truffle: `4.1.0`
データの有効行を２行取得する速度に関して。

### テストデータ
```js

let data=`






Results update in real-time as you type.
Supports JavaScript & PHP/PCRE RegEx.
Roll over a match or expression for details.
Save & share expressions with others.
Use Tools to explore your results.
Browse the Reference for help & examples.
Undo & Redo with ctrl-Z / Y in editors.
Search for & rate Community patterns.
`;
```
### まず幾つかパターン
```js

let a=data.split(/\r?\n/).filter(d=>d.length!=0).slice(0,2).join('\n')
console.log(a)
let b=data.trim().split(/\r?\n/).slice(0,2).join('\n');
console.log(b)
let c=data.match(/.+\r?\n.*\r?\n/).join('')
console.log(c)
//=>Results update in real-time as you type.
//Supports JavaScript & PHP/PCRE RegEx.
```

### たいてい上述の３つで事足りるが、データ数の見通しがない場合、splitの全分割やregexの*は一度最後までデータを読み取ってしまう。

データの小見出しが欲しい場合、常識の範囲内で先に切ると、一万文字くらいから速度差がでる。

```js
let lim=1000,x=data.slice(0,lim)
let d=x.match(/.+\r?\n.*\r?\n/).join('')||x
console.log(d)
```

### 結果
https://jsperf.com/two-line
Truffleが「Deploying Migrations...」で止まる場合の対策

Truffleでデプロイする際、 `Deploying Migrations...` の表示で止まってしまい先に進まなくなる場合があります。エラーも表示されません。

```bash
$ truffle deploy --network development
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...


```
いくら待っても何も起きない。

# 原因
- 指定したアカウントがロック解除されていない
- そもそもアカウントを指定してない

## 指定したアカウントがロック解除されていないの対策
アカウントのロックを解除します。

### truffleから作業
※ `web3.personal.unlockAccount` はgethの独自実装のためparityで利用する場合は `--geth` オプションを付加してgeth互換モードで利用する必要あり。

```bash
$ truffle console --network development
truffle(development)> web3.personal.unlockAccount("0x7ad8f90cfa071c8420e3f09fe0e413d0c47502e6", 'YOURPASSWORDHERE')
```

geth互換モードを利用しないparityに対して上記関数をコールすると以下のようなエラーが出ます。

```bash
Error: Method not found
    at Personal.send [as unlockAccount] (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/method.js:145:1)
    at RequestManager.send (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:61:1)
    at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)
```


### Parity起動時にunlockする場合

起動オプションに`--unlock`を追加して対象アカウントを指定。

```bash
parity --config node0.toml --unlock 0x7ad8f90cfa071c8420e3f09fe0e413d0c47502e6
```

## そもそもアカウントを指定してない場合の対策
アカウントを明示します。
truffleはデフォルトでcoinbaseを使用する(?)ようですが、`truffle.js`の`from`で明示することも可能です。

```js
...
    },
    development: {
      host: "10.1.0.8",
      port: 8545,
      network_id: "*",
      from: '0x7ad8f90cfa071c8420e3f09fe0e413d0c47502e6'
    },
    test: {
...
```


# 備考
- 以下の環境で再現
    - Parity: `1.9.4`
    - Truffle: `4.1.0`
- Parityで発生したがGethでも発生するかも？
OSSの枯れ具合をJupyterで可視化する

ついこないだ、Azure NotebookでNISTをスクレイピングしてCVEからCVSSだけ取得するスクリプトを書いたが、JVNはキーワード検索すれば、ヒットした脆弱性ごとのCVSSスコアも出力されるので、matplotlibで可視化してみた。

https://jvndb.jvn.jp/search/index.php?mode=_vulnerability_search_IA_VulnSearch&lang=ja&keyword=ISC+BIND

例えば定期的にお騒がせなICS BINDは、こんな感じ。昔からあったんだなぁ。

![isc_bind.png](https://qiita-image-store.s3.amazonaws.com/0/33389/d9faf7cf-44c3-af49-22c3-8ab90b6f07f5.png)

OpenSSLも、お盛ん。しかも2016年頃は満点が続いてた。

![openssl.png](https://qiita-image-store.s3.amazonaws.com/0/33389/a0bdf56c-1ede-7891-9cae-0af3a547f684.png)

Struts御大も、グラフだけ見ると、まだまだ現役な感じ。

![struts.png](https://qiita-image-store.s3.amazonaws.com/0/33389/d3ccd66b-97bf-e508-8bf9-6b505c31eaec.png)

本当は、このデータを元に、そろそろ枯れてきたかな、という指標を機械学習で取り出せればと思ったが、パッと見て、そういう雰囲気に見えないのが残念なところ。

コードとレンダリングイメージはgithubに置きました。Jupyterにコピペすれば、他のOSSも調べられます。

https://github.com/usopyon/jupyter_sectools/blob/master/keyword2cvss.ipynb
３次元空間で不等式条件を満たす格子座標の描画

３次元空間で不等式条件を満たす領域を，格子点を使って描画したい．[MATLAB Answers](https://jp.mathworks.com/matlabcentral/answers/298341-3d-plotting-of-five-inequalities) の回答を参考にして作ったソースコードと出力したグラフをここに示す．

#ソースコード

```test.py```
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as cl

#各軸の格子座標の作成
x = np.arange(-5,5,0.2)
y = np.arange(-5,5,0.2)
z = np.arange(0,5,0.2)

#格子座標（点）の作成
xx, yy, zz = np.meshgrid(x,y,z)

#不等式条件の指定し、各格子座標が条件を満たすかを確認する．
c1 = np.sqrt(pow(xx-1,2)+pow(yy-2,2))<1
c2 = zz<xx+yy
c3 = 1<zz

#全ての不等式条件を満たす格子座標のインデックスを取得
idx=c1&c2&c3

#３次元のグラフの作成
fig = plt.figure()
ax = Axes3D(fig)

#不等式条件を満たす格子点のみを描画
ax.scatter(xx[idx],yy[idx],zz[idx],'o',edgecolors='k',depthshade=True)
ax.set_aspect('equal') #X-Y平面のみ軸のアスペクト比を等倍にする。

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.tick_params(labelsize=6)

ax.view_init(15,-102)
plt.show()
```
#出力結果
![Figure_1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/241729/1a7ea95e-c469-08f4-9f91-d0b22d134345.jpeg)

各格子点のマーカーの色を奥行に応じて濃淡を変えるために，scatter関数の引数で「depthshade=True」と明示しているが，実際はデフォルトで指定されている．マーカーの色には濃淡がついているものの，境界を描画していないので少々分かりにくい．
MySQLのGRANTコマンドでパスワードを設定するときの「PASSWORD」について

## 概要
- なんとなくコピペで使っていた、MySQLのユーザを作るときのコマンドの「IDENTIFIED BY」の箇所について
- 「PASSWORD」という文字列を付ける/付けないで挙動が変わるのを知らず、
- エラーに苦しんでいた

## 環境
- MySQL 5.5/5.6

## 実行したSQL

```
mysql> GRANT USAGE ON *.* TO 'arnold'@'%' IDENTIFIED BY PASSWORD 'dbpass';
```

## エラー
- MySQL 5.6

```
ERROR 1827 (HY000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.
```

- MySQL 5.5

```
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number
```

## 原因
- 下記のMySQLドキュメントに書いてありました。
- ユーザのパスワードを設定する部分「IDENTIFIED BY PASSWORD」について、「PASSWORD」を付けると、パスワード文字列をハッシュ化した後の文字列を指定する。
- 「PASSWORD」を付けないと平文でのパスワード文字列を指定する。

## MySQLのドキュメント
- [6.3.5 アカウントパスワードの割り当て](https://dev.mysql.com/doc/refman/5.6/ja/assigning-passwords.html)

```
CREATE USER または GRANT では、
PASSWORD() でパスワードに返されるハッシュ値がわかっている場合に、
平文パスワードの送信を回避できます。
前にキーワード PASSWORD を付けたハッシュ値を指定します
```
## おまけ
- パスワードのハッシュ化した文字列

```
mysql> SELECT PASSWORD('dbpass');
+-------------------------------------------+
| PASSWORD('dbpass')                        |
+-------------------------------------------+
| *9FB2126F7514B6AF42B20E9E4B8E839B72E31396 |
+-------------------------------------------+
1 row in set (0.00 sec)
```
irb起動がrbreadline.rbで失敗する

## 問題
irbでEncoding.default_externalの設定変更や、日本語文字を含む正規表現などを試していたあと、irbがエラーで起動できなくなった。

```
C:\WINDOWS\system32>irb
C:/Ruby24-x64/lib/ruby/site_ruby/rbreadline.rb:6135:in `delete': invalid byte sequence in UTF-8 (ArgumentError)
        from C:/Ruby24-x64/lib/ruby/site_ruby/rbreadline.rb:6135:in `alloc_history_entry'
        from C:/Ruby24-x64/lib/ruby/site_ruby/rbreadline.rb:6168:in `add_history'
        from C:/Ruby24-x64/lib/ruby/site_ruby/readline.rb:368:in `<<'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:76:in `block (2 levels) in load_history'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:76:in `each'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:76:in `block in load_history'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:75:in `open'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:75:in `load_history'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:65:in `extended'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:21:in `extend'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:21:in `init_save_history'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:45:in `save_history='
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/context.rb:92:in `initialize'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb.rb:412:in `new'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb.rb:412:in `initialize'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb.rb:383:in `new'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb.rb:383:in `start'
        from C:/Ruby24-x64/bin/irb.cmd:19:in `<main>'
```
## 解決
~/.irb_history から、日本語文字が含まれる行を削除したら起動できるようになった。
awkによるマッチング（ワンライナー）

#マッチング
ExcelのVlookup関数のようにawkでも簡単にマッチングができます。しかもワンライナーでできます。
#データサンプル
```
[root@akirakikaku tmp]# cat a
a  232
b  999
c  655
d  888
f  755
[root@akirakikaku tmp]# cat b
544 a hjhgjgh
110 c fdgdfg
997 d jhgjhg
554 e jhgjhgjghdd
[root@akirakikaku tmp]#
```
#awkマッチング…同一レコード表示
- aファイルの1列目とbファイルの2列目をマッチング
- 同一レコードのみ表示

```
[root@akirakikaku tmp]# cat a | awk 'BEGIN{ while((getline < "b") > 0){key[$2]=$0}} key[$1]{print $0,key[$1]}'
a  232 544 a hjhgjgh
c  655 110 c fdgdfg
d  888 997 d jhgjhg
[root@akirakikaku tmp]#
```

#awkマッチング…aファイルと同一key
- aファイルの1列目とbファイルの2列目をマッチング
- aファイルはすべて。bファイルは同一レコード。

```

[root@akirakikaku tmp]# cat a | awk 'BEGIN{ while((getline < "b") > 0){key[$2]=$0}} {print $0,key[$1]}'
a  232 544 a hjhgjgh
b  999
c  655 110 c fdgdfg
d  888 997 d jhgjhg
f  755
[root@akirakikaku tmp]#
```
#awkマッチング…bファイルと同一key
- aファイルの1列目とbファイルの2列目をマッチング
- bファイルはすべて。aファイルは同一レコード。

```
[root@akirakikaku tmp]# cat b | awk 'BEGIN{ while((getline < "a") > 0){key[$1]=$0}} {print $0,key[$2]}'
544 a hjhgjgh a  232
110 c fdgdfg c  655
997 d jhgjhg d  888
554 e jhgjhgjghdd
[root@akirakikaku tmp]#
```
#awk解説
```
cat a | \
  awk '
    BEGIN{ 
      while((getline < "b") > 0){   # bファイルを全部読み込み
        key[$2]=$0                  # 連想配列
      }                             # 2列をキーにしてレコード全体を格納
    } 
    {                             # aファイルのレコード全体と
      print $0,key[$1]            # キーが存在している連想配列を出力
    }'
```
Raspberry Pi 3 Model Bに最新のNode.jsとnpmをインストールする[公式準拠]

#問題点

Raspberry Pi 3の初期状態だと、以下を実行しても最新のNode.jsはインストールされない。

```
sudo apt update
sudo apt install nodejs npm
```

#情報はあるが…

「Raspberry Pi 3 Node.js 最新」で検索すると、
以下の情報が上位で出てくる。


しかし、以下の記事のように行っても、最新バージョンはインストールされなかった。
(使用環境が異なるのか、情報が現状に合わなくなったのかは不明)

[Raspberry PiにNode.jsとnpmの最新版をインストールする](https://qiita.com/mascii/items/77c685df65c4cbca9315)
[第三回 Raspberry Pi 3に最新のNode.jsをインストールする](https://qiita.com/setouchi/items/437e4b62e4210871496f)

#公式の情報を確認する
やはり、日本語の情報源だけではなく、
英語だが、公式の情報を確認することにした。

[Installing Node.js via package manager]
(https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)

Raspberry PiをRaspbianで動かしている場合、OSはLinuxのDebianベースであるので、
その項目を確認すると以下のコマンドでインストールできることが分かった。

```
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
```

代わりに、Node.js 9をインストールしたい場合は以下を実行する。

```
curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs
```

#最後にバージョンの確認
インストール後にきちんと最新のNode.js, npmがインストールされているか、
以下のコマンドでバージョンを確認できる。

```
nodejs -v
npm -v
```
画像や写真を、テレビに映ったように加工する方法。[python,PIL,tkinter使用]

画像や写真を、テレビに映ったように加工するプログラムを書きました。


![python テレビ.png](https://qiita-image-store.s3.amazonaws.com/0/240301/2879e9ba-fe44-272f-f817-bcb4950c5edf.png)

この画像を見てもらうと分かると思いますが、このようなテレビを近づいてみたときのような模様を再現するのが今回のプログラムです。

本来ならば１つのピクセルで３色分の情報を表現するところを、３種類のピクセルで３色の情報を表現しています。

以下がそのプログラムです。

```py

from PIL import Image
import os, tkinter.filedialog, tkinter.messagebox

root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo('','テレビ風にしたい画像を選んでください')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

im = Image.open(file)
size =im.size
im2 = Image.new('RGB', size)

vr=70
for y in range(size[1]):
    for x in range(size[0]//3):

        r=(im.getpixel((x*3, y))[0]+im.getpixel((x*3+1, y))[0]+im.getpixel((x*3+2, y))[0])//3
        im2.putpixel((x*3, y), (r, vr, vr))

        g=(im.getpixel((x*3, y))[1]+im.getpixel((x*3+1, y))[1]+im.getpixel((x*3+2, y))[1])//3
        im2.putpixel((x*3+1, y), (vr, g, vr))

        b = (im.getpixel((x*3, y))[2]+im.getpixel((x*3+1, y))[2]+im.getpixel((x*3+2, y))[2])//3
        im2.putpixel((x*3+2, y), (vr, vr, b))

im2.show()
im2.save("TV01.png")

tkinter.messagebox.showinfo('',"テレビ風にして保存しました")
```

以上が「画像や写真を、テレビに映ったように加工する方法」でした。
openFrameworksでshaderにUniformArrayで渡す方法

arrayで渡す時にやり方がよくわからなかったのでメモ

# コード


## int/floatの場合
- 1個目の要素のポインタを渡す。

```c++:main.cpp
ofShader shader;

vector <float> nums;

for (int i = 0; i < 10; i++) {
    nums.push_back(ofRandom(1));
}

// 第二引数にmatの1個目,第三引数にcountを渡す
shader.setUniform1fv("nums", &nums[0], nums.size());
```



```glsl:fragment.glsl
#version 150

uniform float nums[10];

```


## vecの場合
- 1個目のvecのx要素のポインタを渡す。

```c++:main.cpp
ofShader shader;

vector <glm::vec4> vectors;

glm::vec4 vec1;
glm::vec4 vec2;
glm::vec4 vec3;

matrices.push_back(vec1);
matrices.push_back(vec2);
matrices.push_back(vec3);

// 第二引数にmatの1個目,第三引数にcountを渡す
shader.setUniform4fv("vectors", &vectors[0].x, matrices.size());
```



```glsl:fragment.glsl
#version 150

uniform vec4 vectors[3];

```

## matの場合
- 1個目のmatを直接渡す。

```c++:main.cpp
ofShader shader;

vector <glm::mat4> matrices;

glm::mat4 mat1;
glm::mat4 mat2;
glm::mat4 mat3;

matrices.push_back(mat1);
matrices.push_back(mat2);
matrices.push_back(mat3);

// 第二引数にmatの1個目,第三引数にcountを渡す
shader.setUniformMatrix4f("matrices", matrices[0], matrices.size());
```



```glsl:fragment.glsl
#version 150

uniform mat4 matrices[3];

```

# まとめ
- matの時だけmatそのものを渡す
- それ以外は1個目の要素のポインタを渡す

#　おまけ
openglの場合

```c++:main.cpp
ofShader shader;

vector <glm::mat4> matrices;

glm::mat4 mat1;
glm::mat4 mat2;
glm::mat4 mat3;

matrices.push_back(mat1);
matrices.push_back(mat2);
matrices.push_back(mat3);

// 第二引数にcountの1個目,第四引数に1個目のmatの[0][0](要するにGLfloatの配列の1個目)のポインタを渡す
glUniformMatrix3fv(shader.getUniformLocation("matrices"), matrices.size(), GL_FALSE, glm::value_ptr(matrices[0]));

// glm::value_ptr(matrices[0])はglm::value_ptr(matrices[0][0][0])やglm::value_ptr(matrices[0][0].x)と同義

```


以上です。間違ってたらコメントお願いします🙇
npmとかnode.jsとかサーバーサイドJSとかってなんぞ


`npm`と`node.js`と`Javascript`の関係性がよく分からないので簡単な説明。  
詳しくは参考リンクを参照のこと!!

## node.js

- サーバーサイド用Javascript の言語処理系のこと。
    - サーバーサイド用Javascriptってなんやねん。
        - ブラウザで動くJavascript(いつもjsファイルに書いているやつ)と似てるようで実は違うJavascript
        - モジュールの読み込みができたりするんです。
        - `node`コマンドで実行でき、`Browserfy`を使ってブラウザで動くJavascriptに変換できる
    - 言語処理系ってそもそもなんやねん
        - プログラミング言語で記述されたプログラムをPCで実行するためのソフトウェア。  
      .pyファイルはpythonの言語処理系、.goファイルはgolangの言語処理系で実行するよね。
    - `node`コマンドで`REPL`(Read Eval Print Loop: 対話的実行環境)が出て来るよ(pythonコマンドみたいな感じ)

```
$ node
> var name = 'nekootoko3';
undefined
> name
'nekootoko3'
> console.log(name);
nekootoko3
undefined
> .exit
$
```

- 引数に.jsファイルを持って来ると。

```nekootoko.js
var name = 'nekootoko3';
console.log('Soy ' + name + '!');
```
```
$ node nekootoko.js
Soy nakootoko3!
```

## npm

- パッケージ管理ツール
    - pythonでいうところのpip、rubyでいうところのgem
    - 例のnode.js(サーバーサイドJS)をブラウザで動くjsに変換するツールをインストールするぞ！

```
# パッケージをグローバルにインストール
$ npm install -g  browserify
/usr/local/bin/browserify -> /usr/local/lib/node_modules/browserify/bin/cmd.js
+ browserify@16.1.0
added 140 packages in 7.915s
```


## 参考

- [npm とか bower とか一体何なんだよ！Javascript 界隈の文脈を理解しよう](https://qiita.com/megane42/items/2ab6ffd866c3f2fda066)
- [言語処理系とは](http://www.hpcs.cs.tsukuba.ac.jp/~msato/lecture-note/comp2001/comp1/lecture1.htm)
Scala の HttpClient の使い方 (Post)

次の Java プログラムを scala で書いてみました。
[Java の HttpClient の使い方 (Post)](https://qiita.com/ekzemplaro/items/4cc3d228ad1514ab36a7)

```scala:Http_post.scala
// -----------------------------------------------------------------------
/*
	Http_post.scala


					Jun/12/2021
*/
// -----------------------------------------------------------------------
import java.io.IOException
import java.io.UnsupportedEncodingException
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets
import java.util.ArrayList
import java.util.List
import org.apache.http.HttpStatus
import org.apache.http.NameValuePair
import org.apache.http.client.ClientProtocolException
import org.apache.http.client.entity.UrlEncodedFormEntity
import org.apache.http.client.methods.CloseableHttpResponse
import org.apache.http.client.methods.HttpPost
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients
import org.apache.http.message.BasicNameValuePair
import org.apache.http.util.EntityUtils

// -----------------------------------------------------------------------
object Http_client {

def runSample() = {
	System.err.println ("*** runSample *** start ***")

	var charset = StandardCharsets.UTF_8

	var httpclient = HttpClients.createDefault()
		
	var request = new HttpPost("https://httpbin.org/post")		
	var requestParams = new java.util.ArrayList[NameValuePair]()
	requestParams.add(new BasicNameValuePair("user","jiro"))
	requestParams.add(new BasicNameValuePair("password","123456"))
		
	println ("requestの実行　「" + request.getRequestLine() + "」")
		
	var response:CloseableHttpResponse = null

	try {
		request.setEntity(new UrlEncodedFormEntity(requestParams))
		var response = httpclient.execute(request)
			
		var status = response.getStatusLine().getStatusCode()
		println("HTTPステータス:" + status)
			
		if (status == HttpStatus.SC_OK){
			var responseData = EntityUtils.toString(response.getEntity(),charset)
			println(responseData)
			}

		} catch {
			case e: ClientProtocolException => e.printStackTrace()
			case e: UnsupportedEncodingException => e.printStackTrace()
			case e: IOException => e.printStackTrace()

		} finally {

			try {
				if (response != null) {
					response.close()
				}
				if (httpclient != null) {
					httpclient.close()
				}
			} catch {
				case e: IOException => e.printStackTrace()
			}
		}

	System.err.println ("*** runSample *** end ***")
	}
}

// -----------------------------------------------------------------------
object Http_post {

def main(args: Array[String]) {
	System.err.println ("*** 開始 ***")

	Http_client.runSample()

	System.err.println ("*** 終了 ***")
	}
}

// -----------------------------------------------------------------------
```

```text:Makefile
LIB=/usr/share/java
HTTPCLIENT_JAR=.:$(LIB)/httpclient-4.5.13.jar:$(LIB)/httpcore-4.4.14.jar
Http_post.class: Http_post.scala
	scalac -cp $(HTTPCLIENT_JAR) Http_post.scala
clean:
	rm -f *.class
```

実行コマンド

```bash
LIB=/usr/share/java
HTTPCLIENT_JAR=$LIB/httpclient-4.5.13.jar:$LIB/httpcore-4.4.14.jar:$LIB/commons-logging-1.2.jar
export CLASSPATH=.:$HTTPCLIENT_JAR
#
scala Http_post
```
python sorted keyparameterについて

pythonのkeyparameterについて、今まで曖昧な理解だったが下記のサイトで理解が深まった。

http://interactivepython.org/runestone/static/pip2/Sort/Optionalkeyparameter.html

書いてあることは、sorted(iterable,key=function name)
このような場合、iterableの各項目に対して、key=で指定されたfunctionに放り込まれる。
でその帰ってきた結果を元の値に関連付けされ、それに対してsortされる。
Scala の HttpClient の使い方 (Get)

次の Java プログラムを scala で書いてみました。
[Java の HttpClient の使い方 (Get)](https://qiita.com/ekzemplaro/items/0d23455c9930caa4c069)

```scala:Http_get.scala
// -------------------------------------------------------------------
//	Http_get.scala
//
//					Jun/12/2021
//
// -------------------------------------------------------------------
import java.io.IOException
import java.io.UnsupportedEncodingException
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets
import org.apache.http.HttpStatus
import org.apache.http.client.ClientProtocolException
import org.apache.http.client.methods.CloseableHttpResponse
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients
import org.apache.http.util.EntityUtils


// -------------------------------------------------------------------
object Http_client {

def runSample() = {
	System.err.println ("*** runSample *** start ***")

	var charset = StandardCharsets.UTF_8
		
	var httpclient = HttpClients.createDefault()

	var request = new HttpGet("https://httpbin.org/get")

	println	("requestの実行　「" + request.getRequestLine() + "」")
		
	var response:CloseableHttpResponse = null

		
	try {
		response = httpclient.execute(request)
			
		var status = response.getStatusLine().getStatusCode()
		println("HTTPステータス:" + status)
			
		if (status == HttpStatus.SC_OK){				
			var responseData = 
					EntityUtils.toString(response.getEntity(),charset)				
			println(responseData)
			}
		} catch {
			case e: ClientProtocolException => e.printStackTrace()
			case e: UnsupportedEncodingException => e.printStackTrace()
			case e: IOException => e.printStackTrace()

		} finally {

			try {
				if (response != null) {
					response.close()
				}
				if (httpclient != null) {
					httpclient.close()
				}
			} catch {
				case e: IOException => e.printStackTrace()
			}

		}

		System.err.println ("*** runSample *** end ***")
	}
}


// -------------------------------------------------------------------
object Http_get {

def main(args: Array[String])
{
	System.err.println ("*** 開始 ***")

	Http_client.runSample()

	System.err.println ("*** 終了 ***")
}
}

// -------------------------------------------------------------------
```

```text:Makefile
LIB=/usr/share/java
HTTPCLIENT_JAR=.:$(LIB)/httpclient-4.5.13.jar:$(LIB)/httpcore-4.4.14.jar
Http_get.class: Http_get.scala
	scalac -cp $(HTTPCLIENT_JAR) Http_get.scala
clean:
	rm -f *.class
```

実行コマンド

```bash
LIB=/usr/share/java
HTTPCLIENT_JAR=$LIB/httpclient-4.5.13.jar:$LIB/httpcore-4.4.14.jar:$LIB/commons-logging-1.2.jar
export CLASSPATH=.:$HTTPCLIENT_JAR
#
scala Http_get
```
Raspberry Pi+pyenvな環境にOpenCVをインストールする

以下の環境にOpenCVをインストールした際、CMakeにはまったので記録として残しておきます。

* RaspberryPi本体はRaspberryPi 3 Model B
* OSは2017-11-29-raspbian-stretch-lite
* Pythonはpyenv管理下の3.6.4
* OpenCVは3.4.1

## はまりポイント
参考サイト「Optimizing OpenCV on the Raspberry Pi」を参考にしてもPython 3向けのビルドを行ってくれない。
（解決方法としては参考サイト2番目に記載されたcmakeのオプション群でした）

## 参考にしたサイト

* Optimizing OpenCV on the Raspberry Pi
    * https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/
* Install opencv3 for python 3.5.0 with pyenv on ubuntu 14.04
    * https://gist.github.com/pohmelie/cf4eda5df24303325b16
* Installation in Linux
    * https://docs.opencv.org/3.4.1/d7/d9f/tutorial_linux_install.html

## 依存パッケージのインストール
詳細は参考にしたサイト「Optimizing OpenCV on the Raspberry Pi」を参照してください。

## CMakeのオプション例
ポイントはLIBRARYやINCLUDEの指定のようです。
これでpyenvのPython 3.6.4向けにOpenCVをビルドすることができました。

~~~console
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=~/.pyenv/versions/3.6.4 \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.1/modules \ \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_legacy=OFF \
-D PYTHON_EXECUTABLE=~/.pyenv/versions/3.6.4/bin/python \
-D PYTHON_LIBRARY=~/.pyenv/versions/3.6.4/lib/libpython3.6m.a \
-D PYTHON_INCLUDE_DIR=~/.pyenv/versions/3.6.4/include/python3.6m \
-D PYTHON_INCLUDE_DIRS=~/.pyenv/versions/3.6.4/include/python3.6m \
-D PYTHON_INCLUDE_DIRS2=~/.pyenv/versions/3.6.4/include/python3.6m \
-D INCLUDE_DIRS=~/.pyenv/versions/3.6.4/include/python3.6m \
-D INCLUDE_DIRS2=~/.pyenv/versions/3.6.4/include/python3.6m \
-D PYTHON_PACKAGES_PATH=~/.pyenv/versions/3.6.4/lib/python3.6/site-packages \
-D PYTHON_NUMPY_INCLUDE_DIR=~/.pyenv/versions/3.6.4/lib/python3.6/site-packages/numpy/core/include ..
~~~
統計学入門(東京大学出版会)第三章　メモ

・相関はX・yの相互関係を表し、回帰はXからyが決定される様子や程度をあらわす。
・２つのデータ間の関係を見るとき、それぞれのデータがともに量的データであるなら散布図を書けばよいが、どちらか一方又は両方質的データの場合は**分割表**を用いる。また、量的データであったも、適当に階級分けをすれば、分割表が完成する。これを**相関表**と呼ぶ。**相関表**はデータの大きさが大きくて散布図にした時に同じ位置に大量の点が重なる場合に有効な方法である。
・一般的に相関係数と呼ぶときはピアソンの**積率相関係数**を示す。相関係数は相関の程度を示すには便利であるが、散布図を書いて確かめないと誤解を生む。(p48図を参考)
・因果関係があるにもかかわらず相関係数が０になることもある。相関と因果は異なる。
・見かけ上の相関・疑似相関が疑わしい場合には**偏相関係数**を用いる。
・積率相関係数はデータがともに量的変数である場合に用いられるが、質的データが混ざっている場合にはつかえない。
かわりに**順位相関係数**を使う。スピアマンの順位相関係数かケンドールの順位相関係数のどちらかが使われる。
また、簡約統計数値表をみるとどの程度から相関があると判断できるかの数表が書かれている。
・**決定係数**とは独立変数Xが従属変数yを決定する強弱の度合いを表している。そして相関係数の２乗である。
Jupyter Notebook起動時に、インポート・matplotlibの設定を自動実行する

「Pythonではじめる機械学習」に、以下の記述があります。

> 本書を通じてNumPy、`matplotlib`、`pandas`を多用する。すべてのコードは次のようにインポートしていることを仮定する。
>
```python
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
from IPython.display import display
```
> さらに、Jupyter Notebookで、マジックコマンド`%matplotlib notebook` (中略) を使っていることも仮定している。

これらの文・コマンドを、Jupyter Notebookでノートブックを開いた時に自動実行します。

# 設定

## ipythonプロファイルを作成する
`ipython profile create amuller-notebook`
を実行します。`~/.ipython/profile_amuller-notebook/ipython_config.py`が作成されるので、

```python
## lines of code to run at IPython startup.
#c.InteractiveShellApp.exec_lines = []
```

の部分に、実行したい文・コマンドを記述します。

```python
## lines of code to run at IPython startup.
c.InteractiveShellApp.exec_lines = [
    'import numpy as np',
    'import matplotlib.pyplot as plt',
    'import pandas as pd',
    'import mglearn',
    'from IPython.display import display',
    '%matplotlib notebook'
]
```

## Jupyter Notebookが読み込むプロファイルを指定する
`/usr/local/share/jupyter/kernels/python3/kernel.json` の`"argv"`に、`"--profile=amuller-notebook"`を追加します。

以上で設定完了です。

![スクリーンショット 2018-03-03 19.53.42.png](https://qiita-image-store.s3.amazonaws.com/0/87150/0379e1ce-91b8-d0a2-87b4-e29c3972e12b.png)


# 参考
Andreas C. Müller, Sarah Guido, 中田秀基(訳), 2017, *Pythonではじめる機械学習*, オライリー・ジャパン, p.11
[Github: ipython Issue #9866](https://github.com/ipython/ipython/issues/9866)
ポインタ

*教育実習(みたいなもの)でつかった資料が見つかったのでメモ。いつか再編したい。*

# メモリ
コンピュータがデータを扱う時、その殆どは一旦メモリへ保存される。
関数も変数もなにもかも、基本的にはまずメモリへ置かれると考えれば概ね問題ない。

メモリはコンピュータにとっての作業机のようなものだ。
例えば

```
int i = 0;
```

という一文は、実はメモリという名の作業机に「i」という場所を用意させ、その中身に「0」を入れさせている。

# アドレス
人間と違って、コンピュータは融通が利かない。

先程メモリのことを作業机と例えた。
人間が机へ物を置く時、その位置を細かく考えることはないだろう。しかしコンピュータはそうはいかない。どこに置くか細かく指定しなければならない。

"コンピュータの作業机"メモリには、番号が振られている。
将棋やチェスの対局をみたことがあるなら話は早いだろう。「先手3四歩」とか、「ナイトをHの3へ！」とか、ああいうのと基本は同じだ。

プログラミング言語における「変数」というのは、「3四」とか「Hの3」とかいう代わりに、そのマス目に名前をつけて、どのように扱うかを記録したものだということができる。
この「3四」だの「Hの3」だのというものをアドレスと呼ぶ。

先の
> 作業机に「i」という場所を用意

という指示は、実際には「適当なアドレスに場所を確保させて、その場所に "i" という名前をつけておく」ということを意味する。

# ポインタ
これまでで変数 i を用意した。
通常であれば、この変数 i を経由してデータを操作していればよい。
しかし時として、変数 i を経由したくないとか、変数 i の隣のデータを触りたい、という需要が発生する……ことがある。

そんな時に使うのが**ポインタ**である。
ポインタは「あるメモリ・アドレス」を「変数の値」として持つ、ちょっと特殊な変数である。

先の変数 i が実際に参照していたのをメモリ・アドレス A0 であると仮定しよう。
変数 i のポインタを取得すると、そこには A0 が記録されている。

ポインタには2つの特性がある。

1. ポインタのもつアドレスは足し引きできる。  
たとえばアドレス A0 に +1 して、A1 とすることができる。
2. ポインタのもつアドレスを辿り、そのアドレスに格納されている情報へアクセスすることができる。  
たとえば変数 i のポインタ ip を使用すると、変数 i のもつデータへアクセスできる。

(配列が 0 から始まるのはこれが理由で、例えば配列 a の一番目が 0 なのは、実は配列 a のポインタ ap に +0 したものにアクセスしなさい、ということから来ている)
JQLの副問い合わせ　エピック>タスク>サブタスクを抽出するフィルタ

こんにちは。
先日、とあるイベントでLTやったら意外とウケたので、こちらの記事にアップすることにしました。

Jiraのフィルタの話です。

# サブタスクチケットは便利
突然ですが、サブタスクって、便利ですよね！
スクラムボードだとバックログには現れないけどアクティブフスリンドカンバンボードには親子関係が見えやすく表示されますし。
親チケットの詳細画面からもチケット編集操作ができたり。

# サブタスクチケットにはエピックリンクを設定できない問題がある
ただ、どうしても不便なことがあります！
サブタスクにはエピックリンクを設定できないのです！

そんな問題を解消する策の一つを紹介します。

##チケット構成の例
 <img width="400" alt="チケット構成.png" src="https://qiita-image-store.s3.amazonaws.com/0/215534/4de80b64-102b-719c-22cf-ba27254e050c.png">

### JIRAのシステム管理チームでの例
 - 利用チームから要望などを「問い合わせ」チケットで受け取る
 - 対応を考えるためのチーム内タスク管理に「タスク」「QA」「課題」を使う
 - JIRA設定変更などの要望への対応内容を「ストーリー」として提供する
 - ストーリーを実現するための個別タスクを「サブタスク」に分割する 
 - これらを「エピック」でまとめる

## 一部のエピックだけ抽出したい時ってあるけどこれが厄介
<img width="830" alt="problem.png" src="https://qiita-image-store.s3.amazonaws.com/0/215534/4ed03015-d99e-df9c-c8c3-26b4be413d01.png">

### サブタスクにはエピックリンクを設定できない問題
<img width="350" alt="subtask.png" src="https://qiita-image-store.s3.amazonaws.com/0/215534/024736be-1cc7-3744-9061-5d2c62509235.png">



# フィルタの副問い合わせを活用して解決しよう！
簡単4ステップです。
① エピックを抽出するフィルタを作る
② エピックリンクしてるチケットを抽出する
③ ②のチケットのサブタスクを抽出する
④ 上記①〜③をくっつける


## ① エピックを抽出するフィルタを作る
```text:filter=10000
Key in (“JIRAPJ-10”,”JIRAPJ-20”)
```
<img width="865" alt="filter10000.png" src="https://qiita-image-store.s3.amazonaws.com/0/215534/6d15c736-63f2-8b3a-8508-7546d890fb2a.png">


## ② エピックリンクしてるチケットを抽出する
```text:filter=10010
issueFunction in linkedIssuesOfAll(“filter=10000” , "is Epic of")
```
<img width="371" alt="filter10010.png" src="https://qiita-image-store.s3.amazonaws.com/0/215534/5ed36f24-f03c-885d-a16a-da7656197faf.png">


## ③ ②のチケットのサブタスクを抽出する
```text:filter=10020
issueFunction in subtasksOf("filter=10010")
```
<img width="369" alt="filter10020.png" src="https://qiita-image-store.s3.amazonaws.com/0/215534/58b1b6b2-cdce-e9ca-f009-5c5035e3a7aa.png">


## ④ 上記①〜③をくっつける
```text:filter=10030
filter in (“filter=10000”,” filter=10010”, “filter=10020”)
```
<img width="865" alt="filter10030.png" src="https://qiita-image-store.s3.amazonaws.com/0/215534/b455df98-82bd-04db-ae12-2f7a5d97f430.png">


# 必須プラグイン ScriptRunner for Jira
チケット間の関連を扱うにはこれ！
issuefunction in linkedIssuesOfAll()

今回の記述は、ScriptRunner for JIRA Ver4.3.16 以降で利用可能

# おわりに
JQLはまだまだいろんな書き方ができそうですね。
Jupyter Notebookのショートカットキーをカスタマイズする

`~/.jupyter/nbconfig/notebook.json`を編集してカスタマイズできます。

# 設定例
```
{
    "keys": {
        "edit": {
            "bind": {
                "Ctrl-J": "jupyter-notebook:run-cell-and-select-next"
            }
        }
    }
}
```
`Ctrl + j`で、現在カーソルがあるセルのコードを実行し、次のセルに移ります。

# コマンド名の調べ方
コマンド名（`jupyter-notebook:run-cell-and-select-next`の部分）は、コマンドパレット（Mac:`⌘⇧P` Win: `Ctrl+Shift+p`）を開いて、コマンド欄の右のほうにマウスオーバーすると確認できます。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/87150/d3069889-d819-38ae-0e18-deeba0de9d7a.png)

# 参考
[Jupyter Notebook Docs: Customize keymaps](http://jupyter-notebook.readthedocs.io/en/stable/extending/keymaps.html)
Ubuntu16.04LTSのインストール時にディスク一覧に何も表示されない場合の対処法

Windows10を入れていたノートPCにUbuntu16.04LTSをインストールしようとしたときに思わぬところでつまづいたのでメモを残します。

# 環境
Sony SVT1111AJ
HDD + SSD構成のノートPC
（SSDはキャッシュ領域に設定されており、ストレージとしては利用できなかった）

# やったこと
https://bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1064151
原因と対処法がここに書いてあった。

原因はHDDとSSDがRAID構成になっていたこと。これを解除すればインストールできる。
今回はデュアルブート構成にしようとしたけど、試行錯誤してたら全部データ消えちゃったためクリーンインストールした。

- USBでLiveCDを作成して起動する。
- ターミナルを開き、`sudo dmraid -r -c`と入力する。
- RAID設定されているディスク一覧が表示されるので次のコマンドで全部消す。  
  今回は`/dev/sda`と`/dev/sdb`が表示されたため、どちらも削除する。
- `sudo dmraid -r -E /dev/sda`
- `sudo dmraid -r -E /dev/sdb`
- 通常通りインストール:thumbsup:
テストパッケージを分けている場合のカバレッジ取得方法

```shell:この投稿での最終形
go test -coverpkg={テスト対象パッケージ} [-coverprofile=coverage.out とか] ./...
```

----

Go ではテストのカバレッジ率を `go test -cover` で取ることができます。
が、パッケージの分け方によっては、ちょっとオプションを追加しないと想定したカバレッジが取れない（無視される）場合があります。

# テスト対象のディレクトリ構成

次のようにディレクトリを作っているものとします。

ちなみに、テスト対象のパッケージ名は「gli」で、ライブラリです。

```shell
> tree /F /A
.
|   テスト対象.go        (package gli)
|   ちょっとした_test.go (package gli)
|
\---test
        色々な_test.go  (package test)
```

実際にはそれぞれ複数の .go ファイルがあるのですが、ここでは簡略化しています。

見ての通り、テストが複数のディレクトリ複数のパッケージにまたがっています。
（テストファイルが多いと見辛いので、ディレクトリを分けたかったんです）

## サブパッケージを含めたテストは、go test ./...

カバレッジとは関係なしに、テストだけをしたい場合であっても、`go test` とすると、
ルートにある「ちょっとした_test.go」か、test ディレクトリにある「色々な_test.go」のいずれかのテストしか実行されません。

これは、`go test` のデフォルトのテスト対象がカレントディレクトリだからです。
「色々な_test.go」もテスト対象とするためには、ルートで `go test ./...` とします。

# 単純に go test -cover ./... するとダメ

上のノリで、カバレッジ率を取る場合に `go test -cover ./...` としてもうまくいきません。

```shell
>go test -cover ./...
ok      bitbucket.org/shu/gli   (cached)        coverage: 42.6% of statements
ok      bitbucket.org/shu/gli/test      (cached)        coverage: 0.0% of statements
```

3行目、test パッケージのテストカバレッジが 0.0% になっています。:fearful:

一方で、実はちゃんと test パッケージのテストは実行されています。
(`-v` オプションを追加することで分かります。ここでは載せませんが)

## -coverpkg オプションが必要

原因については推測なんですが、（デフォルトでは）カバレッジの取得対象がテストパッケージそのものになっているからと思われます。
というのも、今回のテスト対象パッケージである gli （ルート . にあるパッケージ）に含まれているテストについてのみカバレッジが取得できていますし。

で、`-coverpkg` オプションとして テスト対象パッケージを指定することで、複数のテストパッケージでの結果を取得することができるようです。

実行して結果を見てみましょう。

```shell
>go test -coverpkg=. ./...
ok      bitbucket.org/shu/gli   0.100s  coverage: 42.6% of statements in .
ok      bitbucket.org/shu/gli/test      0.107s  coverage: 72.4% of statements in .
```

カバレッジ率がでましたね。:smile:
良かった良かった。:smile:

----

:sweat_smile:。o○（この2つのカバレッジの和集合ってどう取るんだろう？？　テストだけ複数パッケージに分けるのはダメか…？）
:sweat_smile:。o○（gli に対するテストは、今回の例で言うところの test パッケージだけにしておけば良かったかも）
Rocket.Chatが急に動かなくなった話

# Rocket.Chatが急に動かなくなった話

（追記）
v56.0.2でも動かなくなりました！
現在はv48.0.2を使用しています…（何だこれ…）

## Rocket.Chatとは
私の勤めている会社には未だにチャットツールが導入されてないので，部門内でOSSチャットの１種である[Rocket.Chat](https://rocket.chat/)を構築してテスト運用しています．
＃テスト運用と言うか，検証と言いつつ普通に使ってます

何というか，ほぼslackです．
Slcakを使いこなしてないので，違いが分からないだけかもしれませんが．

## 動かなくなった理由：firefoxのアップデート
firefoxのバージョンが原因っぽいですね．
[Manjaro Linuxのフォーラム](https://forum.manjaro.org/t/firefox-57-quantum-mozilla-is-back-to-game-baby/34750/58)にてRocket.Chatが最新版firefoxで問題が発生し，v56までダウングレードを試してみたら動くようになりましたとのことです．
＃余談ですが，google+も動かなかったみたいですね…

## ダウングレード：v56.0.2
その時職場で使っていたfirefoxのバージョンはv58.0.2でした．
適当にアップデートしたので，どのバージョンなら使用できていたのかイマイチわかってないです．

そこで，１回ずつ[ダウングレード](https://support.mozilla.org/ja/kb/install-older-version-of-firefox)していった所…
57.0.4でも使えないままで、56.0.2 になってようやく使えるように！
＃そういえば，v57からfirefox quantumになったんでしたね
＃チャットが使えない状態ってかなり不便ですね

## 再発防止
Firefoxを使わない or firefoxの自動アップデートをオフの２択ですね
Linuxでも発生している時点でRocket.Chatとwindowsの相性問題でもなさそうなので…
ちなみに．IEには通知が発生しない呪いがかけられているので，chromeが一番無難なのかもしれません．
＃弊社はchrome利用不可なので，諦めて旧firefoxを利用し続けます…
【Java】どうしてString.isEmpty()ではなくStringUtils.isEmpty()を使うのか

当たり前のように、文字列のnullチェックでは```org.apache.commons.lang.StringUtils.isEmpty()```を使っていますが、実は、```java.lang.String.isEmpty()```もあります。
では、どうして外部jarを組み込んでまで```org.apache.commons.lang.StringUtils.isEmpty()```を使うのでしょうか？

※ここから先、この記事の中では、StringUtilsとは```org.apache.commons.lang.StringUtils```を指すことにします。

# ２つのisEmpty()の違い
## StringUtilsのisEmpty()
nullか空文字の場合にtrueを返す。

## StringのisEmpty()
length()が0の場合のみtrueを返す。

# StringとStringUtilsのisEmpty()の実行結果比較
nullと空文字に対して、実際にisEmpty()メソッドを使ってみたソースがこちら:arrow_down:

```java
import org.apache.commons.lang.StringUtils;

public class VsIsEmpty {

  public static void main(String[] args) {

    String str1 = null;
    String str2 = "";

    System.out.println("-------------------------");
//    System.out.println(str1.isEmpty());    //ここでnullPointerExceptionが発生してしまう。
    System.out.println(StringUtils.isEmpty(str1));

    System.out.println("-------------------------");
    System.out.println(str2.isEmpty());
    System.out.println(StringUtils.isEmpty(str2));
  }
}
```
実行結果はこちら:arrow_down:

```
-------------------------
true
-------------------------
true
true
```

「length()が0のとき」というだけあって、String.isEmpty()はNullPointerExceptinを返してきます。
そのため、上記ソースコードではコメントアウトしています。

# 結論
String.isEmpty()は「空かどうか」を判定する子だった:exclamation:
nullと空は別モノなので、言われてみるとそうなんですが、でもやっぱりemptyというとnullも空もtrueで返してほしい気分になります。
rbenvでrubyのバージョンが切り替わらない

#rbenvでrubyのバージョンが切り替わらない
以下の記事を参考にした
[rbenvでバージョンがうまく切り替わらなかった時にやったこと](https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf)
##問題
rbenvで確認してみると。。。

```
$ rbenv versions
  system
  2.4.1
* 2.5.0 (set by /Users/~UserName~/.ruby-version)
```

となっているのに

```
$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
```
となってしまう。
##解決策
```
$ rbenv init
```

を実行すると

```
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```
とのこと。
`.bash_profile` に

```
eval "$(rbenv init -)"
```
を追加して、

```
$source ~/.bash_profile
```
で変更を反映する。

## 結果
```
$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]
```
無事反映することができた。
エントロピーの近似計算（MLSベイズ図2.1）

# 目的
- 機械学習スタートアップシリーズ「ベイズ推論による機械学習入門」の図をJuliaで再現する
- 今回の対象: 図2.1 サンプリングによるエントロピーの近似

# ベルヌーイ分布の用意
- 作図はPlots.jlでバックエンドはGR
- Distributions.jlから利用する
- エントロピーの真値もDistributions.jlが計算してくれる

```julia
using Distributions
using Plots
gr()

μ = 1.0 / 3.0
dist = Bernoulli(μ)
H = entropy(dist)
println(H)
# => 0.6365141682948128  # エントロピーの真値
```

# サンプリングによる近似
- 表の出た回数$p$と裏の出た回数$N-p$と、パラメータ$\mu$と$1-\mu$を利用して、$N$回試行したときの近似値を求める
- 今回はまとめて試行して計算している


```julia
# approx. by sampling
num_trials = 5     # 試行数
num_samples = 500  # サンプル数
results = zeros(num_trials, num_samples)  # 近似結果を格納

for t in 1:num_trials
    seqt = rand(dist, num_samples)
    for j in 1:num_samples
        pj = sum(seqt[1:j])
        nj = j - pj
        termp =  pj > 0 ? pj * log(μ) : 0
        termn =  nj > 0 ? nj * log(1 - μ) : 0  
        ej = - (termp + termn) / j
        results[t, j] = ej
    end
end

# 結果をプロットする
plot()
plot!([0, 500], [H, H], line=(0.5, :dash), color=:black, label="entropy")
for t in 1:num_trials
    plot!(results[t, :], xlim=(0, 500), ylim=(0.35, 1.0))
end
plot!()
```

![entropy.png](https://qiita-image-store.s3.amazonaws.com/0/7181/2a6324cd-5570-ad7a-df9b-4767ce43cae9.png)
どのフェーズの企業でも使える！！seleniumとtest-unitでwebの自動化テスト。

## **はじめに**

どのフェーズの企業でも簡単にステージングや本番で試せるテストを
書けるseleniumをご紹介します！！

## **テストを自動化するメリット**

iosやandroid等のネイティブアプリはリリースススパンが決まっているので、
ある程度時間かけて手動でテストしても問題なかったりするのですが、webは毎日デブロイしている企業が多いと思います。

毎日ギリギリまでテストしている企業の方も多いと思うんですが、seleniumを使うと、
極端な話ですが、2時間かけてやっていたテストが3分で終わります。

ちなみに学習コストも低いです。1日で覚えて3日である程度書き上げました。

さらに、test-unitを使うと、テストの何処で間違えたのか表示してくれたり、特定のテストを引数にすればそのテストケースだけ実行できます。

railsでTDD開発をしているような感覚でステージングテストを行うことが可能になります。

## **環境**

**・selenium(selenium-webdriver,chrome-driverもろもろ)**
**・ruby2.4.0(2.2以降からtest-unitが入っています！入っていない場合は入れてください！)**
**・mac ( 2016late )**

環境構築の仕方は、後日追記します。
すぐ終わりますので、是非やってみてください。

## 基本的な使い方

```ruby

# coding: utf-8
require 'selenium-webdriver'
#2.4.0で動かす場合は下記のライブラリrequireしなくて大丈夫です！
require 'test/unit'

# クラス名を決める。キャメルケース
# Test::Unit::TestCaseを継承
class なんちゃらTest < Test::Unit::TestCase
  # この中にテストを記述する

# クラス変数にすると、同一の変数をメソッドを超えて使えます。
@@email = "xxxxxxxxxxxxxxx@sample.com"

  # testからテストメソッドは始める。スネークケース
  def test_login_chrome
    #code
  end

  def test_item_register_chrome
    #code
  end
end

```

#### インスタンスを作成する

```ruby

# chromeのブラウザを自動で作成する
chrome = Selenium::WebDriver.for :chrome

# ブラウザを閉じる
chrome.quit()

# firefoxのブラウザを自動で作成する
firefox = Selenium::WebDriver.for :firefox

# ブラウザを閉じる
# firefoxの場合はchromeと違いquitで閉じないと開きっぱになるので注意。
firefox.quit()

```

#### **要素を指定する**

```ruby

# browserは作成したインスタンス
the_element = browser.find_element(:id, "なまえ")
the_element = browser.find_element(:class, "なまえ")

# li要素やaタグなど、同じIDで複数指定されていて特定の要素を指定できない場合は、cssかxpathで選択する。
# ブラウザの拡張機能から、copy→selectorでcssで指定する事ができる。
the_element = browser.find_element(:css, "#から始まるなまえ")

# こちらはcopy→xpath
the_element = browser.find_element(:xpath, "//*から始まるなまえ")

```

#### **指定した要素に対して、アクションを出す**

```ruby

# 入力フォームの中身を一回消す
the_element.clear()

# 文字列を入力。メアド、パスワード、テキストなど
the_element.send_keys("")

# 入力フォームをsubmitする
the_element.submit()

# ボタンをクリックする。
the_element.click()

# 指定した要素の内容を変数に入れる。
the_element_text = the_element.text()

```


#### **他にも便利なメソッドがあります**
```ruby

# 期待値と実際の内容があっているか確認する
# expectedは予想した文字列。urlやECなら出品した商品名など
assert_equal(expected, actual)

# 逆に期待値と実際の内容が同一ではないことを確認する
assert_not_equal(expected, actual)

# ブラウザの遷移等で、時間を置く必要がある場合。
# chromeは氣にしなくて大丈夫だけど、特にfirefoxはレスポンスが遅いので、遷移後のurlを取りたくても、前のurlをとったりする場合がある。
# 秒数は""で囲まないように。
sleep(秒数)


# jsのalertの処理
# いま表示されているalertを指定する。
alert = browser.switch_to.alert

#要素を取得
actual_alert_msg = alert.text

#alertを承諾する
alert.accept()

```

#### **リファクタリングしていて作成した凡用メソッド**

```ruby

  def find_and_fillout(browser, strategy, element, text)

    # フォームを指定し、cookie等の関係で入力されているテキストを削除(clear)して、テキストを入力
    something = browser.find_element(strategy, element)
    something.clear
    something.send_keys(text)

  end

  # ブラウザの現在の場所と正しいURLが一致しているか確認するメソッドです。
  def assert_url(browser, expected_url)

    # 現在のURL
    actual_url = browser.current_url

    # 遷移後のURLと期待しているURLが同じなことを確認
    assert_equal(expected_url, actual_url)

  end

  # 使い方
  
  # redirect後のurlが合っているか確認
  asset_url(chrome, @@expected_item_register_url

  # emailを入力する
  find_and_fillout(chrome, :id, "なまえ", @@email)

```

## さいごに

ご不明な点や、もっと良い書き方があったら是非おしえていただきたいです！