OmniAICreator/Qiita-1.07M huggingface dataset:
podman on GCE の雑tips

GCEならDocker on Container Optimized OSでいいじゃんって意見は黙殺します。
なお、GCEとは書いてますがcentos7であれば恐らくどこでやっても一緒です。

## やること
GCE上でpodmanコンテナをビルドして動かして喜ぶ

## 環境
Centos7(kernel3系)
podman 1.6.4

やんごとなき事情によりGKE(k8s)は利用しません。
記載のversionは、「このversionから」ではなく、「少なくとも自分が確認したときのversion」です。

## v1.3.2
`yum install -y podman`
だけでDockerfileからbuild,runがうまくいってたはず…

## v1.4.4
podmanの他に`slirp4netns`もインストールする必要があるようです。
また、
https://www.redhat.com/ja/blog/preview-running-containers-without-root-rhel-76
にあるように
`echo 10000 > /proc/sys/user/max_user_namespaces`
の実行も必要です。
当然ながら`/proc`下なので再起動とかすると吹っ飛びます。

## v1.6.4
v1.4.4の対処だけだと動かず。
centos7のkernelである3系だと`fusermount3: mount failed: Operation not permitted` が出るようになってました。
これを踏んだ場合kernelをアップデートする必要があるようです。
`elrepo-kernel`からmlインストールしてと関連パッケージをswapって流れでいけます。
少なくとも`kernel5.6.7-1`ではいけました。

## --log-driver
https://github.com/containers/libpod/blob/master/completions/bash/podman
で`gcplogs`をcompgenで作成してるからいけるんかなーと思って少し戦いましたが、
http://docs.podman.io/en/latest/markdown/podman-run.1.html
少なくとも現行だと対応してないようです。
cloud loggingに転送したい場合`--log-opt`でログのファイルパス指定してそいつをfluentdやらでカッ飛ばす、とかしか今は無理かと思います。
あと、log-driverにjournald指定したらpathに指定したファイルに吐かれなくなりました。

## 認証ヘルパー
設定してみたけど普通に認証エラーでハネられたので多分まだ無理なんじゃないかなあ…

## まとめ
log-driverと認証ヘルパーの対応はよお願いしますれっどはっとさん
RX72N Envision KitのESP32へのATコマンド試行 (1)

今回の経緯
---
RX72N Envision KitにはESP32-WROOM-32DがWifi通信用に搭載されていて、RX72NとはUARTで接続されています。

![2020-04-29 19-04-46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/b3d505ac-2f92-1e9b-6649-c01f2e3e61f6.jpeg)

ESP32のWifi機能をATコマンドで制御するそうなのですが、e2studioでUARTで"AT"コマンドを送っても"OK"が返ってこずに、なぜか受信値も"AT"になってしまいました。

Kitに実装されたESP32に何が書き込まれているかまだ情報がなく、またESP32起動時のシリアルデータをUSB経由で読もうとしてもKitのSW3がIO0と連動するため、

* SW3=OFF → ESP32のTxD0,RxD0は接続先なし、起動時のデバッグ出力の確認不可
* SW3=ON → ESP32はBOOT書き換えモードに入り、起動時のデバッグ出力の確認不可

となります。
おそらく出荷時にATコマンド用のファームウェアが書かれているとは思うのですが、確認手段がないのとそもそもESP32のATコマンド確認やファームの書き換えをしたことがなかったため、手持ちのESP32-DevkitCで確認しました。

今回参考にさせて頂いたのは下記サイトおよびファイルです。
https://trac.switch-science.com/wiki/esp32_setup

https://www.espressif.com/sites/default/files/documentation/esp32_at_instruction_set_and_examples_en.pdf

https://github.com/espressif/esp-at/blob/master/module_config/module_esp32_default/partitions_at.csv

ツールのダウンロード手順は上記サイトの通りで、最新のESP32-WROOM-32_AT_Bin_V2.0とESP32 DOWNLOAD TOOL V3.8.5をCドライブ直下に展開しました。

TOOLの設定はdownload.configに従って行いました。
一点詰まったのは右下のBAUDで、どうもうちのDevkitCでは1152000設定では通信エラーとなってしまいました。921600設定で書き込みが出来ましたので、最速設定ではDevkitCの通信経路的に厳しかったようです。

![ESP32_D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/f8fa5109-9c74-63e5-15da-83726a8e31a3.png)

書き込み後にDevkitCのUSBポートの状態をシリアルモニタで確認すると、

![COM4状態.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/196f2972-0fb0-d5e6-223c-fba869092ab0.png)

となり正常に起動しているようでした。
ATコマンドの確認準備が出来ましたので、さっそくUSB-UART変換経由でATコマンドを投げてみます。接続は下記となります。

|USB-UART|ESP32|
|RXI|TXD(17pin)|
|TXD|RXD(16pin)|
|GND|GND|

![2020-04-29 17-56-50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/795a71f8-33ce-d9af-ebf3-1604638970de.jpeg)

スピードを"115200"に設定し"AT"という文字列を送信すると、無事"OK"という文字列が返ってきました。

![COM5でのモニタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/64309dbc-4bd0-acde-3b09-fce6a668075c.png)

上図の"AATT"はTeraTermでローカルエコーを有効にしていた時の戻り値です。
下の"waiting for download"はKitに繋ぎ変えてSW3のch2をOnした時の応答で、上記のようにシリアルモニタで確認したような起動時の状態確認はできないようです。

ESP32-WROOM-32Dへのファームの書き方とATコマンドの送信までは習得できましたので、Kit上のESP32への書き換えを行うか少し考えてみます。
vim「\<」と「\>」とを利用するとき初心者がはまる落とし穴

普段「\\<」と「\\>」とを利用ワードの完全一致を検索できる
例えば下記の例(内容は気にしないで）で「seat」だけのワードを「table」に置き換えたいとする。

```
seatAvailable = seat.no; 
```

```
:s/\<seat\>/table 
```
無事に置き換えできた。

```
seatAvailable = table.no; 
```

では同様に、seat{j}をseat[i]にも置き換えてみる。

```
max_dis_seat[1] = seat{j}.no
```

```
:s/\<seat{j}\>/seat[i] 
E486: パターンは見つかりませんでした: \<seat{j}\>
```
あれ？波括弧にエスケープ必要ないはず
どこかで間違えているだろう。
けど、「\\>」を利用しないと、置換できた。

```
:s/\<seat{j}/seat[i] 
```

```
max_dis_seat[1] = seat[i].no;
```
ネットで調べると、中括弧自体はワード文字ではないので、今回のように「]」は「\>」が受け付けないようだ。
https://vi.stackexchange.com/questions/20433/inserting-a-square-bracket-as-part-of-search-and-replace

結局括弧といったワード文字ではないキャラクタで始まる検索パターンに対して、「\\<」と「\\>」が使えないようだ。
Pathを整理する　Ubuntu18.04

今までの経緯
Cuda10.0の環境を作成を目指していたが、Root環境がいつまで立っても10.1のまま。いろいろやってPathが疑わしいとのことに。
実行環境を作る過程でPathがぐちゃぐちゃになってしまい、ここで整理しようと。
そもそもよくわかってない初心者ですが、、

```
printenv

PATH=/usr/local/cuda/bin:/usr/local/cuda-10.0/bin:/usr/local/cuda-10.0/bin:/usr/local/cuda-10.0/bin:/home/lcj001/anaconda3/bin:/home/lcj001/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

```
なんだかひどいですね「：」で並べてみると

PATH=/usr/local/cuda/bin:
/usr/local/cuda-10.0/bin:
/usr/local/cuda-10.0/bin:
/usr/local/cuda-10.0/bin:
/home/lcj001/anaconda3/bin:
/home/lcj001/anaconda3/condabin:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:
/usr/games:
/usr/local/games:
/snap/bin
となっています。優先順位の一番上のところに/cudaがきていて、その下/cuda10.0が有効になっていないのが原因と推測。


```
$ export PATH=/usr/local/cuda-10.0/bin:/home/lcj001/anaconda3/bin:/home/lcj001/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ source~/.bashrc
```
再起動すると一番上のcudaは削除された模様（ただ10.0の重複はそのまま）
ただ`nvidia-smi` で確認するもCUDA10.1のまま、、
そこでVimから直接書き直した

```
vi ~/.bashrc
```
それでなんとか書き直すがCUDA10.1のまま。
Tensorflowが使えないエラーはいろいろ原因があるみたいなのでまた別アプローチで試してみる。
python3.6をAnaconda仮想環境で構築するが、Tensorflowのエラーにpy3.7の文字があるのを発見。このあたりが疑わしい。

# デフォルトの環境変数ファイル確認
environmentファイルのありか
`/etc/environment`

```
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
```
デフォルトのPATHに書き直す。
このあともCUDA10.1の表示は変わらない。そこでRootからcuda10.1を検索したのだが何も引っかからない。（cuda10.0はヒットする）もう10.0なんだ。という自己暗示で終わりにする。。
# 次のステップ
ということでCUDAは異常なし。事の発端であるTensorflow読み込みエラーは、Anaconda上のbase環境py3.7(tf未インポート）からpy3.6仮想環境に切り替わらないことが原因と思われる。

2020/4/30現在
結局Base環境にTF2.0導入後、1.13.1にダウングレードすることで仮想環境でもTFが動くようになりました。ちょっと負けた気がしますが、落ち着いたらPy環境の整理をしたいと思います。


# 参考にさせていただいたサイト
vimを使ってPATHを通す
https://wjhmk.hatenablog.com/entry/2018/04/03/215827
Linux入門 ~「パスを通す」とは~
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015
Ubuntuで$ PATHをデフォルト値にリセットするにはどうすればよいですか？
https://qastack.jp/ubuntu/113419/how-can-i-reset-path-to-its-default-value-in-ubuntu
heroku run rails db:migrateでエラーが出た話

Railsチュートリアルの第6章「6.4最後に」の節でエラーが出たので勉強として書き記しておくことにしました。

###やりたいこと
本番環境でUserモデルを使うために、heroku runコマンドを使ってHeroku上にマイグレーションを走らせたい。

###エラー直前にやったこと

```
$ heroku run rails db:migrate
```

###エラー内容

```
bash: heroku: command not found
```

###エラー後にしたこと
```
$ sudo yum -y update
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
$ export NVM_DIR=”/home/ec2-user/.nvm”
$ [ -s “$NVM_DIR/nvm.sh” ] && \. “$NVM_DIR/nvm.sh”
$ nvm install node --reinstall-packages-from=node
$ npm install -g cli-engine-command@8.0.0
$ npm install -g heroku-cli
```

###Special Thanks
[Cloud9でHerokuが使えない時の対処法](https://qiita.com/bdogrep/items/8620dbba5e4c3fd859df)
[AWS Cloud9でherokuコマンドがnot foundになった時の対処法]
(https://qiita.com/yumelog/items/c1ece8b84302138c7834)


無事できました。
VSCodeで拡張子「.html」を認識してくれない

#VSCodeで拡張子「.html」を認識してくれない

vscodeをダウンロードして試しに簡単なhtmlを書こうとしたのに、なぜか「.html」をhtmlファイルとして認識してくれない...。
もしやと思い、拡張子を「.htm」にすると認識してくれました。

htmでも問題はないのですが、拡張子の関連付けは後々困るかと思い調べてみました。

①画像赤枠の「HTML」をクリック
<img width="960" alt="画像1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628999/42f8a2be-7a90-a694-f26d-21abfa7b25d4.png">

②「'HTML'言語ベース設定を構成します」を選択
<img width="960" alt="画像２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628999/5a083d47-f838-7843-d189-64096376115e.png">

③赤枠の行「"*.html":"html"」を追加
<img width="960" alt="画像３.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628999/c7d648ee-63a7-e558-7b47-e2de6710f656.png">

上記手順でとりあえずは.htmlを認識してくれるようになりました。

正しい方法かわかりませんが、とりあえずは認識してくれるようになったのでこのまま学習を続けていきます。
WSLのEmacsでDDSKKが使えるようになるまで

#まえがき

ずっとWSLのEmacsを使いやすくする方法を考えている。Windowsでは`CorvusSKK`を愛用しているので、当然SKKを使いたい。

これまでこんな感じのいい加減な記事を投稿してきた。
[Windows Subsystem for Linuxを設定する](https://qiita.com/ShotaroImai/items/4e6b57c8aadf35493786)
[Windows Subsystem for Linuxを設定する 2](https://qiita.com/ShotaroImai/items/3aa8699ab69d2e40ae80)
[CorvusSKKの設定や辞書をオンラインストレージで共有する](https://qiita.com/ShotaroImai/items/f1d10ab24ac2e7eb1aee)

Emacsは何度かあるブランクも入れると10年以上使っているが、`elisp`は全くわからない。ブランクの間に気付いたらトレンドが変わったりしているので、そのたびに何となくついていくよう勉強するが、`init.el`は基本コピペして少し変えるぐらい。Qiitaをはじめとする色々な解説を読んでも半分ぐらいしか理解できず、いつも悪戦苦闘している。

`leaf.el`という新しいパッケージ管理がでてきたようなので、これを機に2012年ぐらいで止まっていた`init.el`を刷新しようと思った。
[[正式リリース]leaf.elで雑然としたEmacs設定ファイル「init.el」をクリーンにする](https://qiita.com/conao3/items/dc88bdadb0523ef95878)

全体的な記事を書きたいと思いながら、刷新がいつまでも終らない沼に入ったので、小さい問題を解決するたびにQiitaを書いて記録しようと考えた。

# やりたいこと
WindowsではCorvusSKKをつかっているので、その辞書をWSLのEmacsでも流用したい。

環境を書いておく
Windows 10 Home 1909 (64bit)
CorvusSKK 2.7.11
Ubuntu 18.04 on WSL1
Emacs 26.3
DDSKK 17.0.50

CorvusSKKはオンラインストレージ(googleドライブ)で複数の端末で設定や辞書を共有している([上の記事参照](https://qiita.com/ShotaroImai/items/f1d10ab24ac2e7eb1aee))。
Windows上のgoogleドライブはWSLでもシンボリックリンクを貼って共有しているので、CorvusSKKのディレクトリもWSLで見えている。

uim-skkをずっと使っていたけど、WSLではほとんどEmacsしか使わないので、uimである必要がないじゃないかと思いはじめた。
そこで、長年触ってこなかったDDSKKにしようと考えた。
辞書の文字コードはもちろんUTF-8だと思ったので、UTF-8で開いてCorvusSKKの辞書を参照しに行った。

```lisp
(setq skk-jisyo-code 'utf-8)
(setq skk-jisyo "/[CorvusSKK設定ディレクトリ]/userdict.txt")
(setq skk-large-jisyo "/[CorvusSKK設定ディレクトリ]/skkdict.txt")
```

# ハマッたこと
ところが、辞書が開かない。
エラーとしては

```
Header line for okuri-ari entries is missing!
```
となってしまい、辞書が読めず漢字変換ができない。DDSKKがうごいているとEmacsを終了するときに、skk辞書をセーブするが、同じ理由で終了もできなくなる。これは焦ったが、

```lisp
M-x skk-kill-emacs-without-saving-jisyo
```
で辞書セーブを飛ばして終了できた。

SKK辞書は`;; okuri-ari entries.`と`;; okuri-nasi entries.`が必要であることを知ったが、もちろんCorvusSKKはこのルールを守っている。なのにDDSKKではこれが判別できない、ということでハマッた。

# 解決
数日間悩み、やっぱりuimに戻ろうかと`uim.el`を再び入れてみたりもしていた。

タネは実は`CorvusSKK`のほうにあった。[CorvusSKKのgithubページ](https://github.com/nathancorvussolis/corvusskk)を見ていたら
> UTF-16 (LE, BOMあり) のSKKユーザー辞書フォーマットで書き込まれます。

と書いてあった。そう、辞書の文字コードがUTF-8だと思い込んでいたことが間違いだった。
[DDSKKのマニュアル](https://ddskk.readthedocs.io/ja/latest/index.html)を読んでも辞書をUTF-16で開けるとは書いてないしやってみてもダメだったので、UTF-8の辞書を用意することにした。large辞書は[SKK辞書](http://openlab.ring.gr.jp/skk/wiki/wiki.cgi?page=SKK%BC%AD%BD%F1)の`L`や`jinmei`をマージしたものだったので、これはそのままでいいが、問題はユーザー辞書。常に更新されるものなのでスクリプトでも書いて逐次utf-8に変換するようにすることも考えたが面倒だったのでやめて、現時点のユーザー辞書をベースに新たに育てることにした。というわけで、`iconv`で変換する(Emacsで`C-x C-f RET`してもいい)。

```bash
iconv -f UTF-16LE -t UTF-8 skkdict.txt -o SKK-JISYO.utf8
iconv -f UTF-16LE -t UTF-8 userdict.txt -o userdict.utf8
```

これらの辞書を参照するように`init.el`を書き直したら無事に辞書を開けるようになった。無事に`DDSKK`が使えるようになった。
Vagrant + PHP + IntelliJ IDEA でリモートデバッグを設定

# Vagrant側の設定
## サーバーにログイン
```
vagrant ssh
```

## peclコマンドをインストール

(php7の場合、pearのバージョンは1.10.0以降でないと上手く動かない)

```
sudo yum --enablerepo=remi-php70 install php-pear

pear -V
PEAR Version: 1.10.5
PHP Version: 7.0.11
Zend Engine Version: 3.0.0
```

## xdebug インストール

```
pecl install xdebug

You should add "zend_extension=/usr/lib64/php/modules/xdebug.so" to php.ini  
```

## php.iniにパラメータを設定

```
zend_extension=xdebug.so          ← Apacheの場合はフルパス指定「/usr/lib64/php/modules/xdebug.so」  
xdebug.remote_enable = On  
xdebug.remote_connect_back = On  
xdebug.remote_autostart = On  
xdebug.remote_host = 192.168.33.1  ← echo $_SERVER["REMOTE_ADDR"]; の値  
xdebug.remote_port = 9001          ← ローカルPCにて lsof -i :9001 コマンドを使用し、使用されていないポートか確認  
xdebug.idekey="HOGEhoge"           ← IDE側の設定で使用する  
```

## 環境変数PHP_IDE_CONFIGを設定
### Apache

```
SetEnv PHP_IDE_CONFIG serverName=FUGAfuga
```

### nginx

```
fastcgi_param PHP_IDE_CONFIG serverName=FUGAfuga;
```

### cliで実行する場合
vagrantユーザーの~/.bashrc に設定

```
export PHP_IDE_CONFIG="serverName=FUGAfuga"
source .bashrc
```

## サーバー再起動

### nginx

```
sudo service nginx restart
sudo service php-fpm restart
```

### Apache

```
sudo service httpd restart
```

## 設定を確認

```
php -i | grep xdebug
```

# IDE側の設定
## 接続するリモートホストを設定する
1. RUN → Edit Configurations を選択
1. ダイアログ左上にある「+」を押下し、PHP Remote Debugを選択
<img width="1247" alt="Edit_Configurations.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37817/4be67de3-e25c-075e-5ed7-14f7070576e0.png">
<img width="464" alt="php_remote_debug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37817/5db2ffd5-2c71-268a-e613-f21f42b805f5.png">
1. Serversの「...」を押下し、Serversダイアログを表示  
<img width="1222" alt="Servers1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37817/2133e87f-7093-9b21-43ec-ec04c4270274.png">
1. Serversを設定  
   Name : PHP_IDE_CONFIG serverName=で指定した値(FUGAfuga)  
   Host、Port : vagrant ssh-config コマンドで確認  
   Debugger : Xdebug  
   Use Path mappings をチェックし、ローカルとリモートホストでシンクしているディレクトリを設定  
<img width="824" alt="Servers_設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37817/947fd251-3fb5-21b7-0619-0158e300ddd5.png">
Preferences → PHP → Debug よりXdebugのポートを設定  
<img width="1029" alt="Preference.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37817/4265d082-f344-e0bd-c441-b1e9356e8d1a.png">
Ide keyを設定(HOGEhoge)  
Name を設定 (わかりやすいサービス名、Vagrant)
<img width="1071" alt="Servers2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37817/39adb93d-f6e7-d599-02ba-3ecda02c716f.png">
1. RUN → Break at first line in PHP scripts にチェック  
   (デバッグが動作するとき、必ず最初の1行目でブレークポイントが走る)  
<br>
1. RUN → Start Listening for PHP Debug Connections をチェック  
<br>
ブレークポイントをはり、処理の途中でデバッグができるようになりました。
【Unity】batchmodeで強制的にビルドを走らせる方法

# なぜ強制的にビルドを走らせたいか
- Jenkinsのパラメータビルドでシンボル定義が違うバイナリを作りたい
- 以前はジョブを分けていたが、ストレージの容量を節約したくなった

# 試してみてダメだったこと（ビルドが走ったり走らなかったり）
- ProjectSettings.assetのscriptingDefineSymbolsを書き換えて保存 
 - （mcs.rspの書き換えは試さず）
- Assets以下の全ての.csファイルをtouch
- Library/ProjectSettings.asset を削除

# たどり着いた答え(?)⇒ダメだった
- ImportAssetでcsを一つ指定すると良さそう

```Build.cs
public static ForceRebuild()
{
  var relPath = "Assets/hoge.cs";
  AssetDatabase.ImportAsset(relPath);
}
```

- （追記）結局これも安定しなかった

# 結論
- Library/ScriptAssemblies/ の全てのファイルを削除
 - 公式のForumで誰かが使っていたので試してみた
 - １ヶ月以上安定稼働しているので、これが正解の模様
遠くにいる友達にPrusaフェイスシールドを印刷してもらうための手引書その２

###0. はじめに
友人が3Dプリンタを購入しました。フェイスシールドを一緒に印刷することになったので、その方法を記述します。仲間が増えたらここを見てもらって一緒に印刷できるように、手引書として公開しておきます。

その１　[遠くにいる友達にPrusaフェイスシールドを印刷してもらうための手引書](https://qiita.com/maco-san/items/ac46a24f6d006b73e5ee)
その２　遠くにいる友達にPrusaフェイスシールドを印刷してもらうための手引書その２（この記事）

その２では、顎の部品の印刷とちょっと便利に印刷できるコツなどを紹介したいと思います。

###1. 顎の部品の印刷

次は、顎の部分の部品を印刷します。
<img width="655" alt="Screen Shot 2020-04-29 at 5.55.07 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231182/4ef9b49e-fe9f-d7cd-00b9-08006e052624.png">

部品は少し小さくて細いですのでうまく第一層目がつみかさらないと失敗します。シートをガラス拭き用洗剤かアルコールワイプを使ってきれいにしておくことをお勧めします。

https://www.prusaprinters.org/prints/25857/files

<img width="723" alt="Screen Shot 2020-04-29 at 6.04.16 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231182/da2e1b16-8d75-47af-c0a9-f9144980f859.png">


上のページからbottom_reinforcement.stlのオレンジ色の部分をクリックするか、[ここ](https://media.prusaprinters.org/media/prints/25857/stls/260466_f1e0f39c-88fe-4b35-a909-0348aa53e412/bottom_reinforcement.stl#_ga=2.159280767.474428113.1588108302-1615580900.1588108302)からダウンロードします。

bottom_reinforcement.stl

というファイルがダウンロードされました。

###2. Prusa Slicerにモデルファイルを読み込み
先ほどダウンロードしたモデルファイルを読み込みます。ダウンロードフォルダに入っていると思います。

<img width="737" alt="Screen Shot 2020-04-29 at 6.11.16 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231182/6d6de794-c854-fc63-cb79-2a6a1c2a55a8.png">

「File」–「Import...」（Open Projectではないので注意。ファイル形式が違います。） 

<img width="801" alt="Screen Shot 2020-04-29 at 6.12.14 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231182/a0b0fcec-118e-1ef3-f91d-a4395327052c.png">


成功すると以下のようなモデルが現れます。

<img width="1434" alt="Screen Shot 2020-04-29 at 6.16.06 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231182/d7cf430d-e185-88a6-bd70-f317264de255.png">





スライスする前に、フィラメントが写真のように「Prusa PETG」となっていることを確認してください。右下の「Slice Now」を押してモデルをスライスしてください。
あとは、その１　[遠くにいる友達にPrusaフェイスシールドを印刷してもらうための手引書](https://qiita.com/maco-san/items/ac46a24f6d006b73e5ee)同様に、スライスが終了すると「Export G-code」と表示されます。このボタンを押して、SDカードにコピーをします。

###3. たくさん印刷したい

上で作ったモデルはおそらく30分以内で印刷が完了すると思います。ずっとプリンタに付きっきりにはできないので、ある程度長い時間で量産したいこともあると思います。スライスする前に、モデルをコピーアンドペースト（Macならキーボードでショートカット、command＋C、command＋v）をすることでオブジェクトを複製することができます。これを作りたい数だけ繰り返し、台からはみでたり、重ならないように調整することでモデルを作り、印刷することができます。

<img width="761" alt="Screen Shot 2020-04-29 at 6.28.36 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231182/e895b1e2-1155-6dc2-58b9-2aaa711758a3.png">

###4. もっとももっと印刷したい

もっと印刷したいという欲求は全世界で共通で、頭部分の部品を４つスタックしたモデルも出ています。

ファフォーマンスも早く印刷できるように設定されています。が、私の環境ではいまいち安定しませんでした。チャレンジしてみてもいいと思います！モデルは[こちら](https://www.prusaprinters.org/prints/27267-prusa-face-shield-stack-ver#_ga=2.205990742.474428113.1588108302-1615580900.1588108302)から。ひとつあたり１時間20分で印刷できるそう。

<img width="1327" alt="Screen Shot 2020-04-29 at 6.37.48 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231182/b862ee23-e3ef-afbf-16af-5928b95bd1aa.png">
Pythonでスクレイピングしたデータを既存のExcelシートに追加したい。

Python3でスクレイピングした結果をリスト化し、Pandas.DataFrameを利用して新規のExcelシートに保存することはできるのですが（添付イメージを参照してください。）、既存のExcelのシートに新しい結果を空白行に追加していく方法はございますでしょうか？
既存シートの列見出しは添付イメージのColumnの通りです。![イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611808/0acdbf8c-b3a8-5be5-5e10-d4c23e3045fa.png)
[vuex] do not mutate vuex store state outside mutation handlers. 対策

# やりたいこと
- 原因
- 対策

いってみよう！

## 原因
テキストボックスにvuexの内容を入れたら起きるようです。

```
<template>
  <v-text-field
    v-model='user["id"]'
  ></v-text-field>
</template>

<script>
    export default {
        data: () => ({
            user: {}
        }),
        mounted() {
            this.user = this.$store.getters['user']
        }
    }
</script>
```
この状態で、テキストボックスの内容を変更すると、
 [vuex] do not mutate vuex store state outside mutation handlers.
になります。

## 対策
```
this.user = {
              id: this.$store.getters['user']["id"],
              name: this.$store.getters['user']["name"],
            }
```
ちゃんとキーまで入れると上記のエラーが解消されます。
直接 this.$store.getters['user'] を入れるのがダメで、考えてみればオブジェクトをそのまま入れてるのでvuexの内容を書きかえてしまっていますね。
VS Code + matplotlib で日本語のグラフを表示する

前回「[VS Code で Jupyter を動かしてみる](https://qiita.com/azumabashi/items/9a8a034501982cb09132)」をやってみましたがグラフ表示の matplotlib での日本語表示がうまくいきませんでした。
いろいろ調べて出来るようになったので記録しておきます。
方法は１つだけではなさそうですが、これでいくことにしました。

###1. 環境
OS：Windows 10
VS Code：1.43.2
拡張機能：Anaconda Extension Pack 1.0.1
Pythonインタープリター：3.7.3 64-bit

###2. ビフォー

```
import matplotlib.pyplot as plt

flg, ax = plt.subplots()

x = [1, 2, 3, 4, 5]
y = [3, 6, 4, 8, 5]
labels = ['バナナ', 'パイナップル', 'みかん', 'いちご', 'メロン']
ax.bar(x, y, tick_label=labels, label='好きなフルーツ')
ax.legend()

plt.show()
```

上のソースを実行したところ、日本語表示したいところが長四角の豆腐になってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/8caf93d5-2878-a54a-982e-e0e730400bdb.png)


Jupyter notebook で試してみても状況は同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/760f4db9-1651-8d68-1420-78dba30988a0.png)

###3. 対応
####3-1.フォントファイルの取得
OSにあらかじめインストールされているフォントを使用してもいいのですが、Linuxなどの環境でも同じフォントを使用したいのでIPAexゴシックを使用することにしました。
https://ipafont.ipa.go.jp/ からダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/bc636842-b010-a19c-6fd0-067077bc07bc.png)

これを解凍してフォントファイル（拡張子 tff）を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/eb313c6b-7c5f-811f-15b0-578ffde87af4.png)

ipaexg.tff は IPAexゴシック
ipaexm.tff は IPAex明朝
です。

####3-2.フォントファイルの配置
matplotlibの設定ファイルを探します。

```
import matplotlib as mpl
print(mpl.matplotlib_fname())
```

私の環境の場合はここにありました。

```
C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\mpl-data\matplotlibrc
```

上記からの相対パスとしての
../fonts/ttf
すなわち

```
C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\mpl-data\fonts/ttf
```
にフォントファイル ipaexg.ttf を配置します。

####3-3.matplotlib側での設定
```
C:\Users\<username>\.matplotlib\fontlist-v300.json
```
を削除します。
キャッシュファイルがあればそれも削除します。

ここでいったん VS Code を再起動しておきます。

###4.アフター
最初のソースにフォントを明示的に指定するために

```
plt.rcParams['font.family'] = 'IPAexGothic'
```
を挿入します。


```
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'IPAexGothic'
flg, ax = plt.subplots()

x = [1, 2, 3, 4, 5]
y = [3, 6, 4, 8, 5]
labels = ['バナナ', 'パイナップル', 'みかん', 'いちご', 'メロン']
ax.bar(x, y, tick_label=labels, label='好きなフルーツ')
ax.legend()

plt.show()
```

うまくいきました。日本語が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/57990bec-f88e-ffda-a1ef-775357052e19.png)

Jupyter notebook でも試してみます。大丈夫でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/b395a059-0430-6d6d-0d08-6016aedf8b52.png)

###5.このあとやりたいこと
scikit-learn を用いて分析したデータをグラフにしてみたい。

###6.参考にさせていただいたQiitaの先輩
[@Kanatani28](https://qiita.com/maroKanatani) さん　https://qiita.com/maroKanatani/items/3b080c639395bba7795a
[@yniji](https://qiita.com/yniji) さん　https://qiita.com/yniji/items/3fac25c2ffa316990d0c
【React】ソースコードを隠す方法

Reactを開発したものをデプロイしたとき、ブラウザのDevToolsでソースコードが見えてしまうという経験はありますか。
ソースコードが見られるのはセキュリティ的にはよくないし、しかもカッコ悪い！！ので、なんとかしましょう！

<img width="1015" alt="スクリーンショット 2020-04-29 15.39.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151946/13583f1b-2d32-8bca-f9ee-690a0086f5cd.png">

# 方法１：Server Side Rendering(SSR)
根本的にFrontend側ではなく、Backend側で処理を書けば良いということです。
ソースコード隠蔽ができるだけではなく、Single Page Application (SPA)のデメリットを克服することもできます。

- FirstView表示時間の短縮：
　SPAでは、「Backend側からレスポンスを返す→Frontend側でJavaScriptを実行→表示」という流れなので、FirstView表示時間は従来の方法より長くなります。SSRと組み合わせることで、FirstView表示時間を短縮することができます。
- SEOの改善：
　SPAでは、Backendからレスポンスが返された時点で、まだHtmlが生成されないため、Search EngineのClawlerがコンテンツを認識するのは難しくなります。SSRと組み合わせることで、この問題も改善されます。
- Isomophic (Universal) JavaScriptの実現：
　FrontendとBackendを分けることによって、色々メリットが生まれますが、その代わりFrontendとBackendとのロジックの共有ができなくなります。SSRと組み合わせることで、Isomophic (Universal) JavaScriptを実現でき、FrontendとBackendとのロジックの共有が可能になります。
Isomophic (Universal) JavaScriptについてより知りたい方は[こちら](https://cdb.reacttraining.com/universal-javascript-4761051b7ae9#.d39eaqcjp)を参考にしてください。


SSRを実現するためには色々な方法があると思いますが、Vercel社(旧名：Zeit社)が開発している[Next.js](https://nextjs.org/)を使うと簡単にできます。

# 方法２： Create-react-appのGENERATE_SOURCEMAP
SSRを導入するのは大変だ、という方はCreate-react-appのGENERATE_SOURCEMAPを無効化する方法もあります。
Create-react-appでビルドしているのであれば、下記のようにスクリプトに追記すれば良いです。

```package.json
scripts: {
  "build": "GENERATE_SOURCEMAP=false react-scripts build"
}
```

もしくは.envファイルに下記を追記しても良いです。

```env
GENERATE_SOURCEMAP=false
```

上記はReactでソースコードを隠す方法を紹介しました。
間違ったところなどがあれば是非ご指摘ください。また、他の方法をご存知の方はご教示いただければ幸いです。
ローカルではビルドできるのにCI上だとビルドエラーになる事象にハマった話

先日、分かってみればしょうもない原因でどハマリしたため、悲しみの覚え書きを投稿します。

## 結論だけ知りたい人へ
git管理下のファイルをリネームするときは`git mv`を使おう。
vscodeの人は[git rename](https://marketplace.visualstudio.com/items?itemName=ambooth.git-rename)を使うと便利。

## 事象
リファクタ目的でファイル名、フォルダ名をリネームしたところ、
ローカル環境ではビルドが成功するのに、CI(GitHubActions)上ではビルドに失敗した。

* ローカルでは動作確認問題なし
* ローカル、CIともにビルドコマンドは`vue-cli-service build --mode production`
* CI上のビルドにて以下のエラーが出た

```txt
-  Building for production...
Starting type checking service...
Using 1 worker with 2048MB memory limit
 ERROR  Failed to compile with 33 errors10:53:22 AM

These dependencies were not found:
 ERROR  Build failed with errors.

* @/src/something in ./node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/ts-loader??ref--14-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/index.vue?vue&type=script&lang=ts&
(以降、いろんなファイルで同様のエラーが表示される)
```

## 原因
git管理上のファイルをリネームしていなかったこと。
vscodeからリネームをしたところ、一部のファイルはgitにリネームが反映されていなかった。
(実ファイルはリネームできているし、git上にリネームが反映されているファイルもありました。vscodeの問題なのか、作業途中でstashしたとかその辺の影響なのかは切り分けできていません)

実ファイルはすべてリネームされているため、ローカルのビルドは成功します。
しかし、git管理上はリネーム漏れがあるため、CI上で改めてcheckout -> buildとするとビルドエラーになる、という事象でした。

## 対策
* git管理下のファイルをリネームするときは`git mv`を使おう。
* vscodeのエクステンション[git rename](https://marketplace.visualstudio.com/items?itemName=ambooth.git-rename)を使うと便利。
* git statusをちゃんと見よう。


## 最後に
ローカルとgitは同じ、という思い込みに気付けず、調査は難航しました。
同僚に相談したところ速攻で解決し、相談って大事だなと改めて思いました。

調査の過程でvueのビルド設定の確認方法(`npx vue-cli-service  inspect`)を知れたのは、ひとつ収穫でした。
Docker Desktop for Macのインストール方法について

# Docker Desktop for Macのインストール方法について

- Dockerのカウント(Docker IDとPassword)を作成し、Docker HubからDocker Desktop for Mac をインストールする
https://hub.docker.com/editions/community/docker-ce-desktop-mac

- MacのアプリケーションフォルダからDockerアイコンをダブルクリックし、起動する

- 起動しているかを確認するために、ステータスバーにクジラアイコンがあることを確認する

- ターミナル上で以下のコマンドを入力し、Dockerがインストールされているか確認する
```docker version
```

- クジラアイコンをダブルクリックして、先ほど設定したDockerIDとPasswordを入力する

- Dockerコンテナ hello-world を実行して正常に機能するか確認する
```docker run hello-world
```
## 出力結果

```
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:lates

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```
Swift Playgroundsの紹介

いきなりですが、皆さんは以下の項目に当てはまるでしょうか？<br>

- プログラミングに興味がある
- iPadを持っている

上記に当てはあるようであればiPadのアプリのSwift Playgroundsをおすすめします
### Swift Playgroundsとは
Swift PlayGroundsとはAppleが開発したSwiftというプログラミング言語をゲーム感覚で学べるアプリになります。<br>
また、iPadを持っていれば無料で使うことができます。

https://www.apple.com/jp/swift/playgrounds/

### プログラミング言語とは？
プログラミング言語とはコンピュータでソフトウェアを作る際に、コンピュータにわかる形で命令をするための言語です。<br>
コンピュータは人間の言葉を直接理解することはできず、0か1の2つしか認識ができません。<br>
人間が0か1の羅列を書いていくのは非常に困難なため、人間とコンピュータの間でやり取りするために使われる言語がプログラミング言語になります。<br>
プログラミング言語には様々な者があり、言語により得意分野があります。<br>
プログラミング言語の紹介については今回は割愛させていただきますが、Swiftもプログラミング言語になります。
### Swiftとは？
SwiftとはiPhoneやiPad、またMacを作っているAppleが作成したプログラミング言語になります。<br>
1番の特徴はAppleのパソコンやスマートフォン、またタブレットのアプリを作るのが得意な言語になります。<br>
そのためいずれiPhoneでアプリやMacで動くソフトを開発したいと思っている場合はこの言語を勉強すると良いでしょう。
### Swift Playgroundsを触った感想
実際私がSwift Playgroundsを触った感想ですが、以下のようになります。
##良い点
- プログラミングの勉強がiPadでできる
- 昔ながらの文字だけのプログラミング学習じゃない
- プログラミングで入力が面倒な文字列をタップして選ぶだけで入力できる
- キャラクターの動きでプログラムが正しく動いているかがすぐわかる

##悪い点
- 自動で入力されている部分が多いため、今後1からプログラムを作成する場合は文法を確認する本などがあった方が良いかも
- キャラクターの動きがあるため、実行結果が正しいか確認するのに少しだけ時間がかかる

実際のアプリについては以下のような説明画面で説明を受けます。
![51500829-18C0-4B10-BCA6-10111CE85526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331410/975d56d5-c0b4-2bba-9109-727d82ddf879.png)
その後以下のようなプログラミングを行い、動かす画面になります。
![F8D1696D-8927-4371-9E63-589065530ED6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331410/8c2e0a0a-16f8-2268-0498-1c721e4ca951.png)

###まとめ
私は2000年代から高校でプログラミングを学び始め、当時の勉強は本を見て内容を実際にパソコンで動かしてみる形の勉強をしてきました。<br>
Swift Playgroundsは動きがすぐわかり、可愛いキャラクターの動きで動作確認ができるので、プログラミングがどういう物かの体験にいいと感じます。<br>
また、子供のプログラミング勉強にも良いアプリだと思うので、プログラミングに興味がありiPadを持っている方はぜひダウンロードしてみて遊んでみてください。
【サクラエディタ】特定行の抽出、削除

## 指定した文字列が含む行を削除したい場合
→指定した文字列が含まれる行を空に置換。

・置換前

```
^.*検索文字列.*\r\n
```
・置換後

```
(空欄)
```
## 指定した文字列が含む行を抽出したい場合
→指定した文字列が含まれない行を空に置換。

・置換前

```
^((?!検索文字列).)*\r\n
```
・置換後

```
(空欄)
```
P5.js 日本語リファレンス(curveTangent)


このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の curveTangent関数を説明します。

## curveTangent()

### 説明文

点 a、b、c、d の位置 t での曲線の接線を算出します。パラメータ t は 0 と 1 の間で変化し、a と d は曲線上の点、bとcは制御点です。

### 構文

curveTangent(a, b, c, d, t)

### パラメタ

- a  
Number：曲線上の最初の点の座標

- b  
Number：最初の制御点の座標

- c  
Number：2番目の制御点の座標

- d  
Number：曲線上の2番目の点の座標

- t  
Number：0と1の間の値

### 戻り値

Number：位置 t の接線

### 例1

```javascript
function draw(){
  noFill();
  stroke(0);
  curve(5, 26, 73, 24, 73, 61, 15, 65); // 曲線を描画

  let steps = 4;
  for(let i = 0; i <= steps; i++){
    let t = i / steps;
    let x = curvePoint(5, 73, 73, 15, t); // 曲線上のx座標を取得
    let y = curvePoint(26, 24, 61, 65, t); // 曲線上のy座標を取得

    let tx = curveTangent(5, 73, 73, 15, t); // 曲線の接線x座標を取得
    let ty = curveTangent(26, 24, 61, 65, t); // 曲線の接線y座標を取得

    let a = atan2(ty, tx); // x軸からの角度を取得
    a -= HALF_PI;
    stroke(255, 0, 0);
    line(x, y, cos(a)* 8 + x, sin(a)* 8 + y); // 赤色で法線を描画
  }
}

```
### 実行結果
![curveTangent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/ff82c402-f586-e1e8-60a6-387bc2f0dfdc.png)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
【サクラエディタ】全角数字⇒半角数字変換するマクロ

```javascript:zenkakuNumToHankaku.js
var convData = {
  "０":0,
  "１":1,
  "２":2,
  "３":3,
  "４":4,
  "５":5,
  "６":6,
  "７":7,
  "８":8,
  "９":9
};

var str = Editor.GetSelectedString(0);
var result = str.replace(/([０-９])/g,
  function ($0){
    return $0.replace(/[０-９]/g , function($0){return convData[$0];});
  });
Editor.InsText(result);
```

# 使用例
対象行を選択して、当マクロを実行する。

### 実行前
```
TEST１１1TEST２2２TEST３３３
TEST１１1TEST２2２TEST３３３
TEST１１1TEST２2２TEST３３３
```

### 実行後
```
TEST111TEST222TEST333
TEST111TEST222TEST333
TEST111TEST222TEST333
```
python 3.8.0～2をwindowsから利用する人がマルチバイト文字を扱うための本当の方法

#最初に結論

- `python -X utf8`で起動せよ
- それでもだめなら環境変数の設定を行い、変数名`PYTHONIOENCODING`、値`utf-8`に設定します。

#初めに
「この記事はpython3.8.0～python3.8.2をwindowsから利用する人向けに書いています。
python3.7以前やpython3.8.2よりも新しいバージョンについては知りません。」
敢えてこう宣言しておきます。

あなたはきっとこの記事にたどり着くまでの間、

1. 例えば`http.server`か何かを動かそうとして
2. `UnicodeDecodeError`にいじめられて
3. `sys.stdout = io.TextIOWrapper( sys.stdout.buffer, encoding=’utf-8’ )`を実行し、
4. 「`buffer`という属性は(`sys.stdout`には)存在しません」とコンパイラに叱られて、
5. 次の情報を探してくるもなかなか見つからなかった

のではないでしょうか。
どうやら、
**`sys.stdout.buffer`は3.8から廃止された**(?)ようです。
その証拠に、
この方法でうまくいった人にバージョンを聞くと3.7以前、失敗した人たちにバージョンを聞くと3.8と答えるのです。(ちゃんと調査していないので偶然かもしれません。そうだったらすみません)

3.8よりも古い情報が「3.x向け」とか「3向け」と謡っているせいでややこしいのです。
3.6や3.7が最新だった当時、3.8で仕様が変わるとは考えもしなかったため、一般化してしまったといったところでしょう。
これからは「python3向け」などといわず、「python3.0～3.7向け」のような言い方をしてほしいものですよね。

#なぜエラーになるのか
https://qiita.com/butada/items/33db39ced989c2ebf644 によれば、windows10やそれ以前では標準出力がshift_jisで成り立っているんだそう。
そのせいでpython3.8.2やそれ以前をwindowsで動かすと、**python内部での文字コードが何であろうと、出力の際にshift_jisに自動で変換してしまう**んだとか。この過程でエラーが起こります。
(ちなみにpython3～3.8.2では、str型の文字コードはutf-8に固定されています。
また一部に「`# coding: utf-8`」を提案している掲示板もありましたが、これはソースのエンコーディングの指定です)

#解決策

python3.7～3.8.2では、`python`をコンソールから起動するとき`-X utf8`のオプションを追加することで「UTF-8 モード」で起動できます。
こちらでは「shift_jisに自動で変換」といった真似はやめてくれます。

・ちなみにhttp.serverを利用したい方は、これだけでは足りないようです。
環境変数の設定を行い、変数名`PYTHONIOENCODING`、値`utf-8`に設定します。
Raspberrypi + UbuntuMate18.04+ + MJPG-streamer + USB Webカメラで監視カメラ

# 目的
Raspberrypi + UbuntuMate18.04+ + MJPG-streamer + USB Webカメラで監視カメラ
（何番煎じか分かりませんが自分の備忘録のためですすみません。）

# 前提
Raspberrypi に UbuntuMate18.04 をインストールしていること
USB WebカメラはRaspberrypiのUSBポートに接続する

# MJPG-streamer

以下を参考に環境構築

> [Raspberry Pi3を使ってネットワークカメラを構築してみる](https://qiita.com/uichi/items/6094eb9fa633192e71e0)

MJPG-streamerをインストール

```
sudo apt-get update
sudo apt-get install -y subversion libjpeg-dev imagemagick
sudo apt install make      
sudo apt install make-guile
sudo apt install gcc
svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
cd mjpg-streamer
make
sudo make install
```

MJPG-streamerを起動

```
sudo ./mjpg_streamer -i "./input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080"
```

# テスト

ブラウザからlocalhost:8080にアクセスして映像が出力されればOK

<img width="264" alt="yugio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/269eee8c-eba5-ea14-846d-4983454ef4fe.png">


他のPCからアクセスしたい場合は、http://(IPアドレス):8080にアクセスする

## Command 'make' not found

$ make

```
Command 'make' not found, but can be installed with:

sudo apt install make      
sudo apt install make-guile
```

## gcc: Command not found

```
$ make
gcc -D'SVN_REV="3:172"' -O2 -DLINUX -D_GNU_SOURCE -Wall    -c -o mjpg_streamer.o mjpg_streamer.c
make: gcc: Command not found
<builtin>: recipe for target 'mjpg_streamer.o' failed
make: *** [mjpg_streamer.o] Error 127
```

```
$ gcc

Command 'gcc' not found, but can be installed with:

sudo apt install gcc
```

gccをインストールして解決

```
sudo apt install gcc
```
# その他
自宅ネットワーク外からアクセスする方法は次の課題（これも何番煎じかわからない。。）

# 参考
[Raspberry Pi3を使ってネットワークカメラを構築してみる](https://qiita.com/uichi/items/6094eb9fa633192e71e0)
[usbカメラで監視カメラ](http://make.bcde.jp/raspberry-pi/usbカメラで監視カメラ/)
[子守 with らずぱい](https://qiita.com/sgmtsnj/items/7dcb44e4f53787245137)
Friendlyが対象プロセスにdllを読み込ませる(DLLインジェクション)仕組み

## はじめに
FriendlyではDLLインジェクションを用いて、任意のDLLを読み込ませることができます。
DLLインジェクションとは、他のプロセス上でコードを実行する方法の一つです。
DLLインジェクションはクラッキングなどに悪用されることもあるようですが、Friendlyでは上手く使用しています。
今回はそのDLLインジェクションのやり方について調べてみました。

## FriendlyのDLLインジェクションの概要
Codeer.Friendly.Windows.InsideパッケージのDllInjector.Load()メソッドが対象プロセスにdllを読み込ませるメソッドです。
このメソッドでは、カーネルを用いて対象プロセスに働きかけることでdllを読み込ませています。
大まかな手順としては、以下の通りです。

1. ロードさせるDLL名称を、対象プロセス内にメモリを確保して書き込みます
2. カーネルからライブラリを読み込む関数（LoadLibraryW）を取得します
3. 対象プロセスの別スレッドにて、DLLをロードします
4. DLLのロードが終わるまで待ちます


上記の手順は、以下のWindowsAPIを実行することで実現されています。

- 対象プロセス内にメモリを確保：[VirtualAllocEx](http://tokovalue.jp/function/VirtualAllocEx.htm)
- 指定されたプロセスのメモリ領域にデータを書き込み：[WriteProcessMemory](http://tokovalue.jp/function/WriteProcessMemory.htm)
- DLLが持つ、指定されたエクスポート済みの関数のアドレスを取得：[GetProcAddress](http://tokovalue.jp/function/GetProcAddress.htm)
- 別のプロセスのアドレス空間で稼働するスレッドを作成：[CreateRemoteThread](https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createremotethread)
- シグナルを待つ：[WaitForSingleObject](http://tokovalue.jp/function/WaitForSingleObject.htm)

## DLLインジェクションのポイント
FriendlyのコードではありませんがDLLインジェクションの原理自体は参考の記事と同様であるため、詳細を知りたい場合は参考をご覧ください。
以下は、自分が参考を読んでポイントだと思った点を整理したものになります。

- kernel.dllに含まれているLoadLibraryというAPIは全てのプロセス空間で同一アドレスにロードされている。そのため、別プロセスで取得したLoadLibraryのポインタが、対象とするプロセスのLoadLibraryのポインタと同じである。
- CreateRemoteThread APIを用いると指定したプロセスにスレッドを作成し、関数を実行させられる。上記で取得したLoadLibraryのポインタを用いて指定したDLLを読み込める。

## おわりに
今回、Friendlyコンポーネントから入り、DLLインジェクションの仕組みについて勉強してみました。おそらく開発で直接活用される機会はなさそうですが、WindowsAPIを詳しく知ることで色々なことができるようになるのだなと思いました。
今後は、FriendlyがDLLインジェクションをした後のことについて、もう少し勉強してみようと思います。

## 参考
64ビット対応のDLLインジェクション - SIN@SAPPOROWORKSの覚書
http://furuya02.hatenablog.com/entry/20120114/1326484897
slim(php)について　

##slimとは
マイクロフレームワークと呼ばれるシンプルなフレームワーク。
HTTPルーティングに特化したフレームワーク

###slimの機能
1.slimアプリケーションをインスタンス化して構成
2.アプリケーションルートを定義
3.slimアプリケーションを実行

###slimによるアプリ実行の大原則
1.slimのAppクラスをnewする
2.Appクラスのrun()メソッドを実行する

###ルーティング
$app->get(URL, 関数)
・HTTPリクエストメソッドに対応

正しい構文
$app->get(ルーティングパターン,対応するコールバック関数);

参考
https://codezine.jp/article/detail/11330?p=3


###Vieコンポーネントの分離
https://akamist.com/blog/archives/422




参考
http://www.slimframework.com/docs/v3/features/templates.html

##初学者向けのチュートリアル記事（実際にやってみた）
###取り組んだ流れ
はじめにqiitaの記事を行う予定でしたが、実際に行うと
qiitaはバージョンが１つ古く、記事の内容と同じようにできずに、断念。
↓
youTubeの記事をやってみた（写経）。
しかし、ファイル取り込みやエラーハンドラーがない等のエラーで先に進まず、断念
↓
公式のチュートリアルを進める。できた。
↓
一通り全体の構造を理解した後で、qiitaの記事をv4に書き換えて、理解を深めた。



概念の理解↓
https://qiita.com/nunulk/items/4b5c15f13ade660cafbc

やってみた↓
https://youtu.be/Tr_0F_yRIIU

最終的なやってみた↓
http://www.slimframework.com/docs/v4/

更に理解を深めたく、下記のチュートリアルをやってみた
https://qiita.com/nunulk/items/4b5c15f13ade660cafbc
↓がメモ。
https://qiita.com/zifu19/items/5a898b4ebd17f5408db2


公式
http://www.slimframework.com/

git
https://github.com/codeguy/Slim

##参考
###始め方
https://qiita.com/Syo_pr/items/b55e18a8361b3ff882b5
https://qiita.com/noboo/items/2387fba99b902d385ee0
https://qiita.com/http_kato83/items/2252b39e2499a43fcfd1
https://www.cloudot.co.jp/3702/
https://qiita.com/cognitom/items/ee07a3d859351b578b0c
https://nextat.co.jp/staff/archives/190

###ルーティングの書き方
https://qiita.com/http_kato83/items/39451682092a7025e5fe

###MySQLの利用
https://qiita.com/juve_534/items/f4f78f5b3b2ab0c16e2a

###Twitter API
https://qiita.com/juve_534/items/2d03b1ffe890860bd4b1
https://qiita.com/juve_534/items/a0c25ba13110ce86c703
ProgresTouch RETRO TINY（英語配列） + MacOS での不具合

ProgresTouch RETRO TINY はカーソルキーがある、Cherry MX 各種軸を使った小型メカニカルキーボードで、気に入って使っている。

しかしながら MacOS Sierra 以降で利用すると、スリープ復帰時に左AltやFnといった一部キーがうまく使えない不具合が〜2019年1月までの製造モデルではある（最新のファームウェアでは直っている。また英語配列のみで、日本語配列では問題がない)。なお、RETRO TINY は MacOS 対応は謳っていないため、メーカ側のサポート範囲外である。

## とりあえずの直し方

USBを抜き差しすると直る。が、MiniB なこともありコネクタが固く、気軽には抜き差しできない。そこで

1. スペースキー左のキー(通常はAlt?) + q でキーボード右上の緑LED点灯
2. スペースキー左のキー(通常はAlt?) + q でキーボード右上の緑LED消灯
3. Fnキー + q でキーボード右上の緑LED点灯
4. Fnキー + q でキーボード右上の緑LED消灯

を押すと直るというバットノウハウを発見した。こちらのほうがUSB抜き差しが発生せず楽である。

## 根本的な直し方

ユーザサポートに連絡したところ、キーボードを物理的に送ることで、物理的に最新のファームウェアへのICのリワークを行ってくれる(MacOSはサポート範囲外なのにありがたい対応…)とのこと。ただその期間、もちろんキーボードは使えないため、別途キーボードが用意できる人は送って直してもらうのがよい。
C#で他アプリケーションを外部から操作する

## はじめに
現在、Friendlyと呼ばれるGUIのテスト自動化をするためのコンポーネントが存在します。
一体どうすれば他アプリケーションをどうやったら操作できるのか疑問に思い、学習しましたので記事として残します。

## 今回の記事で試したこと
以下の記事を参考にすると、外部アプリケーションを操作できます。
今回はこのサンプルを少し変更して、C#でメモ帳に文字列を入力します。
https://tech.sanwasystem.com/entry/2015/11/25/171004

## メモ帳を操作するための事前準備
- アプリケーション名を調べます。メモ帳のアプリケーション名は「notepad」です。
- 対象のアプリのウインドウ構造を調べます。実際に上記のURLのプログラムを動かして調べたところ、編集領域のクラス名は「Edit」コントロールのようでした。
- どんなメッセージ、パラメータを送信すればテキスト入力できるかを調査します。参考URLを読み、以下のことが分かりました。
   - 「WM_CHAR（0x0102）」というメッセージを送るとテキスト入力できる。
   - wParamはキーの文字コード（UTF-16）を表す
   - lParamは以下を表す
      - 0-15 bit:メッセージの繰り返し回数
      - 16-23 bit:スキャンコード、OEM依存
      - 24 bit:拡張キー
      - 25-28 bit:予約済み
      - 29 bit:Altキーが押されていると1, それ以外の場合0
      - 30 bit:以前のキーの状態、キーが押されていれば1、上げられていれば0
      - 31 bit:遷移状態、キーが離されていれば1、押されていれば0

## 実際のプログラム
以下に参考にした記事のプログラムとの差分を示します。以下の差分を取り込んでいただくと、メモ帳に"A"が7回入力できるプログラムが作成できます。

```csharp
	class Program
	{
		public const int WM_CHAR = 0x0102;

		...

		static void Main(string[] args)
		{
			// メモ帳のトップウィンドウのウィンドウハンドル（※見つかることを前提としている）
			var mainWindowHandle = Process.GetProcessesByName("notepad")[0].MainWindowHandle;

			// 対象の編集領域を探す
			var hWnd = FindTargetEdit(GetWindow(mainWindowHandle));

			// キーボードにメッセージを送る
			// 0x00000041 : "A"の文字コード
			// 0x40000007 : キーが離された状態から押された状態へ遷移、7回キー入力を繰り返すことを表すパラメータ
			//              （どんな値を埋めれば良いか分からない箇所は0埋めとしました）
			SendMessage(hWnd, WM_CHAR, 0x00000041, 0x40000007);
		}

		// 全てのEditコントロールを列挙し、最初に見つけたEditコントロールのウィンドウハンドルを返す
		public static IntPtr FindTargetEdit(Window top)
		{
			var all = GetAllChildWindows(top, new List<Window>());
			
			// クラス名からコントロールを取得する。メモ帳の場合はEditコントロールが編集領域。
			return all.Where(x => x.ClassName == "Edit").First().hWnd;
		}
```

## 実際にやってみて
全く知らない状態からに他アプリケーション（今回の場合はメモ帳）を操作しようと思うと、色々なことを知らなければならないことが分かりました。おそらく、Friendlyはこのような処理をきれいに隠蔽することでGUIの操作を簡潔にできるようにしているのだと思います。
また、改めてFriendlyのソースコードを読んで肝となる部分の理解を深めたいと思います。

## 参考URL
- https://docs.microsoft.com/ja-jp/windows/win32/controls/about-edit-controls
- https://docs.microsoft.com/ja-jp/windows/win32/inputdev/wm-char
P5.js 日本語リファレンス(curvePoint)


このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の curvePoint関数を説明します。

## curvePoint()


### 説明文

ポイント a、b、c、d の位置 t の曲線の値を算出します。パラメータ t は 0 と 1 の間で変化します。a と d は曲線の制御点で、b と c は曲線の始点と終点です。これは x 座標、y 座標それぞれで実行して t での曲線の位置を取得できます。

### 構文

curvePoint(a, b, c, d, t)

### パラメタ

- a  
Number：曲線の最初の制御点の座標

- b  
Number：最初の点の座標

- c  
Number：2番目の点の座標

- d  
Number：2番目の制御点の座標

- t  
Number：0 と 1 の間の値

### 戻り値

Number：位置 t の bezier 値

### 例

```javascript
function draw(){
  noFill();
  stroke(255, 0, 0);
  curve(5, 26, 5, 26, 73, 24, 73, 100); // 赤色の曲線を描画

  stroke(0, 0, 255);
  curve(5, 26, 73, 24, 53, 61, 15, 65); // 青色の曲線を描画

  fill(255);
  let steps = 4;

  for(let i = 0; i <= steps; i++){
    let t = i / steps;
    let x = curvePoint(5, 5, 73, 73, t); // 赤色の曲線上の x 座標を算出
    let y = curvePoint(26, 26, 24, 100, t); // 赤色の曲線上の y 座標を算出
    stroke(255, 200, 0); // オレンジ色を設定
    ellipse(x, y, 5, 5); // 算出したxy座標上に円を描画

    x = curvePoint(5, 73, 53, 15, t); // 青色の曲線上の x 座標を算出
    y = curvePoint(26, 24, 61, 65, t); // 青色の曲線上の y 座標を算出
    stroke(0, 200, 255); // 水色を設定
    ellipse(x, y, 5, 5); // 算出したxy座標上に円を描画
  }
}
```

### 実行結果
![curvePoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/84ecb4eb-0564-1976-ff12-d9ce947dce35.png)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
各社のリモートワークを語る会に参加して得た知見

# はじめに
2020年4月28日に開催された[各社のリモートワークを語る会](https://remote-conference-group.connpass.com/event/173952/)というオンラインイベントに参加しました。
そこで得た知見を紹介します。

# 概要
緊急事態宣言により、慣れないリモートワークに苦しんでいる方もいるということで、各社のリモートワーク事情について話し合うオンラインイベントです。
最近、流行っている Remo Coference でのイベントです。

イベントの前半は、リモートワークに関するLT発表と、リモートワークを導入している企業の代表同士の座談会を行いました。
後半は、Remo Coference の機能で、参加者が数人ずつのテーブルに分かれて懇談会(フリートーク)を行いました。

# LT発表
LT発表は3つありました。そこで得た知見を紹介します。

## ワークシフト
[株式会社スタートアップテクノロジー代表の菊本久寿さん](https://twitter.com/hisaju01)の発表です。

新しい働き方を色々と考えて2013年から実践している点が素晴らしいと思いました。
以下が知見になりました。

- 場所や時間にとらわれない働き方を実現するため、出社自由制度を制定。
- リモートOKでも出社したくなるようにオフィス施策を色々考えて実践。ゲーム機、180度近くリクライニングする椅子、ピザをオフィスに宅配して出社した人はピザ食べれるなど。
- Slackで勤怠報告。
- 社内サーバーは持たない(すべてクラウド)。
- 情報共有は、Slack、Zoom、Discode、esa、GoogleDrive。
- 今後は、オンラインで適切に仕事を可視化し、オンラインでセルフマーケティングできる人しか生き残れない。

[発表資料はこちら](https://speakerdeck.com/hisaju/wakusihuto)

## Re:Buildのリモートワークの変遷
[株式会社Re:Build代表の鈴木孝之さん](https://twitter.com/kanbo0605)の発表です。

リモートワーク中心ながら、定期的にオフラインで会うことで仕事をしやすいチームを作っている点は素晴らしいと思いました。
以下が知見になりました。

- リモートワークは、新人が先輩に質問するハードルが上がる。
- オフラインは、ランチや飲み会などで雑談する機会がある。それが仕事のしやすさに繋がる。
- 定期的にオフラインで会うことで、本当の不満や意見を吐き出す機会を作る。
- 定期的にオンラインランチ会を実施。
- [Cacoo](https://cacoo.com/ja/)でリアルタイムで顧客にも図を操作してもらいつつ認識を合わせる。
- [miro](https://miro.com/)を利用してリアルタイムでチームメンバーでユーザーストーリーマッピングを作成。

[発表資料はこちら](https://speakerdeck.com/bumptakayuki/re-buildfalserimotowakufalsebian-qian)

## リモートワークで楽しく開発するためのチームビルディング
[私(小島優介)](https://twitter.com/kojimadev)の発表です。

リモートワークで楽しく開発するためのチームビルディングとして活用している施策を紹介しました。詳細は割愛します。

質疑応答にて、参加者と話した時に得た知見を以下に記載します。

- Q. メンバーの分報を逐一拾ってフィードバックするのは大変ではないでしょうか？
    - A. 大変ではないです。メンバーの分報を拾って、軌道修正したり、ポジティブフィードバックしたりすることは、チーム全体の生産性向上になります。私がメンバーの分報を読んでフィードバックする時間より、それにより開発が加速する効果の方が大きいため、問題ありません。
- Q. 分報が人により全くつぶやかなくなってくるのですが、そういうことないでしょうか？
    - A. そういうことはないです。メンバーが分報をつぶやくメリットを感じれば、つぶやくようになると思います。  例えば不具合調査中の分報に対して「そこに気付くなんて凄い！」「その想定は素晴らしい！」などのポジティブフィードバックをされたり、タスクを進める上での助言をされたりすれば、メリットを感じると思います。

[発表資料はこちら](https://www.slideshare.net/kojimadev/ss-232761867)

# 座談会と懇談会
6つの会社の代表同士での座談会と、懇談会にて、以下が知見になりました。

- コミュニケーションツールとして、Discordを使っている会社もありました。Discodeは本来ゲーム用のチャットツールですが、動作が軽く、マルチプラットフォームで利用できることもあり、リモートワークで使うメリットがいくらかあるようです。詳細は[こちらの記事](https://shigoto-ba.com/archives/2758)。
- Zoomでのリモート飲み会は、複数人が同時にしゃべれないため、多人数になるほどうまくいかないそうです。
- Remo Conference は最大6人までのテーブルで、席を自由に移動できるため、Zoomよりは実際の飲み会に近い状態になると感じました。
- Remo Coference は、このご時世で需要が高まった影響なのか、少し前と比べて5倍くらいに値段が跳ね上がったそうです。
- 分報はどこの会社でも当たり前のように実施していました。[分報についての詳細はこちら](https://qiita.com/kojimadev/items/ea8825dec1b0d0d2874c)。

# まとめ
イベントで得た知見は以上です。

私はこのイベントで発表したノウハウを用いて [こちらのツール](https://www.lightning-review.com/) を作っています。

Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)
bash上で文字列の構造体に文字列を追加する

bash上で文字列の構造体に文字列を追加する


```shell:test.sh
echo "-----"
STRINGS=( "one" "two" "three" )  # 初期化                                                                              
echo ${STRINGS[0]}
echo ${STRINGS[1]}
echo ${STRINGS[2]}
echo ${STRINGS[3]}
echo "-----"
STRINGS+=( "four" )  # 追加                                                                                        
echo ${STRINGS[0]}
echo ${STRINGS[1]}
echo ${STRINGS[2]}
echo ${STRINGS[3]}
echo "-----"
STRINGS=( )  # 消す                                                                                                    
echo ${STRINGS[0]}
echo ${STRINGS[1]}
echo ${STRINGS[2]}
echo ${STRINGS[3]}
echo "-----"
```

```
$ ./test.sh
-----
one
two
three

-----
one
two
three
four
-----




-----
```

以下の部分が該当

```
STRINGS+=( "four" )  # 追加
```
【ServiceNow】 リスト画面の開き方

皆さんお久しぶりです。

長らく記事を投稿できておりませんでしたが、ServiceNowを少しずつでも投稿しようという思いで掲題の通りServiceNow（Ver:Orlando）のリスト画面の便利機能を記事にしていきます。

バージョン：Orlando

#■リスト画面の開き方
皆さんはServiceNowの各テーブルのリスト情報をどのように開きますか？
毎回アプリケーションナビゲータより開いていませんか？
持っている情報を基にどのように開くのがよいか、より効率的に操作をしましょう。

インシデントのリスト画面を開く方法で進めていきたいと思います。
※今回紹介する開き方は代表的なものであって、他にも様々なリストの開き方があります。

## アプリケーションナビゲータ
　最も基本的な開き方となります。
　以下の手順で開きましょう。

　以下画面の左ペイン：アプリケーションナビゲータより、
　[incident] ＞ [Open]と選択することで現在オープン中のインシデント一覧を開くことが出来ます。

<img width="900" alt="application.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/905edf62-dffd-0e79-71ff-1913bcf5db0f.png">

**開くメニュー情報を把握していない、メニュー名のみ把握している場合はこちらの方法で開きましょう。**

尚、アプリケーションに用意されている選択個所は以下を意味しています。

・CreateNew：新規起票画面
・Assign to me ：ログイン中のユーザにアサインされているインシデント一覧が開きます。
・Open：オープン中のインシデント一覧を開きます。
・Open - Unassigned：オープン中かつ未アサインのインシデント一覧を開きます。             
・Resolved：解決済みのインシデント一覧を開きます。
・All：すべてのインシデントの一覧を開きます。

##フィルタナビゲータ
　テーブル名を既に知っている場合に便利です。
　以下画面のようにフィルタナビゲータに入力することでリスト、新規起票画面を開くことができます。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/334ebdc9-d87a-1910-e0c3-f1c2354a7800.png)

　"テーブル名.list":テーブルがリスト表示されます。
　"テーブル名.do":該当のテーブルへの新規レコード追加画面が開きます。

以上でリストの開き方について終わります。

- これが出来たら1up

　①フィルタナビゲータに"Stats.do"と入力しましょう。
　　以下の画面が開きます。
　　ここではインスタンス情報が閲覧可能です。
（バージョン、クラスタノード情報、レスポンス情報等）
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/d7bb6f5b-270c-38e5-0e8c-d77c4e8aaac1.png)


　②テーブル名の調べ方
　　sys_db_object.listと入力しましょう。
　　テーブル名一覧のリストが開きます。ここでテーブル名を確認しましょう。
　　※Label列ではなく、Name列が該当します。

　③リスト、フォーム画面からテーブル名の調べ方
　　リスト、フォーム上で以下の順に画面を開きましょう。
　　今開いているリスト、フォームのテーブル情報に画面が遷移します。
　　※画面はリストです。
　　
　　[リストコンテキストメニュー] > [Configure] > [Table]
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/22f89eab-13c2-805e-e564-575241bfce43.png)

以上で1UPも完了です。自身で開きたいテーブル、リストをスムーズに開いて業務を遂行しましょう！

では！！
【Java】ArrayListの正体

#ArrayListの宣言・初期化方法

ArrayListは以下のように宣言する。
ArrayList<型> 変数名 = new ArrayList<型>(初期容量);　※初期容量は省略可
 
```java:ArrayListSample.java
ArrayList<Integer> arrayList = new ArrayList<Integer>();  //  初期容量指定しない
ArrayList<Integer> arrayList = new ArrayList<Integer>(3); //  初期容量指定する
//ArrayList<int> arrayList = new ArrayList<int>();        //  コンパイルエラー
```

#なぜプリミティブ型はだめなのか
ArrayListの中身を見てみる

```java:ArrayList.class
public class ArrayList<E> extends AbstractList<E>　… {
    private static final int DEFAULT_CAPACITY = 10;
    private static final Object[] EMPTY_ELEMENTDATA = {};
    transient Object[] elementData;      // ← ArrayListデータの実態
    private int size;
    //コンストラクタ
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
//中略
```
ArrayListの正体は__Object[]__を中心にした便利な操作クラスだった。
__Object型のデータ型のみArrayListとして使用できる。__
プリミティブ型はObject型を継承するデータ型ではないため、使用できないのか。
#プリミティブ型

```java
//8種類
byte, short, boolean, char, int, long, float, double
```

#初期容量は何のために指定するのか
##new、add、get、removeしたときに起きていること

```java
ArrayList<Integer> arrayList = new ArrayList<Integer>(3);
arrayList.add(new Integer(10); //a
arrayList.add(new Integer(11); //b
arrayList.add(new Integer(12); //c
arrayList.get(1);
arrayList.remove(1);
```

![new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621352/c39ac902-8f70-c283-3c7c-5fbb2085f7aa.png)


##初期容量を超える要素数になった場合

```java
ArrayList<Integer> arrayList = new ArrayList<Integer>(3);
arrayList.add(new Integer(10); //a
arrayList.add(new Integer(11); //b
arrayList.add(new Integer(12); //c
arrayList.add(new Integer(13); //d
```
![new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621352/7b123b49-d67e-1347-1c09-c82d4b6b8fd7.png)

##配列の移動がどれほど影響あるか
###指定しない場合
```java:ArrayListSample.java
ArrayList<Integer> arrayList = new ArrayList<Integer>();
long array1Start = System.currentTimeMillis();
for(int i=0; i < 10000000;i++) {              // ← 1000万
	arrayList.add(new Integer(10));
}
long array1End = System.currentTimeMillis();
System.out.println("処理時間：" + (array1End - array1Start) + " ms");
```
####結果
```
処理時間：6505 ms
```
###指定した場合
```java:ArrayListSample.java
ArrayList<Integer> arrayList = new ArrayList<Integer>(10000000);
long array1Start = System.currentTimeMillis();
for(int i=0; i < 10000000;i++) {               // ← 1000万
	arrayList.add(new Integer(10));
}
long array1End = System.currentTimeMillis();
System.out.println("処理時間：" + (array1End - array1Start) + " ms");
```
####結果
```
処理時間：5630 ms
```
1秒ほどの差が出た。
##結論
大容量の場合、想定する容量を指定しておく