OmniAICreator/Qiita-1.07M huggingface dataset:
ros2 dashing turtlebot3_gazebo gazebo: symbol lookup error 

# gazebo: symbol lookup error: /usr/lib/x86_64-linux-gnu/libgazebo_common.so.9: undefined symbol

```console
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
[INFO] [launch]: All log files can be found below /home/k-koh/.ros/log/2019-10-01-22-43-42-328613-k-BMP-29716
[INFO] [launch]: Default logging verbosity is set to INFO
urdf_file_name : turtlebot3_burger.urdf
[INFO] [gazebo-1]: process started with pid [29726]
[INFO] [robot_state_publisher-2]: process started with pid [29727]
[robot_state_publisher-2] Initialize urdf model from file: /home/k-koh/ros2_ws/install/turtlebot3_description/share/turtlebot3_description/urdf/turtlebot3_burger.urdf
[robot_state_publisher-2] Parsing robot urdf xml string.
[robot_state_publisher-2] Link base_link had 5 children
[robot_state_publisher-2] Link caster_back_link had 0 children
[robot_state_publisher-2] Link imu_link had 0 children
[robot_state_publisher-2] Link base_scan had 0 children
[robot_state_publisher-2] Link wheel_left_link had 0 children
[robot_state_publisher-2] Link wheel_right_link had 0 children
[robot_state_publisher-2] got segment base_footprint
[robot_state_publisher-2] got segment base_link
[robot_state_publisher-2] got segment base_scan
[robot_state_publisher-2] got segment caster_back_link
[robot_state_publisher-2] got segment imu_link
[robot_state_publisher-2] got segment wheel_left_link
[robot_state_publisher-2] got segment wheel_right_link
[robot_state_publisher-2] Adding fixed segment from base_footprint to base_link
[robot_state_publisher-2] Adding fixed segment from base_link to caster_back_link
[robot_state_publisher-2] Adding fixed segment from base_link to imu_link
[robot_state_publisher-2] Adding fixed segment from base_link to base_scan
[robot_state_publisher-2] Adding moving segment from base_link to wheel_left_link
[robot_state_publisher-2] Adding moving segment from base_link to wheel_right_link
[gazebo-1] gazebo: symbol lookup error: /usr/lib/x86_64-linux-gnu/libgazebo_common.so.9: undefined symbol: _ZN8ignition10fuel_tools12ClientConfig12SetUserAgentERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
[ERROR] [gazebo-1]: process has died [pid 29726, exit code 127, cmd 'gazebo --verbose /home/k-koh/ros2_ws/install/turtlebot3_gazebo/share/turtlebot3_gazebo/worlds/turtlebot3_worlds/burger.model -s libgazebo_ros_init.so']
```

# solved
```console
sudo apt upgrade libignition-math2
```
【Rails】form_withをSlimで書いてCheckBoxを横並びにした

### はじめに
Railsでテンプレートにslimを使ったform_withの実装で若干苦戦したので、まとめてみました！
今回はCSSのフレームワークにSpectreを使っています。
(Bootstrapでも同様にできると思います。)

Slimになかなか慣れない…

#### 環境
- Ruby 2.6.3
- Rails 5.2.3


### 通常のform_withの書き方
```slim:hoge.html.slim
  section.hoge-list
    h4 メール配信を希望の方はチェック
    = form_with(model: [:ops, @user], local: true) do |f|
      .form-group
        = f.check_box :hoge_column, class: 'form-control'
        = f.label :hoge_column, '配信する', class: 'form-label'
      .form-group
        = f.submit
```
**ブラウザでは以下のようになる**
<img width="411" alt="スクリーンショット 2019-10-01 午後10.21.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280744/584dea5c-ba47-fa91-ad20-2f676879b204.png">
**これではUIが良くないためスタイルを整える必要がある**

### インデント、Spectreを使いスタイルを整える
```slim:hoge.html.slim
  section.hoge-list
    h4 メール配信を希望の方はチェック
    = form_with(model: [:ops, @user], local: true) do |f|
      .form-group
        = f.label :hoge_column, class: 'form-label form-switch'
          = f.check_box :hoge_column, class: 'form-control'
          |
          i.form-icon
          strong 配信する
        br
      .form-group
        = f.submit
```
###
**ブラウザでは以下のようになる**
<img width="411" alt="スクリーンショット 2019-10-01 午後10.36.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280744/f6a5ebf9-a3bc-a002-6c1b-ad422a961f46.png">
**これでUIが良くなり、CSSをあてる手間も省ける**
【Rails】画像の表示方法

画像の表示方法でウンウン詰まったのでメモに残しておきます。

##方法
２種類あり、それぞれ特徴やパスの書き方が違うみたいです。

###１、assets配下に置く場合

格納先：`/app/assets/images/`

今回はこちらを使用することにしました。
`/app/assets/`内のファイルはアセットパイプラインの対象となる→結果ページ読み込み速度が早くなる。

`※アセットパイプライン`
ファイルを最小化（圧縮）して読み込みを早くしてくれるフレームワーク。（初期装備のよう）
アセットを連結することによって、ページリクエスト数を減らすことができる＝更にページ速度向上につながるという仕組み。
画像であればブラウザのキャッシュを残すようにしてくれるため、画像の読み込みが早くなる。
ただし、キャッシュを飛ばさないと画像が正しく表示されない、など起きる。
リファレンスの内容が思ったよりあったので、これは今後詳しく学ぶことにします。

####書き方
```html:htmlで書く場合
<img src="/assets/img_logo_pc.png" alt="">
```
「imagesいらないのかーい！」という不意打ちでした。

```Ruby:ヘルパーの場合
<%= image_tag 'img_logo.png' %>
```
ディレクトリ分けしたくなる気持ちがありましたが、そちらはいったん寝かしておきます。

###２、public配下に置く場合
格納先：`/public/`
ユーザーがアップロードする、などの場合はこちらがいいようです。
こちらは後ほど使用する際にまた追記します。


##判断基準

assets=「システム側に依存する画像関係」の場合に使用
public=「ユーザーがアップロードするような画像関係」の場合に使用

とあった。

ざっと調べただけでは明確にわからなかったので、
現状まずは進めつつ今後深く考えていくことにします。


##参考サイト
[アセットパイプライン - Rails ガイド](https://railsguides.jp/asset_pipeline.html)
[Railsの画像のパス &#8211; assets配下とpublic配下 &#8211; | Boys Be Engineer 非エンジニアよ、エンジニアになれ](https://kurose.me/rails-image-assets-public/)
[image_tagメソッドを使ったイメージタグの作成 - Ruby on Rails入門](https://www.javadrive.jp/rails/template/index11.html)
YubiKeyでMacからUbuntuにSSH接続する

MacからYubiKeyを使用してUbuntuへSSH接続する手順をまとめる。

# 環境
- macOS Mojave
- Yubikey 5C: Firmware 5.2.4
- yubico-piv-tool: 1.7.0
- Ubuntu 16.04.3 LTS

# 必要なツールを入れる
- https://www.yubico.com/products/services-software/download/smart-card-drivers-tools/
    - ダウンロードして適当な場所へ置き、PATHを通す
- `brew install opensc`

# YubikeyをMacに接続
挙動を確認。接続に失敗しているとエラーが出る。

```bash
yubico-piv-tool -a status
```

# PIN, PUK, Management Keyを変更・登録
Yubikeyを安全に使用するためにPIN等を独自のものに変更する必要がある。
GUIの[Yubikey Manager](https://www.yubico.com/products/services-software/download/yubikey-manager/)を使うとやりやすい。

## デフォルトPIN/PUK
- PIN: 123456
- PUK: 12345678

## CLIでやる場合

```bash
# PIN
yubico-piv-tool -a change-pin -P 123456

# PUK
yubico-piv-tool -a change-puk -P 12345678

# Management Keyを生成(48桁の英数字。ほんとはもっとちゃんと作るべき)
date | sha256sum | cut -c 1-48

# Management Keyを登録
yubico-piv-tool -a set-mgm-key
```

# 公開鍵の準備

```bash
# 秘密鍵を生成しPEMファイルを書き出す
yubico-piv-tool -s 9a -a generate -o id_rsa.pem

# 自己証明書を作成
yubico-piv-tool -a verify-pin -a selfsign-certificate -s 9a -S "/CN=SSH key/" -i public.pem -o cert.pem

# 証明書をインポート(失敗する場合はGUIのYubikey Managerを使う)
yubico-piv-tool -a import-certificate -s 9a -i cert.pem

# OpenSSH形式の公開鍵を書き出す
ssh-keygen -D opensc-pkcs11.so > id_rsa.pub
```

その後、 `id_rsa.pub` をサーバの `authorized_keys` へ登録する。

# SSH接続

以下で接続できることを確認。途中、先ほど登録したPINを入力する。

```bash
ssh -I opensc-pkcs11.so ubuntu@xx.xx.xx.xx
```

さらに、YubikeyをMacから外して、接続ができないことを確認しておく。

## ~/.ssh/config の設定

```bash
Host TargetHostName
  HostName xx.xx.xx.xx
  User ubuntu
  PKCS11Provider opensc-pkcs11.so
```

# 備考
- YubiKeyで秘密鍵を生成することで、一切YubiKeyの外に秘密鍵を出さずに公開鍵認証によるSSHが実現可能
- MacがYubiKeyを認識しない場合は何度か抜き差しすると認識する場合がある
Linux基礎(パーミッション)

##ファイルのPermissionと所有者の確認
lsコマンドでファイル情報の詳細情報を表示することができる。

```shell
#詳細情報を表示する場合はオプションlをつけるとよい。
$ ls -l
```

ファイル情報の見方
![スクリーンショット 2019-10-01 22.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/80c3f585-0d6f-e4b1-af14-0be09b6e7e84.png)

##アクセス権限
Linuxで作成されるファイルやディレクトリにはアクセス権(パーミッション)が設定される。これでユーザごとにファイルへのアクセスの許可または禁止を設定できる。アクセス権には、以下の3種類がある。

- ファイルへのアクセス権限

|アクセス権|表記|説明|
|---|---|---|
|読み取り|r|read｜ファイルの読み取りが可能(内容表示など)|
|書き込み|w|write｜ファイルへの書き込みが可能(編集/更新/コピーなど)|
|実行|x|execute｜ファイルの実行が可能(プログラム/シェルスクリプトの実行)|

- ディレクトリへのアクセス権限

|アクセス権|表記|説明|
|---|---|---|
|読み取り|r|read｜ディレクトリの読み取りが可能(ディレクトリに登録されているファイル名の表示)|
|書き込み|w|write｜ディレクトリの書き込みが可能(新規ファイル作成、削除、名前変更など)|
|実行|x|execute｜ディレクトリに登録されているファイルへのアクセスが可能|

※ファイルへのアクセス権限にreadの許可があっても、ディレクトリのexecute許可がなければファイルにアクセスできない。

ファイル権限の見方
![スクリーンショット 2019-10-01 22.29.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/1af87e3b-59e9-3d03-38b8-a8544c7503f3.png)

ファイルの種別は3つあり「-」はファイル、「d」はディレクトリ、「l」はリンクを表す。また、アクセス権は数値でも表すことができる。

|記号表記|2進数|8進数|
|---|---|---|
|---|000|0|
|--x|001|1|
|-w-|010|2|
|-wx|011|3|
|r--|100|4|
|r-x|101|5|
|rw-|110|6|
|rwx|111|7|

![スクリーンショット 2019-10-01 22.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/90149c02-2692-f210-873c-c30f9c173056.png)

##アクセス権限の変更
アクセス権限は、chmodコマンドにより変更することができる。
chmod [オプション] アクセス権 ファイル名

|オプション|説明|
|---|---|
|-R|指定したディレクトリ以下の全てのファイルのアクセス権の変更|


|カテゴリ|説明|
|---|---|
|-R|指定したディレクトリ以下の全てのファイルのアクセス権の変更|

|カテゴリー|説明|
|---|---|
|u|所有者|
|g|グループ|
|o|その他のユーザ|
|a|全てのユーザ|

|定義|説明|
|---|---|
|+|アクセス権の追加|
|-|アクセス権の削除|
|=|アクセス権の指定|
Mac購入からPython環境を整える

# 概要
Pythonの開発環境を整える。

# 環境
MacOS Mojava 10.14.5
git 2.23.0

# 手順
1. pyenvのインストール
2. anacondaのインストール
3. anacondaの仮想環境を構築


## pyenvのインストール
[公式](https://github.com/pyenv/pyenv)を参照した。

```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
 ```
- パスの設定

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
```
- pyenvのおまじない

```
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
```
- シェルの再起動

```
$ exec "$SHELL"
```

## anacondaのインストール
```
$ pyenv install anaconda3-5.3.0
```

```
$ pyenv global anaconda3-5.3.0
```

- `.bashrc`にanacondaの設定を付け足す。

```
#for anaconda3-5.3.0
. ~/.pyenv/versions/anaconda3-5.3.0/etc/profile.d/conda.sh
```
## anacondaの仮想環境を構築

```
$ conda create -n temp python=3.7 numpy matplotlib pandas jupyter
```
- activate

```
$ conda activate temp
```

- pythonのバージョン確認

```
(temp)$ python -V
python 3.7.4
```

# 最後に
これで最低限の環境は整ったと思います。あとはJupyterの環境も整えて万全ですね。
バックグラウンドで実行する系

# 概要
バックグラウンドでスクリプトを実行する方法をまとめる。
# 手法
自分が知っている方法は以下の３つ。他にも多数あると思う。

- nohup
- screen
- tmux

## nohup
ちょっとしたことに使える。

```
nohup test.sh &
```
ログは`nohup.out`に記録される。ログファイルを指定したい場合は

```
nohup test.sh > test.log &
```
### 実行を途中で中止する方法
少しめんどくさい。`ps -x`コマンドで実行IDを調べて`kill`コマンドで削除しなければならない。

## screen
screenではセッションの作成、ウィンドウの分割ができる。
セッション：Webブラウザで考えると新しいタブを開くようなもの。この中で実行したものはバックグラウンドで走り続ける。

### Session
- Sessionの確認

```
screen -ls
```
- Sessionの作成

```
screen -S NAME
```

- attach

```
screen -r ID
```
- detach: `Ctr-a`+`d`
- 削除

```
screen kill ID
```
## tmux
tmuxでもセッション (Session)、タブ (Tab)の作成、ウィンドウの分割ができる。
タブ：セッションの中でさらにもう一つのコマンド入力ライン。

### Session
- Sessionの確認

```
tmux list-sess
```

- Sessionの作成

```
tmux
```

- attach

```
tmux a -t SESSION_NUMBER
```

- detach : `Ctr-b`+`d`
- 今いるSessionを削除

```
tmux kill-session
```

### Tab
- Tabの作成 : `Ctr-b`+`c`
- Tabの移動 : `Ctr-b`+TAB_NUMBER
- Tabの削除 : `Ctr-b`+`&`

### Windowの操作
- 水平分割 : `Ctr-b`+`"`
- 垂直分割 : `Ctr-b`+`%`
- Window番号の確認 : `Ctr-b`+`q`
- 次のWindow番号へ移動 : `Ctr-b`+`o`
- 特定のWindow番号へ移動 : `Ctr-b`+`q`+番号
- Windowの削除 : `Ctr-b`+`x`
（mac）Zshをターミナルのデフォルトに設定したら、nodebrewのnodeが認識されなくなった 


### 現象
Zshをデフォルトに設定した際に、もともとあったnodebrewのnodeが認識されなくなった。

```
$ node -v
zsh: command not found: node
```

### 解決策

パスを設定したらうまくいった。

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

```
$ node -v                                      
v12.11.0
```
vscode remote-ssh を認証付きsocks経由で利用する

社内LANから外部へSSHするに当たってSocksで阻まれている人の手助けになれば・・・！

## 対象

Windows 10（Gitインストール済み）からsocks proxy経由でVSCode remote-sshを利用したい人

## 手順

※vscode/remote-ssh等のインストールは行われているとします。

1. sshのconfigを作成する
2. VSCodeのremote-sshに作成したconfigを読み込ませる
3. 接続する
4. 認証する

### 1. sshのconfigを作成する

以下のような内容のconfigを作成します。

```config:config
# C:\Users\username\Documents\ssh\config
Host remote
  HostName host or ip
  User username
  Port 22
  ProxyCommand C:\Program Files\Git\mingw64\bin\connect.exe -S Username@socksproxy.host:port %h %p
  IdentityFile file/path/to/id_rsa
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
```

#### 注意点

* configの作成先はvscodeからアクセスできるところにしてください。
  * 例えばwsl上の`~/.ssh/config`などにはしないでください。
  * 素直にWindowsのファイルシステム上のマイドキュメントなどに作成してください
* connect.exeに関して
  * Gitに添付されているconnect.exeを利用します。
* IdentityFileのパスの例：`C:\Users\username\Documents\.ssh\jump\id_rsa`
  * 相対パスでも大丈夫だとは思いますが、未検証です
* `StrictHostKeyChecking no`
  * SSH接続時の警告メッセージを出力しない設定
* `UserKnownHostsFile=/dev/null`
  * knownHostsの読み込み・書き込み先を/dev/nullに設定する

### 2. VSCodeのremote-sshに作成したconfigを読み込ませる

以下の記事で紹介されているのでスキップ
...

### 3. 接続する

同じく以下の記事で紹介されているのでスキップ
...


### 4. 認証する

以下のポップアップ？が表示されるので、その中の`details`をクリックすると
コンソールでsocksのパスワードを聞かれるので入力する

![detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64728/06c6e018-d970-1125-7517-d37c7638bc8e.png)

以上の手順で接続できるようになります。

## ハマった部分

### パスワード入力後にフィンガープリントに関するプロンプトに移り、入力できないまま接続に失敗する

以下を設定してフィンガープリントに関して聞かれないようにしてみると上手くいくかもしれません
```config
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
```

### configファイルで設定した鍵ファイルが読み込めない

* remote-wslで行っている場合、remote-wslを抜けてください
* configファイルの格納先がwsl上になっていないか確認してください

## 気になっている部分

※ご存知の方がいたらコメントで教えて下さい。

* Linux版のconnectコマンドは`.connectrc`でsocksのユーザー・パスワードが指定できるのですが、connect.exeでは同様のことができるのかどうか

## 参考にしたページ

* https://qiita.com/suzuki_sh/items/245b9817536eba808842
* https://qiita.com/mechamogera/items/ac06f6363f99d674af63
* https://qiita.com/liubin/items/654ea5ace65a8c3cc56b
CGOを含むgolangのプログラムをラズパイ向けにクロスビルドする

Ubuntu 18.04 を使用しています。

CGOを含む以下のプログラムをgolangのプログラムをラズパイ向けにクロスビルドするには

```cgo_test.go
package main

import (
	"fmt"
)

// #cgo LDFLAGS: -lm
// #include <math.h>
import "C"

func main() {
	fmt.Printf("sqrt(3) = %f\n", C.sqrt(C.double(3)))
}
```

まずクロスコンパイラのインストール

```
sudo apt install g++-arm-linux-gnueabihf
```

gccしかいらなくてもあえてg++をインストールすることでクロスのlibcなど必要なものが全て芋づる式にインストールされます。

go build では以下のように環境変数を指定します。

```
CC=arm-linux-gnueabihf-gcc GOOS=linux GOARCH=arm GOARM=6 CGO_ENABLED=1 go build -o cgo_test.armv6
```

ポイントは`CC=` でCのクロスコンパイラを指定することと、`CGO_ENABLED=1` をつけること。


詳しくは
https://golang.org/cmd/cgo/

## 関連
[x86_64のUbuntuでC/C++のソースコードをARM/ARM64用にクロスコンパイルしてQEMUで実行する方法のまとめ](https://qiita.com/tetsu_koba/items/9bdcb59f912efbff3128)

昔はARM用にビルドしたgolangの実行ファイルはqemuでは動かなかったのですが、今はそんなことなくてqemuで動かすことができるようになっています。
ONNXで fuse_transpose_into_gemm 最適化

ONNXがサポートしている最適 fuse_transpose_into_gemm を調べてみました。

最適化をしている場所はここ。
https://github.com/onnx/onnx/blob/master/onnx/optimizer/passes/fuse_transpose_into_gemm.h

```c++
bool patternMatchPredicate(Node* node) override {
    return node->kind() == kGemm;
  }
  bool runTransform(Node* n, Graph&, NodeDestroyType& destroy_current)
      override {
    const std::vector<int64_t> simple_trans_perm({1, 0});
    destroy_current = NodeDestroyType::DestroyZero;
    bool ret_val = false;
    for (size_t i : {0, 1}) {
      auto inp = n->inputs()[i];
      auto trans = i == 0 ? ktransA : ktransB;
      if (inp->node()->kind() == kTranspose &&
          inp->node()->is(kperm) == simple_trans_perm) {
        n->replaceInput(i, inp->node()->input());
        n->i_(trans, n->hasAttribute(trans) ? !n->i(trans) : 1);
        if (inp->uses().size() == 0) {
          inp->node()->destroy();
          ret_val = true;
        }
      }
    }
    return ret_val;
  }
};
```

gemmの入力がtransposeで、transposeのpermが[0, 1]の時、transposeをgemmにfuseするようです。

グラフ作って試してみました。

```python
transpose = helper.make_node(
    'Transpose',
    perm = [1, 0],
    inputs = ['X1'],
    outputs = ['transpose_out'],
)

gemm = helper.make_node(
    'Gemm',
    ['transpose_out', 'X2'],
    ['Y'],
    transA=1
)
```

最初のTransposeが単純な転置、続くgemmの入力でも転置をいれています。
最適化前のグラフがこう。

![fuse_transpose_into_gemm.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/2a59e41f-1aee-2bca-0943-51f000c971f4.png)


passにfuse_transpose_into_gemmを設定して、optimizer.optimizeを実行します。

```python
passes = ['fuse_transpose_into_gemm']

optimized_model = optimizer.optimize(model_def, passes)
```

最適化を実行するとTransposeが削除されます。
![fuse_transpose_into_gemm_optimized.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/4977eaea-31cb-063b-8e73-8e5799bf6911.png)


gemmの情報を見てみると、上で設定したtransAが0（転置無し）になっています。

```python
op_type: "Gemm"
attribute {
  name: "transA"
  i: 0
  type: INT
}

```

上手くいってますね。

全ソースです。

```python
import numpy as np
import onnx
from onnx import helper, numpy_helper
from onnx import TensorProto
from onnx import optimizer

X1 = helper.make_tensor_value_info('X1', TensorProto.FLOAT, [5, 5])
X2 = helper.make_tensor_value_info('X2', TensorProto.FLOAT, [5, 5])

Y = helper.make_tensor_value_info('Y', TensorProto.FLOAT, [5, 5])

transpose = helper.make_node(
    'Transpose',
    perm = [1, 0],
    inputs = ['X1'],
    outputs = ['transpose_out'],
)

gemm = helper.make_node(
    'Gemm',
    ['transpose_out', 'X2'],
    ['Y'],
    transA=1
)

graph_def = helper.make_graph(
    [transpose, gemm],
    'test-model',
    [X1, X2],
    [Y]
)

model_def = helper.make_model(
    graph_def,
    producer_name='onnx_example'
)

onnx.save(model_def, 'onnx/fuse_transpose_into_gemm.onnx')

onnx.checker.check_model(model_def)

# 最適化パスを指定
passes = ['fuse_transpose_into_gemm']

optimized_model = optimizer.optimize(model_def, passes)
onnx.save(optimized_model, 'onnx/fuse_transpose_into_gemm_optimized.onnx')

node = optimized_model.graph.node[0]
print(node)

```
ubuntuサーバーのセットアップまとめ

# ユーザー追加/SSH設定/Firewall

* [ubuntu ユーザを追加して sudo 権限をつける](https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)

* [SSHのポート番号を変更 - SSHサーバーの設定](https://webkaru.net/linux/change-ssh-port/)

* [Ubuntu 16.04 LTS ServerでSSHのホストキーが自動生成されない](https://qiita.com/xeres/items/6a32729916b07b37ea68)

* [SSHで接続しようとしたら秘密鍵のパーミッションでエラーが出た](http://yachibit.hatenablog.jp/entry/2013/04/25/001912)

* [サクッとUbuntuサーバーの初期設定をする](https://qiita.com/0x50/items/05c89333ae046dc6fa0f)

* [新しいサーバ起動後に最低限行うべき SSH 設定](https://qiita.com/noraworld/items/2f72035544a04d88b9e3)

# GPU

* [Ubuntu18.04 LTSのインストールからNVIDIA GPU Driverのインストールまで](https://qiita.com/riv/items/345373398cf30d16b8ad)

# その他エラー

* [Proxy環境でubuntu18.04LTS Serverでapt updateを実施したらエラーになった件](https://usado.jp/spdsk/2018/07/30/post-4157/)

* [hostnameの変更方法とそれに伴うsudo: unable to resolve hostの対応方法](https://qiita.com/nishina555/items/9f0e70fc690954192e7a)

* [apt-getできない](https://ymotongpoo.hatenablog.com/entry/20070423/1177358371)
[備忘録]heroku 使ってHelloWorldしてみる - CentOS7

インストール方法は以下参照
[Heroku CLI 7.16.8 を CentOS7 にインストールする](https://yokubari.online/heroku/heroku-cli-7-16-8-centos7-install/)
***
####ターミナルからのログイン方法
```
$ heroku login --intaractive
```
***
## 簡単なアプリ作ってみる

####依存関係の設定ファイル作成
```
$ touch composer.json
```

####適当なテストファイル作成
```
$ touch index.php
$ vi index.php >>
<?php
    echo "Hello heroku world!!";
```

####リポジトリ作成
```
$ git init
git add .
git commit -m "first commit"
```

####heroku app作成
```
heroku create <appname>
// <appname>は指定しなければ自動でつく
```

####デプロイ
```
git push heroku/master
```
***
以下参照
[Heroku初心者がHello, Herokuをしてみる](https://qiita.com/Arashi/items/b2f2e01259238235e187)
[Herokuの基礎知識](https://qiita.com/daisukeoda/items/42e802c498ca8a78b8f2)
RaspBerry Pi 3 B+ WordPress インストール後、致命的なREST API 通信エラーが出る

#動作環境
**WordPress の動作環境**
・Raspberry pi 3 b+
・Rasbian 10.0　（buster)
・MySQL 15.1 Distrib 10.3.17-MariaDB, for debian-linux-gnueabinf(armv71) using readline5.2
・PHP 7.3.9-1~deb10u1
・Apache 2.4.38(Raspbian)
・WordPress 5.2.3–ja
・OpenSSL
・ドメインは xxx.mydns.jp を取得

**ネットワーク環境**
[WAN側]<--光-->[モデム]<>[無線ルータ:ポート変換]<...無線...>[RaspberryPi3]
  ↑
外側のＩＰからテスト用ＰＣでアクセス。

WordPress は起動し、インターネットからアクセスしてログイン、通常の操作ができます。
よって、ＦＴＰにてサイトのアップロード可能、また、ＳＳＨ接続可能、https://でのアクセス可能。で、自宅にある無線ルータのポート変換では 443 は通っていると思われます。

##エラー内容
REST API リクエストはエラーのために失敗しました。
エラー: [] cURL error 7: Failed to connect to xxx.mydns.jp port 443: No route to host

**プラグイン：Query Monitor をいれてログを確認しました。**
cURL error 7: Failed to connect to xxx.mydns.jp port 443: No route to host
 -
1.do_action('admin_enqueue_scripts')
wp-includes/plugin.php:465
2.WP_Site_Health->enqueue_scripts()
wp-admin/includes/class-wp-site-health.php:88
1.WP_Site_Health->get_test_rest_availability()
wp-admin/includes/class-wp-site-health.php:1670

##疑問
・そもそもネットワーク設定だけの問題か
・cURL がきちんとインストールされていないのか
 (phpinfo では入っているようです）
を含め、どう切り分けたらいいのか。

raspberry pi のほうのファイアーウォール(iptables)はすべてクリアした状態です。

#解決
いつの間にかエラー内容が　
cURL error 7　→　28　（タイムアウト）
に変わっていました。

これは証明書がらみと予想しました。
開発環境はLAN内で、証明書を発行させたのもLANからでした。
ということはもしかしたらインターネット側から証明書を
発行しないといけないのかしら、と思い、試したところ、
エラーが解消されました。

根本的な原因と説明がつかないのですが、とりあえず
致命的なエラーは検出されなくなりました。
[React][webpack]テスト環境でルートパス以外表示できない時の対処法

# 環境

```
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "webpack": "^4.41.0",
    "webpack-cli": "^3.3.9",
    "webpack-dev-server": "^3.8.1"
```

# 現象1

`/` 以外にアクセスすると 404 Not Found になる。

# 解決法1

`webpack.config.js` に以下のように書き足す。

```js:webpack.config.js
:
module.exports = {
    :
    devServer: {
        historyApiFallback: true,
    },
    :
}
```


# 現象2

ルーターにサブディレクトリを指定し、サブディレクトリに直接アクセスすると、 `bundle.js` が 404 Not Found になって真っ白になる。

# 解決法2

`webpack.config.js` の `output` に `publicPath: '/'` を書き足す。

```js:webpack.config.js
:
module.exports = {
    :
    output: {
        :
        publicPath: '/',
    },
    :
}
```

# 参考

- [deep router refresh 404 · Issue #978 · webpack/webpack-dev-server · GitHub](https://github.com/webpack/webpack-dev-server/issues/978)
Androidアプリ開発において、Firabaseへのログ送信が正常に動作しているか確認する方法


デバック方法の覚書です。

## 前提
- firebaseのアカウントが存在し、アクセスできる
- firebaseへのイベントやログ送信機構が実装されている

## 準備

### Android Debug Bridge（adb）のインストール

公式資料を見ると、adbを使うので予め用意しておく。
adbに関しては、こちらを参考に。

- [Android Debug Bridgeとは？Android開発のデバッグツールのインストールと初期設定](https://qiita.com/TanakanoAnchan/items/676e1e9c15028fd6cb91)


## 手順
### 1. package_nameの確認
`package_name` は、`AndroidManifest.xml`のpackage部分に記述されています。
コマンド実行時に利用するので控えておきます。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="jp.co.eversense.ninaru">

...
...
```

### 2. Android Studioのデバッグオプションの有効化

IDE経由で実機ビルドしておきます。

下記のコマンドを実行します。

```bash
# 今接続している端末 or 
# 複数端末があるとエラーとなる
adb shell setprop debug.firebase.analytics.app {package_name}
```


## 確認

### 1. firabaseのdebug viewにアクセス

![Pasted_Image_2019_08_14_15_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/7b6de876-124b-71e6-8248-2beae3a439a9.png "Pasted_Image_2019_08_14_15_36.png")

### 2. ビルドした端末を選択する

![Pasted_Image_2019_08_14_15_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/e1964435-5c1b-68a9-cf33-add529e4e25a.png "Pasted_Image_2019_08_14_15_39.png")


### 3. androidでいろいろと操作する

適当に操作します

### 4. ログが飛ぶので中身をいろいろと見てみる
![Pasted_Image_2019_08_14_15_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/353e1788-1939-20d2-ec30-6d5ae93bbf9e.png "Pasted_Image_2019_08_14_15_37.png")

## トラブルシューティング
### adb shell を叩いたときに error: no devices/emulators found エラーとなる

- 複数端末をつないでいる状態だと、どのデバイスに対しての命令かわからないのでエラーとなる
- 起動中のAVDをすべて停止させ、端末を一つつなぐと解決する
- あるいは、デバイスをコマンドで指定する

### error: more than one device/emulator メッセージがでる

↑↑↑と同じです。
- 複数端末をつないでいる状態だと、どのデバイスに対しての命令かわからないのでエラーとなる
- 起動中のAVDをすべて停止させ、端末を一つつなぐと解決する
- あるいは、デバイスをコマンドで指定する

### Firebase上に端末は表示されるがログ送信が確認できない
- Firebaseのconsole画面が異なる可能性があります（冗談ではなく、たまにあり得るので）

```bash
# デバイスのリストを確認する
$ adb devices -l
List of devices attached
8AWX10Z52              device usb:336723968X product:blueline model:Pixel_3 device:blueline transport_id:7
ZY322BTNHM             device usb:336658432X product:montana_n model:Moto_G__5S_ device:montana_n transport_id:8


# -s オプションでデバイスを指定して実行する
$ adb -s 8AWX10Z52 shell setprop debug.firebase.analytics.app {package_name}
```


### FirebaseDebugViewについて

- ときどき、パラメータは欠損することがある（Debug viewの仕様っぽい）
- そこまでリアルタイム反映ではない


## 参考

- [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb?authuser=1)
- [イベントのデバック](https://firebase.google.com/docs/analytics/debugview?hl=ja)
rails tutorial勉強中にparamsメソッドが分からなかったので調べてみた


###rails tutorial 8章を勉強中にparamsが分からなかった
rails tutorial8章　8.1.3節　ユーザーの検索と認証　に差し掛かった時、ん？と思った。
この節ではユーザーがログイン画面に入力したemailとpasswordを受け取って、
データベース上に存在しかつ正しいemailとpasswordの組み合わせになっているかを
確認するものだ。

```
params[:session]
{ session: { password: "foobar", email: "user@example.com" } }
```
画面に入力されたデータはこの形で受け取るらしいが、ここで詰まった。

###what is paramsとsession ??
params?session?そんなの書いた覚えは無い…railsのお約束みたいなものなのかな？
ググってたらいいページを2つ見つけた。
[ピカわか【Rails】paramsについて徹底解説！](https://www.pikawaka.com/rails/params)
[WEBCAMP NEVI【Rails入門説明書】paramsについて解説]
(https://web-camp.io/magazine/archives/18258)

このページのおかげでかなり理解が深まりました。

###They are…
- ~~画面に入力された際に生まれたデータは
すべてparamsメソッドにハッシュの形式でまとめられる~~
- ~~paramsメソッドの中にいくつかあるハッシュのうち、
emailとpasswordはsessionメソッドの中に収納される~~

~~とりあえずこんな感じに理解しました。~~
というのは間違いで、正しくは
**params　→　メソッド**
**session　→　キー名**
でした。

詳しく言うと、
**params**：ActionController::Parameters というclassによってユーザーが入力した情報などをもったインスタンスが生成される
そこで生成されたインスタンスを返すのがparamsというメソッド
**session**：paramsが返すインスタンスに含まれているキー名の一つ。

この記事のコメントを見ていただければより分かりやすいかと思います。
コメントでのご指摘ありがとうございました。

###おまけにdebugger
debuggerでparams見たらもっと分かりそう。
そんな感じでdebugger使ってみました。

```app/controllers/sessions_controller.rb
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    debugger #ここdebugger
    if user && user.authenticate(params[:session][:password])
      # ユーザーログイン後にユーザー情報のページにリダイレクトする
    else
      # エラーメッセージを作成する
      render 'new'
    end
  end
```


```console
   11:     else
   12:       # エラーメッセージを作成する
   13:       render 'new'
(byebug) params
<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"LxkdeujFgCWan2zWZJXo+NAsl6FWTvQuOIleI6sr/rGV37pREiUahEJn8GH6Jet8YHs5/xT2tJIQBMIWpBz5EQ==", "session"=><ActionController::Parameters {"email"=>"spdfmasd@gmail.com", "password"=>"s;dlfka;sd"} permitted: false>, "commit"=>"Log in", "controller"=>"sessions", "action"=>"create"} permitted: false>
(byebug) params[:session]
<ActionController::Parameters {"email"=>"spdfmasd@gmail.com", "password"=>"s;dlfka;sd"} permitted: false>
(byebug) params[:utf8]
"✓"
```
ちゃんとsessionがキー名だとわかりますね。

###終わりに
どれくらいの人がここで躓くのかわかりませんが、今後同じような状況で悩む人の手助けになればと思います。
間違いなどありましたらぜひともご指摘をお願いいたします。
Talendでレコード一覧を1つのメールにまとめて送りたい

#  ペインポイント
tSendMailは（一応）入力としてRowを受け付けるが、考えなしに接続するとレコードごとに個別にメールを送ってしまう。（すなわち、5レコードあると5通のメールが送られる）
そうではなく、1通にまとめて送りたい。

# やりかた
Rowとして送るなら、tMapでレコードごとに整形したあとtDenormalizeで一つにまとめれば良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207347/86f90a62-9f4f-94be-9c9e-bfa6cced5c81.png)
tMapは単に出力側をString1カラムにして整形しているだけなので割愛。

## tDenormalize
本来はGROUP BYの簡略版みたいなもののようだが、入力側が1カラムでかつ当該カラムを非正規化させると全レコードを1つにまとめてくれる。

## tSendMail
反復でなくRowで接続してもレコードごとに1メール。
なのにメッセージ欄はGUI編集どころか補完も効かない(v7.2.1)。tMap等と同じく「(接続名).(カラム名)」で前のコンポーネントから渡ってきたデータを引けるので自力で整形する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207347/bb11d5d2-e3d4-9a9b-3eee-3700456de354.png)


# ところで
テスト用のメールサーバはMailHogが楽でいいです。
Vagrant Provisionとは

# vagrantとは
- **仮想マシンの起動**や**パッケージインストール**などを自動で行ってくれるツール
    - 一度設定を作成すれば同じ設定の環境を共有できる！
    - WindowsやMacに依存せず利用可能
- **シェルスクリプト**や**Chef**などのプロビジョニングツールを用いて設定可能


# vagrant provision（プロビジョニング）とは
- **プロビジョニング・システム**
    - 「ソフトウェアインストール」などを自動化できる仕組みのこと
        - 初回セットアップなどを自動化！
- yum updateなどをシェルスクリプトなどの言語で記述可能


# vagrant provisionのタイミング

- **vagrant up**
    - 初回実行時のみ
- **vagrant up --provision**
    - 起動時に行う場合
- **vagrant provision**
    - 起動中のマシンで行う場合
- **vagrant reload --provision**
    - 再起動し行う場合

# vagrantの構成
- **Vagrant Box**
    - 仮想マシンのもととなるベースイメージ
    - ネットで配信されているイメージファイル（Box）をクローンすることで高速にセットアップ可能
- **Vagrantfile**
    - どのイメージファイルや設定を用いてマシンを起動するか
    - 複数に分割可能（設定は上書きされる）

# 特にお世話になった参考文献様
- VagrantとVagrant Boxの違い
    - https://qiita.com/andrew954/items/1d9f460558da7b84768f
- 【Vagrantドキュメント意訳】09.プロビジョニング
    - https://qiita.com/ringo0321/items/38743442a9abfc3be5b2
- VagrantのProvisioning タイミングメモ
- http://yamacent.hatenablog.com/entry/2015/05/30/162404
C/C++言語とMatlabの書き方の違い

# はじめに
C/C++言語について勉強してきたが、matlabを使うことになってきたので、この2つの言語の基本的な違いをまとめようと思う。(Qiitaを使ってまとめるのは初めてなので見にくい部分もあるかもしれませんが、ご容赦ください)


# コメントの挿入
``` C++:C/C++
//  コメント
/*
 複数行まとめてコメントアウト
*/
```
```matlab:matlab
%  コメント
%{
 複数行まとめてコメントアウト
%}
```
（ショートカットキー）
Ctrl+R : 選択した行をコメントアウト

#if文
``` C++:C/C++
if(条件文){
  命令文
}
```
```matlab:matlab
if 条件文
   命令文
end
```
# For文　(0からNUMまでの処理を行うとき)
1.":"コロンで表現 2.{}なし、インテンドで区別　3.endでif文の終わりを明示

``` C++:C/C++
for(j=0;j <= NUM;j++) {
      文
}
```
```matlab:matlab
for j=0:NUM
      文
end
```

#セミコロン;の意味
C/C++では行末に必ず打たなければいけない[;]だが、
matlabでは結果を非表示にさせたいときに使う！


#編集用
``` C++:C/C++

```
```matlab:matlab

```
Apex文字数削減のためのプラクティス

# Apex文字数削減のためのプラクティス

 

- 定数定義クラスは必要最小限にする。 

    - 同じ意味の定数を再定義しない。

    - 定数定義クラスはアプリケーション単位で用意することを考える。

 

- 不要なタブ・スペース・改行は削除する。

    - インデントはタブで行う。

    - 行末の空白は削除する。

 

※変数名と"="の間のスペース

`public static final Integer VAR001[SPC][SPC]= 0;`

`public static final Integer VAR002[SPC][SPC]= 1;`

`public static final Integer VAR003[SPC][SPC]= 2;`

 
※不必要なタブ

```
    catch (Exception e){

[TAB][TAB][TAB]

        throw e;

    }

[TAB][TAB]

    return resultValue;
```

※行末の空白文字

`public static final Integer VAR001= 0;[SPC][SPC][SPC][SPC][SPC]`

 

 

- 階層構造の下位エレメントに大量にアクセスする場合は、上位階層を一時変数に格納し、アクセスを行うことで、文字数を削減できる。

```
ioDat.work.IDE_KyotsuHokenShurui__c = ...

ioDat.work.IDE_KyotsuHokenKikan__c = ...

ioDat.work.....

ioDat.work.....

ioDat.work.....
```

 

ioDat.work を一時変数に代入することで、'ioDat.'の重複を除去できる

 

- オブジェクト名やクラス名に不必要に長い名称を使用しない。
scrapyでスクレイピング。spiderをscrapinghubで管理

# スクレイピングの管理

みなさん、スクレイピングの管理はどのようにしていますか。
自分でサーバで立ち上げたり面倒な作業がいらない方法をご紹介します。


## scrapyでスクレイピングする部分を作成する。

### プロジェクトの作成
```
pip install scrapy
scrapy startproject yahoo_scrapy
cd yahoo_scrapy
scrapy genspider yahoo yahoo.co.jp
```

### spiderの作成（スクレイピング部分）
```
cd yahoo_scrapy
scrapy genspider yahoo yahoo.co.jp
```

```yahoo_scrapy/items.py
class YahooScrapyItem(scrapy.Item):
    link = scrapy.Field()


```

```yahoo_scrapy/spiders/yahoo.py
# -*- coding: utf-8 -*-
import scrapy

from ..items import YahooScrapyItem


class YahooSpider(scrapy.Spider):
    name = 'yahoo'
    allowed_domains = ['yahoo.co.jp']
    start_urls = ['http://yahoo.co.jp/']

    def parse(self, response):
        for sel in response.css("a"):
            article = YahooScrapyItem()
            article['link'] = sel.css('a::attr(href)').extract_first()
            yield article


```

## ローカルでの動作確認

```
scrapy crawl yahoo
```

標準出力に、結果が出力されます。


## scrapinghub
https://app.scrapinghub.com
こちらのほうに登録してください。

ログインして、プロジェクトを作成します。
yahooをスクレイピングしようかと思うので、yahooプロジェクトにします。
![スクリーンショット 2019-09-30 21.06.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/757b6a99-dc9c-5a63-2d43-14eaab786880.png)

Code & Deploys で作成したレポジトリと接続します。

<img width="1436" alt="スクリーンショット 2019-10-01 21.22.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/f2a59fcc-000a-a212-b179-81740904f70d.png">

接続完了後に、Gitのほうを、コミットしてプッシュしちゃってください。

SPIDERSメニューのDashboardをみると、yahooのspiderが登録されます。
![スクリーンショット 2019-10-01 21.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/0e6e17fa-2ed7-c15f-3eea-536aa11b6aba.png)

RUNボタンを押して動かしてみましょう。
![スクリーンショット 2019-10-01 21.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/d13d66d9-eef9-f575-0af8-2c7d012eb768.png)

終了するとこんな感じで、結果が出ます。
![スクリーンショット 2019-10-01 21.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/6743c30f-5e3e-3859-cecd-ddac1c5b8813.png)

さらにItemsを押すと、１つずつ見れます。
EXPORTからCSVやJSONなどに出力できます。便利です。
このScrapinghubには、apiもあり、結果がすぐAPIの結果して提供されます。
そちらも時間があれば書こうかと思います。

![スクリーンショット 2019-10-01 21.31.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/86c04435-0b6e-5657-bc80-8605b2255d5c.png)
Blender進捗録

##はじめに
この記事は1ヶ月前にBlenderを触り始めた人の勉強メモです。過度な期待はしないでください。
誤った内容が含まれる可能性が多々あります。誤りに気付いた方は、コメントにて脇腹をつついてください。

###進捗、どうですか？
ダメです！仕事の合間合間にやってるけど全然進みません！
肩がこるわ、首もこるわ、腰も痛いわで、整骨院に通いだすくらい痛い痛いわで、全然進みません！

###微速前進、感想と感謝
Blenderを触って思うことは「ものすっごい地道な作業なんだな」ということ。
3Dモデルのような、見ているだけで楽しくなるようなものに対して、
色んな人がこうやって地道にポリゴン積み上げているんだな・・・と感謝感謝です。

私も面を貼って、頂点を調節して、上から下から横から見て、また面貼って・・・。
その繰り返しで何とか顔の輪郭までは出来たんじゃなかろうか、と思っています。

![katakoru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483109/185c448f-2223-8565-4ec5-54e73532a1dc.png)

そんな初心者な私が、ここまで進められたのも先人のおかげです・・・。
特に以下の動画は、何回も視聴しながら作業をさせていただいており、本当に感謝です・・・。
（基本をわにこ沼地辺境伯様の動画から学んで、
　Blender2.8でのUIはひのちゃんねる様の動画を参考にさせていただいております。）

■ワニでもわかるゼロからのBlender
https://www.youtube.com/watch?v=7oNfgOOcKm8

■Blenderで美少女錬成講座
https://www.youtube.com/watch?v=IgsIvAqBchE

動画のコンテンツとしては、全身を作るまではまだ投稿されておりませんので、
他の動画を参考にしながら、今後もやっていこうと考えています。
3D関連の作業は、進捗や出来栄えが結果として、すぐに現れるので、すごくやりがいがあるぜ・・・。
Automation Anywhere Enterprise v11.3.3の情報まとめ

9月下旬にAutomation Anywhere Enterpriseの新バージョンであるv11.3.3がリリースされました。まだ日本語の情報が少ないのですが、オフィシャル情報で見つけた英語資料をまとめました。

3大トピックは「**Bot StoreとControl Room/Clientとの統合強化**」「**SAP GUIのオブジェクト操作**」「**Active Directoryセキュリティグループを通しての権限付与**」のようですが、その他にも「**Citrix自動ログイン機能**」「**GCPへのControl Room/Enterprise Clientのインストールサポート**」「**Object Cloning/Meta BotにおけるMozilla Firefoxサポート**」などの機能が充実しているようです。

英語資料

* [RPA Made Easy with Automation Anywhere Enterprise 11.3.3](https://www.automationanywhere.com/jp/blog-archive/blog/automation-anywhere-news/rpa-made-easy-with-automation-anywhere-enterprise-11-3-3) - Automation Anywhere news
* [Announcing Automation Anywhere Enterprise version 11.3.3](https://apeople.automationanywhere.com/s/feed/0D56F00007Zyeo7SAB?language=en_US
) - A-People
* [Enterprise v. 11.3.3 drives RPA governance using Active Directory Security Groups](https://apeople.automationanywhere.com/s/feed/0D56F00007ZyeW7SAJ?language=en_US) - A-People
* [Enterprise 11.3.3’s Bot Store integration feature](https://apeople.automationanywhere.com/s/feed/0D56F00007ZyebeSAB?language=en_US) - A-People
* [Version 11.3.3 Release Notes](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/release-notes/release-notes-11-3-3.html?_LANG=jpjp) - Automation Anywhere Product Documentation

**v11.3.2の情報**

* [Automation Anywhere Enterprise 11.3.2 での新機能、強化されたAPI管理、グローバル化のプロセス、Citrix連携強化、ログ管理と監査の簡素化](https://apeople.automationanywhere.com/s/feed/0D56F00006rmezWSAQ?language=ja) - A-People
* [Automation Anywhere Enterprise 11.3.2 リリース](https://apeople.automationanywhere.com/s/feed/0D56F00006pPi9PSAS?language=ja) - A-People
* [Version 11.3.2 リリースノート](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/release-notes/release-notes-11-3-2.html?_LANG=jpjp) - Automation Anywhere Product Documentation
* [フリートライアル簡易インストール手順書](https://www.automationanywhere.com/images/Quick_Installation_Guide_May19_JP.pdf)

**v11.3.1の情報**

* [Version 11.3.1 リリースノート](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/release-notes/release-notes-11-3-1.html?_LANG=jpjp) - Automation Anywhere Product Documentation
* [Automation Anywhere Enterprise V. 11.3.1 is here](https://www.automationanywhere.com/blog/automation-anywhere-news/automation-anywhere-enterprise-v-11-3-1-is-here) - Automation Anywhere Blog
【勉強会】持って帰ってすぐ使えるデザインシンキング入門 #エンジニア寄せ鍋#10

# エンジニア寄せ鍋#10 に参加してきました
持って帰ってすぐ使えるデザインシンキング入門 #エンジニア寄せ鍋#10
https://yosenabe.connpass.com/event/132606/

> デザインシンキングと言う言葉をよく聞くようになって数年経ちました。
> 広まってはいるのですが、
> ・良さそうだから取り入れてみたいな、でも何からすればいいのかな？
> ・1回やってみたけど続かなかったな。
> ・やってみているけど、うまくいかないな。
> など、現状は様々だと思います。
> 
> 
> そのデザインシンキングのイメージは、2日間缶詰になってワークショップをするなどの事例が多いので、
> 準備が大変、時間が取れないなど、なかなかとっつきにくくて、
> 「やったことある」、「チームに取り入れてる」となりづらいところがあるのかもしれません。

「わかる〜〜！！」と思って参加してきました。
以下、簡単にまとめていきます。
間違い、認識違いがあったらご指摘ください。
※ 持ち帰りポイントは、私が思った持って帰れそうなポイントです。


# デザインシンキングとは
デザイナーのプロセスをデザイナー以外も活用できるように整理したツールボックス
IDEOが広めた

一般的に言ういわゆる「工業製品のデザイン」はスタイリング。

ここで言うデザインは問題解決力。
絵心、センス、クリエイティビティではない。
__目的のために効果的かどうか__が評価軸
評価は問題が解決された効果でされる
（好き嫌いで評価されるのはアート）

## デザインシンキングがやりづらい理由
つまりなところ「デザインシンキングとは？」が分かりづらい
→ ツールボックスと思って使う。
  デザインシンキングが出来ているor出来ていないとは考えないこと。

# 一般的なデザインシンキング
観察→（発散・収束）→問い→（発散・収束）→プロトタイプ

# 観察
ワークショップでは、おでかけして観察したり、インタビューをしたりしている
インプットが普通すぎると次のフェーズで「発散」しない。
   
* __持ち帰りポイント__  
普通のユーザーのインタビューに加えて、
__ヘビーユーザー__ or __全く使わないひと__のインタビューをしてみると面白い意見が聞けるかもしれない。

### ホットワード
観察フェーズで得た気づきを付箋でペタペタ貼ったりする。
そのときやりがちなのが、付箋をカテゴリ分けしてしまう。

* __持ち帰りポイント__
    * ここでは、カテゴリ分けじゃなくて、ホットワード(__ユーザーの気持ち__)でまとめる
    * ペタペタ貼った付箋をカテゴリ分けするのは収束(観察は発散フェーズ）
    * アイデアを発散させたいときにはホットワードでまとめてみる。

#### ショッピングセンターの例

- __カテゴリ分け__
    - 移動
        - 通路が狭い
        - エスカレーターが遅い
    - 休憩
        - 椅子が満席

カテゴリ分けすると、スペックの解決になってしまいがち。
ex.)　椅子を設置する。


- __ホットワード__
    - 座りたい
        - 椅子が満席
    - 景色が見たい
        - 通路が狭い
        - エスカレーターが遅い　（←プラスなことに分類された！）

### 共感
ユーザーの気持ちで課題を洞察することにより、本質的な解決策に。
収束フェーズでしっくりいく解決策がないのは入り込めていない証拠。
共感に入りすぎると「代表性／一般性がないよね」と言われがちだが、統計やデータだけだと気持ちが入らない。
代表性がないかどうかは、プロトタイプ以降でもよい。


#### 「たくさん荷物を持ったひとの写真」の例

- __観察__
    - かわいそう
    - タクシー乗るお金ないのかな
    - 道の邪魔
    - 大変だね頑張ってるね

→　スペックのみを解決しがち（荷物を減らすことで解決を図る）


- __共感__
    - 汗ダラダラ
    - タクシーよりほかのことにお金を使いたいのかな
    - 足が痛い
    - このあと背負っているギター引くのに手が痛い

→　ユーザーの気持ちで課題を洞察することにより、本質的な解決策に。


# 問い
「だれだれ」が
「まるまる」なときに
「ほにゃらら」な状態になるにはどうしたらよいか。

## 問いはなぜ必要か？

__問い①：操作をスピードアップするにはどうしたらよいか？__
施策：ショートカットキー　サーバースペック　音声入力
ショートカットキーを覚えるのがよさそう・・・？


__問い②：「７０歳のおばあちゃん」が、「思い切ってインターネットを始めたときに」、「操作をスピードアップする」には？__
施策：ショートカットキー　サーバースペック　音声入力
問い①ではあまり効果的と見られなかった「音声入力」が筆頭解決策に上がる。

__持って帰りポイント__
会議等で、「課題定義と解決策は別で考える」という意識をもち、会議のルールを定めると良い。

## モノが決まっているときの問いづくりのコツ
とはいえ、ゼロベースで考えることよりも
対象のモノ(プロダクト)が決まっていて、それについて考えなければならないことめちゃくちゃあるよね…

- __持ち帰りポイント__  
モノ、ひと、シーン、表層理由、深層理由、どんな存在でフレームを作って考えてみる  
とある「手帳」で言えば
    - モノ：手帳
    - ひと：孫が大好きなおばあちゃん
    - シーン：孫を思い出すとき
    - 表層理由：同じものを持っている
    - 深層理由：孫とのつながり
    - どんな存在：記念品


## 問いまとめ
問いがあるから成果物が評価できる、じぶんの仕事も問いを作って見る
問いと解決策を同時に考えない。問いを考えてから、解決策を議論する
モノだけで考えるとスペックを意識しすぎてしまうので、ひと、シーンを入れてスペックが活用される価値を意識する。

# プロトタイプ
４コママンガ・レゴブロック等でプロトタイプを作ってみて、寸劇で表現する。
寸劇は、プロトタイプづくりに参画していない第三者に見てもらう。
実際に問いのターゲットのビフォーアフターを体験する。

__演る人__

- 説明者：前提やちょっとした説明でフォロー
- 演じる人：「問い」のターゲットを演じる


演じる側は恥ずかしいが、演じることによって気付きが得られる。
例えば、前提や解決策に無理があることに気づくことができる。


## 参考
ITOKIのデザイン思考のガイドブックが良い
https://www.itoki.jp/catalog/special/designthinking/

## 次回
静的サイトジェネレーターについて、１１月８日にやるみたいです。

Static Gen Ginza #エンジニア寄せ鍋 11
銀座で静的サイトジェネレーターを語る 〜静的サイトジェネレーターと令和元年〜
https://yosenabe.connpass.com/event/144950/
ONNXで fuse_pad_into_conv 最適化（駄目でした）

ONNXがサポートしている最適化 fuse_pad_into_conv を調べてみました。

どうもconvにfuseする系は最適化ができないようで、fuse_pad_into_convは上手く動きませんでした。

最適化をしている場所
https://github.com/onnx/onnx/blob/master/onnx/optimizer/passes/fuse_pad_into_conv.h

```C++
// Before:
//   P = Pad(X) - opset 10 and below (or) Pad(X, Pads, [Constant_value]) - opset 11 and
//   above Z = Conv(P, Y)
// After:
//   Z = Conv(X, Y) with "pads" attribute set
//
// the pass handles the case when Pad is zero-padding the input
// (i.e. mode=constant and Constant_value=0)
```

コメントによると、PadとConvが並んでいるとPadを削除してくれるようです。

最適化前のグラフ

![fuse_pad_into_conv.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/64a2e326-1d92-5c84-be36-da5a29df503e.png)


最適化をするとこのようなエラーがでます。

```python

File "C:\home\app\anaconda3\lib\site-packages\onnx\optimizer.py", line 55, in optimize
    optimized_model_str = C.optimize(model_str, passes)
IndexError: invalid unordered_map<K, T> key

```

全ソースです。

```python
import numpy as np
import onnx
from onnx import helper, numpy_helper
from onnx import TensorProto
from onnx import optimizer

X = helper.make_tensor_value_info('X', TensorProto.FLOAT, [5, 5])
Y = helper.make_tensor_value_info('Y', TensorProto.FLOAT, [5, 5])
pads_list = numpy_helper.from_array(np.array([1,1,1,1], dtype=np.int64))
pads_list.name = 'pads_list'

W = numpy_helper.from_array(np.zeros((1, 3, 3), dtype=np.float))
W.name = 'W'

pad = helper.make_node(
    'Pad',
    ['X', 'pads_list'],
    ['pad_out'],
    mode='constant',
)

conv = helper.make_node(
    'Conv',
    kernel_shape=[3, 3],
    inputs = ['pad_out', 'W'],
    outputs = ['Y'],
)

graph_def = helper.make_graph(
    [pad, conv],
    'test-model',
    [X],
    [Y],
    initializer = [pads_list, W]
)

model_def = helper.make_model(
    graph_def,
    producer_name='onnx_example'
)

onnx.save(model_def, 'onnx/fuse_pad_into_conv.onnx')

onnx.checker.check_model(model_def)

# 最適化パスを指定
passes = ['fuse_pad_into_conv']

optimized_model = optimizer.optimize(model_def, passes)
onnx.save(optimized_model, 'onnx/fuse_pad_into_conv.onnx')

```
node.jsにおける非同期処理の順序

node.jsには、現在の処理を抜けた後に、即時実行するためのコマンドが4つある。

* setImmediate(f)
* setTimeout(f,0)
* process.nextTick(f)
* Promise.resolve().then(f)

どの順序で実行されるか、調べた結果をまとめておく。

先に結論を述べると、以下の順序になっている。（左が先に実行される）
**process.nextTick(f) > Promise.resolve().then(f) > setTimeout(f,0) ≒ setImmediate(f)**

この順序で実行されることは、以下のページで説明されている。
https://nodejs.dev/

# コードで確認

実際にコードを書いて試してみる。

``` javascript:main.js
setImmediate(() => {
  console.log('setImmediate')
})
setTimeout(() => {
  console.log('setTimeout0')
}, 0)
Promise.resolve().then(() => {
  console.log('Promise Job')
})
process.nextTick(() => {
  console.log('nextTick')
})
console.log('main')
```

``` shell:実行結果
$ node main.js
main
nextTick
Promise Job
setTimeout0
setImmediate
```

setTimout(f,0)とsetImmediate(f)については、試した環境では常にsetTimeout(f,0)が先だったが、
説明によると確定ではないようである。
【rails】jQueryでいいね機能を非同期化しよう

#やりたいこと
いいねを非同期でやりたい！！
railsの勉強し始めてしばらく同期通信しかやっていませんでした。。
そんな時、Ajaxという言葉を見つけました。
Ajax？何やと調べてみると非同期通信の意味らしい
非同期通信があると一つのページでいろいろなことができるようになる！！
ページに新しい情報を増やす時はだいたい非同期通信が使われています

**この記事を理解して非同期通信できるようになってください！！！**

#方法
今回の方法は以下の通りです
1. ボタンをクリックでAjax（非同期通信）でアクションへ送信
2. アクションで処理を進め、ビューへデータを返す
3. Ajaxが成功したらHTMLを書き換える

##ボタンをクリックでAjax（非同期通信）でアクションへ送信
ビューファイルから押すとAjaxでアクションへ送信するボタンを実装します
では、説明していきます

###link_to
一般的な方法でいいね機能を実装するのであれば、このメソッドを使っていると思います
追加するのは`remote true`と`class: "post_favorites_create"`です
`remote true`は非同期通信にするための記述です。
`class: "post_favorites_create"`はJaveScriptで反応させるために設定しています
クラス名は好きな名前にしてください

`<%if @post.favrite?(current_user)%>`current_userが@postに対していいねをしてるかどうかのチェックです。
いいね実装時に条件分岐していると思うので、それに合わしてください。

```html:posts/show.html.erb
<div class="favorite">
	<%if @post.favrite.nil?%>
		<%= link_to post_favorites_path(@post), id: "post_favorites_deatroy", method: :delete, remote: true do %>
			<span>❤︎</span>
		<%end%>
	<%else%>
		<%= link_to post_favorites_path(@post), id: "post_favorites_create", method: :post, remote: true do %>
			<span style="color:red;">❤︎</span>
		<%end%>
	<%end%>
</div>
```

##アクションで処理を進め、ビューへデータを返す

```ruby:app/controllers/favorites_controller.rb
def create
	@post_favorites = Favorite.new(user_id: current_user.id,post_id: params[:post_id])
	@post_favorites.save
	result = [done: "save",user_id: current_user.id, post_id: params[:post_id]]
	render :json => result
end

def destroy
	@post_favorites = Favorite.find_by(user_id: current_user.id, post_id: params[:post_id])
	@post_favorites.destroy
	result = [done: "destroy",user_id: current_user.id, post_id:params[:post_id]]
	render :json => result
end
```

resultを定義するときの
`done`はビューにresultを返した時に判断するための値です

`render :json => result`
resultをjson形式でビューに返すということです。

##Ajaxが成功したらHTMLを書き換える
```javascript:
$(document).on('ajax:success', '.favorite a', function(e) {
    Ajaxに成功した時の処理
});
```
favoriteクラスないのaタグからのajaxが成功した時にfunction(e)を実行するという意味です
eはajaxで返ってきた値をeとして扱う

```javascript:application.js
$(document).on('ajax:success', '.favorite a', function(e) {
    if (e.detail[0][0].done == "save"){
        var post_fav = document.getElementById('post_fav')
        post_fav.innerHTML = '<a id="post_favorites__deatroy" data-remote="true" rel="nofollow" data-method="delete" href="posts/'+e.detail[0][0].post_id+'/favorites"><span style="color:red;">❤︎</span></a>'
    }
    if (e.detail[0][0].done == "destroy"){
        var post_fav = document.getElementById('post_fav')
        post_fav.innerHTML = '<a id="post_favorites_create" data-remote="true" rel="nofollow" data-method="post" href="posts/'+e.detail[0][0].post_id+'/favorites"><span>❤︎</span></a>'
    }
  });
```

これで非同期化が完了です

まとめると
link_toに`remote: true`、id名の追記
redirect_toを`render :json =>`に変更
jsファイルにajax成功時の処理を記述する
以上３点です。

以上のことを設定すると同期通信を非同期通信にすることができます
いいね以外にも他の機能を非同期にしてみましょう！！

**質問、気になるところなどございましたらコメントよろしくお願いします**
uri HTTP.net


- HTTPリクエストを送るには、url（ipアドレス）, portでリクエスト送れる


```ruby

require 'uri'
require 'net/http'


uri = URI("http://localhost:5000/createPost")
params = { body: "hello"}

uri.query = URI.encode_www_form(params)

# get アクセスの仕方

req = Net::HTTP.new uri.host, uri.port

result =  req.get('/posts')
puts result.body

# post クエリなどを渡す時

req = Net::HTTP.new uri.host, uri.port

result = req.post(uri.path, uri.query)
puts result.body


# uri も最高

uri = URI("http://localhost:5000/createPost")
p uri.host

p uri.port
p uri.path

params = { body: "hello"}

uri.query = URI.encode_www_form(params)
p uri.query
```

## 記事

https://tech.unifa-e.com/entry/2017/06/14/185239
Dockerコンテナ・イメージの全削除コマンド

ローカルのお掃除するときにたまに使うのでメモ。

# Dockerコンテナ全削除

```
docker ps -aq | xargs docker rm
```

# Dockerイメージ全削除

```
docker images -aq | xargs docker rmi
```

# 参考

* http://docs.docker.jp/index.html
Study C# - Scope, CompileSymbol -

プログラミング C# をまとめてメモしてみる
普段はPHPだとかJavascriptばっかり触っているので、とても新鮮で楽しいでございます！

動作環境
`VisualStudio for Mac - COMMUNITY -` 
バージョン `8.3.1(build 18)`

<h3>スコープ</h3>
基本的には他の言語とも変わりない
Block内で有効なスコープは 

- Block前に宣言されたもの
- Blockの中で宣言されたもの

```c#
int a1 = 0;
{
    // このスコープで作成されたものは外には出れない
    int a2 = 0; // ①
    a1 = 1;
}
// Blockの中にある変数を宣言しようとすると、Block内がコンパイルエラー（①）になる↑
int a2 = 9; // ②
```
①(Block内) と ②(Block外) の2箇所で宣言すると以下のような現象が発生する
②のいちで二重定義になっているが、①でエラーが発生する。短いコードならまだすぐに発見できるけどもスコープが広くなると厄介になりそうな予感

*<b>宣言空間</b>* なるものによる仕様らしい

<h3>コンパイルシンボル</h3>

プリプロセスで参照されるディレクティブ
`#define` `#if` `#else` `#elif` `#endif` 

```c#
#define DEBUG // ステートメントでは無いので最後のセミコロンはいらない

using System; // 最初のステートメント
...
...
...

#if DEBUG
    Console.WriteLine("Debug Mode.");
#else
    Console.WriteLine("Prod Mode.");
#endif
```
`#define` はファイルの一番先頭に記述 ※ 最初のステートメントよりも先に定義する必要がある
ステートメントよりも前であればいいので、コンパイルシンボルをコンパイルシンボルで分けて定義するとかわけのわからないこともできる（ということ）

```c#
#define AAA

#if AAA
    #define BBB
#else
    #define CCC
#endif

#define DDD

using System;
...
```

`System.Diagnostics.Conditional`
を利用することで、コンパイルシンボルの設定に合わせてMethodの定義が可能
コンパイルシンボルが定義されていればコンパイルされ、定義されていなければコンパイルのタイミングでよしなに削除してくれる。
デバッグ用のメソッドとかこれでかける（Prodビルドのときは製品に含まれない）

```C#
CompileMethod();

[System.Diagnostics.Conditional("DEBUG")]
static void CompileMethod()
{
    Console.WriteLine("DEBUG Compile Method");
}
```

<h4>#error #warning</h4>
コンパイルシンボルのなかで強制的にエラー／ワーニングを発生させるときにつかう

```C#
#error えらーなんよ
#warning わーにんぐ
```

<h4>#line</h4>
あまり使いみちも無い気もするけども
エラーが起こったときに強制的に行番号とファイル名を書き換える

```c#
#line 999 "FUGAFUGA"
int a = "string"; // int型にStringを入れようとしている エラー
```
エラーコンソールの表示では `行番号：999` `ファイル名：FUGAFUGA` となる
たとえこの場所がmain.csの10行目であろうとも

<h4>#region #endregion</h4>
なにもしない。$region と　#endregion が対になってるかをチェックする
とある処理をブロック的に分けたいときに有用そう
ブラケット `{}` で囲むと ブロックとして扱われてスコープが影響する
macOSでWiresharkのウィンドウを複数開く方法

自分用メモシリーズ#1
##はじめに
よく使うわりに、パッと出てこなくていつも調べちゃうコマンド（？）メモ。

##アイコンクリックでは開いてくれない
同じタイミングで取得した別のネットワークのパケットを並べて見比べたいのに、LaunchpadのWiresharkのアイコンをクリックしても二つ目のウインドウは開いてくれません。別のpcapngファイルをダブルクリックしても、起動中のウインドウで開いてしまいます。

そんなときにターミナルを開いて、これ。

```
open -n /Applications/Wireshark.app/
```

##こうなります
一件落着。
ただ正直なところ、ターミナルをいちいち開くのは面倒臭いので、アイコン右クリックで「別のウィンドウで実行」とか、Fileメニューに「Open as another window」とかあればいいのに・・。
![スクリーンショット 2019-10-01 20.34.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344121/461d77cf-de39-bb17-2b18-1614a14fdb16.png)
Git/Gerritで二つのコミットをまとめる

# 目的

- 二つのコミットを一つにまとめる方法を書く。
- 1回のコミットにしたかったが間違えて2つに分けてしまい、2つ目のコミットを間違えた場所からしてしまった時の対処法を書く。

# 前提条件

- pushを行い現在レビュー中にRebaseを行った二つのコミット(AコミットとBコミット)をまとめる時を想定する。
- 最初に行ったコミットをAコミットとし、Aコミットで修正したファイルをAファイルとする。
- 後に行ったコミットをBコミットとし、Bコミットで修正したファイルをBファイルとする。
- Aコミットのpush環境は残っておらず、現在はBコミットの環境のみがローカルに存在するものとする。

# 実施詳細

※確認コマンド実行の合間にコマンド`$ git log`を実行すると良い

1. fetchでレビュー中の情報を取得する
  1. Bコミットの環境にfetchでレビュー中のAコミットの環境を得る。
  1. コマンド`$ git fetch gerrit`を実行したがレビュー中に実施したRebaseの情報までは取得できなかった。(コミットIDを指定してcheckoutしようとしてもfatalと言われた→rebaseを行ったため、その情報がGerrit上にはあるがローカルになかったため怒られた)
  1. 下記コマンドを実行しAコミットのレビュー中の内容までの情報を取得した。(rebaseの情報も取得できた)
  ```
  $ git fetch gerrit refs/changes/変更番号下2桁/追跡番号/Aコミットのpatch setの番号
  ```
1. fetchした情報をもとにcheckoutをしてレビュー中のファイルAを取得
  1. コマンド`$ git checkout AコミットのコミットID`を実行しコミットIDに結びついたファイルを取得した。
  1. 下記コマンドを実行してBコミットのファイルを取得した。
  
  ```
  $ git cherry-pick -n BコミットのコミットID
  ```

1. 取得したファイルをステージングする。
  1. 下記コマンドを実行した。
  
  ```
  $ git add .
  ```

1. 追加したBコミットのファイルを含めてコミットをした。
  1. 下記コマンドを実行した。

  ```
  $ git commit --amend
  ```

1. リモートにpushを行う。
  1. 下記コマンドを実行した。

  ```
  $ git push gerrit HEAD:refs/for/ブランチ名
  ```