OmniAICreator/Qiita-1.07M huggingface dataset:
Google Colaboratory の 90分ルールを対策する bat スクリプト

# はじめに
便利ですね、GoogleColaboratory。
しかしながら、有名な90分ルールと12時間ルールが厄介です。
簡単な数値計算をする際は、前者が厄介です。
90分に一度PCを触る、などといった非人間的な作業をしたくないので、タイトルの通り簡単に対策することにしました。
なお、この問題に関しては例えば
[enmaruさんの記事](https://qiita.com/enmaru/items/2770df602dd7778d4ce6)
など様々なところで取り上げられていますが、
bat スクリプトが記述されているものは見かけなかったので本記事を執筆しました。

# スクリプト本体
以下に、目的を達成するためのスクリプトを示します。
chrome を使うことを前提としています。
だいぶ汚いですが、あまりにも簡単です。
単に、start %URL% として、Colab. 非対応の思わぬブラウザで開かれることを回避します。

```bat:a.bat
@echo off
set URL="Colab. のURL"
start chrome.exe %URL%
timeout 3600 /nobreak 
start chrome.exe %URL%
timeout 3600 /nobreak
start chrome.exe %URL%
timeout 3600 /nobreak 
start chrome.exe %URL%
timeout 3600 /nobreak
start chrome.exe %URL%
timeout 3600 /nobreak 
start chrome.exe %URL%
timeout 3600 /nobreak
start chrome.exe %URL%
timeout 3600 /nobreak 
start chrome.exe %URL%
timeout 3600 /nobreak
start chrome.exe %URL%
timeout 3600 /nobreak 
start chrome.exe %URL%
timeout 3600 /nobreak
start chrome.exe %URL%
timeout 3600 /nobreak 
start chrome.exe %URL%
timeout 3600 /nobreak
 ```
home directry内の規定のフォルダ名を日本語から英語に変更する

作業ログです。

★user-dirs.dirsをviで編集する方法
・XDG_*****_DIR=の後ろにある""内に記述されているネームを編集する
marcy0713@Inspiron-11-3162:~/.config$ pwd
/home/marcy0713/.config
marcy0713@Inspiron-11-3162:~/.config$ ls
dconf      gedit                     gnome-session  ibus      update-notifier
enchant    gnome-control-center      goa-1.0        nautilus  user-dirs.dirs
evolution  gnome-initial-setup-done  gtk-3.0        pulse     user-dirs.locale
marcy0713@Inspiron-11-3162:~/.config$ vi user-dirs.dirs 
　# This file is written by xdg-user-dirs-update
　# If you want to change or add directories, just edit the line you're
　# interested in. All local changes will be retained on the next run.
　# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
　# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
　# absolute path. No other format is supported.
　#
XDG_DESKTOP_DIR="$HOME/デスクトップ"
XDG_DOWNLOAD_DIR="$HOME/ダウンロード"
XDG_TEMPLATES_DIR="$HOME/テンプレート"
XDG_PUBLICSHARE_DIR="$HOME/公開"
XDG_DOCUMENTS_DIR="$HOME/ドキュメント"
XDG_MUSIC_DIR="$HOME/音楽"
XDG_PICTURES_DIR="$HOME/ピクチャ"
XDG_VIDEOS_DIR="$HOME/ビデオ"

★言語環境に合わせて変更する方法
・xdg-user-dirs-gtk-updateを利用する
①「LANGUAGE=en_US LANG=en_US.UTF-8 xdg-uesr-dirs-gtk-update」を実行
※LANGUAGEはUIの言語を指定する環境変数
※LANGはLocalの環境変数のデフォルト値を定義する環境変数
②「Update standard folders to current language?」と聞かれるので「Update Names」を選択
※「user-dirs.dirs」ファイルを確認すると変更後の言語が確認できる
Linuxでプログラムファイルの実行/ファイルの解凍圧縮

★ファイル実行コマンド
・sh ＊＊＊＊＊.sh
・bash ＊＊＊＊＊.sh
・chmod +x ＊＊＊＊＊.sh（実行権限の付与）
　./********.sh(カレントディレクトリのプログラムを実行）
※rootユーザで実行する場合は「sudo」を頭につける

★解凍コマンド
・.tar.gz.tgz　→　tar −xzvf ファイル名
・.tar.bz2.tbz　→　tar −xjvf ファイル名
・.gz　→　gunzip ファイル名,gzip −d ファイル名
・.bz2　→　bzip2 −d ファイル名
・.lha.lzh　→　lha x ファイル名
・.zip　→　unzip ファイル名
※Windowsで作成された日本語ファイルをLinux上で解凍して文字化けしたらunarを使用する
「.zip　→　unar ファイル名」

★圧縮コマンド
・.tar.gz.tgz　→　tar −zcvf ファイル名.tar.gz ディレクトリ
・.tar.bz2.tbz　→　tar −jcvf ファイル名.tar.bz2 ディレクトリ
・.gz　→　gzip ファイル名
・.bz2　→　bzip2 ファイル名
・.lha.lzh　→　lha c ファイル名.lzh ディレクトリ
・.zip　→　zip ファイル名.zip ディレクトリ
Ubuntu20.04にVisual Studio Codeをインストール

作業ログです

★snapパッケージを利用する
marcy0713@Inspiron-11-3162:~$ sudo snap install --classic code
[sudo] marcy0713 のパスワード: 
code 5763d909 from Visual Studio Code (vscode✓) installed
marcy0713@Inspiron-11-3162:~$ 
marcy0713@Inspiron-11-3162:~$ snap list
Name               Version             Rev   Tracking         Publisher   Notes
code               5763d909            33    latest/stable    vscode✓     classic
core               16-2.45             9289  latest/stable    canonical✓  core
core18             20200427            1754  latest/stable    canonical✓  base
gnome-3-34-1804    0+git.3009fc7       33    latest/stable/…  canonical✓  -
gtk-common-themes  0.1-36-gc75f853     1506  latest/stable/…  canonical✓  -
snap-store         3.36.0-80-g208fd61  454   latest/stable/…  canonical✓  -
snapd              2.45                7777  latest/stable    canonical✓  snapd
marcy0713@Inspiron-11-3162:~$ 
marcy0713@Inspiron-11-3162:~$ /snap/bin/code --version
1.45.1
5763d909d5f12fe19f215cbfdd29a91c0fa9208a
x64
marcy0713@Inspiron-11-3162:~$ 

★シンボリックリンク作成
marcy0713@Inspiron-11-3162:~$ sudo ln -s /path/to/vscode/Code /usr/local/bin/code
【JavaScript】オブジェクトが未定義だった場合のエラーを回避する方法　？（クエッション・疑問符）

こんにちは！
今年も夏が来ましたね〜
エンジニアのみなさま、この時期、夏バテにお気をつけてください...！
中には自宅でエアコンなしの部屋でコーディングされている方もいるんだとか。。。（ただでさえ暑いのに、Macとかめちゃくちゃ熱こもりますし、心配です。。）

今回は「オブジェクトが未定義だった場合のエラーを回避する方法」について、調べてみました。
ご指摘やアドバイス等をいただけると、大変助かります。

【2020年7月4日追記】
@standard-software さんコメントありがとうございます！
オプショナルチェイニングoptional chaining演算子を使います！
[公式ドキュメント] (https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining)

#### 本記事の対象者
JavaScript初心者〜初中級者

## （おさらい）

### 基本パターン
```javascript
const obj = {name: 'KumKum'};
console.log(obj.name) // KumKum
```
基本的なオブジェクトの定義ですね


### 指定したオブジェクトの中身がnullの場合
```javascript
const obj = null;
console.log(obj.name) // Uncaught TypeError: Cannot read property 'name' of null
```
オブジェクトがnullの場合エラーになります

### 指定したオブジェクトの中身がundefinedの場合
```javascript
const obj = undefined;
console.log(obj.name) // Cannot read property 'name' of undefined
```
undefinedの場合も同様ですね

## ここから本題
先ほどのエラーを回避するにはどうしたら良いのか。
以下のように`?（クエッション）` を使うことで、`undefined`をセットすることができます。

### 指定したオブジェクトの中身がnullの場合
```javascript
const obj = null;
console.log(obj?.name) // undefined
```
エラーにならず、`undefined`が設定されます。

### 指定したオブジェクトの中身がundefinedの場合
```javascript
const obj = undefined;
console.log(obj?.name) // undefined
```
nullと同様、エラーにはなりません。

## まとめ
`オブジェクト名?.プロパティ名`と指定すると、
オブジェクトが`null`または`undefined`だった場合に、
エラーにならず、`undefined`を返す
【Laravel × Redis】No connections available in the pool...の原因と対処法

# はじめに
Laravelにて開発中、以下のようなエラーが発生したため、その原因と対処法を簡単に記します。

```php:laravel.log
No connections available in the pool {"exception":"[object] (Predis\\ClientException(code: 0): No connections available in the pool at /var/www/application/vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php:337)...
```

エラーメッセージより
>Redisの接続に異常がある

と見当がつく。

# 原因
Redisへの接続情報に誤りがあった。
具体的には、Redisのホスト名が誤っていた。
根本原因は、AWS Systems Managerのパラメータストアで管理していた、Redisのホスト名に関する変数の値が古いままとなっていた。

# 対処法
1. Laravelの.envを確認。
2. Redis接続情報とAWSのElastiCacheにて使用しているRedis情報を照合。
3. ホスト名に誤り発見。「REDIS_HOST=」の部分。
4. Laravelの.env修正。
5. **しかし直らず。**
6. Laravelの.envの作成元であるphp-fpmを確認。
7. 該当部分の設定も変更。同じく「REDIS_HOST=」の部分。
8. php-fpm再起動。`sudo service php-fpm restart`
9. 直った。

# 蛇足
php-fpm管理の環境変数初期設定にはAWS Systems Managerを利用していた。
当エラー発生前にEC2インスタンスの再起動が発生しており、AWS Systems ManagerのRedisホスト名が古いままであり実際の値と異なっていたため、Redisへの接続に不具合が生じることとなった。
よって根本解決として、AWS Systems ManagerのRedisホストの変数名を新しいものへと変更した。

終わりです。
Allwinner F1C100s/200s について下調べ


# F1C100s/200s とは

 Alliwinner の超安 Soc 。
メモリ32M(F1C100s) ないし 64M(F1C200s)が内蔵されている。これに以下の部品を追加するだけで、Linux を動かすことができる。

- ストレージとして eMMC チップや SDカード
- 電源
- シリアルやUSBなどのI/O
- コンデンサ


F1C200s は Aliexpressだと3〜400円ぐらいから、F1C100sでなおかつ Taobao だと 100円ぐらいから入手可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f58e945b-4ff0-8050-4ef4-e8136e8adb14.png)
(キャプチャー上の値段は中国元表記、2020/07/03現在 15〜16円/元)

Makers 界隈では Arduino を元にして、オレオレ基板をつくることがよく行われている。ATMEGA32 チップを使って基板を作るのは CAD 体験としても はんだづけ体験としても、Makers 入門に最適だ。
同じように、F1C100s/200s を使うと Linux の動作するオレオレ基板をさくっと作ることができるようになるのではないか？

基板を作ってみるために、下調べ。

公式ページ
http://www.allwinnertech.com/index.php?c=product&a=index&id=74

製品比較
http://www.allwinnertech.com/index.php?c=product&a=index&pid=4

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/be6c3e4e-ece7-366c-ab67-5b53f1ba3cfb.png)
上記にはeLQFP128 とあるが、QFN88の間違い


Linux Sunxi (ユーザーコミュニティ)
https://linux-sunxi.org/Main_Page


Linux Sunxiで公開されているデータシート

- https://linux-sunxi.org/images/b/ba/F1C100s_Datasheet_V1.0.pdf
- https://linux-sunxi.org/images/1/11/Allwinner_F1C200s_Datasheet_V1.0.pdf



# 違い

F1C100s と F1C200s は以下のような違いがある。



||F1C100s|F1C200s|
|:----:|:----:|:----:|
|オンチップメモリ|32MB|64MB|
|Video Playback|720p|1080p|

## F1C100Sを使った事例

-  Sipeed Lichee Nano

公式ページ？ http://nano.lichee.pro/
SwitchScience の販売ページ  https://www.switch-science.com/catalog/5705/
回路図など https://dl.sipeed.com/LICHEE/Nano/HDK

@sat0ken さんの記事 「Lichee Pi Nano をはじめてみる」
https://qiita.com/sat0ken/items/bdbe149c91349a892013

- Linux名刺

回路図 https://www.thirtythreeforty.net/posts/2019/12/my-business-card-runs-linux/businesscard.pdf

- PocketGo 


http://nuneno.cocolog-nifty.com/blog/2020/03/index.html



# Allwinner




https://www.slideshare.net/shimadah/allwinneros-65719676
@shimadah さんの「AllwinnerタブレットのOSを作ってみる(中編)」

> -  Allwinnerやタブレットメーカーは、GPL違反を繰り返している
>  - http://linux-sunxi.org/GPL_Violations
> -  ベンダーのKernelにはBackdoorが入っているのではないか？という話がある
>  - "Allwinner has also been accused of including a backdoor in its published version of the Linux kernel." 
>  - https://en.wikipedia.org/wiki/Allwinner_Technology


今の所 F1C100S/200S ではGPL違反などは確認されていない。
Ubuntu20.04にSophosをインストール

詳細を書いてませんが、流れを備忘録として残します。

★インストール
・公式サイトからtgzファイルをダウンロード
・解凍　tar zxvf sav-linux-free-9.tgz
・実行　./sophos-av/install.sh
・ライセンス同意　y　enter
・インストール先　enter
・オンアクセス検索　y　enter
・オートアップデート　s　enter
・無償有償　f　enter
・プロキシ　n　enter
完了

★アップデートの手動実行
・/opt/sophos-av/bin/savupdate
通常60分間隔でアップデートは動いている

★ログの確認
・/opt/sophos-av/bin/savlog --today

★アンインストール
・/opt/sophos-av/uninstall.sh
【初心者】Phthonで文字列を抽出する

######文字列

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342082/c72d29a0-e926-aa64-c51b-ac2c24f711f1.png" width="60%">
######0以上のインデックスを指定
一番左の文字を指定したいときは[0]。

```
>>> w = "abcde"
>>> w[0]
'a'
>>> w[4]
'e'
```

######マイナスのインデックスを指定
一番右の文字を指定したいときは[-1]。

```
>>> w = "abcde"
>>> w[-5]
'a'
>>> w[-1]
'e'
```
######インデックスの範囲外を指定するとエラー
```
>>> w = "abcde"
>>> w[5]
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    word[5]
IndexError: string index out of range
>>> w[-6]
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    w[-6]
IndexError: string index out of range
```
######コロンを利用して範囲を指定する

```
>>> w = "abcde"
>>> w[1:4]
'bcd'
>>> w[0:3]
'abc'
>>> w[:3]
'abc'
>>> w[3:0]
''
>>> w[-1:]
'e'
>>> w[:-1]
'abcd'
>>> word[-4:-2]
'bc'
>>> word[-2:-4]
''
```
herokuで常時SSL化（rails)

知ってれば何てことないのに、英語は読まなあかんわ、
情報は断片的だわってことで流れだけでもまとめました。

とりあえず、google翻訳は必須だね・・・。

前提：herokuで証明書を発行する

##流れ
思い出しながらやっているので、実際のところ前後があるかもしれませんがご容赦ください

**１、herokuのDynoを有料化してSSL証明書を発行できる状態にする**
7ドル以上の有料プランしかSSLを発行できないです。
https://jp.heroku.com/pricing

##２、herokuのsetting画面でSSL Certificatesを確認（画面の真ん中らへん##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535766/1000e15e-ab77-61aa-dfcf-1dc777ad4aea.png)

基本的には自動で作られるので、有料化したら作られるよう。
なければ、configure SSlボタンより作成

##３、オリジナルドメイン追加##

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535766/54ab6f1a-088e-dc62-7334-eba491bdd24d.png)



##４、★重要！Point DNSを導入##
herokuのメニュータブ「recoreces」　→　Add ons　から追加。
細かなところは、他の記事をご覧ください。

で、非常に重要なのが、
非常に重要！！！なのが、
**ALIASと、CNAMEのDataには、上記３で表示されているDNS　Targetの値をいれること！！**
初期状態のheroku.app的なものだと、SSLが適応されません！
 

##５、SSLの有効化を行う##

`$ heroku certs:auto:enable`を実行
恐らく問題ないかと思いますが、エラーもろもろが出たら公式を日本語訳にして読んでね！
https://devcenter.heroku.com/articles/automated-certificate-management#setup


##６、★重要！常時SSL化を実施##

herokuでSSｌ化ができても、常時SSLはherokuじゃなく、
自分のrails アプリでやる必要があります！
SSL化 ＝　SSL常時化ではないので、気を付けてください。

app/environments/puroduction.rb
の中に書いてある
`# config.force_ssl = true`
これのコメントアウトを解除。

以上です。誰かのお役に立てると幸いです
WindowsでScalaの開発環境を構築する方法

![scala.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/473a51da-9929-ebdb-a298-bb2b7ef18015.png)

WindowsでScalaの開発環境を構築するためには、以下のツールをインストールする必要があります。

- JDK (Java Development Kit)
- sbt
- IntelliJ IDEA

####JDKのインストール

[こちら](https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot)からOpenJDK (LTS)とHotSpotを選択し、JDKをダウンロードします。

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/c41e151f-51b5-43ed-03fa-7dc1c3769671.png)

.msi形式のファイルがダウンロードできるので実行後、指示にしたがってインストールを進めてください。

####sbtのインストール

[こちら](https://www.scala-sbt.org/download.html)からインストーラをダウンロードします。

![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/7b6eab60-b6e0-899d-9859-95cc87a6e03e.png)


こちらもJDK同様、インストールを進めてください。

####IntelliJ IDEAのインストール

[こちら](https://www.jetbrains.com/idea/download/#section=windows)からCommunity版のIDEAをダウンロードします。（有償でもいい方はUltimate版を選択してください）

![img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/c831ed59-2f92-218d-b28e-f05430da67f2.png)

IDEAのインストーラを起動し、指示に従ってインストールしてください。

####Scalaプラグインのインストール

IDEAの初回起動では下のような画面が出てきます。右下のConfigureからPluginsを選択します。

![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/cd6968d9-daf0-aadb-b8fc-ab94c5aa734e.png)


検索バーに「Scala」と入力すると、JetBrainsが公式に提供するScalaプラグインが先頭に表示されますので、これを選択し、インストールしましょう。

![img5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/73a3ada5-4573-7197-60dd-27c096bb6750.png)

インストールが完了すると、「Install」ボタンが「Restart IDE」に変化します。
このボタンを押してIDEAを再起動します。

これでScalaの開発環境が構築できました。

####動作確認

ターミナルソフトで以下のコマンド実行して、任意のディレクトリにScalaプロジェクトを作成します。

```
$ sbt new scala/scala-seed.g8
```

プロジェクトの名前を聞かれますので、好きな名前を入力します。ここではhelloscalaとします。

```
name [Scala Seed Project]: helloscala
```

実行後、helloscalaディレクトリが作成されます。

####Scalaプロジェクトのインポート

起動時の画面から「Open or Import」を選択します。

![img6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/faae3c19-095f-d756-d4af-75792516b7e7.png)

先ほど作成したhelloscalaディレクトリを選択し、プロジェクトを開きます。そして、左下の「sbt shell」をクリックしてsbt shell を開きます。

![img7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/bf818d4a-e1d0-7a7f-15e0-9e655403b203.png)

sbt shellでrun.com.example.HelloWorldを入力し、実行します。

```
[IJ] sbt:helloscala> run com.example.HelloWorld
[info] Compiling 1 Scala source to C:\Users\user\OneDrive\Desktop\scala_sample\helloscala\target\scala-2.13\classes ...
[info] Done compling.
[info] running example.Hello com.example.HelloWorld
hello
[success] Total time: 0 s, completed 2020/07/03 12:30:54
```

helloと表示されれば成功です。
Let's Encrypt  自動更新しなくなった

#背景
前回の記事　[CentOS 7.4 でLet's Encrypt をACME v2に更新しました](https://qiita.com/teijinakano/items/457d5fd1984346f4d19b)
でACME V2にアップデートできたところまではよかったのですが、更新されてませんよ！と警告メールが来ました。

~~~
Your certificate (or certificates) for the names listed below will expire in 20 days (on 22 Jul 20 05:49 +0000). Please make sure to renew your certificate before then, or visitors to your website will encounter errors.
~~~

確か、２年前には、crontabで以下の設定をしましたが、このままじゃだめらしい。

~~~
# crontab -u root -e
MAILTO=""
1 4 * * * certbot renew --quiet
1 5 * * * certbot renew --quiet
~~~

#応急処置
ネットで自動更新の記事を探しましたがよくわからず、とりあえず手動で以下のようにやりました。

~~~
# ./certbot-auto certonly -d <ドメイン>
./certbot-auto has insecure permissions!
To learn how to fix them, visit https://community.letsencrypt.org/t/certbot-auto-deployment-best-practices/91979/
Upgrading certbot-auto 1.3.0 to 1.5.0...
Replacing certbot-auto...
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Apache Web Server plugin (apache)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 1
Plugins selected: Authenticator apache, Installer None
Cert is due for renewal, auto-renewing...
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for ドメイン
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ドメイン/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ドメイン/privkey.pem
   Your cert will expire on 2020-09-30. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

~~~

手動では、期限が延びた！めでたし、めでたし。

#根本対策
自動更新の設定をしたいのですが、まだ方法が見つかりません。
certbot-auto renew とかすればいいいのだろうか？　時間があるときに試してみます。
markdown, Redmineのリンクを、相対パスで書きたい

IPアドレスを記載する絶対パスを使用すると、
IPアドレス変更時に、ページに書かれたIPアドレスを手修正する手間が発生するので避けたい。

redmineで相対パスを書く方法が分からなかったので調べました。

# Redmineパス記述方法

| アドレス記述   | 意味                       |
| -------------- | -------------------------- |
| `[[page]](/)`  | サーバーのアドレス         |
| `[[page]](.)`  | 現在のパスからの相対リンク |
| `[[page]](..)` | 一つ上のパスに移動         |

## 記述例

Redmineのページで実行してください。

| アドレス          | 記述方法                      | 記述結果                    |
| ----------------- | ----------------------------- | --------------------------- |
| server            | `[[サーバのIPアドレス]](/)`   | [[サーバのIPアドレス]](/)   |
| server/redmine    | `[[redmineのパス]](/redmine)` | [[redmineのパス]](/redmine) |
| 現在地            | `[[現在地]](.)`               | [[現在地]](.)               |
| 現在地/wiki/index | `[[indexページ]](wiki/index)` | [[indexページ]](wiki/index) |

serverは下記に置き換えてください
server=Redmineを立ち上げているサーバのIPアドレス
qiitaで実行した場合は、serverは"qiita.com"になります
【備忘録】Railsでgraphqlのmutationが増えていくとディレクトリがグちゃるので整理したい

##　問題点
実用案件でmutationを黙々と増やしていくと、
`api/app/graphql/mutations/`に以下例のようにファイルが溢れてしまう。

```
(例)
create_user_mutation.rb
update_user_mutation.rb
delete_user_mutation.rb
create_news_mutation.rb
update_news_mutation.rb
delete_news_mutation.rb
create_item_mutation.rb
update_item_mutation.rb
delete_item_mutation.rb
create_catalog_mutation.rb
update_catalog_mutation.rb
delete_catalog_mutation.rb
```

### Generateコマンド
自分はDockerを利用しているため以下のようになりますが、Dockerを利用しない場合は通常のRailsコマンドで大丈夫です。(Userを例に)

```
docker-compose exec 環境名 rails g graphql:mutation Users::UserCreateMutation
docker-compose exec 環境名 rails g graphql:mutation Users::UserUpdateMutation
docker-compose exec 環境名 rails g graphql:mutation Users::UserDeleteMutation
```
*`CreateMutation`だと他階層のCreateMutation命名で被る恐れがあり利用できない模様なので`UserCreateMutation`とする。

### ファイルの確認
`app/graphql/mutations/users/user_create_mutation.rb`
mutation配下にusersのディレクトリが生成され、その配下にmutationのファイルが生成されるので確認。
`/app/graphql/types/mutation_type.rb`

```
field :users/user_create_mutation, mutation: Mutations::Users::UserCreateMutation
```

ファイルに上記のようなfieldが追加されるので、いい感じに修正する。

```
field :users_create_mutation, mutation: Mutations::Users::UserCreateMutation
```

## ひとこと
わたしの調べ方が悪いのか、graphqの文献が少なく雑魚園児には辛み。ゴミのようなメモですみません。
本当にあった怖いClassCastException

```java:テスト対象メソッドのインターフェース
public class Foo {
    public void process(List<String> arg0) {
        /* 後述 */
    }
}
```

```java:自分で書いた適当なテストコード
List<String> arg0 = Arrays.asList("あ", "い", "う");

Foo foo = new Foo();
foo.process(arg0);
```

これが何故か`ClassCastException`で落ちる。
テスト対象のソースを見てビックリ。

```java:なんでわざわざキャストしてんだよ
public void process(List<String> arg0) {
    // ↓なんとコンパイル警告すら出ない！
    List<String> ls = (ArrayList) arg0;

    // 以下略
}
```

コンパイル警告すら出ない恐ろしいコードでしたとさ……

当たり前だけどこっちだと落ちなかった。
（落ちないから良いとは言っていない）

```java:新人が書いたテストコード
List<String> arg0 = new ArrayList<>();
arg0.add("あ");
arg0.add("い");
arg0.add("う");

Foo foo = new Foo();
foo.process(arg0);
```
Amplify Console の Build を CodeBuild から実行する

## はじめに

Amplify Console に Deploy されたアプリを、Amplify Console の Auto-build ではなく、CodeBuild から build を実行する方法です。

## 経緯

2020 年 7 月現在、Amplify Console の build process は、CodePipeline のようにカスタマイズすることができません。

([issue](https://github.com/aws-amplify/amplify-console/issues/103)としては挙がっているようです)

そのため、承認フローを挟む場合は自前の CodeBuild で [aws-amplify-cli](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/amplify/index.html#cli-aws-amplify)を使うか、webhooks を使う形になるかと思います。

本記事では、aws-amplify-cli を使って Amplify を既存の CodeBuild 内で実行する方法について解説します。

## 前提

Amplify, Amplify Console, Codebuild, CodePipeline の使い方については説明しません。
それらのリソースがすでに存在している前提で進めます。

また、Amplify には既に Repository が紐付けられており、 Auto-build が走る状態になっているとします。

## 設定方法

1. Auto-build を無効化する
   - App settings > General > Action > Disable auto build.
   - 参照: [disable automatic builds](https://docs.aws.amazon.com/amplify/latest/userguide/build-settings.html#disable-automatic-builds)
2. CodeBuild の `buildspec.yml` に、aws-amplify-cli を追加する
   - 参照: [start-job](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/amplify/start-job.html)
   - `$YOUR_APP_ID` は適宜設定する (Amplify App の ARN の apps の後ろの文字列)

```yml:buildspec.yml
version: 0.2

phases:
  build:
    commands:
      - |
        aws amplify start-job \
          --app-id $YOUR_APP_ID \
          --branch-name develop \
          --job-type RELEASE
```

## 最後に

割合かんたんに設定することができました。
ただ、Amplify CLI とは別に aws-amplify-cli があることを知らなかったため、調べるのに時間がかかりました。
Amplify CLI では実現できなかった Amplify Console への Deploy も、aws-amplify-cli でできそうですね......!!
rex0220 計算式プラグイン 日付計算

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、翌月・年度計算などの日付計算が簡単にできます。
計算式プラグイン Ver.31 で、日付項目の計算式に日付・日時項目を直接指定できるようになりましたので、日付計算例をまとめてみました。

# 日付計算の編集画面例

「日付」項目を元に、いろいろな日付計算を行っています。

<img width="626" alt="2020-07-03_09h53_41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/614ec69a-0016-e6a6-212d-ab06137a9ede.png">


# 日付計算のプラグイン設定

JavaScript カスタマイズで必須の kintone API イベント（画面表示・項目値変更など）を意識することなく、日付の計算式を記述できます。
計算式には、関数と項目のフィールドコードを指定します。

<img width="846" alt="2020-07-03_09h58_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cbcc0bd1-f0e6-085a-8f6b-765533aa84a7.png">


# 日付の計算式

日付項目を計算式にそのまま指定すると、1970-01-01 を起点に秒換算した数値として扱います。

- 日付A：日付
    - 日付項目に「日付」と同じ値を設定する場合、項目をそのまま指定できます。
- 数値：日付
    - 数値項目に「日付」を指定すると、日付が秒単位に換算されます。
- 年：DATE_FORMAT(日付,"YYYY")
- 月：DATE_FORMAT(日付,"M")
- 日：DATE_FORMAT(日付,"D")
- 年月日：DATE_FORMAT(日付,"YYYY年M月D日")


DATE_ADD 関数で、計算

- 前日：DATE_ADD(日付,-1,"day")
- 翌日：DATE_ADD(日付,1,"day")
- 前月：DATE_ADD(日付,-1,"month")
- 翌月：DATE_ADD(日付,1,"month")
- 前年：DATE_ADD(日付,-1,"year")
- 翌年：DATE_ADD(日付,1,"year")

月末・年末等

- 月初：DATE_FORMAT(日付,"YYYY-MM-01")
- 月末：DATE_ENDOF(日付,"month")
- 翌月末：DATE_ENDOF(DATE_ADD(日付,1,"month"),"month")
- 翌々月末：DATE_ENDOF(DATE_ADD(日付,2,"month"),"month")
- 年初：DATE_FORMAT(日付,"YYYY-01-01")
- 年末：DATE_ENDOF(日付,"year")

年度計算も関数の組合せでOK　※「年度始め」に月を指定

- 年度：DATE_ADD(日付,1-年度始め,"month","YYYY")
- 年度初日：DATE_ADD(日付,1-年度始め,"month","YYYY-")&
RIGHT("0"&年度始め,2)&"-01"
- 年度末日：DATE_ADD(DATE_ADD(日付,13-年度始め,"month","YYYY-")&RIGHT("0"&年度始め,2)&"-01",-1,"day")

# テーブル内項目の日付計算

日付Tに、数値Tと年月区分で日付計算する例です。
値の変更や行追加時も自動的に、計算されます。

※ 2020/01/30 に、+1月すると、2020/02/29 と２月の月末として計算されます。

<img width="425" alt="2020-07-03_11h43_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/afc85bc2-1d5f-6ef6-f980-68ce37ea07cf.png">

# テーブル内項目の計算式設定例

日付計算：DATE_ADD(日付T,数値T,SWITCH(年月日区分,"年","year","月","month","day"))

※ SWITCH 関数で、"年", "月", "日"を "year", "month", "day" に変換しています。

<img width="977" alt="2020-07-03_11h43_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8f2127dd-06a1-8069-bcc3-933b2bd86490.png">

# あとがき

kintone で、日付計算しようとするとかなり面倒ですが、計算式プラグインで簡単に指定できます。
未送付のfreee請求書一覧を定期通知する

# はじめに

バックオフィス業務として、請求書をお客様に送付するタイミングがあると思います。
freee上で請求書を作成したけど、送付し忘れてた！なんてことを予防するために、未送付の請求書一覧を定期的にslack通知できると便利ではないでしょうか。

というわけで本項では上記の仕組みについて説明したいと思います。
こちらC#を利用して実装しているので、一部C#も含めた説明になります。

## 未送付のfreee請求書一覧を取得する

freee APIのうち、GET /api/1/invoices を用いることで取得することが出来ます。
https://developer.freee.co.jp/docs/accounting/reference#/Invoices/get_invoices

invoice_status(請求書のステータス)に"unsubmitted"を指定することで、送付待ちの請求書一覧を取得することが可能です。

https://developer.freee.co.jp/release-note/2948
詳細は上記、2-5 請求書ステータスの変更(C10)参照ですが、2020/12のAPI仕様変更に伴い送付待ちの請求書一覧が取得可能になります。
API切り替えまでの間に新API仕様でコールする場合は上記を元にリクエストヘッダを指定する必要がありますのでご注意ください。

```
// freee-accounting-sdk-csharpを利用した場合の取得
int myCompanyId = 12345678;

string invoiceStatus = "unsubmitted";
string description = null;
string paymentStatus = null;

var invoiceApi = new InvoicesApi(config);

var invoices = await invoiceApi.GetInvoicesAsync(myCompanyId, null, null, null, null, null, null, null, description, invoiceStatus, paymentStatus, null);
```

[freee-accounting-sdk-csharp](https://github.com/freee/freee-accounting-sdk-csharp)を用いる場合は上記のような呼び出し方になります。
(2020/07/03時点では、先述した新API仕様に対応していないので、利用の際はSDKに手を加えましょう)

## 未送付の請求書一覧の中で、一定日数経過した請求書を取得する(絞り込む)

GET /api/1/invoicesのstart_issue_date/end_issue_dateを指定すれば取れそうですが、自分の指定の仕方がまずいのか意図したとおり取れなかったので、自前でチェックします。
start_issue_dateには請求日がyyyy-MM-ddのフォーマットで入っています。

こちらの日付と現在日付を比較することによって、経過日数を取得することが可能です。

```
// JSTの現在日付の取得
TimeZoneInfo jstZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime jstDate = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, jstZone).Date;
```

```
// 時間差分の算出
DateTime issueJstDate = DateTime.ParseExact(invoice.IssueDate, "yyyy-MM-dd", null);
TimeSpan elapsedTime = jstDate - issueJstDate;
```

このあと、例えば```elapsedTime.TotalDays >= 1```のようにすれば1日以上経過した請求書であることが判定できます。

## 通知の仕組み

弊社では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)を利用します。

通知先のテキストに、```https://secure.freee.co.jp/docs_v2/invoice/{invoice.Id}```を含めることによって、slackからすぐに請求書へ飛べるので便利かなーと思います。

## 定期的に実行するための仕組み

上記で用意した処理を定期的に呼ぶための仕掛けが必要になります。
ここは何でもよいですが、[Azure Functionsのタイマ関数](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer?tabs=csharp)を利用しています。

```
[FunctionName("invoiceNotification")]
public async void Run([TimerTrigger("0 30 12 * * 1-5")] TimerInfo myTimer, ILogger log)
{
　 (上記で説明した処理を呼び出す）
}
```

この例では、```0 30 12 * * 1-5```とトリガが設定されていますが、月-金12:30に処理が呼び出されます。
なので、午後に未送付の請求書を送ってしまおう！という感じの運用ですね。

## こんな感じで毎日(月-金)通知されます
![notificate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153845/3a232bec-8ba0-fc46-60d6-4783c2c8eb6e.png)

## その他
特定の請求書に絞り込みたい場合は、請求書の概要(description)に値を入れておいて、請求書検索時はdescriptionを指定すると絞り込むことが可能です。
複数の業務の請求書を扱っている場合は、そちらを用いて請求書を分類することで、その請求書に関係するメンバーのみjoinしているslack chに通知するといったことも出来るので、そちらが望ましいでしょう。
Power QueryでPythonに引数を渡して実行する


Power QueryでPythonにパラメーターを渡して実行する方法があります。試しにこんなコードを書いてみます。

```argv2table.py
import pandas as pd
import csv
my_argv = [r'MY_ARGVS']
l = list(csv.reader(my_argv, delimiter=' '))[0]
df = pd.DataFrame(l, columns=['argv'])
```
ここで注意したいのは、冒頭の``MY_ARGVS``の部分は後々置換対象となるので、コード中に二度と登場させてはいけないということです。

Power Queryではこう書きます

```
(argv) =>
    let
        Source = Text.FromBinary(File.Contents("c:\temp\argv2table.py")),
        rep = Text.Replace(Source, "MY_ARGVS", argv),
        pyexe = Python.Execute(rep),
        df1 = pyexe{[Name="df"]}[Value]
    in
        df1
```
こちらを実行して、適当なパラメーターをスペース区切りで入れてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157693/8939817f-b5b9-d69f-6b72-9b75a2f60d22.png)
こんなふうに、各パラメータから構成されるテーブルが返されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157693/57cb2cf7-c821-2830-3d80-0b7a3142f91d.png)
csv.readerで分割しているので、ダブルクォーテーションによる引用も可能です。Power BIのParameterを渡せば、レポート画面からPythonに渡す引数を変えることもできますね。
ただ、まいどまいどPermissionを尋ねられるので実用性は疑問です。
mackerel で特定プロセスのメモリ使用率やCPU使用量を監視

# はじめに
mackerel でサーバ監視をするときに、特定プロセスのメモリ使用率やCPU使用率を監視したいんだけど、デフォルトのものになさそうなので探してみた


# モジュール
ググったら出てきました
さすがです、先人の人が作ってくれていました
https://tkuchiki.hatenablog.com/entry/2016/03/25/154617

モジュールのダウンロード
https://github.com/tkuchiki/mackerel-plugin-linux-proc-stats/releases


#使い方
https://github.com/tkuchiki/mackerel-plugin-linux-proc-stats/blob/master/README.md

上記のREADMEに書いている通りですが、以下の通りで実行できます。
プロセスパターンとかも利用できますが、PIDを指定するのが楽なので、これでいいです。
「-follow-child-processes」をつけると子プロセスまでも含めて計測してくれます。


```bash
/usr/bin/mackerel-plugin-linux-proc-stats  -pidfile ＜PIDファイル＞ -follow-child-processes
```

または

```
/usr/bin/mackerel-plugin-linux-proc-stats  -pid　＜PID＞ -follow-child-processes
```

# mackerel で監視
簡単です。「使い方」で書いたコマンドを設定ファイル（mackerel-agent.conf）に追記して再起動するだけです


## mackerel agent の設定
/etc/mackerel-agent/mackerel-agent.conf に以下の設定を

```
[plugin.metrics.linux_proc_stats]
command = "/usr/bin/mackerel-plugin-linux-proc-stats  -pidfile ＜PIDファイル＞ -follow-child-processes"
```

## mackerel agent の再起動

```
# systemctl restart mackerel-agent
```

## 確認
カスタムメトリクスのところに以下のように出てくる
表は上から以下の通りになってます。

* CPU使用率
* メモリ使用量
* プロセス数


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/5f12c498-2939-b7df-ae38-70a35297f821.png)
MacBook Proでスピーカーからノイズが出るようになった時に試したこと

### ※以下で紹介する操作で一時的に解決はしましたが、根本的な原因はよくわかっていません。

# 環境
* MacBook Pro (15-inch, 2018)
* macOS Catalina 10.15.5

# 現象
* Youtubeやミュージックアプリで音楽を聞いていると、ノイズが入るようになった。
* ラジオで例えると、電波が悪くなってぶつぶつ途切れる感じ。
* 2ヶ月くらいの間に、2回発生。
* スピーカーだけでなく、イヤホンでも同じようにノイズが聞こえる

# （一時的な)解決策
## PCを再起動する
困った時の再起動で、解決しました。
1回目に発生した時は、特に作業中ではなかったので、とりあえず再起動してみるか、と思って再起動したら直りました。

## 不要なプロセスを終了させる?
しばらく使っていると、またノイズが発生。
2回目は作業中だったので、しぶしぶ再起動しようと
VSCodeやiOS Simulator、Chromeを手動で閉じていたら、直りました(!?)。

>ちなみに、上記のプロセスを閉じる前にアクティビティモニターでメモリ使用率を見たら、`13/16GB` 使用中でした。また、まずはChromeのタブを整理したのですが、その時はメモリ使用率が`9/16GB`まで下がりましたが、直りませんでした。

# 試してないが、対処法として挙げられていた方法
以下の2つの方法は、PCを再起動する前に直ってしまったので試していませんが、"MacBook speeker noise"とかで検索した時に紹介されていた方法です。

* [Mac の SMC をリセットする方法](https://support.apple.com/ja-jp/HT201295)
* [Mac で NVRAM または PRAM をリセットする](https://support.apple.com/ja-jp/HT204063)

ただ、上記の方法は2つともPCを終了させる必要があるので、再起動で直ったのか、SMCやNVRAMのリセットで直ったのか判別が難しい気がしました。
Github pages と jekyll

# この記事の目的
Github pagesでサイトを公開する時の備忘録です。





## アカウントによる制限

- フリーアカウントの場合
    - Publicなリポジトリでのみサイトを作成できる。
- 有料アカウントの場合
    - public/privateどちらでも。

## 既存のリポジトリから公開手順

### ①index.mdを作成する
マスターブランチのトップディレクトリにindex.mdをpushするだけです。
index.htmlでもいいのですが、mdとすると、jykyllがうまいことジェネレートしてくれるので便利です。

mdはマークダウン記法のファイルですので、[マークダウンチートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)などを参考に作成します。


試しに下記のようなindex.mdを作成してみました。

index.md
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/d5e69c87-33a9-fb57-ce91-379f37e09622.png)


### ②GitHub Pagesの設定をenableにする。
Setting > GitHub Pages　の設定をenableにします。そうするとURLが発行されるのでコピーします。

### ③テーマを選択する。

### ④ブラウザから開く
ブラウザから開けばアクセスできます。


実際の表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/c5192e57-3b22-7a75-fa9c-a4b03ee21628.png)



## リポジトリをprivateからpublicに変換する場合
Setting > Change repository visibility >Make public

## テーマとか設定とかを変える

テーマを選択するとトップディレクトリに`_config.yml`が作成されるので、このファイルをいじれば色々とカスタイマイズ出来ます。
オプションとパラメータは、下記のjekyllのサイトを参考にします。

## ページのタイトルを設定する
yaml フロントマターが使える。
https://jekyllrb.com/docs/front-matter/

index.mdのヘッドに下記を記述すればOKです。

```
---
# YAML Front Matter
title: my first jekyll site
---
```


# 参考

[公式 GitHub PagesとJekyllについて](https://docs.github.com/ja/github/working-with-github-pages/about-github-pages-and-jekyll)

[jykell config](https://jekyllrb.com/docs/configuration/)
Unity Awakeより前にメソッドを呼ぶ

【Unity】ゲームの起動後 Awakeより前にメソッドを実行する
**参考URL：**http://tsubakit1.hateblo.jp/entry/2016/07/29/073000

### １．タイプ指定しない（タイプ指定しないとOnEnableの後に呼び出される）
````
public class BootTest : MonoBehaviour
{
    void Awake()
    {
        Debug.Log("Awake");
    }

    void OnEnable()
    {
        Debug.Log("OnEnable");
    }

    [RuntimeInitializeOnLoadMethod()]
    static void Boot()
    {
        Debug.Log("Boot");
    }

    void Start()
    {
        Debug.Log("Start");
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("Update");
    }
}

````

◆ログ

````
Awake

OnEnable

Boot

Start

Update
````




### ２．タイプ指定する（RuntimeInitializeLoadType.BeforeSceneLoad）
※Awakeより前になる

````
public class BootTest : MonoBehaviour
{
    void Awake()
    {
        Debug.Log("Awake");
    }

    void OnEnable()
    {
        Debug.Log("OnEnable");
    }

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Boot()
    {
        Debug.Log("Boot");
    }

    void Start()
    {
        Debug.Log("Start");
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("Update");
    }
}

````


◆ログ

````
Boot

Awake

OnEnable

Start

Update
````

### ３．タイプ指定するが、Monovihaviorなし（RuntimeInitializeLoadType.BeforeSceneLoad）

````
public class NonMonobehavior
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void Initial()
    {
        Debug.LogError("Initial");
    }

}
````

◆ログ

````
Initial

Boot

Awake

OnEnable

Start

Update
````




※知らない間に呼び出されるので注意が必要、
　知ってないとバグと誤認されるし、この処理にバグがあったら気づくまで大変かも
https://www.urablog.xyz/entry/2018/02/11/164734
JMP ユーザー インタビュー vol.3

![岸本先生.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/5d2caf35-a5ab-d50c-6203-82a5f1d11d78.jpeg)

**岸本 淳司 氏**
**九州大学病院 ARO次世代医療センター 准教授**

**JMPとの出会い**
1989年4月10日に、サンフランシスコで開催されたSUGI（SAS User's Group International）に参加した際、John SallによるJMPの発表に立ち会ったのが、JMPとの出会いです。

**私の意外な一面**
医学部で統計学を教えていますが、実は文学部出身です。趣味は、飛行機に乗って旅行するのがマイブームで、ANAとJALが定期便を就航させているすべての日本の空港に行きました。
また、私はずっと大学に残っていたわけではなく、昔はSAS社に在籍していて統計解析のテクニカルサポートを担当していました。在職中にJohn Sallが来日したことがあり、一緒に富士山に登ったこともあります。

**1.JMPの機能で最も気に入っているものは？**
コンセプトが素晴らしいと思っています。現在、大学でパス図の描き方を教えることがありますが、この描き方を理解すると、さまざまな統計手法を俯瞰的に理解できるようになります。そのような設計思想になっているところが好きです。
JMPの場合は「Fit Y by X」(二変量の関係：Xが原因でYの振る舞いを説明する)というプラットフォームがあって、そこでは応答変数が質的変数なのか量的変数なのかによって最適な手法が自動的に選ばれるところが気に入っています。

**2.初めての仕事は何でしたか？**
大学院生の頃、大型計算機センターでSASによる統計解析をサポートするアルバイトをしていました。

**3.統計に関心をもったきっかけは何でしたか？**
大学１年の前期に線形代数のテストがあって、連立一次方程式を掃き出し法と逆行列を使う方法とCramerの公式の3通りで解けという問題が出ました。手計算で解いたら、全部違う答えになってしまいました(笑)。その時、このような計算を人間にさせてはいけないと思いました。
その年度の後期に、統計学の授業がありました。ある日先生が分散分析の計算問題を黒板に書いて教室を出ていこうとされました。当時パソコンは普及していなかったのですが、私はプログラム電卓を持っていて、先生が問題を書き終わると同時に答えを言ったのです。先生は大層驚かれていました。そんなことで統計の計算をコンピュータでさせるのが面白いと思ったのです。

**4.プロフェッショナルとして、最も誇らしく感じた瞬間は？**
いま私は医師が行う研究のコンサルティングをメインに行っています。その中で論文の査読対策を頼まれることもあります。査読者のコメントは相当高度なものもありますが、その本質をちゃんと理解してもらえるよう説明し、具体的方法を提示します。その後お会いしたとき、「おかげさまで論文が通りました。ありがとうございます。」と感謝されると、たいへんうれしく、また誇らしく感じます。

**5.仕事のどの部分が好きですか？**
コンサルティングでは、医学の専門家が私に全身全霊を込めて説明してくださり、私もそれに一生懸命応えるという全力のぶつかり合いを行っています。そういうところが、この仕事の一番好きな点です。

**6.最近JMPをどのように活用していますか？**
大学での統計教育です。JMPはintuitive(直感的)な操作ができる点がとても素晴らしいです。最近のJMPは多機能になっていますが、私は初期の頃から、「Fit Y by X」（二変量の関係）のプラットフォームを重宝しています。医学では、原因と結果の関係を探りたいのです。JMPなら操作が簡単で、原因の変数を選択して、結果を指定するだけで解析ができます。だから、私は解釈の仕方を中心に教えればよいのです。

**7.JMPを用いた最初のプロジェクトは何でしたか？**
1996年に慶應義塾大学湘南藤沢キャンパスで「多変量解析」という講義を担当しました。それまで不人気科目だった統計学を教えるにあたり、当時販売が始まったばかりで、JMP IN(JMPの学生バージョン)が付録としてついていた『JMP Start Statistics』という本を教科書に指定し、「学生が自分でデータを集め、自分で解析する」という授業スタイルを採用しました。そこに学生が共感してくれたのか、嬉しいことにその講義は学生による評価で1位を取ることができました。翌年にはデータ分析の授業が４クラス平行開催、その次の年に8クラスとなり、湘南藤沢キャンパスのほぼすべての学生が取る授業に成長しました。

**8.JMPの開発者や、John Sallに何か伝えたいことはありますか？**
私はJMPが好きで、JMPの新しい機能については、「お気に入りの作家が新作を書くのを待っている」ような気持ちでいます。新しい機能が追加されるたびに、「おお、今回はその手で来たか」という新鮮な驚きを覚えます。たとえば、JMP 15では共分散構造分析がついに使えるようになり、とてもうれしく思いました。私は、JMPは常にup to dateな存在であって欲しいと思っています。その時点の技術でできることを実現して欲しいと考えています。

**9.将来的に、データサイエンスやアナリティクスの分野は、どのように変化すると思いますか？**
将来、何が主流になるかは分かりません。ただ、データサイエンスもアナリティクスも「役に立つ存在」であって欲しいと願っています。日本では方法論を重視しがちですが、データサイエンスもアナリティクスも現場の研究者の役に立って欲しい。私は、それがアナリティクスのあるべき姿だと思っています。

■	さあ始めよう！
JMPの全機能を30日間試せるトライアル版で、データからさらなる情報を導き出せることを実感してください。
さあ始めましょう。

ダウンロードは[**コチラ！**](https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=td7013Z000002sEGsQAM&utm_source=JMPblog&utm_medium=)
laravel6のIgnition問題

# 概要
システム保守の関係上、[JBNDB](https://jvndb.jvn.jp/)のRSSを常にチェックしているが、先日見た事ないような深刻度の脆弱性が出てきた。
・[Laravel 用の Ignition page における脆弱性](https://jvndb.jvn.jp/ja/contents/2020/JVNDB-2020-006168.html)
<img width="534" alt="スクリーンショット 2020-07-03 10.13.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152189/93b2e7b8-26e4-8dc2-c918-6fbf5616434a.png">
きゅ、、9.8！！！？？？ ( MAX10 )
これはヤバいという事で対応したが、すんなりいかなかった話。
# Ignitionとは
[GitHub](https://github.com/facade/ignition)
laravel6から採用されたComposerパッケージのエラーメッセージ表示ツール。
見易くて綺麗。
Laravel6インストール後composer.jsonを見るとデフォルトで`require-dev`内(development環境)に記載されている。
![68747470733a2f2f6661636164652e6769746875622e696f2f69676e6974696f6e2f73637265656e73686f742e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152189/c0c916af-93f6-a4cc-f996-e798e82e82a9.png)
# 対応方法(失敗)
ignition 2.0.5未満は影響を受ける、とある。
最新にしてみる。

```json:composer.json
{
...
    "require-dev": {
        "facade/ignition": "^2.0.5",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
...
```
しかし、`composer install`で以下のようなエラーが、、、

```bash:
% composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: don't install laravel/framework v6.18.23
    - Conclusion: don't install laravel/framework v6.18.22
...
    - facade/ignition 2.0.5 requires illuminate/support ^7.0|^8.0 -> satisfiable by illuminate/support[7.x-dev, 8.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.10.0, v7.10.1, v7.10.2, v7.10.3, v7.11.0, v7.12.0, v7.13.0, v7.14.0, v7.14.1, v7.15.0, v7.16.0, v7.16.1, v7.17.0, v7.17.1, v7.17.2, v7.18.0, v7.2.0, v7.2.1, v7.2.2, v7.3.0, v7.4.0, v7.5.0, v7.5.1, v7.5.2, v7.6.0, v7.6.1, v7.6.2, v7.7.0, v7.7.1, v7.8.0, v7.8.1, v7.9.0, v7.9.1, v7.9.2].
```
えーと、何、、、**laravel7以降**しかサポートしてない？？
現在システム運用中でignition自体development環境でしかビルドされてないのに7にあげるとかないでしょ、、、
# 対応方法
以下のいずれかが妥当ではないかと思う。

* **Ignitionを捨てる**  
見易くてデバッグしやすいかもしれないが、本番では使わないし、必要ならPHP標準のエラー表示で見たらいい。  
composer.jsonから`"facade/ignition":,`を削除してビルドし直す。
* **Ignitionの代わりにWhoopsを入れる**  
composer.jsonの `"facade/ignition":,` を削除して`"filp/whoops": "^2.7",`を追記し、ビルドし直す。  
※ [Whoops](https://github.com/facade/ignition)とは:  
 * Laravel6未満で採用されていたエラー表示ツール。  
 * 過去に脆弱性は[報告](https://jvndb.jvn.jp/ja/contents/2017/JVNDB-2017-010219.html)されているものの、今は無し。  

***
Whoopsは多少見た目と使い勝手が悪いかもしれないが、必要十分であると思う。
かと言ってWhoopsすら脆弱性ゼロとは言い切れないので、問題を抱えたくないなら削除してもいいんじゃないかと。
javascriptの要素アクセス諸々

## HTML要素のタグ内のドキュメント取得
innerHTML：HTMLタグを含めた文字列
textContent：HTMLタグを除いた文字列

## HTML要素のタグ内のドキュメント設定
textContent：HTMLタグがない場合
HTMLタグ含めたい場合はcreateElementやcreateTextNodeでタグ要素を生成して
appendChildで挿入する

##HTML要素の親子取得

```html
<ul id="login-users">
<li id="suzuki-dhyi">suzuki</li>
<li id="tanaka-ddha">tanaka</li>
<li id="sato-xydu">sato</li>
</ul>
```

```javascript
// ul要素取得
let ul = document.getElementById('login-users');
// 添え字アクセス
let _user = ul.children;
_user[0];
_user[1];
 
// 子要素をループで回す
Array.from(ul.children).forEach(user => {
console.log(user);
});
// 子要素から親要素を取得
let user1 = document.getElementById('suzuki-dhyi');
let par = user1.parentNode;

// 要素内の検索
let tanaka = ul.querySelector('tanaka-ddha');

// 子要素の末尾に追加：appendChild
// 子要素の最初に追加：insertBefore

// 要素の削除：remove
```
【Rails】deviseでログイン機能の実装


# はじめに
deviseの導入手順について説明していきます。
deviseとはログイン機能を実装できるライブラリで、非常に便利です。deviseについてしらない人や、知っている人でも導入手順に自信がない人などの参考になればと思います。


## deviseのインストール
まずはgemファイルにdeviseを追加しましょう。

```:Gemfile
gem 'devise'
```
忘れずににbundle installしておきます。

```:ターミナル
$ bundle install
```
その後deviseのインストールをします。

```:ターミナル
$ rails g devise:install
```
bundle installとdeviseのインストールが必要なので注意しましょう！
インストールを忘れて次に進むとマイグレーションに失敗し、少々面倒になります。
もしそうなった場合でも以下のリンクを参考に解決してください。
https://qiita.com/penguin_note/items/93b00c09c0da1f1a0eab

## Userモデル、usersテーブルの作成

```:ターミナル
$ rails g devise user
```
このコマンドでマイグレーションファイルが作成され、devise用のルーティングが設定されます。

Usersテーブルに追加するカラムがある場合はこの段階でマイグレーションファイルに記述してマイグレーションさせておくと良いです。
（後から追加する場合は変更用のマイグレーションファイルを作成します）

```ruby:xxxxxxxxxxxxxx.devise_create_users.rb
# マイグレーションファイル
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name,               null: false # 追加
      t.string :email,              null: false, default: "" # デフォルトで記載あり
      t.string :encrypted_password, null: false, default: "" # デフォルトで記載あり
      t.integer :group,             null: false # 追加
      # （略）
  end
  # （略）
end
```
マイグレーションファイルの内容を確認したらマイグレーションさせておきます。

```:ターミナル
$ rails db:migrate
```

## 画面確認
Userモデルを作成したときにルーティングは勝手に設定されているので、ターミナルで`rails routes`と打って確認してみましょう。
<img width="1062" alt="4fd5db1d9457fffee84c8e4ea37b72c1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/35084ab9-ffe3-ac0e-19d8-a73da139eade.png">
sessionsがログイン・ログアウトに関するもので、registrationsが新規登録・編集・削除に関するものぐらいに思っておけばOKです。

試しに新規登録画面を見てみます。
registrationsのnewが新規登録ページのアクションなので該当するURIを指定してアクセスします。
ローカルサーバーを立ち上げてブラウザから`http://localhost:3000/users/sign_up`にアクセスしてみましょう。
<img width="380" alt="cf6002a56b4a9d508d8043dc2fb036d4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/a4f604b6-8922-f234-0856-5d0981fe1a5f.png">
ちゃんと新規登録画面が表示されました。

## ビューファイル
初期設定のままでは殺風景すぎるので、いろいろ装飾したいかと思います。
しかし、ビューファイルを探しても該当するものがありません。（たぶんどっかに隠れてる）
なので、ビューファイルを表示させる必要があります。これはターミナルで次のように入力するだけです。

```:ターミナル
$ rails g devise:views
```

これで`app/views/devise`以下に各種ビューファイルが表示されます。
新規登録画面は`app/views/devise/registrations/new.html.erb`、ログイン画面のビューは`app/views/devise/sessions/new.html.erb`が対応しています。

## その他
deviseを導入するといくつか便利なメソッドが使えるようになります。
とりあえず次の２つは覚えておいて良いかと思います。

`user_signed_in?`
ログイン状態かどうかを判定するメソッドです。ログインしていればtrue、していなければfalseを返します。
ifの条件にして、ログインしてなければログインページにリダイレクトさせるなどのように使えます。

`current_user`
ログインしているuserのactive recordを返します。
マイページのpathを指定するときなんかに`current_user.id`とすれば、ログインしているuserのidを返してくれるので便利です。

## 最後に
これだけの操作で新規登録やログインなどの機能を実装できるのは便利すぎます。
deviseの導入は一つのアプリ製作で１回しかやらないので、手順を覚えておくことは難しいと思います。導入の際はこの記事を参考にしてもらえると幸いです。
【Unity/C#】バブルソートとは(コード付き)

#バブルソート(BubbleSort)とは？
バブルソートとは、与えられたデータを大小などの順序通りになるよう並べ替えるソーアルゴリズムの最も基本的な手法の一つです、端から順番に隣接する要素同士を比較・交換していくもの。

#どんな動きをするの？
![Sort.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211130/8cbb293b-dd71-3565-33e6-3198703c1862.gif)


#サンプルコード

```C#
	int[] BubbleSort(int[] _array)
	{
		//配列の回数分回す
		for (int i = 0; i < _array.Length; i++)
		{
			//配列の回数分回す
			for (int j = 0; j < _array.Length; j++)
			{
				//比較元より大きければ入れ替え
				if (_array[i] < _array[j])
				{
					int x = _array[j];
					_array[j] = _array[i];
					_array[i] = x;
				}
			}
		}

		//Sortした結果を返す
		return _array;
	}
```

#豆知識
実はこのバブルソートですがある一文字を変えるだけで劇的に入れかえ回数が変化します。

#バブルソート改

```C#
for (int j = 0; j < _array.Length; j++)
```
この部分を

```C#
for (int j = i; j < _array.Length; j++)
```
とするだけですごく変わります！

#実行結果
![Sort1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211130/c56c6809-3903-3eb0-1256-2c330ce39efa.gif)

#サンプルコード

```C#
	int[] BubbleSort(int[] _array)
	{
		//配列の回数分回す
		for (int i = 0; i < _array.Length; i++)
		{
			//配列の回数分回す
			for (int j = i; j < _array.Length; j++)
			{
				//比較元より大きければ入れ替え
				if (_array[i] < _array[j])
				{
					int x = _array[j];
					_array[j] = _array[i];
					_array[i] = x;
				}
			}
		}

		//Sortした結果を返す
		return _array;
	}
```

#まとめ
たった一か所変更しただけで半分近くに比較する回数を減らすことができました。
みなさんがバブルソートを使う場合このあたりを気を付けましょう。

#追記
コメントにてもっと早くなる方法を記載してくださった方がいらっしゃいましたのでそちらの実行結果とソースをのせます！

```C#
 int[] BubbleSort(int[] _array)
    {
        //配列の回数分回す
        for (int i = 0; i < _array.Length; i++)
        {
            //配列の回数分回す
            for (int j = i+1; j < _array.Length; j++)
            {
                //比較元より大きければ入れ替え
                if (_array[i] < _array[j])
                {
                    int x = _array[j];
                    _array[j] = _array[i];
                    _array[i] = x;
                }
            }
        }

        //Sortした結果を返す
        return _array;
    }
```

![Sort2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211130/4c22ca61-aad7-55e7-4825-a81b2c37eea7.gif)

#まとめ2
少し早くなっていますね！
ソートってこういう少しの変更でも工程数が変化するのがいいですよね。
Amazon Simple Email Service が、アジアパシフィック (東京)リージョンで利用可能に!!!!!!

#[Amazon Simple Email Service が、米国東部 (オハイオ)、アジアパシフィック (シンガポール)、アジアパシフィック (東京)、およびアジアパシフィック (ソウル) リージョンで利用可能に](https://aws.amazon.com/jp/about-aws/whats-new/2020/07/amazon-ses-available-ohio-singapore-tokyo-seoul-regions/)

このリンクだけで話が終わってしまうんですが。

何が凄いって、もうこれで他のサービスは全部東京リージョンなのに、SESだけバージニアとかいう提案書を書かなくてもいい…楽。
~~たまにother serviceとか書いて、リージョン外に置いてる人見かけるけど顧客がグローバルサービスと勘違いするからやめて欲しい~~

ちゃんとap-northeast-1になってる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/fea819fb-b0c5-067f-3ce5-0e41049b271c.png)

**ちゃんとap-northeast-1になってる！！！！**
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/279b4e56-8fd2-1fa1-b51c-3b2f8f5e6c36.jpeg)

最近、AWSが日本リージョンに優しくて嬉しいですね。
Amazon Lexも早くリージョン対応だけじゃなく日本語化対応して欲しい…。

#####おまけ
AWS CLIで東京リージョン指定してSES送っても、ちゃんと届く…!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/2c7e0778-9dcd-02fe-8eac-c922e0a6c0bb.png)
PowerAutomateでドキュメントライブラリ上のファイルのIdを取得する

簡単に。
Power AutomateでExcelのテーブルに行を追加するときにはファイルのIdが必要なのですが、これがちょっと厄介です。
ファイルのメタデータ取得のアクションでも取れないし、手でファイル名を指定してもエラーになります。

実際には ```01A6HJUIMPNU3S3FBUSRBL6CX5S3DQPLPF``` のような文字列を指定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/124f3442-7465-764c-ca39-788676c0715c.png)

そこで、ファイルのIdを取得するために **「SharePointにHTTP要求を送信します」**のアクションを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/8058a47c-9612-3909-c647-1363adbb461d.png)

方法はGET、URIは以下のように指定します。

```
_api/v2.0/drive/root:/test_folder/Test_file.xlsx
```

ここで ```/test_folder/Test_file.xlsx``` は対象のドキュメントライブラリ配下のファイルパスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/3ddf601d-7b9e-e387-9ad8-3eff49b89093.png)

このアクションの結果から、ファイルのIdが取得できます。

```body('アクション名')?['id']``` 式から左の数式を指定することで、ダイナミックにファイルの指定ができます。


以上です。

参考：https://twitter.com/johnnliu/status/1101587916042592256
ESP32をPythonで動かすためにMicroPythonをWindowsで入れる

##MicroPythonをWindowsでESP32に入れる

ESP32はarduinoベースのファームウェアが最初から入っている。これをPythonで書けるようにファームウェアを変更する。

MicroPython参考
<https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/tutorial/intro.html#powering-the-board>

###コマンドプロンプトからpipを利用してesptool.pyをインストールする。
micropythonを入れるための下準備。
`pip install esptool`

###インストールしたesptoolからespのフラッシュを消去。
参考ページには
esptool.py --port /dev/ttyUSB0 erase_flash
とコマンドが書いてあったがここでエラーが発生。
Windowsの場合はポートの名前が違う。
デバイスマネージャからESP32をつないでいるポートを見るとCOM5とあったので、こちらで通してみたところ通った。
Linux/macとポート番号の指定の仕方が違うので戸惑った。

`esptool.py --port COM5 erase_flash`

###次はファームウェアを入れる
これも元のコマンドは

esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-20180511-v1.9.4.bin

と記載があった。
MicropythonのESP32のファームウェアを見に行くといろいろある。
GENERICのunstableでは無い物の中で一番上にある最新版をダウンロードした。
(esp32-idf3-20191220-v1.12.binと書かれているもの)
<https://micropython.org/download/esp32/>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/002a84d2-017a-a638-9c27-c186f4f75627.png)

コマンドプロンプトでダウンロードフォルダへ移動。
`cd Downloads`

ダウンロードしたファームウェアを入れる。
`esptool.py --chip esp32 --port COM5 write_flash -z 0x1000 esp32-idf3-20191220-v1.12.bin`
(portを現在のポートに、0X1000以降をダウンロードしたファームウェアに書き換える。)
----ばっかり出てコネクティングで止まってしまうときはESP32本体のBOOTボタンを押すとインストールが進む。

これでMicroPythonがインストールできた。


##追記

###対話型MicroPython用プロンプトREPLでHelloWorldを表示してみる。
まずデバイスマネージャーで接続されているポートを確認する。
上記とは別日に行ったため今回はCOM3だった。



MicroPython公式ページの手順にのっとってPuTTYをダウンロードしインストールする。
▼PuTTY
<https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/d2bfdddc-0c34-3f69-bd5a-56a5ac742fc3.png)
PuTTYを起動し、Serial lineを現在のポートに、Speedを115200にConnection typeをSerialにしてオープンをクリック。
※公式ページではSpeedについては詳しく書かれていないがSpeedは9600のままだとエラーでうまく表示されない。
![putty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/f0338ff9-9e31-028d-5fac-14c1b924b8d5.png)
本体のリセットボタンを押すとプロンプトが起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/8bf30052-8d9b-f36e-b1ae-54b6836247fe.png)
現在のカーソルの位置に
`print('HelloWorld')`
と入力して下画像の用に帰ってきたらOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/9d78e658-c65c-5e9e-088d-8477e4a511a0.png)








##参考記事
▼ESP32 での MicroPython の始め方
<https://micropython-docs-ja.readthedocs.io/ja/latest/esp32/tutorial/intro.html#powering-the-board>

▼MicroPython REPLプロンプトの表示
<https://micropython-docs-ja.readthedocs.io/ja/latest/pyboard/tutorial/repl.html>

▼ギリギリまでお手軽にMicroPythonでIoTやるための手引書
<https://qiita.com/moomooya/items/ea30fe1113b21ebc9329>