OmniAICreator/Qiita-1.07M huggingface dataset:
pythonでimportできない時の調査

numpyですらimportできない。
`pip list`では入っているのに、、、という時の確認。
グチャぐちゃなマシンに環境構築しないといけない時などに。

# pythonのパス
まずはここから。

```
ls -l `which python3`
```
`python3`というコマンドを打った時にどこを参照しているのかわかる。
意図せず複数のpythonが入っていることがあるので、
自分の使いたいものと一致しているかを確認する。

## pipのパス

```
pip3 --version
ls -l `which pip3`
```


## モジュールのインストールの確認

```
pip3 show [モジュール名]
```
例えば、numpyの場合、

```
pip3 show numpy
```

インストールされている場合は、Locationに注目する。

```
Name: numpy
Version: 1.18.1
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: /usr/local/lib/python3.7/site-packages
```


## python systemのパス

```
python3
```

Enterしてpython3に入る。その後下記3行を実行

```
import sys
import pprint
pprint.pprint(sys.path)
```
パスが表示されたら、control+Dで抜ける.
ここに、モジュールのLocationがあるかを確認。

なければ、環境変数`PYTHONPATH`を確認

コマンドラインからは、
```
python -c 'import sys,pprint;pprint.pprint(sys.path)'
```
でできる。

## 環境変数`PYTHONPATH`の確認

```
echo $PYTHONPATH
```

モジュールのLocation設定をここに書いておけば
とりあえず動く。

`bash`ならば、

```
export PYTHONPATH=[モジュールLocation]
```

`csh`ならば、

```
setenv PYTHONPATH [モジュールLocation]
```
で、環境変数にいれる。
確認は、`echo $PYTHONPATH`で。

ただし、ターミナルの再起動で環境変数はリセットされる。
永続するなら、`bash_profile`や`cshrc`などに追記する。
（別途、環境変数の設定で調べてください）

# リトライ

```
python3 
```
```
import [モジュール名]
```
してみる。
2020年、改めて React に入門する

僕がはじめて React をさわったのは 2016 年の 3 月頃、まだ Version 0.14 くらいのときでした。

スプレッドシートやガントチャートなどのコンポーネントを 1 年くらいがっつり作り込み、

**React スゴい！**
**さすが FB！**
**キミに決めた！**

と意気込みましたが、その後バックエンド開発がメインになり[^1] 、React からは完全に遠ざかってしまいました。

[^1]: 基本的に会社の方針には逆らいません

気が付けば 2020 年、Version はいつの間にか 16.12 とか。

**TypeScript で書けるんだっけ？**
**React Hooks? なにそれ? おいしいの?**
**へぇー、componentWill〜は非推奨になるんだ。って一体なにがあった！？**[^2]

[^2]: [React.js のライフサイクルメソッド componentWillReceiveProps の廃止対応](https://qiita.com/mori-dev@github/items/c0a458384b5390494784)

…と、気になることが山積みですw

# TL;DR;

取り急ぎ、クリーンな環境で React アプリを起動してみます

```shell
$ docker run --detach --interactive --rm --name app --publish 3000:3000 node:12-alpine
$ docker exec app npx create-react-app app
$ docker exec --interactive --tty --workdir /app app npm start
```

ブラウザで開いてみましょう
http://localhost:3000
![image01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554236/ccba0f59-19b7-48b0-5260-c614fd74b616.gif)

OK,
では一旦 `ctrl + c` でアプリを停止して、React アプリの開発を開始しましょう！

# TL;DR; for the next step

```shell
$ docker exec app apk add curl git vim zsh zsh-vcs
$ docker exec app git config --global user.email "you@example.com"
$ docker exec app git config --global user.name "Your Name"
$ docker exec --workdir /app app git init
$ docker exec --workdir /app app git add -A
$ docker exec --workdir /app app git commit -m "Initial commit"
$ docker exec --workdir /root app curl --remote-name https://raw.githubusercontent.com/hysh8392/dotfiles/master/.zshrc
$ docker exec --interactive --tty --workdir /app app zsh
```

とりあえず、最低限必要なコマンドのみインストールします

Mac で開発する場合、本当は [Docker Desktop for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac) と [Visual Studio Code](https://code.visualstudio.com/) を組み合わせた開発が最強だと思うんですが、ホスト側の作業フォルダをコンテナにマウントするとパフォーマンスが激しく劣化する、という長年解決されていない問題があるため、`vim` を入れときますw

この問題はおそらく [Visual Studio Code](https://code.visualstudio.com/) の神アプデ「[VS Code Remote Development](https://code.visualstudio.com/blogs/2019/05/02/remote-development)」[^3]で解決されるものと思われますが、この機能の検証は別の記事で書きたいと思います

[^3]: [VSCodeのRemote Developmentを使ってみる](https://qiita.com/HoriThe3rd/items/b2f6c440f096106cf89e)

# そして開発へ…

それではいよいよ開発に入っていきましょう！

To be continued...笑
Storyboardで制約設定したViewの位置をコードで取得したい

# 問題
Storyboardで制約指定したViewのframeをコードで取得したかったとき、その時点でのsizeはうまくとれているけど、originがうまくとれてなかった。
初歩的な問題かもしれないけど、はまって困った。
Viewが描画されたあとのような以下のようなときに起きてた。

```
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
  print(targetView.frame)
}

-> (0.0, 0.0, 100.0, 100.0)
```

# 結論
`translatesAutoresizingMaskIntoConstraints` を `false` に設定すると取得できた。

```
targetView.translatesAutoresizingMaskIntoConstraints = false
```
Wio Lite RISC-V で Lチカ

秋月電子より[Wio Lite RISC-V](http://akizukidenshi.com/catalog/g/gM-14785/)を入手しましたが、[メーカ製品情報](https://www.seeedstudio.com/Wio-Lite-RISC-V-GD32VF103-p-4293.html)を見にいっても開発に関する情報がありません。ネットをいろいろ探し回っても開発環境として [PlatformIO がサポートされている](https://docs.platformio.org/en/latest/boards/gd32v/wio_lite_risc-v.html)ことと[回路図](https://github.com/SeeedDocument/Wio-Lite-RISC-V-GD32VF103)だけで、ろくな情報がありません。同じ MCU である GD32VF103CBT6 を積んだ Longan Nano と同様にやれるだろうとの予想の下でLチカしてみました。

# 開発環境構築

[Longan Nano 爆速Tips - 環境設定～Lチカ編 -](https://qiita.com/iwaoka1986/items/21f0f43c63e819d1d2d8)の[環境構築　IDE編](https://qiita.com/iwaoka1986/items/21f0f43c63e819d1d2d8#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89ide%E7%B7%A8)にしたがって PlatformIO の環境設定をしてください。Board のところで "Wio Lite RISC-V (SeeedStudio)" を選ぶのだけが違います。

「Project Example」から「longan-nano-blink」を選択してLongan Nano用Lチカのサンプルを入れます。

ドライバのインストール

[ボード初期設定手順](https://qiita.com/iwaoka1986/items/21f0f43c63e819d1d2d8#%E3%83%9C%E3%83%BC%E3%83%89%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E6%89%8B%E9%A0%86)にしたがってドライバをインストールしてください。Zadigによる書き換えは必要ありませんでした。

# Lチカサンプルの書き換え

Longan Nano用Lチカのサンプルは内蔵の赤LEDがつながっているPC13ピンを操作しています。これを定義している箇所は以下です。

```c
40: #define LED_PIN GPIO_PIN_13
41: #define LED_GPIO_PORT GPIOC
42: #define LED_GPIO_CLK RCU_GPIOC
```

Wio Lite RISC-V 内蔵の青LEDはシルク印刷や回路図によるとPA8につながっているので、以下のように書き換えました。

```c
40: #define LED_PIN GPIO_PIN_8
41: #define LED_GPIO_PORT GPIOA
42: #define LED_GPIO_CLK RCU_GPIOA
```

# 書き込み

* 「platformio.ini」を編集して以下を追加します。

```
upload_protocol = dfu　を追加
```

* ボードを dfu モードにする

ボード上のスライドスイッチをシルク印刷されている BOOT0 と反対側にすると dfu モードになるようです。

![IMG_5290.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/377a24b5-2e89-2c94-7436-062fbe4d338c.jpeg)

* あとは Longan Nano と同様にチェック記号のクリックでコンパイル、右矢印記号のチェックで書き込みです。Longan Nano と同様に Error 74 が発生しますが、書き込みは行えています。

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/8253ed5c-bc78-49a4-fc25-58f9d513e4ff.gif)
nvm環境のnpm自体をコマンド一発で最新化する方法

## コマンド一発でnpm自身を最新化する方法

nvm環境でnpm自体のアップデートがうまく行かなかったのでコマンド一発で成功する方法を公開しときます

### やり方

以下、bashコマンドラインで実行するだけの簡単なお仕事
ヒアドキュメント使ってるのでcatから下部のEOFまでコピーしてね
(Macの場合は「$PROGRAMFILES」環境変数とれないので書き換えればOK)
<font color="Red">
2020年4月25日 - 追記
何もグローバルインストールしていない空の状態で実行してください
確認方法：$ npm ls -depth 0
</font>

```shell:console
$ cat <<EOF > npm_update.sh && chmod +x npm_update.sh && ./npm_update.sh && rm -rf ./npm_update.sh
#!/usr/bin/bash
cd "$PROGRAMFILES"/nodejs
rm npm npx npm.cmd npx.cmd
mv node_modules/npm node_modules/npm2
node node_modules/npm2/bin/npm-cli.js i -g npm@latest
rm -rf node_modules/npm2/
EOF
```

### やってる事
実行ファイル生成
↓
実行権限を付与
↓
実行してnpmアップデート
↓
削除して終了

## 上記にたどり着くまでの失敗
### 失敗１：「npm install -g npm」を実行してみた
まずは正攻法のやり方として「$ npm install -g npm」を実行してみると以下エラー。

```console:console
C:\WINDOWS\system32>npm install -g npm
npm ERR! code EEXIST
npm ERR! path C:\Program Files\nodejs\npm.cmd
npm ERR! Refusing to delete C:\Program Files\nodejs\npm.cmd: is outside C:\Program Files\nodejs\node_modules\npm and not a link
npm ERR! File exists: C:\Program Files\nodejs\npm.cmd
npm ERR! Remove the existing file and try again, or run npm
npm ERR! with --force to overwrite files recklessly.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\inukujira\AppData\Roaming\npm-cache\_logs\2020-02-15T00_43_01_988Z-debug.log
```


### 失敗２：「npm-windows-upgrade」を実行してみた
「npm-windows-upgrade」というモジュールを使えばいいというissueを見つけたのでインストールして実行してみた。
しかしうまくいかず...。

```console:console
C:\WINDOWS\system32>npm-windows-upgrade
npm-windows-upgrade v6.0.1
? Which version do you want to install? 6.13.7
Checked system for npm installation:
According to PowerShell: C:\Program Files\nodejs
According to npm:        C:\Program Files\nodejs
Decided that npm is installed in C:\Program Files\nodejs
Upgrading npm... -

Upgrading npm (fallback method)... \

You wanted to install npm 6.13.7, but the installed version is 6.13.4.

A common reason is an attempted "npm install npm" or "npm upgrade npm". As of today, the only solution is to completely uninstall and then reinstall Node.js. For a small tutorial, please see https://github.com/felixrieseberg/npm-windows-upgrade#usage.

Please consider reporting your trouble to https://aka.ms/npm-issues.

Debug Information:

node: 12.16.0 | v8: 7.8.279.23-node.31 | uv: 1.34.0 | zlib: 1.2.11 | brotli: 1.0.7 | ares: 1.15.0 | modules: 72 | nghttp2: 1.40.0 | napi: 5 | llhttp: 2.0.4 | http_parser: 2.9.3 | openssl: 1.1.1d | cldr: 35.1 | icu: 64.2 | tz: 2019c | unicode: 12.1 | os: win32 x64
```
emojiを出力する

[twitter#gojas_jp](https://twitter.com/search?q=%23gojas_jp&src=typeahead_click&f=live)で大変刺激を受けたので。
でも、小ネタ
#SPL
```java:emoji.spl
| makeresults count=2
| streamstats count
| eval hex=if(count=1,"1F300","1F5FF")
| eval digit=tonumber(hex,16)
| makecontinuous bins=1 digit
| eval uni_code=printf("%c",digit)
| eval hex=tostring(digit,"hex")
| table uni_code hex digit
| stats values(uni_code) as unicode delim=""
| nomv unicode
```
#結果
![unicode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/25f0d846-637c-3d2b-0c6e-5118677021db.png)
#解説
```java:test_ai.spl
| makeresults 
| eval unicode=split("611B","")
| mvexpand unicode
| eval uni_hex=tonumber(unicode,16)
| reverse
| streamstats current=f count
| reverse
| eval uni_digit=uni_hex * pow(16,count)
| eventstats sum(uni_digit) as result
| eval uni_code=printf("%c",result)
```
コード変換のネタを考えていて上のようにUNICODEの数値から文字に変換できることに気づいた。
cf. [図書館員のコンピュータ基礎講座 Unicode その他の記号と絵文字](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/u1f300.html)から範囲を拝借
#まとめ
UTF-8が扱えるので、コピペでいいと思う。🛸
糞ゴルァプログラミング

```SNNNVector.py
class SNNN():
    def __init__(self,t):
        self.t = t
        self.SNT = self.__Rim(t)

    def __Rim(self):
         return (34*10**t-7)/9

    def Get(self):
        return self.t

    def __pow__(self,t):
        return self.__Rim(self.t+t)

    def __lshift__(self, t):
        self.t += t
        self.SNT = self.__Rim(self.t)
        return self.SNT

    def __rshift__(self, t):
        self.t -= t
        self.SNT = self.__Rim(self.t)
        return self.SNT

    def __lt__(self, t):
        return self.t < t

    def __le__(self, t):
        return self.t <= t

    def __eq__(self, t):
        return self.t == t

    def __ne__(self, t):
        return self.t != t

    def __gt__(self, t):
        return self.t > t

    def __ge__(self, t):
        return self.t >= t

    def __add__(self,other):
        self.SNT += ~other

    def __invert__(self):
        return self.SNT

```
unity iosへのビルドエラーに関して（解決済み）

unityでビルドを試験的に行ったところエラーが出てしまい。どうにもなりませんでした。
エラー内容（一部省略）
1 Failed running/Application/Unity/省略../UnityLinker.exe
2 Exception 省略il2cpp..../UnityLinker.exe did not run properly

使用Unity 2019.3.1 MacBook Air

解決策は、
① Unity のプロジェクト（ゲーム）をUnity（アプリケーション）フォルダ（デレクトリ）
に保存。

② buildの保存先もunityのアプリケーション内に保存

私自身はプロジェクトをSDカード（外部）に保存していました。

やったこと
① 以前に作ったプロジェクトをassetからexport（この場合の保存場所はどこでもいい）
② Unityを外部ではなくMacbook自身に再インストール
③ 新しくプロジェクトを作成（保存先はそのUnityのフォルダ内にする←重要)
④ テストとしてiosをbuildしてみる（成功）
⑤ ①をassetからインポート
⑥ buildしてみる→成功（保存さきはそのUnityのフォルダ内←重要)
Raspbian Buster 2020-02-13 Release-note 翻訳

(追記: 2020/5/28にRaspbian Buster 2020-05-27がリリースされています)
https://qiita.com/utaani/items/7347a0c0f4103b8c367a

http://downloads.raspberrypi.org/raspbian/release_notes.txt

2020-02-13：

  - RaspberryPi設定-XScreensaverがインストールされている場合、画面ブランキング設定を無効に
  - バグ修正 - Raspberry Pi設定でVNCをオフにするスイッチが無効
  - バグ修正 - ファイル名の%20の文字表示を修正。
  - Linuxカーネル4.19.97
  - Raspberry Piファームウェア 9a34efbf2fc6a27231607ce91a7cb6bf3bdbc0c5
   - gencmd: CLOCK_OUTPUT_108のmeasure_clock nameを修正
   - mmal isp: RGB24フォーマットのリモート配置要件を修正
   - 無くなっていたVC_IMAGE_PROP_YUVUV_4K_CHROMA_ALIGNのフラグを追加
   - platform: gpu オーバークロック設定を緩和
#Rails の ActiveRecord create の返り値で レコードが作成保存されたかどうかを確認する ( persisted? )

- create! と違い create は例外を起こさない
- 返り値が model class の instance になるので、 persisted? ( 永続化されたかどうか？ ) を聞くと良さそうだ。
- SQLレベルで失敗した場合は例外扱いになり、返り値は得られないようだ。

```rb

# -------------------------
# 作成成功ケース
# -------------------------

succeeded_created = User.create(name: "yy")
# (1.0ms)  BEGIN
#   User Exists (1.4ms)  SELECT  1 AS one FROM `users` WHERE `users`.`name` = BINARY 'yy' LIMIT 1
#   User Create (1.4ms)  INSERT INTO `users` (`name`, `created_at`) VALUES ('yy', '2020-02-13 23:42:17')
#    (4.9ms)  COMMIT

succeeded_created.persisted?
# => true

succeeded_created.valid?
#  User Exists (1.0ms)  SELECT  1 AS one FROM `users` WHERE `users`.`name` = BINARY 'yy' AND `users`.`id` != 83 LIMIT 1
# => true

succeeded_created.invalid?
#  User Exists (2.2ms)  SELECT  1 AS one FROM `users` WHERE `users`.`name` = BINARY 'yy' AND `users`.`id` != 83 LIMIT 1
# => false

succeeded_created.errors
#=> #<ActiveModel::Errors:0x000056396e61bc70
# @base=#<User:0x000056396e816480 id: 83, name: "yy", created_at: Thu, 13 Feb 2020 23:45:53 UTC +00:00>,
# @details={},
# @messages={}>

succeeded_created.errors.present?
#=> false


# -------------------------
# バリデーションによる作成失敗ケース
# -------------------------


failed_created = User.create(name: "yy")
#    (0.6ms)  BEGIN
#  User Exists (1.2ms)  SELECT  1 AS one FROM `users` WHERE `users`.`name` = BINARY 'yy' LIMIT 1
#   (1.0ms)  ROLLBACK

failed_created.persisted?
# => false


failed_created.errors
# => #<ActiveModel::Errors:0x0000563973bd4888
# @base=#<User:0x0000563973bd9d10 id: nil, name: "yy", created_at: nil>,
# @details={:name=>[{:error=>:taken, :value=>"yy"}]},
# @messages={:name=>["はすでに存在します"]}>

failed_created.errors.present?
# => true

failed_created.valid?
 #  User Exists (1.2ms)  SELECT  1 AS one FROM `users` WHERE `users`.`name` = BINARY 'yy' LIMIT 1
=> false

failed_created.invalid?
#   User Exists (1.7ms)  SELECT  1 AS one FROM `users` WHERE `users`.`name` = BINARY 'yy' LIMIT 1
=> true


# -----------------------------
# SQL エラーが発生したケース
# -----------------------------

sql_failed_created = User.create(name: "yy")
#   (0.8ms)  BEGIN
 # User Create (6.1ms)  INSERT INTO `users` (`name`, `created_at`) VALUES ('yy', '2020-02-13 23:55:11')
#   (5.7ms)  ROLLBACK
#ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry 'yy' for key 'index_users_on_name': INSERT INTO `users` (`name`, `created_at`) VALUES ('yy', '2020-02-13 23:55:11')
# 
# Caused by Mysql2::Error: Duplicate entry 'yy' for key 'index_users_on_name'

sql_failed_created.persisted?
# NoMethodError: undefined method `persisted?' for nil:NilClass


```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2986








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
EC2にSSHコマンドで接続した際、Permission denied (publickey,gssapi-keyex,gssapi-with-mic).が出た場合

AWS学習中、上記エラーにぶつかったので備忘のために残す。




```
ssh -i ***.pem ec2-user@IPアドレス
```
このコマンドを入力すると、

```
Warning: Identity file ***.pem not accessible: No such file or directory.
ec2-user@IPアドレス: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

このエラー。

[EC2へのSSH接続でPermission denied (publickey). が出たとき](https://qiita.com/aroundFifty/items/0896d6b7b0b3e2987035)を参照し、コマンド入力するも同様のエラーが続く。

試行錯誤していると、***.pemへのパスが間違っていることに気づく・・・。

```
ssh -i Desktop/***.pem ec2-user@IPアドレス
```
これで無事解決！



```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'Desktop/***.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "Desktop/***.pem": bad permissions
ec2-user@IPアドレス: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

・・・と思いきや、今度はこのメッセージに遭遇。


『Amazon Web Services 基礎からのネットワーク&サーバー構築』　によると、これは、

>鍵ファイルのパーミッションが他のユーザーにも閲覧できる状態になっているのが理由です。

とのこと。

```
$ chmod 400 Desktop/***.pem
```

このコマンドを実行することで、自分だけしか読み込めないようにすることで、突破できました。
I2C > 異なるプルアップ抵抗で動作するICデバイスの同居 > I2C Repeater Hubで回路を分離する

```txt:動作環境
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
Zephyr 2.1.0-rc1
キャラクタLCD: AQM0802
放射温度計センサー: MLX90632 (CLICK-IRThermo)
ロジック確認: Analog Discovery 2 (AD2)
```

### 第一回

- [borgThermo > 放射温度計 > 第一回: STM32L476とMLX96032の通信(I2C)](https://qiita.com/7of9/items/58b1e1ceacbdb38c636e)


### 概要

- I2Cデバイスを複数接続しようとしていた
- MLX90632には基板上に1kΩのプルアップ抵抗が実装済
- AQM0802は1kΩのプルアップ抵抗では動作しない
- I2C Repeater Hubで回路を分離して、それぞれプルアップ抵抗を実装している回路を見つけた
- その回路を実際に作って動作を確認した

### デバイス

- [MLX90632　放射温度計センサークリックボード [CLICK-IRThermo]](http://www.microtechnica-shop.jp/shopdetail/000000000108/disp_pc/)
- [AQM0802 Ｉ２Ｃ接続小型キャラクタＬＣＤモジュール　８×２行](http://akizukidenshi.com/catalog/g/gP-06669/)
    - 加工: [電子工作 > AQM0802 > ユニバーサル基板実装](https://qiita.com/7of9/items/bf5a653d1925cbb38569)
- [STM32L476](https://docs.zephyrproject.org/latest/boards/arm/nucleo_l476rg/doc/index.html)
- [Ｉ２Ｃバスリピーター　ＰＣＡ９５１５ＡＤ](http://akizukidenshi.com/catalog/g/gI-10882/)
    - [ＳＯＰ８（１．２７ｍｍ）ＤＩＰ変換基板　金フラッシュ　（９枚入）](http://akizukidenshi.com/catalog/g/gP-05154/)に実装

### 参考

- http://www.ti.com/lit/an/slva689/slva689.pdf
    - Figure 1にI2C Repeater Hubにて回路を左と右に分離して、プルアップ抵抗をそれぞれ実装している例がある
    - これらのプルアップ抵抗の値は指定なし

上記の基づいて、以下の質問をした。

- [Different pullup resistors on the same I2C SCL and SDA before and after a I2C repeator hub](https://electronics.stackexchange.com/questions/480608/different-pullup-resistors-on-the-same-i2c-scl-and-sda-before-and-after-a-i2c-re/480641#480641)

回答の概要としては「それは動くかもしれないけど、XXXの方がよいと」というものだった。
動作確認のために実装してみた。

### 回路

以下は、draw.ioにて作成した回路図。

![Screenshot from 2020-02-15 09-33-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/9755b765-be9d-e3f7-9562-a32c15a3c9ec.png)

### プログラム

MLX90632およびAQM0802を動作するソフトをZephyr(RTOS)用に自作した。
整理できていないため、詳細は未公開。

- MLX90632ソフト
    - ambient temperatureとobject temepratureを取得する
    - 結果はシリアル出力する (screenで動作確認)
- AQM0802ソフト
    - Helloという表示
    - 7of9という表示
    - 上記を1秒ごとに切り替える

### ブレッドボード実装

ブレッドボードで実装した。

![IMG_1693.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/1af2771e-1957-b253-a973-9de590b0af4d.jpeg)

- 黄ケーブル: SCK
- 青ケーブル: SDA
- 赤ケーブル: VCC
- 白ケーブル: VCCまたはプルアップ用
- 緑ケーブル、黒ケーブル: GND
- 緑の基板: MLX90632
- 青の基板: AQM0802

### 結果

それぞれのソフトが正常動作した。
まだ数時間程度の運用のため、長期動作時の問題については未確認。

### 関連

- [STM32L476 > I2C > AQM0802 > 1kΩのプルアップで動作しない (MLX90632のプルアップと同居できない)](https://qiita.com/7of9/items/682a261fe7daab09af0f)
Docker 基礎的なコマンド

## 目的

- dockerのコンテナを扱う際の基礎的なコマンドを記載する

## 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| Docker バージョン | 19.03.8 | こちらの方法で導入→[Docker Desktop for Mac をインストールする](https://qiita.com/miriwo/items/b4d41c45a12b1ae7f91e) |

## 動いているコンテナの一覧を出力

- 下記にコマンドを記載する。
- CONTAINER IDに記載された内容がコンテナのIDとなる。

    ```terminal
    docker ps
    >CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
>08e5ce32dacf        httpd               "httpd-foreground"   11 minutes ago      Up 11 minutes       0.0.0.0:8080->80/tcp   serene_fermi
    ```

## コンテナのストップ

```terminal
docker stop コンテナID
```

## コンテナの一括ストップ

```terminal
docker stop $(docker ps -q)
```

## コンテナのスタート

```terminal
docker start コンテナID
```

## コンテナの一括スタート

```terminal
docker-compose up -d
```

## コンテナの削除

```terminal
docker rm コンテナID
```

## コンテナの一括削除

```terminal
docker rm $(docker ps -q -a)
```

## イメージの一覧を出力

- 下記にコマンドを記載する。
- REPOSITORYに記載されたものがイメージとなる。

    ```terminal
    docker images
    >REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    >httpd               latest              c562eeace183        12 days ago         165MB
    ```

## イメージの削除

- 下記にコマンドを記載する。
- 本コマンドは`$ docker stop`を行わないと実行できない。

    ```terminal
    docker image rm イメージ名
    ```

## イメージの一括削除

```terminal
docker rmi $(docker images -q)
```

## コンテナが削除され現在使用されていないイメージの全削除

```terminal
docker images prug
```
系建築家(system architect)になるには, OSEK(38)

系建築家(system architect)になるには

昨日、H試験場のHさんと、D計算機のAさんとお話した。

これまで、系建築家(system architect)になるにはどうしたらいいかわかっていなかった。

３つの仮定を置くことにした。

1) 天才型
2) 秀才型
3) 熱狂型

原子力発電所、人工衛星、飛行機、自動車など複雑な系で、一人では全体が見られないという仮説がある。そうかなと思ったこともあった。

昨日、お二人とお話していて、旗(flag)が立った。
全体を見続ければ、自分でも系建築家(system architect)になれるかもしれないと思った。
現在、自動運転自動車の基本設計の仕事をしている。そして、AUTOSARが自動運転自動車の基本設計にどれくらい役立つかを調べ始めた。

Autosar文書を読む(感想)
https://qiita.com/kaizen_nagoya/items/b517392610cdf85514f5

応用の課題と、電子回路の課題の間の、過去の隙間は埋めようとしているが、現在の隙間は埋め切れていないかもしれないと感じている。

大事なのは直感だということをしばしば建築家の方からお聞きする。
膨大な与件(data)を前に、本質的な課題のいくつかを発見できるのは直感。

機械学習では、人間が従来直感で発見してきた事象を、体系的に解明することができる。
人間より説明責任に長けているかもしれない。

これまでの系建築家(system architect)には、天才型と秀才型がいることは想定してきた。

今回新たに熱狂型を想定する。

どこまで複雑でも、系を見ればわかることがある。

# 事例1 航空宇宙
JAXAが主催するWOCSという行事で、航空宇宙機器の系建築家に出会った。

ある機器の事故の報告で、報告書に書かれていない事項について質問した。
自分は航空宇宙の専門家ではないので、報告書に書かれていない課題は見つけられなかったが、報告書が不十分であることは直感的にわかった。
「単純な設計でないこと」についての回答があった。
航空宇宙の専門家であれば、どれくらい単純な設計で大丈夫かと、どれくらいからは複雑すぎて事故防止がしにくくなるかの線引きができることが分かった。


第8回クリティカルソフトウェアワークショップ（WOCS2011)
https://www.ipa.go.jp/sec/softwareengineering/events/20110118.html

第9回クリティカルソフトウェアワークショップ(WOCS2)
https://www.ipa.go.jp/sec/softwareengineering/events/20111117.html

第10回クリティカルソフトウェアワークショップ
https://www.ipa.go.jp/sec/softwareengineering/events/20120927.html

【共催】第11回クリティカルソフトウェアワークショップ （WOCS2）
https://www.ipa.go.jp/sec/events/20140115.html

【共催】第12回クリティカルソフトウェアワークショップ （12thWOCS2）
https://www.ipa.go.jp/sec/events/20150120.html

【共催】第13回クリティカルソフトウェアワークショップ （13thWOCS2）
https://www.ipa.go.jp/sec/events/20160119.html

【共催】第14回クリティカルソフトウェアワークショップ （14thWOCS2）
https://www.ipa.go.jp/sec/events/20161212.html

【共催】第15回クリティカルソフトウェアワークショップ（15thWOCS2）
https://www.ipa.go.jp/sec/events/20171129.html

# 事例2 自動車
自動車用OSのOSEKのオープンソースの事業に参加した。

自動車では内燃原動機(internal combustion engine)でも、電動機(electric motor)でも角速度制御をするために、最小機能の場合には、割り込み制御で設計し、OSのtaskは起動しないことを知った。

通信系では時間制御であるため、OSのtaskで時間が間に合えばtaskで管理し、taskで間に合わないようであれば割り込み制御で設計する。主に、taskで間に合わない実時間処理を担当していたためtaskは、OSの教育以外では使ったことがなかった。

ITRONでも、OSEKと並行して、自動車用Profileでは、同様の構造を持ったし、その特徴を生かした最小集合Profileでも同様であった。

# 参考資料
第4回クリティカルソフトウェアワークショップ Workshop Of Critical Software: WOCS
http://www.jsfws.info/jaxa-ista/wocs/

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

LaTeX(0) 一覧　
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

Rust(0) 一覧　
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

小川清最終講義、最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
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.01 初稿 　20200215
ver. 0.02 add memo 20240423
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
【Rails6】DEPRECATION WARNING: Rails 6.1 will return Content-Type header without modification. If you want just the MIME type, please use `#media_type` instead.

# 環境
- Ruby: 2.6.3
- Rails: 6.0.2.1

# なんだこのWarning :thinking: 
```
DEPRECATION WARNING: Rails 6.1 will return Content-Type header without modification. If you want just the MIME type, please use `#media_type` instead.
```

`ActionDispatch::Response#content_type` を呼ぶとこんなWarningが出ました。

- Rails６.1からContent-Typeヘッダの値をそのまま返すよう変更するよ（これまではcharsetを除外してたけど含まれるようになるよ）
- MIME typeだけが欲しい場合は `ActionDispatch::Response#media_type` を使ってね

と言われています。


欲しいのは `text/html` とか　`text/plain` みたいなMIME typeでしたので、

`ActionDispatch::Response#media_type` へ修正してWarning解消しました。

# 参考
- [Rails アップグレードガイド - Railsガイド](https://railsguides.jp/upgrading_ruby_on_rails.html#actiondispatch-response-content-type%E3%81%8Ccontent-type%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%9B%E3%81%9A%E3%81%AB%E8%BF%94%E3%81%99%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F)

> 従来は、ActionDispatch::Response#content_typeの戻り値にcharsetパートが含まれていませんでした。 この振る舞いは変更され、従来省略されていたcharsetパートも含まれるようになりました。
>
> MIMEタイプだけが欲しい場合は、代わりにActionDispatch::Response#media_typeをお使いください。

- [Content-Type - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Type)
- [MIME types (IANA media types) - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types)
git のコミットプレフィックス入力をサポートする Vim プラグイン：vim-git-commit-prefix を作った

## はじめに

Vim プラグインの勉強を細々と続けていて、そろそろ簡単なプラグインを作ってみたいなと思って作ったプラグインを紹介します。

## vim-git-commit-prefix とは

[gotchane/vim-git-commit-prefix](https://github.com/gotchane/vim-git-commit-prefix) は、git でコミットメッセージを編集するときに、プレフィックスの候補を表示してくれるプラグインです。

git のデフォルトエディタを vim にした状態で `git commit` をすると、編集画面の最初にプレフィックスの候補を表示してくれます。

![](https://user-images.githubusercontent.com/20318418/74576678-3f79e880-4fcf-11ea-8199-bfc1c790c9b8.png)

### 2020/02/16 追記：

以下 PR を送っていただきました！より便利になったと思います。感謝です！！

* Vim 上で git を操作するプラグイン、[vim-fugitive](https://github.com/tpope/vim-fugitive) や [gina.vim](https://github.com/lambdalisue/gina.vim)でも動作するように
  * [fix: plugin is called when messages are already typed by kuuote · Pull Request #2 · gotchane/vim-git-commit-prefix · GitHub](https://github.com/gotchane/vim-git-commit-prefix/pull/2)

* `git commit --amend` や `git rebase`中の`reword`等ではプラグインが発火しないように
  * [feat: works with git plugin's commit window by kuuote · Pull Request #1 · gotchane/vim-git-commit-prefix · GitHub](https://github.com/gotchane/vim-git-commit-prefix/pull/1)

## 使い方

プラグインマネージャーでプラグインをインストールします。

```vim
call dein#add('gotchane/vim-git-commit-prefix')
```

そして、git のデフォルトエディタを vim にすればOKです。

```
$ git config --global core.editor vim
```

`git commit` をすると、エディタ起動と同時にコミットプレフィックスの補完が表示されると思います。上下で候補を選択してください。

### 2020/02/16 追記：

Vim 上で git を操作するプラグインで利用される方は、それぞれのプラグインで `git commit` 相当の操作をすれば利用できます。

* [vim-fugitive](https://github.com/tpope/vim-fugitive)の場合
  * `:Gcommit` 

* [gina.vim](https://github.com/lambdalisue/gina.vim)の場合
  * `:Gina commit`

## プレフィックスについて

[angular.js/DEVELOPERS.md](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type) を踏襲し、以下が選択できます。

* feat: A new feature
* fix: A bug fix
* docs: Documentation only changes
* style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
* refactor: A code change that neither fixes a bug nor adds a feature
* perf: A code change that improves performance
* test: Adding missing or correcting existing tests
* chore: Changes to the build process or auxiliary tools and libraries such as documentation generation

## 作った背景

社内でコミットプレフィックスをつけるのが流行っていたり、コミットプレフィックスの有用性に関する記事を読んだりしていて、コミットプレフィックスつける運用やってみたいなと思っていました。しかしいざやろうとすると気分で付けたり付けなかったりして、続けるのは難しいなと感じていました。

そこで、コミットメッセージを編集するときに強制的にプレフィックスを補完してくれるものがないかを探していました。[cz-cli](https://github.com/commitizen/cz-cli) というプレフィックス補完をサポートするツールもあるようなのですが、僕はコミットメッセージ編集を vim でやっていたということもあり、vim プラグインの勉強のお題にもなるし良いなと思って、vim プラグインを作ってみることにしました。 

実際自分で使い始めてからは、必ずプレフィックスをつける意識がついたので便利に使っています。

## おわりに

初めて作ったプラグインなので荒い作りだと思いますが、よかったら使ってみてください。Issue、PR お待ちしてます！

## 参考

* [【今日からできる】コミットメッセージに 「プレフィックス」 をつけるだけで、開発効率が上がった話 - Qiita](https://qiita.com/numanomanu/items/45dd285b286a1f7280ed)
Rでデータの密度を見る（カーネル密度関数・ラグプロット）

###### tags: `rBasicLearning`
# データの密度を見る

### ヒストグラムを密度で表す
まずは, 一つ目のヒストグラムを描く.
freq = FALSEにすると, 度数ではなく, 密度で表示してくれる.

```r
hist(lynx,
     breaks = 14,          # "Suggests" 14 bins
     freq   = FALSE,       # Axis shows density, not freq.
     col    = "thistle1",  # Color for histogram
     main   = "Histogram of Annual Canadian Lynx Trappings, 1821-1934",
     xlab   = "Number of Lynx Trapped")
```
![](https://i.imgur.com/0rAgn7O.png)
### 正規分布を加える
次に, 正規分布を加える. 
dnorm( x, mean=m, sd=n )で平均ｍ、標準偏差ｎの正規分布確率密度を返す. 
curve( dnorm(x), from=始点, to=終点 )で, from～toの範囲の標準正規分布を描画
add = TRUEで, 前のグラフに上から重ね書きする.

```r
curve(dnorm(x, mean = mean(lynx), sd = sd(lynx)),
      col = "thistle4",  # Color of curve
      lwd = 2,           # Line width of 2 pixels
      add = TRUE)        # Superimpose on previous graph
```
![](https://i.imgur.com/qhNrSqB.png)

### カーネル密度推定を加える
また, カーネル密度推定を加える.
カーネル密度推定は, データの値の分布を連続した曲線で表す密度プロット.
ヒストグラムを滑らかにしたものとも考えられる.
ヒストグラムの縦軸を, 度数ではなく密度にする必要がある.

```r
# Add kernel density estimators
lines(density(lynx), col = "blue", lwd = 2)
```
![](https://i.imgur.com/sXqWCj7.png)

### ラグプロット
ラグプロットは, 量的変数を縦軸に表したものである.
データの密度を知ることができる.
ヒストグラムを一次元にしたものとも捉えられる.

```r
# Add a rug plot
rug(lynx, lwd = 2, col = "gray")
```
![](https://i.imgur.com/To3Ytuz.png)
プログラミングができるようになりたい！

はじめまして。賢治と申します。
私は今まで何回かプログラミングに挑戦していましたが、そのたびに挫折していました。
どうにかモチベーションを維持できないかなぁと考え、見つけたのがQiitaでした。
ここにプログラミングの学習記録を行い、今度こそ挫折しないように頑張ります。
あ、ちなみに言語はPythonです。

今日の学習記録
　　　　print,if文


```python:qiita.rb
print("Hello World")
```

```python:qiita.rb
word = input()
if word == "あいうえお":
    print("aiueo")
elif word == "かきくけこ":
    print("kakkikukeko")
else:
    print("sasisuseso")
```


今回は以上になります。
ご指摘があればよろしくお願いします。
pyreboxの作法 その3

#概要

pyreboxの作法、調べて見た。
guest_agentを使って見た。

#ツールのインストール


```
apt-get install gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-i686-dev mingw-w64-tools gcc-mingw-w64-x86-64 mingw-w64-x86-64-dev g++-mingw-w64-x86-64
```

#コンパイル

```
cd /pyrebox/guest/win
make
```

#pyrebox.confの設定


```
[MODULES]
plugins.guest_agent: True

[VOL]
profile: WinXPSP3x86

[AGENT]
name: win_agent_32.exe
conf: win_agent_32.exe.conf

[SYMBOL_CACHE]
path: symbols.WinXPSP3x86


```

#quemの中へ持ってく。

win_agent_32.exeをzipにする。
serverにuploadする。
ie8でdownload.
zip解凍。

#プラグインを書く。

検体を抽入して、実行する。

```
from __future__ import print_function
from ipython_shell import start_shell
from api import CallbackManager

cm = None
pyrebox_print = None

def clean():
	global cm
	print("[*]	Cleaning module")
	cm.clean()
	print("[*]	Cleaned module")

def initialize_callbacks(module_hdl, printer):
	global cm
	global pyrebox_print
	pyrebox_print = printer
	pyrebox_print("[*]	Initializing callbacks")
	cm = CallbackManager(module_hdl, new_style = True)
	pyrebox_print("[*]	Initialized callbacks")
	from plugins.guest_agent import guest_agent
	pyrebox_print("Copying host file to guest, using agent...")
	guest_agent.copy_file("/home/user/ctf.exe", "C:\\temp.exe")
	guest_agent.execute_file("C:\\temp.exe")
	guest_agent.stop_agent()

if __name__ == "__main__":
	print("[*] Loading python module %s" % (__file__))



```

#実行

dos窓でwin_agent_32.exeを起動。
qemuコンソールから、import_moduleする。

#結果

ファイルコピーは、できた。
実行は、出来なかった。--継続調査。

以上。
Docker コンテナ内のrailsコマンドが呼び出せなくなったのでメモ

# 概要
docker環境で、
railsチュートリアルを進めていたら、
急に下記のようにrailsコマンドが呼び出せなくなったので、
対処方法をメモ

```
bash: rails: command not found
```
# 環境
こちらの記事を参考にrailsのdocker環境を構築
https://qiita.com/reflet/items/f73cac406760ee4ecc13

# 解決策
railsのDockerファイルに下記のようにパス通しを記載しrailsコマンドを呼び出せるようにした。

``` 
ENV PATH $PATH:/usr/local/src/bin
```

### そもそもコマンドって？
我々が普段使っている`cd`や`ls`などは、魔法でもなんでもなく、全てプログラム
このプログラムを呼び出すための略称がコマンドという認識で良いと思います。

自分は、元々windowsユーザなのですが、Windowsユーザだと
exeファイルがイメージし易いかと思います。
C言語とかで、コマンドプロンプトに`HelloWorld`と表示する`hellow.exe`ファイルを作成して、
`hellow.exe`をダブルクリックするとコマンドプロンプトが開き`HelloWorld`と表示されます。
`ls`コマンドだったら`ls.exe`をダブルクリックしたら、ファイルのリストがコマンドプロンプト上に表示されるそんなイメージで自分はいます。
間違ってたらすみません。。。。

### パスって？
コマンドが、プログラムということがわかりましたが、
パソコンは、そのプログラムが何処にあるか知りません。
`hellow.exe`がどのファイルに存在するのかパソコンは理解できないわけです。
そこで、`PATH`という環境変数に、コマンドは、このパスの配下にあるプログラムだよ
と教えてあげることで、パソコンが、どのファイルの配下に`hellow.exe`があるか理解できるという仕組みです。
これが俗にいうパスを通すというやつです。

小学生の時に友人から、インストールって本質的には、パスを通すことなんだよって
言われて、その時は、何が何だかって感じでしたが、今となっては、なるほどって感じです。

### 環境変数って？
お使いのMacやWindowsに設定されている、変数です。
パソコンに設定されているもや、ログインしているユーザごとに設定されている変数もあります。

# 後書き
何故急にコマンドが呼び出せなくなったのか不明ですが、
コマンドってなんだっけパスとかなんだっけというLinuxの基礎知識を得るいい機会でした。

何か、間違ってることありましたら、優しくご指摘いただけますと幸いです。
PowerShellでSlack通知してみる

## はじめに

Slack通知の設定メモです。

## 参考サイト

こちらのサイトを参考にしました。手順がそのまま書いてあるのでこちらを見る方が良いかもしれません。

- [Slack での Incoming Webhook の利用](https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8)

>- 1.(まだ作成していない場合には) Slack アプリ を作成します。
>- 2.設定ページから Incoming Webhook を有効化します。
>- 3.設定ページのリフレッシュ後に 「新しい Webhookをワークスペースに追加する」をクリックします。
>- 4.アプリの投稿先となるチャンネルを選択して 「許可する」をクリックします。
>- 5.Incoming Webhook URL を使用して Slack に投稿します。 

---

## 1.(まだ作成していない場合には) Slack アプリ を作成します。

<details><summary>ここをクリックすると詳細を表示</summary><div>

Slackアプリのサイト([https://api.slack.com/apps?new_app=1](https://api.slack.com/apps?new_app=1))を開きます。まだ作成してない場合は`Create New App`でSlackアプリを作成します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/9b9616a7-1f92-3da0-38a5-dceff6ab5c90.png" width="350">

`hoge123`というSlackアプリを作ってみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/5cd9d17e-90e3-90c2-bd72-36f21f9ad8da.png" width="350">

</div>
</details>

## 2.設定ページから Incoming Webhook を有効化します。

<details><summary>ここをクリックすると詳細を表示</summary><div>
作成したSlackアプリをクリックします

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/fe30fa32-336e-274f-ec7d-f534a9940669.png" width="350">

左メニューから`Incomming Webhook`をクリックし、OFF→ONに変更します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/15519e64-e625-85c5-a6e9-9463a1f768bf.png" width="350">
</div>
</details>

## 3.設定ページのリフレッシュ後に 「新しい Webhookをワークスペースに追加する」をクリックします。

<details><summary>ここをクリックすると詳細を表示</summary><div>

`Add New Webhook to Workspace`ボタンをクリックします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/aca31a44-b1d0-904a-c200-4c2704053519.png" width="350">
</div>
</details>

## 4.アプリの投稿先となるチャンネルを選択して 「許可する」をクリックします。

<details><summary>ここをクリックすると詳細を表示</summary><div>

投稿先チャネルを選択し`許可する`ボタンをクリックします

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/e460b9f7-d763-bf20-941d-ae86ee189eb2.png" width="350">
</div>
</details>

## 5.Incoming Webhook URL を使用して Slack に投稿します。

<details><summary>ここをクリックすると詳細を表示</summary><div>
curlコマンドが実行できる場合は、赤枠の`Sample curl request to post to a channel`を実行します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/995f6889-4732-8b80-0fe7-d76b3e896353.png" width="350">

PowerShellを使う場合は、以下のようになります。Uriオプションに指定する情報は上図の緑枠`Webhook URL`にしてください。

```powershell
Invoke-RestMethod `
 -Uri "https://hooks.slack.com/services/xxx/xxx/xxx" `
 -Method Post `
 -Body (ConvertTo-Json @{text="Hello, World!";})
```

powershell実行時の画面はこんな感じです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/9fbea255-1a2c-a17c-5a87-29b4b7bcdc3d.png">
</div>
</details>

## Slack通知確認

Slackに通知が来たら成功です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/fee44b8d-738f-0213-97fd-f660365e0fbf.png" width="350">

## 関連投稿

- PowerShellでSlack通知してみる ←今ココ
- [LambdaでSlack通知してみる](https://qiita.com/zgw426/items/b47922362366de897920)
nuxt後からテスト入れる

npm

```
$ npm install --save-dev vue-jest
$ npm install --save-dev babel-jest
$ npm install --save-dev babel-core@bridge
$ npm install --save-dev @vue/test-utils lodash.clonedeep
$ npm install --save-dev axios-mock-adapter
```

# package.json 変更
```
  "scripts": {
	....
    // dotenvを使用する
    "test": "jest --config jest.config.js --setupFiles dotenv/config --coverage"
  },
  ...
  // 追加
　"jest": {
    // dotenv使用
    "setupFiles": [
      "dotenv/config"
    ],
    "moduleNameMapper": {
      "^vue$": "vue/dist/vue.common.js"
    },
    "moduleFileExtensions": [
      "js",
      "vue"
    ],
    "transform": {
      "^.+\\.js$": "<rootDir>/node_modules/babel-jest",
      ".*\\.(vue)$": "<rootDir>/node_modules/jest-vue-preprocessor"
    }
  }
```
# .babelrc ファイル追加
## regeneratorRuntime is not defined 対応でbabelのターゲット指定

```
{
  "presets": ["@babel/preset-env"]
}

{
  "presets": [
    [
      "@babel/preset-env", {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}


```

# jest.config.js ファイル追加  

```
module.exports = {
  transform: {
    '^.+\\.js$': 'babel-jest',
    '.*\\.(vue)$': 'vue-jest'
  },
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/$1',
    '^@@/(.*)$': '<rootDir>/$1',
    '^~/(.*)$': '<rootDir>/$1',
    '^~~/(.*)$': '<rootDir>/$1'
  },
  moduleFileExtensions: ['js', 'json', 'vue']
}

```
【Salesforce】コーディング規約！

#良いコードとは？

```
いい名前をつける。
適切なコメントを書く。
意味のある単位に分割する。
キレイに整形する。
こうした基本的なことを着実にやればいい。
```
　**[- リーダブルコード -](https://www.amazon.co.jp/dp/4873115655/ref=cm_sw_r_tw_dp_U_x_vPIrEb0XPFPSV)**

```
保守性が高い
すばやく効率的に動作する
正確に動作する
無駄な部分がない
```
　**[- 良いコードを書く技術 -](https://www.amazon.co.jp/dp/4774145963/ref=cm_sw_r_tw_dp_U_x_C0IrEbPKM2E2P)**

# 事前準備

## 開発環境

・VisualStudioCodeで統一する
・Prettierなどのコードフォーマットを開発者に共有する
・インデントをスペース4で統一する

## Salesforce環境

・単語や文言をConstantクラス、カスタム設定、カスタム表示ラベルで管理するのか統一する
・ネーミング規約を作成する（キャメル、スネークなど）

# Apex
## [アクセス修飾子](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_access_modifiers.htm)
### 3つの叫び
- 書かないのはNG！明示的に書いて！
- 何でもかんでもpublicはNG！ちゃんとprivateも使い分けて！
- protectedは使ってるところ見たことない！なんで！？

#### private
定義されたApexクラスで使用するメソッドや変数はprivate

#### public
Pageに紐づけるControllerとか別のControllerから呼ばれるメソッドや変数はpublic

#### global
アプリケーション外 (SOAP API 内、または別の Apex コード) から呼ばれるメソッドや変数はglobal

## [メソッド](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_defining_methods.htm)
### コンストラクタ
#### 3つの叫び
- コンストラクタに700行とかまじでやめて！
- 長くなりそうならメソッド追加しよ！
- てかコンストラクタ内はシンプルにしといて！保守しづらい！

```
// 見やすいコンストラクタ
public HogeController(){
    // 取引先レコードの取得
    getAccount();
    // 取引先責任者レコードの取得
    getContact();
    // 取引先の更新
    updateAccount();
    // 取引先責任者の更新
    insertContact();
}

// 見づらいコンストラクタ
public HogeController(){
    // 上記の処理が全部コンストラクタに記載している('Д')
}
```

## [変数](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_variables.htm)
### インスタンス変数
#### 3つの叫び
- 適当なところに追加しないで！まとめとかないと運用・保守しずらい！
- ローカルでいいものはローカルで書いて！なんでインスタンス変数で書いたの！？
- 使わなくなったら削除して！気持ちはわかる！ここ忘れやすいよね！

```
//// 画面表示用取引先属性 // こうやってグルーピングしておくとインスタンス変数がバラバラにならなくていいかも！
// 取引先ID
public Id displayAccId {get; private set;} // 表示だけなのにprivate setにしてないの多くない？
// 取引先名
public String displayName {get; private set;} // 画面に表示する項目が取引先だけだったら「Acc」はいらないかな
// 取引先有無フラグ(true: 有 false: 無) // この説明いる？
public Boolean accFlag; // existsAccとかのほうが良くない？「Accountが存在しているか？」だからtrueだったら「存在している」じゃない？
```

~~これ自体が見づらい~~

## [SOQL](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_SOQL.htm)
### 3つの叫び
- SELECT句などはすべて大文字！見ずらい！
- インデント多様！項目が多い場合は共通クラスで用意して！
- WHERE句ごちゃっとすると見づらいので考えて！

```
List<Account> accList = [ // こうやっておくとリスト変数名変えた時に他のインデントも調整しなくていい、あとVSCodeで閉じれる
    // 複数行は下げる、1行はそのまま
    SELECT
        Id
        ,Name // 項目追加しやすい、先頭に,を置くことで,忘れ防止
    FROM Account
    WHERE
        Name = '小林' // 条件が追加しやすい
        AND ・・・
        OR ・・・など
    ORDER BY AccountNumber DESC
    LIMIT 100
];

// やだ！
List<Account> accList = [select DandbCompanyId, DunsNumber, Jigsaw, Fax, NaicsDesc, NaicsCode, Website, IsCustomerPortal, ChannelProgramLevelName, ChannelProgramName, IsPartner, Ownership, ShippingAddress, BillingAddress, CreatedById, OwnerId, Site, AccountSource, Name, AccountNumber from Account where Name = '小林' order by AccountNumber limit 100];
```



# Visualforce

# Lightning
SSLによる暗号化通信（HTTPS通信）とその仕組み

# はじめに
[自社のホームページ](https://leadx.co.jp/)立ち上げに当たって、HTTPとかHTTPS周りを復習したので簡単にまとめました

対象読者は、「HTTPSは安全でHTTPは危ないって聞いたことあるけど、仕組みとかはよくわからないな」くらいの人だと思ってください

# HTTPとHTTPSの違いについて
![HTTP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221272/3990ef9e-b596-0f8d-f1de-2456a4f9939f.png)
![HTTPS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221272/9a6dcfc0-d2ec-e855-af12-2e516d1f5b1c.png)



HTTP（Hyper Text Transfer Protocol）はウェブサイトなどを見るときに、自分のPCと、そのウェブサイトの情報を教えてくれてるPCとを通信するためのお約束ごととか通信方法のこと

でもHTTPだとその通信が暗号化されていないので、通信データの盗聴とか改竄の被害を受けやすい

通信を暗号化して、外部の人は見えないようにしながら、自分のPCと通信相手のPCだけが見れるようになったら嬉しいよねってことでできたのがHTTPS（Hyper Text Transfer Protocol Secure）

# HTTPSの暗号化方式
HTTPSの暗号化にはSSL（Secure Sockets Layer）による暗号化を用いていて、`共通鍵暗号方式`と`公開鍵暗号方式`を使っている

## 共通鍵暗号方式
![共通鍵暗号方式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221272/4a47bd69-b359-8e4e-87a2-721561d7ecf4.png)
共通鍵暗号方式は`共通鍵`と言う名の通り暗号化と復号に同じ暗号鍵を使う
自分と相手だけが使う`共通鍵`を作って、お互いに暗号化と復号をしながら通信をしている

メリットは
- 暗号化と復号の処理が早いこと

デメリットは
- 共通鍵を渡す時に盗み取られてしまうと、誰でも復号できるようになってしまうこと

## 公開鍵暗号方式
![公開鍵暗号方式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221272/3551073f-b8b4-81a1-45bb-06263bd93ad5.png)
公開鍵暗号方式は、ちょっと難しいですよ！

まずは、`受信する側`が`秘密鍵`と`公開鍵`を作り、`受信する側`は`秘密鍵`を持っておき、`送信してくれる相手`に`公開鍵`をあげる
ここで面白いのが！！`秘密鍵`で暗号化したものは`公開鍵`でしか復号できなくて、`公開鍵`で暗号化したものは`秘密鍵`でしか復号できない！！
（暗号方法には色々あって、その一つに`RSA`と言う暗号方式があって、その数学的根拠がすごく面白いから興味のある方は是非調べてみてください！！）

共通鍵暗号方式で問題だった「鍵を渡す時にバレちゃう問題」がこっちで発生したとする
つまり、`公開鍵`を送信者に渡す時に第三者に`公開鍵`がバレたとしよう
送信者が`公開鍵`を使って暗号化して送信し、第三者がそれを復号しようとしても、第三者が持ってる`公開鍵`だと復号できない！！
受信者は`秘密鍵`を持ってるから復号できる！！
これをお互いの公開鍵と秘密鍵を使って通信をすれば安全に通信できる！！

最強だねって思うけど、デメリットがあって
- 暗号化・復号の処理に時間がかかってしまうこと

だから、共通鍵と公開鍵のどっちのメリットも活かして通信しようってことで生み出されたのが`SSL通信`


## SSLによる暗号方式
![SSL暗号方式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221272/11ec8e2d-2e2e-9c56-9b26-84678781937a.png)
### ①公開鍵を渡す
ウェブサイトなどを見ようとアクセスすると、ウェブサイトの情報を教えてくれるPCが正しいPCですよって言う証明書を送ってきてくれる
この証明書にはそのPCの公開鍵も含まれている

### ②共通鍵の作成
送られてきた証明書が正しいかをブラウザが調べてくれて、正しかったら共通鍵を作る

### ③共通鍵を渡す
作った共通鍵を相手に渡したいんだけど、途中で第三者に見られたり変更されたら困るので、もらった公開鍵を使って共通鍵の情報を暗号化して相手に渡す

### ④交通鍵を受け取る
公開鍵で暗号化された共通鍵の情報を、秘密鍵を使って復号する
これでお互い共通鍵を安全に共有することができた

### ⑤共通鍵暗号方式
お互いに安全に共通鍵を共有することができたので、それ以降は暗号化と復号の処理が早い共通鍵暗号方式で通信を行う

こうすることで、安全に暗号化通信を行うことができる仕組みとなっている
面白い！！

# 最後に
じゃあ実際はHTTPSだと100％安全かと言うと**そうじゃない場合もある**から、気をつけましょう
（詳しくは`HTTPS 危険性`などでググってみてください）
Information Security Foundation 受験記

EXINが実施している [Information Security Foundation based on ISO IEC 27001](https://embed.exin.totalservices.io/certifications/information-security-foundation-based-iso-iec-27001-exam?language=ja)
を受験したので、その記録です。

#試験について
試験時間：60分
問題数：40問 (選択式)
合格ライン：65%以上 (26問以上)
受験料：¥26,264 (EXIN Anywhere) or ¥27,540 (プロメトリック)
受験形式：[EXIN Anywhere](https://embed.exin.totalservices.io/certifications/information-security-foundation-based-iso-iec-27001-exam?language=ja) (在宅オンラインビデオ録画) 又は [プロメトリック](http://it.prometric-jp.com/news/news_detail.asp?news_no=1776)各試験会場
※オンライン受験の場合、試験内容以外は全て英語。申し込みから約1ヶ月後くらいまでの自分の好きなタイミングで24時間いつでも受験できる。結果はその場でわかり、後日ビデオ録画の判定を含めた正式な結果が届く。


#筆者の経歴
IT実務経験：無し

日常的にPCを弄る、大体のことはググれば対処できるくらいには扱えるレベル。用語も聞いたことはあるもの、なんとなく意味はわかるものが多いが具体的な定義などはわからない。

#勉強方法
① [EXIN公式準備ガイド](https://embed.exin.totalservices.io/certifications/information-security-foundation-based-iso-iec-27001-exam?language=ja)の用語を一通り確認して定義などを書き出す。

② [EXIN公式サンプル問題](https://embed.exin.totalservices.io/certifications/information-security-foundation-based-iso-iec-27001-exam?language=ja)を解く。間違った問題は解説を確認し、満点が取れるようになるまで複数回解く。

③ [JPNSHIKEN ISFS模擬試験PDF版Demo](https://mogiexam.jpshiken.com/information-security-foundation-based-on-iso-iec-27001-torrent-4214.html)でも同じことをして満点が取れるまで繰り返す。

#勉強時間
10時間程度。勉強時間が確保できれば数日で受かる。

#結果
30/40点 (75%) 合格

#感想
本番の試験では同じような問題が多く出たので模擬試験を完璧にしておけば合格は難しくないが、微妙に迷うものがあったりするので舐めてかかるのはよくない。アメリカの法律など公式の準備ガイドやサンプル問題に出てこない問題も数問あるが正直それは対策のしようがないので他の取れる問題を落とさないようにする。

試験時間は60分あるが15分程度で解き終わる。

用語も実務のレベルで考えればスムーズに理解できそうなのにやたら一般化されていて難しくなっている気がした。定義をよくブレイクダウンして考えて理解できるようにしておくと良い。
Nuxt.jsでNetlifyにデプロイする時にパスのリライト設定をする

自作のポートフォリオをHerokuからNetlifyに移行させようとNuxtjsの[公式サイト](https://ja.nuxtjs.org/faq/netlify-deployment/)に沿って
設定を進めていきました。

## デプロイ前の設定（Nuxt.jsの場合）
- ブランチをGithubのリポジトリにpushする。デプロイ対象対象ブランチは`master`
- ビルドコマンドは `npm run build`
- 公開ディレクトリはdistに設定。

加えて

```javascript{codeTitle: "Nuxt.config.js"}
export default {
  generate: {
    fallback: true
  }
}
```

## いざデプロイ！！


上記設定をして、デプロイしたのですが、
デプロイ後、Top画面が何故か404に....

エラーを見てみると、apiのURIのホスト名が自分のサイト名になっていて正常なレスポンスが
返ってなかったみたいだ。

でもNuxt.config.jsには

```javascript{codeTitle: "Nuxt.config.js"}
proxy: {
    "/api/": {
      target: "https://hogehoge.com/v2/",
      pathRewrite: { "^/api/": "" }
    }
}
```
のように設定していたので、このあたりは設定必要ないと思っていたのですが、Netlifyのページ
にURLのリライト設定の仕方が書いてあったので、早速試す！

## リライト設定をする

アプリのルートパスに`netlify.toml`ファイルを作成。

作成したファイルの中身に

```{codeTitle: "netlify.toml"}
[[redirects]]
  from = "/api/*"
  to = "https://hogehoge.com/v2/:splat"
  status = 200
  force = true
  headers = {X-From = "Netlify"}
```

と記述するだけでOK！
fromの`*`とtoの`:splat`が対応する形になります。

## 再度デプロイ！

上記設定できたら、

```
git add .
git commit -m "create netlify config"
git push origin master
```

でリモートリポジトリに反映。

NetlifyではGithubと連動しており、リポジトリが更新されると自動的に
ビルドされるので、デプロイが完了するのを待つだけ。

無事うまく表示されて正常に表示されました。

めでたしめでたし

## 関連記事
- [Nuxt.js - Netlify へデプロイするには？](https://ja.nuxtjs.org/faq/netlify-deployment/)
- [Netlify -Redirects and rewrites](https://docs.netlify.com/routing/redirects/)
GitLab CIでPythonの関数化されていないプログラムをテストする

# 概要

Python初級者レベル教育で、自動テストについても同時に教育したいというオーダーがあったため、
関数について学ぶ前のプログラムを対象に自動テストができるか調査した。

※企業案件のため、以下のプログラムの内容やファイル名等は実際のものとは異なる。

# 要件
* Pythonによるプログラミング教育がメイン
* テストの重要性を理解して貰いたい
* Gitも使えるようにしたい
* 教育の前半の課題は、関数化していない
* 標準入力を受けとって処理する課題がある

まだGitサーバに何を使うか確定していないため、とりあえず最近使い初めたGitLabで自動テストの手順を確認。

## テスト対象のプログラム

``` chapter_01_1.py
height = input('高さ(m) ')
width = input('底辺(m) ')
area = float(height) * float(width) / 2
print('面積は'+str(area)+'平方メートル')
```

## テスト仕様ファイル

標準入力を受けとるプログラムのため、シェルのリダイレクトを使ってテスト用入力ファイルの内容を流しこむようにした。

``` tests/test_chapter01.py
def test_chapter01_1(bash):
    assert bash.run_script_inline(['python3 chapter_01_1.py < tests/stdin_chapter_01_1.txt']) == '高さ(m) 底辺(m) 面積は1.2平方メートル'
```

## テスト用入力ファイル

入力値の後には改行が必須。

``` tests/stdin_chapter_01_1.txt
1.2
2.0
```

## ローカルでのテスト実行

テストスクリプト内ではbashと書いているが、当然zshでも動作する。

```
% pytest
============================================================ test session starts ============================================================
platform darwin -- Python 3.7.3, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /Users/takaiayumu/python-basic
plugins: openfiles-0.3.2, arraydiff-0.3, shell-0.2.3, doctestplus-0.3.0, remotedata-0.3.1, cov-2.8.1
collected 1 items

tests/test_chapter01.py ..                                                                                                             [100%]

========================================================= 1 passed in 1.45 seconds ==========================================================
```

## GitLab CI用の設定

Python3のイメージを使うが、ベースになっているAlpine Linuxでは初期状態でbashがインストールされていないためpytest-shellが動作しない。
そのため、apkコマンドでbashをインストールする必要がある。

``` .gitlab-ci.yml
image: python:3-alpine

before_script:
    - apk update
    - apk add bash
    - pip install pytest pytest-cov pytest-shell

test:
    script:
        - pytest --cov=./tests
```
Go(golang)/ginのAPIでnullableなjsonを返す


#状況
- 当たり前の機能だと思うかもしれないが少しハマった。
- [golangの仕様で変数にnullを代入できない。例えば`int`型であれば初期化した時点で0の値が初期値として設定される。](https://qiita.com/tenntenn/items/c55095585af64ca28ab5)

```
var n int
println(n)

// 実行結果
0
```
- これでどういう問題が発生するかというと構造体でも初期化した時点で勝手に0が入ってしまいnull値を表現できない。
    - すると`gin`の`context`を使ってjson化した際にも、もちろんnull値が入らない。
        - <font color="Red">***jsonでnullが返せない!***</font>

```
package main

import (
	"time"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {

		type NotNullJSON struct {
			NotNullIntInit     int `json:"not_null_id_init"`
			NotNullIntNotInit  int `json:"not_null_id_not_init"`
		}

		notNullJSON := new(NotNullJSON)
		notNullJSON.NotNullIntInit = 1

		c.JSON(200, nullableJSON)
	})
	r.Run()
}

// 実行結果(何も代入していないnot_null_id_not_initにも0が入っている)

{"not_null_id_init":1,"not_null_id_not_init":0}

```

#対処
- ポインタを指定すればいい
  - ポインタは代入しなければnullが入っている

```
package main

import (
	"time"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {

		type NullableJSON struct {
			NullableIntInit    *int `json:"nullable_id_init"`
			NullableIntNotInit *int `json:"nullable_id_not_init"`
			NotNullIntInit     int  `json:"not_null_id_init"`
			NotNullIntNotInit  int  `json:"not_null_id_not_init"`
		}

		nullableJSON := new(NullableJSON)
		nullableJSON.NotNullIntInit = 1

		tmpInt := 1
		// 代入方法に注意!
		nullableJson.NullableIDInit = &tmpInt
		c.JSON(200, nullableJSON)
	})
	r.Run()
}

// 実行結果(何も代入していないnullable_id_not_initにnullが入っている)

{"nullable_id_init":1,"nullable_id_not_init":null,"not_null_id_init":1,"not_null_id_not_init":0}

```

##おまけ・その他

- [実際は関数で計算した値などから代入することが多いと思うのでサンプルコードを置いておいた](https://github.com/whisky-shusuky/nullable_json)
- int以外の型でも同じ手法で対処できる。
- 使用していたのがginだったのでgin前提で書いたがechoなど多分他のフレームワークでも同じ考え方で対処できると思う。