OmniAICreator/Qiita-1.07M huggingface dataset:
Testlink の DataBase 構造

Testlink バックグエンドのデータベース構造について
* MySQL の Database です

# 主なテーブル

<table>
  <tr><td style="background:#c5d9f1;">Table名</td><td style="background:#c5d9f1;">説明</td><td style="background:#c5d9f1;">内容</td></tr>
  <tr><td>executions</td><td>実行結果</td><td>実行ID/日時/結果/計画ID/テストケースID/実行時間/備考</td></tr>
  <tr><td>tcversions</td><td>テストケース</td><td>テストケースID/外部ID/バージョン要約/前提条件</td></tr>
  <tr><td>nodes_hierarchy</td><td>テスト構造（親子関係の定義）<br>プロジェクト/計画→スイート（階層）→テストケース→テストステップ</td><td>ID/タイプ/親へのリンク</td></tr>
  <tr><td>tcsteps</td><td>テストステップ</td><td>ステップうID/ステップ番号/手順/期待結果</td></tr>
  <tr><td>testplan_tcversions</td><td>テスト計画毎のテストケース</td><td>ID/テスト計画ID/テストケースID</td></tr>
  <tr><td>testprojects</td><td>テストプロジェクト</td><td>プロジェクトID/説明/prefix/テストケース数？</td></tr>
  <tr><td>testplans</td><td>テスト計画</td><td>テスト計画ID/テストプロジェクトID</td></tr>
  <tr><td>users</td><td>ユーザー情報</td><td>ユーザーID/アカウント名/パスワード/役割</td></tr>
  <tr><td>custom_fields</td><td>カスタムフィールド定義</td><td>カスタムフィールドID/名前/表示名/タイプ/取りうる値</td></tr>
  <tr><td>cfield_execution_values</td><td>実行時のカスタムフィールドの入力値</td><td>種類/実行ID/テスト計画ID/テストケースID/入力値</td></tr>
  <tr><td>testsuites</td><td>テストスイートの定義</td><td>テストスイートID/詳細内容</td></tr>
  <tr><td>requirements</td><td>要件</td><td>要件ID/ドキュメントID</td></tr>
  <tr><td>req_coverage</td><td>要件カバレッジ</td><td>要件ID/テストケースID/作成者ID</td></tr>
  <tr><td>req_specs</td><td>要件スペック</td><td>スペックID/プロジェクトID/ドキュメントID</td></tr>
  <tr><td>req_versions</td><td>要件バージョン</td><td>ID/バージョン/リビジョン/スコープ</td></tr>
  <tr><td>req_specs_revisions</td><td>要件スペックリビジョン</td><td>要件ID/ID/リビジョン/ドキュメントID/説明/スコープ</td></tr>
</table>

# テーブル相関図

![DB構造_Testlink-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114660/19952a94-1d8c-f3f5-154d-74274457ea33.jpeg)
Falco Ruleを紹介するシリーズ - Delete Bucket Encryption

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Delete Bucket Encryption」</b>です。
# Rule記述
```
- rule: Delete Bucket Encryption
  desc: Detect deleting configuration to use encryption for bucket storage.
  condition:
    ct.name="DeleteBucketEncryption" and not ct.error exists
  output:
    A encryption configuration for a bucket has been deleted
    (requesting user=%ct.user,
     requesting IP=%ct.srcip,
     AWS region=%ct.region,
     bucket=%s3.bucket)
  priority: CRITICAL
  tags:
    - cloud
    - aws
    - aws_s3
  source: aws_cloudtrail
```
# Rule概要
<a href="https://github.com/falcosecurity/plugins/tree/master/plugins/cloudtrail" target=new>CloudTrailプラグイン</a>をインストールすることで使用可能になるルールです。
S3 バケット内の機密データのセキュリティレイヤーを追加するには、サーバー側の暗号化を使用してバケットを構成し、保管中のデータを保護する必要があります。
このルールは、すでに設定されたバケットストレージの暗号化設定の削除を検知します。
S3バケットのサーバーサイド暗号化を有効にすることは、<a href="https://sysdig.jp/blog/26-aws-security-best-practices/" target=new>こちらのブログ</a>で紹介しているAWSセキュリティのベストプラクティス26選のうちの一つであり、すでに設定された暗号化設定を削除すること自体が不審な活動といえます。

# Condition（条件）
`ct.name="DeleteBucketEncryption" and not ct.error exists`
CloudTrailのイベント名が"DeleteBucketEncryption"で、エラーが発生していない場合

# Output（出力）
バケットの暗号化設定が削除されました。

`%ct.user`
ユーザー名

`%ct.srcip`
送信元IPアドレス

`%ct.region`
AWSリージョン

`%s3.bucket`
S3バケット名
【MS Teams】Teams活用法&小技 その1

# はじめに

やっと会社にMicrosoft 365 が導入されます。 ~~1/24現在はまだ導入されていない。~~　4/24導入済み
その為に、Teamsの活用法や小技を書きました。

# 想定読者
- Teamsを触ったことが無い人
- Teamsの小技を知りたい人


# Teamsについて

Teamsとは、Microsoft 365やOffice 365 Business Essential/Premiumプランに提供されているツールで、チーム内でのチャットやグループでの会議、ファイルやスケジュールの管理など、チームでの活動に必要なツールがすべてここに格納されているものです。

他にも、365のサービスと連携が出来る素晴らしいツールです。


# ショートカットキーで誤送信を防ぐ

Teamsチャットの特性として、Enterボタンで送信になっています。テキストやワードと同じように改行しようとすると、文章の途中で送信されてしまいます。

このような誤送信を防ぐための、ちょっとした小ワザがあります。それがショートカットキーの活用です。「shift」＋「Enter」キー押下で送信ではなく、改行になります。

テキストを入力した状態で、**「shift」＋「Enter」** キーを押下すると改行になります。

- 改行前
![change000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784059/810db408-9b8e-c586-0442-e3cb616931c9.jpeg)
- 改行後
![change001-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784059/7bc7901c-8613-7cb3-8c13-b99279f8a943.jpeg)


# 連絡可能になったら、通知をもらう

Teamsを利用している多くの方はステータスをコントロールすることで、周囲に状況を伝えています。しかし、連絡したい側としてはいつ連絡可能になるか、掴めませんよね。

そのような場合に便利な小ワザがあります。「連絡可能になったら通知する」という機能です。

通知をもらいたいチャットにフォーカスをあてて、「…」ボタンをクリックします。メニューの中から「連絡可能になったら通知する」を選択します。連絡可能状態に変わると、通知が届くのですぐに連絡が取れるようになります。


![change002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784059/71805e9d-65b8-f847-5dc3-3743a48c625a.jpeg)
![change008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784059/11ba1f71-faf5-a218-32da-8209cea13611.jpeg)



# 会議中にチャットを使う

会議中にちょっとした情報共有をしたいときや急なトラブル報告も少なくないと思います。例えば、参照してもらいたいホームページの共有やカメラの不調で映りが悪くなったなど様々なケースがあります。

そのような場合でも会議中のチャット機能を使えば、情報展開やトラブル報告も可能になります。

Teams会議の右上にある「会話の表示」ボタンをクリックします。チャットが表示されるので、後は文字を打ち込むだけです。

![0520_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784059/cd39c19c-075d-2d05-201f-f24738b69b82.jpeg)
![0520_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784059/331f9ba9-e437-0cb4-b3a8-c1eece29b382.jpeg)



# 挙手の状態をチェックする

Teams会議には挙手機能があり、人の発言を妨げることなく、発言の機会を得ることができます。しかし、現実と同様に挙手は気づかれにくい面があるため、ファシリテーターが常に気を配る必要があります。

そこでオススメなのがユーザ一覧画面を常に表示することです。ユーザ一覧画面は会議の参加者が表示されると同時に挙手の状態をチェックすることができます。

Teams会議の右上にある「参加者」ボタンをクリックします。参加者の一覧が表示されるので、挙手の状態をチェックすることができます。![0521_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784059/9f02d50e-c503-3184-d4ae-5a10fd53e59b.jpeg)
![0521_A.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784059/2007901c-2d1c-a92f-7318-ccede30aa1b4.jpeg)


# 最後に

今回は、よく使う機能についてピックアップして取り上げました。
まだまだTeamsには便利な機能や小技があるので、また後ほど書き上げます。

こんな小技あるよとかあればコメントで教えて頂ければと思います！
AWS Budgets コスト予算の設定方法

# 概要
AWSの不正利用により、多額の請求がされました。今後は、この様な事がない様に、、AWS Budgetsを　使ったコスト予算の設定を行ったので、備忘録も兼ねて設定の仕方を説明します。


:::note alert
<font color="Red">2023/01/24時点での設定方法</font>
:::


# 設定方法
1. ヘッダーにある検索バーから `AWS Budgets`と検索して、AWS Budgetsの画面を開く

2. 画面内に予算の作成がある為、そのボタンを押下する
![スクリーンショット 2023-01-24 9.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/c7cff7a4-31b4-33b8-9538-628fd43987d7.png)

3. 予算の設定を選択する。AWSの利用料金が設定金額より超えない事を通知するのみであれば、テンプレートの使用が無難だと思われます。
(今回はテンプレートで設定します。)

![スクリーンショット 2023-01-24 10.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/f63624e5-c6cf-25ca-85d2-42f0ee7485f5.png)

4. テンプレートの　設定を行い、下記の項目を埋める

- テンプレート (4つから選択。個人で使用の場合、ゼロ支出予算が無難)
- 予算額　（ドルで入力）
- 予算名
- Eメール受信者　(最大10人まで登録可能、`,`でメールを切り分ける)

### テンプレート
今回は、月次の利用料金が、設定した金額よりオーバーしたら警告を出したので、月次コスト予算を選択した

![スクリーンショット 2023-01-24 10.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/c6bca070-070e-40ff-1cb6-e724d4791dd5.png)

5. 入力が完了したら、`予算の作成`ボタンを押下する

6. Budgets内に一覧画面に、作成した内容が表示されていれば、作成完了
![スクリーンショット 2023-01-24 10.30.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/8e0d92c0-c0b9-2337-916b-61f00f2ac96f.png)

# 補足
- 金額の設定変更や細かい設定の修正は、詳細画面からできるみたいです
- 月々の予算レポート等も算出可能です

# 感想
テンプレートを使用した設定は、凄く簡単で驚きました。カスタマイズの方の設定も確認しましたが、こちらももっと詳細に金額設定ができる見たいですので、機会があれば設定してみたいと思います。


# 参考資料
- [AWS Budgets](https://aws.amazon.com/jp/aws-cost-management/aws-budgets/)
- [[公式ドキュメント]予算の作成](https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/budgets-create.html)
【データ抽出/MYSQL】コンバージョンに繋がりやすいURLを把握する

# 今回の課題
どのURLにアクセスをしたら、コンバージョンに繋がりやすいのかを把握したい。

## 手順
### 1)コンバージョンしたページよりも前のアクセスにフラグを立てる
```SQL
select
    stamp -- タイムスタンプ
	, session
    , path -- アクセスしたページ〜コンバージョンしたページまでのURLが格納されたカラム
    , sum(case when path = "/complete" then 1 else 0 end) over(partition by session order by stamp desc rows between unbounded preceding and current row) as before_conversion_flag -- コンバージョンしたページより前のアクセスにフラグを立てる。
from
    `ログテーブル`
```
WINDOW関数のSUMを使用して、URLが`/complete`にアクセスする前（`stamp`カラムで判断）にアクセスしたURLにフラグを立てておく。

WINDOW関数内のORDERBY BY句にて、降順に並べてSUMすることで、`/complete`以前のURLすべてにフラグが立つようになっている。
（通常、WINDOW関数でSUMをすると累計で算出されるが、ここでは`/complete`以前のフラグは全て0となっているため。）


### 2)URL毎に集計を行う
```sql
with activity_log_conversion_flag as (
    select
        stamp
		, session
        , path -- アクセスしたページ〜コンバージョンしたページまでのURLが格納されたカラム
        , sum(case when path = "/complete" then 1 else 0 end) over(partition by session order by stamp desc rows between unbounded preceding and current row) as before_conversion_flag -- コンバージョンしたページより前のアクセスにフラグを立てる。
	from
        `ログテーブル`
)

select
   path
    , count(distinct session) as sessions -- path毎の訪問回数
    , count(before_conversion_flag) as conversions -- path毎のコンバージョン数
    , sum(before_conversion_flag) / count(distinct session) * 100 as conversion_rate -- コンバージョン率
from
    activity_log_conversion_flag
group by
    path
;
```
これでURL毎に、訪問回数・コンバージョン数・コンバージョン率を出すことができる。
エラー時のメール送信機能載せたらメモリ容量食うので、GASにさせてみる

Railway.appというサービスでRailsのスクリプトを無償の枠内で回してる。

ただRedisでsidekiqのジョブを回してる都合上、エラーが発生してしまうとスクリプトが正しく動いてくれなくなるのにくわえ、無駄な負荷がかかりつづけて無償枠を圧迫して、有償になってしまう可能性がある。

そこでスクリプト内でエラーを検知したら、メールを送って通知してくれるようにしたい。

普通に考えたらRailsにはAction Mailerというメール送信サービスがあるのでこれを使えばいいわけだが、試しにのせてみたところメール送信しなくとも、平時でメモリを60～80メガほど余計に喰うようになってしまった。

Railway.appでこの「常時メモリ数十メガ喰うようになる」と0.5～1ドルくらい余計にコストがかかるので、なるべくならこれは避けたい。

そこでメール送信は外部サービスに任せようと考えて、GoogleAppsScriptでやることにした。ちょー簡単なものであんまりに単純すぎるので、自分用とか身内向け用。セキュリティとかはガバガバ。

## GAS側の設定
登録作業とかはさすがに覚えてないので自分でしていただくとして、全体的には「スクリプトがGASにGETリクエストを送り、GETリクエストを検知したらGASがメールを送信する」という内容。

```javascript:
function doGet(e) {

  //クエリにname=hoge指定
  if (e.parameter.name == "hoge"){

  console.log('メールを送信します');

  //メール内容
  let recipient = "hoge@gmail.com";
  let subject = "Railwayスクリプトで登録に失敗してます";
  let body = "Railway.appでスクリプトの登録に失敗してるようです。このメールはGoogle Apps Scriptによる自動送信です。アドレス: https://railway.app/dashboard";

  GmailApp.createDraft(recipient, subject, body, options);

  let draft = GmailApp.getDrafts()[0];
  draft.send();
  
  }

}
```

かんたんかんたん。``doGet``でGETリクエスト時の指定。一応アクセス時にクエリを指定するようにして、指定のクエリがついたアクセスのときに条件付け。メール内容を決めて、``GmailApp.createDraft``で下書きかいて、``draft.send()``で発送。

これで**デプロイ**ボタンを押し、新しいデプロイを押してデプロイしたらURLが発行されるのでこれを控えておく（「デプロイを管理」からあとでも見られる）

## スクリプト側の設定

こちらも簡単。

```ruby:
# GASのメール送信スクリプトにGETリクエストを送る
require "net/http"
uri = URI.parse(ENV['GAS_ADDRESS']+"?name=hoge")
response = Net::HTTP.get_response(uri)
response.code
```

一応環境変数（ここではGAS_ADDRESSとした）で先ほどのGASのアドレスを指定して、クエリもつけたアドレスをつけとく。こんだけ。

超単純だが一応動いてる。こんなん悩むほどでもない気はするが、こういう備忘録ものちのち誰かの役にたったらいいね。
【文系エンジニア】素人大学生が１年でXRエンジニアになった方法

![unity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118254/02cb79e2-af6a-1d60-5fa4-e83ba028c590.png)
# はじめに
僕は、都内の某私立<font color="red">文系</font>大学生の１年生です。

高校生のころからとても作りたいゲームがあったものの、プログラミングが全く分かりませんでした。上京してきて大学に入り、

どうせ自由に生きれるならこの４年間を自分の夢のためロマンのために尽くしたいと考え、プログラミングを本格的に取り組もうと考えました。

まだ、この記事を書いているのはちょうど１年目にあたるわけですが、多くの仲間に支えられてきました。これからの記事は仲間のように皆さんの力になれるものでありたいという考えで投稿していきます。
# 僕の原点
僕は小さい頃からゲームが好きでした。

初めてやったゲームはゲームボーイのマリオだった気がします。それからDS、Wii、３DS、WiiU、プレステ４という流れでゲームをしてきました。

ただ、僕がプログラミングを始めたきっかけは今までのゲームが楽しかったからという理由のみではありません。とある仮想ワールドでデスゲームを繰り広げるあのアニメがきっかけです！
皆さんなら多分わかってくれると思います！

そのアニメを見て僕は感動しました。
今まで楽しんでいたゲームにも「次の段階がある」ということを。
それを知って僕はワクワクしながら次の世代を担う人材になりたいという思いからXRエンジニアになりました。

# 僕はこう始めた！
先ずHTML＆CSSしかわからなかった僕にはXRプログラミングって何をしたらよいかわかりませんでした。
入学してサークル探しにも没頭していた僕はプログラミング×サークルを探し、Web系の技術を学べる学生プログラミングコミュニティを見つけ入会しました。

僕はとりあえずプログラミングの基礎を学ぶために入ったのですが、コミュニティとしてとても居心地の良い場所であり、いまの僕が信頼を置ける仲間たちがいます。

そこでプログラミングの全体像が少しづつ見えてきて、コミュニティの運営会社の方にWebARの会社を経営している方を紹介してもらうことができたり、意欲的にAR技術にのめり込むことができました。

コミュニティにもプログラミングにも少しづつ慣れてきたところで、AR技術を学べるスクールがあることを知り、すぐに話を聞きに行き、入学を決断しました。こうして、僕のARエンジニアとしての一歩を歩み始めました。

# プログラマーになるには
## 1.全体像を知ること！
先ず何をやればよいのかわからない人が大半で、それを理由にあきらめている人も多いのではないでしょうか？まずはそこを明確にすることが重要！！
何十万もかかるプログラミングスクールなんて通う必要はないし、学生にそんなお金がる人が少ないと思います！プログラミングの門戸は広い。次の記事で詳しく紹介します。
## 2. 種類を決める
エンジニアには数多くのタイプがあります。
｜Webエンジニア
｜ゲームエンジニア
｜データベースエンジニア
｜ネットワークエンジニア
｜システムエンジニア
・・・・・・・・
もっともっといっぱいあるのですが、ざっとこんな感じです。
自分の興味のあるものはどれなのか調べて取り組まないと挫折の原因になっちゃいます！
## 3. プログラミングを勉強する
さぁ、ここまで全体像を知って、エンジニアの種類をざっくり決めてこれたと仮定します！
みんな頑張って！
始めるには２パターンの人間がいます！皆さんはどちらでしょうか！
### (1)仲間と成長する（集団学習型パターン）
　プログラミング関係のサークルやコミュニティに入ることをお勧めします。お金に余裕があれば集団学習型のスクールでもOK！
今は、スクールに比べて安価でプログラミングを学べるところも多いので安心してください！！

マルチや悪徳な団体もいるので口コミやSNSを見て見極めましょう！
### (2)１人で成長する（個人学習型パターン）
Udemyやドットインストールなどのオンライン動画学習サイトで勉強することが適していると思います！！本がいい人はもちろん本でも！！
何もかも初めてだよ～って人は<font color="red">progate</font>っていうめっちゃいい学習アプリがあるので1回開いてみて下さい！！

これらの大手学習サイトは安心安全です！しかも分野が多岐にわたる！！
分野ややることを捉え、自分で道筋を作っていかなくてはいけませんが、費用は教材費のみです！！
個人的にはとっつきやすいprogateが推すすめです！

僕の記事を見ていただければ、XR系・Web系などの道筋は詳しく紹介します！！


# 結論！！！！
今この瞬間から動き出す！！！
皆さんの今の貴重な時間はこんな単純なことを悩むためにはない！！
今この記事を見終わってすぐ、プログラミングを始められる！
なぜやらないのか、やらないんじゃなく道が見えないだけで不安になっているだけだと思います！
まずは、progateをやってみることから始めましょう！！
僕が困ったときはサポートするので一緒に頑張りましょう！！！
neosでlogix その86

# 概要
neosでlogixやってみる。
インベントリーのボタンを、説明してみた。

# インベントリーのボタン
右上に表示されているボタンは選択しているものによって表示が異なる。
- 共通

|マーク|内容|
|:--|:--|
|プラスマーク|	セッションでグラブしているオブジェクトを、保存する。何もグラブしていない場合は新しくフォルダを作る。
|ゴミ箱マーク|	選択したオブジェクトをダブルトリガーで、削除する。
|保存マーク|	セッションで装備しているアバターを保存して、装備し直す。
|雲マーク|	インベントリの一番上の階層へ、移動する。(グループに所属している場合、共有フォルダはここからアクセスする)
- アバター選択時

|マーク|内容|
|:--|:--|
|雷マーク|	セッションでアバターを、装備する。
|ハートマーク|	デフォルトアバター(お気に入り)に、設定する。
- フォルダ選択時

|マーク|内容|
|:--|:--|
|メールマーク|	フォルダを共有フォルダに設定して、セッションに、取り出す。
|手マーク|	共有フォルダに設定した、フォルダの共有を、解除する。
- ワールドオーブ選択時
ワールドをオーブにしてあるもの。

|マーク|内容|
|:--|:--|
|スライドマーク|	ワールドを、開く。（セッション）
|ハートマーク|	ホームワールドに、設定する。
- Facet選択時
簡単に並べ替えやリサイズが可能なUI要素を作る機能。
現在、ダッシュメニューに使われており、画像のように自由にメニューのレイアウトを変更できる。

|マーク|内容|
|:--|:--|
|取り出しマーク|	Facetをユーザースペースに、取り出す。選択したFacetをDashメニューのある階層(ユーザースペース)にスポーンします。このボタンから出現させることでダッシュメニューに配置することができます。この操作はパブリックフォルダからはできません(Neos Essentialフォルダは例外です)。必ず自分自身が所有するフォルダ内で行う必要があります。

以上。
VPNとは何か?をさっくり勉強

VPNとは何か？導入のメリット・デメリットとは何か？を学習

# 教材
エンジニア以外の方でもわかりやすいような説明になっているため、完全な初学者にもおすすめ

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

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

上の動画でオススメされているVPN提供会社の公式サイト
公式サイトの説明にしては非常にわかりやすい

https://nordvpn.com/ja/what-is-a-vpn/

# 学習の流れ
動画を視聴->NordVPNのサイトで学習
の流れで学習すると理解が深まったのでおすすめ


# VPNとは？
バーチャル・プライベート・ネットワークの略
**公衆のネットワーク内に自分だけの専用回線をつくる**(イメージ)
様々な会社が提供しており、無料のものもあるが質が低い(通信速度が遅い、など)

# VPNの特徴とメリット
### 「トンネリング・暗号化・認証」の３つを使って通信を安全に守ることができる
1. 自分の端末と接続先の間に仮想的な通信経路を構築(トンネリング)
2. やりとりするデータを暗号化し、箱に詰めて鍵をかける。盗み取られても解読できないようにする(カプセル化)
3. 認証された鍵がなければ復号できない(認証)

という流れ

### 経由するサーバーを選択

VPNを使用すると、**どこの国のサーバーを経由するか**を選択できる

例として、トルコのサーバーを経由するように選択すると、通常アクセスできるPayPayのアプリにアクセスできなくなる
これは、**PayPayは日本国内のサービスのため**、トルコのサーバーからでは弾かれ、アクセスできないことが理由

※ロシアや中国などの情報規制が激しい国の方は、VPNを利用して海外の情報を取得しているらしい・・・

# VPNのデメリット
### 通信速度の低下
VPNはサーバーを経由して接続するため、直接アクセスするよりも時間がかかってしまう
どれくらい遅くなるかは**サーバーの能力次第**
通信速度の速いVPNを提供している会社 = 資金力があり、高品質のサービスを提供している会社

### VPNを提供している会社自体が危ない
VPNは、VPNを提供している会社のサーバーを経由するため、いくらハッカーから情報を守れたとしても**その会社自体がアウトだと情報を盗み取られる**

ノーログポリシーの会社のVPNを使用することが推奨される

#### ノーログポリシー
顧客の通信ログを取らないこと
自ら宣言することもできるため、第三者期間の認証を得ている会社かどうかの確認が必要

VPN提供会社の比較は[こちらのサイト](https://www.mobi-connect.net/blog/vpn-comparison/)を参照

# 安全性について
通信の傍受に関しては安全
ただ、危険なサイトにアクセスした場合、**危険なデータをセキュアな環境でやりとりしてしまう**ので、そもそも危険なサイトへのアクセスは行わないことが前提になる

# 参考
https://biz.nifty.com/cs/biznote/detail/211201000147/1.htm
slickの読み込みの遅さが改善

<h1>目次</h1>
前回の続き
　<ul><li>DOMの構造に問題があった</li>
　　<li>slick以外の方法でスライダーの実装を検討する</li>
　　<li>課題</li>

<h2>DOMの構造に問題があった</h2>
<p>前回、ポートフォリオにスライダープラグインslickの実装をしてみたところ、<strong>読み込みが非常に遅くなってしまう</strong>という問題が起こりました。<br>
コードを書き換えた際に、見た目を確認するためにページをリロードしようとすると、なかなかページが表示されないという状態です。<br>
この件についてオンラインスクールの先生に伺ったところ、<br>
<strong>「&lt;ul&gt;と&lt;li&gt;のリスト形式で作っていないからではないか」</strong><br>
とのご指摘をいただきました。<br>
その時私は、slickの公式サイトを参照の上、以下のようなDOM構造でHTMLを記載していました。<br>
<br>
&lt;div class="my-slider"&gt;<br>
　&lt;div&gt;<br>
　　&lt;img src="画像１"&gt;<br>
　&lt;/div&gt;<br>
　&lt;div&gt;<br>
　　&lt;img src="画像２"&gt;<br>
　&lt;/div&gt;<br>
　&lt;div&gt;<br>
　　&lt;img src="画像３"&gt;<br>
　&lt;/div&gt;<br>
&lt;/div&gt;<br>
<br>
それを、以下のように書き換えたところ、一瞬でページをリロードできるようになりました。</p>
<br>
&lt;ul&gt;<br>
　&lt;li&gt;<br>
　　&lt;div&gt;<br>
　　　&lt;img src="画像１"&gt;<br>
　　&lt;/div&gt;<br>
　&lt;/li&gt;<br>
　&lt;li&gt;<br>
　　&lt;div&gt;<br>
　　　&lt;img src="画像２"&gt;<br>
　　&lt;/div&gt;<br>
　&lt;/li&gt;<br>
　&lt;li&gt;<br>
　　&lt;div&gt;<br>
　　　&lt;img src="画像３"&gt;<br>
　　&lt;/div&gt;<br>
　&lt;/li&gt;<br>
&lt;/ul&gt;<br>

<h2>slick以外の方法でスライダーの実装を検討する</h2>
　<p>今回はslickでスライダーを実装しましたが、スライダーを実現する方法はslickだけではありません。<br>
どうしても上手くいかない時には、slickにこだわらず、別の方法で実現できないか代替策を考える力も必要だと思いました。<br>
私はBootstrapも学んでいたので、そちらでも簡単なスライダーを作ることはできたでしょう。<br>
もちろん、どうして上手くいかないのか、原因を特定することも大きな学びになるので大切ですが、時間とスキルアップとどちらを優先するかは、その時の状況次第かと思います。</p>

<h2>課題</h2>
<p>今回感じたことは、自分で調べることには限界があるということです。<br>
公式サイトに書いてあるDOM構造で上手くいかないとは思ってもいなかったのと、公式サイトは英語なので、説明をすべて理解できているわけでもありません。<br>
色々なサイトを見てリスト形式のDOM構造で書いてあるのを見たとしても、divとulでそこまで大きな違いが出てくるとは思いませんでした。<br>
まだまだ知らないことだらけなので、経験者から直接学ばせていただくことは重要だと感じました。</p>
Rails6にBootstrapを導入する際に嵌ったこと

どうも。
Railsアプリの開発で、Bootstrapがうまく反映されない問題が発生したため、
再発防止を兼ねてメモ。

- 事象
Rails6のアプリを作成時にBootstrapを導入しようとし、以下のプログラムを編集したものの、Bootstrapが反映されなかった。

```/funyuspaceapp01/app/javascript/packs/application.js
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.
//= require jquery
//= require jquery_ujs
require('articles')
require('../images', true)

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"
import "bootstrap"
import "../stylesheets/application"

Rails.start()
Turbolinks.start()
ActiveStorage.start() 
```
```/funyuspaceapp01/app/javascript/stylesheets/application.scss
@import "~bootstrap/scss/bootstrap.scss";
（以下、bootstrapの中身の定義）
```

- 対策①
下記のファイルを変更
```（変更前）/funyuspaceapp01/app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Funyuspaceapp01</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```
```（変更後）/funyuspaceapp01/app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Funyuspaceapp01</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```
（参考）https://teratail.com/questions/289925
→効果なし

・対策②
コンソール画面のエラー
「application.js:1 Uncaught Error: Cannot find module 'bootstrap'」
より、**BootstrapのJavaScriptライブラリを、アプリケーションにインストールできていない**のでは？と推察

boostrap5バージョンをインストール
yarn add bootstrap@5.0

→無事導入されました。

（追記）
ドロップダウンなどのポップアップ要素をいい感じにしてくれるpopper.jsもインストールすると良いらしいです。
yarn add @popperjs/core
(リンクだけです) 「正弦定理（せいげんていり、英:law of sines）」を調べました。

円周角の定理とワンセットでした。

# wikipedia

https://ja.wikipedia.org/wiki/%E5%86%86%E5%91%A8%E8%A7%92

https://en.wikipedia.org/wiki/Inscribed_angle

Inscribed　内蔵

https://ja.wikipedia.org/wiki/%E6%AD%A3%E5%BC%A6%E5%AE%9A%E7%90%86

https://en.wikipedia.org/wiki/Law_of_sines

# 証明

https://qiita.com/bobchin/items/4cbb3a4b1244d13c60a8

https://qiita.com/bobchin/items/89ec4d144021a3fcfe64

# 円周角の定理の逆　もありました。

# 大学入試問題

円周角の定理　＜　M.E.T.A.様の内部検索

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E5%86%86%E5%91%A8%E8%A7%92%E3%81%AE%E5%AE%9A%E7%90%86&oq=%E5%86%86%E5%91%A8%E8%A7%92%E3%81%AE%E5%AE%9A%E7%90%86&gs_l=partner-web.12..0i512j0i512i433i433j0i433i131j0i512l7.3420.3420.0.10051.1.1.0.0.0.0.210.210.2-1.1.0.csems%2Cnrl%3D10...0....2.34.partner-web..0.1.208.hOWM9I_fZdc

正弦定理　＜　M.E.T.A.様の内部検索

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E6%AD%A3%E5%BC%A6%E5%AE%9A%E7%90%86&oq=%E6%AD%A3%E5%BC%A6%E5%AE%9A%E7%90%86&gs_l=partner-web.12..0i512l10.4457.4457.0.6142.1.1.0.0.0.0.254.254.2-1.1.0.csems%2Cnrl%3D10...0....2.34.partner-web..0.1.253.NK_ixZAorOg

円周角　＜　kamelink様のタグ

https://kamelink.com/blog/tag/%e5%86%86%e5%91%a8%e8%a7%92/

正弦定理　＜　kamelink様のタグ

https://kamelink.com/blog/tag/%e6%ad%a3%e5%bc%a6%e5%ae%9a%e7%90%86/

# 参考
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「リソースタグ」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「リソースタグ」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[リソースのタグ付けを適用する](https://learn.microsoft.com/ja-jp/training/modules/configure-subscriptions/7-apply-resource-tagging)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Microsoft Cost Management」](https://qiita.com/fsd-jume/items/1639233963f93cddd40a)

## リソースタグ
### リソースタグ
・リソースの並べ替え/検索/管理/分析に利用可能
・名前と値のペアで構成されている
例：名前 → Server、値 → Production または Development
・タグの名前は大文字/小文字が区別されない
・タグの値は大文字/小文字が区別される
・リソース/リソースグループ/サブスクリプションには最大50個のタグを適用可能
※リソースグループ/サブスクリプションは50個のタグが付いたリソースを多数含むことが可能
・リソースグループに適用されたタグはデフォルトではグループ内リソースに継承されない
⇒Azure Policyによる一括付与やCost Managementのタグ継承機能で継承可能

※AZ-900の学習まとめでも扱っておりますので、復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「タグの目的」](https://qiita.com/fsd-jume/items/7ebec820771e5f6162db)

**◆リソースタグの使用例**
・本番環境と開発環境のサーバをタグで管理したい場合のタグ付けの例
　-タグの名前：それぞれに共通する「サーバ」
　-タグの値：それぞれで一意となる「本番」と「開発」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/d3b308e6-f306-0b4c-b3e8-ae0befcb1281.png)

### リソースタグ使用時の考慮事項
**◆タグデータで検索することを検討**
・タグの名前と値のクエリでサブスクリプション内のリソースを検索

**◆関連するリソースを見つけることを検討**
・タグの名前や値を検索して関連するリソースを取得可能

**◆課金データをグループ化することを検討**
・コスト管理や運用環境別にタグでグループ化
・VMの場合はサービスのリソース使用量CSVファイルをダウンロードするとタグも表示

**◆PowerShell/Azure CLIを使用してタグを作成することを検討**
・プログラムにより多くのリソースタグをまとめて作成可能

## 次の学習内容
**◆コスト削減に役立つオプション**

https://qiita.com/fsd-jume/items/dbd5c9658e2e2c057496

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
TabCenter勢必見！FirefoxViewを消す。

![スクリーンショット 2023-01-24 093130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/86c8a24a-eb0b-22a0-fc5f-a6b31807fa60.png)

# ①about:Configを開く

# ②browser.tabs.firefox-view → False
![スクリーンショット 2023-01-24 093218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/69116a40-6573-cb4b-5ca6-d7c7394dc2fe.png)

# ③browser.tabs.tabmanager.enabled → False
![スクリーンショット 2023-01-24 093233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/aa3362e7-3c87-cb75-84ca-9c26d4f5ad58.png)

# ④再起動でスッキリ
![スクリーンショット 2023-01-24 093253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/c6a14706-4103-1b17-7605-24b1a9b3d1f0.png)
【レビューで指摘されがちシリーズ】コードのまとまりを意識しよう

あるメソッドのテストを書くときにテストの SetUp でこんな感じのコードを書いていました。

```c#
[SetUp]
public void Init()
{
    var customer = new Customer();

    // ここから処理が10行くらいあると思ってください

    _name = customer.name;
}

```

レビュー時にこんな感じの指摘をもらいました。
「 `_name =customer.name` は `var customer = new Customer()` の直後に移動してほしいです。`var customer = new Customer();` 以降の設定が影響あるのかどうか分かるようにしたいです。」

つまりこう書いたほうが良かったパターンです。

```c#
[SetUp]
public void Init()
{
    var customer = new Customer();
    _name = customer.name;

    // ここから処理が10行くらいあると思ってください
}
```

指摘を受けて、なぜこんな初歩的なことに自分で気づかなかったんだろうと思い原因を考えました。

原因
1. テストコードはテストの処理内容を分かりやすくするためにメソッド化せずべた書きで書くことが多いため
1. テストを秘伝のタレ的に継ぎ足しながら書いたため
1. 最後に自分で見直しをしていないため

自分での見直しをやれば大丈夫じゃないか？という気もしますが、自分での見直しはザルになりがちなので実はあまり当てにならないかもしれません。

どちらかというとテストコードを書く時の注意点として頭に入れておく方が、今後同じ指摘を受けないで済むかもしれません。
初歩的なことですが、コードのまとまりを意識して読み手にやさしいコードを書けるようにしたいですね。
顧客分析の手順 - 変数の性質

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

著者 山本 泰史 （やまもと やすし）

# 顧客分析の手順

## 第5回： 変数の性質
顧客分析に利用するデータ、そしてそれを変換した変数を利用する段階で、その性質を理解した上で利用する必要があります。変数は大きく、その性質によって量的変数と質的変数に分かれます。量的変数が定量的な量、つまり数値で表現されるのに対して、質的変数はその違いで表現されます。

### 量的変数と質的変数
量的変数の代表的な例として、業界毎に以下のような例が挙げられます。

１．銀行業： 口座残高、貸出額、口座引落額、口座引落回数…
２．小売業： 買上金額、買上数量、買上回数…
３．通信業： 通話時間、通話回数、請求金額…
４．旅行業： 渡航距離、利用金額…
これ以外にも契約期間数、Webサイトの閲覧回数に代表される特定チャネルへの接触回数等が量的変数の代表例です。これに対して質的変数は、質的に異なることを意味している変数です。以下のような例が挙げられます。

１．性別、住所、持家区分、商品Aの購買有無、特定チャネルへの接触有無…
また、質的変数には順序を規定している場合もあります。アンケート調査の評点はこの代表的な例です。年齢層（年齢だと量的変数とも言えるかも…）、マーケティングでよく利用される RFM の 5段階スコア等は、元々の量的変数を複数のグループに集約し、カテゴリーコード（Recency番号 = 5 とか）に変換しているケースです。このような変換を施すことによって、量的変数から質的変数への変換がなされます。

このような例として、図7 に買上金額を変換した例を挙げています。顧客の買上金額が少ない順から並べているのが、量的変数そのままの分布です。これを例えば買上金額を分割基準に 4分割すると真ん中の分布へと変換され、「顧客から買上が有ったか、無かったか」でさらに集約すると、2値の変数へとさらに変換されます。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/c13ac13a-41e3-e1f8-7d52-bf10616956f5.png">


このような変換は、分析実施の目的に応じてなされるべきです。目的が「それぞれの顧客はどの程度購入しているのだろうか？」という疑問を解決するものであるならば、買上金額はそのまま利用されるべきです。より簡略化し、買上金額が「多い」、「少ない」、「中くらい」の 3顧客群に分けて把握したいのであれば、3つのカテゴリーに分割すべきです。また、例えば「特定商品の購入有無が、他の事象と関係するかどうかを把握したい」、もしくは「この商品を既に購入済みの顧客が、どれ位いるか理解したい」ということであれば、購入有無で理解するのが適切です。このように、変数作成時にはその性質を理解し、目的に応じた形式に変換して利用することが必要です。

### 単位についての理解
量的変数と質的変数の違いだけでなく、そのデータが帰属している単位についての理解も必要になります。代表的な単位として以下のものが挙げられます。

### 絶対量： 
長さ、広さ、金額、数量等、量的変数はこのような単位を有しています。金額や数量、回数は代表的なものですが、それ以外にも通信業でれば通話時間、通信データ量やパケット量がこれに該当します。各顧客を単一の行で、各列でその顧客を特徴づけると考えた場合、絶対量は一般に合計量となります。
### 平均： 
複数の合計量データを顧客が発生させている場合、その合計を発生回数で割り算した値です。その名の通り、平均的な発生時の発生量を理解しています。
### 最小値、最大値、最頻値：
 たとえば買上金額を考えた場合、「この顧客は最低この程度の金額購入する」、「この顧客は最大この程度の金額を購入する」、「この顧客はいつもこの程度の金額購入する」といった理解をする際に用います。
### 割合、確率： 
全体を 1 とした場合の構成比を理解します。このため、値は 0 から 1 で示され、0 に近いほどその事象は発生しづらく、1 に近いほど発生しやすいことを意味します。
### リフト、指数： 
平均値や基準値を分母に置き、その値を基準にした各顧客の乖離度合いを意味します。1 を基準にして 1未満であればその事象は当該顧客に発生し難く、1 の場合には平均と同等、1 より大きい場合には当該顧客に強く発生しやすいことを意味します。例えば顧客全体の婦人衣料へに対する平均的な買上金額構成比が 30％、顧客A の婦人衣料買上金額構成比が 60％、顧客B の買上金額構成比が 15％であれば、顧客A のリフト値は 2、顧客B のリフト値は 0.5 と示され、1 を基準とした距離が事象の発生し易さ／し難さを意味します。これは平均値を分母に置いた例ですが、基準値の代表的例として、成長率が挙げられます。成長率は前期の値を基準として、どの程度値が増大したか、減少したかを見ています。


### 有無を意味する 2値：
 ある事象が発生したか否かを意味する、一般的には 0 と 1 で示される質的変数です。

### 順位的意味付けを有する質的変数： 
前述したアンケート調査、RFMスコア等が当てはまります。

### 順位的意味付けのない質的変数： 
住所や郵便番号が代表的な例です。また良く利用される例として、最頻利用チャネル、最多購入商品カテゴリー等、量的変数をこのような形式で質的変数化する場合があります。


以上、変数の性質に焦点をあて、多用されるパターンとその分類を概観しました。次回はこのようにして作成された変数を把握する方法について理解していきます。



#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
InfluxDB v2: API の使い方 (Python3)

関連ページ
[InfluxDB v2: API の使い方](https://qiita.com/ekzemplaro/items/6963c9fa714fb47f4d54)

## 準備

環境設定ファイルの作成

```text:.env
bucket = "dbtest"
org = "ekzemplaro"
token = '***-_nfenN6m5LhKUXNcrQ_H3dZSQo2pVpyyJg6nskHEwcl6bMsjc1vyzY9b11hSyGiQMOg=='
url="http://localhost:8086"
```

## データの書き込み

```py:api_insert.py
#! /usr/bin/python
#
#	api_insert.py
#
#					Jan/24/2023
#
# ------------------------------------------------------------------
import	os
import	sys
import	json
import	requests
from dotenv import load_dotenv
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
dotenv_path = '.env'
load_dotenv(dotenv_path)
bucket = os.environ.get("bucket")
org = os.environ.get("org")
token = os.environ.get("token")
url = os.environ.get("url")
#
url_target=url + "/api/v2/write?org=" + org + "&bucket=" + bucket + "&precision=ns"
headers = {'content-type': 'text/plain; charset=utf-8'}
headers['Accept'] = 'application/json'
headers['Authorization'] = 'Token ' + token
data='id=TLM0201 temperature=22.9'
#
rr=requests.post(url_target,data, headers=headers)
print(rr)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

## データの読み込み

```py:api_query.py
#! /usr/bin/python
#
#	api_query.py
#
#					Jan/24/2023
#
# ------------------------------------------------------------------
import	os
import	sys
import	json
import	requests
from dotenv import load_dotenv
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
dotenv_path = '.env'
load_dotenv(dotenv_path)
bucket = os.environ.get("bucket")
org = os.environ.get("org")
token = os.environ.get("token")
url = os.environ.get("url")
#
url_target=url + "/api/v2/query?org=" + org
headers = {'content-type': 'application/vnd.flux'}
headers['Accept'] = 'application/csv'
headers['Authorization'] = 'Token ' + token
data='from(bucket:"' + bucket + '") |> range(start: -12h)'
#
rr=requests.post(url_target,data, headers=headers)
print(rr.text)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```
【Laravel】初心者向けプロジェクト作成



composerから以下コマンドで「sample-project」というLaravelプロジェクトを作成しようとすると、
エラーが出た。
```terminal:プロジェクト作成コマンド
composer create-project laravel/laravel sample-project --prefer-dist
```
```terminal:エラー内容
The zip extension and unzip/7z commands are both missing, skipping
```
#### 対応方法
php.iniファイルを開いて、「;extension=zip」となっているところを「extension=zip」に変更する。
【JavaScript】フォームに文字が入力されたら、同じ文字を表示させる

## :closed_book: 完成形

フォームに文字が入力されたら、同じ文字を表示させる
![chrome-capture-2023-0-24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/909809/acf20db7-2102-784c-b75a-ff4c478e816f.gif)

## :closed_book: コード

```:HTML
<form id="form">
	<input id="form_text" type="text" name="name" size="25" placeholder="テキストを入力してください">
</form>
<table>
  <tr>
    <td class="title-fw"></td>
    <td class="title-fw">Light</td>
    <td class="title-fw">Medium</td>
    <td class="title-fw">Bold</td>
  </tr>
  <tr>
    <td class="title">10px</td>
    <td class="change"></td>
    <td class="change"></td>
    <td class="change"></td>
  </tr>
  <tr>
    <td class="title">15px</td>
    <td class="change"></td>
    <td class="change"></td>
    <td class="change"></td>
  </tr>
</table>
'
```

```:CSS
.title-fw {
  padding: 5px; 
}

.title {
  display: inline-block;
  color: #fff;
  background-color: gray;
  border-radius: 10px;
  padding: 3px 8px;
  text-align: center;
  margin: 5px 20px 5px 0;
}

table {
 width: 30%;
}

td {
  width: 100px;
}

.text-change {
  padding: 3px 8px;
}
```

```:JS
//フォームに入力した値を定義
const form_text = document.getElementById("form_text");

//HTMLを書き換えるクラスを定義
const changes = document.getElementsByClassName("change");

form_text.addEventListener("input",function(){
  for (let i = 0; i < changes.length; i++) {
    changes[i].textContent = form_text.value;
  }
});
```
Data Management > Import Data

[Trailhead関係　個別の課題別](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)

+ [Data Management > Import Data](https://trailhead.salesforce.com/content/learn/modules/lex_implementation_data_management/lex_implementation_data_import)

# csvファイルを見つけられない

+ [Trailhead data import using Data Import Wizard- Prepare Data but where do I get the data?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jfxyo)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/432cba6d-ded4-246b-58f0-a1342ccef9c5.png)

+ https://www.youtube.com/watch?v=NcoM8_Z7Pig
コンバージョンの確認ならMicrosoftのClarityが優秀

個人でブログを運営しているのですが、MicrosoftのClarityを使うことで、

- ユーザー滞在時のキャプチャを自動でとってくれる
- どのボタンをクリックしているのかが視覚的に分かる
- ヒートマップも出る

という最高のツールになっています。

**何より無料なのがイイ！**

https://clarity.microsoft.com/

実際の画面はこんな感じ。（あんまり見せられないけど💦）

![52340ca459c8e605e75a802a3fb3c033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949803/96858f09-89a5-2b19-5e2d-89ba872f26ff.png)

`Slimstat` とかでリンクを辿ってしまえば、普段なかなか取れないアフィリエイトのコンバージョンリファラも簡単に分かります！

![acf542c808cc072ec4aa4d7b656ce45d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949803/1ed5fa15-6542-58ba-65e2-031dfacbfca3.png)
Customize an Org to Support a New Business Unit  > Configure an Email Letterhead and Template

[Trailhead関係　個別の課題別](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)


# Could not find a file named 'GetCloudyConsultingLogo'. 

+ [Configure an Email Letterhead](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jfy6i)


以下、手順の回答

You will essentially have to do everything in Classic instead of Lightning.

Once you've downloaded and saved the logo to your desktop, switch your Playground's interface to Classic if you haven't already. Once in Classic, click the + sign on the Navigation menu and scroll down until you get to Documents. Click on Documents, then create a New Document called Support Team Logo. Check the Externally Available Image box and upload the logo.

Next, go to Setup and Search "Letterheads." Click on Classic Letterheads, the click the Next button. Create a New Letterhead with the label General Customer Support and check the "Available for Use" box. Enter the description, then save. Now, click Select Logo in the header and choose your Support Team Logo to add it to the header. NOTE: You will not be able to add the "Dear Recipient" merge field here; you will have to wait to add it to the email template (see below). Save your new Letterhead.

Now search in Setup for Classic Email Templates. Make sure the folder is Unfiled Public Classic Email Templates at the top. Create a New Template, choose HTML (using Classic Letterhead), then click Next. Choose the Unfiled Public Classic Email Templates folder, check Available for Use, and name it Public Facing General. Add the description and subject. In the body is where you enter the salutation. Note that the Recipient merge field is unavailable in Classic, so you will need to choose a Contact field. You will enter "Dear {!Contact.FirstName}," then save.

You shouldn't need to send the email test to complete the Challenge, but you can if you want to double-check your work.

+ https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A9C3USAV


ロゴのファイルを見つけられない？

+ https://trailhead.salesforce.com/content/learn/projects/customize-an-org-to-support-a-new-business-unit/configure-an-email-letterhead-and-template

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/41df1951-1efe-a63b-6e50-0d86bdbdd709.png)
 

+ [Could not find a file named 'GetCloudyConsultingLogo'.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000LGsrh)
NCMBのスクリプトでblastengineのメールを送信する

[NCMB](https://mbaas.nifcloud.com/)に用意されているスクリプトは、サーバーサイドで実行するコードをクラウド上で実行できる機能です。Node.jsとRubyのコードをクラウド上で実行し、結果を取得できます。

主にガチャのようなクライアントに記述したくないコードを実行したり、APIキーを使ったアクセスなどで活用できます。今回はメール送信サービスの[blastengine](https://blastengine.jp/)を使って、スクリプトでメール送信を実装します。

## 必要なライブラリ

ネットワークアクセスを行う `superagent` とトークン生成用の `crypto` ライブラリをインポートします。

```javascript
const request = require('superagent');
const crypto = require('crypto');
```

## URL、定数の定義

blastengineのAPIへリクエストするための変数を定義します。

- APIエンドポイントURL
- ユーザーID
- APIキー

```javascript
// blastengine用の設定
const TRANSACTION_URL = 'https://app.engn.jp/api/v1/deliveries/transaction';
const USER_ID = 'YOUR_USER_ID';
const API_KEY = 'YOUR_API_KEY';
```

## トークンを生成する

ユーザーIDとAPIキーを使ってトークンを生成します。ユーザーIDとAPIキーをつなげてSHA256でハッシュ化し、さらにBASE64エンコードします。

```javascript
const str = `${USER_ID}${API_KEY}`;
const hashHex = crypto
	.createHash('sha256')
	.update(str, 'utf8')
	.digest('hex');
const TOKEN = Buffer
	.from(hashHex.toLowerCase())
	.toString('base64');
```

## リクエストに伴う処理

NCMBのスクリプトは、リクエストごとに以下の関数を実行します。

```javascript
module.exports = async (req, res) => {
  // この中に処理を書きます
}
```

### HTTPヘッダーを作成

トークンを使ってHTTPヘッダーを作成します。

```javascript
// ヘッダー
const headers = {
  Authorization: `Bearer ${TOKEN}`,
  'Content-Type': 'application/json',
}
```

### リクエストボディを作成

今回はリクエストされた `email` パラメーター宛にリクエストボディを作成します。また、 `cc` と `bcc` パラメーターで追加のメールアドレスを指定できます。

```javascript
// リクエストボディから、blastengineのリクエストを作成
const { body } = req;
const data = {
  from: {
    email: 'no-reply@opendata.jp',
    name: '送信者サンプル'
  },
  to: body.email,
  subject: 'テスト件名',
  encode: 'UTF-8',
  text_part: 'テスト配信',
  html_part: '<!DOCTYPE html><html><header></header><body>sample html</body></html>'
};
if (body.cc) data.cc = [body.cc];
if (body.bcc) data.bcc = [body.bcc];
```

### メール送信リクエストを行う

できあがったデータをblastengineのメール送信APIを呼び出します。レスポンスが201であればメール送信成功です。

```javascript
try {
  // blastengineへのリクエスト実行
  const response = await request
    .post(TRANSACTION_URL)
    .set(headers)
    .send(data);
  // レスポンスステータスで処理判別
  if (response.statusCode === 201) {
    res.send(response.body);
  } else {
    res.send({error: `Send mail error: ${response.statusCode}`})
  }
} catch (e) {
  // 4xx / 5xx系の場合はこちら
  res.send(e.response.body);
}
```

レスポンスは `{"delivery_id": 999}` のような内容となっています。

## スクリプトからの呼び出し

スクリプトでは以下のように呼び出します。

```javascript
await ncmb.Script
  .exec('POST', 'sendmail.js') // スクリプト名は自分で決められます
  .data({
    email: 'info@example.com'
  })
```

## まとめ

blastengineはユーザーIDとAPIキーを使って簡単にメール送信ができます。アプリからメール送信したり、お問い合わせなどに利用できるでしょう。

アプリにはプッシュ通知もありますが、メールもよく利用されます。メールが必要な際に、blastengineを利用してみてください。

[スクリプト (JavaScript & Monaca) : 基本的な使い方 | ニフクラ mobile backend](https://mbaas.nifcloud.com/doc/current/script/basic_usage_javascript.html#/JavaScript/)
NCMBのスクリプトでSendGridのメールを送信する

[NCMB](https://mbaas.nifcloud.com/)に用意されているスクリプトは、サーバーサイドで実行するコードをクラウド上で実行できる機能です。Node.jsとRubyのコードをクラウド上で実行し、結果を取得できます。

主にガチャのようなクライアントに記述したくないコードを実行したり、APIキーを使ったアクセスなどで活用できます。今回はメール送信サービスのSendGridを使って、スクリプトでメール送信を実装します。

## 必要なライブラリ

ネットワークアクセスを行う `superagent` をインポートします。

```javascript
const request = require('superagent');
```

## URL、定数の定義

SendGridのAPIへリクエストするための変数を定義します。

- APIエンドポイントURL
- APIキー

```javascript
// SendGrid用の設定
const SENDGRID_URL = 'https://api.sendgrid.com/v3/mail/send';
const API_KEY = 'YOUR_API_KEY';
```

## リクエストに伴う処理

NCMBのスクリプトは、リクエストごとに以下の関数を実行します。

```javascript
module.exports = async (req, res) => {
  // この中に処理を書きます
}
```

### HTTPヘッダーを作成

トークンを使ってHTTPヘッダーを作成します。

```javascript
// ヘッダー
const headers = {
  Authorization: `Bearer ${API_KEY}`,
  'Content-Type': 'application/json',
}
```

### リクエストボディを作成

今回はリクエストされた `email` パラメーター宛にリクエストボディを作成します。また、 `cc` と `bcc` パラメーターで追加のメールアドレスを指定できます。

```javascript
// リクエストボディから、SendGridのリクエストを作成
const { body } = req;
const data = {
  'personalizations': [
    {
      'to': [
        {
          'email': body.email
        }
      ],
      'subject': 'テストメール from SendGrid',
    }
  ],
  'from': {
    'email': 'info@devrel.dev'
  },
  'content': [
    {
      'type': 'text/plain',
      'value': 'これはテストメールです'
    }
  ]
};
if (body.cc) data.personalizations[0].cc = [{'email': body.cc}];
if (body.bcc) data.personalizations[0].bcc = [{'email': body.bcc}];
```

### メール送信リクエストを行う

できあがったデータをSendGridのメール送信APIを呼び出します。レスポンスが202であればメール送信成功です。

```javascript
try {
  // SendGridへのリクエスト実行
  const response = await request
    .post(SENDGRID_URL)
    .set(headers)
    .send(data);
  // レスポンスステータスで処理判別
  if (response.statusCode === 202) {
    res.send({});
  } else {
    res.send({error: `Send mail error: ${response.statusCode}`})
  }
} catch (e) {
  // 4xx / 5xx系の場合はこちら
  res.send(e.response.body);
}
```

## スクリプトからの呼び出し

スクリプトでは以下のように呼び出します。

```javascript
await ncmb.Script
  .exec('POST', 'sendmail.js') // スクリプト名は自分で決められます
  .data({
    email: 'info@example.com'
  })
```

## まとめ

SendGridはAPIキーを使って簡単にメール送信ができます。アプリからメール送信したり、お問い合わせなどに利用できるでしょう。

アプリにはプッシュ通知もありますが、メールもよく利用されます。メールが必要な際に、SendGridを利用してみてください。

[スクリプト (JavaScript & Monaca) : 基本的な使い方 | ニフクラ mobile backend](https://mbaas.nifcloud.com/doc/current/script/basic_usage_javascript.html#/JavaScript/)
pandasでxlsxを描画

## pandasで描いたグラフ
<img width="460.8" alt="path.png (45.2 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2023/01/24/111414/8f26f4f1-1f5e-48d1-a2d9-4faddcbf1175.png">
<img width="460.8" alt="motor-vel.png (34.6 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2023/01/24/111414/42b08502-9345-45c5-a454-a7452b8926dd.png">
<img width="460.8" alt="spline-path-1.png (24.6 kB)" src="https://img.esa.io/uploads/production/attachments/18204/2023/01/24/111414/ab8343d6-faf4-4966-a01b-d44e89047539.png">

## 使い方
- https://github.com/renkawasumi/xlsx_python をcloneする
- show_xlsx.pyを実行する
    - フォルダ内に生成されたグラフがpng画像で保存される
- make_xlsx.pyを実行する
    - pythonのlistからxlsxファイルを生成する
【PHP】カンマ区切りを配列に変換する

**「DBの関係でカンマ区切りでデータを保存する」**
ということはよくあります。
カンマ区切りを配列に簡単に変えられたら・・・となりますね。

そんな時に便利な関数です。

## explode 文字列を文字列により分割する

explode() を使うと、好きな文字列で区切り文字がある文字列を配列にできます。

```
$str = "アムロ,シャア,ブライト";
$str = explode(",", $str);
// $str = ["アムロ", "シャア", "ブライト"];
```

### URLから必要な情報を取得する時におすすめです

URLから特定の情報が欲しい時に使えます。
URLに持たせている情報で判別したいことはよくあるので。

「/」で区切りたい時は、「https://」を除いてから使うと良いでしょう。
もしくは、「?」かもしれませんね。

### さいごに
カンマ区切りを配列に変換するPHP関数 explode() の紹介でした。

explode() とセットで使いたいのは、implode() です。
配列を文字列で連結してくれます。
つまり、配列をカンマ区切りに直すときに使用します。

implode() については、こちらを。
https://www.php.net/manual/ja/function.implode.php

explode() を詳しく知りたい方は、PHPの公式マニュアルをどうぞ。
https://www.php.net/manual/ja/function.explode.php
誰でもわかるDNSの仕組みは階層構造！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はDNSの階層構造の仕組みについて調べてみましょう！

![インスタスライド_202301043.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/eb260ec7-3660-0f51-3cb1-b014acf44cf7.gif)

# DNSの役割は？
URL情報をIPアドレスに変換する役割をもっているのが**DNS**
DomainNameSeverです

# YahooのDNは？
YahooのDNのyahoo.co.jpは、

jp(Japanを意味)
|
co(corporationを意味)
｜
yahoo

日本の企業のyahooを意味します。

# 階層構造のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/65f4d5e1-d8e0-35fa-c4bc-2be4d0051d3c.png)

# まとめ
ー　DNSがドメイン情報を管理している
ー　DNSは階層構造で管理されている
ー　ドメイン名を見ると、どんなサイトか、どんな企業かが確認できる

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
2023/1/24主にITとかセキュリティの記事

サイバー攻撃、日本に矛先 攻撃数3年で倍増　対応丸投げ、脆弱性放置(1/22)
https://www.nikkei.com/article/DGKKZO67788680R20C23A1MM8000/

サイバー攻撃、日本に矛先　3年で攻撃数倍増(1/22)
https://www.nikkei.com/article/DGXZQOUC0971U0Z01C22A2000000/

ソフトウエアの脆弱性とは　放置で被害大きく(1/22)
https://www.nikkei.com/article/DGXZQOUC131ME0T11C22A2000000/

米Ｔモバイルに不正アクセス、契約者３７００万人の個人情報流出(1/20)
https://www.cnn.co.jp/tech/35198869.html?ref=rss

フィッシングの注意すべき6種類の攻撃手法(1/22)
https://news.mynavi.jp/techplus/article/20230122-2565751/

Windowsのタスクスケジューラーをもっと使いこなす(1/22)
https://ascii.jp/elem/000/004/121/4121455/?rss

政府、防衛装備秘密漏えいに罰則(1/21)
http://www.shikoku-np.co.jp/flash/article.aspx?id=20230121000410

情報通信政策に関する記事のまとめ(2023.1.16～2023.1.22）
https://blogs.itmedia.co.jp/business20/2023/01/20231162023122.html?ref=rss

帝人と富士通がCFRPのリサイクル工程可視化、ブロックチェーンで再生材の価値向上(1/23)
https://xtech.nikkei.com/atcl/nxt/column/18/01537/00654/

凸版印刷が量子AI研究に本腰、半導体材料開発への応用狙う(1/23)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07583/
再帰呼出しとfor文でFibonacci数を求める


再帰呼び出しとforによる繰り返しで、Fibonacci数を求める

```fibonacci.py
#!/usr/bin/python3

def fibonacci_rec(n): # 再帰
 if n==1 or n==0:
  return(n)
 return(fibonacci_rec(n-1)+fibonacci_rec(n-2))

def fibonacci_rep(n): # 反復
  a,b=0,1
  for i in range(n-1):
    a,b=b,a+b
  return(b)

print(fibonacci_rec(10))
print(fibonacci_rep(10))
```
Refileを使用した画像投稿機能の実装

# Refileとは
- Refileを使用することで、画像の組み込みやファイルのアップロードを行うことができます。

# 実装
- gemfileに下記を追記します。
```:gemfile
gem "refile", require: "refile/rails", github: 'manfe/refile'
```
記述後`bundle install`を行います。
```
$ bundle install
```

- 画像を保存するカラムを追加します。
```
$ rails g migration AddImageIdToPosts image_id:string
```
- データベースへ反映します
```
$ rails db:migrate
```
- postテーブルに`t.string "image_id"`の1文が追加されていると思います。

- ストロングパラメーターにimageカラムのデータを受けわたせるように追記します。
```:controller/posts_controller.rb
private
def post_params
  params.require(:post).permit(:location, :text, :image)
end
```

- Refileがimageカラムにアクセスできるよう記述します。
```:model/post.rb
class Post < ApplicationRecord

  attachment :image

end
```

- 新規投稿画面にボタンを作成します
- 反映させたい部分に下記を追記します。
```
 <%= f.attachment_field :image %>
```
- 画像を表示する部分には下記を記述します。
```
 <%= attachment_image_tag post, :image, format: 'jpeg', size: '100x100' %>
```

- 実際に新規投稿を行ってみていただくと以下のエラーが出るかと思います。
```
Refile.secret_key = 'ここに英語とアルファベットの長文がでる'
```
- 上記をすべてコピーし、`config/initializers/application_controller_renderer.rb`に貼り付けます。
```:config/initializers/application_controller_renderer.rb
# Be sure to restart your server when you modify this file.

# ActiveSupport::Reloader.to_prepare do
#   ApplicationController.renderer.defaults.merge!(
#     http_host: 'example.org',
#     https: false
#   )
# end

Refile.secret_key = '先程の長文'
```

以上でRefileを使った画像投稿機能が作成出きました。

# 複数の画像を投稿する場合
- 先程の機能だけでは画像1枚しか投稿できません。
- 複数投稿を行う場合は新たにテーブルを作成する必要があります。

# 実装
- gemの導入方法は先程と同様です

- postカラムとimegeカラムを持った`post_imagesテーブル`を作成します。

- モデルを編集します
```:app/models.post.rb
class Post < ApplicationRecord
  has_many :post_images, dependent: :destroy
  accepts_attachments_for :post_images, attachment: :image
end
```
```:app/models.post_image.rb
class PostImage < ApplicationRecord
  belongs_to :post
  attachment :image
end
```

- コントローラーを編集
```:app/controllers/posts_controller.rb
 private
  def post_params
    params.require(:post).permit(:title, :content, post_images_images: [])
  end
end
```
- ここで`post_images_images: []`で配列で画像idを保存します。

- 新規投稿画面に以下を追記
```
<td><%= f.attachment_field :post_images_images, multiple: true %></td>
```
`multiple: true`で複数投稿ができるようになります。

- viewの作成
- attachment_image_tagの書き方
`<%= attachment_image_tag 保存先インスタンス名, :保存先カラム名, :fill, 幅, 高さ, format:'拡張子', fallback:"代替画像" %>`
画像を表示させたい部分に以下を追記
```
# 複数表示させる場合
<% @post.post_images.each do |image| %>
  <%= attachment_image_tag image, :image, class: "default_image" %>
<% end %>
# 1枚だけ表示させる場合
<% @post.post_images.first(1).each do |image| %>
```

これで画像を複数枚表示できるようになります。
モンテカルロ法によるπの計算

pythonでモンテカルロ法によるπの計算をします。これが本当のMonty Python.

# πを求めるアルゴリズム

```monte.py
#!/usr/bin/python3
import os
import binascii
import random

# 乱数の種を初期化
f=open("/dev/random",'rb') # /dev/randomを開く
random32bitdata=f.read(4) # ４バイト読み出し
f.close() # /dev/randomを閉じる
randomhex=binascii.hexlify(random32bitdata) #１６進の文字列に変換
randomseed=int(randomhex,16) # 整数に変換
random.seed(randomseed) # ランダムシードを初期化

count=0
n=10000000
for i in range(n):
  x = random.random()
  y = random.random()
  z = x*x + y*y
  count+=1 if (z<1) else 0

print(count/n*4) 
```
ファイル比較

二つのファイルを何バイト目まで同じか、比較します。

```cmp.c
#include  <stdio.h>
#include  <stdlib.h>
int main(int argc,char *argv[]) {
  if (argc!=3) {
    fprintf(stderr,"usage:cmp filename1 filename2\n");
    exit(1);
    }
  FILE *ifp=fopen(argv[1],"r");
  FILE *ofp=fopen(argv[2],"r");
  int n=0,c1,c2;
  while(1) {
    c1=fgetc(ifp);
    c2=fgetc(ofp);
    if ((c1==EOF)&&(c2==EOF)) {
       printf("2つのファイルは同じです。\n");
       exit(0);
       }
    if ((c1==EOF)||(c2==EOF)||(c1!=c2)) {
       printf("2つのファイルは %d バイト目まで同じです\n",n);
       exit(0);
       }
    n+=1;
    }
}
```
ファイル名やフォルダ名の先頭に右クリックで日付文字列を追加する

# 操作方法
- 日付文字列を追加したいファイルやフォルダを選択した後、右クリック ＞ `AddDateFilename.ps1` を実行します。

![AddDateFilename_ps1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534581/b9e31e0e-589c-ff14-5dc0-f4d64c1c2f35.gif)

# 準備
## Powershellスクリプトの実行を許可
- Powershellを「管理者として実行」し、下記のコマンドレットを実行します。
- 「実行ポリシーを変更しますか?」と聞かれたら、「すべて続行(A)」を選択します。
```powershell
PS C:¥...> Set-ExecutionPolicy RemoteSigned
```

## Powershellスクリプトファイルの記述
- PowerShellISE、メモ帳、VSCodeなどに下記コードをコピーあるいは記述します。
```powershell
<#
.Synopsis
   ファイル名やフォルダ名の先頭に、更新日時文字列を追加します。
   <CommonPalameters>はサポートしていません。
.DESCRIPTION
   －
.EXAMPLE
   dir $HOME\Downloads; .\AddDateFilename.ps1 $HOME\Downloads\hoge.txt; echo "`n---`n"; dir $HOME\Downloads

   ディレクトリ: C:\Users\user\Downloads

   Mode                 LastWriteTime         Length Name
   ----                 -------------         ------ ----
   -a----        2023/01/24      0:00              0 hoge.txt

   ---

   -a----        2023/01/24      0:00              0 20230124 (火)_hoge.txt
#>

foreach ($i in $args) {
   $f = Get-Item $i
   ren $f ((Get-Date $f.LastWriteTime -Format "yyyyMMdd (dddd) _").Replace("曜日", "") + $f.Name)
}
```

## Powershellスクリプトファイルの保存
- 適当な場所( `%USERPROFILE%\AppData\Local\PSScript` など)に先ほどのファイルを保存します。
- ここでは、ファイル名を `AddDateFilename.ps1` とします。

## 右クリックメニューへの登録
- Windowsのスタートメニューから「ファイル名を指定して実行」を選択して `shell:sendto` と入力し、 `%USERPROFILE%\AppData\Roaming\Microsoft\Windows\SendTo` フォルダを開きます。
- そこにショートカットを作成します。リンク先は `powershell -file %USERPROFILE%\AppData\Local\PSScript\AddDateFilename.ps1` です。
Java Spring Boot勉強用①

Spring Bootの勉強をしています。
日々の学習記録として本記事を残します。
今日学んだことは、画面からform実行からSpring Boot側でどのように実行されているかの流れ。
間違い・勘違いはあるものとして考えております。
もしお手すきの時は温かいご指摘をよろしくお願いいたします。

■処理の流れ
画面
thymeleafで作成

↓

Controllerで受け取る
@Controller   - クラスに付ける
@GetMapping   - メソッドに付ける
@PostMapping  - メソッドに付ける
※Model modelは忘れずに

↓

モデルでパラメータを受け取るときにvalidationチェック
@Validated
@ModelAttribute

モデルはgetter, setterがあるプロパティクラス
validationの（自分の中での）イメージは、
setterで画面からの値を入れるときに条件を満たしているか判定する感じ

↓

@BindingResultでvalidationの結果受けとり

↓

Model modelにaddAttribute

↓

画面に返す



■まだいまいちわかっていないところ
・インジェクションとインスタンス化の違い