OmniAICreator/Qiita-1.07M huggingface dataset:
VBA初心者がピボットテーブルを作成するメモ

### ピボットテーブル作成
VBAで集計して別シートに張り付けるを考えたけど、ピボットにしたほうが自分でいろいろと加工できるかなと考え、ピボット作成方法をまとめる。

まずは、ピボット用シート作成のVBA。

```vb
'システムID別ピボット用シート作成
Sub CreatePivotTableBySystemId()
    'データシート
    Dim DataS As Worksheet
    'ピボットテーブルを作成するシート
    Dim PivotS As Worksheet
    'ピボットキャッシュ用変数
    Dim PCache As PivotCache

    Set DataS = ThisWorkbook.Worksheets("データ")

    '「データ」シートからピボットキャッシュを作成
    Dim lowRow As Long
    lowRow = ActiveWorkbook.Worksheets("データ").Cells(Rows.Count, 2).End(xlUp).Row
    Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=DataS.Range("B1:E" & lowRow))

    'ピボットテーブル用シートを追加
    Worksheets.Add
    ActiveSheet.Name = "システムID別集計"
    Set PivotS = ThisWorkbook.Worksheets("システムID別集計")

    'ピボットテーブル用シートにピボットテーブル作成
    PCache.CreatePivotTable TableDestination:=PivotS.Range("A1"), TableName:="システムID別集計"
End Sub
```

次に追加したピボット用シートに項目を設定するVBA。

```vb
'システムID別ピボット用シートに項目設定
Sub AddPivotFieldsBySystemId()
    'ピボットテーブルがあるシート
    Dim PivotS As Worksheet

    Set PivotS = ThisWorkbook.Worksheets("システムID別集計")

    'ピボットテーブルに行と列フィールドを追加
    PivotS.PivotTables("システムID別集計").AddFields ColumnFields:=Array("場所"), RowFields:=Array("システムID")

    'ピボットテーブルに値フィールドを追加
    PivotS.PivotTables("システムID別集計").AddDataField Field:=PivotS.PivotTables("システムID別集計").PivotFields("時間"), Function:=xlSum
End Sub
```
GitLabでPipeline blocked. The pipeline for this merge request requires a manual action to proceedと言われマージできない

### 原因

GitLab-ci.ymlファイルにて、手動の実行対象となっているいずれかのjobの`allow_failure`キーワードが`false`になっているにも関わらず、未だ実行がされていないためマージがブロックされていると考えられる。

具体的には、以下のように`when: manual`が有効になっているにも関わらず、`allow_failure: false`としている事が原因と考えられる。

```
deploy:
  stage: deploy
  script:
      - somescript
  when: manual
  allow_failure: false
```

### 対策

`allow_failure: false`を消す。
`allow_failure`のデフォルト値は元々`false`だが、今回のように`when: manual`を設定している場合は、`rules:`構文を使っている場合を除いて`true`となる。

そのため、`allow_failure: false`を消しさえすれば、`true`扱いとなり、CI上で失敗・未実行が許容されるようになるので、未実行でもマージできる。

### 参考文献

[GitLab CI/CD pipeline configuration reference - allow_failure](https://docs.gitlab.com/ee/ci/yaml/#allow_failure)
docker-composeで.sqlファイルが実行されない

## エラー
```sh:コンソール
・・・
ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'
```

## 原因と修正
```yaml:docker-compose.yaml
version: "3"
services:
  mysql:
    ・・・
    volumes:
      - mysql-data:/var/lib/mysql
      - ./build/mysql/init:/docker-entrypoint-initdb.d
    environment:
      MYSQL_DATABASE: sample
      MYSQL_USER: test # root -> test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: test
      TZ: Asia/Tokyo
```
`MYSQL_USER`に`root`を使っていたので、`root`に変更
IBMCloud vSRX (HA) Hardwareリブート時のダウンタイム計測 (Hint&Tips)


# この記事の目的

構築時の検証にて、IBMCloud vSRX(HA)のハードウェア障害時の切り替わりまでのダウンタイムを計測したため、参考情報として共有します。
（[IBMCloud vSRX(HA)障害時のダウンタイム](https://qiita.com/khoshina/items/eab2adaaa73c59cbe395)の記事を参考にさせていただきました。）

本記事ではポータルから<font color="DeepPink">ハード・リブート(即時リブート)</font>による障害テストを実施しました。
ご参考になれば幸いです。


# 環境

* IBMCloud  GatewayAppliance:Juniper vSRX Junos18.4R1-S1.3


# テスト実施および結果
## 1. HAステータスの事前確認

* HW障害発生をさせる前のHAステータスは以下の通りです。
* Node0: Primary / Node1: Secondary となっていることが確認できます。

```
admin@xxx-srx00-vsrx-vSRX-Node0> show chassis cluster status

Cluster ID: 3
Node   Priority Status               Preempt Manual   Monitor-failures

Redundancy group: 0 , Failover count: 1
node0  255      primary              no      yes      None
node1  1        secondary-hold       no      yes      None

Redundancy group: 1 , Failover count: 5
node0  100      primary              yes     no       None
node1  1        secondary            yes     no       None

{primary:node0}
admin@xxx-srx00-vsrx-vSRX-Node0>
```

## 2. HWリブート時を実施

* [クラシック・インフラストラクチャ] -> [Network] -> [GatewayAppliance] を選択し、対象となるvSRXデバイスを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/ef8bdb74-9ca0-f515-2e88-0d4919733aab.png)

* Node0のデバイス詳細に入り、[アクション] -> [リブート] をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/fdb2aa75-3517-4f84-bed8-55f311706a00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/e778141b-de13-7c4b-7981-3e730694c494.png)

* 上記リブートボタンを押下後、数秒程度でポータル画面右上に正常完了したメッセージが表示されます。
* ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/7a2c6391-528b-b8d5-dba4-0e01c0a58155.png)


## 3. 障害断時間の結果

* Ping断時間
<font color="DeepPink">20:22:53 - 20:23:15 (23sec)</font>

```
$ ping 10.193.88.35 | while read pi; do echo "$(date '+[%Y/%m/%d %H:%M:%S]') $pi"; done
[2020/11/15 20:22:49] 64 bytes from 10.193.88.35: icmp_seq=60 ttl=56 time=1.54 ms
[2020/11/15 20:22:50] 64 bytes from 10.193.88.35: icmp_seq=61 ttl=56 time=1.79 ms
[2020/11/15 20:22:51] 64 bytes from 10.193.88.35: icmp_seq=62 ttl=56 time=1.60 ms
[2020/11/15 20:22:52] 64 bytes from 10.193.88.35: icmp_seq=63 ttl=56 time=1.58 ms
[2020/11/15 20:23:16] 64 bytes from 10.193.88.35: icmp_seq=87 ttl=56 time=2.24 ms
[2020/11/15 20:23:17] 64 bytes from 10.193.88.35: icmp_seq=88 ttl=56 time=1.61 ms
[2020/11/15 20:23:18] 64 bytes from 10.193.88.35: icmp_seq=89 ttl=56 time=1.58 ms
```

* Curl(HTTP)断時間 <font color="DeepPink">20:22:55 - 20:23:25 (31sec)</font>

```
$ while true; do date&curl http://10.193.88.35; sleep 1s; done
Sun Nov 15 20:22:53 CST 2020
Hello World!
Sun Nov 15 20:22:54 CST 2020
Hello World!
Sun Nov 15 20:23:26 CST 2020
Hello World!
Sun Nov 15 20:23:27 CST 2020
Hello World!
Sun Nov 15 20:23:28 CST 2020
Hello World!
```

# 最後に

手動でのソフトリブート結果に比べ、ハード・リブートを実施した場合のフェイルオーバ時間は長い通信断の結果となりました。

## 参考記事

* [IBMCloud vSRX(HA)障害時のダウンタイム](https://qiita.com/khoshina/items/eab2adaaa73c59cbe395)
* [vSRX のデフォルト構成について](https://cloud.ibm.com/docs/vsrx?topic=vsrx-understanding-the-vsrx-default-configuration&locale=ja)
【強力バッドハック】長大なTypeScriptをorg-modeで編集する【GASで便利】

# 要約
本稿では以下のことについて説明する。

- GAS（Google Apps Script）のTypeScriptはファイルを１つにしないといけないので、長くなって困っていた
- 以下のように書けば、org-modeで拡縮できて便利

```
/*
* 箇条書き見出し */
```
- これだけで分かった人は読む必要ナシ。

# 前提
GAS（Google Apps Script）をclasp＋Emacs＋TypeScriptで開発するシリーズ。
GASはデフォルトではWeb上で開発するが、Google謹製のツールclaspを使うと、ローカルのテキストエディターで開発できる。
VSCodeが人気だと思うけど、ぼくはEmacsの奴隷だからEmacsでやっている。

GASはデフォルトではJavaScriptだが、claspを使うとTypeScript（以下TS）でも開発できる。
Emacsでtide.elというのを使うと、文法エラーが発生した時点でオンザフライでエラー（赤い波線アンダーライン）や警告（緑の波線アンダーライン）が表示されて便利だ。
また、companyというのを使うと、TypeScriptの予約語やGASのクラス／メソッド等はもちろん、自分で作ったクラスやタイプも途中まで書いてTABで補完してくれる。
タイプが楽なだけでなく、タイプミスも起きないので、手放せない。

GASのTSには弱点があって、ソースを分割できない。
分割してもいいのだが、別のファイルのクラスや変数や関数を参照すると「そんな名前ありません」とtide.elに怒られる。
TSの機能でimportというのを使えばいいのだが、現状GAS/clasp/TSでは対応していないので、数百行以上にも渡る長大なソースファイルを編集することになる。
困る。

# outlineはいまいち
ワークアラウンドとして、outlineモードを使って折りたたんでいた。
outlineモードは好きな記号を箇条書き記号に登録できるので、TS的にコメントになる//@、//@@、//@@@を使っていた。
ある程度使えるのだが、微妙にバグっているみたいで、うまくいかないことがある。
（でもこの考え方は逆にclass、type、functionなどを箇条書き記号に指定して拡縮することが出来る）

# org-modeを使いたい
Emacsでアウトライナーと言えばorg-modeであって、これがEmacsが手放せない理由である。

ぼくは.emacs.d/init.elもorg-modeで管理している。
有名な方法だが、要するにmy-init.orgというファイルの中でelispのコードを

```
#+BEGIN_SRC emacs-lisp :exports both 
(elispのコード)
#+END_SRC
```

というブロックに書いて、編集が済んだらelisp以外を全部削除してinit.elを置き換えるみたいな感じ。

だが、この ```#+BEGIN_SRC〜#+END_SRC``` というブロックを使ってコードを書くやりかたは、GASのTSでは使えなかった。
ブロックごとに違うソースファイルとして認識されるので、あるブロックで定義した名前を別のブロックで参照すると怒られるのである。

# そこで。。
ここで、本稿の要旨であるバッドハックを紹介する。要するに、

```
/*
** 箇条書きの見出し */
```

という形式で、アスタリスクで始まるorg-modeの見出しを ```/*〜*/``` 形式のコメントにしてしまえばいいのである。
これで、慣れ親しんだorg-modeのキーバインドで拡縮、編集できる。
使いやすさも、安定度も、ourlineモードより数段上である。

# 現状の問題
は、Emacsの機能でインデントすると、見出しもインデントの対象になって先頭に空白が入ってしまうのである。
カッコイイ直し方があると思うけど、現状は ```indent-region``` したら ```M-x replace-regexp``` で " +\*"を "*" に置換している。
恥ずかしいバッドハックだが、便利に使っているので紹介した。

他にも、過去記事でGAS＋clasp＋TypeScript＋Emacsの悪戦苦闘の歴史を書いているので参考にしてください。

**（この項終わり）**
AmazonRDS Aurora MySQL Datagripから接続するメモ

# シチュエーション
* EC2のWebアプリで使用
* DBはRDS-Aurora(MySQL)
* EC2コンソールからの接続は出来ている

# 必要なもの
* EC2 経由となるので、EC2への接続情報
    * EC2への接続に用いている秘密鍵（pem）
    * EC2インスタンスのPublic IPv4アドレス
* Aurora MySQL の情報
    * エンドポイント 
        * ~rds.amazonaws.com となっているアレ
        * RDSのインスタンスかDB情報で見つかる。
    * ユーザー名
        * デフォルトだとadminになってますね
    * マスターパスワード
        * 忘れてたら即反映で再設定が必要。

# 設定手順
1. データソース追加
2. SSH設定
3. DBへの接続設定

## データソース追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122819/a9b19637-49cd-e5ff-4874-b99adf263214.png)
左端、＋からデータソースでMySQLを追加。


## SSH Configrations設定
Project Data Sourcesの一番上にカラのプロジェクトが追加されるので
SSH/SSLタブの Use SSH Tunnelにチェックをする。 
右端の『...』でSSH Configrations設定を行う。

| 項目 | 値 |
|:--|:--|
| Host | EC2インスタンスのPublic IPv4アドレス |
| User name  | ec2-user |
| Authentication type  | Key pair |
| Private key file | 秘密鍵(pem)を指定  |
| Passphrase | （設定無し） |

Test Connection してつながればOK
(シチュ的にEC2インスタンスへ繋がっている前提）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122819/48cc080e-0202-8ffa-926b-22a243e55fdd.png)

## DBへの接続
あとはAuroraMySQLへの接続情報を設定すればOK
### データソースの作成
| タブ | 項目 | 内容 |
|:---:|:-----|:-----|
| - | Name | 勝手に入るけど短くしたい |
| - | Comment | お好きなように |
| SSH/SSL | Use SSH Tunnel | チェック＋SSH Configrations設定で作成したものを選択 |
| General | Driver | **Amazon Aurora MySQL** 絶対だぞ！ |
|   | Host | エンドポイント |
|   | User | デフォルトならadminで |
|   | Password | DBのマスタパスワード  |
|   | Database | 設定なしでもOK |
|   | URL | （Hostを入れると自動修正されます） |

TestConnectionでつながる…ハズ

（SSH/SSLタブ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122819/70cea4aa-5337-0f3d-d3a1-8ad4de9ac7a5.png)

（Generalタブ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122819/8ebcf007-0e0e-ef2e-7165-56a1ea0ac82a.png)
Selenium


#Selenium
UIベースでの単体テストの方法

###メインソース
```java
package G_T.OfficeSystem.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class SeleniumTest {
	public static void main(String[] args) {
		SeleniumTest doTest = new SeleniumTest();
		doTest.threadTest();
	}
	void threadTest() {
		ExecutorService pool = Executors.newFixedThreadPool(8);
		RunImpl runImpl = new RunImpl();
		for (int i = 0; i < 3; i++) {
			pool.submit(runImpl);
		}
		pool.shutdown();
	}
	class RunImpl implements Runnable {
		@Override
		public void run() {
			WebDriver driver = new ChromeDriver();
			driver.get("http://localhost:8080/OfficeSystem_Hibernate/Login");
			WebElement userId = driver.findElement(By.id("userId"));
			WebElement email = driver.findElement(By.id("email"));
			WebElement password = driver.findElement(By.id("password"));
			userId.sendKeys("hoang");
			email.sendKeys("hoang1@gmail.com");
			password.sendKeys("1");
			driver.findElement(By.cssSelector(".BUTTON")).click();
			driver.get("http://localhost:8080/OfficeSystem_Hibernate/Chat");
//			driver.close();
		}
	}
}
```

#pom
```
<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-java</artifactId>
			<version>3.9.1</version>
</dependency>
```
###ほかに必要なもの
driveとしてchromedriver.exeが必要
driver.get("http://localhost:8080/OfficeSystem_Hibernate/Login");

（参考資料 https://www.shookuro.com/entry/2019/11/03/16042）
オブジェクト指向って結局なんなん？

#とりあえずオブジェクト指向ってなんなん？
モノ（オブジェクト）の組み合わせでプログラムを動かしていくという考え方です。
アプリケーションは部品から構成されており、部品同士が相互に作用し合うことで全体が動く（歯車が噛み合う）ようなイメージです。

部品が「オブジェクト」であり、相互作用はオブジェクト間で受け渡される「メッセージ」であると考え、
正しいメッセージを正しいオブジェクトへ届けるには『メッセージの送り手が受け手のことを知っている』必要があります。
そして、相手のことを知っている、つまり2つのオブジェクト間に依存関係が発生するということです。
この「依存関係」を管理することこそオブジェクト指向設計であるということです。
![087582.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608770/99cd3d5b-e485-c654-0ff5-3f46be847364.jpeg)
キャッチボールでいうのであれば、大人と子供はお互いの位置を理解しており、
どのくらいの力加減で投げれば相手がキャッチできるかを知っているということになります。（イメージ）

#単一責任って？
一つのクラス、メソッドには一つの責任（仕事）とするべきという考え方で、一つの責任を持ったクラス、メソッドであれば、そのクラスに変更が発生した場合、どんな影響があるか把握しやすいというメリットがあります。逆に複数の責任があると変更による影響を把握しづらいです。

クラスが単一責任になっているか確認するには、一文でクラスを説明することができるかを考えることです。
「それと」「または」が含まれているようであれば責務が複数存在する可能性が高いためリファクタリングの余地ありです。


単一責任を図る1つの目安としては、RailsアプリであればRubocopを導入して走らせてみることです。単一責任を考慮していないアプリであればABC Sizeチェックでひっかかることでしょう。
単一責任は1つのメソッド、クラスに仕事をさせすぎない、細かく分けることで責任を分割し、修正しやすいコードを保つという考え方です。

#依存関係って？
アプリケーションは事あるごとに変更が施されます。
『メッセージの送り手が受け手のことを知っている』という依存関係において変更というものは厄介なものです。

あなたが複数のサービスにキャリアメールでアカウント登録している場合、
キャリアメールアドレスと各サービスは依存関係であるといえます。

```bad.rb
class User
  def twitter
    email = "sample@gmail.com"
  end

  def qiita
    email = "sample@gmail.com"
  end
end

User.new.twitter => "sample@gmail.com"
```



例えば、あなたがケータイのキャリアを変えるとき、電話番号はそのままで変更できるので便利ですが、
キャリアメールは使えなくなってしまいますよね？この変更によってあなたはどのような修正が必要でしょうか？

→キャリアのメールアドレスを使用しているサービス全てにログインしメールアドレスの変更

考えただけでもゾッとしますよね。そしてもっと最悪なのは、あるサービスでメールアドレスの変更し忘れて2年後、passwordも忘れてしまった。passwordを再設定したい、そんな時に再設定用のメールが届くのは、、、
見ることのできない前のメールアドレス…

![108538_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608770/d1287502-22d4-de02-e426-4033fb31cba0.jpeg)


こんな最悪の事態を防ぐにはどうすれば良かったのか、
・そもそもキャリアメールは使わず、gmailにしとけば良かった。
・ある転送サービス（妄想）にメールアドレスを設定し、各サービスはそこからメールアドレスを取得するような仕組みにしておけばよかった。

ということですよね？これら両方に言えること
それは、<b>変更があることを考慮した設定にしておけばよかった</b>ということです。

```good.rb
class User
  attr_reader :email
  def email
    @email = "sample@gmail.com"
  end

  def twitter
    email
  end

  def qiita
    email
  end
end

User.new.twitter => "sample@gmail.com"
```

つまり、転送サービスのメールアドレス１箇所を変更するだけで各サービスのアカウントのメールアドレスが変更されるように、オブジェクト指向のポイントは変更時のことを考えた設計であれということです。


###引数への依存を取り除く

引数が必要なメッセージを送る時、送り手側はそれらの引数についての知識を持たざるを得ません。
この依存は避けられませんが、引数の渡し方によってはもう1つの依存を引き起こしかねません。

```ruby
class Salary
  attr_reader :work_time :hourly_wage :overtime_fee
  def initialize(work_time, hourly_wage, overtime_fee)
    @work_time = work_time
    @hourly_wage = hourly_wage
    @overtime_fee = overtime_fee
  end

 ...

end

Salary.new(
    160,
    1000,
    OvertimeFee.new(20, 1250) 
)

Salary.new(
    :work_time => 160,
    :hourly_wage => 1000,
    :overtime_fee => OvertimeFee.new(20, 1250) 
)
```

上記の引数は、initializeの順番に依存しており、引数の順番を見て何の値かが分からなくなってしまいます。
Hashを用いることで引数の順番への依存は取り除かれ、よりオブジェクト指向に近い渡し方になります。

ただ、毎回Hashを用いることが良いとは限りません。少ない引数でHashを用いることで手間が多くなることもあります。そこの加減はプロ塾と単位での統一ルールなどを設ける必要があるのかもしれません。


##参考

https://www.footchantech.com/post/object-orientation

・『オブジェクト指向設計　実践ガイド』
【TypeORM × PostgreSQL × GraphQL】1分でGraphQLサーバーをたてる

#はじめに
30代未経験からエンジニア転職を目指して勉強中のYNと申します。
タイトルのアーキテクチャによるGraphQLサーバの実装をでまとめました。

#セットアップ
[こちらのCLI](https://github.com/benawad/create-graphql-api)を使います。

```
npx create-graphql-api my-app
cd my-api
```

#PostgreSQLコンテナの起動
今回はPostgreSQLをDockerコンテナで起動して使います。
[（このとき、5432portが被るのでホストでPostgreSQLアプリが停止していることを確認してください)](https://stackoverflow.com/questions/48593016/postgresql-docker-role-does-not-exist)

```docker-compose.yml
version: '3'
services:
  postgres:
    image: 'postgres:11-alpine'
    ports:
      - '5432:5432'
    environment:
      POSTGRES_USER: 'admin'
      POSTGRES_PASSWORD: 'admin'
```
そして起動します。

```
docker-compose up -d
```
#PostgreSQLコンテナへの接続設定を追加
今回使うCLIのデフォルト設定では、開発環境でSQLite、本番環境でPostgreSQLを使うことが想定されています。ここで、試しにもう一つPostgreSQLでの接続を定義してみます。

```src/index.ts
...
(async () => {
  const app = express();

  const options = await getConnectionOptions(
    'example-connection' || process.env.NODE_ENV || 'development' //ここに接続設定を追加
  );
  await createConnection({ ...options, name: 'default' });
...

})();
```

```ormconfig.js
module.exports = [
  {
    name: 'development',
    ...
  },
  {
    name: 'production',
    ...
  },
  {
    name: 'example-connection', // ここに接続設定を追加
    type: 'postgres',
    database: 'admin',
    username: 'admin',
    password: 'admin',
    synchronize: true,
    logging: true,
    entities: ['src/entity/**/*.ts'],
    migrations: ['src/migration/**/*.ts'],
    subscribers: ['src/subscriber/**/*.ts'],
    cli: {
      entitiesDir: 'src/entity',
      migrationsDir: 'src/migration',
      subscribersDir: 'src/subscriber',
    },
  },
];

```
#サーバーを起動
```
yarn start
```
ここまで1分で終わりましたね。CLIに感謝です。
新たにテーブルができたことを確認してみましょう。

```
docker-compose exec postgres psql -U admin

admin=# select * from "user";
 id | firstName | lastName | age 
----+-----------+----------+-----
(0 rows)
```
#Queryを実行
ちゃんとGraphQLのQueryも実行できます。
![スクリーンショット 2020-11-16 17.29.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/76115274-c28b-03ff-f1bb-d95a21ac8695.png)



#参考にさせていただきました。
[Ben Awadさんの動画](https://www.youtube.com/watch?v=WhzIjYQmWvs)。本当に分かりやすく助かります。
pタグのwidthについて

#HTML&CSSで学んだこと

ProgateでHTML&CSSの勉強していたら、要素の中央揃えで躓きました。頭の中の整理とアウトプットの練習という意味で記事を書いてみます。


###要素の中央揃え（ここで躓くとこが初心者っぽい）

この要素たちを（Progateのアイコン:imgタグ, 文章:pタグ）
![スクリーンショット 2020-11-16 16.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863747/420b3942-2b98-52fb-8697-c417eea98f86.png)

中央寄せしたかった
![スクリーンショット 2020-11-16 16.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863747/d23b9788-17e5-758a-e145-9eb4b3d90d28.png)


imgタグはインライン要素、pタグはブロックレベル要素だったはず。とりあえずmargin:0 auto;を試してみるが、変化なし。。結果として、text-align:center;で中央に揃いました。

ここで１つ疑問がありました。marginプロパティをいじってimgが動かないのはわかるけど、pも動かないのはどうして？たしか中央揃えにしたい対象が、インライン要素ならtext-align、ブロックレベル要素ならmarginをいじれば良いはず。

###調べてみた
とりあえず背景色変えてブロックの範囲確認してみました。
![スクリーンショット 2020-11-16 17.07.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863747/c708bf67-ba56-1f5b-65ac-8ed6f9a04935.png)

なんかpタグの範囲が広い。調べてみたところ、ブロックレベル要素の幅はwidthの指定をしない場合、親要素とおなじになる模様。

ということは、pタグのwidthを指定したらmarginいじって中央に寄せられる？

これが
![スクリーンショット 2020-11-16 17.12.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863747/73c8eb68-9a45-5876-f5bb-053db9e0584e.png)

中央に寄った
![スクリーンショット 2020-11-16 17.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863747/0aceb455-176e-2c1d-709a-bfb884bd9557.png)

思ったとおりに、動いてくれました。
[Linux Mint 20]WiFi確認コマンドいろいろ

家の無線ルーターを買い替えたことに合わせ、ルーターの設置場所を色々と変えて家の中の通信状況の改善を図ったのだが、その際、確認に使ったCUIコマンドをまとめた。

### アクセスポイント一覧(nmcli dev wifi)
PCが認識できる無線通信のアクセスポイントの一覧。「SIGNAL」の値は通信状況が良い程大きい値(最大100)で表示されるものであり、電波強度のことでは無いので混同注意。

また、「-f ALL」オプション指定すると全情報が表示されるものの横に長くて見にくいため、必要な項目のみ指定したほうが良い(-f SSID CHAN RATE SIGNAL・・・)

```
$ nmcli dev wifi
IN-USE  BSSID              SSID                              MODE      CHAN  RATE        SIGNAL  BARS  SECURITY  
*       xx:xx:xx:xx:xx:xx  XXXXXXXXXXXXXX                    インフラ  　48    540 Mbit/s  67      ▂▄▆_  WPA2 
:
:  
```

### 通信状態の確認(nmcli c show)
無線(有線も)通信がどのデバイスを経由して接続しているかの一覧。現在接続中の情報の他、これまで接続したことがある情報も表示される。この接続情報は「nm-connection-editor」を実行すると、GUIで編集できる。

```
$ nmcli c show
NAME                   UUID                                  TYPE      DEVICE  
XXXXXXXXXXXXXXX        12345678-abcd-efgh-ijkl-901234567890  wifi      wlp12s0
有線接続 1              21235678-abcd-efgh-ijkl-901234567890  ethernet  --      
```

### 無線通信の電波強度の確認(iwlist scanning)
現在通信中の状況・状態をスキャンしてどどっと表示するコマンド。電波強度は「Signal level」の値で確認できるが、値が大きい方が通信状況が良いことになるので注意(負の値なのでややこしいが、-80より-40の方が良い)。

```
$ iwlist scanning
wlp12s0   Scan completed :
          Cell 01 - Address: xx:xx:xx:xx:xx:xx
                    Channel:48
                    Frequency:5.24 GHz (Channel 48)
                    Quality=52/70  Signal level=-58 dBm  
                    Encryption key:on
                    ESSID:"XXXXXXXXXXXXXX"
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
                              36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
　　　　　　　　　　　　:
```

### 接続中の無線通信デバイスの確認(iw dev)
PCに接続/認識している無線通信デバイスの一覧。無線通信中の場合はチャネルや周波数、SSIDなども確認できる。

```
$ iw dev
phy#0
	Interface wlp12s0
		ifindex 3
		wdev 0x1
		addr xx:xx:xx:xx:xx:xx
		ssid XXXXXXXXXXXXXXX
		type managed
		channel 48 (5240 MHz), width: 20 MHz (no HT), center1: 5240 MHz
		txpower 15.00 dBm

```

### 無線デバイスの詳細情報(iw phy phy# info)
無線デバイスが対応している周波数やチャネル、サポートインタフェースなど詳細な情報を確認できる。内蔵無線デバイスを仮想APにしたかったが、このコマンドによりAPには対応していないことを確認できた。

```
$ iw phy phy0 info
Wiphy phy0
	max # scan SSIDs: 4
	max scan IEs length: 2285 bytes
	max # sched scan SSIDs: 0
	max # match sets: 0
	max # scan plans: 1
     :
	Supported interface modes:
		 * IBSS
		 * managed
		 * monitor
     :
     :
```

### 各種デバイスの状態確認(lsxxx)
無線以外の各種デバイスの確認についてはlsxxx系のコマンドがいろいろある。

```
# 全てのハードウェアの詳細を確認
$ lshw

# CPU
$ lscpu

# メモリ
$ lsmem

# ストレージデバイス
$ lsblk

# PCIデバイス一覧
$ lspci

# USBデバイス一覧
$ lsusb

# PCMCIAデバイス一覧
$ lspcmcia

```

ちなみにMintを入れているFMV-BIBLO MG70Wには珍しいS端子の出力ジャックがついているのだが、lspciを実行したところちゃんとこのデバイスの存在を認識していた。ただ、専用のケーブルがないので、本当に出力されるかはわからない・・・。

```
$ lspci
00:00.0 Host bridge: Intel Corporation Mobile PM965/GM965/GL960 Memory Controller Hub (rev 03)
00:02.0 VGA compatible controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (primary) (rev 03)
00:02.1 Display controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (secondary) (rev 03)　←★これ
：
```
Rで無限混合ガウスモデル実装 (ギブスサンプリング)

# <font color="DarkSlateBlue">記事の目的</font>
この記事の目的は、Rで無限混合ガウスモデルを実装することです。
参考: [ノンパラメトリックベイズ 点過程と統計的機械学習の数理](https://www.amazon.co.jp/%E3%83%8E%E3%83%B3%E3%83%91%E3%83%A9%E3%83%A1%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%83%99%E3%82%A4%E3%82%BA-%E7%82%B9%E9%81%8E%E7%A8%8B%E3%81%A8%E7%B5%B1%E8%A8%88%E7%9A%84%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%B0%E7%90%86-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BD%90%E8%97%A4-%E4%B8%80%E8%AA%A0/dp/4061529153)


# <font color="DarkSlateBlue">目次</font>

<table>
<tr><td><font color="DarkslateBlue">No.<td><font color="DarkslateBlue">目次
<tr><td><font color="DarkslateBlue">1</font><td><a href="#1-モデルの説明">モデルの説明</a>
<tr><td><font color="DarkslateBlue">2<td><a href="#2-データとライブラリ">データとライブラリ</a>
<tr><td><font color="DarkslateBlue">3<td><a href="#3-実装">実装</a>
<tr><td><font color="DarkslateBlue">4<td><a href="4-確認">確認</a>
</table>

# <font color="LimeGreen">1.</font> <font color="DarkSlateBlue">モデルの説明</font>

![IMG_0198.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/1a192ce7-fbed-9b4d-b6b9-0934d4a1c9b0.jpeg)


# <font color="LimeGreen">2.</font> <font color="DarkSlateBlue">データとライブラリ</font>
irisのデータセットを使用します。

```R:
X <- iris[,1:4]
D <- ncol(X)
N <- nrow(X)
library(mvtnorm)
library(MCMCpack)
library(cluster)
```

# <font color="LimeGreen">3.</font> <font color="DarkSlateBlue">実装</font>
```R:
#(1)Kを求める
K <- 1
#(2)muを乱数で初期化
set.seed(100)
mu <- matrix(rep(apply(X,2,mean),each=K)+rnorm(K*D,0,2), nrow=K)
#(3)パラメータ初期値
a0 <- 1
b0 <- 1
alpha0 <- 10
t <- 1
#(4)(ⅰ)-(ⅳ)を繰り返す
max.iter <- 10
a <- a0 + N*D/2
n <- N
mu0 <- as.vector(rmvnorm(1, apply(X,2,mean), diag(D)))
for(s in 1:max.iter){
  #(ⅰ)zのサンプリング
  tmp <- t(apply(mu, 1, function(x) dmvnorm(X, x, diag(D)/t)))*
    as.vector(n/(N-1+alpha0))
  tmp2 <- dmvnorm(X, rmvnorm(1,mu0,diag(D)/t), diag(D)/t)*
    as.vector(alpha0/(N-1+alpha0))
  z <- apply(rbind(tmp,tmp2), 2, function(x) which.max(rmultinom(1,5,x)))
  #k,nの更新
  K <- z %>% unique() %>% length()
  n <- tapply(z, z, length)
  #(ⅱ)mu(µ)のサンプリング
  x.k <-  apply(X, 2, function(x) tapply(x, z, mean))
  mu <- t(apply(cbind(x.k, n), 1,
                function(x) rmvnorm(1, x[D+1]*x[1:(D)]/(x[D+1]+1)+1/(x[D+1]+1)*mu0,
                                    diag(D)/(t*(x[D+1]+1)))))
  #(ⅲ)t(τ)のサンプリング
  b <- b0 + sum(unlist(apply(X, 2, function(x) tapply(x, z, function(x) (x-mean(x))^2))))/2 +
    sum(as.vector(n/(2*(1+n)))*((t(t(x.k)-mu0)%*%(t(x.k)-mu0))*diag(K)))
  t <- rgamma(1, a, b)
}
```

# <font color="LimeGreen">4.</font> <font color="DarkSlateBlue">確認</font>
左が正解で、右が実装の結果です。

```R:
par(mfrow=c(1,2))
clusplot(X, iris[,5], color=TRUE, shade=FALSE, labels=4, lines=0)
clusplot(X, z, color=TRUE, shade=FALSE, labels=4, lines=0)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/497ef7fe-5059-9ce7-8f94-564bc564d7fc.png)
Gormのhas manyなテーブルのAutoMigrate()でneed to define a foreign keyと怒られる

#ドキュメントのhas manyを見る
https://gorm.io/docs/has_many.html
##追記
根本的に間違っていました。
同じような間違いをしている誰かの参考になればと思います。

#エラー内容

```
// Vote model
type Vote struct {
	gorm.Model
	ID          uint
	Title       string
	Description string
	WorkSheets  []Worksheet
}

// Worksheet model
type Worksheet struct {
	gorm.Model
	ID         uint
	Text       string
	VoteNumber uint
}
```

~~VoteのWorksheetsには特に外部キーの指定等をしていません
すると・・・~~

```
invalid field found for struct main.Vote's field WorkSheets,
need to define a foreign key for relations or it need to implement the Valuer/Scanner interface
```
~~外部キーを定義しなさいと怒られます。~~
#改善コード

```
// Vote model
type Vote struct {
	gorm.Model
	ID          uint
	Title       string
	Description string
    //外部キーの定義を追加
	WorkSheets  []Worksheet `gorm:"foreignKey:ID"`
}

// Worksheet model
type Worksheet struct {
	gorm.Model
	ID         uint
	Text       string
	VoteNumber uint
}
```
~~WorksheetのIDを外部キーにしています~~

#本当の解決
```
// Vote model
type Vote struct {
	gorm.Model
	Title       string
	Description string
	WorkSheets  []Worksheet
}

// Worksheet model
type Worksheet struct {
	gorm.Model
	Text       string
  //追加
	VoteID     int
	VoteNumber int
}
```
has manyのmany側に、主キー用のフィールドを追加しておく必要があったようです。
完全に勘違いしていました。
Google Cloud Platformの手書き入力を試した。【結論：困難】

## はじめに

iPadを使って手書き入力した文字をテキスト変換してデータ保存するアプリを作るため、無料で使えるOCRを調査していたところGoogle Cloud Pratform（Cloud Vision API）が見つかりました。
機能を確認してみたので、その結果です。(2020/11時点)
iOS14のPencilkitに手書き入力のテキスト化が導入されたのですが、英語、中国語にしか対応していないため、他の機能を調査していました。

## 結論

2020/11時点では、Google Cloud Pratform（Cloud Vision API）で日本語手書き文字認識は実用レベルには達していないと感じました。
その他の企業のAPIでは有料（結構高額）であれば、機能を提供していますが、個人開発者にとっては厳しいです。

## テスト

こちらのサイトでお試しが可能です。
https://cloud.google.com/vision/docs/handwriting?hl=ja
実装をしなくても試せるので、とてもありがたいです。
以下のサンプルを用いました。
不特定多数の人が入力するので、~~多少汚い~~達筆であっても認識してほしいと思い、以下のサンプルを使用しました。
１．手書き日本語
![手書き文字.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/50160ab3-ca4e-ef9f-c85d-e19f27b50437.jpeg)

２．テキストアルファベット
![UPLOAD FOLDER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/a7df9fec-ea73-9a19-b3f7-9c83f8add06d.png)
（GCPサイトより）

３．テキスト日本語
![プロジェクト情報.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/9ca6c418-f2f7-71b8-ab1a-6c42c8f6f61d.png)

## 手順

GCPのバケットにデータを保存していますが、画像のリンクを作るのが簡単なのでそのようにしています。
１．GCPのプロジェクトを作成
２．バケットを作成し、好きな画像を保存
３．以下のコードで確認

```
{
  "requests": [
    {
      "image": {
        "source": {
          "imageUri": "gs://バケット名/ファイル名"
        }
      },
      "features": [
        {
          "type": "DOCUMENT_TEXT_DETECTION"
        }
      ],
      "imageContext": {
        "languageHints": [
          "ja-t-i0-handwrit"
        ]
    }
  ]
}
```

以下の選択部分にそのままコピペして上書きできます。
EXECUTEボタンをクリックするとGoogleアカウントへのサインインを求められます。 
![スクリーンショット 2021-02-02 18.35.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/2f0ca2c4-a4fb-1aaf-6070-1bc20380b166.png)

## 結果

１．手書き日本語
全然読み取れない。

```
{
  "responses": [
    {
      "textAnnotations": [
        {
          "locale": "und",
          "description": "ch n\n出\n「十\n사\n中\n",
以下省略
```
「"description": "ch n\n出\n「十\n사\n中\n",」のように跡形もございません。

２．テキストアルファベット
読み取れる。

```
{
  "responses": [
    {
      "textAnnotations": [
        {
          "locale": "en",
          "description": "UPLOAD FOLDER\n",
以下省略
```

「"description": "UPLOAD FOLDER\n",」となり、正しく読み取れていました。

３．テキスト日本語
読み取れる。

```
{
  "responses": [
    {
      "textAnnotations": [
        {
          "locale": "ja",
          "description": "プロジェクト情報\n",
以下省略
```

「"description": "プロジェクト情報\n",」となり、正しく読み取れていました。

## まとめ

Google Platformの日本語手書き入力の認識は2020/11時点では実用的には厳しいと判断しました。
一方で、テキストであれば、十分に利用できそうです。
例えば、PDFファイルのテキスト変換には十分に利用できそうです。

その他の無料のAPIも試してみましたが、手書き入力としては満足のいく結果が得られませんでした。
https://ocr-api.hblab.ai/ocr （手書きは不能。テキスト変換は優秀）

有料APIも低額なものを試してみようと思います。
Pencilkitの日本語対応を切に望みます。。

## 参照記事

https://dev.classmethod.jp/articles/crop-ocr-with-lambda-using-cloud-vision-api/
https://techblog.nhn-techorus.com/archives/12925
第5回

\![Ubuntu-20.04.1](<https://img.shields.io/badge/Ubuntu-20.04.1-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。


# やったこと

-   README.orgを編集してemacsに慣れる
-   gitの操作を知る
-   入出力を取り扱う(puts,ARGV)


# putsと出力メソッド

rubyには出力を行うmethodがいろいろあるらしいので色々試してみた

| method| 出力結果      |
|:------|:--------------|
| print | 出力後改行されない|
| puts  | 普通の出力    |
| p     | ダブルクォーテーションが付く|
| pp    | ダブルクォーテーションが付く|
| printf| 出力後改行されない|

pとかppでダブルクォーテーションが付くのは型情報を一緒に出力してるかららしく、数字だと何もつかない


# ARGV

ARGV…配列(argument vector=引数の配列)<br>これを使って入力を受け付けるプログラムを作ってみようというわけで

```ruby
puts "Hello #{ARGV[0]}"
```

というプログラムを書いて

```ruby
> ruby hello_name.rb Oba
```

と打ち込むと

```ruby
Hello Oba
```

と帰ってくる<br>putsで入力された文字列を取得し、Helloの後にくっつけている


# 参考記事

-   [チャート式ruby-I(puts)](<https://qiita.com/daddygongon/items/1b0f0ff3fb9d60418289>)



------
 - **source** ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter5.org
Aspida で Response Header や Status Code を取得する

## 要約
*リクエスト時に $ を付けないと Header や Status が含まれた生のレスポンスデータが手に入る*


`client.v1.hello.$post`
ではなく、
`client.v1.hello.post`

## サンプルコード
Aspida定義
`api/v1/hello/index.ts`

```ts
export interface Methods {
    post: {
        query: {
            "api-version": "2019-9-21" | "2020-11-16"
        };
        reqHeaders: {
            "token": string
        };
        reqBody: {
            "name": string
        };
        resHeaders: {
            status: string
        }
        resBody: {
            state: string
            massage: string
            properties: {
                date: string
                uuid: string
                location: string
            }
        }
    }
}
```

メインコード

```ts
import aspida from '@aspida/axios';
import api from '../api/$api';

const RequestTest = async function () {
    const client = api(aspida())
    const res = client.v1.hello.post({
        "query": {
            "api-version": "2020-11-16"
        },
        "header": {
            "token": "ZZZZ-ZZZZ-ZZZZ-ZZZZ"
        },
        "body": {
            "name": "Gen Key"
        }
    })

    // status
    console.log(res.status)
    // headers
    console.log(res.headers)
}

export default RequestTest;
```


##### 生成された$api.tsを見たらわかった

※動作確認してません

https://github.com/aspida/aspida
Salesforceで追加した項目が対応するレポートに表示されない

the備忘録

## 問題点
タイトルの通りですが、、

1. オブジェクトAに項目aを追加
2. オブジェクトAを使用しているレポートを開く
3. レポートで参照する項目の中に項目aを追加しようとする
4. 検索ボックスに項目名を入れても項目aが出てこない

という感じです。

## 解決策
レポートはオブジェクトではなく、オブジェクトを参照しているレポートタイプを参照しています。

なので、レポートタイプの編集が必要。

1. Salesforceの設定画面を開く
2. レポートタイプ画面を開く
3. 当該レポートが参照しているレポートタイプを選択
4. 「レポートで選択可能な項目」欄にある「レイアウトを編集する」ボタンを押下
5. 追加した項目aをレポートタイプで参照できるように設定する

## おしまい
かなり大雑把に説明してますが、大体見ればわかります。
不明点あったらコメントください。

## 追記
2020-11-17: コメントで新しい情報をいただきました。

> カスタムレポートタイプへの項目の自動追加 (ベータ)
https://releasenotes.docs.salesforce.com/ja-jp/winter21/release-notes/rn_rd_auto_add_custom_fields.htm
のようにWinter21でベータ版ですが機能が追加されているようです。
Sandboxから本番環境へ変更セットで項目を追加した時には機能しないようなコメントがあります。
機能的にはもう少しですね。

とのことです。私はよく設定画面がどれか忘れて迷子になるのでとても嬉しい機能です。
貴重な情報に感謝。
4G以上のzipファイルを受け取ってしまったら…

超小ネタ。かつ、自分用メモ。

4G以上あるzipファイルは（MacOS標準の）unzip では一部のファイルが解凍できません。
`bad zipfile offset` というエラーがでます。

```
 extracting: XXXXXXXX.jpg
file #2961:  bad zipfile offset (local header sig):  XXXXXXX
  (attempting to re-compensate)
file #2961:  bad zipfile offset (local header sig):  XXXXXXX
file #2962:  bad zipfile offset (local header sig):  XXXXXXX
file #2963:  bad zipfile offset (local header sig):  XXXXXXX
```

zipフォーマットの制限のようです。
詳しくは調べてませんが、恐らくzip内のオフセットが 32bit になっていて、4Gを超えるとオフセットがオーバーフローしちゃうんでしょう。

Mac使いであれば、 [The Unarchiver](https://apps.apple.com/jp/app/the-unarchiver/id425424353?mt=12) をインストールすると解凍できます。
![スクリーンショット 2020-11-16 17.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145575/52b1a6eb-419d-4b26-188a-787352607a53.png)

無料なんで助かりました。

zipなんてもう滅んだほうが世の中のためだと思うんだけど、何故か今でもデファクトなんだよなぁ…。
vscode で unity の breakpoint が動かない

これ。

![error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/63c10074-8387-b57c-1acf-dbe7cc9fe77d.jpeg)

> error while processing request 'stackTrace' (exception: This request is not supported by the protocol version implemented by the debuggee.)

## Debugger for Unity と Unity のバージョンが不一致？

拡張の右下の ⚙️　のメニューから `Install Another Version...` を選んで、

![other_version.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/16419384-95d1-429a-d5a1-ddbccfd82d13.jpeg)

適当なバージョン選ぶ。

![select_version.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59664/e3417b89-006a-7a06-e855-1db8d3dc44c2.jpeg)

`Unity-2018.4 + v2.7.5` でブレイクポイントを動作させることができた。

## Unity のファイルをクリアする

Unity を終了して

* obj
* Temp
* Library

あたりを消してからやってみる。
なおるときもある
Docker コンテナ上で PureScript を動かす

# はじめに

[Docker Hub](https://hub.docker.com/) に `PureScript` が動作するイメージがいくつかアップされていますが、 `Node.js v12` かつ `spago` を使用しているものが見当たらなかったので自分で作成してみました

# 検証環境

```
Windows10 Home Edition
VirtualBox 6.1.16
docker-machine.exe version 0.16.1, build cce350d7

# Docker Host OS (CoreOS)
$ uname -a
Linux default 4.14.154-boot2docker #1 SMP Thu Nov 14 19:19:08 UTC 2019 x86_64 GNU/Linux

Docker version 19.03.5, build 633a0ea838
docker-compose version 1.26.0, build d4451659
```

# ディレクトリ構成

`purescript` フォルダの中に `docker-compose.yml` と `Dockerfile` のみ

```
purescript
|   docker-compose.yml
|   Dockerfile
```

## `docker-compose.yml`

```yaml:docker-compose.yml
version: "3.7"
services:
  purescript:
    build:
      context: .
      dockerfile: Dockerfile
    image: takaya030/purescript

```

## `Dockerfile`

```dockerfile:Dockerfile
FROM node:12
LABEL maintainer "takaya030"

# install purescript
RUN npm install --global --unsafe-perm purescript spago

# add user
RUN userdel node && \
	useradd -m -s /bin/bash pureuser

WORKDIR /home/pureuser
USER pureuser

RUN mkdir tmp && cd tmp && spago init

CMD cd tmp && spago repl
```

# イメージのビルド

```bash
$ cd purescript
$ docker-compose build purescript
```

イメージの確認

```bash
$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
takaya030/purescript   latest              fb50aeb56d04        22 hours ago        1.08GB
node                   12                  1f560ce4ce7e        4 weeks ago         918MB
```

# 動作確認

```bash
$ docker-compose run --rm purescript

[info] Installing 4 dependencies.
[info] Searching for packages cache metadata..
[info] Unable to find packages cache metadata, downloading from GitHub..
[info] Installing and globally caching "psci-support"
[info] Installing and globally caching "console"
[info] Installing and globally caching "effect"
[info] Installing and globally caching "prelude"
[info] Installation complete.
Compiling Type.Data.RowList
Compiling Type.Data.Row
Compiling Record.Unsafe
  .
  .
  .
Compiling Main
Compiling PSCI.Support
Compiling Test.Main
PSCi, version 0.13.8
Type :? for help

import Prelude

> "hello"
"hello"

> 1 + 2 * 3
7

> import Effect.Console
> log "print this to the screen"
print this to the screen
unit

> :quit
See ya!
()
```

# 参考

- [純粋関数型スクリプト言語PureScriptのはじめかた - Qiita](https://qiita.com/hiruberuto/items/2316b58162cfec150460)
- [Risto-Stevcev/purescript-docker: Purescript build for Docker](https://github.com/Risto-Stevcev/purescript-docker)
- [node.js - Docker - "Error: EACCES: permission denied, mkdir '/project/node_modules/.cache/@babel'" - Stack Overflow](https://stackoverflow.com/questions/55926705/docker-error-eacces-permission-denied-mkdir-project-node-modules-cache)
- [documentation/PSCi.md at master · purescript/documentation](https://github.com/purescript/documentation/blob/master/guides/PSCi.md)
【Unity 2D】Pixel Perfect CameraのReference Resolutionを自動調整するスクリプトを作りました

# Pixel Perfect CameraのReference Resolutionを自動調整するスクリプトを作りました

![x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512142/61711c23-2263-2a44-e9d9-e8293a62940a.png)

解像度の変更によってこんな感じ(↑)に画面崩壊が起こることがなくなるハズ。

## 要件&インストール

### 要件
- Universal RP 7.3.1


### インストール方法
1. PackageManagerを開く
2. 「＋」→「Add package from git」をクリック
3. 「 https://github.com/Masterexa/PixelPerfectCameraAdjustment.git 」を入力してEnter
4. パッケージ一覧に「Pixel Perfect Camera Adjustment」が追加されて入れば、インストール成功


## 設定
![Soubunze - Tutorial - PC, Mac & Linux Standalone - Unity 2019.4.3f1 Personal [PREVIEW PACKAGES IN USE] _DX11_ 2020_11_16 16_50_48 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512142/41bae3cc-d0ea-acb8-0f22-caa96c9ecd37.png)

### Base Resolution
基準となるReference Pixel。Match Modeに応じた調節を経て最終的なReference Pixelが決まる。  
なお、Match Modeにかかわらず算出されるReference Pixelは常に画面解像度の1/2以下になる。

### Match Mode
Reference Resolutionの調節方法を指定する。

<dl>
  <dt>Extend</dt>
  <dd>
    Reference ResolutionがBase Resolutionを広げるように調節する。<br>
    個人的におすすめのモード。
  </dd>
  <dt>Trim</dt>
  <dd>Reference ResolutionがBase Resolution内に収まるように調節する。</dd>
  <dt>Width or Height</dt>
  <dd>
    Base Resolutionの幅か高さを基準にReference Resolutionを調節する。<br>
    Canvas Scalar同様にスライダーで調節が可能。
  </dd>
  <dt>Envelove</dt>
  <dd>おまけ機能。</dd>
</dl>

## リンク

- [Github](https://github.com/Masterexa/PixelPerfectCameraAdjustment)
- [PackageManagerで自作ライブラリを作成する方法 - Qiita](https://qiita.com/frost224/items/9832625f9f1671dd033b) <br> (↑パッケージ作成の参考にしました！)
【Java】FileReaderクラスとBufferedReaderクラスの使い方

#プログラミング勉強日記
2020年11月16日
FileReaderクラスとBufferedReaderクラスの使い方を改めてまとめておく。

#FileReaderクラスとは
　テキストファイルを読み込むためのAPIで、テキストファイルの内容を元にした処理などを行うために使う。ファイルの文字は、データを文字単位で読み書きできる文字のストリームで読み込まれる。FileReaderクラスは文字を読み込むメソッドとしては、1文字ずつ読み込むreadメソッドしか用意がないので、データをバイト単位で読み書きできるバイトのストリームで読みたい場合はFileInputStreamクラスを使用する。

```java:readメソッドで1文字ずつ読み込む
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
 
public class Main {
 
    public static void main(String[] args) {
        try {
            // Fileクラスのコンストラクタの引数にファイルのパスを指定
            File file = new File("text.txt");
         
            // ファイルが存在しない場合の例外処理
            // existsメソッドはファイルが存在する場合にはtrue、存在しない場合にはfalseを返す
            if (!file.exists()) {
                System.out.print("ファイルが存在しません");
                return;
            }
         
            // FileReaderクラスとreadメソッドを使って1文字ずつ読み込み表示する
            FileReader fileReader = new FileReader(file);
            int data;
            // ファイルの終わりになるまで処理を繰り返す
            while ((data = fileReader.read()) != -1) {
                // 読み込んだ文字をchar型にキャストして文字を表示させる 
                System.out.print((char) data);
            }
         
            // 最後にファイルを閉じてリソースを開放する
            fileReader.close();
         
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}
```

#BufferReaderクラスとは
　FileReaderクラス同様にテキストファイルを読み込むクラスで、FileReaderクラスとは用意されているメソッドが違う。BufferReaderクラスでは1行ずつ読み込むreadlineメソッドが用意されている。
　FileReaderクラスでは1文字ずつ読み込んでいるが、文字数が多い場合に効率が悪くなることがあるので、一定量メモリを決めて、たまったらOSに読み込み命令を出すようにする。これをバッファリングという。

```java:readlineメソッドで1行ずつ読み込む
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
 
public class Main {
 
    public static void main(String[] args) {
        try {
            // Fileクラスのコンストラクタの引数にファイルのパスを指定
            File file = new File("c:SampleTest.txt");
         
            // ファイルが存在しない場合の例外処理
            // existsメソッドはファイルが存在する場合にはtrue、存在しない場合にはfalseを返す
            if (!file.exists()) {
                System.out.print("ファイルが存在しません");
                return;
            }
         
            // BufferedReaderクラスのreadLineメソッドを使って1行ずつ読み込み表示する
            FileReader fileReader = new FileReader(file);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            String data;
            // ファイルの終わりになるまで処理を繰り返す
            while ((data = bufferedReader.readLine()) != null) {
                System.out.println(data);
            }
         
            // 最後にファイルを閉じてリソースを開放する
            bufferedReader.close();
         
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}
```

#参考文献
[クラスBufferedReader](https://docs.oracle.com/javase/jp/8/docs/api/java/io/BufferedReader.html)
[クラスFileReader](https://docs.oracle.com/javase/jp/8/docs/api/java/io/FileReader.html)
[【Java】FileReader、BufferedReaderでテキストファイルを読み込む](https://www.sejuku.net/blog/20924)
Windows 10のレジストリを修復する方法

方法一：

Windowsのレジストリに関するファイルは「ローカル ディスク（C：）」＞「Windows」フォルダ＞「System 32」＞「config」というフォルダーに保存されているDEFAULT、SAM、SECURITY、SOFTWARE、SYSTEMの5つです。それに、Windows 10はレジストリのバックアップファイルを不定期的に作成していて、「ローカル ディスク（C：）」＞「Windows」フォルダー＞「System 32」フォルダー＞「config」フォルダ＞「RegBack」というフォルダーに保存されています。
![copy-registry-backp-file.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884599/fdd76710-8201-e394-3a15-2b324edd5809.jpeg)
レジストリが破損してしまい、PCやソフトウェアの動作が不安定になったら、「RegBack」の中にあるレジストリバックアップファイルを「config」フォルダーにコピーして、その中のレジストリ関連ファイルを置き換えることでレジストリを修復することができるかもしれません（念の為、「config」フォルダー内のレジストリ関連ファイルを他の名前に変更して保存することをおすすめ）。

もっと多くの方法なら、https://www.aiseesoft.jp/tutorials/fix-windows-registry.html
までご参考ください！
Selenium(Python)でローカルファイルをドラッグ&ドロップする

## はじめに
PythonのSeleniumでファイルのアップロードを行う場合、`type="file"`なinput要素に対して`send_keys(/path/to/file)`によりファイルを選択できます[^selenium-send-keys]。一見input要素がないように見えてもCSSで非表示になっている場合がほとんどのため、多くの場合はこの方法で対応できます（CSSを変更してwebdriverがinput要素にアクセスできるようにする必要はあります。）

[^selenium-send-keys]: [7. WebDriver API &#8212; Selenium Python Bindings 2 documentation](https://selenium-python.readthedocs.io/api.html?highlight=send_keys#selenium.webdriver.remote.webelement.WebElement.send_keys)

しかし、ファイル選択にinput要素を用いないページもあり、ドラッグ&ドロップでのファイル選択が必要になる場合があります。そのような場合には下記の方法が有効です。

## 方法
[florentbr/#wd-drop-file.py - GitHub Gist](https://gist.github.com/florentbr/349b1ab024ca9f3de56e6bf8af2ac69e) のコードを利用します。

```python
from selenium import webdriver
from selenium.webdriver.remote.webelement import WebElement
import os.path

with open("wd-drop-file.min.js", "r") as f:
    JS_DROP_FILES = f.read()

def drop_files(element, files, offsetX=0, offsetY=0):
    driver = element.parent
    isLocal = not driver._is_remote or '127.0.0.1' in driver.command_executor._url
    paths = []
    
    # ensure files are present, and upload to the remote server if session is remote
    for file in (files if isinstance(files, list) else [files]) :
        if not os.path.isfile(file) :
            raise FileNotFoundError(file)
        paths.append(file if isLocal else element._upload(file))
    
    value = '\n'.join(paths)
    elm_input = driver.execute_script(JS_DROP_FILES, element, offsetX, offsetY)
    elm_input._execute('sendKeysToElement', {'value': [value], 'text': value})

WebElement.drop_files = drop_files

# 以下、利用例
driver = webdriver.Chrome()
driver.get("https://react-dropzone.js.org/")
dropzone = driver.find_element_by_css_selector("[data-preview='Basic example'] [style]")
dropzone.drop_files("C:\\temp\\image1.png")
```

Gistを見ていただければ全部わかりますが、コードはこのようになります。`wd-drop-file.min.js`はGistを参照してください。オリジナルは`JS_DROP_FILES`を直に入力していますが、このコードでは外部ファイルから読み込むようにしています。
Quartusに新たなデバイスファミリーを加えるときの手順

Quartus Prime Liteを使って最近まではMAXIIでいろいろ遊んでいたのだが、MAX10にアップグレードすることになった。MAX10用のデバイスファミリーのファイルをダウンロードする手順を以下にメモ用に残しておく。

## 目的

Quartusに新たなデバイスファミリーを加える

## 前提

Quartus Primeの何かしらバージョンがインストールされていること。

OS: Windows10

## 手順
[インテルのウェブサイト](https://fpgasoftware.intel.com/)でダウンロードすることが可能。ウェブサイトを開いたら登録＆ログインしましょう。

デフォルトだとエディションはPro、バージョンは20.1とかになっているので、自分のバージョンに合わせる。私はLiteで17.0でWindowsなので、以下のように選択。

![fpgafamilyintel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/d03d555a-0226-29a2-fa82-373ee849d61c.png)

デバイスがしたに並んでいる。今回はMAX10が欲しいので、MAX10のをダウンロードする。

![device family.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/7fb6d30c-22e0-3184-b4df-ad80577d552b.png)

ダウンロードが終わったら、ウィンドウズのスタートにてdevice installerと検索する。

![device installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/bffedb1c-8f6b-e5a8-a7a7-c3df7b12c392.png)

はいを押しながら進めていくと、先ほどダウンロードしたqdzファイルの置き場所を聞かれる。ダウンロードに保存してあるので、そこを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/294d6349-7fbd-6061-9408-1a9d9a87cf71.png)

この次あたりでMAX10にチェックを入れて続行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/07913929-0753-c828-3a27-04cdc92b12e8.png)

これでダウンロードされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/e16cedd0-176a-d623-8445-686d0d642121.png)


以上でQuartusにMAX10のプロジェクトを開くことが可能になる。
macOS Big Surでgnuplotを使えるようにしました

実行時バージョン 11.0.1

brew install gnuplot
でエラーが出ました．
Errorのところを見ると，CTL(Command Line Tools)のバージョンが古い？というのが1つにあります．

https://qiita.com/gesutaka/items/fe34bd5de524a20b2b0a
を参考に
https://developer.apple.com/download/more/
からCommand Line Tools for Xcode 12.3 betaをダウンロードしました．
(Xcode Version 12.2をすでに持ってます．)

再度
brew install gnuplot
を実行しました．
gnuplot
でgnuplot 5.4(last modified 2020-07-13)が開きました．
温湿度・気圧のロガーを作る #1

**[1話 センサー1つ+Ambient編](https://qiita.com/after-a-rain/items/20d337702f93cd589044)** / **[2話 センサー2つ+Ambient編](https://qiita.com/after-a-rain/items/80fe94cb3b2870ea9f0c)** / **[3話 センサー4つ編](https://qiita.com/after-a-rain/items/f64626f3f72e62b783c0)**
**[4話 SDカード記録編](https://qiita.com/after-a-rain/items/d736854791fa27aea543)** / **[5話 システム時刻・NTP編](https://qiita.com/after-a-rain/items/ec9e772df0c6ea029e84)**

#目的と注意事項
ArduinoやC言語を体系的に学んだことがない人が、感覚で作っていきます。
そして、ボスから頼まれた備忘録的なものです。
なので厳密さにとっても欠けます。
寧ろ、これ変じゃない？とか権利的に法律的にやばいんじゃない？というのがあれば教えて下さい。
いや、教えて頂きたく存じ上げます。

##やりたいこと
Arduinoを使って、温湿度・気圧のデータロガーを作りたい

## 欲しい機能

- 温湿度・気圧のデータロギング
- SDカードにCSV形式でほしい
- Wi-fi→Ambientをつかって遠隔で収集したい
- 一つのArduinoに沢山のセンサーを付けたい
- 電波ないところ用に、RTCモジュールでスタンドアローンのやつも作りたい。

#本編
##1話
まず、センサー1個→Arduino→Ambientを作ります。
###用意したもの

- Arduino的なもの ESP-WROOM-02開発ボード (SwitchScience)  ×1  
https://www.switch-science.com/catalog/2500/
- 温湿度・気圧センサー BME280 (SwitchScience)  ×1  
https://www.switch-science.com/catalog/2236/

###やったこと
開発ボードとBME280をSPI接続でつないで、様々なHPを参考にしながら頑張った。
基本的には次のHPに従って組み立てていきました。先人に感謝。
https://pages.switch-science.com/letsiot/temphumidpress/
配線も同じです。2018年の記事ですがコードもコピペでうまくいきます。感謝。
また、ここから色々改良していくわけですが、これをベースに作ります。
なので、SPI接続から未だに抜け出せていません。それが課題です。


**[2話に続きます](https://qiita.com/after-a-rain/items/80fe94cb3b2870ea9f0c#2%E8%A9%B1)**
1話も更新します。
macOS Keychain app でパスワード保存は推奨しない

## 背景

Mac が故障してしまった(macbook で内蔵ディスクが認識しなくなった)
パスワードなど Keychain app(`Applications -> Utility` にあるやつ) で管理している.
同じ macOS バージョンのデバイスは一つしか持っていない.
time machine バックアップ + iCloud キーチェーン同期はしているが...

## とりあえずの結論

Keychain app でパスワード管理はやめましょう.
クロスプラットホーム性のある KeePassX, 1Password などに移行したほうがよいでしょう.
(もしくは iPhone などでパスワード管理(=> パスワード長いときに PC にコピペはどうするのかな?))

## ローカルのパスワードは iCloud バックアップされない

ローカル(e.g. `login` keychain)保存のパスワードは iCloud キーチェーンバックアップの**対象外**です!
time machine などでバックアップを取っていないと, mac が壊れたときデータをロストします!

ファイル単体でバックアップする場合,

https://support.apple.com/en-gb/guide/keychain-access/kyca1121/mac#:~:text=Keychains%20are%20usually%20located%20in,then%20open%20the%20Keychains%20folder.

`~/Library/Keychains`

にあるファイルをバックアップすればよいのがよいですが, macOS のバージョンが違うとよめませんでした.
(e.g. 10.15 Catalina のファイルを 10.14 でインポートしようとしたら失敗)

また, macOS 専用フォーマット(実体は sqlite3 あたりかと思われるが)なので, Windows とか Linux とかで読めません.

頑張れるが読めるかもはしれないが, フォーマット変わる可能性があるのでお勧めしない.

https://github.com/jjarava/mac-osx-forensics/blob/master/keychains.py

## (おまけ) iPhone とかとの同期

Keychain app で iCloud をターゲットとしてパスワード保存しても, iPhone とかと同期できません.
Safari のパスワード管理でパスワード保存しないとだめでした
(Keychain app で開いたとき, アットマークアイコンがついてることを確認する)

## iCloud バックアップしたパスワードは直接は見れない

iCloud の web サイトでログインしてもパスワードは直接は見れない.
なにかしら Apple デバイス(iPhone, Mac)が必要.

手元に Apple デバイスがひとつで, それが故障した場合, パスワードを見る手立てがありません.

## 結論

Mac がクラッシュしたとき, 基本は新規に Mac 用意してリカバリしないと Keychain 保存のパスワード見れません.

1Password や, Chrome/Google などでのパスワード管理, OSS がいいならデータはクラウド管理の bitWarden あたりを使ってパスワード管理がよいでしょう.

クラウドが不安な場合は KeePassX でしょうか.

KeePassX, bitWarden では Yubikey で認証もできます(Yubico は未対応(青いやつ))

### TODO

* [ ] Yubikey などで認証する場合, キーをなくしたときのリスクを考える(ブロックチェーンみたいにマルチシグな仕組みあるといいのかも?)
【Unity】Materialが参照している全オブジェクトのパスを取得する方法

エンジニア・非エンジニア問わずアセットを納品する場合、そのアセットに対してバリデーションをかけた方がプロダクトの安全性は向上します。

UnityEditorを通じてアセットを作成する場合、AssetDatabaseを通して様々なデータを取得できるため、バリデータを作成するのはとても簡単です。

[【Unity】効率よくアセットバリデーションを作成するためのTestRunnerの活用法 - Qiita](https://qiita.com/ohbashunsuke/items/9b8fbe2c209d8f264a4b)
以前TestRunnerを使ってサクッとバリデーターを作成した記事を執筆しました。

今回はタイトルの通り任意の**Materialが参照する全てのオブジェクトのパス**を取得する必要が出てきたので、その備忘録を残します。

## GetDependenciesメソッドを使用

結論から書くと`GetDependenciesメソッド`を使いました。

```cs
// Materialを指定
var materialPath = AssetDatabase.GetAssetPath(material);

// 指定したMaterialに紐づくオブジェクトのパスの配列を取得
var referencePaths = AssetDatabase.GetDependencies(materialPath);
```

上記のようなソースコードで指定したMaterialが参照するテクスチャ、シェーダ等のパスが取得できます。

## 取得したパスを何に使うのか？

今回取得したかった理由は、アプリに含まれるマテリアルが参照するオブジェクトが**AssetBundleとしてビルドされるオブジェクトかどうかをチェック**するためでした。
※間違えてAssetBundleのアセットをアプリ内で参照しちゃっていて、実機で実行するとピンク色になるアレです


この情報を元にバリデーターを作成していくという流れになります。

## 環境

- Unity 2019.4.11.f1