OmniAICreator/Qiita-1.07M huggingface dataset:
[JP1/AJS3]ややこしい単語たちの整理（カレンダーvsスケジュールvsスケジューラーサービス）


JP1で出てくる以下単語がわかりにくかったのでメモ。

- カレンダー
- スケジュール
- スケジューラーサービス

### カレンダーとは
- 一言でいうと、 **「「運用日」と「休業日」の情報を定義し、下位のジョブネットへ情報を与えるもの」。** 
- イメージ、↓みたいな感じ。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171131/712dbc5a-ae58-e021-93cd-796f673fcb4d.png)
-  ここで、土曜日と日曜日が「休業日」である旨JP1に教えてあげる。
- その後、「運用日」についても教えてあげる必要がある。↓の画像で青が運用日。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171131/569687bc-8054-6cca-8bce-c50e191cedd2.png)
- というふうにこれでカレンダーが出来上がる。 **ただ、これでは本当にカレンダーができただけなので、スケジューラと呼ばれるジョブ制御の仕組みからカレンダーを参照する必要がある。** 
- なお、ジョブグループに対しカレンダーは一つ（たぶん）。一つのジョブグループ配下で別のカレンダーを参照させたい場合、↓のように別ジョブグループを切り、そこを参照させる必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171131/dd5bf489-60c7-a0b0-9695-e9c8a1c50dde.png)
- 具体的な操作はスケジュールの項目で解説。

参考文献
https://itpfdoc.hitachi.co.jp/manuals/3020/30203S0133/AJSZ0054.HTM
http://itdoc.hitachi.co.jp/manuals/3020/30203K2143/AJSF0118.HTM
https://www.hitachi-ac.co.jp/app-pdf/JPJ065.pdf
p.4「運用スケジュール」

### スケジュールとは
- 一言でいうと、 **「その日にジョブネットを稼働させるかどうかを判断する直接条件」。** 判断の過程で前述のカレンダーを参照する。
- ジョブネット単位で持つことが基本。
    - ジョブネットがネスト（階層で定義）されている場合、上位のジョブネットに従うが、下位のジョブネットで独自定義することも可能。
- カレンダーを見て、休業日の場合は休業日としての動作を行う。
    - 大雑把には、「翌営業日に実施する」「その日は実行しない」「構わず実行する」の選択肢があるよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171131/80c0b094-6c0d-6fd0-c988-09e617f7e91e.png)
- 参照できるカレンダーは選べる。他のジョブグループのカレンダーを参照できるようにするには以下の設定。
> ［スケジュールの設定］ダイアログボックスで，［他のジョブグループのカレンダーを参照］を選択します。大阪業務1，大阪業務2は，大阪支社ジョブグループのカレンダーを参照させます。名古屋業務1，名古屋業務2は，名古屋支社ジョブグループのカレンダーを参照させます。
- 実行開始時刻という考え方があり、大変複雑。これは別の記事に譲る。

## スケジューラーサービスとは
- まずは日立社のドキュメントから。
> スケジューラーサービスとは，マネージャーホストのJP1/AJS3サービスに含まれる，ルートジョブグループを管理する制御単位です。最上位のジョブグループとして，JP1/AJS3に必ず定義されていて，ルートジョブグループ名を「/（スラント）」で表します。
> スケジューラーサービスを多重起動させると，ルートジョブグループをスケジューラーサービスごとに管理できるようになります。1個または複数個のスケジューラーサービスで，4,000～5,000個以上のジョブネットやジョブを管理（定義，実行登録，監視）するには，資源に限界があります。そのため，CPUを多数搭載するようなシステムの場合には，スケジューラーサービスの多重起動について事前に検討してください。

- 正直、あまり理解できなかったものの、
- 他のドキュメントから総合すると、一言でいうと、 **「ルートジョブグループとニアリーイコール。ルートジョブグループを分割する場合、スケジューラサービスの分割も必要。」** （ちょっと自信ない）
    - おそらくだけど、ルートジョブグループは論理的な考え方なのに対し、スケジューラーサービスは物理的な考え方で、後者は稼働ホストの物理資源の管理に重点が置かれている気がする。
    - ルートジョブネットがサービスだとすると、スケジューラーサービスはプロセス、、、的な。
- 分割するかどうかは、以下の観点から検討する。
> また，実行登録するジョブネットの数が多い場合にも，処理性能を考えて4,000～5,000個を目安にジョブネットを分割し，スケジューラーサービスを多重起動する運用を検討してください。
- だけど、 **これは物理的な話しかしていない。運用上、ルートジョブネットを分けたければ、ジョブネットが4000以下でもスケジューラサービスを分割することを検討するべき。** 
- ルートジョブグループの分割した際の運用上の挙動としては
    - カレンダーなど、他のルートジョブグループの資源が参照できない。
    - 基準日・月区分・基準時刻といった、ジョブグループのネストの際の設定が継承されない。
        - 例えば、ルートジョブグループがこの設定を持っていた場合、それをネストできない。
    - という感じです。まだあるかも、、あれば追記します。

参考文献
http://itdoc.hitachi.co.jp/manuals/3020/30203S0332/AJSH0076.HTM
http://itdoc.hitachi.co.jp/manuals/3020/30203S1730/AJSE0063.HTM
表5-6　ジョブグループ定義情報部の内容


JP1のドキュメント難しい、、ので、また何かあればここへまとめます。
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その013

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
オブジェクトマネージャと Lightning アプリケーションビルダーの確認
にある練習問題1問目をご紹介します。

https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/practice-user-setup


なお、こちらの内容はYouTubeでも公開しております

https://www.youtube.com/watch?v=MqwqReYCCv0

<iframe width="560" height="315" src="https://www.youtube.com/embed/MqwqReYCCv0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>




オブジェクトマネージャと Lightning アプリケーションビルダーの確認
練習問題1問目はこちらです

![0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/54fc9ee2-14b3-afd7-b531-63027802402f.png)


商談に関する情報を保管する標準オブジェクトはどれですか？という問題ですね

正解はDです


当たり前ですが商談を管理するオブジェクトは商談オブジェクトですね


なお、Aは企業の情報を管理するオブジェクトなので間違い

Bは購入した特定の商品を管理するオブジェクトなので間違い

Cは商品情報を管理するオブジェクトなので間違い　です

皆さんもどの標準オブジェクトがどのデータを管理すべきかよく確認しましょう



今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
現場で覚えたVue知識【備忘録】 ①


# 初めに
現場で初めてVueを扱うことがあり、これまでのASP.NETをやっていた時と比較して、結構違う内容があったので、覚えた内容を残していきます。
一部認識齟齬などがあればすみません。

## 前提
Vueの基本的な構造として、親コンポーネントが存在し、その上に、子コンポーネントを複数配置するという画面の構造になっていることが多いです。

【親コンポーネント】
----Parent.Vue（画面の上部にある共通ヘッダーや下部に戻るや次へのボタンなど）
　（画面に入力や表示する内容を３層に分けた場合）
    【子コンポーネント】
-------Child_1.Vue（例：個人情報入力欄）
-------Child_2.Vue（例：勤務先入力欄）
-------Child_3.Vue（例：その他情報入力欄）

## 初心者がまず覚えるべきVueのプロパティ系

見出しと概要のみ記載します。

vue.js:
## props
→子コンポーネントが親コンポーネントから値を受け取る場合に使用する。
```vue:test.vue
props: {
  vaule1:{
      type:string
  }
},
```
## v-bind
→ propsと一緒に使用するもの。
→親コンポーネントから子コンポーネントに値を渡す際に、子コンポーネントの呼び出し用のタグ内に記載します。
→子コンポーネントで受け取る際にはpropを使用します。
```vue:test.vue
 <Child_1 v-bind ="value1" />
```

## emit
→子コンポーネントから親コンポーネントへ値を渡す場合に使用する。
→emitで指定したい値とイベント名を指定する。
```vue:test.vue
 <button v-on:click="$emit('setValue','abc')">閉じる</button>
```
## v-on
→ emitと一緒に使用するもの。
→子コンポーネントから親コンポーネントに値を渡す際に、親コンポーネントでemitを受け取る、子コンポーネントタグの中に指定する。その際にemit時に指定したメソッド名をケバブケースで表現する。ダブルコーテーション内でその親画面で呼び出す際のメソッド名を指定する。
```vue:test.vue
<Child_1 v-on:set-value="setShori"></modal>

  methods: {
    setShori() {
      this.testA = 'abc'
    }
  }
```
## watch
→値の変化の監視を行いたいデータを内部にfunctionで定義することで、値の変更時に処理を行いたい時に拾ってくれるプロパティ。

## mount
→コンポーネントが画面表示されたタイミングで最初に行いたい処理を記載するプロパティ。
→初期表示時に使用したいメソッドの呼び出しや値の代入処理などを記載する。
unmountの逆バージョン。
※createとも使用方法は異なる。

## unmount
→画面の遷移などで対象のコンポーネントが破棄されるタイミングで拾ってくれるプロパティ。
mountの逆バージョン。

## computed
→watchとも異なり、画面の値の変更があるたびに呼び出される算出プロパティ。
→watchは特定の指定したデータに変更があった時だけ呼ばれる。

## method
→行いたい処理をまとめたメソッドを羅列できるプロパティ。

## v-if
→さまざまなタグ内で分岐の判定を行いたい時に使用できる。

# 終わりに
上記については結構初期の方で覚えたものばかりとなり、Vueについての便利なものは沢山ありますので、今後も定期的に上げていきます。
VPC同士の接続とVPCとVPNの接続

# VPCの接続
VPCは他のVPCやネットワークと接続ができる。
自社のVPC同士だけでなく、他社のVPCと相互に接続することもできる。
VPC同士を接続するためには、**VPCピアリング**という機能を有効にする。
また、VPCは、物理的なネットワークや他のクラウドと接続することも可能。
社内LANやオンプレミスとAWSとを接続するときは、専用線や仮想専用線（**VPN**）で安全に接続できる。
AWSでは、専用線として**AWS Direct Connect**、仮想専用線（VPN）として**AWS VPN**がある。
# 専用線と仮想専用線(VPN)
ネットワークとネットワークとを接続し、大きなネットワークにすることを**WAN(Wide Area Network)** という。
WANは昔からある概念で、本社と支社や、支社同士など、一対一でネットワーク同士を繋げる。WANを構成する方法が**専用線と仮想専用線**。
## 専用線
NTTなどの通信事業者から、安全線と呼ばれる、直結できる配線を借りて接続する方法。高価だが、安全で信頼性の高いのが特徴。
## 仮想専用線(VPN)
占拠する回線だけでなく、共有する回線を使って、拠点同士を暗号化した通信で接続する。安価だが信頼性は低くなる。暗号化技術が破られない限り、データは漏洩しない。

VPNのうち、インターネットを使って構成するものを**インターネットVPN**と呼ぶ。インターネット回線さえあれば、引き込み工事などは不要で、対応したルーターなどの機器を配置するだけで利用できる。
# AWS Direct Connect
AWS Direct Connectは、VPCやAWSのサービスと他のネットワークを専用線で接続できるサービス。
AWS側とは、AWS Direct Connectエンドポイントを接続点として接続する。
専用線で接続するので、引き込み工事が必要。また、AWS側でその接続を受け入れるルーター機器を設置する必要があるので、導入は大掛かりで、月額コストもかかる。
AWS Direct Connectを使用した接続では、プライベート接続とパブリック接続が用意されている。
プライベート接続はVPCと接続する。接続するには、VPC側にプライベートゲートウェイを構成し、そこを経由して通信する。基本的に、一対一で接続するが、間に**AWS Direct Connectゲートウェイ**を構成すると、一対多(AWS側が複数)の接続ができるようになる。
一方で、これでは、VPCに非対応のサービス(S3やDynamoDB)が使用できないので、その場合は、パブリック接続を使用する。これは、個々のサービスに直接接続する。
# AWS VPN
AWS VPNは、インターネットVPNを使って、他のネットワークを接続する方法。
インターネット経由のVPNなので、社内にVPN対応のルーターさえ設置すれば、すぐに使える。その接続を**VPN接続**という。
具体的には、VPCにVPG（Virtual Private Gateway）を構成する。
接続には、社内のVPN対応ルーターを使用。このルーターは、市販されている一般的なVPN対応ルーターだが、AWSの用語では、**カスタマーゲートウェイ**と呼ぶ。
AWS VPNは手軽な反面、インターネットを使用しているので、速度や品質が保証できない。**回線が切れたりすると重大な問題になるときは、AWS VPNではなく、AWS Direct Connectが良い。**
また、AWS VPNにはパブリック接続とプライベート接続がなく、VPCにしか接続できない。VPCに非対応のサービスに接続したいときは、一度VPCに接続し、そこから該当のサービスに接続する。
# トランジットゲートウェイ
**トランジットゲートウェイ**とは、VPCやオンプレミスネットワーク(AWS Direct ConnectゲートウェイやVPN接続)を一つに取りまとめてお互いに接続する「接続点」を提供するサービス。
異なるAWSアカウント同士の接続もできる。ネットワーク同士を接続するときは、どのネットワークからどのネットワークに接続して良いか、そして、その経路はどうなるのか１つずつ設定するのが基本。数が多くなると、VPCピアリング、AWS Direct Connectゲートウェイなど、個々に構成しなければならないため、とても複雑になる。トランジットゲートウェイは、こうした複雑なネットワークを、中央拠点に集約して、通信経路を統合的に扱うためのサービス。
Macを買い換えた！からMusicライブラリーを移行したい

今流行りのM2 MacBookを買ったし、しばらく並行稼働期間を経て問題なさそうなので旧型のM1 MacBookは売ってしまいたい！

https://zenn.dev/minorun365/articles/de1bed0a9e7111

大半のデータはクラウドにあるので移行作業すらほぼ不要だが、旧iTunesことMusicアプリのライブラリーだけは容量が大きく、かつクラウドストレージに置いてしまうと不整合が発生するため、Mac買い換え時にいつも個別移行をしているので備忘がてら手順を残しておく。

# 移行手順

### 旧Macでの作業

- 現在のメディアフォルダーの場所を確認

設定画面より確認可能
![スクリーンショット 2022-09-04 16.27.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/215539aa-cf77-1e71-0eb2-36ea96a434b3.png)

- 当該フォルダーをコピーして新Macへ転送

容量にもよりますが、10GB程度ならAirDropで自宅Wi-Fi経由転送すれば数分で移動できる。

### 新Macでの作業

- 現在のメディアフォルダーの場所を確認

- ミュージックアプリを完全に終了する（ `⌘Q` ）

- 現在のメディアフォルダーをFinderで開く

おそらく既定では `ホームフォルダー > ミュージック > Music` になっていると思われる。

![スクリーンショット 2022-09-04 16.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/6d06c0a0-bbc9-7134-05dc-a54fe293cbf0.png)

- その中の `ミュージックライブラリーファイル` + `メディアフォルダー` を双方削除

念のため、削除といいつつ `old` フォルダーを作って移動しておくのが吉。

- 旧Macから移動してきた同名ファイル＋フォルダーを代わりにコピーして配置

- `Option` キーを押しながらミュージックアプリを起動する

![スクリーンショット 2022-09-04 16.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/4d512d1a-0e15-eeb9-51a1-0e4d7be9106e.png)

- `ライブラリを選択` から先ほどコピーしたミュージックライブラリーファイルを選択する

- すると旧Macの音楽ファイルやプレイリストがそのまま新Mac上で起動完了！


# その他
Windows時代は音楽ファイル自体をクラウドストレージで管理していましたが、Macの場合は上記で運んだ `ライブラリーファイル＋メディアフォルダー` を定期的にクラウドストレージにバックアップするのが良さそう。

※ちなみにApple Musicのライブラリー同期機能をお金払ってでも使いたかったが、ローカルファイルがそのまま同期されるわけではなく、同名のストア上楽曲に勝手に置き換わったりして使い勝手が良くなかったので、私は利用していません。
JSONデータを図表で可視化するJSON Crack

# 概要
今の時代、APIとのやり取り、データを転送する時に、JSONデータを使う場合が多いです。JSONデータ解析ツールは色々ありますが、今回紹介したいのはJSONデータを図表で可視化するJSON Crackです。

# この記事を読む対象の人
- JSONデータを見やすくしたい人
- JSONの構造を他の人に説明したい人

# JSON Crack

## 概要

オンラインバージョンとローカルバージョンがあります。

まず、オンラインバージョンで試してみます。

今回使っているJSONデータは[Open WeatherのCurrent Weatherサンプルデータ](https://openweathermap.org/current)です。


```
{
  "base": "stations",
  "visibility": 10000,
  // 略
  "coord": {
    "lon": 10.99,
    "lat": 44.34
  },
  // 略
}
```

サンプルデータのメインオブジェクトに何のプロパティがあり、子オブジェクトに何のプロパティがあるのかとても分かり易いです。例：下の図表では、メインオブジェクトに`base`、`visibility`などのプロパティがあり、coordに`lon`と`lat`のプロパティがあります。


![截圖 2022-09-04 下午3.04.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596658/19035b7b-d7b5-3f34-3122-3eebf564a93e.png)



## 画面機能

- Download：作成した図表は好みのバックグラウンドカラーでpngファイルとしてダウンロードできます。
- Shrink/Expand Nodes：データの値が長い時、全て表示するか一部表示するか変更可能です。
- Share：作成した図表はURLで他人に共有できます。
- Rotate Layout：レイアウト変更が可能です。

![截圖 2022-09-04 下午3.36.10拷貝.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596658/fbe58524-7ae4-7bb5-71ce-e7e0d15fb6c8.png)

### Rotate Layoutの例

![截圖 2022-09-04 下午3.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596658/31d08c65-1647-f8be-c2cd-826613702420.png)

## ローカルBuild手順

jsoncrackのgithub手順を見ながら、簡単に構築できます。

### 手順
1. jsoncrackのGithubでCloneする。
1. Cloneしたフォルダに`docker build -t jsoncrack --build-arg jsoncrack_host=localhost:8888 .`を実行する
1. `docker run -p 8888:8080 jsoncrack`を実行する
1. http://localhost:8888 でアクセスできる

![截圖 2022-09-04 下午3.31.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596658/8e94f1ad-a448-0cff-5b3a-ed1bb5459fb5.png)



# 参考URL
- https://jsoncrack.com/
- https://github.com/AykutSarac/jsoncrack.com
【スマホ版AWS】AWSにスマホアプリがあって助かった話

# 先日帰省しているとき

大変なことに気が付いてしまいました。

**「やばい、RDS止めてるの忘れてた...」**

一日くらいなら許容できるかもしれませんが、帰省で一週間くらいパソコンが触れない状況下にありました。
まったく使っていないのに請求されるのはさすがにきつい。
どうにかRDSを止める方法はないのかと調べているうちに、こんなものを見つけました。

![IMG_3942.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248795/e6bbc585-ed6b-1a47-666e-4020415e4a68.png)

「A、AWSのスマホアプリがあるだって～！？」

# スマホ版AWSコンソールアプリ

そうなんです、AWSのスマホアプリがありました。

iPhone版はAppStoreから、Android版はGooglePlayStoreから無料でダウンロードできます。

またiPhone版ではFaceIDを使って簡単にログインできます。

### 画面構成

![IMG_3943_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248795/d19867e6-3a56-870e-0ecf-05eee76598ec.jpeg)


トップ画面はダッシュボードとなっており、CloudWatchアラームやAWS Health などを一目で確認することができます。

![IMG_3944.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248795/04cd9659-379c-d296-5982-696a3163ca75.png)

下のServiceを選択すると、AWSリソースごとの操作が可能です。
使用できるAWSリソースは以下の通りです。(アルファベット順)
* API Gateway
* CloudFormation
* CloudTrail
* CloudWatch
* DynamoDB
* EC2
* ECS
* Erastic Beanstalk
* IAM
* Lambda
* OpsWorks
* RDS
* Route53
* S3
* SQS
* VPC

基本的なサービスはそろっていますが、すべてのサービスがあるわけではありません。「CI/CD環境を構築したい」「Elasticacheを止めたい」などはできません。

![IMG_3945.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248795/d35db0f8-92f5-b053-d476-316696fecf96.png)


右上からリージョンを切り替えることができます。

![IMG_3946.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248795/007fb449-bdf8-b9b0-1b9c-119d0d0cb6c8.png)

左上からアカウントを切り替えたり、サポートに問い合わせたりすることができます。

# その後
スマホ版AWSコンソールアプリを使って、無事RDSを止めることができました。
余計なリソースを使い続けることがないよう、ぜひスマホに入れてみてください。

ここまでご覧いただきありがとうございました。
【Docker】Nginxの設定ファイルで環境変数を使用する方法

## 環境変数を使用する方法
Nginxの公式イメージではNginxの設定ファイルで環境変数を使用できます。
使用する方法は以下のとおりです。

### 設定ファイルのテンプレートを作成

ホスト側にNginxの設定ファイルのテンプレートを作成します。
環境変数を使用したい箇所に`${ENVIROMENT}`のように記述します。

```./nginx/templates/sample.conf.template
upstream app {
  server unix:///${PROJECT_NAME}/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name localhost;
  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;
  
  location / {
    proxy_set_header X-Real-IP ;
    proxy_set_header X-Forwarded-For ;
    proxy_set_header Host ;
    proxy_pass http://app;
  }
}

```

### テンプレートをバインドマウント
作成したテンプレートをコンテナ内の`/etc/nginx/templates`にバインドマウントします。

```compose.yml
services:
  web:
    build:
      context: ./.docker/web
      args:
        - NGINX_IMAGE_TAG=1.23.1
    volumes:
      - puma-socket:/myapp/tmp/sockets
# テンプレートをバインドマウント
      - ./nginx/templates:/etc/nginx/templates
    ports:
      - ${WEB_PORT}:80
    depends_on:
      - api
volumes:
  puma-socket:
```

### コンテナ内の環境変数を設定
コンテナ内で環境変数が使用できるように設定します。
```compose.yml
services:
  web:
    build:
      context: ./nginx
      args:
        - NGINX_IMAGE_TAG=1.23.1
    volumes:
      - puma-socket:/myapp/tmp/sockets
# テンプレートをバインドマウント
      - ./nginx/templates:/etc/nginx/templates
# environment 追記
    environment:
      - PROJECT_NAME=myapp
    ports:
      - 80:80
volumes:
  puma-socket:
```

### イメージを作成する
`docker compose build`を実行してイメージを作成します。

```zsh:ターミナル
docker compose build
```

### 確認
以下のコマンドを実行して正常に完了しているか確認する。

```
$ docker compose run web cat /etc/nginx/conf.d/sample.conf
upstream app {
  server unix:///myapp/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name localhost;
  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;
  
  location / {
    proxy_set_header X-Real-IP ;
    proxy_set_header X-Forwarded-For ;
    proxy_set_header Host ;
    proxy_pass http://app;
  }
}
```
`${PROJECT_NAME}`が`myapp`になっています。

`/etc/nginx/templates/sample.conf.template`が読み込まれ、`envsubst`の実行結果が`/etc/nginx/conf.d/sample.conf`に出力されるため環境変数を使用することができます。

## 動作の変更
環境変数を使用して上記の動作を変更できます。
詳細は以下のページをご参照ください。

https://hub.docker.com/_/nginx#:~:text=nginx%20%E6%A7%8B%E6%88%90%E3%81%A7%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E4%BD%BF%E7%94%A8%20(1.19%20%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD)

## 注意

上記の機能を使用するためにはコンテナ起動時のコマンドが`nginx`か`nginx-debug`である必要があります。

DockerfileのCMDを次のようにしていると`/docker-entrypoint.sh`の中の条件分岐で`false`となり上記の機能が使用できません。

```Dockerfile:Dockerfile

CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

```

上記の場合には次のようにする必要があります。

```Dockerfile:Dockerfile

CMD ["nginx", "-g", "daemon off;"]

```
AWSのt2micro上でnpm run build ができない【備忘録】

## はじめに
　AWSの無料枠であるt2microでEC2を作成した際、Reactのビルド処理がストップしてしまうことがあります。そんな時は以下のことを試してみることで解決できることがありますので、自分の備忘録のため記載しておきます。同じように困った方のお役に立てれば幸いです。

## 原因
　t2microのようなメモリが少ないインスタンスタイプの場合、多くのメモリを必要とするビルド処理が行えない場合があります。

　私はReactアプリを起動するためにnpm run buildを行なったところ、処理がいつまでも終わらず苦労しておりました。。

## 対策
上記のような事象があった場合、スワップメモリを増やして回避するようにします。
スワップメモリの設定を行うことで、メモリを多く必要とする処理も動くようになることがあります。

```
# 4GBのスワップファイルを作成（メモリが少ないのでbsが多いと失敗する）
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

# 読み書き権限の設定
$ sudo chmod 600 /swapfile

# スワップ領域のセットアップ
$ sudo mkswap /swapfile

# スワップ領域を有効化
$ sudo swapon /swapfile

# スワップ領域の確認
$ sudo swapon -s
```

## スワップ領域の設定後もnpm run buildが動かない場合
 スワップ領域設定後も、npm run buildが動かなかった場合、yarn buildにすることで解決できることがあります。
私の場合、npm run buildでどうしてもビルドできなかったため、yarnでのビルドを実行したら解決できました。
```
# yarn のインストールを行う
$ npm -g install yarn

# yarnを更新
$ yarn install

# yarnでビルドを行う
$ yarn build

```
## これでも解決できない場合
　上記の場合でも解決できない場合、EC2のインスタンスタイプを上位のものにすることを検討してみましょう。ただ、AWSの無料枠から外れてしまうので、料金との相談になりますが、、、。お財布との相談ですね。。笑
Microsoft Graph APIで自分のOutlookメールをフィルターして読み出すには

## Summary

自分に対するメモですが、どこかのどなたかのなんらかにも貢献できたら望外の喜びなので、こちらに貼っておきます。

Outlookメールに到着したメールに従って、LEDマトリクスを表示させたいとおもい、Microsoft Graph APIを調べました。

受信したOutlookメールで、ある日時以降の宛先が特定の名前の前半を指定した場合のAPIをはっておきます。

## How to Use

- 手順
1. https://developer.microsoft.com/ja-jp/graph/graph-explorer こちらにアクセスする
1. `https://graph.microsoft.com/v1.0/me/messages?$filter=receivedDateTime ge 2022-09-02T09:00:00Z and startsWith(from/emailAddress/name, '{{なまえの先頭の一部}}')`  をクエリに入力する
1. 「クエリの実行」ボタンを押下する

```json
https://graph.microsoft.com/v1.0/me/messages?$filter=receivedDateTime ge 2022-09-02T09:00:00Z and startsWith(from/emailAddress/name, '{{なまえの先頭の一部}}')
```

いわずもがなだとは思いますが、`{{なまえの先頭の一部}}`は任意の文字列に置換してください。

- 結果
３． OK - 200が返却される。
３．下ペインの「応答のプレビュー」にフィルタされたメール内容がJson形式で表示される。

~~セキュリティの観点よりJsonの掲載は控えております。~~
１レコードは以下の通り(キーだけ貼っておきます）
```json
{
  "@odata.context": "XXX",
  "value": [
    {
      "@odata.etag": "XXX",
      "id": "XXX",
      "createdDateTime": "2022-09-01T09:27:05Z",
      "lastModifiedDateTime": "2022-09-01T09:27:06Z",
      "changeKey": "XXX",
      "categories": [],
      "receivedDateTime": "2022-09-01T09:27:05Z",
      "sentDateTime": "2022-09-01T09:27:03Z",
      "hasAttachments": false,
      "internetMessageId": "XXX",
      "subject": "XXX",
      "bodyPreview": "XXX",
      "importance": "normal",
      "parentFolderId": "XXX",
      "conversationId": "XXX",
      "conversationIndex": "XXX",
      "isDeliveryReceiptRequested": null,
      "isReadReceiptRequested": false,
      "isRead": false,
      "isDraft": false,
      "webLink": "XXX",
      "inferenceClassification": "focused",
      "body": {
        "contentType": "text",
        "content": "XXX"
      },
      "sender": {
        "emailAddress": {
          "name": "XXX",
          "address": "XXX"
        }
      },
      "from": {
        "emailAddress": {
          "name": "XXX",
          "address": "XXX"
        }
      },
      "toRecipients": [
        {
          "emailAddress": {
            "name": "XXX",
            "address": "XXX"
          }
        }
      ],
      "ccRecipients": [],
      "bccRecipients": [],
      "replyTo": [],
      "flag": {
        "flagStatus": "notFlagged"
      }
    }
}
```

## 補足

フィルタで使用する日時は文字列ではなさそうです。
つまり`'2022-09-02T09:00:00Z'` ではなくて`2022-09-02T09:00:00Z` です。ご注意ください。

## Conclusion

これで、デプロイされたら、LEDが光ってチームが気づける装置（仮称）が作れそうですｗ

## See Also

https://developer.microsoft.com/ja-jp/graph/graph-explorer

https://docs.microsoft.com/ja-jp/graph/query-parameters#filter-parameter
プロダクト志向のエンジニアとは (「プロダクトマネジメントのすべて 」より)

>チームメンバー全員がプロダクトをまるで自分の子どものように愛し、自分の担当領域だけではなく、プロダクト全体のことを考えることを「プロダクト志向」とよぶ。たとえばエンジニアならば、ソフトウェアとしての設計や実装だけでなく、自分の書いたプログラムがどのようにユーザーに使われ、事業に価値を与えるかを考える姿勢のことを指す。プロダクトを成功させるチームは、プロダクト志向のチームである。メンバー全員がプロダクトを自分ごととして捉え、プロダクトをよくしていくことにこだわり抜く。プロダクトに愛着をもち、「これは私のプロダクトだ」といってあちこちでプロダクトを宣伝して回る。電車の中で見ず知らずの人が自分たちの手がけるプロダクトを使っていると喜び、知人が競合のプロダクトを使っていると悲しむ。日々の生活の中で、自社のプロダクトを使ってもらうためにはどうすればよいか考え、その考えをチーム内で議論してプロダクトに反映することができる。

「プロダクトマネジメントのすべて 事業戦略・IT開発・UXデザイン・マーケティングからチーム・組織運営まで」より


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
エンジニアはものすごい勢いで学習しなければいけないのだろうか


- エンジニアは「ものすごい勢いで学習しないと追いつかない」という心理的な焦りを抱えており、常にその真実性に気がとらわれている。
- よく分からないことを学習する時のストレスは個人にとって、学習コストとして認識されるというよりも、そこで説明されている物事自体への怒りとして経験される場合があると思う。「訳のわからないことを言うな！」
- 学習したい心がある。複雑さへの怒りがある。この二つの間で揺れる。
- プロダクトマネージャーに関する書籍を読んだ。冒頭から自分の想像よりもプロダクトマネージャーの責務が大きいことが分かってしまい読むのをやめたくなる。書籍ひとつ読むのにも心理的な葛藤が起こる。
- 今やっている1on1はメンタリングに徹している。コーチングやティーチングは控えている。私は壁。お好きに壁打ちしてください。
- 有害よりは無能のほうが優れている。
- 自分が思いつくフラッシュアイディアが有害にも働き得るということを考えると、おいそれと人にアドバイスは出来ない。
- 日本のアジャイル開発界隈はビジネス化されていないだろうか。資格ビジネスみたいだ。あるいは宗教。
- ホフスタッター効果とかサンクコスト効果とかメンデルの法則とかYAGNIとか。開発に役立ちそうな法則・効果を集めた百科事典的な書籍はないんだろうか。あればかなり面白くなると思うのだけど。
- 速読で謳われる効果はすごい。まるで奇跡の超能力だ。だが周りで速読を身につけている人が全くいない。もし誰にでも習得できて奇跡のように役立つテクニックなのであれば何故世の中に浸透していないのだろうか。僕自身は速読の練習をして読字スピードが3倍ほどにはなった経験があり役立っているが。
- 「自分のことが好き？それとも嫌い？」という問いは何かが間違っている。では何が間違っているかを答えよ。
- 人類には何事も一般化したがる欲望がある。そのくせ、だいたい誤った一般化をしてしまう。もちろんこれも誤った一般化だ。
- 文章を書く時に読点やカッコを使うのは妥協だと思ってしまう。
- 時間はたやすく不足する。時間はたやすく余る。時間は適度に足りないぐらいがちょうど良い。
- あまり難しいことを考えずに生きていたい。たまにこう思う時の僕はエンジニアに向いていない時の僕なのだと思う。
- 本を1ヶ月に10冊は読むと決めて毒にも薬にもならないような軽薄なビジネス書ばかりを読み続けるバカという仮想敵を頭に作ってはたまに否定している。
- より良くするのは良いことだ。だが「より良くする」には終わりがない。終わりなくより良くするのは果たして良いことなのだろうか。

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
What3wordsに特定の単語が使われているかを判定する

# 概要
地球上のあらゆる位置を、3つの単語の組み合わせで一意に特定することができるサービスである、[what3words](https://what3words.com/ja/about)。what3wordsで使われている単語かどうかを判定したい場面があった。

# 状況
[謎解き系のイベント](https://twitter.com/atgt2022sum_sho)にて、最終的にWhat3wordsで表される特定の位置が答えとなる問題を作成した。
その問題はざっくり言えば、回答者が送信するワードと正解となる単語を比較しWordleチックに判定を行い、回答者はその結果を元に正解となる単語を推測するというもの。
このシステムを実装するにあたり、回答者が入力するワードをwhat3wordsに存在するワードに絞る必要があった[^1]。
しかし、[What3wordsは使用されている単語のリストを公開していない](https://intercom.help/what3words/en/articles/4170913-can-i-download-a-list-of-words-or-what3words-addresses-that-meet-certain-conditions)。

# 対応
最初に断っておくと、今回の対応は、あくまでもWhat3wordsに存在しない単語を絶対に受け入れないことに主眼を置いた方法であり、What3wordsに存在する単語であっても拒否される可能性があると推測される。What3wordsに存在する単語を拒否してしまうことが問題になるユースケースでは、本対応を利用するべきではない。理由については後述。
ある文字列がWhat3wordsに存在するかどうかを判定するに当たっては、What3wordsが提供するAPIのうちの["Auto Suggest"](https://developer.what3words.com/public-api/docs#autosuggest)を利用した。これは、2単語が完全入力された状態で、かつ3単語目を途中まで入力したときに、それらの組み合わせから推測されるwhat3wordsの候補を複数返却するという機能である。Google検索のサジェスト機能のような末尾までの入力をさぼるという使い方の他、[似たような単語の入力間違いを防ぐといった使い方](https://intercom.help/what3words/en/articles/6394519-how-does-what3words-handle-similar-combinations-of-words)も想定されている。
ここで重要なのは、AutoSuggestは入力に対し最もよく類似する **実在する3単語の組み合わせ** を返却するということである。
これは裏を返すと、実在する3単語の組み合わせをAutoSuggestに入力した場合、返却結果の1番目には入力した組み合わせそのものが含まれているということである。
したがって、ある単語がWhat3wordsに存在しているかどうかは、以下のようにして確認することができる。
1. 確認したい単語を3つ並べたwhat3wordsライクな文字列を作成する(例：ふつか。ふつか。ふつか)
1. 1で生成したwhat3wordsライクな文字列をAutoSuggestの引数としてAPIを実行する
1. APIの返却結果の1番目を確認し、それが1で生成した文字列と一致するならば、その単語はwhat3wordsに確実に存在する。もし、1で生成した文字列と異なる場合は、what3wordsに存在しない可能性がある。

# 備考
ここまで、この方法ではwhat3wordsに存在しないとは断定できないと述べてきた。その理由は、what3wordsがどのように単語の組み合わせを生成し割り当てているかというアルゴリズムを公開していないことにある。ある単語を3つ並べた3単語の組み合わせが存在しないからといって、異なる単語と組み合わせた3単語の組み合わせも存在しないとは限らない。そのため、この方法では、実際にはwhat3wordsで使われる単語が弾かれる可能性がある。



# 脚注
[^1]: Wordle的に判定するという仕様上、abcdefghijklm...のような単なるアルファベットの羅列を送信されると問題が簡単になってしまう。それを避けるため、なんらかの単語リストに存在するワードしか送信できないよう制約をかける必要があった(本家Wordleも同じ仕様だったはず)。そういう意味ではWhat3wordsに存在する単語で制約する必然性はなく、何らかの辞書に載っている単語、などでもよかったのだが、今回は最終的にwhat3wordsに存在する単語に制約した。
AppleとAmamzonの企業文化は全く異なるが両方成功している(引用) 

> アップルの文化は、アマゾンでは絶対に通用しない。アップルでなにより優先されるのは、世界一美しいデザインを生み出すことだ。50億ドルもかけておしゃれな新本社ビルをつくったのも、デザインに対する彼らのこだわりをさらに強く打ち出すためだ。それとは対照的に、アマゾンのジェフ・ベゾスは「他社の利幅が大きなところに、自分たちの商売のタネがある」と言う。この主張をさらに強調するために、ベゾスはすべてに倹約を徹底し、社員には10ドルのデスクを使わせていた。どちらの文化もうまくいっている。アップルはアマゾンよりもはるかに美しいプロダクトを生み出し、アマゾンはアップルよりも圧倒的に安いプロダクトを提供している。

ベン・ホロウィッツ (2106-02-07T15:28:15.000). Who You Are（フーユーアー）君の真の言葉と行動こそが困難を生き抜くチームをつくる


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
juliaのdoについて理解を深める

# do syntaxについて

jupyter notebookのセルで以下を実行するとdoの説明が出てくる。

```Julia
?do
```

```do
Create an anonymous function and pass it as the first argument to a function call. For example:
map(1:10) do x
    2x
end
is equivalent to map(x->2x, 1:10).
Use multiple arguments like so:
map(1:10, 11:20) do x, y
    x + y
end
```

一番上の例だと、1から10という配列の各要素に対して、２倍をするという演算を行った配列を出力をする。普通のfor文との違いは、for文を回しただけだと、結果として配列は返ってこないが上記の例だと配列を返してくれる。
また、無名関数を使えば１行で書くことも可能である。

```Julia
map(x->2x, 1:10)
```


## 例2: filter
奇数だけを出力する。

```Julia
a = 1:10
filter(isodd, a)
```
をdoを使って書くと、

```Julia
filter(1:10) do x
    isodd(x)
end
```

偶数だけを取り出したい場合、

```Julia
filter(1:10) do x
    !isodd(x) # !はtrue or falseの否定を返す。
    # iseven(x)でも良い
end
```

## 例3: findfirst
次のような配列`list_param = [("a", -1), ("b", 2), ("a", 3)]`のうち、一番最初に`"a"`が出てくる配列の要素が何番目なのか知りたい場合、

```Julia
sampleidx = findfirst(list_param) do (k,v)
    k == "a"
end

# 1 
# list_param[sampleidx][2] == -1
# list_param[1] == list_param[sampleidx]
```

以下のように１行で書くことも可能？（しかし、以下のコードは間違っていますので正しい実装は、コメント欄を参照して下さい。）


```Julia
target_key = "a"
sampleidx = findfirst((k,v) -> k == target_key, list_param)
```

## 例3:map&findfirstの組み合わせで配列の更新を行う
添字とそれに対応する値がセットになった配列があるとする。同じ添字を持つ複数の値を最初の値に揃えたい。
例えば、`[（"a", -1）, ("b", 2), ("c", 3), ("a", 4),("b", 5)]`のような配列を` （"a", -1）,("b", 2), ("c", 3), ("a", -1) ,("b", 2)]`のように同じ添字を持つパラメタの値を同じにするような関数を作りたいとする。

```Julia
function update(list_param, target_key)
    sampleidx = findfirst(list_param) do (k, v)
        k == target_key
    end
    
    map(list_param) do (k, v)
    refk, refv = list_param[sampleidx] # target_keys とその値を返すのがpoint
        if k == refk
            (k, refv) # k=refk ならば、それに対応する値をタプルで返す。
        else 
            (k, v) # そうでないなら、何もしない
        end
    end
end
```

```Julia
# list_paramを更新させる。
list_param = [("a", -1), ("b", 2), ("a", 3)]
list_param = update(list_param, "a")

# kekka 
# 3-element Vector{Tuple{String, Int64}}:
#  ("a", -1)
#  ("b", 2)
#  ("a", -1)
```

より一般の場合に拡張するためfor文を使う。

```Julia
list_param2 = [("a", -1), ("b", 2), ("c", 3), ("a", 4), ("b", 5)]
for target_key in ["a", "b", "c"]
    list_param2 = update(list_param2, target_key)
    println(list_param2)
end
```

これでlist_param2が所望のように更新される。

doについて理解を深めることができた。
URL Hack in Lightning 5


参照フィールドを指定すると機能しないことがあります。

今回は機能しなかったフィールドの順番を一番最初にすると機能したようです。何でだろうなぁ。

[新規レコード作成のカスタムボタンで参照項目のデフォルト値が渡せない](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jd7ss)

# よくわからんおまじないを発見。意味は分からん

nooverride=trueというおまじないを付加して成功したと回答されています。
う～ん、意味はよくわかりません。 

/lightning/o/SBQQ__Quote__c/new?nooverride=true&defaultFieldValues=

Lightning URL Hacking Not Working when trying to prepopulate Lookup Fields

https://salesforce.stackexchange.com/questions/372712/lightning-url-hacking-not-working-when-trying-to-prepopulate-lookup-fields 

https://ideas.salesforce.com/s/idea/a0B8W00000GdXWzUAN/able-to-use-nooverride1-in-lightning-experience


# 数式も普通に使える

```
/lightning/o/Account/new?defaultFieldValues= ParentId={!IF(TEXT(Account.Type)="Management Company",Account.Id,"")}, OwnerId={!Account.OwnerId}
```

+ [URL syntax for adding conditional statements for a cusstom button](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdY7l)

+ [カスタムボタン作成の際にURLの遷移がうまくいかない。IF文がエラーになる](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ut9Pf)


{!IF ( Opportunity.RecordTypeId = "0121s000000DaM8AAK", "/lightning/o/Opportunity/new?defaultFieldValues=Name={!DATEVALUE( NOW() )}","/lightning/o/Opportunity/new?defaultFieldValues=Name=テスト")}

IFの場所を変えてください。

 /lightning/o/Opportunity/new?defaultFieldValues=Name={ !IF ( Opportunity.RecordTypeId = "0121s000000DaM8" , DATEVALUE( NOW() ) ,TEXT)} 

+ [日付型と通貨型の項目値をカスタムボタンでコピーしてこれない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J8jVy)

:::note
もしかしたらTEXTを使うのかもしれません

https://forcepanda.wordpress.com/2020/04/28/how-to-set-value-in-date-fields-when-using-defaultfieldvalues-spring-20-feature/
:::

 

#  lightningにもURLFORが使える

+ [Lightning画面でのリストボタンのURL設定について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X8lAg)

IF関数で始めたら相対的なURLが取得できません。（上記のIFの位置の問題）相対的なURLを作るためにはURLFORを使うしかないかも。

```
{!IF( 

	Account.数式項目="Lightning", 
	URLFOR("/lightning/o/Contact/new?RecordTypeId="&RecordType.Id&"&defaultFieldValues=AccountId="&Account.Id&"&count=1" ), 
	URLFOR( 
		"/003/e?" , 
		Account.Id , 
		[retURL="/"&Account.Id , accid=Account.Id , RecordType= RecordType.Id,ent="Contact"] 
	)
)}
```

# 未解決

+ [Hide record types but not to remove access for profiles](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIc1fSAD)

# ウィンドウの表示が×のみになる事象について

+ [ウィンドウの表示が×のみになる事象について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ak5xA)

:::note
数式の中のどこかの項目で問題が起きているのだと思います。

面倒ですが、うまく表示されないレコードで１ずつ数式の項目を増やしながら問題の部分を見つけるのが案外早いと思います。
:::

# エラー

+ [Lightning用に、カスタムオブジェクトのコピーボタンを2021年頃作成致しました。最近になって、コピーをした際に日付項目と数値項目でエラーが発生することが分かりました。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clN8T)

:::note alert
日付項目では、「Invalid date format:00/00/00」というエラーメッセージが出て保存出来ません。

日付を再度入力し直すと保存出来ます。

また、数値項目は、元の値が「100,000」が「100」になってしまいます。
:::

TEXT関数を使う
Djangoチュートリアル NameError: name 'HttpResponse' is not defined

## 本記事で話すこと

- Djangoドキュメントの[「はじめての Django アプリ作成、その 1」](https://docs.djangoproject.com/ja/4.1/intro/tutorial01/)
``NameError: name 'HttpResponse' is not defined``の解決方法

## 'HttpResponse'を定義してあげる

- デフォルトで生成されているファイル
```python:polls/views.py
from django.shortcuts import render

# Create your views here.
```

- 変更後のファイル
```python:polls/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```

 一行目で'HttpResponse'が定義されるのでnot definedにならないようになります。


## 間違えていた点
自分は1行目が変わっていることを見落としていて、def以下しか変更してなかったためnot definedになっていました。

変更点をハイライトしてくれたらいいのに。。

```python:polls/views.py
from django.shortcuts import render


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```


## 参考記事
英語ソースです。
https://stackoverflow.com/questions/44185354/django-tutorial-name-httpresponse-is-not-defined
laravel background で定期処理

cron でバックグラウンドで処理したい場合がある

今回は、photoが人物画像かどうをチェックする

・まず、一度だけ処理する場合

DB
person_at フィールド を 初期値 NULL で作成


```hoge.php
$data = Photo::query()
    ->where('person_at',NULL)
    ->take(25)
    ->get();

$now =  Carbon::now();

//ここで処理をしていく
$res = [];
foreach ($data as $v) {

    $res[] = [
        'id' => $v->id,
        'person' => 1,
        'person_at' => $now,
    ];

}


$model = new Photo;
//updated_atの更新はしない
$model->timestamps = false;
$model->upsert($res,['id']);


```

最終処理の履歴があれば処理しないので、cronに仕掛けても1度しか処理されない。


・定期的にチェックしたい

DB
person_at フィールド を 初期値 current_timestamp() で作成


```hoge.php
$data = Photo::query()
    ->orderBy('person_at', 'ASC')
    ->take(25)
    ->get();

$now =  Carbon::now();

$res = [];
foreach ($data as $v) {

    $res[] = [
        'id' => $v->id,
        'person' => 1,
        'person_at' => $now,
    ];

}

$model = new Photo;
//updated_atの更新はしない
$model->timestamps = false;
$model->upsert($res,['id']);
```

最終処理が古いものから順に再度処理していくので、cronに仕掛けることで定期的に何度も処理される。
[C++] 数値の型変換メモ

### 背景
C++ であるデータ型(文字列型や整数型)で表現された数値情報をそのままの出力を保ったまま型を変換したい時のやり方をいつも忘れてしまうため、忘備録として記録する。
併せてこれまた忘れがちな、文字コード周りの変換についても記載する。

### TL;DR
1. 文字の `'1'` を数値の `1` に変換するときは、`-48` する(逆の場合は `+48`)。
    1. `-'0'(+'0')`する方がわかりやすい
2. 文字列の `'123'` を数値の `123` に変換するときは、`stoi` を使用する(逆の場合は `to_string`)。
3. アルファベット文字の `A` の文字コード(`65`)を得るには **char 型から int 型にキャストする**。
4. アルファベット文字や数値に対して、あるアルファベット(e.g. `a`)からのオフセットを求めるには、`-'a'` する(逆の場合は `+'a'`)。

### 実例

#### 1. 文字型(`char`)数字<->整数型(`int`)数字間の相互変換

##### char の「'7'」を int の「7」に変更したいとき：

```cpp
char c = '7';
int i = c - 48;
int j = c - '0';
cout << i << ", " << j; // 7, 7
```

##### int の「7」を char の「'7'」に変更したいとき：

```cpp
int i = 7;
char c1 = i + 48;
char c2 = i + '0';
cout << c1 << ", " << c2; // '7', '7'
```


#### 2. 文字列型(`string`)数字<->整数型(`int`)数字間の相互変換

##### string の「'31415'」を int の「31415」に変更したいとき：

```cpp
string s = "31415";
int i = stoi(s);
cout << i; // 31415
```

##### int の「31415」を string の「'31415'」に変更したいとき:

```cpp
int i = 31415;
string s = to_string(i);
cout << s; // "31415"
 ```

#### 3. アルファベットの文字 <-> 文字コード間の相互変換

##### `Y` の文字コードを得たいとき:

```cpp
char c = 'Y';
int i = c;
cout << i; // 89

```

##### 文字コードが `89` のアルファベットを得たいとき:

```cpp
int i = 89;
char c = i;
cout << c; // 'Y'
```

##### 大文字アルファベットのうち、'A' から始めて一つおきのアルファベットを得たいとき:

```cpp
char c = 'A';
for(int i = c; i < c + 26; i++) {
    if((i - c) % 2 == 0) {
        cout << char(i) << endl; // 'A', 'C', 'E'..
    }
}
```

##### `x` が `a` から数えて何番目のアルファベットかを得たいとき:

```cpp
char c = 'x';
int i = c - 97;
int j = c - 'a';
cout << i << ", " << j << endl; // 23, 23
```

##### `a` から `23` 番目のアルファベットを得たいとき:

```cpp
int i = 23;
char c1 = i + 97;
char c2 = i + 'a';
cout << c1 << ", " << c2 << endl; // 'x', 'x'
```


### 感想
こんな風にまとめてもすぐに忘れやすい。
JavaScript のように、コンストラクタでまるっと変換できたり、明示的な変換用の関数があった方が覚えやすいのになぁ。
WSLのUbuntuのアップグレードに失敗したときにやったこと

タイトルが説明不足な上に生の出力が残ってないのですが、`sudo do-release-upgrade`したときに、ネットワークの問題みたいなことを言われ、
```
=== Command detached from window (日付) ===
=== Command terminated with exit status 1 (日付) ===
```
と出力されました。

ググって`snapd`を削除したり、PPAのリポジトリを削除したりしたのですが解決せず、結局`apt update`で見かけた次のエラー:
```
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://cli.github.com/packages stable InRelease: 以下
の署名が無効です: EXPKEYSIG C99B11DEB97541F0 Nate Smith <vilmibm@github.com>
W: https://cli.github.com/packages/dists/stable/InRelease の取得に失敗しました  以下の署名が無効です: EXPKEYSIG C99B11DEB97541F0 Nate Smith <vilmibm@github.com>        
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
```

にもとづき、GitHub CLIの設定を次の手順で削除したら無事解決しました。
```
sudo apt remove gh
cd /etc/apt/sources.list.d
sudo rm github-cli.list github-cli.list.distUpgrade github-cli.list.save
```

## 追記
これ。issueが立ったのが記事投稿の前日なのでなかなかのタイミング。ググっても対処法が見つからないわけだ。(**本当にこれが↑のエラーの原因かどうかは確証がないですが**)

https://github.com/cli/cli/issues/6175

ほぼ同時に自分がGitHub CLIをインストールした手順が(一時的に)非推奨になったっぽい。

https://github.com/cli/cli/commit/f2fa43a5084894939bae0f818f401751a0cf8a3e
[SikuliX-2.0.5] import済モジュールについて


SikuliX で作成したプログラムを実行すると、`from sikuli import *` が暗黙的に実行され、
起動した時点で`sys` や `os`、`time` などのモジュールがインポート済みになっています。

読込済みのモジュールは Pythonプログラムで `sys.modules` で確認できます。
```python
for i in sorted(sys.modules.keys()):
    print(i)
```

### 実行結果
```
StringIO
UserDict
__builtin__
__future__
__main__
_abcoll
_bytecodetools
_codecs
_collections
_functools
_imp
_jythonlib
_sre
_weakrefset
abc
array
codecs
collections
com
com.google
com.google.common
com.google.common.cache
com.google.common.collect
copy_reg
dis
encodings
encodings._java
encodings.aliases
encodings.aliases._java
encodings.utf_8
errno
exceptions
functools
genericpath
heapq
imp
inspect
itertools
java
java.lang
java.nio
java.nio.charset
java.util
java.util.Collections
jythonlib
keyword
linecache
nt
ntpath
opcode
operator
org
org.python
org.python.core
org.sikuli
org.sikuli.android
org.sikuli.android.ADBScreen
org.sikuli.basics
org.sikuli.basics.Settings
org.sikuli.script
org.sikuli.script.App
org.sikuli.script.Button
org.sikuli.script.Constants
org.sikuli.script.FindFailed
org.sikuli.script.FindFailedResponse
org.sikuli.script.Finder
org.sikuli.script.Image
org.sikuli.script.KeyModifier
org.sikuli.script.Location
org.sikuli.scr
ipt.OCR
org.sikuli.script.Offset
org.sikuli.script.Region
org.sikuli.script.SX
org.sikuli.script.Screen
org.sikuli.script.SikulixForJython
org.sikuli.script.TextRecognizer
org.sikuli.script.compare
org.sikuli.script.runnerSupport
org.sikuli.script.runnerSupport.JythonSupport
org.sikuli.script.support
org.sikuli.script.support.RunTime
org.sikuli.script.support.Runner
os
os.path
re
sikuli
sikuli.Env
sikuli.Region
sikuli.Sikuli
sikuli.SikuliImporter
site
sre_compile
sre_constants
sre_parse
stat
string
sys
sysconfig
thread
time
token
tokenize
traceback
types
warnings
```
【読書】アプリにおける「使いやすさ」とは何か - UIデザインの教科書を読んで

[エンジニア夏休み企画](https://qiita.com/official-events/6d31965c499a69377c0b)に便乗し、積読を1冊消化した感想文です。

## 読んだ本
『[UIデザインの教科書［新版］ マルチデバイス時代のインターフェース設計](https://www.amazon.co.jp/UI%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%EF%BC%BB%E6%96%B0%E7%89%88%EF%BC%BD-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E6%99%82%E4%BB%A3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E8%A8%AD%E8%A8%88-%E5%8E%9F%E7%94%B0-%E7%A7%80%E5%8F%B8/dp/4798155454)』
* 「UIUX 勉強 本」とかで検索するとまず間違いなくお勧めされる本。
* 日ごろから「この画面微妙...でも何がいけないのか言語化できない..」と悩むエンジニアには、以下説明文は魅力的に映るはず
>使いやすい理由とは何か
>本書はUIにおけるデザインの定義から、
>ハードおよびソフトによる制約、人間の心理による影響、
>そして具体的にデザインを形にする方法までを、
>図や画像を使いながら、わかりやすく体系的に解説していきます。

## 感想
概念・具体的内容のどちらに対しても、「こういうのが知りたかったんだ！！」が詰まった本だった。
「そもそも使いやすい・使いづらいって何？」というモヤモヤを言語化してくれ、かつ実際のデザインで使える知識や例を豊富に提供してくれる。
全くの画面デザイン/フロント初心者にはわかりづらい部分もあるかもしれないが、
多少画面デザインに携わったことのある or フロントエンドの実装に携わったことのあるエンジニアであれば、日ごろ何となく感じている違和感の言語化に役立つ本だと思う。

## 特に印象深い学び
カッコ内には本書の章番号と見出しを記載している。

#### デザインの必要性 (1-2:デザインの目的)
* __デザインの目的は、その機能や働きによって何らかの課題を解決すること__ であり、新しい価値を創造すること
* 必要とされる機能が世の中でそこにしか存在しないならば、インターフェースや使い勝手は二の次となる
(代替手段がなければそれを使うしかなく、何よりもその機能に価値があるため)



#### UIとUXの関係 (1-3:UIとUX)
* __UIは「ユーザー」と「システムやサービス」との接点__
 UIをデザインするということは、システムやサービスのIFをより使いやすく設計するということ
* __UXは対象を知った瞬間からのすべての体験__
 UIを使った時にユーザーの内面に起こる反応がUXとなる。
* しかしUIの改善＝UXの改善とは限らない（そもそもそのUIで実現しようとしていることは、UXの向上につながるのかを検討することが必要） 


#### どうして「使いづらい」のか (4-2:インタラクションコスト)
* インタラクションコスト = ユーザーが受ける負担(精神的負荷 + 身体的負荷)
    * 精神的負荷の例
        * 読む
        * 理解する
        * 覚える
        例）文字の詰まったテキスト、ボタンに見えないボタン
    * 身体的負荷の例
        * スクロールする
        * クリック / タップする
         →デバイスによって負荷のかかり具合が大きく異なることが特徴
* __ユーザーにとって、負荷は低いほうが「使いやすい」__
* インタラクションコストを下げる3つのアプローチ
        1. __一貫性__
            デザインの意味や操作を予測できるようにすることで、認知負荷を下げる
        2. __シンプルさ__
            状況を明快にすることで、認知負荷を下げる
        3. __共通概念__
            既知のルールやサインを利用し、認知負荷を下げる


#### WEBならではのわかりづらさ：前後関係 (5-1:縦、横、前後）
* WEBサイト・アプリと本の違いは「リンクがあること」であり、縦+横+前後の関係による3次元的な構造であること 
 →それゆえに、「わからない」「使いづらい」といったWEB固有の問題が発生する
* 前後関係の表現としては以下2つがありうる
    * ビジュアル
         ex) ヘッダーにナビゲーションを表示させる
    * インタラクション: 
        ex) ページ遷移時に新規画面をスライドして画面に表示させる

#### WEBならではのわかりづらさ：階層関係 (5-2:階層の深さと広さ)
* 階層には「深さ」(=階層深度)と「広さ」(=カテゴリ数)があり、「深さ」と「広さ」は反比例する
* 階層は「浅く広く」の方が、探しやすく使いやすい 
    * 階層の上下移動は負荷が高い
    * ラベル(＝階層の名称)がより分かりやすい
* ラベリングは排他的に名付けることで、ユーザーが目的のものを見つける手助けとなる（認知負荷を下げる）
    * スマホ対応等でみられる「…」に種々の機能を詰め込むのは、排他的でないので使いづらい

#### 「わからない」とは何か (5-6:わからないとは何か）
* __「わからない」は以下2つに集約される__
    * __「場所がわからない」__
    * __「操作がわからない」__
    * 構造と操作における、一貫性のあるIFデザインがあれば2つとも解決できる


## 終わりに
ここで触れた内容は一部であり、実際の本には豊富な図解付きで多くの内容が記載されている。
本記事では「わからないとは何か」までしか記載していないが、本にはその続きがあり、「わからない」に対応するための方法のストックも提供してくれる。
「画面デザインに興味がある、でもいまいち何をしてよいかわからない...」、
「画面作ってるけど、なんかわからんが使いづらい...」
そんな悩みのあるエンジニアにはぜひ本書を読んでもらいたい。
ユーザーがリード所有者をキューの 1 つに変更できないようにする入力規則



```
AND(
ISCHANGED(OwnerId),
BEGINS( OwnerId, "00G"),
NOT($Profile.Name = "System Administrator")
)
```

[Validation Rule Help](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000J8ONASA3) 

00G	Group なんでこっちなんだろうなぁ
00F	QUEUE
HSTS とは

## 勉強前イメージ

HIS的な・・・いやわからん。。。結構略語って3文字多いよね？？

## 調査

### HSTS とは

HTTP Strict Transport Security の略で、webブラウザに対してhttpsでの通信を強制するものになります。
RFC 6797で標準化されています。
 
webサーバとブラウザでの最初の通信の際に応答のところでヘッダ内に `Strict-Transport-Security` という項目を定義することで
次回からの通信はhttpsで行うというものになります。
HSTSを行うことで中間者攻撃を防ぐことができると言われています。

### 中間者攻撃 とは

MITM攻撃 とも呼ばれ、Man-In-The-Middle attackの略になりますが
通信を行う二者間の間に割り込んで両者が送受信する情報を自分のものとすり替えることによって
盗聴したり通信に介入したりする攻撃手法になります。

中間者攻撃の手法としてはhttpの通信など暗号化されていない通信は平文でのぞけるため攻撃を受けやすいという特徴を持っています。
その他、セキュリティ対策が十分に行われていないネットワーク機器は攻撃を受けやすい状態になっています。

その為、HSTS(httpsでの通信を強制すること)を行い、暗号化をすることで中間者攻撃を防ぐことができます。

## 勉強後イメージ

httpsを強制することできるって知らなかった・・・

## 参考

- [HSTS 【HTTP Strict Transport Security】](https://e-words.jp/w/HSTS.html)
- [中間者攻撃（Man In The Middle Attack）とは？仕組みや危険性、対策について徹底解説](https://cybersecurity-jp.com/column/53786)
scheduleを使ってPythonで定期実行

# 1. scheduleとは


Pythonで定期実行したいときに便利なパッケージです
https://schedule.readthedocs.io/en/stable/


# 2. install


pipで入ります


```terminal:terminal
pip install schedule
```


# 3. 使い方


ざっくり以下のような手順です


1. scheduleをimportした時点でscheduleがクラスインスタンスになる
2. schedule.every()で定期実行の条件をいろいろ付けていく
3. ループ内で読んでやると指定条件を満たしたときに実行してくれる


書き方としては以下のような感じです


```python
import schedule  # 1. importした時点でscheduler.Scheduler()が待機してくれます
import time

def job():  # 実行させたい関数を定義
    print("I'm working...")

schedule.every(10).minutes.do(job)  # 2. 条件を追加: 10分おき
schedule.every().hour.do(job)       # 2. 条件を追加: 1時間おき
schedule.every().day.at("10:30").do(job)  # 2. 条件を追加: 毎日10:30
schedule.every().monday.do(job)           # 2. 条件を追加: 毎週月曜
schedule.every().wednesday.at("13:15").do(job)  # 2. 条件を追加: 毎週水曜13:15
schedule.every().minute.at(":17").do(job)  # 2. 条件を追加: 毎時17分

while True:
    schedule.run_pending()  # 3. 指定時間が来てたら実行、まだなら何もしない
    time.sleep(1)  # 待ち
```


# 4. まとめ


良いと思う点
・ 処理がPythonで書かれているのでOSを選ばないのが便利
・ 複数の関数でもそれぞれ任意のタイミングで実行できるのが便利

イマイチかもしれん点
・ プロセスが死んだらそこで止まるので、別途プロセス監視とかしないといけなくなりそう
ubuntu インストール＆設定メモ

# ubuntuをダウンロードする
https://www.ubuntulinux.jp/download

# 初期設定
### aptのアップデート
```
$ sudo apt update && sudo apt upgrade
```

### ディレクトリ名をえいごひょうきにする
```
$ LANG=C xdg-user-dirs-gtk-update
```
### FireWallの設定
ufwのインストール
```
$ sudo apt -y install ufw
```
有効化
```
$ sudo ufw enable
```
確認(状態がアクティブになっていればOK)
```
$ sudo ufw status
```
### ウイルス対策
ClamAVをインストール
```
$ apt -y install clamav
```
試しにホームディレクトリ以下をスキャンしてみる
```
$ clamscan -r $HOME
```
定期で自動的にスキャンをする
```
$ cd $HOME
& mkdir Clamav
$ cd Clamav
$ vi scan.sh
```
```ruby:scan.sh
#!/bin/bash

/usr/bin/clamscan \
    -i \
    -r $HOME \
    --log="$HOME/Clamav/log/$(date +\%Y\%m\%d-\%H\%M\%S).log" \
    2>/dev/null
```
escキーを押して、:wqで保存して閉じる
```
$ crontab -e
```
```ruby:crontab
0 12 * * * bash /home/[ユーザ名]/Clamav/scan.sh
```
上記は毎日１２時に実行するという意味になる
(分 時 日 月 曜日 のパラメータで決まる)
```
$ crontab -l
```
上記コマンドで設定内容が表示されれば設定完了

### 消費電力対策
powertopのインストールと起動
```
$ sudo apt-get install powertop
$ sudo powertop
```
tabキーでTunablesタブを開く
Badが多く表示されている状態だと消費電力が大きい状態
escキーで閉じる
```
$ sudo powertop --auto-tune
$ sudo powertop
```
tabキーでTunablesタブを開く
Goodが多く表示される状態になれば消費電力を小さく抑えられている状態になった

上記の設定はPCを再起動するとリセットされてしまうのでTLPを導入する
TLPのインストール
```
$ sudo add-apt-repository ppa:linrunner/tlp
$ sudo apt-get install tlp tlp-rdw
$ sudo tlp start
$ sudo systemctl status tlp.service
```
これでPCを再起動しても省エネ設定は維持される

### CapsLockとCtrlを入れ替える
```
$ sudo apt install gnome-tweaks
$ gnome-tweaks
```
キーボードとマウス → 追加のレイアウトオプション → CapsLockをCtrlとして扱うにチェックをする

### MacBookにubuntuをインストールした場合でファンの回転数が上がらない場合
```
$ sudo apt install macfanctld
```
cpuの温度が上がるとファンの回転数が上がるようになる


## Google Chormeのインストール
GoogleのwebサイトからGoogle Chormeのパッケージをダウンロードする
https://www.google.com/intl/ja_jp/chrome/
ダウンロードしたフォルダに移動して
```
$ sudo apt install ./google-chrome-stable_current_amd64.deb
```
※google-chrome-stable_current_amd64.debはダウンロードしたファイル名で適宜置き換える

## Pythonのインストール

python本体はubuntuに元からインストールされているので省略
バージョン確認
```
python3 -V
```
pythonコマンドが実行できるように**python-is-python3**をインストール
```
$ apt install python-is-python3
```
pythonコマンドが使えるようになったか確認
```
python -V
```
## vscodeをインストール
vscodeのwebサイトからdebパッケージをダウンロードする
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

ダウンロードしたフォルダに移動して
```
$ sudo dpkg -i code_X.XX.X-XXXXXXX_amd64.deb
```
※code_X.X.X-XXXXX_amd64.debはダウンロードしたファイル名で適宜置き換える

## mp4 動画を再生できるようにする
```
$ sudo apt install -y ubuntu-restricted-extras
```
## その他フリーソフトなど
```
$ sudo apt-get -y install inkscape
```
SpringBootでアプリを作るときに最初から知っておきたかった情報のメモ

## 概要
SpringBootでアプリを作るときに最初から知っておきたかった情報の自分用メモです。
こういう記事は限定共有記事にすることが多いんですが、わりと役に立つ情報だと思うので公開します。

## MessageSource

https://qiita.com/kawasukeeee/items/8fcd9d619272354e9df7

https://anveloper.com/2020/12/30/messagesource%E3%82%92%E3%82%82%E3%81%A3%E3%81%A8%E7%B0%A1%E5%8D%98%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84%EF%BC%81/

## プロパティファイル

https://b1san-blog.com/post/spring/spring-properties/

https://nainaistar.hatenablog.com/entry/2020/12/15/083000

## DB

https://qiita.com/shindo_ryo/items/af7d12be264c2cc4b252

https://agohack.com/spring-boot-transaction/

https://dev.classmethod.jp/articles/flyway-with-spring-boot/

https://agohack.com/spring-data-jpa-save-and-flush-entity-manager-refresh/

OneToOne、ManyToManyあたりが怠い。情報少ないし意図しない挙動になることが多いので、あまり使いたくない。

NativeQueryでテーブル結合したときはselect句に new hoge.package.HogeDto(fuga, piyo)みたいな感じで記述すると行ける。よく使う機能なのに情報少ない。

https://teratail.com/questions/229747

## ページング
https://qiita.com/KevinFQ/items/ca68a3001bae19f92879

https://www.baeldung.com/spring-data-jpa-pagination-sorting

## ログ
https://qiita.com/t-iguchi/items/94c35818577580310e4b

https://qiita.com/suema0331/items/c7f2287fd5bf84d83691

## 非同期処理
https://qiita.com/mitsuya/items/c21907ab10919111e773

## lombok

@Data,@Getter,@Setter,@AllArgsConstructor,@NoArgsConstructor,val、@Slf4jあたりを使ってる。

https://qiita.com/opengl-8080/items/671ffd4bf84fe5e32557

## RestTemplate

https://b1san-blog.com/post/spring/spring-rest-template/

https://spring.pleiades.io/spring-boot/docs/2.1.4.RELEASE/reference/html/boot-features-resttemplate.html#boot-features-resttemplate-customization

API呼び出しは失敗することが多いのでリトライ処理を入れておくのが無難。

```
builder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));
```

## フォーマッター、チェックスタイル

https://tetsufuru.hatenablog.com/entry/2021/03/19/232020

チームメンバーが増えたときは設定できたか目視で確認したほうがいい。
設定されてないと、後で困る。

## 例外ハンドラ

https://qiita.com/niwasawa/items/f5a6a285d7bd99e8273a

## サービス化

https://qiita.com/AkihiroTakamura/items/e1be1a70428c57b10f8b

再起はDocker化するのかな？

## 静的リソースのキャッシュ対策

https://blog.ksoichiro.com/ja/post/2016/03/spring-bootjavascriptcss/

## 残課題

・APIのレスポンスボディのクラス
・APIのステータスコード
・ページング実装するときに、Thymeleafで1個目の画面を作るのが大変。
・デプロイ
【Flutter】基本構文①_変数と定数・型

# 開発環境
・Mac book Pro(Big Sur 11.5.2)
・Visual Studio Code(1.70.2)
・Flutter(3.0.1)
・Dart(2.17.1)

## 変数
・型を指定して変数の宣言をする場合は、変数名の前に型を記載する。
```dart
String value = "テスト";
```
・型を指定せずに変数の宣言をする場合は「var」を使用する。
```dart
var value = "テスト";
```

## 定数
・ビルド実行時に処理される値は「final」を使用する。
・宣言後は値の再代入は不可。ただし値を別の変数に代入後に値の更新を行うことは可能。
```dart
final value = "テスト";
value = "値の再代入" //×
final newValue = value
newValue = "値の更新" //○
```

・コンパイル時に処理される値は「const」を使用する。
・宣言後は値の再代入、値を別の変数に代入後に値の更新は不可。
```dart
const value = "テスト";
value = "値の再代入" //×
const newValue = value
newValue = "値の更新" //×
```


## 型
### int
・整数値を扱う型。
```dart
int i = 10;
int num = -10;
```

### double
・小数点単位の数値を扱う型。
```dart
double d = 1.0;
```

### String
・文字列を扱う型。
```dart
String s = "テスト";
```

### bool
・真偽値(true/false)を扱う型。
```dart
bool b = true;
```

### List
・配列を扱う型。
・重複した値の格納が可能。
```dart
List<String> strList = ["佐藤","田中","山田","佐藤"];
```

### Set
・Listと同じく配列を扱う型。
・重複した値の格納が不可。
```dart
Set<String> strSet = ["佐藤","田中","山田"];
Set<String> strSet2 = ["佐藤","田中","山田","佐藤"]; //×
```

### Map
・配列(値:キーをセットで定義)を扱う型。
・重複した値の格納が不可。
```dart
Map<String:int> map = ["佐藤":20, "田中":30, "山田":40];
```
ファジング とは

## 勉強前イメージ

セキュリティ系？？

## 調査

### ファジング とは

英語でfuzzingと書き、異常系テストの一つになります。
ソフトウェアのテスト手法の一つで、ブラックボックステストの一種です。
開発者が想定しづらいような文字列やエラー成分が含まれた様々なデータなどを入力してみて不具合がないかどうかを調査することを指します。
脆弱性がないかどうかを調べるために行われることが多いです。

基本的にはファジングツールやファザーなどと言ったファジング専用のソフトウェアを使って
問題になりそうなデータを自動生成します。
それをテスト対象にテストを行い問題が発生するかどうかを調べます。

脆弱性の発見やソフトウェアの作成者でも思いもよらないことでエラーが生じることがあります。
それを発見することができます。

## 勉強後イメージ

新卒のときに作ったアプリケーションに先輩にいろいろ入力されてバグったの思い出した。
そんなイメージかな。

## 参考

- [ファジング 【fuzzing】 ファズテスト / fuzz testing](https://e-words.jp/w/%E3%83%95%E3%82%A1%E3%82%B8%E3%83%B3%E3%82%B0.html)
- [ファジング](https://www.sophia-it.com/content/%E3%83%95%E3%82%A1%E3%82%B8%E3%83%B3%E3%82%B0)
シェル芸は不要なのではないか

- シェル芸という言葉がある。シェルやシェルスクリプトでそんなに高度なことをするのに意味があるのだろうか。極めないほうが良い技術というものもあると思う。
- 組織が良くなると誰が得をするのだろう。少なくとも組織に属する人間は得をする。ストレスが減ったり働きやすくなったり。それだけでも十分世界に貢献しているのかもしれない。
- プログラムはどこか架空の世界の事柄だと思っていたが、僕らの生それ自体が架空のものらしい。どちらも同じようなものならばせめて架空の世界で楽しもう。
- Pinterestの日本のアクティブユーザー数は1000万人ほどだという。だが周りでPinterestの話を聞いたことがない。このねじれはどこで起こっているのだろう。単に僕がおじさん化している可能性が高い。
- Kindleの無料サンプルを多数ダウンロードして読んでいる。購入する書籍を選ぶためだ。だが無料サンプルを多数読むことをそのまま読書法にしてしまっても良いのかも知れない。だいたい書籍のエッセンスは冒頭で掴める場合が多い。同じ時間があるならば1冊全てを読み切るよりも30冊の本の冒頭だけを読むほうが意味がある場合もあるだろう。
- 日本人には名言を引用するという習慣がない。だから何か賢いことを言っても無駄だ。
- クレジットカード会社が紙の明細書を発行しなくなった理由はコスト削減でも地球環境の保護でもない。顧客により多くの金を使わせるためではないだろうか。
- AmazonPrimeで奄美大島の映像を見ながらカフェで過ごしている。だがこれで本当に良いのかという思いがある。カフェという現実が目の前にあるのにも関わらず人口度の高い映像世界に没入して癒やされようとするなんて。
- 何もせずに過ごすのは難しい。何もせず過ごそうとしている瞬間にも、もっと良い「何もせず過ごす方法」がないかとGoogle検索したくなってくる。
- 確信犯という言葉は誤用されているらしい。だが正しい意味を知っている人が1%でもいるのだろうか。
- 僕は自分で独学能力が高いと思っているが、独学で間違った方向に進み続けていた実績が複数ある。
- 「尊敬する人は誰ですか？」という質問は尊敬する人がいる前提でなされる。「好きなトニックウォーターは何ですか？」と聞かれたら困らないだろうか。
- スマホがないとそわそわする気持ちは分かる。今の僕はスマホ用のタイムロッキングコンテナがないせいでそわそわしている。一時的にスマホを使わずに済むためのスマホお預けサービスはないだろうか。
- 何もせずにゆっくりしようと決めた休日。だが何もせずにゆっくりすることは非常に難易度が高く大変なので後回しにしたい。
- 試行錯誤さえすればギターは独学出来ると思った。
- パワーポーズは一時的に気分を高めるのには役立つが、慢性的な疲労を回復してくれるわけではない。万能論はだいたい間違っている。
- 自己啓発セミナーの講師が「自己啓発は実は全く役立たない」という結論を出すことは永遠にないだろう。
- 質問を受けて言葉に詰まることは悪いことではない。世の中は即答できる物事ばかりではない。
- 将来の目標を聞かれて現状維持と答えたら殺されるような社会に僕らは生きている。殺されるというのは大げさだがとにかく決まりが悪い。



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura