OmniAICreator/Qiita-1.07M huggingface dataset:
vmstatのio/bi,boのblock/sついて

vmstatでlinuxのパフォーマンス情報を確認をしますが、そのうちディスクI/Oの評価指標として使われるbi,boのblockについて「？？」となってしまったので調べてみました。

```bash
# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0    264 1386196   2128 360316    0    0   346   282  158  206  1  2 96  0  0
```

この[io]だけど調べてみると、

> bi　：　ブロックデバイスから受け取ったブロック数 (blocks/s)
> bo　：　ブロックデバイスへ送られたブロック数 (blocks/s)

と当たり前のようにググったらすぐでてきます。
ということは、  
１秒間にディスクに対して何block数読み込んだか＝bi  
１秒間にディスクに対して何block数書き込んだか=bo  

となります。


・・・このblockってvmstatだと1block何バイトだよ？？というのがなかなかわからず地味に調べるのに時間かかりました。
（OSシステムによって違うとか、ファイルシステムによって違うとか、コマンドによってblockのサイズは異なるとか…何が真実なんだか…）


といろいろ調べたうえで答えとなりうる情報がのっているサイトがこちらでした。

[http://wiki.linuxquestions.org/wiki/Vmstat](http://wiki.linuxquestions.org/wiki/Vmstat)



>io
The numbers are seen from the processor. So, for io, bi (block in) means blocks that e.g. come from the harddrive or from the network card. bo (block out) means blocks that are sent from the processor to the network card or to the hard disk. If you want to know your file system's block size, use
>
> stat -f /mnt/sdb1

結論、vmstatはファイルシステムのblockサイズであり調べるには```stat -f /mnt/sdb1```やればいいとのこと。

```bash
# stat -f /tmp
  File: "/tmp"
    ID: fd0000000000 Namelen: 255     Type: xfs
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 4538880    Free: 3562754    Available: 3562754
Inodes: Total: 9082880    Free: 9003333
```
CentOS7系であればxfsでデフォルトでファイルシステム作成してるはず＝大抵4096byteなので、最初の例を使うと

bi = 346 block/s = 346 × 4096 byte/s ≒ 1.4 Mbyte/s
bo = 282 block/s = 282 × 4096 byte/s ≒ 1.2 Mbyte/s

すこしすっきり
ChronografのOAuth認証

## がいよう
Chronografをそのまま起動するとガバガバなので認証機能を付けます
[この](https://docs.influxdata.com/chronograf/v1.7/administration/managing-security/#oauth-2-0-providers-with-jwt-tokens)通りやるだけでしたがめも
なんかいろいろ選べるけどgoogleよりgithubのほうがお手軽でした

## GitHubで認証する
https://developer.github.com/apps/building-oauth-apps/

githubにログインし右上から
Settings -> Developer settings -> New OAuth App

### 設定

* Application name：任意 ex. chronograf
* Homepage URL: http(s)://example.com
* Authorization callback URL: http(s)://example.com/oauth/github/callback

これでレジスターするとclient IDとclient secretがもらえるので設定していく

### chrnografの設定
環境変数にイカを登録するだけ

* `GH_CLIENT_ID`=b339dd4fddd95abec9aa
* `GH_CLIENT_SECRET`=260041897d3252c146ece6b46ba39bc1e54416dc
* `TOKEN_SECRET`=Super5uperUdn3verGu355!

このclient ID, client secretはダミー。さっきもらったやつを登録する
`TOKEN_SECRET`は任意の文字列

chrnografを再起動すると
<img width="318" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/287793/fb72e27b-5922-537f-98f1-53a48e63471b.png">
こうなって完了！

OAuthを登録したgithubアカウントでログインするとSuperAdminになってる
別のアカウントでログインするとユーザーが追加されるのでSuperAdminのアカウントから設定で権限を変えてやると閲覧できるようになる(ログインしたてはmember権限でなにもできない)
OpenGLを勉強するときに役立ちそうなサイト

職場で使っているOpenGLが未だに2.xでglBegin/glEndなどとっくに非推奨な機能を使っていたのでちょっと調べてみたものの，今動いているから変えなくてよいと言われてしまった忘備録。
## やるときに読みたい
- [○○くんのために一所懸命書いたものの結局○○くんの卒業に間に合わなかったGLFWによるOpenGL入門](http://marina.sys.wakayama-u.ac.jp/~tokoi/GLFWdraft.pdf)
OpenGLの歴史からインストール，理論，GLFWを使用したプログラムの書き方までまとまった資料。
Windows，Mac，Linuxのそれぞれでの使い方まで書いてあってめっちゃくちゃ丁寧。
2017年ぐらいのもので情報が新しい。

- [OpenGL が世界を描画する仕組み · けんごのお屋敷](http://tkengo.github.io/blog/2014/12/27/opengl-es-2-2d-knowledge-1/)
ターゲットがAndroidで言語はJavaだけど，図が豊富で説明がわかりやすい。
ターゲットがAndroidでなのでOpenGL SEを使っているけど(ry


- [連載一覧 "re:ゼロから始めるOpenGL 2.1" – Code Labo](https://codelabo.com/624/)
OpenGL2.1だが，古い機能は使用しないようになっている。
GLFWを使用したソースコードがあり，画像もあるためわかりやすい。


- [床井研究室 - OpenGL 関係記事一覧](http://marina.sys.wakayama-u.ac.jp/~tokoi/oglarticles.html)
学生向けっぽい記事が多くてわかりやすい。解説も丁寧。
記事が多い。


- [An intro to modern OpenGL. Chapter 1: The Graphics Pipeline](http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1:-The-Graphics-Pipeline.html)
英語だけどレンダリングの流れについてわかりやすい図がある。


- [OpenGL 3.3 以降の チュートリアル ](http://www.opengl-tutorial.org/jp/)
OpenGL3.3以降のモダンな書き方について説明している。
イントロにレガシーな書き方は全部忘れてくださいとある。
> OpenGLに関する知識は忘れてください。
特に，glBegin()などを知っているなら忘れてください。
> ここで学ぶのはモダンOpenGL(OpenGL3と4)です。
``glBegine()は3.1以降は非推奨になっている``

- [トップページ - OpenGLプログラミングメモ - アットウィキ](https://www21.atwiki.jp/opengl/)
サンプルコードが豊富。
固定パイプライン，プログラマブルパイプラインの両方に触れている。
FreeGlutを使っている。
【Unity】キャンディーが飛んで行ったーーーー！！Rigidbody「Is Kinematic」 チェックOFF

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1

実際に動かした動画はこちら↓↓

https://twitter.com/nonnonkapibara/status/1087731400059600896
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">🐾Rigidbody🐾「Is Kinematic」📌チェックOFF<br>にすると、キャンディー🤩が飛んで行ったーーーー！！<br>✨w(°ｏ°)w‼️おおーーーーーっ‼️<br>Flyaway🚩<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/Unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#Unity3d</a> <a href="https://t.co/PPPO8AGnzw">pic.twitter.com/PPPO8AGnzw</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1087731400059600896?ref_src=twsrc%5Etfw">2019年1月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<font color="Magenta">Qiitaの容量オーバーで画像が貼り付けられなくなりました。（errorとなる）</font>
続きは、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/01/23/004847)


</br>
</br>
</br>
</br>
</br>
</br>


※Assetsは、以下の素材を使用しました。
Skybox Series Free
<img width="1081" alt="スクリーンショット 2019-01-23 0.43.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/b657a77e-9945-3914-85f6-c1e4255eeea5.png">
【2019年1月ver】GoogleDataStudioで作ったダッシュボード画像をSlackで表示する方法

## 動機
- 事業KPIをチーム内でSlack共有する際に、テキストだけだと流れ易い。画像ベースでパッと見で理解できると良いよね。

- [Redash](https://data.gunosy.io/entry/slack-redash-kpi-notify)だとグラフの埋め込み機能はあるけれど、欲を言うとダッシュボードをまとめて共有したいよね。([Metabase]()も同様に単一グラフでの共有)

- GoogleDataStudioを上手い具合に丸ごとスクショ展開できないかな??と思うと、URLを直接貼る技をTwitterで発見!
    - https://bit.ly/2FH8CsQ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56466/81acea63-6d93-9093-1e47-6aec0bf7dd90.png)

- しかし、2019年1月現在、上記の方法ではサムネイルが表示されない模様。色々触っているうちに、画像の状態で共有する方法が分かったので、やり方を共有します！

## この記事を読んで分かること
- DataStudioのダッシュボードをSlackで画像埋め込みする方法

## 対象読者
- Slackを使っていて、何らかの数値を社内で定期共有するニーズがある人
- 個人的には、この機能だけで相当組織内の数値共有が楽になるなと思っています。計測にGAを使っている企業は勿論ですが、DataStudioはBigQueryともデータソースとして接続可なので、活用できる環境は多いハズ！


## Slack投稿例

↓データはGoogle様が用意しているテンプレートを使ったダミーデータとなっています。

- ① Slack投稿画面
<img width="934" alt="スクリーンショット 2019-01-23 0.20.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/56466/ed4d4963-67a5-fa30-fc0a-d3d0ef013f4c.png">

- ② 画像をクリックすると拡大表示して詳細な数値が見れます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56466/4f1e3c20-6d7a-848d-0510-b59ce5b34f4f.png)

## 投稿方法(もったいぶりましたがめっちゃ簡単です🙉)

### STEP1: 投稿したいDataStudioの共有用URLをコピー
<img width="1263" alt="スクリーンショット 2019-01-23 0.25.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/56466/9be5f942-42c8-68f7-81a2-22341e8267b0.png">

### STEP2: URLの末尾に"/thumbnail"を付与して、リダイレクト先のURLをコピー
- 上記のURLを単にSlackに貼り付けても、プレビューは表示されないのですが、以下URLにある通り、"/thumbnail"を末尾に追加すると、サムネイルページにリダイレクトします。
    - 詳細はこちらのページをご確認ください
        - https://support.google.com/datastudio/answer/9044629?hl=en

↓こんな感じで末尾に文字列追加
<img width="930" alt="スクリーンショット 2019-01-23 0.27.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/56466/0259426e-24d0-f74b-76b3-4533a441ff2c.png">

↓URLを叩くと、サムネイルページにリダイレクトします。
<img width="827" alt="スクリーンショット 2019-01-23 0.49.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/56466/58bdd9dd-7dd6-623a-776f-3bda8a2ae6f2.png">


### STEP3: リダイレクト後のURLをSlackに貼るとちゃんと画像が表示される。
<img width="934" alt="スクリーンショット 2019-01-23 0.36.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/56466/a24a1481-e9ff-28c8-e296-4d8c531ec4c5.png">

## 積み残し
- 短縮URLでも表示する方法。https://bitly.com/ で短縮すると表示されなかった。
- 特定のページを共有する方法。ダッシュボードの先頭のページのサムネイルにリダイレクトする?

### まとめ
- 本記事では省きましたが、Slackに定期実行のbotを組んでおけば、定点観測的に数値共有も可能です。いちいちクリックしなくても、ダッシュボード画像で数値を一気に把握できるのは、見る側としては、優れたユーザー体験であると思います。

- みなさんの日々のデータ共有業務が少しでも楽になりますように..!
Vue.jsでthis.$storeにアクセスできない書き方

# 環境

- Vue.2.5.1
- Vuex 3.0.1

# this.$store→undefinedエラー

```javascript
this.$store.getters['auth']
```

のように `$store` を使おうとすると下記のエラーが出た。

```
Error in created hook: "TypeError: Cannot read property '$store' of undefined"
```

# 原因

イキってアロー関数を使ったから。

```javascript
created: () => {
  this.$store.getters['auth'] // "TypeError: Cannot read property '$store' of undefined"
  console.log(this.$store) // "TypeError: Cannot read property '$store' of undefined"
  console.log(this)  // undefined
}
```

そもそも `this` がundefined。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

> アロー関数式 は、その名のとおり矢印を使って記述し、function 式より短い構文で同様な内容を記述することができます。なおthis, arguments, super, new.target を束縛しません。

つまり「thisが空ということが有り得る」という捉え方で良いのかな。

試しに下記のようなオブジェクトで実験してみた。

```javascript
const obj = {
  func1: function() {
    console.log(this); // {func1: f, func2: f, func3: f}
  },
  func2() {
    console.log(this); // {func1: f, func2: f, func3: f}
  },
  func3: () => {
    console.log(this); // undefined
  }
};
```

func1とfunc2ではthisでオブジェクト自身が取得できている。

# 結論

```javascript
created: function() {
  console.log(this)
}
```

もしくは

```javascript
created() {
  console.log(this)
}
```

のように書くと `VueComponent {_uid: 7, _isVue: true, $options: {…},` とコンポーネント自身が取得できているのが確認できた。
systemctlコマンドでnginxとhttpdを自動起動にするとnginxがコケる

# 環境とか状況

- CentOS7
- `nginx(v1.15.8)`
    - リバースプロキシで待受、アクセス振り分け
        - port:443
- `httpd(2.4.35)`
    - `wordpress`とか`django`とか動かしている。アプリごとに違うポートで待受している
        - port:8443
        - port:8444

# 原因

`nginx`が`httpd`より先に**起動**すると、当然まだ`httpd`側のポートが開放されていないので、`nginx`が死ぬ！！

# 治す！！

自動起動の設定ファイルは以下の2つのディレクトリに置いてあります。

- `/usr/lib/systemd/system/`
- `/etc/systemd/system/`

## 注意: 追加、編集する際は`/etc/systemd/system`を編集するようにしましょう。

- `/usr/lib/systemd/system/`は`systemctl`が作成したり書き換える場所なので、**いじっちゃ駄目**です。
- `/etc/systemd/system/`は、サーバー管理者がいじっても平気なファイルたちです。

両方のディレクトリに**同じファイル**が存在する場合、`/etc/systemd/system/`内が**優先**されます。

# nginx.serviceの作成

```bash
# nginxをyumでインストールした場合、雛形が置いてあるのでコピーしてくる
sudo cp /usr/lib/systemd/system/nginx.service /etc/systemd/system/
sudo vim /etc/systemd/system/nginx.service
```

ほとんどそのままなのですが、`After=`というパラメータに**httpd.service**を追加することで`nginx`が`httpd`の**起動後**に立ち上がるようにしてくれます。ついでに、`Requires=`パラメータを追加しています。`httpd.service`が**起動していない**なら、`nginx.service`の**起動はしませんよ**って意味です。

```bash:nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target httpd.service
Wants=network-online.target
Requires=httpd.service

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
```

最後に`systemctl`に`unit`ファイルを更新したよ～っていう通知を行います。

```bash
sudo systemctl daemon-reload

# サービスの再起動、確認
sudo systemctl restart nginx httpd
sudo systemctl status nginx httpd
```

# 終わり

## 参考にした記事

- [Systemd メモ書き](https://qiita.com/a_yasui/items/f2d8b57aa616e523ede4#%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C)
VSCのタスク設定例

VSCのタスク設定例

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type":"shell",
            "command": "gcc -I C:\\_soft\\VC\\inc\\ -I C:\\_soft\\VC\\Bridge0\\Bridge0\\ -c -Wall ${file}",
            
            "presentation": {
                "reveal": "always",
                "panel": "new"
            },
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": ["relative", "${workspaceFolder}"],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error|fatal error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}
X-HACK主催　LINE BOTの勉強会に参加しました

# 勉強会の概要
X-HACK東京 主催(講師：松田さん)の勉強会に参加してきました！
「**LINE × DB クイズアプリを作ろう！**」という題目でしたので、LINE BOTの環境を作りデプロイするまでのことを行いました。
[勉強会資料](https://paper.dropbox.com/doc/LINE-x-DataBase--AWECeV3CAkmYurfxWxdGuhHaAg-ymvcRCCFVl6cJJcnem1kK)
[サンプルのLINE BOTソースコード](https://github.com/x-hack-git/line-bot-database)

TwitterのBOTを作成したことありますがLINEのBOTを作るのは初めてで実装できたときは面白かったですし、NodeJSも少しだけですが初めて学べたので将来のために良い勉強会だったと思います。

# 開発環境

- heroku

PaaS系クラウドのWebサーバ
ソースコードやPostgresのDBをデプロイしてインターネットで外部に公開します。
今回は、LINEと連携し何らかのメッセージを入力した後herokuから何らかの処理が行われます。

- LINE Messaging API

[LINE Developers](https://developers.line.biz/ja/)より自分のLINEアカウントを連携してLINEの開発環境を作成できます。
本勉強会では、メッセージを送信したらLINEのインターフェースからユーザに対して自動応答行うため「LINE Messaging API」を使用しています。

- Codenvy

クラウド上で開発を行えることができるIDE
ブラウザ上でプログラミングしたり、コマンドラインでDBを操作したり、デプロイしたりということができます。
また、CodenvyだとNode.jsのインストールやGitHubに公開されているサンプルのソースコードをクローンするなど手短に行えます。
ただ、レスポンスが遅かったり何もしないで時間がたてばタイムアウトしてしまうことがありますので、私はローカル環境でセットアップした方が良かったかなあって思っています。(時間も限られていますし、そこはどうしようもないかもしれません。)

- PostgresSQL

データベースを使うためのミドルウェア
本アプリでは開発するために必要なクイズの情報を保存し、DBの情報を元にLINEでは返信します。

- Node.js

Javascriptベースのサーバサイド開発環境
Javascriptは私は苦手な方でしたが、この勉強会に参加したことで少しだけ克服できたのかな？と思います。


# 作成したLINE BOT
![Jan-22-2019 8-25-55 AM.gif](https://qiita-image-store.s3.amazonaws.com/0/120727/723b45e4-8e95-01a8-1722-c3568d8e3451.gif)
### QRコード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120727/15dd0813-486f-f19e-8b2c-e2b48de3287d.png)

# 何をするBOTなの？
1. 何か適当に文字を入力してメッセージを送るとDBに登録してあるクイズからランダムに問題が出題されます。
2. クイズは四択式になっていますので、正解だと思う答えにタップして回答します。
3. 回答すると、メッセージを送った判定になるのでまたランダムに問題が出題されます。

また、問題だけでなく、DBに画像のURLがあれば画像と一緒に出題されます。

# 私のオリジナル要素
[勉強会資料](https://paper.dropbox.com/doc/LINE-x-DataBase--AWECeV3CAkmYurfxWxdGuhHaAg-ymvcRCCFVl6cJJcnem1kK)の通り作成するとサンプルではドラえもんのイラストとテンプレートの四択問題が出題されるだけとなっております。
具体的には以下の要素を修正・更新しました。
[GitHub](https://github.com/Dhikigame/LINE_QUIZ_BOT)

- 新しい問題をDBに増やした(ただしまだ7問しか作っていないし、問題の難易度は適当)

- 問題文を[<問題のID番号><.> + <問題文>]の形にして問題ごとのID番号がわかるようにしている(のちにID番号は使う)

- DBに正解の答えであるcorrectカラムの追加

- ボタンをタップしたらサンプルでは「答え1〜4」と返信されますが、私は選択肢の答えそのままを返信することにより「何を答えたか」をわかりやすくした

- [「答え」 + <問題のID番号>]と入力することでその問題の答えを見れるようにした(以下の通り)
![Jan-23-2019 12-09-14 AM.gif](https://qiita-image-store.s3.amazonaws.com/0/120727/58a482e5-c303-1967-160b-593d7e31cd72.gif)


# もっとやりたかったこと
本来は回答した後、問題の正誤(例えば、正解不正解を判定)を出してその後問題がまた出題される形を作りたかったが、その実装方法がわからなかった。
正確にはBOT側で返信するとき、複数のメッセージを返信されるようにする方法がわからなかった。
自動入力回避策(仮)

とあるサイトを作成中、最後の方でオートコンプリートや自動入力機能に苦戦させられました。
結果的に解決はできなかったものの凌ぐ方法を見つけたので、自分用に忘備録として残しておきます。
本当に一時的なものなので、解決策を探している方はごめんなさい。


#作っていたもの
確認画面ありの文字投稿機能

入力画面→入力確認画面→投稿完了画面

#起きたこと
スマホで「連絡先を自動入力」を押した時に意図しない場所に入力される
→自動入力を押した時にフォーカスしていたフィールドより上に入力されたため、ありえない表示だった。例を挙げるなら、フォーカスしているテキストフィールドより上のテキストフィールドにパスワードが入る、など。

#試したこと
######HTMLにてautocomplete=off
検索をかけて一番多く出てきたが、一切効かず。

######テキストフィールドの名前を変える
テキストフィールドにつけられた名前(nameとか、passwordとか)で推測しているのかと考えたが、これも効かない。

######問題のあるテキストフィールドを非表示にし、ダミーのテキストフィールドを作る
うまくいった。オートコンプリートも効き、ダミーのテキストフィールドにも表示されない。
自動入力時にテキストフィールドを認識する条件に「一番上に存在するTextfield属性のものに対し」というものがあったようで、問題のテキストフィールドに対し、新しいテキストフィールドを上に追加しても、サイト内で一番上にあるテキストフィールドに自動入力が反映されていた。

#結論
時間もなく手っ取り早く仕上げたいならダミーデータを用意するのがおすすめ。
Eigenの便利な機能あれこれ

機械学習を行う上で欠かせないのが行列演算ライブラリです。

pythonにnumpyがあるように、C++のデファクトスタンダードな行列計算ライブラリに[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page)というものがあります。ヘッダのみのライブラリなのでプロジェクトに組み込みやすくSIMDとかも使って最適化してくれるので計算も速いです。
ここ最近でEigenを使った際に便利に感じた機能をまとめたいと思います。

# Slicing and Indexing
v3.3.90から配列の[SlicingとIndexing](https://eigen.tuxfamily.org/dox-devel/group__TutorialSlicingIndexing.html)が便利に行えるようになりました。それまではblockAPIやhead/tail関数などを駆使していましたが、pythonのような要素指定が可能になりました。
以下にnumpyとEigenの要素指定方法の比較を載せました。

| Eigen | numpy |
|-------|-------|
| `A(seq(i,last), seqN(0,n))` | `A[i:, :n]` |
| `A(seqN(i,m), seqN(i,n))` | `A[i:i+m, i:i+n]` |
| `A(seq(i0,i1), seq(j0,j1))` | `A[i0:i1+1, j0:j0+1]` |
| `A(all, seq(0,last,2))` | `A[:, ::2]` |
| `A(last/2,all)` | `A[(A.shape[0]-1)/2, :]` |
| `v(lastN(n))` | `v[-n:]` |
| `A(all, seq(20, 10, fix<-2>))` | `A[:, 20:9:-2]` |
| `A(seqN(last, n, fix<-1>), all)` | `A[:-n:-1, :]` |
| `A(lastN(n).reverse(), all)` | `A[:-n:-1, :]` |
| `A(all,{4,2,5,5,3})` | `A[:, [4,2,5,5,3]]` |

# 最近傍点を見つけるコードを1行で書く
[ドキュメント](https://eigen.tuxfamily.org/dox-devel/group__TutorialReductionsVisitorsBroadcasting.html)にも載っているのですが、これが1行で書けるのに少し感動したので紹介します。

```cpp
#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
  Eigen::MatrixXf m(2,4);
  Eigen::VectorXf v(2);
  
  m << 1, 23, 6, 9,
       3, 11, 7, 2;
       
  v << 2,
       3;
  MatrixXf::Index index;
  // find nearest neighbor
  (m.colwise() - v).colwise().squaredNorm().minCoeff(&index);
  cout << "Nearest neighbor is column " << index << ":" << endl;
  cout << m.col(index) << endl;
}
```

該当の部分は`(m.colwise() - v).colwise().squaredNorm().minCoeff(&index);`のところですが、行列`m`の中からベクトル`v`と最も近い列ベクトルのインデックスと距離を算出しています。

# pybind11でpythonラッパにする
C++のコードのpythonラッパを作成する[pybind11](https://github.com/pybind/pybind11)は標準でEigenとnumpyの変換を行ってくれます。
バインディングを行うコードで`pybind11/eigen.h`をインクルードするだけで、EigenのMatrix型をnumpyのndarrayに変換してくれます。

* [pybind11のドキュメント](https://pybind11.readthedocs.io/en/stable/advanced/cast/eigen.html)

# プラグインで機能拡張
EigenのMatrixやその他の型にはユーザが新たに関数追加を行うための[プラグイン機能](https://eigen.tuxfamily.org/dox-devel/TopicCustomizing_Plugins.html)があります。
プラグインと言っても以下のようにMatrixBase型などの中にマクロが埋め込まれており、ユーザ側で追加機能が書かれたファイルを`EIGEN_MATRIX_BASE_PLUGIN`として定義することでユーザが定義した関数や変数をクラスの中に追加することができます。

```cpp
class MatrixBase {
  // ...
  #ifdef EIGEN_MATRIXBASE_PLUGIN
  #include EIGEN_MATRIXBASE_PLUGIN
  #endif
};
```

たとえば`MatrixPlugin.h`の中身を以下のように記述します。

```cpp:MatrixPlugin.h
inline Scalar hoge() const { return this->operator()(0, 0); }
```
実際に使用するコードで、Eigenをインクルードする前に`#define EIGEN_MATRIXBASE_PLUGIN "MatrixPlugin.h"`を記述することで、Matrixからhoge関数を呼ぶことが可能になります。

# Unsupported modules
公式に[Eigenがサポートしていないモジュール](https://eigen.tuxfamily.org/dox/unsupported/index.html)ですが、色々入ってます。

* Tensor(3次元以上の配列)の計算
* 非線形最適化
* オイラー角の計算
* 自動微分
* …

などなど。
VirtualBox 6.0で作成した仮想マシンにCentOSをインストールしようとするとマウスカーソルが表示されない問題への対処

<font color="red">**本件の問題はVirtualBox 6.0.6で解消されたようです。**</font>

## インストールウィザードでマウスカーソルが表示されない
2018年12月に、VirtualBoxの新バージョンである6.0.0が公開されました。しかし、これで作成した仮想マシンに**CentOS 7**をインストールしようとすると、図1のようなGUIによる**インストールウィザードでマウスカーソルが表示されない**という**入門者殺し**な状況になっています。

この現象はWindows版とLinux版の両方で発生することを筆者自身が確認しており、またmacOS版の利用者からも同じ現象を訴える声を聞いていますので、ホストOSの種別は関係ないようです。

カーソルを視認することはできませんが、マウスドライバーの機能自体が壊れているわけではなく、適当なところでマウスをクリックすると「見えないカーソル」がポイントしていた場所がちゃんと反応はします。また、キーボード操作のみでダイアログなどを操作をすることも可能ではあります。ただ、そこまでしてまでインストールを継続しようとするのは単なる苦行でしかありません。ここで記す改善方法を実施して、マウスカーソルが表示されるように改善を図りましょう。

|![図1](https://qiita-image-store.s3.amazonaws.com/0/53988/b2e8cbe1-a27d-da4c-e89e-e060bc9243a4.png)|
|:--|
|図1|

## 準備
### まずは仮想マシンのシャットダウン
改善方法を実施するためには、仮想マシンをシャットダウンしておく必要があります。図1の状態で正常なシャットダウン手順を踏むことにも窮してしまったのならば、仮想マシンウィンドウの×ボタンをクリックし、「仮想マシンの電源オフ」を選択して強引にシャットダウンしてしまいましょう。どの道、新規にOSインストールするわけですから、仮想ハードディスクの内容が破損しても問題ないはずです。

仮想マシンをシャットダウンしたら、VirtualBoxマネージャーで当該仮想マシンを選択して設定ボタンをクリックし、設定画面を表示します。

## 改善方法
以下、改善方法を2つ記します。**どちらか一方のみでも改善は可能**です。
### ポインティングデバイスを変更する
1つ目の改善方法は、ポインティングデバイスを**PS/2 マウス**から**USBタブレット**に変更することです。設定画面の左ペインでシステムを選択し、図2の赤枠部分の設定を変更します。この方法を選択した場合、OSのインストール中であってもホストOSとゲストOS間でマウスカーソルのシームレス移動が可能となります。

|![図2](https://qiita-image-store.s3.amazonaws.com/0/53988/a985acf6-2365-e8ce-1f4a-1d03070c56ae.png)|
|:--|
|図2|

### Graphics ControllerをVBoxVGAにする
2つ目の改善方法は、Graphics Controllerを**VMSVGA**から**VBoxVGA**に変更することです。同じく左ペインでディスプレイを選択し、図3の赤枠部分の設定を変更します。この方法**のみ**を選択した場合、仮想マシンウィンドウ内でマウスクリックして制御をゲストOSに移すと、マウスカーソルの動作はゲストOSの設定に依存するため、カーソルの移動速度などがホストOSで動かしているときとは異なる可能性があります。また、マウスカーソルの制御をホストOSに戻すためには、ホストキー（Windows版ならばデフォルトでは右Ctrlキー）を押下する必要があります。なお、マウスカーソルのシームレス移動は、OSインストール完了後にGuest Additionsをインストールすることで有効化することができます。

|![図3](https://qiita-image-store.s3.amazonaws.com/0/53988/2b5c28c7-8f73-a8a5-ced7-fb7077107297.png)|
|:--|
|図3|

### どちらを採用するべきか
上記の2つの方法は、どちらか一方のみでもインストールウィザード上でマウスカーソルが表示されないという、当初の問題は改善できます。ならばどちらを行うべきかということになりますが、現状では**両方設定変更することがお勧めです**。

#### Graphics Controllerという設定は何者なのか
VirtualBox 5.2までは、仮想グラフィックコントローラー（以下、VGA）を交換することができませんでしたが、6.0で交換機能が新設されました（項目がまだ日本語化されていないことからも新規機能であることが伺えます）。

- 5.2までのVGAと互換性のある**VBoxVGA**
- ライバル仮想化ソフトウェアであるVMware WorkstationのVGAをエミュレーションした**VMSVGA**
- VirtualBox独自の新たなVGAである**VBoxSVGA**

からの三択となります。ただ、まだ新しい機能のため、新設されたVGAの挙動には大分不安があるようです。当面は、他のゲストOSでも**VBoxVGA**を選択しておくのが無難かもしれません。

## 考察など
### なぜ入門者殺しな状況を生み出してしまったのか
VirtualBoxで仮想マシンを新規作成するとき、OSのタイプとバージョンを設定します。仮想マシン名を入力したときに、推定でそれらを自動選択する機能もあります。ここで選択されたタイプとバージョンの組み合わせによって、各種設定項目の初期値が決定されます。ところが、ここでOSを**Linux**、タイプを**Red Hat (64-bit)**にして仮想マシンの作成を完了すると、ポインティングデバイスは**PS/2 マウス**、Graphics Controllerは**VMSVGA**が初期値となります。このままOSのインストール作業を開始したら、必ず冒頭の問題に嵌ってしまうわけです。なぜこのような初期値にしたのか、Oracleや開発コミュニティーの方針に疑問を感じます。

### 他のOSにも影響はある？
Debian系（Ubuntu含む）やArch Linux系ではこのような問題は起きないようです。ただ、同じRed Hat系である**Scientific Linux**でも同じ現象が起きるという情報は目にしています。他のOSを導入する場合でも、マウスカーソルが表示されないようであれば、本記事の対策を試してみてはどうでしょうか。
最小限の持ち物で勉強できるのか？iPadで開発 《第2弾》~SSHで接続~

# あらすじ
[最小限の持ち物で勉強できるのか？iPadで開発 《第1弾》](最小限の持ち物で勉強できるのか？iPadで開発 《第1弾》)
で紹介した環境などを使っていて思ったことなどを更新していきます。

今回は「意外と使える！」
と思うきっかけと取り組みを紹介します。

# こんな人にオススメ？？(再掲)
- iPad ひとつでなんでもやりたい人
- 持ち歩くものを減らしたい人
- PCの買い替えはもう嫌な人
- 新しい勉強の仕方を開拓したい人

# 環境
- iPad Pro 2018 11inch
- Apple 純正 Smart Keyboard
- モバイルルータ

# iOS アプリの紹介
意外と使える！と思うきっかけは、このアプリ！

WebSSH Essential
![A35BC7D9-39AE-4FEF-AAAA-D3630476050C.jpeg](https://qiita-image-store.s3.amazonaws.com/0/162539/db07cd26-8ced-8217-aea0-7b35c9d523bb.jpeg)


これで SSH 接続が簡単にできます！
他にもアプリがありますが今のところこれが一番使いやすいと思います。
また、第1弾で懸念していた Smart Keyboard の方向キーの入力なども正確にできます。

### 使い方
![A402E750-153E-4798-834D-7687F1AA1D93.jpeg](https://qiita-image-store.s3.amazonaws.com/0/162539/d994814e-6e0b-041e-04f4-ffa4b5294aef.jpeg)
右下の ＋ マークを選択すると出てくる Add SSH connection から新しい接続を追加する。
![F89B7264-B654-4DC6-8106-87A9FE008D58.png](https://qiita-image-store.s3.amazonaws.com/0/162539/b0935c14-394d-8960-b56d-257092eb9215.png)
上記4つを最低でも入れて右上の保存マークで保存したら接続可能！簡単！
![F9E928E4-F363-4E0F-AB5E-F9F7A64507EA.png](https://qiita-image-store.s3.amazonaws.com/0/162539/db673ec7-cd6c-dc74-aa53-9cf299dddefb.png)
画面の下に Esc キーなど表示される点も使いやすいです。

# 取り組み
### PC の遠隔操作
自宅のよく発熱する Linux PC を同一 Wi-Fi 下にいれて上記アプリで ssh 接続。
iPadは熱くならないので快適にコーディング！
レスポンスも問題なし。Linux を入れられない iPad にさも入れられたかのように使えるのがいい！

欠点
同一 Wi-Fi 下に PC がいないといけないため、外出する際には PC も連れ出さなければならない。（主旨と異なる）
解決策としては自宅に VPN 接続することですかね。
### Microsoft Azure 無料体験
上記でも書いたように PC 持ち歩くのはめんどくさいし、
いつ何か閃いてやりたいと思うかわからない。
ということでレンタルサーバやってみようと思い探していると、
Microsoft Azure の試用期間があることを知り登録してみました。
（Microsoft の回し者ではないですよ。。。）
[Azure の無料アカウントを今すぐ作成しましょう]
(https://azure.microsoft.com/ja-jp/free/)
### VMの作り方
色々なサイトを見ていましたが、ポータル画面がちょくちょく変わるようで、
やり方はそのときにもう一度調べてみてください。
私が行なった時は、下記のようになりました。

![DAF25DCD-05F1-48C5-9BB9-D399A0F656E7.jpeg](https://qiita-image-store.s3.amazonaws.com/0/162539/8a021663-68cd-f720-9628-ea76e75e4fbd.jpeg)
登録が終わってポータル画面に移ったら
左のメニューバーから Virtual Machines を選択して追加します。
その後は必須の※マークがあるところを埋めていけば作成されます。
![0F656516-B3D1-4CF5-AD98-081EE8E61870.png](https://qiita-image-store.s3.amazonaws.com/0/162539/611c8549-35e4-ea32-5d85-458d1beb74fa.png)
VM のイメージも豊富にあるのでこの試用期間の間にいろんなサーバ試していきたいと思います。
![5E592D8C-4E1A-4DF8-9E4F-8BEE23F4DFBE.jpeg](https://qiita-image-store.s3.amazonaws.com/0/162539/a74b4d45-8fa6-94d5-391a-74081ceb4d8a.jpeg)
ちなみに iPad から上のアプリを使って SSH するためには、鍵を使う方法もありますが、テストしたり重要なものをおくのではないので、パスワードにしました。
（12文字以上、大文字小文字数字記号こみが必須条件なのでなかなか固いとも思います）
**※ SSH 先のパブリック IP アドレスは毎回変わるので確認が必要です！**

### sudo のしかた/root になる方法
- sudo
sudo するときにきかれるパスワードはログインするときのパスワードと同じです。

- root になる
sudo が使えれば下記で root になれます。
（このやり方を思い付かず調べました。。。）
`sudo su -`
長いパスワードいちいち打たなくて済むので便利ですが、ほどほどに。。。


# まとめ
- iPad で開発はできる！
- Azure のサーバはポータル画面から簡単に作れ手軽に利用可能


今後も更新していきます！
ExcelのPowerQuery機能を使ってDynamics365のデータを取得する

# 記事の概要
ExcelのPowerQuery機能でDynamics365のデータを取得できます。

- Dynamics365上で列として表示できないような、GUIDなども取得できます。
- エンティティとして高度な検索で選択できないようなテーブルのデータも取得できます。（個人ビューなど）
- PowerAppsのモデル駆動形アプリにも同様の手順が可能です。

# PowerQueryについて
ExcelでPowerQueryの機能を使えると最近知りました。
PowerQueryはPowerBIでも使われている、データをSQLなしで取得でき、さらに結合したり計算列を設定したりなどできるものです。
今回は単純に取得する場合の手順です。

プライベートで使っているOfficeは2013では、下の記事のようにはいきませんでした。
ODataのデータを取り込むメニューはあったのですが、Dynamics365にログインできませんでした。。。
このあたりはなにか方法があるかもしれません。
（Excel2016はできるかわからないです）

Office365のライセンスがあれば、Excelが最新化されて下の記事の方法が使えるようになりました。

https://support.office.com/ja-jp/article/dynamics-crm-power-query-%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-8eef0c8e-a5f2-4a00-93e2-50e5bce6599b

# 手順
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/02fe5516-fc8f-78b3-56f7-cf3d01ef0e5f.png)

WebAPIのURLが下記のようにありますが、v9.0以上にアップデートする前は、末尾を8.2にする必要があります。
また、日本リージョンでOffice365のテナントを展開している場合は、crmでなく、crm7です。
``https://<tenant>.crm.dynamics.com/api/data/v9.0``

tenantの部分は利用している環境のテナント名に置き換えます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/b7c5628a-6c3c-e5fc-e1af-7bed9245de9f.png)

サインインボタンを押してサインインします。
このときエラーが出るときは、先に入力したURLが間違っているかもしれません。
例えば、crmに7をつけ忘れた場合は、「リモート名が解決できません」と表示されてサインインできませんでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/cd3d5ab7-7972-13ba-9449-378304a5f7eb.png)

うまくいくと下記のようにテーブルが表示されます。
内部のテーブル名で表示されているため、知っているエンティティに対応がないテーブルがたくさんあると思います。
Google等で検索すると対応するエンティティがわかるものもあります。
私もDynamics365のオンプレ版は触ったことがないので、確実な対応はわからないのですが。。。
下記はsavedqueriesテーブルで、システムビューのデータを保存しているテーブル。。。だったと思います。
個人ビューはuserqueriesだったと思います。。。曖昧ですみません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/97be9718-5861-b3ec-9ed1-3badc46e5473.png)

ここでテーブルを選択して編集ボタンを押すと下記の画面になります。
いろいろできるのですが、今回はそのまま閉じて読み込むを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/4ef998af-9513-4918-0b40-a0e5238b5dd9.png)

こんな感じで取れました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/2396886e-d12a-cdba-19eb-c5c4ebc3d97f.png)

# 最後に
SaaSサービスはDBが見えないせいで、たまにむず痒い思いをすることがあったのですが、
この方法なら見れます。

WebAPIで取得できるということは、個人ビューなどをWebAPIによって一括挿入・更新できるのでしょうか。
試す価値はありそうですね。

「データの更新」でデータも更新できると思います（まだ試してない）
テーブルからピポットテーブルやグラフを作ると、Dynamics365にアクセスせずして帳票作成的なことができるかもしれないですね。
[Sinon] TypeScriptでは set()/get() をspyできない

`Sinon` で setter/getter をspyして呼び出された回数をテストしたい場合、TypeScriptでは set()/get() をspyできないため、他の方法を使わなければならない。

# JavaScriptの場合
JavaScriptで `Sinon` を使う場合、set()/get() は以下のように `sinon.spy` 関数に第3引数を与えることでspyできる。

```javascript:App.js
class App {
  constructor() {
    this._variable = 0;
  }
  set variable(value) {
    this._variable = value
  }
  get variable() {
    return this._variable;
  }
}
export default App;
```

```javascript:App.test.js
import App from './App';
import sinon from 'sinon';

it('is able to test set()/get()', () => {
  const descriptor = sinon.spy(App.prototype, 'variable', ['set', 'get']);
  const app = new App();
  app.variable = 1;
  expect(descriptor.set.callCount).toBe(1);
  let variable = app.variable;
  expect(descriptor.get.callCount).toBe(1);
});
```

# TypeScriptの場合
TypeScriptでは、第3引数が [型定義ファイルに定義されていない](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/sinon/index.d.ts#L355) ため使うことができず、set()/get() をspyできない。代わりに setXxx()/getXxx() 関数など、他の方法を使わなければならない。

```javascript:App.tsx
class App {
  private _variable: number;
  constructor() {
    this._variable = 0;
  }
  public setVariable(value: number) {
    this._variable = value
  }
  public getVariable(): number {
    return this._variable;
  }
}
export default App;
```

```javascript:App.test.tsx
import App from './App';
import sinon from 'sinon';

it('is necessary to replace set()/get()', () => {
  const setter = sinon.spy(App.prototype, 'setVariable');
  const getter = sinon.spy(App.prototype, 'getVariable');
  const app = new App();
  app.setVariable(1);
  expect(setter.callCount).toBe(1);
  let variable = app.getVariable();
  expect(getter.callCount).toBe(1);
});
```
slack-scala-clientを使用したAPI Clientのサンプル

## 概要
[slack-scala-client](https://github.com/slack-scala-client/slack-scala-client)を使用してslackの情報を取得したり、メッセージを送信したりしてみましたので、サンプルを記載します。
なお、botの作り方を知りたい場合は、@FScowardさんの[こわくないScala vol.5 今日のランチbotを作ってみる](https://qiita.com/FScoward/items/e70bd886969bc9d0c32c)の記事で解説されているので、こちらをご参照ください。

## 前準備
slackのAPIへアクセスするためのtokenを発行する必要があります。tokenの取得方法の詳細は、@ykhiraoさんの[Slack API 推奨Tokenについて](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21)にて解説されていますので、こちらをご参照ください。

## サンプルコード
今回はチャンネル一覧取得・ユーザ一覧取得・メッセージ送信の簡単なサンプルを作成してみました。

```SlackTest.scala
import akka.actor.ActorSystem
import scala.util.{ Success, Failure }
import scala.concurrent.ExecutionContext.Implicits.global
import slack.api.SlackApiClient

object Main extends App {
  implicit val system = ActorSystem("slack")
  val token = "ここに取得したtokenを設定"
  val client = SlackApiClient(token)

  // ユーザ一覧を取得するサンプル
  client.listUsers().onComplete {
    case Success(users) =>
      users.foreach(u =>
        println(s"${u.id}：${u.name}")
      )
    case Failure(t) => println(s"error:${t.getMessage()}")
  }

  // チャンネル一覧を取得するサンプル
  client.listChannels().onComplete {
    case Success(channels) =>
      channels.foreach(c =>
        println(s"${c.id}：${c.name}")
      )
    case Failure(t) => println(s"error:${t.getMessage()}")
  }

  // チャンネルIDまたは送信先のユーザIDを指定してtestメッセージを送るサンプル（送信者はToken発行ユーザ）
  client.postChatMessage(channelId = "ここにIDを設定", text = "test", asUser = Some(true)).onComplete {
    case Success(_) =>
      println("Success")
    case Failure(t) =>
      println(s"error:${t.getMessage()}")
  }
}
```
## その他補足
メッセージの送信元ユーザは、Token発行者かbotユーザしか使用できないようです。@mizuki_takahashiさんの[Slack APIでメッセージ送信](https://qiita.com/mizuki_takahashi/items/3f77c2e5b6142563ce66)の記事で詳細を解説されています。
Scalaでループ構文を使う

##はじめに
Scalaを勉強し始めたので、学んだ内容を整理していきます。
参考書として [基礎からわかるScala](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B-Scala-%E9%AE%AB%E5%B3%B6-%E5%85%89%E8%B2%B4/dp/4863542267) を使っています。

今回は、「ループ構文」について学びました。

##1. for式
###書き方
for (ループ変数 <- コレクション){ 処理の内容 }

###サンプル
```LoopSample.scala
val nameArray = Array ("Alice", "Bob", "Charlie", "Daniel", "Edward", "Fred");
for (name <- nameArray) {
  println("My name is " + name)
}
```

###出力結果
>My name is Alice
>My name is Bob
>My name is Charlie
>My name is Daniel
>My name is Edward
>My name is Fred


##2. foreachメソッド
###書き方
コレクション.foreach { (ループ変数) => 処理内容 }

###サンプル
```LoopSample.scala
val nameArray = Array ("Alice", "Bob", "Charlie", "Daniel", "Edward", "Fred");
nameArray.foreach{
  (name) =>
    println("I'm " + name);
}
```

###出力結果
>I'm Alice
>I'm Bob
>I'm Charlie
>I'm Daniel
>I'm Edward
>I'm Fred

##3. while式
###書き方
while (条件式) { 処理内容 }

###サンプル
```LoopSample.scala
val nameArray = Array ("Alice", "Bob", "Charlie", "Daniel", "Edward", "Fred");
var i = 0;
while (i < nameArray.length){
  println("Nice to meet you, " + nameArray(i));
  i += 1;
}
```

###出力結果
>Nice to meet you, Alice
>Nice to meet you, Bob
>Nice to meet you, Charlie
>Nice to meet you, Daniel
>Nice to meet you, Edward
>Nice to meet you, Fred

##4. do式
###書き方
do { 処理内容 } while (条件式)

###サンプル
```LoopSample.scala
val nameArray = Array ("Alice", "Bob", "Charlie", "Daniel", "Edward", "Fred");
var j = 0;
do{
  println("Hello, " + nameArray(j));
  j += 1;
} while(j < nameArray.length);
```

###出力結果
>Hello, Alice
>Hello, Bob
>Hello, Charlie
>Hello, Daniel
>Hello, Edward
>Hello, Fred
複数のクラスを保持するListを作る

# 概要
スーパークラスのListを作って、実際にはサブクラスを保持しておきます。
abstractでサブクラス毎に別のデータを取得できます。

# サンプル

`A`というAbstractクラスを親として、`X`,`Y`というサブクラスを作ります。

```A.java
abstract class A {
    int a;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    abstract String hoge();
}
```

```X.java
public class X extends A {
    String x;

    public String getX() {
        return x;
    }

    public void setX(String x) {
        this.x = x;
    }

    @Override
    String hoge() {
        return x;
    }
}
```

```Y.java
public class Y extends A {
    String y;

    public String getY() {
        return y;
    }

    public void setY(String y) {
        this.y = y;
    }

    @Override
    String hoge() {
        return y;
    }
}
```

`A`を要素とした`ArrayList`に、`X`,`Y`それぞれを追加します。

```main.java
ArrayList<A> list=new ArrayList<>();
X x=new X();
x.setX("x!!");
Y y=new Y();
y.setY("y!!");
list.add(x);
list.add(y);

for(int i=0;i<list.size();i++){
    System.out.println(list.get(i).hoge());
}
```

```
->

I/System.out: 
x!!
y!!
```
【レポート】AWS Solution Days 2019 〜セキュリティ & コンプライアンス～

セミナー概要 & 資料
https://aws.amazon.com/jp/about-aws/events/2019/solutiondays20190122/
※資料は随時アップされるようです。

# サイバーセキュリティ研究の最新情報

　情報通信研究機構（NICT）
　　JSTの生成・配信が主な業務。
　　その他、サイバー攻撃の観測、バイオテクノロジー研究、衛星などを行っている。
　
　サイバー攻撃の観測
　　ダークネット（未使用のIPアドレスv4）に対して行われたサイバー攻撃を観測している。
　　スキャン型の攻撃が多く、感染したデバイスは、スキャンして次の感染先デバイスを探し、感染が拡大していく。
　　
　　感染デバイスは、一般ユーザーのデバイスが多く、
　　ユーザーは、自身のデバイスが感染していることを気づいていない。
　
　感染デバイスの傾向
　　デバイス
　　　IoT機器 ＞ 54%
　　　・監視カメラ
　　　・ネットワークデバイス
　　　⇒ Linuxの組み込みOS
　　
　　ポート
　　　23/TCP（Telnet） ＞ 40%
　　　22/TCP（SSH）
　　　445/TCP（Windowsのダイレクト・ホスティングSMBサービス）
　　
　　⇒脆弱性を狙った攻撃が多い。
　
　セキュリティ対策
　　コンシューマ
　　　・インターネット側からのアクセス拒否設定
　　
　　ベンダー
　　　・セキュアコーディング
　　　・セキュリティ開発ライフサイクルの整備
　　　・OEMの受入検査強化
　　　・IoT機器受入時のマニュアルの整備

用語
　〇OEM
　　発注元企業のブランド名で販売される製品を製造すること。
　　つまり、外部に委託すること。
　
　〇セキュリティ開発ライフサイクル
　　正式名称：信頼できるコンピューティングのセキュリティ開発ライフサイクル
　　https://securityblog.jp/words/852.html


# CIS AWS Foundations Benchmarks指標の評価
　
　〇CIS Controls
　　組織を保護する。
　　https://www.cisecurity.org/controls/
　
　〇CIS Benchmarks
　　システムとプラットフォームを保護する。
　　https://www.cisecurity.org/cis-benchmarks/
　
　〇CIS AWS Foundations Benchmarkガイド
　　AWSのセキュリティに関するベストプラクティスのガイダンスを提供
　　https://learn.cisecurity.org/benchmarks
　
　〇ガイドに記されている52のチェック項目
　　https://insightwatch.zendesk.com/hc/ja/articles/360002141251-%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E9%A0%85%E7%9B%AE%E4%B8%80%E8%A6%A7-CIS-
　　
　　チェック対象のサービス
　　　・AWS IAM
　　　・AWS Config
　　　・AWS CloudTrail
　　　・AWS CloudWatch
　　　・AWS SNS
　　　・AWS S3
　　　・AWS VPC
　　
　　チェック内容の分類
　　　1. Identity and Access Management
　　　2. Logging
　　　3. Monitoring
　　　4. Network
　　
　　利点
　　　・AWSアカウントのセキュリティオプション設定の規範的なガイダンス
　　　・ステップごとのわかりやすい実装手順と評価手順
　　　・広く使用されている標準であるため、監査が簡単に行える
　　

# AWS Security Hub

　セキュリティワークフロー
　　　　　　　　　　　　　　┌→  Automate   ┐
　　Indentify → Protect → Detect   →   Respond → Recover
　　　　　　　　　　　　　　└→ Investigate ┘
　
　AWSでワークフローを回す際の問題点
　　〇コンプライアンス
　　　・コンプライアンスに準拠しているか確認しづらい
　　　・企業は迅速にコンプライアンスをチェックしたい
　　
　　〇様々なフォーマット
　　　・多数のサービス・ツールでそれぞれ固有のフォーマットを利用している
　　　・それぞれ処理方法が異なってしまう
　　
　　〇優先順位付け
　　　・通知やアラートのレベル感が違い全体としてどれを優先すべきか判断しづらい
　　
　　〇可視性
　　　・各サービスごと管理されているため統合して見づらい
　　　・一つの画面で複数のセキュリティやコンプライアンス状況を確認したい
　　
　　⇒AWS Security Hubが、これらの問題点を解決してくれる！
　
　AWS Security Hubの用語と概念たち
　https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-concepts.html
　
　AWS Security Hubの機能
　　〇Partner integrations
　　　下記の様々な系統のセキュリティ製品と連携できる。
　　　　AWS Partner Network（APN）製品
　　　　・Firewall
　　　　・Endpoint
　　　　・Vulnerabllity
　　　　・Compllance
　　　　・SOAR
　　　　・MSSP
　　　　・SIEM
　　
　　〇継時的変化の監視
　　　Insightsで検出結果をまとめて表示。
　　　処置必要箇所の識別と優先順位付づけされる。
　　　
　　　Insight以外にも、Amazon GuardDutyやAmazon Macieなども集約・一元管理できる。
　　
　　〇マルチアカウントの連携
　　
　　〇コンプライアンスチェックの自動化
　　　CIS AWS Foundation Benchmarkに準拠して、自動でコンプライアンスをチェックできる。
　　
　　〇レスポンスとアクションの自動化
　　　CloudWatch EventをトリガーにLambdaやStep Functionでカスタムした対応が自動でできる。
　　
　AWS Security Hubは無料（AWS Configのみ費用発生）
atcoder ABC103

c問題は解法が浮かんだが桁あふれを想定できていなかった。D問題は簡単だった。
https://atcoder.jp/contests/abc103

#C問題
#方針
全てのaについて最小公倍数を求めそこから-1をした数を各aで割ったあまりを求めていく問題。本質はこの考えで合っているが、最小公倍数を求める時桁あふれしてしまい、結果が変わるので、方針を変えなければならない。よく考えると明らかに、このあまりは各aの値-1であるので、各aについて-1をしたものを足していけば答えがでる。

#D問題
#方針
サンプルを絵に描いてみるとわかりやすいが、左端をソートしてみると、橋をきる回数を最小にするには明らかに多くの範囲を含む橋を切断した方が良い。また、いつひとまとめに切断するグループを切り替えるかを考えると左端をソートした後、右端の中で一番左端のものを更新していき、その右端よりも左端が大きいものがきた時、ひとまとめに切断するグループが切り替わることがわかる。よって、その切り替わった回数がすなわち切断回数なので、この回数が答えになる
Ruby2日目

本日学んだこと。

```rb
class Robot
  def initialize(name) # initialize、インスタンス化したときに初期化
    @name = name
    @x = @y = 0 # @はインスタンス変数です。
  end

  def move(x, y)
    @x += x
    @y += y
  end

  def to_s
    "#{@name},#{@x},#{@y}"
  end
end

robo1 = Robot.new("仮面ライダー1号") # @nameに自動的にinitializeにより代入
robo2 = Robot.new("ソフトウェアー1号")

robo2.move(10,300) # @x,@yに代入される

puts robo1
puts robo2
```

筋トレのWebサイトを作成したいです。
SorceryのRequest specでlogin_userのTest Helperを使う

# Sorceryのrequest spec用 Test Helper
Sorceryを使ったシステムのrequest specにてloginの方法がわからず、やり方を調べました。
何故か公式wikiに方法が載ってなかったので、ご紹介します。
どうやらTestHelperはあるみたいですがwikiの更新がされてないみたいです:sweat_smile:

それでは、やり方です。
公式wikiと同じように`spec_helper.rb` 内で include.

    RSpec.configure do |config|
        config.include Sorcery::TestHelpers::Rails::Request, type: :request
    end

上記を設定するとrequest specで以下のようにして使えるようになります:thumbsup:

    login_user(user, userのパスワード)

但し、他のTestHelperとは違い、パスワードを第２引数として渡してあげる必要があります。
(どうやらこのhelperメソッドはdefaultでパスワードに'secret'が設定されているようです。)
ちなみにソースを見るとlogoutは用意されていないようです。
# 参考
[公式wiki](https://github.com/Sorcery/sorcery/wiki/Testing-Rails)
https://github.com/Sorcery/sorcery/issues/106
https://github.com/Sorcery/sorcery/blob/master/lib/sorcery/test_helpers/rails/request.rb
備忘：CppUTestのインストールからコンパイルまで

`libCppUTest.a`/`libCppUTestExt.a`の存在に気が付かず数日無駄にしたのでメモとして

* 更新
    * 19/01/25 : CppUTestをGitHubから持ってくるように変更

# 環境

Ubuntu 18.04 x64

# 環境構築

コンパイラやらを適当にインストールする

```sh:bash
sudo apt install g++ build-essential git cmake
```

CppUTestのインストール

```sh:bash
# GitHubからソースをもってくる
git clone git://github.com/cpputest/cpputest.git
# CppUTestのビルド
cd cpputest_build
cmake ..
make
# CppUTestのインストール
make install
```

環境変数を設定する
`.bashrc`もしくは`.bash_profile`に下記を一文を追記

```sh:bash
# 環境にあわせてね
# 自分の環境では'/usr/local'にインストールされていた
export CPPUTEST_HOME=/usr/local

# 設定を反映させる。例だと.bashrc
source ~/.bashrc
```

これでインストール作業はおしまい
スクリプトとかあるらしいけどうまくいってない

# 適当なコードを書いてコンパイルする

適当なコード

```c++:HelloCppUTest.cpp
#include <CppUTest/CommandLineTestRunner.h>
#include <CppUTest/TestHarness.h>

TEST_GROUP(TestGroup1){};
TEST(TestGroup1, Test1)
{
    STRCMP_EQUAL("hello", "world");
}

TEST(TestGroup1, Test2)
{
    LONGS_EQUAL(1, 2);
}

int main(int argv, char** argc)
{
  return CommandLineTestRunner::RunAllTests(argv, argc);
}
```

コンパイルする

```bash:bash
g++ HelloCppUTest.cpp -o HelloCppUTest $CPPUTEST_HOME/lib/libCppUTest.a
```

実行結果

```bash:bash
HelloCppUTest.cpp:12: error: Failure in TEST(TestGroup1, Test2)
        expected <1 0x1>
        but was  <2 0x2>

.
HelloCppUTest.cpp:7: error: Failure in TEST(TestGroup1, Test1)
        expected <hello>
        but was  <world>
        difference starts at position 0 at: <          world     >
                                                       ^

.
Errors (2 failures, 2 tests, 2 ran, 2 checks, 0 ignored, 0 filtered out, 0 ms)
```

コンパイルが通り2件のfailがあれば成功

# CMakeでビルド

めんどくさいことはどんどん自動化ということでCMakeを使う
さっきのソースがビルドできるだけの`CMakeLists.txt

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(Project1)

file(GLOB SOURCES
    "./*.c" "./*.cpp"
)

add_executable(cmake_HelloCppUTest ${SOURCES})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)

# add cpputest library
target_link_libraries(cmake_HelloCppUTest $ENV{CPPUTEST_HOME}/lib/libCppUTest.a)
target_link_libraries(cmake_HelloCppUTest $ENV{CPPUTEST_HOME}/lib/libCppUTestExt.a)
```

ビルドする。
ディレクトリが汚れるのは嫌なのでビルド用のディレクトリを作成する。

```sh:bash
mkdir build && cd build
cmake ..
make

# 実行する
./bin/cmake_HelloCppUTest
```

おわり


# 参考

- [Cpputest](https://cpputest.github.io/)
- [CppUTest を試してみる](http://bluewidz.blogspot.com/2018/04/cpputest.html)
- [Cpputestのマルチプラットホーム環境構築からチュートリアルまで](https://qiita.com/RyunoT/items/1b8136cf3d65d001715d)
- [CMake : out-of-sourceビルドで幸せになる](https://qiita.com/osamu0329/items/7de2b190df3cfb4ad0ca)

# あとがき

TDDを学びたく『テスト駆動開発による組み込みプログラミング』を手に取るも環境構築に苦しむ。
静的だの動的ライブラリだのの理解が足りていないと自覚できたのでいい機会だった。
Hugo+Github Pagesで新しい記事を更新するときのための備忘録

## 背景
- HugoとGithubを使った静的ウェブページを作った。サイトは https://kentoids.github.io/
- コマンドラインやGitが不慣れで色々苦労したので次回記事をアップデートする時用に色々メモっておく

## 新しいPageまたはPost

```
hugo new post/<記事名>.md
```

正直これは今すでにある記事をコピペでいい気がする
そして新しい記事の内容を色々書いていく。
途中で確認するには

```
hugo server
```

をしたあと
http://localhost:1313/
を確認すれば現状がみられる。

満足したら

```
hugo
```

これでpublicに静的ファイルが生成される

## git周り

webpageのディレクトリから変更をコミット

```
git add .
git commit -m <コミットメッセージ>
git push
```

そして生成されたpublicのディレクトリに移動してそっちでもコミットする（サブモジュール）

```
cd public
git add .
git commit -m <コミットメッセージ>
git push
```

そしてwebpageの方のディレクトリに戻ってgit statusを見ると、サブモジュールがまだmodified状態になっているのでUpdateしてあげる

```
git submodule update public
```

これはこのサイトを参考にしたんだけど、読んだ感じ、publicに移動しないでそのまま

```
git add public
git commit -m <コミットメッセージ>
```
でも行けるのではないかという気になったが、面倒なので次回検証する
https://stackoverflow.com/questions/6006494/git-submodule-modified-files-status

これで更新終了。あとはサイトで出来を見る

## 参考サイト

HUGOでブログ作成 → GitHub Pagesで公開する手順
https://chanmitsu55.github.io/2017/12/25/2017-12-25-create-blog-by-hugo/

detached HEAD から脱出する方法を git の内部構造から探る
https://qiita.com/Kuniwak/items/4e5d55d6888e5f6411fe
USBについてのメモ#1

USBに関しての雑多なメモ。

#ホストとデバイス
- USBの世界においてはホストが絶対的
- すべての通信は基本的にホストから通信を開始する
- デバイスはホストからの要求にこたえる形で自身の情報を送ったり、データを送ったりしている

#デバイス接続時の動作
- デバイスがD+/-のどちらかをプルアップ(+5V)する
- D-がプルアップされたときはLow Speed接続
- D+がプルアップされたときはHigh SpeedまたはFull Speed接続となる
    - デバイスがHigh Speed接続に対応しているときはUSBリセットの期間中にホストからのChirpパケットに対して反応する
    - ホストはChirpパケットに対してデバイスから反応がなかったらFull Speed接続で接続するようになる

#USBの転送について
大まかな流れとしては、エニュメレーション通信をして、ホストがデバイスの情報を取得し、そのあとにデータのやり取りを実施する。

###転送の種類
- コントロール転送
    - デバイスの能力に関する情報をやりとりする転送
    - エニュメレーション通信はコントロール転送により実現している
    - セットアップステージ、データステージ、ステータスステージという一定の構造を持っている
    - クラスまたはベンダが独自に定義したリクエストも送ることが可能 
- バルク転送
    - 時間に制約のないデータの転送に利用される
    - 大量のデータ転送に向いている
    - ホストからプリンタにデータを送る、スキャナからホストへデータを送る場合などに使われている
    - 優先度が低く、バスがビジー状態の場合はバルク転送は転送を待たされる
- インタラプト転送
    - 指定された時間内にデータを転送する必要がある場合に使用
    - マウスやキーボードなど
    - ホストは常にポーリングでリクエストを出し、デバイスが素早くデータを返すことにより、割り込みのようなかたちに見える転送である
- アイソクロナス転送
    - データが一定速度、かつ特定の時間内に送られなければならない転送に使われる
    - リアルタイムに動画や音声をストリーミングで流す場合に有用

###IN転送とOUT転送について
- IN転送はホストがデバイスからのデータを受け取る
- OUT転送はホストがデバイスへデータを送る
- 上記からもわかる通り、基本的にホスト中心である
![IN_OUT転送.png](https://qiita-image-store.s3.amazonaws.com/0/294245/05c75275-8ff7-2035-66ec-c6bb979949dd.png)

#USBの状態遷移
以下の状態を遷移する。

- Attached
    - USBデバイスがホストに接続された状態
- Powered
    - USBデバイスがホストに接続され、デバイスにVbus電力を供給開始した状態
- Default
    - バスリセットが行われ、通信ができるようになった状態 
- Adress
    - USBデバイスにアドレスを割り当てた状態
- Configured
    - USBデバイスのConfigurationが終了し、利用可能な状態
- Suspended
    - バス上に3ms以上の状態変化がなかった場合に、電力を制限するモード

![USB_state_machine.png](https://qiita-image-store.s3.amazonaws.com/0/294245/d2e63ba9-92ac-3be4-25df-f403a9863ac7.png)

###エニュメレーション通信
- ホストがデバイスの情報を取得するときの通信。
- ホストからデバイスへ、デバイスに関する情報(どういう機能のデバイスか等)が書かれているディスクリプタという構造体を要求し、デバイスはそのディスクリプタをホストへ送る。
- エニュメレーションの間、ホスト、デバイスはPowered、Default、Adress、Configuredの4つの状態を遷移する。

####エニュメレーション通信のステップ
1. ユーザーがデバイスをUSBポートに接続
2. ハブはデバイスを検出
3. ホストは新しいデバイスについて知る
4. デバイスがLow SpeedかFull Speedかをハブが検出
5. ハブはデバイスをリセット
6. Full SpeedデバイスがHigh Speedをサポートしているかをホストが知る
7. ハブがデバイスとバスの間に信号バスを確立
8. ホストはGet_Descriptorリクエストを送り、デフォルトパイプの最大パケット長を知る
9. ホストのアドレス割り当て
10. ホストがデバイスの性能について把握
11. ホストはデバイスドライバを割り振り、ロードを行う
12. ホストのデバイスドライバがコンフィギュレーションを選択する
fish shellでrmが一旦ゴミ箱に行くようにする

# tl; dr
```config:config.fish
if [ -d $HOME/.Trash ]
  alias rm='mv --backup=numbered --target-directory=$HOME/.Trash'
end
```
これでrmしてもホームディレクトリの.Trashフォルダに入り、
ファイル名が被っても上書きされないように勝手に数字がつくぞ。

**注意**：
この方法はガバガバなので、スクリプトで`rm -rf`とかやられると、`mv`には当然そのオプションはないので、エラーを吐くぞ！
良い子はもっといい方法を探そう！

# 紆余曲折
小生は[現場猫](https://dic.nicovideo.jp/a/%E7%8F%BE%E5%A0%B4%E7%8C%AB)並に雑な指差喚呼でヨシ！して、大事なファイルを`rm -rf`したりするので、
rmしても復元できるようにしようと思い立った。
ただ、小生の環境（職場PC）は少々（大分）特殊で、

- OS：Windows 10 Home
- ターミナル：WSL + Wsltty(mintty派生)
- Shell：fish

という少数派の満漢全席である。
そのため、`trash-cli`や`rmtrash`みたいなものは入らず（入ってもパーミッション諸々で効果がなかった）、
仕方なくrmにエイリアスをつけ、mvで仮設ゴミ箱（`$HOME/.Trash`とした）に入るように設定することにした。

がしかし、fishはbashのスクリプトが使えないためそのままでは世間さまのスクリプトが使えない。
そこでfishの解説などを漁って、上記のものができた。

ポイントは以下2点。

- 環境変数`$HOME`の展開は`${HOME}`ではなく、そのままでOK
- ifの構文では`then`がいらず、閉じは`end`

ここ最近fishを使っているので、少しずつfishのscriptにも慣れようと思いました（小並感）。

# 参考
[rmをmvに置き換える - 計算物理屋の研究備忘録](http://keisanbutsuriya.hateblo.jp/entry/2015/03/21/171333)
[fishチュートリアル - 全訳！fishシェル普及計画](http://fish.rubikitch.com/tutorial/)

# 番外
[Linuxでうっかりrm -rfしちゃったけど復活出来たよー＼(＾o＾)／ - y-kawazの日記](http://d.hatena.ne.jp/y-kawaz/20110123/1295779916)
ファイルがext系ならextundeleteが使えるということですね...!
今度からやらかした時はサーバを即haltして外部からこれやってみるしかないな（）
というかそうならないように指差喚呼を確実に実行ヨシします。
OpenFOAMをステップ実行したい 1

# 背景
OpenFOAMのコードを理解したいと思うがコードを読んでも私は分からない。
そもそもC++が分からないし、プログラマじゃないので一般的なお作法を知らないので「コードはmainが大本だよね」みたいなことも知らない。
とりあえず体当たりでlaplacianFoamあたりをステップ実行してみたいと思う。

# 予定

1. ツールの選定、インストール
2. ツールの使い方を学習
3. laplacianFoamあたりをステップ実行
4. 簡単な流れをまとめる

# ツールの選定
ステップ実行のツールとしてgdb, Eclipseとかあるらしい。
gdbはコマンドベースで学習コストが高い。
参考サイト様https://qiita.com/ShikiSumiya/items/a08363db88f21c81d351

同じ学ぶならEclipseのほうが将来の役にも立つのではないかと思う。
よし　Eclipseをインストールしよう

## Eclipseのインストール
Windowsしか使えないためWSLのUbuntuにEclipseをインストールすることを考える。
仮想化環境はどうにも立ち上げる手間や不具合が多く好きになれない。
Eclipseをインストールしようとした際に情報の多さにビックリした。
sudo apt　install
とかでインストールできないのか？
参考サイトを探すが一番Step by Stepで書いてあるのが以下のサイトだった。
https://www.cs.odu.edu/~zeil/FAQs/Public/win10Bash/
英語だが、sudo とかの意味まで書いてある。

とりあえず上記のサイト通りにやっていこう

## インストール手順
### 1 Get Linux for Windows 10
私はもうインストールしているので飛ばす

### 1.1 sudo apt-get
　環境をアップデートする

```bash
sudo apt-get update
```
管理者権限のパスワードを聞かれるので入力。
以下のメッセージが出てきたらYを入力してエンター

```
Do you want to continue? [Y/n] Y
```
以下のようなメッセージが出て完了した

```
(省略)
et:25 http://archive.ubuntu.com/ubuntu xenial-backports/universe amd64 Packages [7,420 B]
Fetched 3,858 kB in 1min 3s (60.3 kB/s)
Reading package lists... Done
```

次は以下でアップグレード

```
sudo apt-get upgrade
```
3時間位かかって終了

### 2 X
グラフィカルな表示を行うために以下のソフトウェアのいずれかをインストールするらしい。
 - VcXsrv
 - XMing
 - Cygwin/X 
XMingが"probably a good bet"ということでおすすめのようだ。
私は既にインストールしているのでインストール工程は飛ばす。

次にちゃんとGUI表示が上手くいくかの確認
以下でXアプリケーションをインストールして実行

```
sudo apt-get install xterm   
DISPLAY=:0 xterm &  
```
なんか表示された。
ここからLinuxコマンドを打てる。とりあえず表示はよさそうだ。
![xterm .png](https://qiita-image-store.s3.amazonaws.com/0/244254/07cc8480-86ef-7457-d370-02b78a728236.png)

ただ、xtermが動作がおかしいらしく起動していると数十秒フリーズするという現象が頻発した。
最終的にフリーズしてしまい強制終了した。

参考サイトでは「DISPLAY=:0を毎回打ちたくない」ので省略できるよ、とそのやり方を説明している。
エディタnanoを使って変更するという少し珍しい事をしている。
nanoについては以下のサイトが参考になる。
http://www.obenri.com/_nano/close_nano.html
別にエディタはなんでもよい

```
nano ~/.bashrc
```
bashrcの一番下に以下を入力

```
export DISPLAY=:0
```

ctrl+xで保存かどうか聞かれるので
yを押す。
保存ファイル名を聞かれるのでEnterを押す。

XMingを起動した状態で以下を実行しxtermが起動することを確認する。


```
xterm &
```

### 3 Installing the Compilers
ようやくコンパイラだ・・・
時間がかかった

必要なのは以下の4つ
EclipseはJavaで動くのでJDKが必要

- The Java run-time (JDK)
- The g++ compiler for C++.
- The gdb debugger.
- The make project build system.

```
sudo apt-get install default-jdk
sudo apt-get install g++
sudo apt-get install gdb
sudo apt-get install make
```

jdkは15分くらいかかってインストール
g++は「g++ is already the newest version (4:5.3.1-1ubuntu1).」で最新だった
gdbはなかったようで、3分位でインストール
makeも最新
以下のコマンドで問題がないか確認する。

```
java -version
g++ --version
gdb --version
make --version 
```


### 4 Installing Eclipse
長い時間がかかったがこれでようやくEclipseをインストールできる。

以下のサイトから「Eclipse IDE for C/C++ Developers」のLinux64bit版をダウンロード
https://www.eclipse.org/downloads/packages/

![eclipse.png](https://qiita-image-store.s3.amazonaws.com/0/244254/99b4325c-2406-f147-08f2-27bea56b3bf6.png)

Linux上にEclipseの圧縮ファイルをコピーして解凍

```
cd ~
cp /mnt/c/Users/your-Windows-login-name/Downloads/eclipse-java-*.tar.gz .
tar xvzf  eclipse-java-*.tar.gz
ls    
```

XMingを立ち上げた状態で以下を実行

```
~/eclipse/eclipse &
```

無事起動した
![eclipse_start.png](https://qiita-image-store.s3.amazonaws.com/0/244254/3fb3e905-648a-f177-9a91-76bf9881aa36.png)

続きはまた今度・・・