OmniAICreator/Qiita-1.07M huggingface dataset:
Angular を Electron で動かす

Angular を Electron で動かす際の導入方法は色々と記事があるけど、環境やらバージョンの問題で手順が微妙に違って地味につまづいたのでメモ。

ちなみに最終的にたどり着きたいのは Angular のイベントで Electron からローカルファイルの呼び出しというブラウザの越えられない壁を越えるのが目標。

# 環境
```
OS: mac OS Catalina 10.15.4
Angular CLI: 9.1.0
Node: 13.12.0

Angular:
...
Ivy Workspace:

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.901.0
@angular-devkit/core         9.1.0
@angular-devkit/schematics   9.1.0
@schematics/angular          9.1.0
@schematics/update           0.901.0
rxjs                         6.5.4
```

# 構築手順

## Angular プロジェクトの作成

```
ng new sample1
```

で普通に作成。
作成直後に ```/sample1/src/app/app.component.ts``` を開くと、linter が error 吐いて来るので、気になる場合は、手の甲を裏返しにしにて「なんでやん」と滑舌良く発音しながら空中でビシッとした後、下のように修正しておく。

```ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  styleUrls: ['./app.component.scss'],
  templateUrl: './app.component.html',
})
export class AppComponent {
  public title = 'sample1';
}
```

## Electron の追加

```
cd sample1
npm install --save-dev electron@latest
```

で追加（この記事作成時点での latest は 8.2.0）。追加時に npm が

> found 2 low severity vulnerabilities
>   run `npm audit fix` to fix them, or `npm audit` for details

と言ってきたけど実行しても

> 2 vulnerabilities required manual review and could not be updated

と言われるのでそのままに。


## Electron 用の実行 js 追加

sample1 直下に main.js を追加。

```js
const { app, BrowserWindow } = require('electron');
let win;

function createWindow() {

  // ウインドウの作成
  win = new BrowserWindow({
    width: 800
    , height: 400
    , webPreferences: {
      nodeIntegration: true
    }
  })

  // ウインドウに表示する内容
  win.loadFile('dist/sample1/index.html');

  // デバッグ画面表示
  win.webContents.openDevTools();

  // このウインドウが閉じられたときの処理
  win.on('closed', () => {
    win = null;
  })
}

// アプリが初期化されたとき（起動されたとき）
app.on('ready', () => {
  createWindow();
})

// 全ウインドウが閉じられたとき
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
})

// アクティブになったとき（MacだとDockがクリックされたとき）
app.on('activate', () => {
  if (win === null) {
    createWindow();
  }
})
```

## package.json に Electron 用の実行 js 追加

```
{
  "name": "sample1",
  "version": "0.0.0",
  "main": "main.js",
  ≈ 省略 ≈
```


## package.json に Electron 用のビルドコマンド追加

```
≈ 省略 ≈
"scripts": {
  ≈ 省略 ≈
  "start:electron": "ng build --base-href ./ && electron ."
},
≈ 省略 ≈
```

# 実行
```
npm run start:electron
```
で起動。

<img width="686" alt="electron1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322617/ba478d30-1071-fc4c-9380-fd1899e82cab.png">

[次はイベント制御を行う。](https://qiita.com/koronpo/items/8dca72ed1fe74143942e)
AWS EC2 https化

#AWSのEC2インスタンスで起動しているWEBアプリのhttps化について

今回まずhttps化の際に一番始めに参考にさせて頂いたのがコチラ
https://qiita.com/Yuki_Nagaoka/items/3020f02d3fd74c8572a0

ただ、私の場合はnignxの起動時にエラーが出てしまいました。
エラー内容としては
`[emerg] no "ssl_certificate" is defined for the "listen ... ssl" directive in /etc/nginx/nginx.conf:92`

こんな感じでSSL証明書が定義されてないよ！と。。
じゃあ定義すればいいんだよね？
。。。。んー？AWSのACMで証明書発行したけどこれエクスポートできなくね？？
AWSの一次ソースを色々漁ってみてこれかな？と思うものを幾つか試してみたりしました。
しかしうまく行かない。。。

そんな時にテラテイルかな？https化の質問に対して

#「せっかくAWS使ってるなら全部AWSにやらせればいいじゃない？」
と神の一言を発見。
そこからは早かった。
「ELB　httpsリダイレクト」で検索してELBでhttpsレスポンスを返す設定をしてnginxの設定を初期状態に戻して（ドメイン名とかは変更ですよ？）
https化完了！
多分大丈夫、、


転換点としてはnignxを使ってhttpsリダイレクト掛けようと調べていたこと。
まあそれでも設定は簡単な感じでしたけど、AWSのACMで証明書発行した場合はちょっとややこしいのかな？
自分はハマってしまいました。。
#そもそもAWS使うならAWSにできることは最大限AWSを使う
という考えは大事なのかなと今回思いました。
Chromeでajax処理のデバッグをする

## 概要
eccube4では商品をカートに入れる際にajax処理を使っているが、エラーになった時に詳細がわからなくて困っていた。

## 手順
POSTMANを使ったやりかたもあるが、今回はChromeを使った場合の手順。

**デベロッパーツールのネットワークタブを選択**
![Screen Shot 2020-03-31 at 11.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126370/eff6540c-47ea-93ad-b9d5-4910e621a590.png)

この状態でajaxの処理を実行する。
※今回はeccube4の商品詳細のソースなのでjavascriptのリダイレクト処理はコメントアウトなりして無効化しておく必要がある。

```javascript
//window.location.href = "{{ url('cart') }}";
```

Nameのところに新しくファイル？が追加されるのでファイルをクリックしてからHeaderのタブを選択する

![Screen Shot 2020-03-31 at 12.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126370/f211076a-a429-7fec-f34a-f5fa469b9f63.png)

Formで送信されたデータを知りたい時は下の方にスクロールするとFormDataというのがあるのでそこを見ればいい。

プレビューを選択するとSymfonyでお馴染みのエラー画面が出てくるので、そこを修正していけばおｋ！
![Screen Shot 2020-03-31 at 12.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126370/67acb824-16ec-869f-8248-a9411c5c7bdb.png)

これでajaxのエラーと向き合えるね！！
1. LocalStackによるインフラ構築に向けて

# Quick introduction to localstack using localstack-demo

## What is [LocalStack](https://localstack.cloud/) ?

>LocalStack provides an easy-to-use test/mocking framework for developing Cloud applications. It spins up a testing environment on your local machine that provides the same functionality and APIs as the real AWS cloud environment.

## Setting up components

```
conda create -n localstack python=3.5
conda activate localstack
mkdir external-master
cd external-master && git clone https://github.com/good-idea/localstack-demo.git
git clone https://github.com/localstack/localstack.git
pip install awscli
```

## Configuring

```
$aws configure --profile localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: us-east-1
Default output format [None]: json
$ tree .aws
.aws
├── config
└── credentials

0 directories, 2 files
$ cd .aws
$ ls
config		credentials
$ vim credentials
$ vim config
```

## Launching localstack container

```
$ cd external-master/localstack-demo 
$ TMPDIR=/private$TMPDIR \
> DATA_DIR=/tmp/localstack/data \
> SERVICES=apigateway,kinesis,dynamodb,dynamodbstreams,elasticsearch,s3,\
> lambda,sns,sqs,redshift,es,ses,route53,cloudformation,cloudwatch,\
> ssm,secretsmanager,stepfunctions,logs,sts,iam,ec2 \
> docker-compose up -d
Creating network "localstack-demo_default" with the default driver
Creating localstack_demo ... done
```

## Creating S3-bucket

Execute bellow commands after launching localstack.

```
aws --endpoint-url=http://localhost:4572 s3 mb s3://demo-bucket
aws --endpoint-url=http://localhost:4572 s3api put-bucket-acl --bucket demo-bucket --acl public-read
```

Finally, access to http://localhost:8055 and assumed result is bellow.

![スクリーンショット 2020-03-31 午前11.49.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609619/1324c004-8e5a-cfba-78f4-65ce5024d4dc.png)

## How to reproduce(Fastest)

Using pre-setup docker container, we can reproduce environment easily.

```
docker pull yoshinobusekiyu4docker/nova-dev-env:localstack
TMPDIR=/private$TMPDIR DATA_DIR=/tmp/localstack/data SERVICES=apigateway,kinesis,dynamodb,dynamodbstreams,elasticsearch,s3,lambda,sns,sqs,redshift,es,ses,route53,cloudformation,cloudwatch,ssm,secretsmanager,stepfunctions,logs,sts,iam,ec2 
docker run -it -p '4563-4599:4563-4599' -p 8055:8080 yoshinobusekiyu4docker/nova-dev-env:localstack /bin/bash -c "localstack start"
aws --endpoint-url=http://localhost:4572 s3 mb s3://demo-bucket
aws --endpoint-url=http://localhost:4572 s3api put-bucket-acl --bucket demo-bucket --acl public-read
```

# References

* https://qiita.com/mmclsntr/items/709863ba98a4855988f3

* https://qiita.com/libra_lt/items/882d5835f7f2626f19c8
pemファイルとppkファイルの違い

## pemは箱、ppkはファイル
1. pem - **Privacy Enhanced Mail**<br>
暗号化鍵や証明書をを入れておく箱(コンテナ)。
AWSのキーペアはこっち:relaxed:

2. ppk - **PuTTY Private Key files**<br>
こちらは箱ではなくファイル。Windows限定。
WinSCPはこっち:relaxed:

##ppk←→pemの変換
**PuTTYgen**を使って変換する。

- Macの場合

```shell
//puttyをインストールする。
$ brew install putty
//ppk→pemに変換
$ puttygen ファイル名.ppk -O private-openssh -o ファイル名.pem
//接続する
$ ssh -i ファイル名.pem username@hostname
```
- [Windowsの場合](https://ryoheihey.com/information-technology/pem-ppk-2/2019/09/14/525/)
計算サーバのデータのバックアップに関するメモ

# この記事は

ドライブやホストを跨いでバックアップする際の作業メモです。手元のどこかに書いているとそのメモの在りかが分からなくなってしまうのでここに書いています。
状況としては、普段SSH越しに利用している計算サーバ上のデータを、LAN内に置いているNASにバックアップする必要がありました（下の図）。
私個人の環境に合わせて書いているので、必要なところだけ掻い摘んで使ってください。なお、作業はMacのTerminalで行っています。

![LAN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24675/3199fe9d-c6cf-cd3a-9ffe-73f6e8d30c4c.png)


# 作業
## 1. リモートホストのファイルシステムをマウント
sshfsを予めインストールしておく。Linuxならapt-getなどで入るし、Macはbrew caskでインストール可能。
また、マウント用に、適当なディレクトリ（以下ではmountpoint）を作成しておく。

```
$> sshfs username@REMOTEHOST: ~/mountpoint
```

もし、リモートホストのホームディレクトリ（フロントサーバで初めに着地する場所）とは別のファイルシステムに置かれているファイルをsshfs越しに見る必要がある場合は、そこに予めシンボリックリンクを貼っておく。
sshfsはそのままではシンボリックリンクを読めないので、その場合は、`-o follow_symlinks`をsshfsのオプションとして渡す。

```sh
# ssh接続によるリモートホストでの作業
$>　ln -s /ANOTHER_DRIVE/path $HOME/link_to_another_filesystem
```

```sh
# 手元での作業
$> sshfs username@REMOTEHOST: ~/mountpoint -o follow_symlinks
$> cd ~/mountpoint/link_to_another_filesystem # -o follow_symlinksを渡さない場合、これが失敗する
```

## 2. バックアップ先のマウント
必要に応じて追加します。

### NASのマウント
Linuxだと`cifs`というツールをインストールしたらNASをマウントできるようなのだが、どうも書き込みができない。
Macだと新たに何かをインストールする必要はなく、terminalに元から入っている`mount`コマンドでマウント可能。上記のsshfsと同様に、マウント用のディレクトリを作っておく（以下ではmountpoint2）。

```
mount -t smbfs //username@NAS_NAME/path ~/mountpoint2
```

## 3. rsync
### 3.1 同期するファイルを確認する
rsyncのオプションとして`n`を渡すとdry-runとなり、実際の作業はせずバックアップするファイルをリストするだけで終了する。これで、対象となるファイルを確認する。
`--exclude="*.bin"`などで、バイナリなどバックアップから除外するファイルを指定する。

注意する点として、コピー元のディレクトリの指定時に、`src_dir_name/`のようにセパレータ(`/`)をつけた場合、コピー先のディレクトリ内（直下）に、src_dir_nameの子ディレクトリが作られる。
一方、`src_dir_name`のようにセパレータを付けない場合は、コピー先のディレクトリ直下に同名のディレクトリ（ここでいうと、`src_dir_name`）が作られ、その下に子ディレクトリが作られる。

```
rsync -avn ~/mountpoint/src_dir_name ~/mountpoint2/dst_dir_name --exclude="*.bin" 
```

### 3.2 実行
上記で確認して問題なければ、`n`のオプションを外して実行する。

```
rsync -av ~/mountpoint/src_dir_name ~/mountpoint2/dst_dir_name --exclude="*.bin" 
```

#終わりに
何か知見が増えたらここにも追加します。
macでmysqlクライアント使うときの注意点

Catalina で mysql クライント使おうと思った時に設定したことのメモ

# インストール

```bash
$ brew install mysql
```

# my.cnf

homebrewでインストールした場合、my.cnf の場所は `/usr/local/etc/my.cnf` っぽい。

`/etc/my.cnf` とかにはないので注意。

```conf:/usr/local/etc/my.cnf
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
```

初期値はこんな感じ。

日本語使うなら下記の記述を追記

```conf
[mysql]
default-character-set = utf8
```

# リモートサーバー接続するときの注意点

ポートフォワーディングでリモートサーバーのDBに接続しようとした際に、下記のようなErrorが表示された。

```bash
$ mysql -h 127.0.0.1
ERROR 2026 (HY000): SSL connection error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
```

SSL接続を強制されてなければ、`--ssl-mode=DISABLED` をつければOK。

```bash
$ mysql --ssl-mode=DISABLED -h 127.0.0.1
```

接続先のサーバー古すぎるからかも。
[Xcode StoryBoard]よく使うけど忘れてしまう設定項目

## NSTabelViewの模様を縞模様にする
TableViewのAttributeInspectorより、`Alternating Rows`のチェックボックスをオンにする。


## NSTableViewの行幅を変える
TableViewのSizeInspectorより、RowHeightの値を設定する。Explicitのチェックを入れてから外すと自動でセルの高さと揃えてくれる。
しかし、セルの高さを広げてしまうとTableの高さまで変わってしまうので、もとに戻したい場合は上記の方法でもとに戻す。

## 編集可能なNSTableViewにしたい
カラム以下のTableViewCellのBehaviorをNoneからEditableにする。
aws-cliでCognitoのユーザステータスをFORCE_CHANGE_PASSWORDからCONFIRMEDへ変更する

## 実行

```bash
aws cognito-idp admin-set-user-password \
--cli-input-json file://admin-set-user-password.json
```

```json:admin-set-user-password.json
{
    "UserPoolId": "ap-northeast-1_xxxxxxxxx",
    "Username": "username",
    "Password": "password",
    "Permanent": true
}
```

※`Permanent`を`true`にするのが大事

## 参考

* https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-set-user-password.html
* https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html
Fedora CoreOSで/proc/cpuinfoの内容をEC2インスタンスのvCPU数と同じにする設定

EC2 t3.small
Fedora CoreOS stable 31.20200310.3.0

[CoreOS incorrectly reports CPU info via /proc/cpuinfo #413](https://github.com/coreos/fedora-coreos-tracker/issues/413)
>jlebon commented 
>
>Likely due to FCOS disabling SMT when necessary: https://github.com/coreos/fedora-coreos-tracker/blob/master/Design.md#automatically-disable-smt-when-needed-to-address-vulnerabilities. 
>I'm guessing the vCPUs count quoted in EC2 instance types assume hyperthreading.
> 
>cyrus-mc commented 
>
>That appears to be it. Appreciate the quick response.
>
>I updated the kernel options using
>
>rpm-ostree kargs --replace="mitigations=auto"
>Removing nosmt.

```
# CPU ごとのコア数
grep cpu.cores /proc/cpuinfo

# 実行結果
cpu cores   : 1

# カーネルオプションを更新
sudo rpm-ostree kargs --replace="mitigations=auto"

Staging deployment... done
Kernel arguments updated.
Run "systemctl reboot" to start a reboot

# 再起動
sudo systemctl reboot

# 再起動後
# CPU ごとのコア数
grep cpu.cores /proc/cpuinfo

# 実行結果
cpu cores   : 1
cpu cores   : 1
```
Javascript基本集(5)~Mathクラスについて~

#Javascript基本集(5)~Mathについて~

「**Math**」というクラスをご存知でしょうか。
定義した変数などを計算したい場合に、このMathというクラスの中の関数を使って**様々な計算**をすることが出来ます。

##Mathクラスに定義された関数の種類

**Math.〇〇（変数）**というように、下記の関数を〇〇に当てはめて引数に入れた内容を計算する。

・**abs** ： 絶対値の計算
（絶対値とは数値を正・負関係なく考えた時の値。”1″と”-1″は絶対値としては同じ”1″。）
・**round** ： 四捨五入の計算
・**ceil** ： 端数切り上げの計算
・**floor** ： 端数切り捨ての計算
・**max** ： 引数の中で最大の値を返jyouhou返す
・**random**： 乱数を取得
・**sin** ： 正弦(サイン)を計算
・**cos** ： 余弦(コサイン)を計算
・**tan** ： 正接(タンジェント)を計算
・**asin** ： 逆正弦(アークサイン)を計算
・**acos** ： 逆余弦(アークコサイン)を計算
・**atan** ： 逆正接(アークタンジェント)を計算
・**atan2** ： 座標の逆正接(アークタンジェント)を計算
・**sqrt** ： 平方根の計算
・**pow** ： 累乗の計算
・**log** ： 自然対数の計算
・**exp** ： eの累乗の計算

##absで定義されている絶対値の計算結果

**「引数」**　　　**「返り値」**
<img width="377" alt="スクリーンショット 2020-03-31 11.24.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580388/177f7ec0-ae45-05ae-9d6e-22bfdaef46db.png">


参考になる記事はこちらが分かりやすいと思います。
[Mathクラスについて](https://www.javadrive.jp/javascript/math_class/)
Fedora CoreOSのホスト名変更

AWS EC2
Fedora CoreOS stable 31.20200310.3.0

ホスト名変更して、再起動やEC2のインスタンス立ち上げ直しで変更した設定のままであることまで確認

```sh
hostname

# コマンド実行結果
ip-172-31-24-40

# ホスト名変更
sudo hostnamectl set-hostname test-server

hostname

# コマンド実行結果
test-server

# sudo systemctl reboot後
hostname

# コマンド実行結果
test-server

# EC2のインスタンス停止→起動後
hostname

# コマンド実行結果
test-server
```
Fedora CoreOSのTimezone変更

AWS EC2
Fedora CoreOS stable 31.20200310.3.0

タイムゾーン変更して、再起動やEC2のインスタンス立ち上げ直しで変更した設定のままであることまで確認

```sh
timedatectl

# コマンド実行結果
               Local time: 火 2020-03-31 01:37:11 UTC
           Universal time: 火 2020-03-31 01:37:11 UTC
                 RTC time: 火 2020-03-31 01:37:10
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

# タイムゾーン変更
sudo timedatectl set-timezone Asia/Tokyo

timedatectl status

# コマンド実行結果
               Local time: 火 2020-03-31 10:37:31 JST
           Universal time: 火 2020-03-31 01:37:31 UTC
                 RTC time: 火 2020-03-31 01:37:30
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

# sudo systemctl reboot後
timedatectl status

# コマンド実行結果
               Local time: 火 2020-03-31 10:46:39 JST
           Universal time: 火 2020-03-31 01:46:39 UTC
                 RTC time: 火 2020-03-31 01:46:38
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
[core@ip-172-31-24-40 ~]$ date
2020年  3月 31日 火曜日 10:46:47 JST

# EC2のインスタンス停止→起動後
timedatectl status

# コマンド実行結果
               Local time: 火 2020-03-31 10:49:02 JST
           Universal time: 火 2020-03-31 01:49:02 UTC
                 RTC time: 火 2020-03-31 01:49:01
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```
MAMPのApache Serverが起動しない

【追記】PHP7.4.1では正常に使用できているので、下記設定は不要


下記の記事で発生した問題の調査です
[MAMPを起動時に『port '80' which is already used by httpd』が表示された](https://qiita.com/Stchan/items/f94de390fb26ad2aebe2)

MAMPのApache Server が起動しないので調査しました.

下記をそのまま実行するとServerが起動しました。
[windows10でMAMPを起動できない備忘録](https://qiita.com/kumokumo/items/1721b6687aaa4f630dcf)

【具体的な対応箇所】
MAMPの"httpd.conf"ファイルの変更("C:\MAMP\conf\apache\httpd.conf")
下記６か所を変更しました

```
# LoadFile "C:/MAMP/bin/php/php7.3.7/libssh2.dll"
# LoadFile "C:/MAMP/bin/php/php7.3.7/libcrypto-1_1.dll"
# LoadFile "C:/MAMP/bin/php/php7.3.7/libssl-1_1.dll"
# LoadFile "C:/MAMP/bin/php/php7.3.7/nghttp2.dll"
LoadFile "C:/MAMP/bin/php/php7.2.14/libssh2.dll"
LoadFile "C:/MAMP/bin/php/php7.2.14/libcrypto-1_1.dll"
LoadFile "C:/MAMP/bin/php/php7.2.14/libssl-1_1.dll"
LoadFile "C:/MAMP/bin/php/php7.2.14/nghttp2.dll"

------------------------中略--------------------------

# PHPIniDir "C:\MAMP\conf\php7.3.7\php.ini"
# LoadModule php7_module "C:\MAMP\bin\php\php7.3.7\php7apache2_2.dll"
PHPIniDir "C:\MAMP\conf\php7.2.14\php.ini"
LoadModule php7_module "C:\MAMP\bin\php\php7.2.14\php7apache2_2.dll"

```
ChromeでINVALIDエラーが発生しない自己署名証明書の作り方 for WindowsServer

#WindowsServer2016で自己証明証明書を作成
イントラネット上のみで使用するアプリケーションで外部認証局の証明書が必要ない場合、自己署名証明書を作成したりすると思いますが、作り方次第ではブラウザ側で信頼できない証明書と判定されてしまうので困っていました。調べてみるとPowerShellに良いコマンドがあったので証明書の作り方を書き留めます。
##実行環境
Windows10、WindowsServer2016のPowerShell(バージョン5)で実行しています。
WindowsServer2012ではコマンドオプションが異なるので動かないと思います。

##コマンド
New-SelfSignedCertificate を使います。
(詳細な説明は https://docs.microsoft.com/en-us/powershell/module/pkiclient/new-selfsignedcertificate?view=win10-ps)


##記述例
hageはホスト名、hoge.localがイントラネット上のドメイン、有効期間を10年で作成します。

```
New-SelfSignedCertificate -Subject "hage.hoge.local" -DnsName "hage.hoge.local", "hoge.local" 
-CertStoreLocation "cert:\LocalMachine\My" -KeyAlgorithm RSA -KeyLength 2048 
-KeyExportPolicy Exportable -NotAfter (Get-Date).AddYears(10)
```

これで証明書が作成されるので、あとは証明書をあてがうとブラウザ側でエラーが表示されなくなりました。
MAMPを起動時に『port '80' which is already used by httpd』が表示された(別問題発生)

WordPressの開発環境を作るためにMAMPを起動、表題の警告が表示されたので調査した件。
![port80が使われている.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/ce398e89-9baf-25f2-3db4-1697bda45717.png)
[MAMPでサーバー起動しようとしたらエラーに](http://blog.livedoor.jp/nuuuuuuun/archives/3687973.html)
上記を参考にすると『httpd』がボート80番をつかっている。。。あれっ『Apache』？？ ということは『MAMP』？
重複させてしまった？と仮定し、一旦MAMPをアンインストール✧ \(°∀°)// ✧
コマンドラインから『netstat -nao』を実行すると、ポート80が消えている(*・ɜ・ﾉﾉ"☆ﾊﾟﾁﾊﾟﾁ♪
で、再度MAMPをインストールした結果、警告はなくなったがMAMPのApache Serverは起動しない
【補足】[MAMPのApache Serverが起動しない](https://qiita.com/Stchan/items/57c1fa2de08a3fad28db)
　　　　上記で解決しました
Twilio Chatのユーザやチャンネルをすべて削除する

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

みなさん、こんにちは。
KDDIウェブコミュニケーションズのTwilio事業部エバンジェリストの高橋です。

今回は、Twilio Chatを利用しているときに、現在Twilio上に残っているユーザやチャンネルをすべて削除する方法を解説します。

## なぜ削除が必要なのか

Twilio Chatでは、サービスという枠の中に、ユーザとチャンネルが存在します。ユーザは複数のチャンネルに属することができ、そのチャンネル内でやり取りされるメッセージを受け取ることができます。
Twilio上には、過去にやり取りされたメッセージがチャンネル単位で記録されています。課金の単位は、ユーザ数とチャンネル内に保存されたメッセージのストレージ容量です。  

![Twilio Chat概念図](https://raw.githubusercontent.com/mobilebiz/images/master/del-chat-channels-image-01.png "概念図")

無駄な課金を防ぐために、定期的にユーザやチャネルを削除したいことがありますが、管理コンソールではまとめて削除できないために、本プログラムを作成しました。

## 動作環境（多少低くても大丈夫なはず）

- Node.js 10.8.*
- npm 6.14.*

## セットアップ

```sh
git clone https://github.com/mobilebiz/del-chat-channels.git
cd del-chat-channels
npm install
cp .env.sample .env
```

.envファイルをエディタで開き、以下の変数を設定します。

変数名|説明
:--|:--
TWILIO_ACCOUNT_SID|Account Sid（ACから始まる文字列）
TWILIO_AUTH_TOKEN|Auth Token
TWILIO_CHAT_SERVICE_SID|ChatサービスのSID（ISから始まる文字列）

## テスト

実行する前にテストをしてみましょう。

```sh
npm test
```

それぞれの対象件数が0件以上であれば、テストが成功します。テストでは実際の削除はされません。
画面に対象件数も表示されているはずです。

## 実行

ユーザとチャンネルのすべてのデータを削除を実行するには、以下のコマンドを使います。

```sh
npm start
```

チャンネルだけを削除したい場合は、以下のコマンドを使います。

```sh
npm delChannels
```

ユーザだけを削除したい場合は、以下のコマンドを使います。

```sh
npm delUsers
```

## <font color='red'>注意事項</font>

現在継続中のチャットに関しては、すべてのユーザと履歴がなくなりますので注意してください。
本プログラムの利用により発生した問題に関しては、当方ではいかなる責任も負いません。

# まとめ

Twilio Chatは、Twilio Flexの内部でも利用されています。
極稀にLINEやFacebookメッセージがうまくハンドリングできないときなどにも、このプログラムでチャンネルを削除するとうまくいくことがあるので、その時はぜひ試してみてください。

---
### Twilio（トゥイリオ）とは

https://cloudapi.kddi-web.com
Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。
heroku で Active Storage を通して GCS に接続時 Neither PUB key nor PRIV key: nested asn1 error が発生する

＊ローカル環境では正しく接続できている前提です

### ローカルで動いてもherokuで動かない
ローカル環境では正常に接続できていてもherokuにデプロイすると
`Neither PUB key nor PRIV key: nested asn1 error`
が発生する
エラー時のstorage.yml


```ruby:storage.yml
google:
  service: GCS
  credentials:
    type: "service_account"
    project_id: ""
    private_key_id: "<%= Rails.application.credentials.private_key_id %>"
    private_key: "<%= Rails.application.credentials.private_key %>"
    client_email: ""
    client_id: ""
    auth_uri: ""
    token_uri: ""
    auth_provider_x509_cert_url: ""
    client_x509_cert_url: ""
  project: "My First Project"
  bucket: "hogehuga"
```

credentialsを利用して秘密鍵を渡していた
herokuでコンソールを叩いても正常に読み込めている

heroku側で改行がうまくいかないという情報もあったので
`private_key: "<%= Rails.application.credentials.private_key.gsub("\\n", "\n") %>"`
に変更したが、同様のエラーが発生した

### 解決策 直接渡す
storage.ymlを

```
    private_key_id: "<%= ENV['PRIVATE_KEY_ID'] %>"
    private_key: "<%= ENV['PRIVATE_KEY'] %>"
```
`heroku config:set`
でherokuの環境変数に直接秘密鍵をそのまま挿入
これで正常に接続でき、画像の保存と読み込みが行えます

### 結論
credentials から値を持ってくるときにheroku側で何らかの想定しない処理が行われてしまっていると思われる

---
解決はしましたが、詳しい原因が分かっておりません
詳細がわかる方いましたらコメント頂けると幸いです

参考: https://qiita.com/syossan27/items/f67cc3fd24e90b2a819c
Xcodeのアプリケーション名を変更する際は半角スペースはNG

Xcodeのアプリケーション名を変更するとき、半角スペースを入れていたらドハマリしたよ、というお話です。

## そもそもなんのために名前を変更？
業務でXcodeを利用していますが、いくつかのiOSアプリの保守を行っていて、そのうちの一つが古いバージョンのXcodeにしか対応していない（Swiftのバージョンが古い）ことなどが有り、Xcodeについて、最新版と古いものと、2種類をインストールしていました。
このとき、バージョンごとに使い分けができるように、 `Xcode.app` を、 `Xcode 11.3.1.app` と `Xcode 10.2.0.app` のように、バージョン番号を付与することで区別していました。

## 何が起きた？
いい加減、古い環境のアプリをアップデートする必要が出てきたため、プロジェクト内で利用している `cocoapods` 経由でインストールしている外部ライブラリについても更新しようと、久しぶりに Podfile を編集し `pod update` を実行したところ、エラーとなりました。

この辺り、ちょっと記録を残していなかったので曖昧なところなのですが、そもそもはおそらくVPNのネットワーク周り（プロキシの設定など）の問題でTerminalから外部にアクセスできなくなっていたのが問題だったっぽいんですが、エラー解消のため一度環境をきれいにしようと、 gemを使って cocoapods 自体をインストールし直したりしているうちに、ローカルのRuby関連のなにかのパスが見つからない、といった感じのエラーメッセージが出るようになり、 cocoapods 自体をインストールできない、といった感じでどんどんドツボにハマってしまいました…

## 結論
で、結果として、最終的に判明した原因は、タイトルの通り、 `Xcode 11.3.1.app` としていた名前が問題で、これを `Xcode_11.3.1.app` のように変更してやることで、gem関連のコマンドなどもスムーズに通るようになりました。
ターミナル上でパスを指定するときは、たいていは途中に半角スペースがあっても、 `\` を自動的に保管してくれたりするので思いの外原因に気づくのに時間がかかってしまいました。

めったにいないとは思いますが、同じことでお困りの方の参考になれば幸いです。
ROS講座112 不明領域を探索する

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 16.04 |
| ROS | Kinetic |
| Gazebo | 7.14.0 |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
今回は[explore_lite](http://wiki.ros.org/explore_lite)というパッケージを紹介します。
このパッケージはmapを入力にして、未探索領域を抽出してmove_baseに指令してその位置にを目指して移動するものです。
ちょうど前にmove_baseを使ったので、それと接続してみましょう。

# インストール
```shell:explore_liteのインストール
sudo apt install ros-kinetic-explore-lite
```

# ソースコード

```xml:nav_lecture/launch/explore.launch
<launch>
    <group ns="/dtw_robot1">
        <node pkg="explore_lite" type="explore" respawn="false" name="explore" output="screen">
            <param name="robot_base_frame" value="dtw_robot1/base_link"/>
            <param name="costmap_topic" value="map"/>
            <param name="visualize" value="true"/>
        </node>
    </group>
</launch>
```

# 実行

まずmove_baseを起動します。前に使った以下のlaunchを起動します。

```shell:1つ目のターミナル
roslaunch nav_lecture move_base.launch 
```

次にexplore_liteを起動します。

```shell:2つ目のターミナル
roslaunch nav_lecture explore.launch
```

すると未探索領域を抽出してその位置をmove_baseに投げて移動します。未探索領域がなくなると`[ INFO] [...,...]: Exploration stopped.`と表示して終了します。
`/dtw_robot1/explore/frontiers`を表示すると未探索領域を表示するので、動作が分かりやすいです。

![nav_explore.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/0fc2537e-0533-b80b-8b0f-4bca9d938c0b.gif)

# コメント
explore_liteに入れるGridMapは勾配が無く3値（EMPTY,OCCUPIED,UNKNOWN）のマップでないといけないです。
以下の図の左は`/dtw_robot/map`でgmappingの出力で、これは3値のマップなのでexplore_liteで使えます。
したし右の`/dtw_robot1/move_base/global_costmap/costmap`はmove_baseの出力ですが、勾配がついているので3値ではないです。
このexplore_liteのアルゴリズムはEMPTY,UNKNOWNが隣り合っているところを未探索領域と認識するので、勾配のあるコストマップではなく元のマップを入力する必要があります。

![map比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/5d30abd8-8425-1ff4-a7de-e824eeaf6a76.png)


# 参考
[explore_lite](http://wiki.ros.org/explore_lite)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
JavaScriptでHTML要素の読み込み順序からみるを取得する時の注意点

Web初学者です。Ajaxで取得したHTML要素に対して、JavaScriptが効かない現象に直面しました。調べてみると、これは”読み込み順番”と、それに適切なメソッドを使っていないことが原因でした。自分自身が振り返るための意味も含めて、まとめたいと思います。

<h2>そもそもブラウザは、HTMLファイルの上から読み込んでいる</h2>
そもそもブラウザは、HTMLファイルの上から順番に読み込んでいる。
以下の例では、上から順番に読み込んでくる為、「かきくけこ」が読み込まれる前にjsが実行されます。

```html:foo.html
<h2>あいうえお<2>
<script>alert("hogehoge");</script>
<h2>かきくけこp<2>
```

もし、jsを別フィアルに記述して様々なHTML要素を取得して処理を行うとき、そもそもjsが実行される時点でHTML要素が読み込まれていないのは困りますよね。先にHTML要素を全て読み込んでてもらう必要があります。そこで、＜/body＞タグの直前にスクリプトを記述します。こうすれば全ての要素が読み終わってからスクリプトが実行されます。（スマホ普及により、HTMLとスタイルシートを優先的に読み込ませる意味もあるようです。）

<h2>jQueryのready()メソッドは要素の準備ができた段階で実行される</h2>
先ほどの例では、上から順番に読み込んでしまうが故に、要素を取得できないことを示しました。しかし、jQueryのready()メソッドを使用すれば、その問題を解決できます。readyメソッドでは、選択した要素が取得できた時点で、処理を実行します。例えば、

```html:hoge.html
①<script type="text/javascript" src="hoge.js"></script>
  
  <h1 id="piyo">ハローワールド</h1>

②<script type="text/javascript" src="hoge.js"></script>
```

```javascript:hoge.js
$(document).ready(function(){
  $("#piyo").css("color","red");
});
```

スクリプトを①、②のどちらに記述しても実行結果は変わりません。記述場所にかかわらず、要素（id="piyo"）がready(準備OK!)できた時点で、実行されるからです。
ちなみに常識だとは思いますが、$(function(){});は、これの省略系です。”おまじない”じゃなりません！僕はしばらくおまじないとして使ってました。笑

<h2>本題：Ajaxで追加された要素をどう取得するか</h2>
HTML要素は後から追加される場合もある。代表的なのはAjaxによるページの読み込み。追加された新要素に対しては、ready()メソッドだけでは有効ではないです。

そこで使うのが、on()メソッドです。

```html:qiita.html
<h1 id="piyo">ハローワールド</h1>
```

```javascript:qiita.js
$(function(){
    $(document).on('click','#piyo',function() {
        $("#piyo").css("color","red");
    });
});
```

ここではqiita.htmlをajaxで読み込んだと前提します。そのときにon()ならば、無事に要素（id="piyo"）を取得できます。on()メソッドは、セレクターが指定した要素（ここでは$(document)）の内側にある要素("#piyo")が、クリックされたタイミングで、それがイベント発生する要素かどうか、を判断しているからです。(らしいです。)
　※たぶん上記のような書き方はしないと思いますが。。あくまでon()の例です。

<h2>最後に</h2>
jsがうまく働かない場合は、「ちゃんと読み込まれているかな」をまずは疑え！

以上になります。
ご指摘の箇所が多々あると思います。是非コメントよろしくお願いします。

最後まで読んで頂きありがとうございます。
初学者の私ですが、よろしくお願いします。
Restful API #memo

# RFC 7231
- EN: https://tools.ietf.org/html/rfc7231
- JP: https://triple-underscore.github.io/RFC7231-ja.html

## Best Practices for Designing a Pragmatic RESTful API
- EN: https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
- JP: https://qiita.com/mserizawa/items/b833e407d89abd21ee72

# JSON Web Token (JWT)
- JP: https://openid-foundation-japan.github.io/draft-ietf-oauth-json-web-token-11.ja.html
Jestで外部APIをコールしたときに、Error: Headers User-Agent forbiddenが出る件

# はじめに

Nodeのプロジェクトで、Jestを使ってテストコードを書いているときに外部のAPIをコールすると、以下のようなエラーが出てテストが失敗してしまう。

```sh
Network Error

      at createError (node_modules/axios/lib/core/createError.js:16:15)
      at XMLHttpRequest.handleError (node_modules/axios/lib/adapters/xhr.js:83:14)
      at XMLHttpRequest.el.addEventListener.event (node_modules/jsdom/lib/jsdom/living/helpers/create-event-accessor.js:33:32)
      at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:316:27)
      at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:267:3)
      at XMLHttpRequestEventTargetImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:214:9)
      at fireAnEvent (node_modules/jsdom/lib/jsdom/living/helpers/events.js:17:36)
      at requestErrorSteps (node_modules/jsdom/lib/jsdom/living/xhr-utils.js:121:3)
      at dispatchError (node_modules/jsdom/lib/jsdom/living/xhr-utils.js:51:3)
      at validCORSPreflightHeaders (node_modules/jsdom/lib/jsdom/living/xhr-utils.js:91:5)
      at Request.preflightClient.on.resp (node_modules/jsdom/lib/jsdom/living/xhr-utils.js:361:12)
      at Request.onRequestResponse (node_modules/request/request.js:1059:10)

  console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
    Error: Headers User-Agent forbidden
        at dispatchError （以下略）
```

ネットで検索したら、SlackAPIでissueが上がっていた。

[https://github.com/slackapi/node-slack-sdk/issues/655](https://github.com/slackapi/node-slack-sdk/issues/655)

で、結論から言うと、この[記事](https://medium.com/@kevinsimper/how-to-disable-jsdom-in-jest-make-jest-run-twice-as-fast-a01193f23405)にあるように、`package.json`に以下の記述を追加すれば良い。

```json
"jest": {
  "testEnvironment": "node"
},
```

結構ハマったので、記事にしておきました。以上。
TeraTerm でSSH 公開鍵システムを利用した 接続をおこなう

# Windows で Linux マシンへ接続するには。

Linux マシンへ SSH(Secure SHell) を使用してログインするには、以下の方法が考えられます。

- Windows Subsystem for Linux(WSL) を使用する、
- TeraTerm Putty などを使用する。

等が考えられます。今回はこの方法のうちTeraTermを使用して SSH 接続する方法をお伝えします。

あ、SSH の鍵の作り方はこちらを確認、(Linux版)

https://qiita.com/evakichi/items/dad805b89e499739f8e6

Windows のかたはこちらを参照してください。

https://qiita.com/evakichi/items/4f5aa91cd39615d011c2

## TeraTerm のインストール

Google 先生など、検索エンジンで TeraTerm と入力して検索すると、TeraTerm のダウンロードサイトに行きつくともいます。
そこでそれをダウンロードしてインストールします。

## TeraTerm を立ち上げましょう

TeraTerm のインストールが終わったら、早速立ち上げて、繋げてみます。

![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494348/bd14562c-2e33-5208-8431-81a0423c54aa.png)

はじめに、接続したい Linux マシンの IP アドレスか名前を入れて「OK」ボタンを押します。

![002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494348/779457e7-f405-8e4c-4a68-8c71fea7a938.png)

次に、ログインしたい Linux マシンで使用している ユーザ名と SSH 鍵のパスフレーズを入力します。
そして、「認証方式」の欄の[RSA/DSA/ECDSA/ED25519鍵を使う]のラジオボタンを押して、SSH の秘密鍵を読み込ませます。
これで「OK」ボタンを押して認証情報が間違っていなければ、うまく接続できるはずです。

お試しあれ。
oracle12cへログインする時出たOra-28040とora-01017の対応

# 背景
新規案件でOracle12cのデータベースをインフラチーム構築してもらった。
同じタイミングで構築されたAPサーバー（Oracle Client12c）からOracle12Cにログインできたが、いつも使う作業PCからだと以下のエラーが出た。
>ORA-28040: 一致する認証プロトコルがありません

調べた結果、作業PCはOracleClient11gのため、バージョンの不一致は原因でした。
DBサーバー側にあるsqlnet.oraに以下の設定を追加した。
>SQLNET.ALLOWED_LOGON_VERSION=11

が、作業PCからログインしてみると、また以下のエラーが出てログインできなかった。
>ORA-01017: ユーザー名/ パスワードが無効です。ログオンは拒否されました。

# 対応

### ORA-28040の調査＆対応

参考：
https://logic.edchen.org/ora-28040-%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E8%AA%8D%E8%A8%BC%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%AE%E8%A7%A3%E6%B1%BA%E6%96%B9/

11gのクライアントのログインを許可するように、 DBサーバー側にあるsqlnet.oraに以下の設定を追加した。
>SQLNET.ALLOWED_LOGON_VERSION=11

再度ログインすると、以下のエラーが出た！

>ORA-01017: ユーザー名/ パスワードが無効です。ログオンは拒否されました。


### ORA-01017の調査＆対応

参考：
https://stackoverflow.com/questions/41083540/i-cant-login-to-oracle-system-account/45341949#45341949

まずログインユーザのパスワードを確認。

```sql
select DBA_USERS.PASSWORD_VERSIONS from DBA_USERS where USERNAME='ログインユーザ';

PASSWORD_VERSIONS
----------------------------------
12C
```

12Cのため、11gも対応するようにユーザのパスワードを一回変更してみないといけないそうです。

パスワード変更：

```sql
SQL> ALTER USER パスワード IDENTIFIED BY "ログインユーザ";

ユーザーが変更されました。
```
ログインユーザのパスワードを再確認

```sql
select DBA_USERS.PASSWORD_VERSIONS from DBA_USERS where USERNAME='ログインユーザ';

PASSWORD_VERSIONS
----------------------------------
11G 12C
```

これで作業PCから新しく構築したOracle12CのDBサーバーにログインできました！！
Vagrant上で動いているUbuntuに、WindowsからSSH接続する

# はじめに

ゲストOSで、CLIがマルチタスクで使えたら便利だろうと思って、Vagrant環境で動いているUbuntuに対して、WindowsからSSH接続してみる。

# 環境

・ゲストOS
　Vagrant
　Ubuntu 16.04.5 LTS
・ホストOS
　Windows10
・SSHツール
　TeraTerm

# 手順

Vagrant上で動いている、UbuntuのIPアドレスを確認する。
確認するコマンドは、**ifconfig**でも**ip**でもどちらでもOK。

```cmd
ifconfig -a
ip a show
```

**eth1**のIPアドレスが、192.168.33.10である事を確認する。**Vagrantfile**を開くと、確かにこのように設定しているので、その筈です。

```Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
```

因みに、Windows10側のIPアドレスは、192.168.19.187になっており、サブネットのネットワーク部分が、Vagrantfileの指定と異なっていて大丈夫か？と思うが、気にする必要はありません。

**TeraTerm**を起動して、下記を設定して接続します。
`ホスト名に、192.168.33.10`
`TCPポートにSSHのポート番号の22番`
ユーザーIDとパスワードは、`vagrant / vagrant` （※デフォルト設定）

接続OK！
MacOSでフォルダの複写がうまくいかなかった件。

# MacOS同士



## 1.
MacOSのファインダで、フォルダの複写を何度やっても途中で止まってしまいました。
止まるだけで、警告を出してもらえなく、何がなんだかわかりませんでした。

terminalを立ち上げ

cp命令で、フォルダの複写をしたら、
２つファイルが存在しないという警告を出して、
複写は完了しました。

```macOS:bash
cp -r /Users/administrator/ .
cp: /Users/administrator//.config/configstore: unable to copy extended attributes to ./.config/configstore: Permission denied
cp: /Users/administrator//.config/configstore: Permission denied
cp: /Users/administrator//Library/Saved Application State/com.microsoft.Outlook.savedState: No such file or directory
cp: /Users/administrator//Library/IdentityServices: unable to copy extended attributes to ./Library/IdentityServices: Operation not permitted
cp: /Users/administrator//Library/IdentityServices: Operation not permitted
cp: /Users/administrator//Library/WebKit/com.apple.finder/WebsiteData/IndexedDB/v0: directory causes a cycle
cp: /Users/administrator//Library/Developer/Xcode/GPUToolsAgent.sock: Operation not supported on socket
```

# 2

cp命令がなかなか終わらない時には、
どこを現在複写中か探す方法。

```macOS:bash
$ ls -al
...
drwxr-xr-x@  147 administrator  staff        4998  3 31 11:22 AB
-rw-r--r--@    1 administrator  staff      109545  3 31 11:24 C.docx
drwxr-xr-x@ 1203 administrator  staff       40902  3 31 11:37 Downloads
drwxr-xr-x@   29 administrator  staff         986  3 31 11:25 Instagram_files
...
$ cd Downloads
$ ls -al
...
drwxr-xr-x@    5 administrator  staff       170  3 31 11:31 org
drwxr-xr-x@    5 administrator  staff       170  3 31 11:27 pb
drwxr-xr-x@   93 administrator  staff      3162  3 31 11:28 prob

```
っと、最新のフォルダの中をさがしていく。



# 3
複写の途中で許諾確認画面で止まることがある。

# その他

llvm
GNOME

の２つのフォルダがおおきすぎ、複写がおわりそうになかった。

両方とも途中でフォルダを削除した。

ゴミ箱を空にするが、10,000ファイルぐらいに２時間かかって、おわらなかった。

![ごみ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/24b970cf-409e-fc37-1c5b-95b890300274.png)


詳細は順次掲載します。

# WindowsHDDから

Windowsの予備HDDからフォルダごと複写しようとしたら途中でなかなか動かない。

terminalを立ち上げ

cp命令で、フォルダの複写をしたら、

```
$ cp -r /Volumes/Untitled .
cp: /Volumes/Untitled/Backup/Users/administrator/AppData/Local/Microsoft/Windows/UsrClass.dat.LOG2: Operation not permitted
cp: /Volumes/Untitled/Backup/Users/administrator/ntuser.dat.LOG2: Operation not permitted
cp: /Volumes/Untitled/Backup/Users/Default/AppData/Local/Microsoft/Windows/UsrClass.dat.LOG2: Operation not permitted
...
```
# 文書履歴(document history)
ver. 0.01 初稿 20200331
ver. 0.04 URL追記　20230308

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

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

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

Please press the like icon 💚　and follow me for your happy life.
OSの状態を変更する（Vimを使ってSELinuxをOFFにする）



## Linux(UNIX)における設定

LinuxをはじめとするUNIX系のOSでは設定の多くがテキストファイルで定義されています。
そのためOSやミドルウエア等の設定変更は各種設定ファイルを編集することで行うことになります。

設定ファイルの編集にはテキストエディタを利用することになるのですがLinuxの管理はターミナル経由で行われることが一般的であるためGUIベースのエディタは利用できません。そのためCUIベースのエディタの利用が必須となりますが、その最も代表的かつ標準的なものがVi(m)です。

vimは操作に癖があるエディタとして有名ですが、その操作はエンジニアには必須であるためこの機に習得しましょう。

なお、vi(m)の使い方の詳細については、[こちら](https://dotinstall.com/lessons/basic_vim)の外部コンテンツを参考にしてください。

>vimは（設定すれば）Windowsでも利用できますので各自練習してみてください。

## SELinuxを無効にしてみる


ここではSELinuxの設定をONからOFFに変える操作をしてみます。

### 編集ファイルを指定してvi(m)を起動。

管理者権限(sudo)で、ファイル(/etc/selinux/config)を指定してvimを起動します。


```bash
sudo vi /etc/selinux/config
```

ログインして最初にsudoコマンドを利用する際はパスワードを聞かれることがありますので入力します（ユーザーのパスワードです）。

![スクリーンショット 2020-03-31 8.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/9b69e7b1-2de8-c5a2-a0cb-a446361c8127.png "スクリーンショット 2020-03-31 8.25.26.png")


エディタが起動し、ファイルの内容が表示されます。
このときvimは[ノーマルモード]というモードで動作していてこのモードでは編集ができません。


![スクリーンショット_2020-03-31_8_26_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/634297e7-b684-9fcb-d065-6390883bb6da.png "スクリーンショット_2020-03-31_8_26_00.png")

なお、文中に[SELINUX=enforcing]となっている個所があるかと思いますが、この記述によりSELinuxがONになっています。OFFにするにはこの記述を[SELINUX=disabled]にしていきます。



### 入力（挿入）モードに切り替える

文字を入力・編集するためには入力モードに切り替えます。切り替えるためには小文字に[i]を入力します。
すると下部に[INSERT]と表示され入力モードになったことがわかります。


![スクリーンショット_2020-03-31_8_26_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/2e82cc7e-7c86-9c4f-30d0-7e33563a02cd.png "スクリーンショット_2020-03-31_8_26_15.png")


>ESCボタンを押すことでノーマルモードに切り替わります（戻ります）。



### 編集して保存する

矢印ボタンでカーソルを移動させ、enforcingをdisabledに編集します。

![スクリーンショット_2020-03-31_8_27_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/58483574-9e4c-cfba-656e-019133f9b507.png "スクリーンショット_2020-03-31_8_27_00.png")

編集がわ終わったらESCキーを押し、コマンドモードに変更し:(コロン)を入力し、続いてwqと入力します。
:を入力することでコマンドモードに切り替わり、コマンドを受け入れる状態になるのでwq（w:書込み,q:終了）を入力しています。

これで編集が完了しました。


### 編集を破棄して終了する

編集の途中で内容を破棄したい場合があります。その際は、コマンドモードにて、:q!とすることで強制終了されます。

```
:q!
```

## 設定の反映と確認

### OSのリブート

OSレベルでの設定を反映する場合、OSのリブートが必要となるためOSをリブートしてみます。

```bash
sudo shutdown -r now
```

>sudo rebootでもいけるはず。


### 設定反映の確認（SELinuxがOFFになってるか確認）

リブート後再ログインしgetenforceコマンドを叩いてみます。

```bash
getenforce

Disabled
```

Disabledになっていたら正しく設定されているということです。
vistaでkicad その3

#概要

vistaでkicadやってみた。
sketchupで、vrml書いて、kicadで読み込んで見た。

#環境

windows vista 32bit
kicad 4.0.4
sketchup 8

#sketchupでbox書く。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/454e2d8a-d4cd-7a96-55e9-6166a057f044.png)


#skp_to_vrml.rbで出力。


```
#VRML V2.0 utf8
Shape {
  geometry IndexedFaceSet {
    coord Coordinate {
      point [
      1.000000 0.000000 -1.000000 ,
      0.000000 0.000000 -0.000000 ,
      0.000000 0.000000 -1.000000 ,
      0.000000 0.000000 -0.000000 ,
      1.000000 0.000000 -1.000000 ,
      1.000000 0.000000 -0.000000 ,
      1.000000 1.000000 -0.000000 ,
      0.000000 1.000000 -1.000000 ,
      0.000000 1.000000 -0.000000 ,
      0.000000 1.000000 -1.000000 ,
      1.000000 1.000000 -0.000000 ,
      1.000000 1.000000 -1.000000 ,
      1.000000 1.000000 -0.000000 ,
      0.000000 0.000000 -0.000000 ,
      1.000000 0.000000 -0.000000 ,
      0.000000 0.000000 -0.000000 ,
      1.000000 1.000000 -0.000000 ,
      0.000000 1.000000 -0.000000 ,
      0.000000 1.000000 -1.000000 ,
      0.000000 0.000000 -0.000000 ,
      0.000000 1.000000 -0.000000 ,
      0.000000 0.000000 -0.000000 ,
      0.000000 1.000000 -1.000000 ,
      0.000000 0.000000 -1.000000 ,
      0.000000 1.000000 -1.000000 ,
      1.000000 0.000000 -1.000000 ,
      0.000000 0.000000 -1.000000 ,
      1.000000 0.000000 -1.000000 ,
      0.000000 1.000000 -1.000000 ,
      1.000000 1.000000 -1.000000 ,
      1.000000 0.000000 -1.000000 ,
      1.000000 1.000000 -0.000000 ,
      1.000000 0.000000 -0.000000 ,
      1.000000 1.000000 -0.000000 ,
      1.000000 0.000000 -1.000000 ,
      1.000000 1.000000 -1.000000 ,
      ]
    }
    coordIndex [
    0, 1, 2, -1,
    3, 4, 5, -1,
    6, 7, 8, -1,
    9, 10, 11, -1,
    12, 13, 14, -1,
    15, 16, 17, -1,
    18, 19, 20, -1,
    21, 22, 23, -1,
    24, 25, 26, -1,
    27, 28, 29, -1,
    30, 31, 32, -1,
    33, 34, 35, -1,
    ]
  }
  appearance Appearance {
    material Material {}
  }
}

```

#kicadでvrmlを読み込む。


![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c4938ea7-c24d-9d0e-ebab-521b5bb66048.png)


以上。
ボタンのレイアウトがうまく決まらなくてこまった

普段はStoryboardを使わずにコードでレイアウトを組むことが多いけど
Storyboardを使ってレイアウトを組んでみたら基本的なこともわからずかなり時間がかかったのでメモ

#カスタムクラスをStoryboardで使う場合
コードで生成したカスタムクラスをStoryboardで使う場合Identity InspectorのClassに使用するカスタムクラスのクラス名を入力してstoryboardとコード側を紐付けますが

<img width="270" alt="スクリーンショット 2020-03-31 8.37.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602389/0382aa10-3cee-7f00-7955-c132ddffc950.png">


UIButtonのカスタムクラスを作成した場合はさらにAttributes InspectorのTypeでCustomを選択する必要があるみたいです

![スクリーンショット 2020-03-31 8.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602389/416d4c4e-97e3-49dc-5a5a-fcb629c8dc9a.png)


参考: https://qiita.com/keygx/items/9cda2b9bd6a4a32c2001
Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する

# 目的

- Laravel6以降のバージョンのアプリでAuthを用いたログイン系の機能を付与する方法をまとめる。

# ちょっとした知識

- Authの機能はLaravel6以降だとデフォルトで用意されなくなった。
- Laravel6以降でAuthの機能を使用したい場合は本作業を実施する必要がある。
- 公式ドキュメントを下記に記載する。
    - [Laravel 7.x 認証](https://readouble.com/laravel/7.x/ja/authentication.html)

# 実施環境

- ハードウェア環境(下記の二つの環境で確認)

| 項目 | 情報 | 備考 | 
| --- | --- | --- |
| OS | macOS Catalina(10.15.3) ||
| ハードウェア | MacBook  Air (11-inch ,2012) ||
| プロセッサ | 1.7 GHz デュアルコアIntel Core i5 ||
| メモリ | 8 GB 1600 MHz DDR3 ||
| グラフィックス | Intel HD Graphics 4000 1536 MB ||

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

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# 前提条件

- お使いのMacにNode.jsがインストールされていること。
    - 未実施の方はこちら→[Mac HomebrewでNode.jsをインストールする](https://qiita.com/miriwo/items/73d1546220f1c091a7d5)
- ローカル開発環境でサーバを起動してブラウザから確認できるLaravel6以上のアプリがあること。
- デフォルトのusersテーブル作成のマイグレーションファイルのマイグレートが完了していること。

# 実施方法概要

1. laravel/uiのインストール
1. Authのファイル取得
1. フロントエンド側でのモジュール組み込み
1. 確認

# 実施方法詳細

1. laravel/uiのインストール
    1. アプリ名ディレクトリで下記コマンドを実行する。(環境にもよるが若干時間がかかる)

        ```terminal
        $ composer require laravel/ui
        ```
1. Authのファイル取得
    1. アプリ名ディレクトリで下記コマンドを実行する。

        ```terminal
        $ php artisan ui vue --auth
        ```
1. フロントエンド側でのモジュール組み込み
    1. アプリ名ディレクトリで下記コマンドを実行する。

        ```terminal
        $ npm install && npm run dev
        ```

1. 確認
    1. ローカルサーバを起動して下記のリンクにアクセスして、ログイン画面が表示される事を確認する。
        - [http://127.0.0.1:8000/login](http://127.0.0.1:8000/login)
CakePHP3で別々のデータベースのテーブルをjoinする方法

## app.phpに接続情報を明記

2つの「datebase_aのcommentsテーブル」と「datebase_bのusersテーブル」が存在するとします。(usersテーブルとcommentsテーブルを別のデータベースで管理するのはあくまで例です)
1つのusersに複数のcommentsが紐づきます。

config/app.phpに接続情報を明記しましょう。

```php:app.php
'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_a', 
        'password' => 'password',
        'database' => 'database_a',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
    'database_b' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_b', 
        'password' => 'password',
        'database' => 'database_b',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
],
```

## モデルに定義

defaultConnectionName()を使いましょう。

```php:UsersTable.php
namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

class EstatesTable extends Table
{
    public static function defaultConnectionName(){
        return 'database_b';
    }

    public function initialize(array $config)
    {
        parent::initialize($config);
        $this->setTable('users');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');
        $this->addBehavior('Timestamp');
    }
}

```

## 別々のデータベースのテーブルをjoin

```php:UsersController.php
$users = $this->Users->find()
    ->join([
        'table' => 'datebase_a.comments',
        'alias' => 'C',
        'type' => 'LEFT',
        'conditions' => 'C.user_id = Users.id',
    ])
    ->toArray();
```

参考:[公式サイト](https://book.cakephp.org/3/ja/orm/table-objects.html#configuring-table-connections)
CakePHP3で複数のデータベースに接続する方法

config/app.phpに接続情報を明記しましょう。

```php:app.php
'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_a', 
        'password' => 'password',
        'database' => 'database_a',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
    'database_b' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_b', 
        'password' => 'password',
        'database' => 'database_b',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
],
```

これでおしまい。

別記事でCakePHP3で別々のデータベースのテーブルをjoinする方法を紹介していますので、気になる方は[こちら](https://qiita.com/yuuta_s/items/2818a4282d92b164bb61)の記事をご覧ください。
データベース名にハイフン(-)入れたらSQL文でエラーになった 【特殊文字】

## データベースの接続時は問題なかった

データベースはMySQLを使用しており、データベース名**「datebase-b」**(仮)のようにしていました。CakePHPを使用しており、接続時は問題ありませんでした。

```php:app.php

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_a', 
        'password' => 'password',
        'database' => 'database_a',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
    'test' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'user_b', 
        'password' => 'password',
        'database' => 'database-b',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
    ],
],
```

## SQL文でエラーになった

今回はポータルサイトであったため、複数のデータベースが存在します。「datebase_aのusersテーブル」と「datebase-bのcommentsテーブル」をjoinする際にSQL文でエラーが発生しました。(usersテーブルとcommentsテーブルを別のデータベースで管理するのはあくまで例です)
下記はCakePHPです。

```php:test.php
$users = $this->Users->find()
    ->join([
        'table' => 'datebase-b.comments',
        'alias' => 'C',
        'type' => 'LEFT',
        'conditions' => 'C.user_id = Users.id',
    ])
    ->toArray();
```

これで**syntax error**になりました。

ちなみにCakePHPを使った複数の接続方法を知りたい方は[こちら]()の記事をご覧ください。

## 解決方法はエスケープ

ハイフン(-)が悪さをしていたみたいです。SQL文でデータベース名をエスケープ(``)したら動きました。

```php:test.php
$users = $this->Users->find()
    ->join([
        'table' => "`portal-oem`.comments",
        'alias' => 'C',
        'type' => 'LEFT',
        'conditions' => 'C.user_id = Users.id',
    ])
    ->toArray();
```

データベース名はよく使うと思うので、定数にしておきましょう。

```php:const.php
define("B", '`database-b`');
```

```php:test.php
$users = $this->Users->find()
    ->join([
        'table' => B.".comments",
        'alias' => 'C',
        'type' => 'LEFT',
        'conditions' => 'C.user_id = Users.id',
    ])
    ->toArray();
```

データベース名で記号を使うときは、有効か一度確認した方が良いですね。

## 参考
- [公式サイト](https://dev.mysql.com/doc/refman/5.6/ja/string-literals.html#character-escape-sequences)
- [phpMyAdminのSQLに付加される「’」に似た記号「`」は何？](https://php1st.com/1184)
- [特殊文字の指定](http://itdoc.hitachi.co.jp/manuals/3020/3020637530/W3750131.HTM)
- [MYSQL バッククオートについて](https://qiita.com/masa_stone22/items/c3ea3b1d81f5d39c7323)