OmniAICreator/Qiita-1.07M huggingface dataset:
Hands-on : Windows VirtualBox + Ubuntu 18.04 + Docker + TensorFlow

# 概要
ハンズオン用にTensorFlow環境をセットアップします。

#VirtualBoxのインストール
Oracle VirtualBoxダウンロードサイト
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads
最新版(本記事作成時は5.2.12)をインストールしてください。
https://download.virtualbox.org/virtualbox/5.2.12/VirtualBox-5.2.12-122591-Win.exe [108MB]

# Ubuntuのダウンロード
https://www.ubuntu.com/download/desktop
最新Desktop版をダウンロードしましょう。
ubuntu-18.04-desktop-amd64.iso [1.78GB]

# Ubuntuのインストール
- VirtualBoxの起動
- 新規
- 名前:ubuntu-18.04-desktop-amd64
- メモリ1024MB:作成
- ストレージ10GB:作成
- ubuntu-18.04-desktop-amd64を選択
- 設定(Ctrl+S)
- ストレージ
- CDアイコンを選択
- 光学ドライブ(D):IDE セカンダリマスター横のCDアイコン
- 仮想光学デスクファイルを選択で、ubuntu-18.04-desktop-amd64.isoを選択
- OK
- ネットワーク
- アダプター 2
- ネットワークアダプターを有効化をチェック
- 割り当て：ホストオンリーアダプター
- OK
- ubuntu-18.04-desktop-amd64を起動
- インストール言語に日本語を選択
- Ubuntuをインストール
- キーボードレイアウト：続ける
- アップデートと他のソフトウェア：「最小インストール」「その他のオプションのグラフィックスとWi-Fiハードウェアと・・・」をチェックし、続けるボタン押下
- インストールの種類：デスクを削除してUbuntuをインストールを選択し、インストールボタン押下
- デスクに変更を書き込みますか？：続ける
- どこに住んでいますか？：続ける
- インストール：あなたの情報を入力してください：続けるボタン押下。
- 今すぐ再起動する。
- Please remove the installation medium, then press ENTER:ENTER

※VM:ubuntu-18.04-desktop-amd64のサイズ[5.42GB]

# UbuntuのCUI起動設定
Ubuntu Desktopをインストールしましたが、軽量化するためCUI起動に切り替えます。
- ログイン
- アプリケーションアイコンを押下
- 検索窓から*terminal*を起動
- CUI起動設定

```bash
$ sudo systemctl set-default multi-user.target
[sud] XXX のパスワード:
Created symlink /etc/systemd/system/default.target →/lib/systemd/system/multi.user.target.
$
```

- sshdのインストール

あわせて、sshdのセットアップも済ませておきます。

```bash
$ sudo apt -y install openssh-server
$ sudo reboot
```
# パッケージ更新
TeraTerm等のターミナルソフトを使用しsshログイン、パッケージを最新のものにアップデートしてください。

```bash
$ sudo apt -y update
$ sudo apt -y upgrade
```
※VM:ubuntu-18.04-desktop-amd64のサイズ[6.65GB]

# dockerのインストール

```bash
$ sudo apt -y install docker.io
```

docker hello-worldを試します。

```bash
$ sudo docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
...
Hello from Docker!
...
```

# TensorFlowのインストール
TensorFlowをDockerで起動します

```
$ sudo docker run -it -p 8888:8888 tensorflow/tensorflow:latest-py3
```
ブラウザから、ホストオンリーアダプターのIPアドレスについて指定されたトークンを使用し、JupyterNotebookを起動します。

```
http://192.168.56.101:8888/?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

最後に、TensorFlowでHello worldできたらインストール成功です。

```python
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
```

```python
Hello, TensorFlow!
```
※VM:ubuntu-18.04-desktop-amd64のサイズ[7.83GB]

お疲れさまでした。
RailsでSemantic UIを使ってみる_100DaysOfCodeチャレンジ27日目(Day_27:#100DaysOfCode)

## はじめに
この記事はTwitterで人気のハッシュタグ#100DaysOfCodeをつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した27日目の記録です。

## 動作環境
* Rails 5.2.0
* ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]

## 本日学んだこと

* Semantic UIの使い方

## Semantic UIとは？

Semantic UIは、デザインフレームワークの一種。

代表的なものにBootstrapがあり、こちらについては名前を聞いたことがある人もいるでしょう。

## 公式サイト

https://semantic-ui.com/

## Semantic UIの特徴

これは個人的な感想ですが、Bootstrapよりも、**クラス名がかなり直感的で、どんな効果になるのか想像しやすい**ですね。

```HTML
<div class="left floated twelve wide column">
  <div class="ui checkbox">
    <input type="checkbox" name="task" 
           v-on:click="$parent.toggleDone($event, task.id)" 
           :checked="task.completed" >
    <label>{{ task.name }} 
      <span class="description">{{ task.description }}</span>
    </label>
  </div>
</div>
```

上記のコードは、Vue.jsのtemplateオプションに使用したHTML。

クラス名に記載しているものは全て、Semantic UIのものになります。

例えば、グリッドレイアウトの指定は、Bootstrapの場合`col-12`のように指定しますが、Semantic UIの場合は`twelve wide column`のように、ネーミングがきっちりとしていますよね。

「クラス名が長いとめんどくさい。。」と思うかもしれませんが、個人的には初心者でもイメージしやすいネーミングの方が重要だと思います。

この辺は完全に好みかもしれませんけどね。

## Railsでの導入方法

それではここから、Railsでの導入方法について、解説していきます。

まずは、Railsで使用するためにGemfileを編集します。

```yaml
# Gemfile
#semantic UI Framework
gem 'semantic-ui-sass'
```

追記したら、忘れずに`bundle install`をしましょう。

```shell
# --jobs=4をつけると、bundle installがめっちゃ早く終わります。
bundle install --jobs=4
```

続いて、`application.scss`に`semantic ui`をimportします。

```scss
/* app/assets/stylesheets/application.scss */
@import "semantic-ui";
```

導入の方法は、たったこれだけ。あとは、[公式サイト]()に記載のクラス名を指定するだけで、OK。

注意点としては、個別でスタイルを当てる場合、`!important`を指定しないとSemantic UIのスタイルが優先されること。

あまり`!important`は多様しない方がいいのですが、デザインフレームワークを使う以上はやむなしかも。。

## 今回使用したSemantic　UIのコンポーネントをピックアップ

#### sidebar

ページにサイドバーをつけることができるコンポーネント。

```html
<div class="ui sidebar">
</div>
```

該当ページ
https://semantic-ui.com/modules/sidebar.html


#### menu

メニューのUIを作ることができるコンポーネント。`vertical`と組み合わせると、縦型のメニューを作成します。

また、`inverted`を指定すると、色を反転させて、コントラストを大きくすることができます。

```html
<div class="ui inverted vertical menu">
</div>
```

該当ページ
https://semantic-ui.com/collections/menu.html

#### visible

クラス内にある要素を表示可能にします。

```html
<div class="ui visible"></div>
```

該当ページ
https://semantic-ui.com/collections/message.html

#### fixed

文字通り、表示位置を固定します。`fixed left`のようにすれば、常に左側に固定表示されるようになります。

```html
<div class="ui fixed"></div>
```

該当ページ
https://semantic-ui.com/collections/menu.html

### クラスを組み合わせると。。。？

以下のように複数のクラスを組み合わせると、画像のようなサイドバーができます。

```html
<div class="ui sidebar inverted vertical menu visible fixed left">
</div>
```


![sidebar.png](https://qiita-image-store.s3.amazonaws.com/0/195539/5332bcdf-7759-e497-ed77-20536c1719b6.png)



##
Raspberry PiとUSBプリンタ（EPSON PX-402A）をGoogleクラウドプリント化してChromeOSからプリント


# 背景
Chromebookから印刷したい。
Googleクラウドプリント対応してるプリンタがない。
[Google クラウド プリント](https://www.google.com/intl/ja_ALL/cloudprint/learn/)
USBプリンタはある。でもUSB接続してもドライバがない。
ラズパイもある。作るか。

# CUPS
まず、ラズパイでプリンタを使えるようにするために、CUPSを入れた。

[Common Unix Printing System - Wikipedia](https://ja.wikipedia.org/wiki/Common_Unix_Printing_System)
[CUPS.org](https://www.cups.org/)

ここを参考にした。
[ラズベリーパイにプリンタを設定して印刷するには | FABSHOP.JP -デジタルでものづくり！ ファブショップ ！](https://www.fabshop.jp/raspberrypi-printer-setup/)
[ラズベリーパイ プリンタの接続 | ラズベリーパイの導入 | ラズベリーパイ勉強室 | 株式会社アイネックス｜Webシステム構築 | データ復旧サービス ｜ホームページ作成 | ＡＳ４００ソリューション](http://www.inex.co.jp/rasbpi/rasb10-09.html)

GUIでポチポチして、ドライバを入れた。
うちのプリンタPX-402Aのドライバがリストになかったので、PX-401Aを入れてみた。動いた。

[カラリオプリンター PX-402A｜サポート＆ダウンロード｜エプソン](https://www.epson.jp/support/portal/support_menu/px-402a.htm)

こんな感じ。
![Screenshot 2018-07-15 at 23.26.43.png](https://qiita-image-store.s3.amazonaws.com/0/184221/f68c6606-3b77-49a5-0ffe-977ba62d2bce.png)

# cloud-print-connector
何個かやり方ありそうだけど、Googleが出してるものを使うことにした。

[Installing on Raspberry Pi Raspbian Jessie · google/cloud-print-connector Wiki · GitHub](https://github.com/google/cloud-print-connector/wiki/Installing-on-Raspberry-Pi-Raspbian-Jessie)

結構めんどくさそうだけど、何も考えず手順にそってすすめてく。

## go
goを入れる必要がある。
入ってなかったので入れる。
最新版じゃなくてよさそうなので、apt-get installする。

```
sudo apt-get install golang
go version
```

.bashrcにちょっと追加。
$PATHは設定しなくてもとりあえず問題ない。

```bash:.bashrc
export GOPATH=$HOME/.go
```

```
source .bashrc
```

### 参考
[GOPATH は適当に決めて問題ない - Qiita](https://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f)

## Build from source
ビルドする。必要なものいれて`go get`するだけ。
これにそってすすめてく。
[Build from source · google/cloud-print-connector Wiki · GitHub](https://github.com/google/cloud-print-connector/wiki/Build-from-source)

```
sudo apt-get install build-essential libcups2-dev libavahi-client-dev git bzr
go get github.com/google/cloud-print-connector/...
```

## Installing on Raspberry Pi Raspbian Jessie
これにそって進めてく。言われるがままにやる。新しいユーザー作って、適切な場所にファイル移して権限設定してGoogleアカウントと紐付ける感じ。
アカウントは自分しか使わないし、メインのアカウントを使ってみた。
`GOPATH`を`~/.go`にしちゃったので、そこをちょっと修正。

[Installing on Raspberry Pi Raspbian Jessie · google/cloud-print-connector Wiki · GitHub](https://github.com/google/cloud-print-connector/wiki/Installing-on-Raspberry-Pi-Raspbian-Jessie)

## Run Connector Automatically on Boot
これにそって再起動しても動くように設定していく。言われるがままやる。

[(Linux) Run Connector Automatically on Boot · google/cloud-print-connector Wiki · GitHub](https://github.com/google/cloud-print-connector/wiki/%28Linux%29-Run-Connector-Automatically-on-Boot)

# 結果
ラズパイからでも、Chromebookからでも印刷できるようになった。Androidからでもできるはず。
無線ってすばらしい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/dffbd9c1-75f1-4f18-ef68-155ac64ad81e.png)

iPhoneからはできないので別途AirPrintサーバ化必要。
RNN(LSTM,GRU)のハイパーパラメータ

# 言語モデリングにおけるRNN
[The Unreasonable Effectiveness of Recurrent Neural Networks](https://arxiv.org/pdf/1506.02078.pdf)[1]の中でCharacter-Level Language Modelingを用いてRNN(LSTM,GRU)のハイパーパラメータ比較がされている。

## Character-Level Language Modelingとは
原文
> We’ll train RNN character-level language models. That is, we’ll give the RNN a huge chunk of text and ask it to model the probability distribution of the next character in the sequence given a sequence of previous characters. This will then allow us to generate new text one character at a time.

日本語訳(Google翻訳)
> RNNの文字レベルの言語モデルを習得します。 つまり、RNNに大量のテキストを与え、シーケンス内の次の文字の確率分布を前の文字列でモデル化するよう依頼します。 これにより、一度に1文字ずつ新しいテキストを生成することができます。

## 比較結果
Leo Tolstoy’s War and Peace (WP) novelとthe source code of the Linux Kernel (LK)の２つのデータセットを用いて比較を行った結果が下図。
![result](https://qiita-image-store.s3.amazonaws.com/0/271751/d803875e-4c6b-58a2-3c5f-2aa283297225.png)
- 3層よりも2層のほうが優れた結果を出している
- LSTMとGRUがRNNよりも優れている
- 右図からLSTMとGRUが同様の予測をしていて、RNNは独自の予測をしているとわかる
- LSTMとGRUは、データセットによって結果が異なる

LSTMとGRUのどちらが優れているか一概にはいえないので、**自分のデータセットで試してみることが大事**と言える。

# 音声認識におけるRNN
[Neural Speech Recognizer: Acoustic-to-Word LSTM Model for Large Vocabulary Speech Recognition](https://arxiv.org/pdf/1610.09975.pdf)[2]の中でNeural Speech RecognizerをテーマとしたのRNNハイパーパラメータが紹介されている。
![speech recognition](https://qiita-image-store.s3.amazonaws.com/0/271751/d0578a49-d20b-f99c-24f7-23088bd2b1f3.png)
音声認識では5層または7層の結果がよかったよう。

# まとめ
どのようなハイパーパラメータを用いてネットワークを構成したらよいかは一概には言えないので、自分の行うタスクに類似した先行研究の結果を参考にいろいろ試すべき。

# 参考文献
[1] [Visualizing and Understanding Recurrent Networks by Andrej Karpathy, Justin Johnson, Li Fei-Fei](https://arxiv.org/pdf/1506.02078.pdf)
[2] [Neural Speech Recognizer: Acoustic-to-Word LSTM Model for Large Vocabulary Speech Recognition by Hagen Soltau, Hank Liao, Hasim Sak](https://arxiv.org/pdf/1610.09975.pdf)
DensePose で単一 RGB 画像から三次元ポーズ推定を行う(2018 年 7 月 15 日時点)

漢なら単一 RGB 画像から DensePose で三次元ポーズ推定, 三次元ボディ形状推定したいですね!

http://densepose.org/

やりましょう!

できました.

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ねんがんの DensePose での三次元形状推定にせいこうしたぞ!!!!! ㊗️㊗️㊗️㊗️㊗️🎉🎉🎉🎉🎉✨✨✨✨✨🎉🎉🎉🎉🎉✨✨✨✨✨💪💪💪✌️✌️✌️✌️😍😍😍😍💪💪💪💪💪😆😆😆😆 <a href="https://t.co/8kz7z4n00y">pic.twitter.com/8kz7z4n00y</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/1018442900651118592?ref_src=twsrc%5Etfw">July 15, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 環境

2018 年 7 月時点の構成です.

* Ubuntu 16.04
* miniconda
* GTX 1080 Ti
* CUDA 9.0(8.0 が安定しているようです. 9.1 はたぶん動きません) 
* NCCL2
* cuDNN 7.1.4(7.0 など, 古いと caffe2 prebuilt とバージョンが合わずに実行時にエラーが出ます)
 
## セットアップとビルド

### 注意点

DensePose(detectron, caffe2 も?)は python2 で記述されているので, python2 環境で動かす必要があります(cPickle など, python2 でしか使っていないライブラリを使っているため)

caffe2 detectron op は **GPU のみ** のサポートになります. したがって CPU で動かすのができませんので注意です.
(CPU 版 caffe2 だと, 実行時に detectron op が見つからないなどのエラーが出ます)
 
detectron は `DensePose` に付属の, DensePose 用に修正されたものを使います
(ビルドは `DensePose` 内で `make`)

すでに `Detectron` git repo https://github.com/facebookresearch/Detectron などをインストールしていると, 実行時に `Non-existent config key: BODY_UV_RCNN` エラーになるので注意です!

https://github.com/facebookresearch/DensePose/issues/9

Docker 環境に慣れているひとは, Dockerfile があるのでそちらを利用するのが都合がよいかもしれません.

## ライブラリのインストール

https://github.com/facebookresearch/DensePose/blob/master/INSTALL.md

を参考にします.

anaconda/miniconda で python 2.7 環境を作っているものとします.

```
$ conda create -n py27 python=2.7
```

python 2.7 環境にします.

```
$ source activate py27
```

caffe2 + CUDA 9.0 + cuDNN7 の prebuild binary をインストールします.

https://caffe2.ai/docs/getting-started.html?platform=ubuntu&configuration=prebuilt

```
$ conda install -c caffe2 caffe2-cuda9.0-cudnn7
```

cocoapi は, 推論だけならインストールいらないかもしれませんので省きます.

DensePose の依存パッケージをインストールします.

```
$ pip install -r $DENSEPOSE/requirements.txt
```

make します. これにより DensePose 用にカスタマイズされた `detectron` モジュールもビルドされます.

```
$ cd $DENSEPOSE
$ make
```

データを取得します.

```
$ cd $DENSEPOSE/DensePoseData
$ bash get_densepose_uv.sh
$ bash get_eval_data.sh
```

これで準備できました!

## 推論する.

https://github.com/facebookresearch/DensePose/blob/master/GETTING_STARTED.md

を参考に, `infer_simple.py` を実行します.

```
$ python2 tools/infer_simple.py \
    --cfg configs/DensePose_ResNet101_FPN_s1x-e2e.yaml \
    --output-dir DensePoseData/infer_out/ \
    --image-ext jpg \
    --wts https://s3.amazonaws.com/densepose/DensePose_ResNet101_FPN_s1x-e2e.pkl \
    DensePoseData/demo_data/demo_im.jpg
```

一番最初に学習済みモデル(500MB くらい)のダウンロードが始まります.

`DensePoseData/infer_out` に結果が出力されます(レンダー？された 3D 形状. UV によって色分けされています).

1080 Ti(130W に powerlimit) で, 推論の処理は 1 ~ 2 秒くらいでした. なかなか早いですね!

## 関連項目

単一画像からの最新ディープラーニング顔アルゴリズムを試す(2017 年 7 月 14 日時点)
https://qiita.com/syoyo/items/5277906d29b2dd49e3a2

PRNet を C++11 で動くようにして単一画像からの 3D 顔復元を行う.
https://qiita.com/syoyo/items/34be69a4b3bfe9174eeb

## TODO

* 推論されたボディ形状とテクスチャを .obj でエクスポートする
* モバイルでうごかしたい(pytorch 1.0 に期待?).
* zozosuit で三次元ポーズ形状推定したい.
* Tik Tok ダンス動画からポーズ推定したい.
* DensePose により, **優秀な三次元ポーズ形状若人が, 人類史上最速で育成なされるスキーム**を確立する旅に出たい.
【Xcode10】マルチカーソルのやり方


## Xcode 10 マルチカーソル
Xcode10からマルチカーソルが使えるようになったので紹介します。

```swift
Control + Shift + 矢印キー
```

```swift
Control + Shift + クリック
```

宣言していた`let`を全て`var`に変更したいとか
全てに`private`をつけたいなどあった場合に便利です

```swift
var hoge: String
var fuga: String
var piyo: String
```
上から下にしたい場合とか

```swift
private let hoge: String
private let fuga: String
private let piyo: String
```

マルチカーソルを使うと一瞬で変更可能
Xcode起動時に前回の画面から再開する方法

自分用の備忘録、Xcode起動時に再開できないことで困っている人向けに記事を作成しました。

## Xcode起動時に前回の画面から再開する方法

いままでXcodeで実装している場合、`⌘+Q`でXcodeを終了、再度Xcodeを利用する場合は
起動後に `⌘+o` で前回作業していたプロジェクトを毎回選択して開いていました。

一般的な開発エディタには起動時に再開するオプションを用意してくれていますが、
Xcodeはないのだろうかと疑問に思い調べた結果、`Xcode5`時代から存在している操作で対応できました。
操作方法ですが、`optionキー`を押すと終了メニューの文言が変わって終了時の状態から復帰できる終了メニューである`Quit and Keep Windowｓ`に変化します
▼ 以下の`Quit Xcode`の項目が変化します
![スクリーンショット 2018-07-15 23.59.31.png](https://qiita-image-store.s3.amazonaws.com/0/61040/4851f818-baa5-b866-a9d1-ea3f54ee9669.png)
これでその他開発エディタと同じように前回の状態から再開することができます。

----
## BetterTouchTool による応用技
### <b>[BetterTouchTool](https://folivora.ai/)</b>

以下の通り設定することでいままでと同じ通りに`⌘+Q`のショートカットで`Quit and Keep Windowｓ`を実行できます
![setting_rei.png](https://qiita-image-store.s3.amazonaws.com/0/61040/b87097d2-b91b-dd72-d9f6-b4427c4b4bf1.png)
Windows便利機能まとめメモ

#定期的にexeファイルを起動する
Task Schedulerを起動する．
Create Basic Taskを選択する．

Display all the running task でタスクスケジューラの確認もできる．


条件: Windows10

#batファイル
テキストで編集し，ファイル名を.batにする．ダブルクリックするとテキストの内容が実行される．書いた内容はcmdで実行される．例えば以下の内容をメモ帳などに記入し，"example.bat"という名前で保存する．bat拡張子を使用する．

```
set name=Run                   #nameという変数にRunを代入            
Example.exe < %name%.txt       #exeファイルの実行
　　　　　　　　　　　　　　　　　#exeファイルに必要な入力に"Run.txt"の内容を与える
cd C:\temp                     #ディレクトリの変更もできる
python example.py              #pythonの実行　　　
pause                          #エラーチェックのため．pauseがないとエラー内容がわからない
```

#スタートメニューにピン止め
Windows10において，スタートメニューにショートカットをピン止めする方法．

1. C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programsにショートカットを移動する．例) example.batのショートカット
2. 1の手順により，アプリの一覧にショートカットが出現
3. アプリの一覧のショートカットで右クリックし，スタートにピン止めする．
（自分用）現在開いているターミナルの子プロセスを止める方法

## コマンド
<pre>
$ ps ax \
>  | grep ${ssH_TTY:5} \
>  | awk '{print $1}' \
>  | xargs -I% kill -9 %
</pre>

### 利用例
特にtailコマンドを止めたい場合

<pre>
$ ps ax \
>  | grep ${ssH_TTY:5} \
>  | grep [t]ail \
>  | awk '{print $1}' \
>  | xargs -I% kill -9 %
</pre>
SPARC Assembly Language

SPARC Assembly Language Reference Manual
May 2002
https://docs.oracle.com/cd/E18752_01/html/816-1681/index.html

アセンブラ編 - OSごとに微妙に異なるスタイルを使い分ける
https://news.mynavi.jp/article/helloworld-5/

[パタヘネ][sparc][binary]関数呼び出しsparc編Add Star
http://d.hatena.ne.jp/natsutan/20080828/1219896335

 SPARC Servers > ダウンロード > カタログ・技術資料 > ホワイトペーパー
http://www.fujitsu.com/jp/products/computing/servers/unix/sparc/downloads/documents/whitepapers/?fb#application

大熱血！アセンブラ入門 サポートページ
http://kozos.jp/books/asm/

#文書履歴(document history)
ver 0.10 初稿 20180716

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Cloud9にCCXTを導入しようとしたらなんかパーミッション的なエラーがどうのこうの


# やりたかったこと
```
$ pip install ccxt
```



# 実際の挙動

```
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/bin/easy_install'
Consider using the `--user` option or check the permissions.
```

##　調べた結果

sudoつけろ的な回答が出てきました。
英語でしたがたぶんそうだと思います。


# 対策した結果
**はいはいsudoね、とやってみたらエラーが出ました。**

```
$ sudo pip install ccxt                                                                                     
sudo: pip: command not found
```

pipが見つからないって言われます。

## ググった結果

- [Python - python2.7.10でpip:command not foundになる。(35614)｜teratail](https://teratail.com/questions/35614)

どうにも、**pipは正規のコマンドじゃない**ので、デフォルトの状態だとsudoからは見えないらしいです。

じゃあどうするか。
**正規と判定される方法でインストールすればいい。**
なるほど。

## してみた

```
$ python -m ensurepip
Requirement already satisfied: setuptools in /usr/lib/python3.6/dist-packages
Requirement already satisfied: pip in /usr/local/lib/python3.6/site-packages
```

されてるっぽい。
駄目ですね。

`get-pip.py`というファイルをどこからか落としてインストールする方法もあるらしいです。
めんどうだったので別の方法を取りました。

## フルパスで指定して解決
- [「sudo: pip: コマンドが見つかりません」というエラー - ストックドッグ](http://www.stockdog.work/entry/2017/08/11/215000)

`which pip`で取得したpipのアドレスをsudoの後に指定することで、無事にCCXTをインストールできました。
ファイルへの新しい入力から標準出力に表示させる方法

# やりたいこと
テストなど、ログファイルを最後から別のファイルに切り出したいときに利用することがあり備忘のため記録しておきます。これで切り出して、あとはリダイレクトを利用してテストのエビデンスを取ったりしています。
## 動作確認した環境
* Ubuntu 16.04.4 LTS (※Windows Subsystem for Linuxにて実施)
 * tail (GNU coreutils 8.25)
 * Wc (GNU coreutils 8.25)
 * awk (GNU Awk 4.1.3)
* CentOS (TODO：バージョン確認)
 * GNU textutil 2.1

## 実施方法
xxxという名前のファイルの最後から表示させる（ログを切り出したい）
<pre>
$ FILE=xxx; tail -F -n +$(( $(wc -l ${FILE} | awk '{print $1}') + 1)) ${FILE}
</pre>

## 解説
* tail
 * -F: ログ監視でおなじみのオプション。ファイルがローテーションしてもファイル名で追いかけてくれます。
 * -n +NUM: NUM行目からtailすることができます。wcとawkを駆使してファイル+1の行数を指定します。
* wc
 * -l: "行数 ファイル名"というのも、出力になります。

# その他
* もともとは、会社でテストしている時に毎回ログを切り出すのが面倒になり、やっつけで作ってみました。スクリプトの中でバックグラウンドで実行して、そのスクリプト中の子プロセスをkillするようにして利用しています。
* 会社ではCentOSを使っていますが、Qiitaへの投稿は家で書いているため、Windows環境上のUbuntuで実行してみました。
Rust+WebAssemblyの超速フロントエンドフレームワークYewを15分くらいで味見

Rust+WebAssemblyのフロントエンドフレームワークの [Yew](https://github.com/DenisKolodin/yew)という奴が気になっていた。先日公式レポジトリのtodomvc exampleを動かそうとしてみたらまだ色々発展途上らしくセットアップでハマりまくって4時間くらい無駄にしたので、それを整理して15分くらいで味見できる状態にしたメモ。

![yew](https://upload.wikimedia.org/wikipedia/commons/5/57/Taxus_cuspidata_IMG_4635.jpg)
Yewの語源はこちら https://ja.wikipedia.org/wiki/イチイ

# ` rustup` を入れる。

https://rustup.rs/ ←このページに書いてある手順でインストールする。インストール中に何か聞かれたら、 `Proceed with installation (default)` 的なのを選ぶ。また、インストール中に出てくる手順に従って環境変数のパスを設定する。homebrewとかでも入るらしいが、個人的に使ったことがないのと、たぶん解説の分岐が増えるので今回は使わない。

rustupはrust公式が作っているrbenvとかnodenvみたいなやつで、今の所デファクトスタンダード。 

# `cargo web` をインストールする

Web開発用のいろんなのを自動でやってくれるツール。開発が活発で不安定な気がするので、バージョンを固定している。

```
cargo install --version 0.6.14 cargo-web
```

# [Yew](https://github.com/DenisKolodin/yew) のレポジトリをクローンして、動作確認済みバージョンのtodomvc exampleに移動

開発がまだまだ活発なので、動作確認済みバージョンをチェックアウトする。

```
git clone https://github.com/DenisKolodin/yew.git
cd yew
git checkout f077a9a0323dbda2335375ae97954366733396a5 -b master20180715
cd examples/todomvc
```

# コンパイラをインストール

WASM出力はまだ安定版コンパイラでは使えないので、開発版コンパイラを入れる。開発版コンパイラはたまに壊れるので、バージョンとして動作確認した日付を指定する。

emscriptenを使えば安定版コンパイラでも動くが、emscripten自体のインストールが面倒なのとコンパイル時間が味見するにはけっこう辛いので今回はパス

```
rustup install nightly-2018-07-14
```

# `todomvc example` を動かす

下記のコマンドを実行して成功すると、開発サーバーが立ち上がってブラウザが開く。ブラウザのオートリロードも有効になる。

```
cargo +nightly-2018-07-14 web start --open --auto-reload --target=wasm32-unknown-unknown
```

ちなみに、 ` --target=wasm32-unknown-unknown` をつけないとemscriptenを使ったビルドになる。また、`Web.toml` っていう設定ファイルを書けば長いオプションは省略できるようになる気がする。

![スクリーンショット 2018-07-15 15.30.13.png](https://qiita-image-store.s3.amazonaws.com/0/26528/52b212ef-8bb9-59d0-4027-440f423f6f41.png)

# ソースをいじってみる

src ディレクトリ内にソースがあるのでいじってみる。jsx的な記法があってびびった

![スクリーンショット 2018-07-15 15.35.41.png](https://qiita-image-store.s3.amazonaws.com/0/26528/9bf61075-9aa6-fe8c-9e09-937fbdebf07d.png)


webpackとかと連携したりwasmをminifyしたりとかどうするかは未調査です。
git のコミットログからファイル数/行数の推移を取得する

# 背景

リファクタリングに取り組むときは、「不要なコードを削除する」とか「循環的複雑度を減らす」といった目標があると取り組みやすいです。思いのままにリファクタリングをすることも楽しいものですが、何らかの指標（コードの行数など）を確認しながら行うと、「ヤクの毛刈り」になりづらいと思います。

「不要なコードを削除する」というリファクタリングを行う場合は、「削除したファイル数」や「削除した行数」を指標とすると良いと思います。

# 各コミット時点のファイル数と行数を取得する

```
for commit_id in $(git log | grep ^commit | cut -d' ' -f2)
do  
    file_count=$(git archive --format=tar ${commit_id} | tar --list | wc -l)
    line_count=$(git archive ${commit_id} | wc -l)
    echo "${commit_id} ${file_count} ${line_count}"
done | tee stats.txt
```

出力例:
```
e3331758f12da22f4103eec7efe1b5304a9be5e9     3442   980851
085d2abf57be3e424cad0b7dc8c27fe41921258e     3442   980807
cf22247b631ab7cdfe01289917583f84dfea6f32     3442   980809
18404434bf406f6a6f892ed73320c5cf9cc187dd     3442   980804
6da2d9595161441cbed1b1f579b8dd46970a8e20     3442   980807
5eb8da850860839bdf38ab80079eb8875b764431     3442   980705
0079732e960dc20ab2a68043d5593de358f1377f     3442   980662
8d3661d5b1c7ca698a863625a05888c66004d3c1     3442   980621
92e1bbc33472d5389d5933f39d37da58e7e03053     3442   980621
078f3dc0ce9aa113ce77cfeb5e9c11b4eaa97dfe     3442   980611
8063ff9cf595dc9414e7a27d3310ae1031f5c883     3442   980612
a9097269036141876c586ddeee561a37b686c8e5     3442   980602
ed843436dd4924c10669820cc73daf50f0b4dabd     3442   980594
02f27d0dd0a9695fa8337c3ddd97a2b5ad0aec73     3442   980551
90fa1c5d6c00e44f4c901da0cf4015db916eca03     3442   980547
9eb97278e5406bf463e7e1fa359466fca9859f26     3442   980545
208ee598612092da892ac1c0e8dd0d4e09c4f076     3442   980544
f0209e80cf4468653e7730881b4c5bdb5fc7389a     3442   980530
f3fec40e8d8798e5313f05a9273aef932fe4519e     3442   980530
ebaf0a56f3f5f823df4166bc8fd626b523f864dc     3441   980285
...
```
PowerShellでディレクトリ内のファイルの総行数を入手するワンライナー

ディレクトリ内のプログラムコードの総行数を数えてと言われて、手作業で数えたくなかったのでワンライナーした

# ワンライナー

```powershell
 (Get-ChildItem -Recurse <ディレクトリパス> -include <ファイル名> | % {(Get-Content -Path $_).Length} | M
easure-Object -Sum).Sum
```

具体例

```powershell
> (Get-ChildItem -Recurse .\ -include *.cpp | % {(Get-Content -Path $_).Length} | M
easure-Object -Sum).Sum
> 1203
```

ファイル拡張子が複数あるときは`-include *.cpp,*.c`のように`，(カンマ)`で区切るといけます
Hidden Unit/Layer(隠れユニット/隠れ層)の基本

# Hidden Unit/Layer
一般的に下図[1]のようにhidden unitsとhidden layerは入力と出力のunit/layerと結合する。
![スクリーンショット 2018-07-15 23.03.22.png](https://qiita-image-store.s3.amazonaws.com/0/271751/98cca4f0-17c4-11df-6d8c-6934721a410f.png)

# 一般的な値
hidden layerは一般的に2層よりも3層の方が優れた結果を出すが、それ以上増やしても良い結果を出すことはあまりない。ただし、畳込みネットワークではたくさん増やすと精度がでることがわかっている。

原文[1]
>in practice it is often the case that 3-layer neural networks will outperform 2-layer nets, but going even deeper (4,5,6-layer) rarely helps much more. This is in stark contrast to Convolutional Networks, where depth has been found to be an extremely important component for a good recognition system (e.g. on order of 10 learnable layers).

# Hidden Unit/Layer の数による影響
2次元の2値分類をhidden unitを変えて試した結果が下図である。hidden unitが多いと表現できる関数が増えるためより複雑な分類ができるようになる。しかし、下図[1]の赤丸が誤り(ノイズ)の場合は過学習となってしまっているため、気をつける必要がある。

![layer_sizes.jpeg](https://qiita-image-store.s3.amazonaws.com/0/271751/9ad595ec-f87d-a918-8068-746d572ab821.jpeg)




# 参考文献
[1] [CS231n Convolutional Neural Networks for Visual Recognitions by Andrej Karpathy](https://cs231n.github.io/neural-networks-1/)
Guava 特定パッケージ内のクラス一覧を取得する

com.google.common.reflect.ClassPathを使用して、特定パッケージ配下のクラスを取得してみる。

pom.xml

```xml
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>
```

getTopLevelClassesRecursiveメソッドで指定パッケージより下のパッケージから再帰的にクラスを取得してくれます。ただ単に、指定パッケージ内のクラス一覧を取得したい場合はgetTopLevelClassesメソッドを使用します。


```java
ClassLoader loader = Thread.currentThread().getContextClassLoader();

try {
    Set<Class<?>> classes = ClassPath.from(loader)
            .getTopLevelClassesRecursive(getClass().getPackage().getName()).stream()
            .map(info -> info.load())
            .collect(Collectors.toSet());

    classes.forEach(System.out::println);
} catch (IOException e) {
    // TODO
}
```

※インナークラスについては取得できません。
※TopLevelであれば、enum, interface, abstract classも取得できます。
PhpStormでコードインスペクションを一覧で確認する

エディタのスクロールバーに黄色や赤で表示されるコードインスペクションですが、下記の操作で「Inspection Results」として種類別に一覧で確認出来ます。

- メニューの「Code」→「Inspect Code…」を選択
- ダイアログが表示されるので対象とするスコープを選択
- 「OK」ボタンを押下

<img width="294" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/165884/aaaca600-f6ad-4939-5ac6-dc5e10c1bcb9.png">


スコープとして「Whole project」や「Custom scope」を選択すると複数ファイルの結果が種別毎に確認出来るので結構便利そうです。
また、Export機能にてHTML形式での出力も出来るので、他の人に展開する場合にも利用出来そうです。
高速マルチスレッドIPスキャンツール【MultiIPScan】の紹介

#はじめに
自作のIPスキャンツール【MultiIPScan】の紹介です。

[【MultiIPScan】紹介ページ(Vector)]
(https://www.vector.co.jp/soft/winnt/net/se517709.html)

![キャプチャ_20180715223028.PNG](https://qiita-image-store.s3.amazonaws.com/0/262326/0d71a82e-6da2-7fe2-9e14-9d25f995f968.png)

今回紹介する【MultiIPScan】の機能からは少し外れる話題ですが、

遠隔のLAN内の使用中（もしくは未使用）のIPアドレスを調査したい場合、pingを始めとしたICMPのツールでは、相手側のパーソナルFW等の設定によりICMPをブロックする機器からの応答を確認することができません。

しかし、通常はARPまでブロックするような設定にはしないため、接続元のL2スイッチ（もしくは無線AP）のMACアドレステーブルを調査することにより、pingの応答が無い場合でも使用中のIPアドレスを調べることができます。
（もちろん、直接つながれているLANの場合は、自分のPCのARPテーブルを見れば良い。）

とはいえ、MACアドレステーブルを学習させるとしても、キャッシュには時間制限があるため、LANセグメント全体に一斉に問い合わせを送りたいときがあります。

制作したきっかけは、遠隔の数百台のワークSW群に、手っ取り早くMACアドレスを学習させるために、手っ取り早くまとめてpingを送れないか、ということでした。

遠隔のL2スイッチに自動ログインしてコマンドを実行し、使用中のIPアドレスとMACアドレス、接続ポートを表にまとめるツールも自作で持っていますが、紹介はまたの機会に...。


#■使用用途・目的

開始IPアドレスから終了IPアドレスまでの範囲の各IPアドレス宛に  ping(icmpリクエスト)を送信し、応答を確認することができます。

ログモード（pingの結果の表示）については、

応答のあったIPアドレスのみを表示する[簡易モード]と、
pingの実行結果をすべて報告する[詳細モード]の２つのモードがあります。

各IPアドレスへのpingの送信は、マルチスレッド(1～2,048スレッドから  選択可)により並列で処理されるため、対象アドレス全体のIPスキャンを高速に行うことができます。


#■使用方法および注意事項など

MultiIPScan の実行には、.NET Framework 4.0 が必要です。
IPアドレスの指定は、IPv4のみで、IPv6は指定できません。

##★IPスキャンの開始手順

    ①．<開始IPアドレス>および<終了IPアドレス>を入力します

    ②．<同時起動スレッド数>、<各ping送信回数>、
        および各種オプションを指定し、
        表示されている<予想所要時間>を確認します

    ③．<IPスキャン開始>ボタンをクリックしてください


<同時起動スレッド数>や<各ping送信回数>などによって、最少の所要時間は異なってきます。

<同時起動スレッド数>がNICやネットワーク媒体のスループット許容量に対して多い場合は、ping実行時に例外（ping送信失敗）が発生する可能性が高くなるのでご注意ください。

必要に応じて、<タイムアウト>や、<ＴＴＬ>、<データサイズ>、<フラグメント禁止>などのオプションを指定することもできます。

##※処理時間の目安
同時起動スレッド数が大きいほど、一度にIPスキャンを行うIPアドレス数が大きくなるため、対象アドレス全体のIPスキャンにかかる所要時間は小さくなりますが、
  
CPU負荷、他のプロセスの処理遅延、NICおよびネットワーク媒体等への負担が大きくなりますので、

適度なバランスを考慮し、同時起動スレッド数を決めてください。
  
OS のスレッド生成処理の都合上、処理開始直後のスレッドの起動には多少の時間がかかります。

また、応答のあるIPアドレスの数が多いほど、各ping処理がタイムアウトまで待機する時間が不要になるため、処理時間が速くなります。

|項目|例１|例２|例３|例４|例５|例６|例７|
|----|----|----|----|----|----|----|----|
|対象IPアドレス数|256|256|1,024|1,024|65,536|65,536|65,536|
|ログモード|簡易|簡易|簡易|簡易|簡易|簡易|簡易|
|同時起動スレッド数|64|256|64|256|64|2,048|2,048|
|各ping送信回数|3|3|3|3|3|3|1|
|タイムアウト[ms]|1,000|1,000|1,000|1,000|1,000|1,000|1,000|
|予想処理時間（目安）|16秒|8秒|64秒|20秒|4,096秒|167秒|103秒|

そのほかのアプリケーションの動作やネットワークの負荷の状況によって異なります。あくまで目安です。


#■種別
  フリーソフト


#■動作環境

  ・Windows Vista 以降
  ・Windows Server 2008 以降
  
  なお、実行するには .NET Framework 4.0 以降が必要です。


#■免責

・動作確認には細心の注意を払っていますが、このソフトを使ったことによるいかなる損害に対しても作者は責任を負いません。

・ご使用については自己責任の元でお願いします。

・オリジナルを私の WEB サイトで配布している関係で、他 WEB サイトへの転載はご遠慮ください。


#■インストール・アンインストール

以下のファイルが含まれています。

    MultiIPScan.exe  プログラム本体

    readme.txt       説明書

    logフォルダ      IPスキャン(ping)実行結果格納先フォルダ
                     （無ければ自動で作成されます）


readme.txt をお読みになったあと、

MultiIPScan.exe を実行すれば、『MultiIPScan』が起動します。
アンインストールは、上記のファイル・フォルダを削除するだけです。

#関連ツール
[高速マルチスレッドping&tracerouteツール【pingkeeper】の紹介]
(https://qiita.com/gx3n-inue/items/160582704c44424e32d5)
Pythonの仮想環境の構築

# pythonの仮想環境

## 仮想環境の必要性
作成するアプリごとにインストールしたいパッケージが違うことがあります。
また、クラスが多くなるにつれてローカル環境のPCのものを使うとどれが使用しているパッケージかわからなくなることがあります。
そのため、このアプリにはこれをいれたいというものだけを仮想環境として作ったpythonの環境に入れていきましょう。

## virtualenvのインストール
私はWindowsでUbuntuアプリを使っています。
なので、コマンドはdebian系でaptを使って操作していきます。
macを使っていたらbrewだったり、CentOSの場合はyumだったりパッケージマネージャによってコマンドが違うので適切にコマンド変えてください。

パッケージマネージャ別コマンド
https://hydrocul.github.io/wiki/others/linux-pkg-manager.html

パッケージマネージャについての解説がわかりやすかったサイト
https://eng-entrance.com/category/linux/linux-package

パッケージマネージャとは、簡単に使いたいものを使えるようにするために依存関係があるものをとってきたりしてくれる便利な管理システムのようです。
pythonならpip,Node.jsならnpmなどOSだけじゃなくていろいろなところでパッケージマネージャは使われているようです。

というわけでpython3の仮想環境を作るためのパッケージをインストールします。

```
pip3 install virtualenv
```

pip3 が入っていない場合は`sudo apt install python3-pip`とかでいけると思います。

そしたら、好きなところにフォルダを作ります。

```
mkdir python-test
```

そのフォルダに移動します。

```
cd python-test
```


仮想環境を作ります。

```
virtualenv venv
```

venvじゃなくても好き名前でOKです。

その名前のフォルダができます。

python2になってしまう場合には下記でpython3にできました。

```
virtualenv -p python3 venv
```

そしたら仮想環境を有効にします。

```
source {作ったフォルダ名}/bin/activate
```

仮想環境が有効になると`(フォルダ名)`が下記のように名前の前に表示されるようになります。

```
(venv)hoge@ubuntu:~/python-test
```

このvenvを有効にしている間に`pip3 install {パッケージ}`としたものは、この仮想環境にインストールされます。

仮想環境から出たい場合には`deactivate`とすると仮想環境が無効になります。


## 仮想環境の注意
初心者でよくわからずvirtualenvを使っていると、仮想環境にいない状況でpythonを起動してインポートしたはずのパッケージが入っていない！となることがあります。
また、仮想環境じゃなくてもpython2とpython3でインストールしたパッケージが違う場合があります。

インポートしたはずのパッケージが入っていない場合、下記を確認してみてください。

- python2とpython3を交互に動かしていないか
    - python2とpython3が存在する場合pythonコマンドを打つとpython2,python3コマンドを打つとpython3が起動されます。
    - `which python`でpython2がどこに存在するか、`which python3`でpython3がどこに存在するかを確認できます。
    - python2もpython3も存在する場合、`pip install` でいれるとpython2にインストールされます。`pip3 install`でインストールしなおしましょう。
    - 現在起動しているのが、python2なのかpython3なのか確認してみてください。
    - `pip freeze`でインストールされているライブラリー一覧を確認できます。python3の場合は`pip3 freeze`で確認できます。
    
- 仮想環境が動作しているか
    - `virtualenv`でpythonの環境を作った場合、`source {作成した仮想環境フォルダ}/bin/activate`というように仮想環境を有効にしないと仮想環境に入れたパッケージは使えません。有効にしていない状態で起動したpythonはローカル環境で動く普通のpythonです。そっちにインポートしたライブラリしか動きません。



というわけで、初期によくわからなかった仮想環境についての構築手順についてまとめました。
参考になれば幸いです。
PIC命令(アセンブラ)

20年近く前、8bit  CPU, 16bit CPUを使った講習をしていたら、参加者の方が、普段はPICをつかっているとのこと。公的試験研究機関、高等専門学校、職業訓練校などの講座を拝見すると、PICを使った演習がいろいろあった。主に、電気系の技術者を対象に、電気系の制御を計画(program)する内容だった。

CQ出版の出版物にもPICを扱うものがちらほらあった。

PIC(Peripheral Interface Controller)
Microchip社が販売するCPU
https://www.microchip.co.jp
PICを選択すると英語になってしまう。
https://www.microchip.com/design-centers/microcontrollers
https://ja.wikipedia.org/wiki/PIC_(コントローラ)

Maker、電気回路系などでよく利用されていたIC。AVRを対抗製品として比較することがあった。

# PIC
QiitaにPICのアセンブラ記事が見当たらない。
ひとまず、Qiita以外の記事を集め、いくつかの作業をした上で、再整理予定。

 PIC18(L)F26/27/45/46/47/55/56/57K42
28/40/44/48-Pin, Low-Power High-Performance Microcontrollers with XLP Technology
http://ww1.microchip.com/downloads/en/DeviceDoc/Microchip%208bit%20mcu%20%20PIC18%20L_F26_27_45_46_47_55_56_57K42%20low-power%20high-performance%20mcu%20with%20xlp%20tech%2040001919B.pdf

PICアセンブラ入門　浅川 毅
https://www.amazon.co.jp//dp/4501532300/

PIC をソフトウェアの面から知ろう
光永 法明
http://www.cqpub.co.jp/hanbai/books/37/37391/37391_2syo.pdf

はじめてのPICマイコン 第1回超入門編 | マルツオンライン
https://www.marutsu.co.jp/pc/static/large_order/begin_pic

A. PICの全命令
http://www.maizuru-ct.ac.jp/control/machida/picavr/instr.htm#sectionA1

PIC命令一覧表
https://www.mlab.im.dendai.ac.jp/~assist/PIC/appendix/instruction/

ＰＩＣ命令
http://www.picfun.com/instr3.html

ＰＩＣマイコンへの道　～その１　マシン語は？？～
http://www.geocities.jp/gokigokigokichi/micon/pic001/pic001.html

機械語への翻訳
http://scw.asahi-u.ac.jp/~sanozemi/Sakuhin/pic01/PIC01d.html

アセンブラー命令について
http://scw.asahi-u.ac.jp/~sanozemi/Sakuhin/pic01/PIC01c.html

ＰＩＣの命令とアセンブラ命令
http://mitt.la.coocan.jp/pic/pic42.html

#PIC on Qiita

🔰によるPIC環境構築と突然現れた壁
https://qiita.com/networkyohan69/items/c0a680c91591c12e79ab

###pickle on Qiita
pickleを試してみた
https://qiita.com/yamori813/items/b71235b6588c1ee65810

pic12f629 と pickit3 を 接続
https://qiita.com/pid87/items/82f00c50ada9012935e5

### PIC using Mac on Qiita
Mac OS X で PIC 焼いて Lチカしてみる : その1 PICの解説
https://qiita.com/kasei-san/items/0f27b37932d9d0c3095d

Mac OS X で PIC 焼いて Lチカしてみる : その2 開発環境の構築
https://qiita.com/kasei-san/items/e5b233c6b06363b85cca

Mac OS X で PIC 焼いて Lチカしてみる : その3 PICにプログラムを書き込む為の回路を構築
https://qiita.com/kasei-san/items/7c4fc76721b9af5fa4f0

Mac OS X で PIC 焼いて Lチカしてみる : その4 コードを実装、コンパイル、PICに書き込む
https://qiita.com/kasei-san/items/083d21dbbd8996cc78a7

###PIC32MX on Qiita
PIC32MXでI2S
https://qiita.com/yamori813/items/e053210d7672bf018079

[失敗のち成功]platformioでpic32mx
https://qiita.com/yamori813/items/6c39955c660103671741

PIC32MXでUSB I2Sブリッジ
https://qiita.com/yamori813/items/2c69e5f8114b9fe834b6

### その他

メモ
https://qiita.com/pid87/items/d413954b959a947029b6

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

##
# 文書履歴(document history)
ver. 0.10 初稿 20180716
ver. 0.11 Qiita記事追加。アセンブラ記事はまだ見つからず。20180722
ver. 0.12 マイクロチップ社　追記 20190301
ver. 0.13 経緯追記 20190320
ver. 0.14 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Ruby初心者の課題　Fizz_Buzz問題　while構文　if文


Q1〜100までの数字をターミナルに出力してください。ただし、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、両方の倍数である「15の倍数」のときはFizzBuzzと出力してください。



この問題を解くにあたっての雛形↓

```ruby:qiita.rb
def fizz_buzz
    # ここに処理を書き加えてください
  end

  fizz_buzz
```




解答↓

```ruby:qiita.rb
def fizz_buzz
  num = 0
  while （num < 100） do
       num += 1 
    if （num % 15） == 0
      puts "Fizz_Buzz"
    elsif （num % 3） ==0
      puts "Fizz"
    elsif （num % 5） ==0
      puts "Buzz"
    else 
      puts num
    end

    end
  end

  fizz_buzz
```

①while構文を使って1~100までの繰り返し処理を行わせる。

```ruby:qiita.rb
while 条件式　　do 
　#繰り返し処理
end
```



②if文を使って条件分岐をする。

```ruby:qiita.rb
if 条件式　
#処理
end
```

１５の倍数の時〜３の倍数の時〜５の倍数の時〜の順で。
※１５の倍数は３の倍数とも５の倍数とも言えるので１番最初の条件として与える必要がある。

つまり、

```ruby:qiita.rb
if (num % 15 == 0)
 # 3の倍数かつ5の倍数のとき=15の倍数のとき
  end

```
は

```ruby:qiita.rb
 if (num % 3 == 0) && (num % 5 == 0) 
# 3の倍数かつ5の倍数のとき
  end
```
に書き換えることができる。



実行結果↓

```
$ ruby fizbuzz.rb 
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz_Buzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
Fizz_Buzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
Fizz_Buzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
Fizz_Buzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
Fizz_Buzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
Fizz_Buzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```
マイコン開発での失敗談・成功談　過去、現在、未来＆名古屋のIoTは名古屋のOSで

# マイコン開発での失敗談
https://qiita.com/tetsu_koba/items/2040bc23ce8bf4adeb18

を拝見し、過去、現在、未来に渡って記録する。

ここでは、マイコン開発とは、CPUを１つ以上含むシステムとする。
組み込みであるとか、パソコンであるとかは問わない。

# 電源(power supply)

対象システムの電源の仕様が、ハードウェアに明確に記載していない場合がある。
付属文書がある場合には、付属文書には必ず記載があるはずである。

付属文書がついていないシステムを入手した場合には、ハードウェア記載の製造企業、型番などからネットに文書がないか検索する。

箱に製造企業、型番がついていない場合は、箱を開け、基盤についている製造企業、型番から検索する。

## 失敗談１

電源の仕様を文書で明確に確認しないまま、合いそうなな電源を接続した。

結果、ボード状のICから炎が上がった。

すぐに、電源を切り離した。

もっとやばいのは、電源を入れたときに、測定するため、測定機器も繋いでいた。

すぐに電源を切り離したため、測定機器は壊れなかった。

# 界面(interface)

## 失敗談2

SCSIという刻印のある箱があった。
電源の仕様の記載もあった。

記載の電源を接続し、パソコンのSCSIIと接続した。

箱から煙が上がった。

SCSIという記載は、間違いで、SCSIIと同じ幅のパラレルIFを、出荷の際に、添付文書でその出荷分はパラレルIFのものもSCSII表示の箱で出荷したらしい。

幸い、パラレルIFケーブルを接続したら動作した。

箱の記載だけではなく、付属文書を確認しよう。
付属文書がない場合には、箱をバラして、回路を確認しよう。

IFに接続しているICの仕様を見れば、SCSIIかパラレルかは確認できるかもしれない。

## 失敗談3

ある電動機の制御をしようとした。
付属回路には、特定の製造会社のICがついていた。

製造会社に問い合わせをした。
特定の会社向けに出荷したものであるため、仕様は開示できないとのこと。
入手先を聞かれた。

当方は、問い合わせを受けて借り受けただけであるため、入手元は不明であると回答した。

結果として、仕様がわからなかった。類似の機器から推定できる制御プログラムを動作させてみた。必要十分な動作が得られなかった。

全体を問い合わせ先に返答した。

動作しなかったという意味での失敗。無茶なことをして炎は発生させていない。

# 停止機能(stopper)

## 失敗談4

電動機の制御プログラムを作成していた。
動作させたら、実験装置が壊れた。
実験装置が壊れないような停止機能(stopper)をつけていなかった。

実験装置の設計には、停止して欲しい範囲を物理的に決め、物理的に止める機能をつけることの重要性を知った。

電気回路、電子回路としても、制限を設け、止めるような機能の設計を検討した。

ソフトウェアでも、状態を監視し、止めるようなソフトウェア機能を検討した。

三段階の停止機能の設計により、装置を壊す動作はしなくなる。

電動機制御算譜（プログラム）設計における３つの罠６つの教訓（実機）
https://qiita.com/kaizen_nagoya/items/b39b6b7ba0d90dff471d

# 予備保存(back up)

## 失敗談5

アセンブラで電動機の制御プログラムを組んでいたときのこと。
装置はFD軌道のMS-DOS 2.11。マイクロソフトのMASMである。

アセンブルして、実行したところ、FDのフォーマットを始めた。
何か、アセンブラの記述を間違えて、フォーマットする命令を呼び出してしまったらしい。

## 教訓5

### 教訓5.1 予備の作成
　実行する前に、ソースコードは、実行する機材以外のところに予備を造る。
　GitHub, bitbucketなどのネットワーク上にソースコードを掲載してから、実機で動かせば、少なくとも実機だけにソースコードがあるという状態ではなくなる。

### 教訓5.2 実機での動作の前に模擬試験または試験
　実機で実行する前に、模擬試験環境で実行するか、
不正な実行をしないかどうか試験をすることが大事。

# 開発用OSの版

## 失敗談6
開発用OSの指定のある開発環境を、手元にある開発OSの異なる版に導入しようとして、丸１日費やして断念した。

コンパイルするたびに、不足するヘッダファイル、不足するライブラリが次々に出てきて、都合、３０種類くらいのヘッダファイル、ライブラリを導入した。

もっと早めに見切りをつければよかったが、
経験のために、やってみた。

# 開発用クロスコンパイラのコンパイル

## 失敗談7

クロスコンパイラの導入の失敗は枚挙するときりがない。

主な原因だけ記載する。
１）　複数のコンパイラを導入していて、ヘッダファイル、ライブラリ、Path指定の順番が悪さをする
２）　複数のクロスコンパイラを導入していて、ヘッダファイル、ライブラリ、path指定の順番が悪さをする
３）　複数のOSを切り替えて使用するように導入した。他のOSのファイル、ヘッダーファイル、ライブラリ等が悪さをする。
４）　

# 初めての制御用IC

## 失敗談8
あるネットワーク制御用ICを搭載しているシステムで, Linuxを動作させようとした。

ネットで検索したらSUSI Linuxだけ、ドライバのα版を公開していた。

導入したがうまく動作しなかった。

# 真っさらな状態からの導入

## 成功談1 真っさらな状態からの導入（ハードウェア編）

ポルトガル語OS上で、動画配信システムの構築。

うまく導入できないという相談。

対応する仕様にあった機器のハードディスクをフォーマットして初期状態から導入。

手順通りに導入していったら、順調に動作。

うまく導入できなかったのは、目的以外のソフトウェアとの衝突の可能性がある。

# 教訓 
何かうまく行かないことがあれば、ハードウェアを初期化してやり直す


# 成功談２

Macintosh で Scilabの導入に何度も失敗した。

そこで、ある企業のある技術者（複数）に、作業診断を依頼した。

依頼後、作業を記録しながら、途中で不必要な作業をせずに（作業記録以外の）導入したら、導入に成功した。

作業診断を依頼した技術者も、同時に導入に成功した。

作業の途中で、他の作業をした内容が衝突していた可能性がある。

# 教訓

ソフトウェアの導入時に、別のソフトウェアを導入したり、起動したりしない。

# 文書履歴(document history)
ver. 0.10 初稿 20180715
ver. 0.11 20180716


### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
IxのBufferを使ってシーケンスをグループ化する

## はじめに

Interactive Extensions(Ix)の`Buffer`というメソッドが便利なので紹介します。

利用するにはnugetで[System.Interactive](https://www.nuget.org/packages/System.Interactive/)のインストールが必要です。

環境

* .Net Framework 4.6.1
* System.Interactive 3.2.0

## 基本的な使い方

シーケンスを決められた数ずつ分割したい場合に利用します。

### 1. 渡す引数が1つの場合

```csharp:例1

IEnumerable<IList<int>> groups = Enumerable.Range(1, 9).Buffer(4);

```

・出力結果

| グループ1 | グループ2 | グループ3 |
| :-------: | :-------: | :-------: |
|  1 2 3 4  |  5 6 7 8  |     9     |

第一引数の値ずつにグループ化された複数のシーケンスを返します。例1では4個ずつに区切られた3つのリストが返却されます。

### 2. 渡す引数が2つの場合

第一引数 > 第二引数

```csharp:例2

IEnumerable<IList<int>> groups = Enumerable.Range(1, 9).Buffer(5, 2);

```

・出力結果

| グループ1 | グループ2 | グループ3 | グループ4 | グループ5 |
| :-------: | :-------: | :-------: | :-------: | :-------: |
| 1 2 3 4 5 | 3 4 5 6 7 | 5 6 7 8 9 |   7 8 9   |     9     |

第二引数がある場合も第一引数の値ごとにグループ化が行われます。ただしグループ化開始位置が第二引数の値だけ逐次進みます。例2ではグループ1に1始まりの5つのデータ、グループ2に3始まりの5つのデータが入ります。


第一引数 < 第二引数

```csharp:例3

IEnumerable<IList<int>> groups = Enumerable.Range(1, 9).Buffer(2, 3);

```

・出力結果

| グループ1 | グループ2 | グループ3 |
| :-------: | :-------: | :-------: |
|    1 2    |    4 5    |    7 8    |

例2と同様、第二引数の値だけグループ化開始位置が逐次進みます。例2では重複してグループ化されている要素がありましたが、例3では選択されない要素が発生します。

### 備考

* 例2で、ある要素が複数のグループに割り当てられる場合も列挙は要素ごとに一回しか行われない。

* 引数が2つある場合で両者が同じ値なら引数1つのときと処理内容は変わらない。

## 具体的な使用例

* 支払明細を顧客と支払い方法ごとにグループ化して、グループごとに1ページに表示する。
* ただし1ページに表示されるのは最大20明細とする。

という要件がきたときに1ページあたりの情報をどのように選択するか考えます。

```csharp:具体例
// 支払明細
class Payment
{
    // 顧客ID
    public string CustomerID { get; set; }
    // 支払い方法
    public string PaymentMethodCode { get; set; }
    // 支払額
    public decimal Amount { get; set; }
    // 支払日
    public DateTime Date { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        // 全データ取得用のメソッドは別にあるとする
        var payments = SelectPayments();

        // 1ページごとにグループ化されたシーケンスを得られる
        var paymentPages =
            payments
            .GroupBy(x => new { x.CustomerID, x.PaymentMethodCode })
            .SelectMany(x => x.Buffer(20)) // 20:明細最大行数

        // .SelectMany(x => x.Buffer(20) は
        // .Select(x => x.Buffer(20)).SelectMany(x => x) とも書ける
    }
}
```

要件を読み解くと「顧客と支払い方法」をキーにしたグループ化が必要となるので、まず`GroupBy`を行います。

つぎに最大行数20でのグループ化も必要なので`Buffer`を呼び出し、20行ごとでのグループ化を行います。

そうするとグループ化が2回行われたシーケンスが得られます。このままでは階層が深いため扱いやすい形にするため最後に`SelectMany`を行いシーケンスを1段階フラットなものにします。

このように実務で使う場合は`GroupBy` `ToLookup` `SelectMany`といったグループを扱う他のメソッドと組み合わせることで力を発揮します。
全方位ステレオカメラを調査中

全方位について距離画像を得るための各種ハードウェアが開発されている。


イメージセンサの需要が、スマートフォン・車載分野で拡大していることがあって、イメージセンサの性能の向上は続いている。

例　[ソニー、画像の歪みを解消する裏面照射型CMOSセンサを開発](https://japan.cnet.com/article/35114630/)

例　[オンチップマイクロレンズ](https://www.sony-semicon.co.jp/products_ja/IS/ccd_tech/index.html)


そのようなことから、イメージセンサを活用する分野でも、その恩恵を受けている。

見かけ上の開口率があがったことで、より暗い環境でもSN比が保たれやすくなってきています。

「行毎の読み出し時間のずれによる画像の歪み」が出なくなってきているということは、ステレオカメラでの対応点マッチングをする際に、視差の安定性を向上させる方向にはたらいています。

USB3.0のインタフェースがFPGAなどでもこなれてきていることも、これらの製品が出やすくなっている要因の一つです。

またOpenCV に代表されるライブラリの分野でも、使用するCPU・GPUでの処理性能を向上させるコードの改良が続いている。
その恩恵を受けて、ステレオカメラを全方位に拡大する試みが、製品として提供され出してきている。



どこかにレビュー記事なんかないかなあ。




- [小型全方位カメラ＆全方位ステレオカメラ](https://www.argocorp.com/cam/special/OccamVisionGroup/OccamVisionGroup.html)

次のような形態の全方位のステレオカメラです。上下のステレオペアのカメラが５方向にあるという構成です。
基線長は上下のカメラ間距離になります。


>    360万画素（752×480 ×10個）＠60fps
    USB3.0インターフェース
    視野 360°(H) × 58°(V)
    ∅105.4mm × 176.7mm、1128g


[車載で撮影された画像と距離画像の動画](https://player.vimeo.com/video/117129678)

 
![](https://www.argocorp.com/cam/special/OccamVisionGroup/common/img/omnistereo_main.jpg)

![](https://www.argocorp.com/cam/special/OccamVisionGroup/common/img/omnistereo_size.jpg)


ここの製品の面白いところは、全方位のステレオカメラと、ステレオではない全方位カメラの設計が共通している点です。
このような数が出にくい製品の場合、いかにラインアップの製造・在庫のコストを減らすのかが重要です。

[製品情報のpdfファイル](https://www.argocorp.com/cam/special/OccamVisionGroup/common/pdf/Omni.pdf) を読むとAPIにはOpenCVを利用していることが記載されています。


[開発元](http://occamvisiongroup.com/)

[開発元にある全方位カメラ動画](http://occamvisiongroup.com/video/)

---

- [全方向多次元情報撮影システム PanoPLUS](http://www.viewplus.co.jp/product_viewplus_products/13_index_detail.html)

![](http://www.viewplus.co.jp/product_viewplus_products/files/13_thumbnail.jpg)


[POLICE: コンパクト全方位LiDAR-Cameraスキャナーの提案](https://confit.atlas.jp/guide/event/ssii2018/subject/IS3-22/detail?lang=ja)
RMagickで日本語のフォントが全然使えない件

多分、Macの環境設定でどこか失敗していて、フォントを指定できても日本語が全然出力されない:frowning2:


試行錯誤せど、試行錯誤せど、上手くいかん🙅‍♀️

。。。

ここで、神降臨
[komasaru/rmagick_available_fonts.rb](https://gist.github.com/komasaru/6229272)
実行可能なフォントを全て画像に出力するという、、、、！！（暇なのかな？）

出力を日本語にして、エラーはrescueするように書き換えて、、、

```kami.rb
require 'RMagick'

F_SIZE = 24               # フォントサイズ (pt)
FILE   = "font_list_jp.png"  # 出力ファイル名

class RmagickAvailableFonts
  # フォント一覧画像作成
  def make_image
    fonts = Magick.fonts                                               # フォント一覧
    image = Magick::Image.new(600, (F_SIZE + 20) * fonts.size + 10) {  # 画像オブジェクト
      self.background_color = '#DDDDCC'
    }
    draw  = Magick::Draw.new                                           # 描画オブジェクト

    begin
      # 全フォントについて LOOP
      fonts.each_with_index do |f, i|
        begin
          # コンソール出力
          puts "#{sprintf("%3d", i + 1)}: #{f.name}"

          # 描画
          # （次のフォントは 20pt 下へずらす）
          draw.annotate(image, 0, 0, 10, 10 + (F_SIZE + 20) * i, "#{i + 1}: ああ") do
            self.font      = f.name                    # フォント名
            self.fill      = 'black'                   # フォント塗りつぶし色（黒）
            self.stroke    = 'transparent'             # フォント縁取り色（透過）
            self.pointsize = F_SIZE                    # フォントサイズ
            self.gravity   = Magick::NorthWestGravity  # 描画開始位置（左上）
          end
        rescue => e
          p "「#{f.name}」は失敗した"
        end
      end

      # 画像作成
      image.write(FILE)
    rescue => e
      STDERR.puts "[ERROR][#{self.class.name}.make_image] #{e}"
      exit 1
    end
  end
end

# フォント一覧画像作成
obj_main = RmagickAvailableFonts.new
obj_main.make_image

```

日本語対応フォントを2つ発見した！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/36e5483d-de1a-5eba-f94f-5a63af852610.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/f681f2a7-2c41-133a-d17c-869115484537.png)

確認して見ると、

```.rb
require 'RMagick'

p Magick.fonts[2]
# <struct Magick::Font name="AppleMyungjo", description="AppleMyungjo Regular", family="AppleMyungjo", style=UndefinedStyle=0, stretch=UndefinedStretch=0, weight=0, encoding=nil, foundry=nil, format="ttf"> 

p Magick.fonts[13]
# <struct Magick::Font name="ArialUnicode", description="Arial Unicode MS", family="Arial Unicode", style=UndefinedStyle=0, stretch=UndefinedStretch=0, weight=0, encoding=nil, foundry=nil, format="ttf"> 
```

[2]は伸ばし棒が文字化けしてしまったので、[13]を使うことにした。
（まあ、モックなら何でも良いかなと）


誰か、Rmagickのフォントの設定方法知っている人いたら教えてください〜〜〜〜😱
dockerコンテナ内で実行したJunitの結果をCircleCIに反映する

## 環境
* Circle CI 2.0
* Circle CI のイメージ 「docker:17.05.0-ce-git」

## やりたいこと
Circle CI で所定の設定を行うとspte実行したJunitを実行した結果を Circle CIの画面から参照できます。

`.circleci/config.yml` への記載は https://circleci.com/docs/2.0/collect-test-data/#gradle-junit-results  にある通りです。

```yaml
steps:
      - run:
          name: Save test results
          command: |
            mkdir -p ~/junit/
            find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/junit/ \;
          when: always
      - store_test_results:
          path: ~/junit
      - store_artifacts:
          path: ~/junit 
```

Dockerコンテナでなければこの通りなのですが、Dockerコンテナ内で実行した場合は、Junitを実行したコンテナから引っ張り出す必要があります。

## やったこと
### Dockerfile.junit
ビルドの都合で Junit用の Dockerfileを作成しました。内容はソース一式を `COPY` でコンテナ内に入れて、 `CMD` でgradle の testタスクを実行します。

```dockerfile
FROM java:8 AS build
RUN mkdir /app
WORKDIR /app
COPY ./ ./
CMD ./gradlew test
```

### .circleci/config.yml

まず、「name: Build container and run junit」でJunit用のコンテナを作成して実行します。実行する時には `--name` オプションでコンテナ名を指定します。

続いて、「name: Save junit results」で実行したコンテナからイメージを作ります。作成したイメージを使い公式サイトにある `find . -type f -regex ".*/build/test-results/.*xml"` でメタデータのxmlファイルを探し、`tar cf -` を行うことで、dockerコマンドの標準出力にtar形式のデータを出力します。
ホストのパイプで `tar xvf -`に渡すことでtar形式のファイルを展開して `~/junit` ディレクトリに保存しています。

```yaml
steps:
      - run:
          name: Build container and run junit 
          command: |
            docker build -f Dockerfile.junit -t kfc-batch-singleuse-coupon-junit .
            docker run --name junit kfc-batch-singleuse-coupon-junit

      - run:
          name: Save test results from docker container
          command: |
            mkdir -p ~/junit/
            docker commit junit junit-result
            docker run --rm junit-result /bin/bash -c 'find . -type f -regex ".*/build/test-results/.*xml" | tar cf - -T - --null ' | tar xvf - -C ~/junit
          when: always
      - store_test_results:
          path: ~/junit
      - store_artifacts:
          path: ~/junit
```

実行結果

![CircleCIに表示されるテスト結果.png](https://qiita-image-store.s3.amazonaws.com/0/145742/54fed3a9-52da-6961-4b28-c309b5b00db9.png)
私家版リンク集～FBを整理したので



大したことないけど少しでもお役に立つと幸いです。

##mybatisを使った動的SQLの書き方〔in演算子〕
https://ameblo.jp/t-tomatsu0421/entry-11213444735.html

##mStruts　注意点　UTF-8にしないとだめ
http://fa11enprince.hatenablog.com/entry/2014/03/05/033713
http://www.aiosl-tec.co.jp/java/259/
http://pgbox.grush.jp/ref/java/struts/refs/validator.html

##Spring
https://qiita.com/yu_eguchi/items/9a56e6c6281c1f0435ff

##Java関連
https://qiita.com/takumi-n/items/369dd3fcb9ccb8fcfa44
https://qiita.com/MuriNishimori/items/31d07fd49eec579f3ba1
http://www.techscore.com/tech/Java/JavaSE/Thread/2/
https://qiita.com/lrf141/items/98ffbeaee42d30cca4dc

## UMLを学ぶ
http://objectclub.jp/technicaldoc/uml/umlintro2
##設計書の例を探してみる。
http://warp.da.ndl.go.jp/info:ndljp/pid/9972728/ecom-plat.jp/fbox.php?eid=16496
http://blog.nadia.bz/post/177/post-177

## ログ取得
https://www.adoc.co.jp/blog/e000383.html
Percona Toolkit(ペルコナツールキット)をUbuntuにインストールする手順

Percona Toolkit(ペルコナツールキット)とはPercona(ペルコナ)社が開発しているMySQLの利便性を高めるためのツールです。

Percona Toolkitには色々なコマンドが用意されており、MySQLのスロークエリログを解析するのに便利な『pt-query-digest』もその中の一つです。

pt-query-digestをUbuntu環境で利用する機会があり、Percona Toolkitをインストールしたのでその手順について解説します。

## PerconaのサイトからdebファイルのダウンロードURLを取得する
<a href="https://www.percona.com/downloads/percona-toolkit/LATEST/" target="_blank">こちらのページ</a>からdebファイルをダウンロードできるので、ダウンロードURLを取得します。

なお、Ubuntuの場合、以下のコマンドでOSのバージョンを確認できます。

```
$ cat /etc/os-release
```

## debファイルをdpkgコマンドでインストールする
dpkgコマンドでdebファイル形式のパッケージをインストールすることができます。
dpkgコマンドはdebファイルをインストールする際にパッケージの依存解決を自動で解決してくれないので、必要なパッケージもあわせてインストールします。

```
$ wget https://www.percona.com/downloads/percona-toolkit/3.0.10/binary/debian/xenial/x86_64/percona-toolkit_3.0.10-1.xenial_amd64.deb
$ sudo apt-get install libdbd-mysql-perl libdbi-perl libio-socket-ssl-perl libnet-ssleay-perl libterm-readkey-perl
$ sudo dpkg -i percona-toolkit_3.0.10-1.xenial_amd64.deb
```

もしくはパッケージの依存関係を自動で解決してくれるgdebiというコマンドを利用する方法もあります。

```
$ wget https://www.percona.com/downloads/percona-toolkit/3.0.10/binary/debian/xenial/x86_64/percona-toolkit_3.0.10-1.xenial_amd64.deb
$ sudo apt-get install gdebi
$ sudo gdebi percona-toolkit
```

なお、pt-query-digestを利用したMySQLのスロークエリログの分析方法ついては、<a href="https://nishinatoshiharu.com/percona-slowquerylog/" target="_blank">個人ブログ</a>で解説をしているので、興味のある方はご覧になってください。

by <a href="https://twitter.com/nishina555" target="_blank" rel="noopener">@nishina555</a>