OmniAICreator/Qiita-1.07M huggingface dataset:
別ブックのマクロを呼び出してクラスを返してもらう【ExcelVBA】

https://excel-ubara.com/excelvba1/EXCELVBA427.html

こんな記事を見かけて機能別にブックを切り分けたくなってきたので模索中メモ

単機能ならまだしも複数機能にまたがるクラスってどうなるのか試してみた。

## 結論
- クラスとして戻り値を得ることはできる
- ただし型がVariantになり、インテリセンスも使えない

使えるには使えるけど結局ブックを分けたところで、更新があった場合呼び出す側も呼び出される側もどちらも更新しなきゃっぽい。

せいぜい使うクラス単位くらいに分けて管理？
そもそもRelaxToolsとか何機能あるんだよだもんね

皆さんバージョン管理ってどうやってるのでしょうか？
そろそろGitデビュー時？


以下コード

## 呼び出される側
### クラス

``` vb:呼び出される側 clsTest
Option Explicit

Public str As String
Public val As Long
```

### 標準モジュール
``` vb:呼び出される側 bas
Option Explicit

Function testClass(str_ As String, val_ As Long) As clsTest
  ' 別ブックから呼び出してクラスを返せるか
  Dim clsT As New clsTest
  With clsT
    .str = str_
    .val = val_
  End With
  Set testClass = clsT
End Function
```


## 呼び出す側
### 標準モジュール

``` vb:呼び出す側
Option Explicit

Sub test_クラスを返してもらう()
  
  ' 下ごしらえ：呼び出す別ブックのフルパス、プロシージャ名を付与
  Const 呼び出す別ブックのフルパス = "C:\Users\hoge\呼び出される側.xlsm"
  Const プロシージャ名 = "testClass"
    
  ' 別ブックを開く
  Dim wb As Workbook
  Set wb = Workbooks.Open(呼び出す別ブックのフルパス)
  
  ' メイン：別ブックのプロシージャを引数つきで呼び出す
  Dim 戻り値
  Set 戻り値 = Application.Run(wb.Name & "!" & プロシージャ名, "strTest", 12345)
  Stop
  With 戻り値
    Debug.Print .Str
    Debug.Print .Val
    
  End With
  
  ' 終了処理
  Set wb = Nothing
  Set 戻り値 = Nothing
  
End Sub
```

返してはもらえるが型がVariantになる
インテリセンスも使えない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/d7970bd4-58c7-b9a9-1b51-16701b5e7f8e.png)


呼び出される側自身で`testClass`を呼ぶと型がクラスになる
インテリセンスは当然使える
``` vb
Sub testCallClass()
  Dim clsT As clsTest
  Set clsT = testClass("qwerty", 12345)
  
  Stop
End Sub
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/a7f99ea7-5998-4f8f-ad19-1018502b4585.png)
Application Development with Cloud Run Google Cloud 学習ログ

## 背景
courseraの `Application Development with Cloud Run
Google Cloud` をやっているので、それの学習ログを残す

## Cloud Runの強み
1. オートスケーリング
1. アプリケーションを増分更新していくので、ロールバックが容易
1. ゾーン、リージョンにまたがるロードバランシング

### オートスケーリング
コンテナ数は設定によって1~1000までオートスケールする。
Googleサポートに申請すれば、1000以上にコンテナ数を増やすことができる。
Cloud Runにはロードバランサーが内包されていて、コンテナの負荷が上がった場合、自動的にコンテナを増やしてくれる。需要が下がった場合は、コンテナへのトラフィックを停止してコンテナをシャットダウンしてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/012a6a6d-1060-7610-2b89-d48dfd0c4f85.png)


### アプリケーションを増分更新していくので、ロールバックが容易
アプリケーションに変更を加えると新しいリビジョン(imageのようなもの)が作成される。
新しいリビジョンをデプロイするときは、徐々にトラフィックを移すことで安全にデプロイすることができる。（一気に移すことも可能）
Cloud Runではリビジョンごとにコンテナとサービス設計がされているので、前のリビジョンに戻せば、簡単にロールバックすることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/17a138ef-c331-9a27-0ff7-216717413db8.png)


### ゾーン、リージョンにまたがるロードバランシング
リージョン：データセンター。3つ以上のゾーンから形成される。例： US center 1 is Iowa, North America
ゾーン：各拠点のデータセンター

1つのリージョン内でコンテナを複数のゾーンに分散させることで、ゾーンの障害に対する体制をもたせている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/9dfcd960-8497-bd4e-400b-993b867a301f.png)

複数の地域のCloud Runの前に単一のグローバルIPアドレスを公開することができる。Cloud Runはグローバルロードバランサーと統合されていて、クライアントからのトラフィックが常に最も近いリージョンに行くようにできるため、低いレイテンシを実現できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314481/563614d6-5a5b-f8ee-a770-df0efe807555.png)
MySQLの読み取り専用ユーザーの作成方法

## これは何(what)
業務で稀に読み取り権限しか持たないMySQLユーザーを作成したいケースがあるんですが、
毎回調べてて時間がもったいないと思ったので備忘録として書く

## 作り方(how to)

```sql
-- ユーザー一覧
select Host, User, Plugin from mysql.user;

-- 読み取りユーザー作成
GRANT SELECT ON development.* to 'read_only_user'@'%' IDENTIFIED BY 'newpassword';

-- 権限確認
SHOW GRANTS FOR 'read_only_user'@'%';

-- ユーザー削除
DROP USER 'read_only_user'@'%'
```

## 参考(reference)
https://qiita.com/taroshin/items/d1ca90343ec46edb138e
Cpanelが入っている状態でLaravelをデプロイしたけど動かない問題

土日潰して調べた結果、あっさり解決したので備忘録

環境
さくらのvps CentOS7 cPanelインストール済み
さくらのvps CentOS7だけならMac環境で作ったlaravelプロジェクトをデプロイするだけですんなり動いたにも関わらず、

cPanelが入っている環境だと何故かWelcomeページすら動かない...

cPanel環境の情報すら少なくて困ってました。

public内のindex.phpにアクセスすればlaravelのウェルカムページができるはずなのですが
```php:laravelproject
Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0". You are running 7.3.29-to-be-removed-in-future- macOS. 
```

ギャオピー！mac環境ではphp8.1で動いたけどvps環境は8.0.0これがダメだったのだろうか。。。(cpanelさんでは8.0.0しか選べなかった)
どうすればいいかわからんからとりあえずエラーコードをGoogleにぶち込み検索してみる

こちらのQiita記事が見つかる
https://qiita.com/shizen-shin/items/e5959f75dc015fe5d78b

ほうほうなるほどわからん...

しかしこちらの方のエラー内容が少し違うな...

```
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 7.3.0". You are running 7.2.34. in /var/www/vendor/composer/platform_check.php on line 24
```

/var/www/vendor/composer/platform_check.phpを見ろとな。

しかしさんざエラーの忠告に騙されてきたワイ、こんなことに期待はしn...





ファイルがあるやんけ....

中を覗いてみるとこんな記述が

```
if (!(PHP_VERSION_ID >= 80100)) {
    $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.';
}

```
80100、バージョンぽいな...
ここをいらっていいんやろか。。。一ついらうと全部影響しそうで怖いねんけど...


ええいママよ！！
80100を80000に変更


ドキドキの再読み込み

ファっ！？動いた....

とりあえず動いたけどこれでいいのかわからない。これが思わぬセキュリティホールになると怖いのでもう少し調べます。知っている方いらっしゃいましたら教えてください！
Salesforceで参照関係から主従関係に変更する際に注意すること～所有者消失編～

Salesforceでオブジェクトリレーションを作成する際に２種類のリレーションがございます

1参照関係
2主従関係


特定の条件を満たせば参照関係から主従関係に変更することも可能ですし、また主従関係から参照関係に変更することも可能です。


詳細はこちらのヘルプに記載されています

リレーションの考慮事項
https://help.salesforce.com/s/articleView?id=sf.relationships_considerations.htm&type=5

今回は、このヘルプの中で記載されているこちら

＞レコード所有権: 連結オブジェクトのレコードは、プライマリ主オブジェクトのレコードの [所有者] 項目の値を継承します。主従関係の従オブジェクトには、参照可能な [所有者] 項目がないため、後で連結オブジェクトの両方の主従関係を削除した場合、これが唯一の関連になります


所有者の動きについて見ていきます


所有者は
・参照関係ならある
・主従関係なら無い

となります。
では、参照関係から主従関係に変更する際、どうなるか見ましょう


参照関係について(前提)
カスタムオブジェクト「調査」（取引先と参照関係）があります。
こちらは現在参照関係なので「調査」には所有者がございます。
![参照関係１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/91440e03-e71a-7618-8260-05d32ad97dd7.png)

・参照関係を主従関係に変更

では
カスタムオブジェクト「調査」（取引先と参照関係）
を主従関係に変更します
![参照関係２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a564d2dd-c583-8324-11b9-1f58eaa96d0b.png)

すると、先ほどまで右上のほうに見えていた「所有者」項目が見えなくなります
![参照関係３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b65518f7-2b0a-2990-9bbc-513f3fefa052.png)

カスタムオブジェクト「調査」の項目にも「所有者」が無いことが分かります
![参照４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/03560c77-bab5-7ce3-7e20-2f64ee9190b0.png)



次に、カスタムオブジェクト「調査」（取引先と主従関係）
を参照関係に戻します
![参照関係２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f63c9f03-0275-02bc-3974-a06b0a9a10b1.png)

そうすれば、カスタムオブジェクトには所有者項目が表示され、自動的にページレイアウトにも反映されています
![所有者変更２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d72d8233-1569-440a-55d3-5d637bcd08e7.png)
特殊文字の名称由来

ソースコードで度々出くわす特殊文字ですが、いつも意味を忘れてしまいます。
その度に調べるのが面倒なので、まとめました。

| 文字表記 | 文字 | 名称 | 由来 |
|:-|:-|:-|:-|
| \&quot;  | "  | 引用符、クォーテーション  | quotation mark  |
| \&amp;  | &  | アンパサンド  | ampersand  |
| \&lt;  | <  | 小なり  | less than  |
| \&gt;  | >  | 大なり  | greater than  |
| \&nbsp;  |   | 空白  | no-break space　<br/>（改行(=break)のないスペース）  |
| \&copy;  | ©  | コピーライト  | copyright  |
| \&brvbar;  | ¦  | 穴あき縦棒  | broken vertical bar  |
| \&frasl;  | ⁄  | スラッシュ  | Fraction Slash <br/>（分数スラッシュ）  |



<h3>参考</h3>

[よく使う特殊文字　一覧](https://qiita.com/masatokato0128/items/b07e02013aed143aa45a)(@masatokato0128 さん)
Amazon SESの用語要点まとめ（自分用メモ

・Amazon Simple Email Service（SES）
信頼性の高いフルマネージド型のEメール送受信サービス。SESへは一般的なメール送信プロトコルであるSMTP（Simple Mail Transfer Protocol）やAPIを介してメール送信を行い、SESから受信者へはSMTPでメールが送信されます。また、メール受信をトリガーにAWS LambdaのLambda関数を実行するなどの使い方もできます。

高い信頼性を保つため、SESでは利用者に対していくつかの制限を設けています。

１、送受信を行うドメイン・メールアドレスの認証
メールの送受信は、SESへ登録し認証されたドメインおよびメールアドレスのみ行えます。
マネジメントコンソールからは登録したメールアドレスの状態を参照することができます。

２、「バウンス」「苦情」に関する制約
SESでは、メールの送信者が適切なメールを配信しているかどうか（スパムメールの送信者かどうか）を判断する指針として、バウンス率および苦情率に着目しています。

・バウンス（送信者への差し戻しメール）
メールの受信者のメールアドレスが存在しない場合や送信者のドメインやIPアドレスがブロックされているような場合、メールは受信者へ配信されずに送信者へ差し戻されます。このようなメールを「バウンス」といいます。

・苦情（スパムメールの報告）
メールの受信者が、メールクライアントの「スパムとして報告」などの報告を行った場合、「苦情」としてカウントされます。

バウンス率・苦情率が一定の値を超えるとSESがメールの送信を停止することがあります。
バウンス率・苦情率はマネジメントコンソールから参照できます。
PySpark にて  Databricks runtime のバージョンを取得する方法

## 内容
PySpark にて  Databricks runtime のバージョンを取得する方法は下記です。

```python
spark.conf.get("spark.databricks.clusterUsageTags.sparkVersion").split('-')[0].replace('.x','')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1ab1bc64-d75b-4d64-87c6-4d2d21139bce.png)
Amazon  SNSの用語要点まとめ（自分用メモ

・Amazon Simple Notification Service（SNS）】
プッシュ型のメッセージングサービス。システムの状態に変化があった際のシステム管理者への通知や不特定多数のユーザーへの定期的なメッセージ配信などを、EメールやSMS（Short Message Service）、Amazon SQSを通してユーザーやアプリケーションに対して通知。

利用できる通知方法（プロトコル）には、Eメール、HTTP/HTTPSやモバイル（iOS、Android）端末へのプッシュ通知など。またAmazon SQSへキューを登録したり、AWS Lambdaと連携してLambda関数を呼び出すといった使い方もあります。
メッセージの発行者は、プロトコルやメッセージの通知先（購読者）の存在などを意識せずにメッセージを発行できるため、複数のアプリケーション間を低い結合度（疎結合）で連携することができます。

SNSにおける情報の単位は「トピック」で管理。
トピック所有者（トピックオーナー）が作成したトピックに対して、「発行者（Publisher：パブリッシャ）」がメッセージを発行。メッセージの受信者は「購読者（Subscriber：サブスクライバ）」といい、得たい情報のトピックを選択して受信登録。

・発行者（Publisher）
発行者（Publisher）は、Amazon SNSにおけるメッセージを発信するアプリケーションなど。発行者はメッセージを発行したいトピックを選択してメッセージを配信します。購読者の存在やプロトコルの種類などは意識する必要はありません。

・購読者（Subscriber）
メッセージを受け取る（購読する）アプリケーションやユーザー。購読者は通知を得たいトピックに対してプロトコルを選択して登録

■トピックの種類
SNSでトピックを作成する際には「FIFO（First In First Out）」または「標準（スタンダード）」のいずれかを選択します。
「FIFO」を選択すると、「標準」の機能である暗号化やフィルタリング機能などに加えて、メッセージが順序付けられてAmazon SQSのFIFOキューへ配信されます（FIFOトピックを選択した場合、プロトコルに指定できるのはSQSのみです）。また、FIFOトピックではメッセージの重複排除機能を有効化できます。標準トピックではメッセージの配信は「少なくとも1回」であるのに対して、重複排除を有効にすると、メッセージは必ず1回だけ配信されるようになります。
FIFOトピックは、イベントが発生した順番通りに処理したい場合や、処理が重複してはいけないようなケースで利用。
Octave でマクネマー検定

# Octave でマクネマー検定

マクネマー検定は，対応のある 2 標本の比率の差の検定である。また，対応する値（カテゴリー）が $k$ 種類ある場合は，マクネマー検定の拡張である「対称性の適合度検定(goodness of fit test of symmetry)」が行われる（R でも採用されている）。

    usage:
    [pval, chisq, df] = mcnemar_test (x)
    
    x は正方行列
    2 x 2 行列を与えた場合，連続性の補正をした検定結果が示される。連続性の補正をしないというオプションはない。
    戻り値を指定しない場合は p 値のみを表示する

 次式で計算される $\chi^2_0$ が，自由度 $\displaystyle \frac{k\ (k-1)}{2}$ の $\chi^2$ 分布に従う。
$$\displaystyle
    \chi^2_0 = \begin{array}{c}
    {　} \\
    {\sum \sum} \\
    {\scriptsize i \lt j}
    \end{array}
    \frac{\left( n_{ij} - n_{ji} \right)^2} {n_{ij} + n_{ji}}
$$



```matlab
pkg load statistics   % statistics が必要
format long           % 表示精度を高くする（任意）
```

## 2 x 2 行列を与えた場合


```matlab
x = [13 6
      9 7] 
```

    x =
    
       13    6
        9    7
    



```matlab
mcnemar_test(x);
```

      pval: 0.605577



```matlab
[pval, chisq, df] = mcnemar_test(x);
printf("chisq = %.5g,  df = %d,  p value = %.5g\n", chisq, df, pval)
```

    chisq = 0.26667,  df = 1,  p value = 0.60558


`mcnemar()` は漸近検定なので，二項検定 `binotest()` を用いれば正確な $p$ 値が得られる。


```matlab
[h, pval,ci] = binotest(6, 6+9, 0.5)
```

    h = 0
    pval = 0.607238769531250
    ci =
    
       0.163364323859513   0.677130233793718
    


## k x k 行列を与えた場合


```matlab
x = [13 6 8
      9 7 5
      1 3 8] 
```

    x =
    
       13    6    8
        9    7    5
        1    3    8
    



```matlab
[pval, chisq, df] = mcnemar_test(x);
printf("chisq = %.5g,  df = %d,  p value = %.5g\n", chisq, df, pval)
```

    chisq = 6.5444,  df = 3,  p value = 0.087926


以下のような計算をしている


```matlab
chisq = (6 - 9)^2/(6 + 9) + (8 - 1)^2/(8 + 1) + (5 - 3)^2/(5 + 3)
```

    chisq = 6.544444444444444



```matlab
k = size(x)(1)
```

    k = 3



```matlab
df = k * (k - 1) / 2
```

    df = 3



```matlab
pval = 1 - chi2cdf(chisq, df)
```

    pval = 8.792610801907608e-02
PySpark (Databricks)にて設定済み Spark config の項目名と値をすべて取得する方法

## 内容
PySpark (Databricks)にて設定済み Spark config の項目名と値をすべて取得する方法は下記です。


```python
spark.sparkContext.getConf().getAll()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5bf34a6d-addc-5a2c-4ccd-804aa43d4d11.png)
プログラミングは数学の証明と似ている

プログラミングをしたことのない人にとって、プログラマーはよくわからない仕事のようだ。しかし、こういえば少しは想像がつくのではないか？　プログラムを書くことは証明を書くことに似ている、と。

プログラミングが上達するには、数学の証明のように物事の筋道を作る能力を高めることがまず必要だ。

以下に両者の共通点を挙げてみる：

# いろいろな解き方がありうる

どの作戦を選ぶかによって、長さが変わってくるのは、証明もプログラムも同じである。そこが書く人が工夫のしがいがあり、おもしろいところである。

# 短いほど美しい

長く書かれたものよりも、短いもののほうが、
- 理解しやすく
- 計算量が少なく
- 誤りが入る余地が少ない

のは、証明もプログラムも同じである。

# 定理は活用すべし

証明済みの定理は使うべきであり、それらを活用したほうが証明は短くて済む。プログラムも、定義済みのメソッドを活用すると短くできる。

数学の発展は定理の蓄積とともにあり、プログラミングの高度化はライブラリの蓄積とともにある。
Oracleで日付値や現在時刻を文字列にフォーマット（変換）

# やり方

```sql:現在時刻を2022/08/04 07:08:04のような形で取得するサンプル（24時間表記）
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') 
FROM テーブル名
WHERE ROWNUM = 1
```

```sql:現在時刻を2022/08/04 07:08:04のような形で取得するサンプル（12時間表記）
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH:MI:SS') 
FROM テーブル名
WHERE ROWNUM = 1
```

月、日、時、分、秒、全てゼロ埋め。

テーブル名を指定しないと
『ORA-00923 FROMキーワードが指定の位置にありません』
の例外になる為、なんでもいいので存在するテーブルを指定するサンプル。

また、1行だけ返ってくればよいので ```ROWNUM = 1``` のサンプル。

# 参考サイトさん
https://segakuin.com/oracle/function/to_char.html

# バージョン

Oracle Database 11g Release 11.2.0.1.0 - 64bit Production

TODO:月や日などをゼロ埋めしないで取得する方法確認。
rollbackできないエラーの時

rollbackをしようと実装していた矢先、以下のようなエラーが出て、少しはまってしまったため、その備忘録を書かせて頂きます。
```
ActiveRecord::UnknownMigrationVersionError: 
No migration with version number 20220703020507.
```

このエラーはどう言う時に出るかというと、下記の表で上から三行目に
[********** NO FILE **********]と書かれてるように、NO FILEがあると、うまくrollbackができなくなってしまいます。
```
database: starbuck_services2_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220702022539  Sorcery core
   up     20220702115611  Add role to users
   up     20220703020507  ********** NO FILE **********
   up     20220705060146  Create posts
   up     20220705062125  Create categories
   up     20220705062158  Add category id to posts
   up     20220706032605  Add photos to posts
   up     20220707040615  Add evaluation to post
  down    20220711013102  Create comments
```

解決方法は、一度datebaseを削除することで、うまくいきます。
```
bundle exec rake db:drop
bundle exec rake db:create
bundle exec rake db:migrate
bundle exec rake db:migrate:status
```
上から順に削除、作成、migrate、確認といったところです。
```
database: starbuck_services2_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220702022539  Sorcery core
   up     20220702115611  Add role to users
   up     20220705060146  Create posts
   up     20220705062125  Create categories
   up     20220705062158  Add category id to posts
   up     20220706032605  Add photos to posts
   up     20220707040615  Add evaluation to post
   up     20220711013102  Create comments
```

同じようなエラーにはまっている人の少しでも役に立てたら幸いです。
[Swift]NavigationBarの下線の消し方（iOS13以降）

```extension.swift
extension UINavigationBar {
    @available(iOS 13.0, *)
    private func applyAppearance() {
        let appearance = UINavigationBarAppearance()
        appearance.configureWithDefaultBackground()
        appearance.shadowImage = UIImage()
        appearance.shadowColor = .clear
        appearance.backgroundImage = UIImage()
        appearance.backgroundColor = .white

        standardAppearance = appearance
        scrollEdgeAppearance = appearance
    }
}
```

これで消せます。
Salesforceでカスタムオブジェクトを作成して取引先に紐づく参照関係を持たせよう

取引先にカスタムオブジェクトを作成してみよう

今回やること
1調査オブジェクト作成
2調査オブジェクトを取引先に紐づけ（参照関係）
3取引先にページレイアウトを編集。関連リストの調査オブジェクトを表示


「完成イメージ」
調査オブジェクトから取引先の紐づけが可能。取引先オブジェクト側から調査オブジェクトの閲覧が可能

さあ、やってみましょう

1調査オブジェクト作成

カスタムオブジェクトをオブジェクトマネージャーから作成します
![調査オブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6e93537b-409d-7275-224e-d88102460afe.png)

2調査オブジェクトを取引先に紐づけ（参照関係）
作成されれた調査オブジェクトを取引先に紐づけます
![参照関係.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f4133146-a6fa-4b37-1bf4-35d270ef96f4.png)

3取引先にページレイアウトを編集。関連リストの調査オブジェクトを表示

取引先ページレイアウトを編集します
![関連リスト１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fd53176d-3659-530c-9b30-8cc1d36e1178.png)

以上により設定可能です。

調査オブジェクト作成の際、紐づけたい取引先を虫眼鏡から探し紐づけ可能です
![調査１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1040984a-d71f-539c-b05f-9afe7c216c4d.png)

取引先オブジェクトレコードページの関連リストから調査オブジェクトの閲覧が可能です
![関連２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b6013bd0-e73d-8084-3b31-75454d895d4f.png)
Direct Connect GatewayでVPC間が疎通してしまうことがある

# 概要

AWSの同一Direct Connect Gateway(以下DXGW)に接続したVPC間で通信が可能になっていました。以下、結論です。

- ドキュメントを読むと「単一の Direct Connect ゲートウェイにアタッチされた仮想インターフェイス間の直接的な通信」はサポートされていない、となっている
    - 仮想プライベートゲートウェイの関連付け -- https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/virtualgateways.html
- 実は、「スーパーネットが、同じ Direct Connect ゲートウェイおよび同じ仮想インターフェイス上に関連付けられている接続された仮想プライベートゲートウェイ（VGW）を持つ 2 つ以上の VPC にわたってアドバタイズされる場合です。この場合、VPC は Direct Connect エンドポイントを介して互いに通信できます。」という仕様により通信できてしまうようだ
    - Direct Connect ゲートウェイ -- https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/direct-connect-gateways-intro.html

Direct Connectのルーティングの仕様はこのように分散して記述されていたため、ちょっとわかりにくかったです。一方、Transit Gatewayを使ったときに疎通する、という仕様については以下の記事があり、これにより「ひょっとして？」と気づくことができました(感謝！)。

- Direct Connect Gateway で通信が折り返され VPC 間で疎通が可能となる仕様について -- https://blog.serverworks.co.jp/dxgw-turnback-with-tgw

# 構成と対応
![AWS_DXGW_20220711_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111095/303c1415-4851-582c-a27d-647360a689b2.png)

弊組織ではDirect ConnectでAWSと接続しており、DXGWへはBGPでアドバタイズしています。図に示したように、オンプレミスは172.18.4.0/23、172.18.6.0/23というようにいくつかの172.18.xxx.xxxネットワークがあり、それに追加する形でAWSのネットワーク構成も172.18.yyy.yyyとしています。
境界ルーターでルーティングテーブルを設定する際に、オンプレミス側への経路をまとめて172.18.0.0/16と記述していたため、この事象が起こったようです。

この場合、VPC1とVPC2の172.18.16.0/24と172.18.32.0/24が172.18.0.0/16に含まれてしまうため、DXGWによりVPC1とVPC2は疎通するみたいです。最初は境界ルーターで折り返し通信が発生してるのかな？と思ったのですが、pingでTTL=1でも疎通するので、DXGWと判断しました(境界ルーターでパケットフィルタリングしても通ってたというのもあります)。

そこで、最小限の経路にし、広告したところ、VPC間の疎通はブロックされました。今回は想定外で疎通しましたが、逆にVPC1とVPC2を含む経路を広告することで疎通させるという使い方もできるのかもしれません。

ネットワークの専門家ではないので、やり方的にどうするのが正解かはよくわかりませんが、参考になれば。
GoogleAppsScript(GAS)からQiitaAPIを使ってQiita投稿記事(限定共有記事)を投稿する。

GoogleAppsScript(GAS)からQiitaAPIを使ってQiita投稿記事(限定共有記事)を投稿しました。その際のソースコードを備忘録として残します。
後々は、GASのトリガー設定を使って、投稿記事の自動更新をさせてみる予定です。

# 本記事の環境

※PCに環境構築を行う必要はありません。
WEBブラウザ(Google Chome)
Googleアカウント

# 使用技術

GoogleAppsScriptのみ。

# 事前準備

* Qiitaにて、「設定」から「アプリケーション」を選択する。
* 「個人用アクセストークン」を発行する。※私は読み書き権限両方を付けました。
* 発行した「個人用アクセストークン」をメモする。※後で入力します。

# 手順

* 以下の成果物をGoogleスプレッドシート/拡張機能/Apps Scriptにコピー&ペーストし、「アクセストークン」と「投稿記事タイトル」を書き換える。
* 「実行」ボタンを選択して、実行が終わるまで少し待つ。
  * 初回は、承認、Googleアカウントへのログイン、リクエストの許可が求められる。
* 実行が終わったら実行ログを確認する。
* 実行ログに問題がなければQiitaの限定共有記事を確認する。

# 所感

* 欲しいGASのサンプルコードがなかなか見つからず、JavaScriptのコードを参考にしました。
* それなりの頻度でQiitaAPIが失敗することがあったので、リトライ処理の実装を考えます。

# 成果物

```javascript
// 全権限トークン
const TOKEN_ALL = "[発行したトークン]";
// 投稿記事タイトル
const ITEM_TITLE = "[投稿記事タイトル]";

// 記事投稿処理
function createQiita() {
  const apiUrl = "https://qiita.com/api/v2/items";
  const item_data = {
    'body' : "# Example",       // 投稿記事本文
    'private' : true,           // 限定共有記事にするかどうか
    'tags' : [                  // 投稿記事のタグ
      {"name" : "Qiita", "versions" : ["0.0.1"]},
      {"name" : "GoogleAppsScript", "versions" : ["0.0.1"]},
      {"name" : "QiitaAPI", "versions" : ["0.0.1"]},
    ],
    'title' : ITEM_TITLE,       // 投稿記事タイトル
  };
  const headers = {'Authorization' : 'Bearer ' + TOKEN_ALL};
  const params = {
    'method' : "post",
    'contentType' : "application/json",
    'payload' : JSON.stringify(item_data),
    'headers' : headers,
    'muteHttpExceptions' : false
  };

  const response = UrlFetchApp.fetch(apiUrl, params);
  if (response.getResponseCode() >= 300) {
    Logger.log("記事作成失敗 : " + response.getContentText());
  } else {
    const obj = JSON.parse(response.getContentText());
    Logger.log("記事作成成功 : title[" + obj.title + "]、url[" + obj.url + "]");
  }
}
```
PodmanをUbuntu 20.04にinstallする

## 何故この記事を書くの

Podmanの公式サイトから古いバージョンのUbuntuへのインストール方法が削除されてしまったため、毎回調べるのが面倒になったからです。

## なぜ公式ではこの手順が削除されたの

非推奨になったためです。この手順は新しい長期サポートバージョンの22.04ではサポートされません。20.10でも新しい手順で利用可能なため、公式ドキュメントから削除された模様です。

20.10以降を利用している場合は新しい手順を実施することを推奨します。

なお、Ubuntu 18.04のサポート期限は2023年4月、
Ubuntu 20.04のサポート期限は2025年4月です。

## 手順

```shell
. /etc/os-release

echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list

wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key -O- | sudo apt-key add -

sudo apt update -y

sudo apt install -y podman
```
[Swift] Concurrency の関数で戻り値が Void 型の時に出るエラーを解消する

# はじめに

案外、情報がなかったのでメモ程度に載せておこうかと思います。

# エラーに関して

Void 型に限らず、型が推測できないと同じエラーが出ます。

```
Generic parameter 'T' could not be inferred
```

# 具体例

以下のような関数があった場合に発生します。

```.swift
func doSomething() async throws {
    try await withCheckedThrowingContinuation { [weak self] continuation in
        // 任意のAPIメソッドを呼び出したとする
        self?.apiClient.call() { result in
            switch result {
            case .success(let response):
                continuation.resume()
            case .failure(let error):
                continuation.resume(throwing: error)
            }
        }
    }
}
```

この場合の Void 型は、暗黙的に型が推論されないようです。

# 解決策

２パターンあるので載せておきます。

## 方法１

内部関数の引数（今回は`CheckedContinuation`）に型を明示的に指定してあげることで解決します。

```diff_swift
func doSomething() async throws {
-   try await withCheckedThrowingContinuation { [weak self] continuation in
+   try await withCheckedThrowingContinuation { [weak self] (continuation: CheckedContinuation<Void, Error>) in
        self?.apiClient.call() { result in
            switch result {
            case .success(let response):
                continuation.resume()
            case .failure(let error):
                continuation.resume(throwing: error)
            }
        }
    }
}
```

## 方法２

末尾でキャストしてあげます。

```diff_swift
func doSomething() async throws {
    try await withCheckedThrowingContinuation { [weak self] continuation in
        self?.apiClient.call() { result in
            switch result {
            case .success(let response):
                continuation.resume()
            case .failure(let error):
                continuation.resume(throwing: error)
            }
        }
-    }
+    } as Void // ← ここ
}
```

# 終わりに

どちらでも良いと思いますが、１つの目の型を明示する方が王道な気はします。
関数が横長になるのは嫌なので、個人的には２つ目の方が好みです。

# 参考文献

https://stackoverflow.com/questions/68706440/async-await-function-without-a-return-swift-5-5
個人的ランキングをTwitterで共有するサービス作った話

Twitterのフォロワーにあなたの個人的ベスト３を紹介するサービスを作った話です。
フォロワーって趣味嗜好が近い人が多いと思うので、
その人たちに個人的なベスト３を見てもらうことで、
共感や異論をもらって議論するの楽しそうじゃないですか？

# 作ったもの
https://favoritetop3.jp/
## 個人的ランキングから始めるTwitterでのコミュニケーション
Twitterで自分の個人的なランキングを発表するためのWebサービス作りました。
Twitterであなたをよく知るフォロワーに向けて個人的なベスト３とその理由を投稿することで、
参考にされやすく、異論としてあなたが好みそうなものを教えてもらえたり、フォロワーと議論を楽しんだりと、
Twitterでのコミュニケーションが広がりそうじゃないですか？

## ランキングをTwitterで見やすい画像にして反応をもらうサービス
投稿したランキングをもとにシステムがTwitterで見やすいサイズの画像を作成するので、
それをTwitterに投稿することでフォロワーに自分の好きなものをアピールできます。
Twitterアカウントでログインすることで自動ツイートすることも可能です。
そしてそのランキングに、「参考になった」や「異論を唱える」ことができます。
異論を唱えるとは、他の人が作ったランキングとあなたが思うランキングが違かったときに、
このランキングだったら自分はこの順番になるというのを投稿することができる機能です。
![ツイートイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/0e3efbf7-fe98-4de9-4c41-e6ddf000bda5.jpeg)

# なんで作ったか
## ネットにはたくさんのレビューがあるけど参考にならない
何か物を買ったりする時に、最近はAmazonや価格.comなどでレビューを見てどれにするか選ぶことが多いと思います。
そんなときに、レビューがたくさんあって何を参考にすればいいかわからなくなることってないですか？

## 知らない人より知っている人のレビューの方がいい
当然のことなんですが、レビューは人の環境や性格など様々な要素で変わるので人それぞれ違います。
なので、どんな人か知っている人がしているレビュー1つの方が何百という知らない人のレビューよりも説得力があってわかりやすいと思うんですよね。


# どうやってつくったのか
使用した技術
- Next.js
    フロントエンドとバックエンドのAPIを利用
- Firebase
    TwitterアカウントでログインするのにAuthentication、データベースにFirestore Database、画像のストレージにStorageを利用
- Sharp
    Node.jsの画像編集ライブラリ。ランキング画像を作成するのに利用
- Text To SVG
    画像に文字を埋め込むのに文字をSVGするために利用。SVGをSharpで編集する
- Google Cloud Run
    サーバーレスでNext.jsをデプロイするのにCloud Runを利用
##  Cloud RunでNext.js
今回はTwitterで見やすいようにするためにOGPを実装したかったのでSSRでデプロイしようと思いました。
Next.jsをデプロイするならおそらく一番簡単なのは[Vercel](https://vercel.com/)だと思いますが、
Vercelは個人的かつ非営利的な目的な場合は無料である程度使えるのですが、
広告などを入れて収益を得ようとすると月$20のプランに加入する必要があります。
前に[YouTubeで納品する動画版Skebみたいなサービスをリリースして半年だけどユーザーがいない話](https://qiita.com/Hanull/items/f23f3211f115d87eac78)という記事を書いたのですが、
ユーザーがいるかどうかわからないサービスでは、使われた分だけお金を払う従量課金のほうがいいです。
そこで、Firebaseでデプロイしようと思ったのですが、
[FirebaseでNext.jsをSSRでデプロイ](https://qiita.com/nomu-008/items/67b75b60f59c21739fbd)するにはCloud Functionを使わなくちゃいけないようでやめました。
なので[Google Cloud PlatformでCloud Runをデプロイ](https://zenn.dev/ossamoon/articles/8b784b2f6aaeb2)しました。
[Cloud Runの料金](https://cloud.google.com/run/pricing?hl=ja)の通り無料枠もあって安心です。


## Sharpで画像作成
リンクに飛ばなくてもTwitter内でランキングの内容を確認できるようにしたかったので、
SharpというNode.jsのライブラリを使ってTwitterに画像を添付した際にきれいに見れる、
1200×1600の画像を作成します。
この画像に文字を埋め込むにはtext-to-svgというライブラリを使って文字をSVGにして、
それを画像に合成していきます。

# 最後に
ログインしなくてもランキングの画像を作成することはできるので、
このサービスを使っておすすめをフォロワーに好きなものをアピールしてみてください。

https://favoritetop3.jp/

# 参考
[Next.jsをSSRでFirebaseデプロイ](https://qiita.com/nomu-008/items/67b75b60f59c21739fbd)
[ここまで簡単になったNext.js on Cloud Run](https://zenn.dev/ossamoon/articles/8b784b2f6aaeb2)
[【Node.js】 画像処理モジュールsharpの使い方を網羅してみました](https://note.affi-sapo-sv.com/nodejs-sharp.php)
整式のわり算「22年 琉球大 教育・農・国 1(3)」をsympy でやってみた。

オリジナル

https://kamelink.com/blog/2022/07/11/1-1-22-ryuukyuudai-kyouiku%e3%83%bbnou%e3%83%bbkoku-1-3/

# sympyで

```python
# from sympy import *
var('x a b')
ans=prem(x**4+a*x**2-2*x+3,x**2+x+b)
print("#",solve([ans.coeff(x, 0),ans.coeff(x, 1)],[a,b]))
# [(-5, -1), (3, 3)]
```

# 参考
sympy.polys.polytools.prem(f, g, *gens, **args)

https://docs.sympy.org/latest/modules/polys/reference.html#sympy.polys.polytools.prem
werkzeug.securityでハッシュ化

werkzeug.securityでハッシュ化するコードを見て、
意味を理解したくて調べた内容を記載します。

前提として全然理解できなかったです。


## werkzeug.securityの基本的な使い方

generate_password_hash関数でハッシュ化できて、
check_password_hash関数で元の文字列と同じかを判定できます。

generate_password_hashで作成されるハッシュは毎回違うものになっているので、
作られて2つのハッシュを比較してもFalseになります。

なので元の文字列と同じかを判定するためにはcheck_password_hashを使う必要があります。

```py
from werkzeug.security import generate_password_hash, check_password_hash

hash1 = generate_password_hash('hogehoge')
hash2 = generate_password_hash('hogehoge')

print(hash1)  # pbkdf2:sha256:150000$*********
print(hash2)  # pbkdf2:sha256:150000$*********
print(hash1 == hash2)  # False
print(check_password_hash(hash1, 'hogehoge'))  # True
```

## werkzeug.securityを暗号化で仕様するケース

[とほほの暗号化入門](https://www.tohoho-web.com/ex/crypt.html#summary)の超サマリを見ると
暗号化するためにはSHA-512でソルトのストレッチングを10,000回程度つけるとよいそうです。

[generate_password_hash関数のコード](https://github.com/pallets/werkzeug/blob/main/src/werkzeug/security.py)を見るとデフォルト引数で`method=sha256`, `salt_length=16`になっていたので、`method='sha516, salt_length=10000'`に変えればよさそうです。


```py
from werkzeug.security import generate_password_hash, check_password_hash

hash1 = generate_password_hash('hogehoge', method='sha512', salt_length=10000)
hash2 = generate_password_hash('hogehoge', method='sha512', salt_length=10000)

print(hash1)  # sha512$*********
print(hash2)  # sha512$*********
print(hash1 == hash2)  # False
print(check_password_hash(hash1, 'hogehoge'))  # True
```



## そもそもwerkzeugとはなにか？

[GitHub](https://github.com/pallets/werkzeug)にはWSGIのユーティリティライブラリだと記載があります。

WSGI(Web Server Gateway Interface)はWebアプリとサーバーとをつなぐためにインターフェイスで
[PEP3333](https://peps.python.org/pep-3333/)で定義されてPythonで広く使わているということ。
FlaskはWerkzeugをラップして作られているそうです。

インターフェイスの1つとしてsecurityに関するハッシュ化関数も実装されていると理解しました。


## werkzeug.securityのコード

https://github.com/pallets/werkzeug/blob/main/src/werkzeug/security.py

標準ライブラリのhashlibが使われているのかな？と思って確認したぐらいです。
それ以上は難しくて読み取り断念しました。

hashlibに関してもハッシュ化してくれるライブラリですが、
同じ文字は同じハッシュになってしまいます。

hashlibでもsha512でのハッシュ化も可能だし、
ソルトつけたりはできそうでしたが、werkzeug.securityを使った方がチェックが楽そうでした。

```py
import hashlib

hash1 = hashlib.sha256(b'hogehoge').hexdigest()
hash2 = hashlib.sha256(b'hogehoge').hexdigest()

print(hash1)  # *********
print(hash2)  # *********
print(hash1 == hash2)  # True
```
Ubuntuでipアドレスをメッセージボックス表示する方法

# 結論
コード
```terminal
$ zenity --info --text=$(hostname -I) &
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222532/689adfec-3eb7-db1a-ab18-17b74e1a4f6c.png)

# 解説
Zenityコマンドは、簡単なポップアップを表示するための機能でUbuntuに標準で備わっています。
Hostnameを呼び出し、その結果を引数に渡しています。

Zenityの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222532/c71a0c3d-0792-08f0-76bc-8d54e4a7da78.png)

Hostnameの例
```terminal
$ hostname -I
xxx.xxx.xxx.xxx
```
以上となります。
今回はちょっと薄味でした。
特に詳しく解説することが無いので...

おまけ程度に
```terminal
--title="hogehoge"
```
とするとタイトルつけられたり、とか


# 参考にしたサイト
https://moomindani.wordpress.com/2014/09/17/linux-command-ip-address/
https://unix.stackexchange.com/questions/144924/how-can-i-create-a-message-box-from-the-command-line
firebase initの途中のGithub workflowを設定できない現象の対処法

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[もぐめっと](https://mogmet.com)です。

今回はfirebase initをしていたら引っかかったのでトラブルシューティング記事です。

## トラブル内容

firebase initをしたときのgithubとのworkflow連携で下記のような質問がきました。
```shell
? For which GitHub repository would you like to set up a GitHub workflow? (format: user/repository)
```

しかしいくらEnterを押して指定してもうんともすんとも進んでくれなくなりました。
困りました。

## 対処法

答えは下記に書いてありました。

https://github.com/firebase/firebase-tools/issues/3143#issuecomment-912356514

> Thanks - was wondering why Firebase CLI wouldn't accept my organisations repo. For anyone else needing to do this the direct link to the Firebase CLI OAuth setting is https://github.com/settings/connections/applications/89cf50f02ac6aaed3484

原因はorganizationに権限がないだけでした！
ということで、[firebase権限の設定ページ](https://github.com/settings/connections/applications/89cf50f02ac6aaed3484)からGrantをしてあげます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/80e1df89-6c18-09e1-cef9-f27bbe0eb727.png)

これで無事にworkflowも設定されるようになりました。

## まとめ

**firebase initをやる前にgithubでのfirebase権限を確認しておこう！**

最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com
WPFのXAMLで複数選択ComboBox

XAMLで複数選択できるComboBoxするメモ
参考サイトのIListがよく知らなかったので、Dictionaryに戻して利用した更新差分

``` c#
        public static readonly DependencyProperty ItemsSourceProperty =
             DependencyProperty.Register("ItemsSource", typeof(Dictionary<string, object>), typeof(MultiSelectComboBox), new PropertyMetadata(null,
        new PropertyChangedCallback(MultiSelectComboBox.OnItemsSourceChanged)));

        public static readonly DependencyProperty SelectedItemsProperty =
         DependencyProperty.Register("SelectedItems", typeof(Dictionary<string, object>), typeof(MultiSelectComboBox), new PropertyMetadata(null,
     new PropertyChangedCallback(MultiSelectComboBox.OnSelectedItemsChanged)));

        public static readonly DependencyProperty TextProperty =
           DependencyProperty.Register("Text", typeof(string), typeof(MultiSelectComboBox), new PropertyMetadata(null));

        public static readonly DependencyProperty DefaultTextProperty =
            DependencyProperty.Register("DefaultText", typeof(string), typeof(MultiSelectComboBox), new PropertyMetadata(null));



        public Dictionary<string, object> ItemsSource
        {
            get { return (Dictionary<string, object>)GetValue(ItemsSourceProperty); }
            set
            {
                SetValue(ItemsSourceProperty, value);
            }
        }

        public Dictionary<string, object> SelectedItems
        {
            get { return (Dictionary<string, object>)GetValue(SelectedItemsProperty); }
            set
            {
                SetValue(SelectedItemsProperty, value);
            }
        }
```

``` C#
        private void SetSelectedItems()
        {
            if (SelectedItems == null)
                SelectedItems = new Dictionary<string, object>();
            SelectedItems.Clear();
            foreach (Node node in _nodeList)
            {
                if (node.IsSelected && node.Title != "All")
                {
                    if (this.ItemsSource.Count > 0)

                        SelectedItems.Add(node.Title, this.ItemsSource[node.Title]);
                }
            }
        }
```

### 参考サイト

https://www.codeproject.com/Articles/1113130/Multiselect-Combobox-Windows-Custom-Control-simula

https://www.codeproject.com/Articles/31105/A-ComboBox-with-a-CheckedListBox-as-a-Dropdown

https://qiita.com/tera1707/items/73cda312b7cd9c4df40d

https://qiita.com/yaju/items/369cb5be0c0298859b3e#wpf
内定に近づくSTARメソッド式職務経歴書の書き方

# 初めに
職務経歴書にどのような内容を記載したらいいか、またどのようにまとめればいいか困ったことはありませんか？

私もその一人でしたが、STARメソッドを知ってから、職務経歴の棚卸しやそのまとめが捗り、**ワンランク上の職務経歴書**にすることができ、面接にも活かすことかできました。

結論として、無名中小Sierの2流エンジニアが、大手Sierなどから内定頂きました。

# STARメソッドに出会うまでの職務経歴書
某転職サイトのテンプレートに沿って、プロジェクト概要、担当工程、業務内容、実績を書いてみる。

自分で読んでも、強みが伝わらないし、ありきたりな文書で目に止まる経歴書じゃないなと感じる。
（テンプレートに囚われすぎて、アピールする文章を書けてないだけかもしれませんが）

どうしたらワンランク上の職務経歴書になるんだと調べたとこで、STARメソッドと出会う。

# そもそもSTARメソッドとは
主に外資系の面接で、**思考プロセス**や**行動の特性**を見極める際に使われている手法のこと。

STARは、以下4つの頭文字を取ってそう呼ばれており、4つの側面から行動の特性などを図ります。

* Situation：状況
* Task：課題
* Action：行動
* Result：結果

# STARメソッドのメリット
* 状況から結果までストーリーで書ける
* 面接でそのまま話せる
（情報が整理されているから、理路整然と相手にも説明できる）
* 書面上でも、プロジェクトに対する貢献、成果が伝わる。



## S：状況（Situation）
* おかれていた状況、課題、背景等を整理して、ストーリーの舞台を決める。

例えば）システムリプレイスプロジェクトに製造フェーズから参画したが、リプレイス機能が決まっていない、機能の開発工数が明確になっていない。

## T：課題（Task）
* 状況に対する自身の役割、ミッションを整理する。

例えば）プロジェクトリーダーとして、リプレイス機能の明確化、開発コストの見積、リスケジュール調整等を行う必要がある。

## A：行動（Action）
* 課題に対して、どのように取り組んだかを整理する。

例えば）リプレイス機能の明確化は、現行システムで運用上利用されていない機能、現行システムで発生しないデータに対する処理を移行する（リプレイス範囲）必要があるか確認。
開発コストの見積は、現行システムの機能・仕様を把握していないため、現行ソースコードのステップ数、1時間あたりの移行可能ステップ数、開発者のスキルレベルから算出。

## R：結果（Result）
* 行動に対する成果を整理する。一番分かりやすい指標として定量的なもの（○%削減、生産性比率○%）があると良い。
* 顧客に対してどのような効果があったかや、評価、フィードバックを得られたかなども情報としてあると良いです。（例えば、品質が評価され、○人月規模案件獲得）
* 社内からの評価もあっても良いと考えます。（例えば、最年少or最短で昇格など）

## 補足
どの観点においても定量的に記載できるものは数字を記載しましょう。

# 成果
STARメソッド式職務経歴書で書類選考に挑んだ結果、応募5社中3社書類選考通過になりました。

* 大手外資系コンサル
書類選考通過
　↓
1次面接通過（2次面接辞退）

* 大手独立系Sier
書類選考通過
　↓
1次面接通過
　↓
最終面接通過（内定）

* 大手ERPパッケージ開発ベンダー
書類選考通過
　↓
1次面接通過
　↓
最終面接通過（内定辞退）
ASP.NET Core(C#)でQRコードを生成しブラウザに表示する

## はじめに

C#でQRコードを生成しブラウザに表示するコードのサンプルです。

環境は、ASP.NET Core Razor Pages + .NET 6です。

ソースファイルは、GitHubで公開しています。
https://github.com/gushwell/QRCodeSample


## ASP.NET Core プロジェクトの作成

Visual Studioを使い、ASP.NET Coreのプロジェクトを作成します。

1. Visual Studio 2022 を起動し、 [新しいプロジェクトの作成] を選択します。
2. [新しいプロジェクトの作成] ダイアログで、 [ASP.NET Core Web アプリ] を選んで、プロジェクトを作成します。
3. フレームワークを選択するダイアログでは、[.NET 6.0] を選択します。

Visual Studio Codeの場合は、以下のコマンドをタイプします。

```
dotnet new webapp -o QrCodeExample
```

`-o` パラメータではプロジェクトの名前を指定します。ここでは、QrCodeExampleとしました。


## NuGetを使いQRCoderパッケージインストールする

[QRCoder](https://github.com/codebude/QRCoder/)は、C＃.NETで記述されたQRコードを作成するライブラリです。とても簡単なコードで、QRコードを生成できます。.NET Framework にも、.NET Core系にも対応しています。



NuGetパッケージマネージャーを使いQRCoderパケージをインストールします。
csprojファイルに、以下の記述を追加します。Visual Studio の NuGetの機能を使ってインストールしてもOKです。

```xml
  <ItemGroup>
      <PackageReference Include="QRCoder" Version="1.4.3" />
  </ItemGroup>
```

## HTMLで画像を表示する方法

今回は、HTMLのimgタグに直接QRコードの画像データを埋め込むことにします。

以下のように、画像のbyte配列のデータをBase64にしてsrc属性に記述してあげることで、画像をHTMLに埋め込むことができます。

```html
<img src="data:image/png;base64,{base64文字列}">
```


## QRコードを生成するコードを書く

ここでは、Index.cshtml.cs のOnGetメソッドに、QRコードを生成するコードを記述することにします。

まずは、index.cshtml.csに、ImageSrcというプロパティを定義します。

```cs
public class IndexModel : PageModel
{
...
	public string ImageSrc { get; set; } = String.Empty;

...
}
```
この`ImageSrc`プロパティに、`"data:image/png;base64,Qk1MAA......"` といった文字列を格納し、Index.cshtmlの中でバインドさせることにします。

次に、OnGetメソッドを以下のように書き換えます。

```cs
	public IActionResult OnGet()
	{
		var text = "https://qiita.com/gushwell";
		var qrGenerator = new QRCodeGenerator();
		var qrCodeData = qrGenerator.CreateQrCode(text, QRCodeGenerator.ECCLevel.Q);
		var qrCode = new PngByteQRCode(qrCodeData);
		var bytes = qrCode.GetGraphic(10);
        var base64Str = Convert.ToBase64String(bytes);
		ImageSrc = String.Format("data:image/png;base64,{0}", base64Str);
		return Page();
	}
}
```

ここでは、話を単純化するために固定的な文字列をQRコードに変換しています。


## cshtmlファイルを変更

index.cshtmlファイルにimgタグを追加します。

QRコードを表示するだけのページなので、以下のような`<img>`タグがあればあとは何でもOKです。

```html
<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <img src="@Model.ImageSrc" />
</div>
```

`@Model.ImageSrc`が、IndexModelのImageSrcプロパティの内容に置き換えられます。

## 実行する

以下のようなページが表示されればOKです。

![スクリーンショット 2022-07-09 20.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29415/a2637d9b-143d-ea04-961e-c138126a0271.png)
100日後くらいに個人開発するぞ！day053

## 今日はクラスとインスタンスの復習をしてみた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/cdacd228-7f7c-d737-1530-18692e665420.png)

## Ruby学習レッスンIVコースを修了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/350b9f91-253b-e0a2-d649-b9c7a0761df8.png)




## 今日の備忘録
### クラス
* プログラムの設計図をクラス、生成されるものをインスタンスという
* インスタンスを生成するステップ
    * クラス（設計図）を用意する
    * クラスからインスタンスを生成する
    * インスタンスに情報を追加する
* クラスは「class クラス名」で定義できる
    * クラス名は必ず大文字で始める
    * 「end」を書く必要がある



### インスタンス変数
* クラスのインスタンスの変数をインスタンス変数という
    * 例：Menuクラスにnameというインスタンス変数を設定する場合
        * `class Menu`
        * ` attr_accessor :name`
        * `end`
* 1つのクラスに対して複数のインスタンス変数を用意できる
    * 例
        * `class Menu`
        * ` attr_accessor :name`
        * ` attr_accessor :price`
        * `end`

### インスタンス
* 新しくインスタンスを作成するには「クラス名.new」とする
* 「変数名＝クラス名.new」とすることで生成したインスタンスを変数に代入することができまる
*「インスタンス.変数名＝値」とすることでインスタンス変数に値を代入することできる



### クラスの中で定義したメソッドの使い方
* クラスの中でメソッドを定義でき、「インスタンス.メソッド名」で呼び出せる
    * 例
        * `class Menu`
        * ` attr_accessor :name`
        * ` attr_accessor :price`
        * ` def show`
        * `  puts "私はメニューです"`
        * ` end`
        * `end`
        * `menu1 = Menu.new`
        * `puts menu1.show`
* インスタンスメソッドも引数を受け取ったり戻り値を返すことができる
    * 例
        * `class Menu`
        * ` attr_accessor :name`
        * ` attr_accessor :price`
        * ` def show(data)`
        * `  return "私は#{data}です"`
        * ` end`
        * `end`
        * `menu1 = Menu.new`
        * `puts menu1.show("メニュー")`


### インスタンスメソッドの中でインスタンス変数を使う方法
* インスタンスメソッドの中で「self.変数名」を使うことでインスタンス変数を使える
    * 例
        * `class Menu`
        * ` attr_accessor :name`
        * ` attr_accessor :price`
        * ` def show_name`
        * `  return "私は#{self.name}です"`
        * ` end`
        * `end`
        * `menu1 = Menu.new`
        * `menu1.name = "ピザ"`
        * `menu1.show`
複数条件でリストを名寄せする(SPSS Modeler データ加工逆引き6-5)

# 複数条件でリストを名寄せ（名寄せ）

![スクリーンショット 2022-07-08 10.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3b52f5db-14f1-0427-a919-15a15c01bcf7.png)

## 1.想定される利用目的

・顧客マスタや取引先マスタデータのクレンジング
・対象データの精査

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/conditional_matching.str?raw=true

## 3.サンプルストリームの説明
![スクリーンショット 2022-07-08 10.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/51a8b527-bdaa-955a-aaf1-3d769102f9bb.png)

a.入力するデータひとつ目は以下の通りです。こちらを主テーブルにします。
![スクリーンショット 2022-07-08 10.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/92026482-2879-d7b2-012c-2a151cad0076.png)

b.入力するデータ２つ目は以下の通りです。AAA社は完全一致していますがCCC社は郵便番号が、DDD社はメールアドレスが変更されています。
![スクリーンショット 2022-07-08 10.37.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ca61cc86-c0c1-2b09-bb2a-bae737a2205f.png)

c.[レコード結合]ノードを編集します。[レコード結合方法]は[条件]を選択し[重複したフィールド名に...]をチェックしてテーブルの由来を確認します。条件は式ビルダで記述し、aを主テーブルにして部分外部結合します。
![スクリーンショット 2022-07-08 10.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ad9744cb-3bb8-10eb-9157-a1439b9f5ccf.png)

[テーブル]を実行します。BBB社は郵便番号もメールアドレスも異なったためNULLが入りましたがCCC社とDDD社は条件を満たしたので結合されました。
![スクリーンショット 2022-07-08 10.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2c1420c0-4076-2c82-6137-715cddac3ec5.png)

#### 注意事項

IDなどの数字の羅列の場合に片方のテーブルは整数型でもう一つが文字型で認識されているとキーとして不一致を起こすため事前に型の確認と変更が必要です。

## 4.参考情報

#### 名寄せの解説記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-03/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
cscの作法 その236

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
ソリューションファイルslnを書いて、msbuildせよ。

# サンプルコード

```
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.23107.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test0", "test0.csproj", "{D1FFA0DC-0ACC-4108-ADC1-2A71122C09AF}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{D1FFA0DC-0ACC-4108-ADC1-2A71122C09AF}.Debug|Any CPU.ActiveCfg = Debug|x86
		{D1FFA0DC-0ACC-4108-ADC1-2A71122C09AF}.Debug|Any CPU.Build.0 = Debug|x86
		{D1FFA0DC-0ACC-4108-ADC1-2A71122C09AF}.Release|Any CPU.ActiveCfg = Release|x86
		{D1FFA0DC-0ACC-4108-ADC1-2A71122C09AF}.Release|Any CPU.Build.0 = Release|x86
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
EndGlobal




```

# 実行手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>msbuild test0.sln

>hello3

```

以上。
「漏えい等」の考え方

### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---

# 個人データの漏えい等の報告等
## 「漏えい等」の考え方
### 「漏えい」とは？
#### 個人データが外部に流出すること

##### 「漏えい」の例
* 例）個人データが記載された書類を第三者に誤送付した場合
* 例）個人データを含むメールを第三者に誤送信した場合
* 例）システムの設定ミス等によりインターネット上で個人データの閲覧が可能な状態となっていた場合
* 例）個人データが記載又は記録された書類・媒体等が盗難された場合
* 例）不正アクセス等により第三者に個人データを含む情報が窃取された場合

（＊ 個人データを第三者に閲覧されないうちに全てを回収した場合は、漏えいに該当しない）
（＊ 自らの意図に基づき個人データを第三者に提供する場合は、漏えいに該当しない。ただし、第三者提供の規定に従うこと）

### 「滅失」とは？
「滅失」とは、個人データの内容が失われること

##### 「滅失」の例
* 例）個人情報データベース等から出力された氏名等が記載された帳票等を誤って廃棄した場合（当該帳票等が適切に廃棄されていない場合には、個人データの漏えいに該当する場合がある）
* 例）個人データが記載又は記録された書類・媒体等を社内で紛失した場合（社外に流出した場合には、個人データの漏えいに該当する）
（＊同じデータが他に保管されている場合は、滅失に該当しない）
（＊合理的な理由により個人データを削除する場合は、滅失に該当しない）

### 「毀損」とは？
* 個人データの内容が意図しない形で変更されること
* 内容を保ちつつも利用不能な状態となること

##### 「毀損」の例
* 例1）個人データの内容が改ざんされた場合
* 例2）暗号化処理された個人データの復元キーを喪失したことにより復元できなくなった場合
* 例3）ランサムウェア等により個人データが暗号化され、復元できなくなった場合（同時に個人データが窃取された場合には、個人データの漏えいにも該当する）

（＊上記例2）例3）の場合であっても、同じデータが他に保管されている場合は毀損に該当しない）


https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a3-5-1
cscの作法 その235

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
プロジェクトファイルcsprojを書いて、msbuildせよ。

# サンプルコード

```
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
	<ItemGroup>
		<Compile Include="hello3.cs" />
	</ItemGroup>
	<Target Name="Build">
		<Csc Sources="@(Compile)" />
		<Message Text="source files: @(Compile)" />
	</Target>
</Project>





```

# 実行手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v2.0.50727;%PATH%


>msbuild test0.csproj

>hello3

```
以上。
データ内容の正確性の確保等、安全管理措置

### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---

# 個人データの管理
## データ内容の正確性の確保等（努力義務）
* ### 利用目的の達成に必要な範囲内において、個人データを正確かつ最新の内容に保つように努める。

##### 正確性や最新性を確保するための例
- 個人情報の入力時の照合・確認の手続の整備
- 誤り等を発見した場合の訂正等の手続の整備
- 記録事項の更新、保存期間の設定
等

＊ 保有する個人データを、一律に、または、常に最新化する必要はなく、それぞれの利用目的に応じて、その必要な範囲内で正確性・最新性を確保すればいい

* ### 利用する必要がなくなったとき（利用目的が達成された場合、事業自体が中止となった場合等）は、個人データを遅滞なく消去するよう努める

＊ 法令の定めにより保存期間等が定められている場合は除く

##### 「個人データの消去」とは？
個人データを個人データとして使えなくすることであり、削除することのほか、特定の個人を識別できないようにすること等を含む

##### 個人データについて利用する必要がなくなった例
例） キャンペーンの懸賞品送付のため、そのキャンペーンの応募者の個人データを保有していたところ、懸賞品の発送が終わり、不着対応等のための合理的な期間が経過した場合


https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a3-4-1

## 安全管理措置
### 取り扱う個人データの漏えい、滅失、毀損の防止その他の個人データの安全管理のために必要かつ適切な措置を講じなければならない

#### 個人データの安全管理措置において考慮するべき事項
* 個人データが漏えい等をした場合に本人が被る権利利益の侵害の大きさ
* 事業の規模及び性質
* 個人データの取扱状況（取り扱う個人データの性質及び量を含む）

#### 具体的に講じなければならない措置や当該措置を実践するための手法の例等
* [（別添）講ずべき安全管理措置の内容](ttps://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a10)

https://www.ppc.go.jp/personalinfo/legal/guidelines_tsusoku/#a3-4-2
【Python】ブラウザが送信しているHTTP POSTを再現する

# 概要
動的サイトは通常、ブラウザからwebサーバにリクエストを送信し、新しいコンテンツを取得することでページの内容を更新する。
この通信をPython上で再現したい状況がよくあると思うので方法を記載する。
今回はPOSTリクエストを対象とする。

## 動作環境
```Bash
python --version
Python 3.7.13
```

# ChromeでPOSTデータを確認する
まずは実際に通信を発生させて中身を確認する。

1. ChromeのDevToolsの[Network]タブを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693937/8b2f99a5-4cbd-0c0b-9da9-a782d9edf405.png)

1. ブラウザにて再現対象の操作を行い通信を発生させる。
（ex. フォームへの入力・送信、スクロールなど）

1. リクエストごとの結果がDevToolsに表示され、クリックすると詳細を確認できる。
こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1693937/ebf3cef9-8425-a9ce-b89b-f12e0dbe680a.png)

# `curl`で通信を再現する
Pythonで再現する前に`curl`で再現する（方法を確認する）必要がある。
1. DevTools上のリクエストの結果を右クリックして[Copy]→[Copy as cURL (bash)]を選択する。
1. コピーしたコマンドをターミナル等で実行すれば同じリクエストを送信できる。

# Pythonで通信を再現する
Pythonの`requests`ライブラリでPOSTリクエストを送信できる。
上述した`curl`コマンド内容を`requests`ライブラリで使えるように書き換えることでPython上でも同じ通信を再現できる。
`requests`公式ドキュメントを見ながら手で書き換えてもよいが、
`curl`から各言語用HTTP通信ライブラリ記法に変換してくれる非常に便利なサイトがあるのでそちらを利用する。
もちろん`requests`に変更可能。
[bfotool](https://bfotool.com/ja/curl-to-python/)
ここで変換したPythonコードをそのまま実行するだけで通信を再現できる。

# 参考
https://btj0.com/blog/web/chrome-post/
https://dev.classmethod.jp/articles/python-requests-low-level-api/
https://python.civic-apps.com/http-request-post-get/
https://hibiki-press.tech/python/requests_module/1882
個人情報取扱事業者等の義務

### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---

# 個人情報取扱事業者等の義務

## 個人情報の利用目的
- 利用目的の特定
- 利用目的の変更
- 利用目的による制限
- 事業の承継
- 利用目的による制限の例外
 
## 不適正利用の禁止

## 個人情報の取得
- 適正取得
- 要配慮個人情報の取得
- 利用目的の通知又は公表
- 直接書面等による取得
- 利用目的の通知等をしなくてよい場合

## 個人データの管理
- データ内容の正確性の確保等（努力義務）
- 安全管理措置
- 従業者の監督
- 委託先の監督

## 個人データの漏えい等の報告等
- 「漏えい等」の考え方
- 漏えい等事案が発覚した場合に講ずべき措置
- 個人情報保護委員会への報告
- 本人への通知
## 個人データの第三者への提供
- 第三者提供の制限の原則
- オプトアウトによる第三者提供
- 第三者に該当しない場合
- 外国にある第三者への提供の制限
- 第三者提供に係る記録の作成等
- 第三者提供を受ける際の確認等（法第30条関係）
## 個人関連情報の第三者提供の制限等（法第31条関係）
- 法第31条の適用の有無について
- 本人の同意の取得方法
- 本人の同意等の確認の方法（法第31条第1項関係）
- 提供元における記録義務（法第31条第3項、第30条第3項関係）
- 提供先の第三者における確認義務（法第30条第1項）
- 提供先の第三者における記録義務（法第30条第3項関係）
## 保有個人データに関する事項の公表等、保有個人データの開示・訂正等・利用停止等（法第32条～第39条関係）
- 保有個人データに関する事項の公表等（法第32条関係）
- 保有個人データの開示（法第33条第1項～第4項関係）
- 第三者提供記録の開示（法第33条第5項、第1項～第3項関係）
- 保有個人データの訂正等（法第34条関係）
- 保有個人データの利用停止等（法第35条関係）
- 理由の説明（法第36条関係）
- 開示等の請求等に応じる手続（法第37条関係）
- 手数料（法第38条関係）
- 裁判上の訴えの事前請求（法第39条関係）
## 個人情報の取扱いに関する苦情処理（法第40条関係）
## 仮名加工情報取扱事業者等の義務（法第41条・第42条関係）
## 匿名加工情報取扱事業者等の義務（法第43条～第46条関係）
【VSCode】ファイル保存時にRuboCopで自動修正する【RuboCop】

## 拡張機能をインストール
以下の拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby

## setting.jsonを編集
`setting.json`に以下のように追記します。

```setting.json
{
  "editor.defaultFormatter": "rebornix.ruby",
  "editor.formatOnSave": true,
  "ruby.useLanguageServer": true,
  "ruby.lint": {
    "rubocop": {
      "useBundler": true,
    }
  },
  "ruby.format": "rubocop"
}

```

これで保存時にRuboCopで自動修正をすることができるようになります。
SES企業に勤めながらWEBエンジニアに転職するブログ ~2day

<h1>2day</h1>

おはようございます。

<b>１．2022年7月：基礎学習
　　HTML,CSS,ruby,コンピューターサイエンス基礎...等々</b>

２．2022年8月～10月：ポートフォリオ作成①
　　ウェブサイト作成

３．2022年11月～1月：ポートフォリオ作成②
　　IOSアプリ開発

４．2022年2月～6月：ポートフォリオ作成③
　　webアプリケーション開発

５．2023年7月～8月：webエンジニアへの転職活動

↑現在、上記の「１」のフェーズ中です。

2日目となる昨日は、HTML/CSSを下記のサイトで学習しておりました。

http://www.htmq.com/tutorial/

個人的にとても分かりやすくて良い学習サイトだなぁと思っています。

3日目も日中は仕事ですが頑張ります。
Arduino UNOと温度センサーS-8120Cで温度をシリアル出力(整数)



目的
安価に温度を測る。

v = -8.2 * t + 1705

式の変形

t = (v - 1705.0) / -8.2;

t = DIV082( (1705 - v) );



![o_con569.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/dbe6df2e-9512-6374-43ab-f94e1e8a0a90.jpeg)


![o_con572.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/21848fe4-e2dd-c070-ba03-ddc51ef3dca7.jpeg)


ADCの値を5Vに変換は、親切な人に教えて貰った。
1024*39.0625=40000
　　　        40000/4=5000


https://qiita.com/caa45040/items/09848d08a81b0d157458


プログラム

```c++


//SER_S-8120C_DEC_UNO_1

//0.82で割る 0から400までは、なんとなく正しい+-1
#define DIV082(n) (((n)*78)>>6)

#include <Arduino.h>

//初期化処理
void setup()
{

  //シリアルの初期化
  Serial.begin(9600);

} //setup

//メインループ
void loop()
{

  //センサーの値を読み込む
  int s = analogRead(A0);   // センサーの読み取り値

  //センサーのADC値を電圧に変換
  int v = ( ( (unsigned int)0b100111 * (unsigned int)s + (s >> 4 ) ) >> 3);

  //センサーの電圧を温度に変換 温度の10倍を出力 ex 20.1 => 201
  // v = -8.2 * t + 1705  =>  t = (v - 1705.0) / -8.2;
  // => t = (1705 - v) / 0.82
  int t = DIV082( (1705 - v) );

  //温度の表示
  Serial.print(t / 10);
  Serial.print('.');
  Serial.print(t % 10);
  Serial.println();

  //1秒の待ち
  delay(1000);

} //loop




```