OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyの開発環境を用意してみよう！- Windows-

# 概要
Rubyの開発環境を作成するための方法を紹介します。
# 前提
- OSがwindowsであること
- テキストエディタの用意
    - 今回はviで編集してしまいます。VScodeでもメモ帳でも可。
- Git bashを入れていること
    - ファイルの準備をするときに使います。必須ではないですが今回はこちらを使います。コマンドプロンプトだとLinuxコマンドは使えません...いい練習にもなりますので是非！この機会にGit Bashを！
    - 参考記事：https://qiita.com/suke_masa/items/404f06309bb32ca6c9c5

# Rubyのインストール

「RubyInstaller」というものを使ってインストールします。
Ruby+Devkit 3.0.○○ (x64)となっているものをインストールしてください。

![スクリーンショット 2023-11-11 163302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709775/e8b59491-94af-bc57-8a85-08d76fb27f9f.png)

インストーラーが開かれたら、順々にnextやOKを押してfinishを押します。

![スクリーンショット 2023-11-11 163542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709775/bf9b6ae9-ace5-d3e7-3661-879e8b44b016.png)

自動的に以下の画面が開かれるので命令に沿って"1.3"と入力してEnterキーを押してください
↑
""は無しと考えてください

![スクリーンショット 2023-11-11 163553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709775/3488a830-913d-6274-8385-2b73290a2638.png)

Enterキーを押した後の画面が以下となります。
続けてEnterキーを押してください。

![スクリーンショット 2023-11-11 164119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709775/e7af5a50-14fb-ea22-644b-304bc2faba71.png)
※ i| と画面上に入ってますが無しと考えてください(ごめんなさい)

これでインストールされましたので、
GitBashかコマンドプロンプトでRubyがインストールされているか確認してみましょう！

```
C:\Users\xxxx>ruby -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x64-mingw-ucrt]
```
無事にインストールができました！お疲れ様です！

# Rubyファイルを実際に実行してみましょう！

まずは、実行するファイルの準備をしたいと思います。

:::note
/c/Users/xxx でファイルを作成するのが嫌であれば
developフォルダ等を作ってその中でrubyが動くかテストするのも手です。
$ mkdir develop
$ cd develop
現在いる階層は以下のコマンドで確認することができます。
$ pwd 
:::

```:Git Bash
# ファイルの作成
$ touch index.rb
# ファイルを開く
$ vi index.rb
```
```Ruby:vi
#ファイルの中身は以下
puts "Hello World!PenPen!!"
puts 4+7

# viは"i"を押して入力モード。
# escキーを押して":wq"で保存し抜けることができます。
```
```:Git Bash
# ファイルの中身を確認
$ cat index.rb

puts "Hello World!PenPen!!"
puts 4+7
```
では実際にRubyを動かしてみましょう！
以下のコマンドで動かすことができるはずです！

```:Git Bash
$ ruby index.rb
Hello World!PenPen!!
11
```

これで実行出来ました！お疲れさまでした！
技術書典15のおすすめ本をピックアップ。私の本もあるで。

今日から技術書典15が開催してますよ。

今回はその中から、新刊のおすすめ本をピックアップします。　

# １　SeaArtの教科書　

[SeaArtの教科書](https://techbookfest.org/product/tJDtvkm8nthB2HCRmXYWzZ?productVariantID=8XUvYUq6uFRMfa4qY4M5zi)

えーこちら　私の出した本です。　
画像生成ができる　SeaArtの使い方を解説しています。

SeaArtはね、まじで簡単に画像生成ができるので　
とりあえず画像生成するならSeaArtがおすすめです。　　

初期設定なども必要ないし、スペックの低いPCでも　
できるし、無料でも毎日20~30枚程度は生成できますからね。　
画像生成AIに興味があれば見るべし。　







# ２　ゆるっとはじめる Godot Engine ゲームプログラミング 入門編

[ゲームプログラミング 入門編](https://techbookfest.org/product/iFkhC2Ssn0tyjfVd8uHJYi?productVariantID=uASt4RQpTanVx9J9TdmZuk)


ゲームエンジンであるGodotの解説をしている本です。　
Godotは最近かなり注目されていますが　
日本語の情報はまだ少ないので、こうゆうのは助かりますね。　
画像付きで分かりやすく解説しています。　



# ３　freee 技術の本

[技術の本](https://techbookfest.org/product/gH7KWQuiHSSAg7F56sbmRJ?productVariantID=ep6rjkQzYiNhBmMUQ3wWw1)


会計ソフトのfreeeの開発メンバーが書いてる本ですね。　
現場の声がわかっていいですね。　



# ４　技術書をかこう！ ～はじめてのRe:VIEW～ 第3版

[技術書をかこう](https://techbookfest.org/product/23ZfRJ3CTxKBVDEKzfMg0t?productVariantID=n5Wh2PmNPPppZX6qX1dkWb)

技術書の書き方が分かります。　
最新のREVIEW対応なのがいいですね。　



# ５　ゼロから始めるFlutterアプリ開発入門

[Flutterアプリ開発入門](https://techbookfest.org/product/5925951072370688?productVariantID=4873627981840384)


Flutterの解説本ですが、こちらなんと無料ですよ。　
太っ腹ですね。　

# ６　オンラインゲームの作り方

[オンラインゲームの作り方](https://techbookfest.org/product/aGKqgfscnPAxx6zjt7Lshh?productVariantID=mhpy9NDQ8ZsNEfWfxeNyxv)

Unity Gaming Servicesによる、オンラインゲームの実装を
解説しています。　
更に独自ツールも付いてます。　



# ７　パスキーのすすめ

[パスキーのすすめ](https://techbookfest.org/product/eiaE1tk3bEcu7iPfZx9ysU?productVariantID=fsyE4LdE12vx16XFg1mnxF)


パスキーの仕組みを解説している本ですね。　
ギーカーが好きそうな本
テックブックらしい内容でいいですね。　



# ８　3Dマイキャラメイキング VRoidでキャラを作ろう！

[VRoid](https://techbookfest.org/product/iJS02U83sT2SGB8zuBEd0c?productVariantID=vE8i1LLAdDFnfXJTNJmnP4)


VroidSTUDIOの解説本です。　価格は高いけどその分内容がボリューム
たっぷりですし。上級者の人も満足する内容です。

私も、自分のVRMアバターはVroidで作ってますけど
簡単にできますからね。　　おすすめですよ。
X(旧Twitter)不正アクセス事案

# はじめに
ただのインシデントレポートです。
注意喚起の意味も込めて書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/47c0f669-0239-244c-99e5-ef3ac4a870bf.png)
引用: https://www.pwc.com/jp/ja/knowledge/column/awareness-cyber-security/incidents-to-companies04.html


# 結論-なんだったのか？

https://togetter.com/li/2109151

此奴にひっかかりました。
自分とつながりのあるフォロワーさんを円にして画像で出力するといったアプリ。
何か楽しそうだなぁと思ってやったら悪意あるアプリでしたというやつ。

# 時系列
|日時|詳細|
|:---|:---:|
|13:39|不正アプリとX連携|
|13:45|見知らぬフォローが増える ※検知|
|13:51|不正アプリ連携解除、他セッションのログアウト、Xでの認証解除、パスワード変更など|
|14:13|ログ調査、影響範囲特定|
|14:26|ツイート削除|

# 事案詳細
## 検知
おすすめツイートから流れてきた「やりとりークル」というアプリで知り合いを出力するアプリが流れてきました。
楽しそうだったので自分でもやってみて面白かったのですが、これが始まりでした。

何やら見知らぬアカウントをフォローしていました。
これはおかしいと思って調査を開始します。

## 封じ込め
### 連携アプリの解除
認証アプリを許可した直後だったのでとりあえず認証アプリの解除を実施します。

https://news.mynavi.jp/article/20220419-2325397/

### 他セッションのログアウト
「セキュリティとアカウントアクセス」→「アプリとセッション」→「セッション」を選択。
「他のすべてのセッションからログアウト」をクリック。これで現在入ってる自分のClient以外のセッションを切ることが出来ます。
![スクリーンショット 2023-11-11 160320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/8fe713fd-2a21-74f4-74a1-765f12c09baa.png)

### Xでの認証解除
Xで認証許可していたアカウントの連携を解除します。
各連携アプリの手順に従ってください。大体設定から解除できます。

### Password変更
最後にこれをします。タイミングから連携アプリかなと睨んでいたので最後にしたのもありますが、以下のように設定変更が一時凍結される恐れがあるので最後に実行しました。
![スクリーンショット 2023-11-11 153426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b479f4c9-d4f9-cdd6-9fb9-e5ed03489631.png)

https://help.twitter.com/ja/managing-your-account/forgotten-or-lost-password-reset

## 情報収集、分析
### 素晴らしい情報提供
上記封じ込めが完了したほどに以下の上記で紹介した記事の注意喚起が某アカウントからメンションで来ます。
同様の手口が過去行われていたようです。
※なんで僕このアプリ知らなかったんだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/d5495745-f26e-dee2-b739-a50409efdfbe.png)
### ログ調査
不正アクセスの事実を確認します。
「セキュリティとアカウントアクセス」→「アプリとセッション」→「アカウントアクセス履歴」から確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6ca83576-1a66-4d6b-6a33-22c6fdc69130.png)

https://www.abuseipdb.com/check/162.0.228.97

ホスティングサービスのIPのようです。ここから入られたみたいです。

### 連携アプリの権限調査

https://help.twitter.com/ja/managing-your-account/connect-or-revoke-access-to-third-party-apps#abouttpapps

https://piyolog.hatenadiary.jp/entry/20110221/1298306530

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/90e268a2-94b8-7cc1-bc4c-d33f46b9f819.png)

X内部のみでの権限を悪用するのようだ。
特段X上では機微情報をやり取りしないので機密性侵害は気にしなくてよい。完全性への侵害があるといったところか。

### Xでの認証許可アプリの調査
念のためXでの認証を許可している（OAuth許可している）別のアプリでのアクセス履歴を確認する。大体設定にある。
以下はQiitaでのアクセス履歴を確認できる箇所である。
![スクリーンショット 2023-11-11 154038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/28a1d7d7-8d8a-3846-3fd5-3070f3910494.png)

今回は不正アクセス履歴はなかった。

## 根絶
ここで被害拡大防止の観点でTwitterの投稿を削除した。

## 復旧
一番の対処は「 __不正アプリ連携解除__ 」のようだ。追加での対応はなさそう。

復旧としてログアウトしたデバイスから新しいPasswordで入るのが面倒なくらい。

# 原因と対策
・X上での不審なアプリ情報を収集しきれていなかった。
　⇒最新の情報だけでなく過去記事も定期的に読む習慣をつける。
・アプリ認証の許可
　⇒安易にもうしません

# まとめ
インシデント対応しんどい。
気を付けましょう。
はい、気を付けます。
【AWS】CloudFront Functions,Lambda@Edgeについて

# はじめに
<!-- 発端や概要を記載 -->
CloudFrontを使ったリダイレクト処理を実装するにあたり、CloudFront Functions,Lambda@Edgeの２つの選択肢があったので違いをまとめました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/3d4408c5-d142-1798-a2e0-2c36b800ae31.png)


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [CloudFront Functionsとは](#cloudfront-functionsとは)
2. [Lambda@Edgeとは](#lambdaedgeとは)
3. [CloudFront FunctionsとLambda@Edgeの違い](#cloudfront-functionsとlambdaedgeの違い)
4.  [ビューワリクエストとは](#ビューワリクエストとは)
5. [ビューワレスポンスとは](#ビューワレスポンスとは)
6. [オリジンリクエストとは](#オリジンリクエストとは)
7. [オリジンレスポンスとは](#オリジンレスポンスとは)

# CloudFront Functionsとは
実行時間が1ミリ秒未満と非常に短いですが、毎秒数百万のリクエストを処理することができます。
実装はCloudFrontの画面で行い、JavaScriptで記載します。
作成したコードはCloudFrontにデプロイする前にテストが可能で、デプロイもワンクリックで完了します。
作成したFunctionsはCloudFrontのパスパターンを定義する際に紐づけることができます。
注意点として、ビューワーリクエスト、ビューワーレスポンスにのみ紐づけが可能です。

# Lambda@Edgeとは
CloudFront内で実行できるLambdaです。
CloudFrontと組み合わせることでエッジロケ－ションごとにコンテンツを切り替えたり、接続元IPによってレスポンスを指定することが可能です。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/627539fc-0fc8-2341-e7b8-b76b73bf180b.png)



# CloudFront FunctionsとLambda@Edgeの違い
この２つを使い分けを考えた場合は『**実行時間**』が特に大きな違いになるかと思います。
少しでも時間がかかる処理の場合はLambda@Edgeになります。
よく使いそうな項目を表にしましたが、さらに詳しい情報は[こちら](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions.html)をご参照ください


||CloudFront Function |Lambda@Edge|
|---|---|---|
|実行場所|エッジロケーション|エッジキャッシュ|
|リクエスト/レスポンス|ビューワリクエスト <br> ビューワレスポンス|ビューワリクエスト<br>ビューワレスポンス<br>オリジンリクエスト<br>オリジンレスポンス|
|ランタイム|JavaScript<br>(ECMAScript5.1準拠)|Python<br>Node.js|
|最大実行時間|**1ミリ秒未満** |ビューワトリガー:**5秒**<br>オリジントリガー:**30秒**  |
|スケール量|毎秒1000万リクエスト|毎秒1万リクエスト|
|処理可能データ|リクエスト<br>レスポンスヘッダ|リクエスト<br>レスポンスヘッダ<br>本文|


# ビューワリクエストとは
キャッシュ内にリクエストされたオブジェクトがあるか確認する前に関数を実行します。

# ビューワレスポンスとは
リクエストされたファイルがビューワーに返される前に関数を実行します。
キャッシュ内にリクエストされたオブジェクトが既に存在したかどうかに関係なく、関数が実行されます。
以下の場合はビューワーレスポンスの関数が実行されないので注意が必要です。
* オリジンが HTTP ステータスコードとして 400 以上を返した場合。
* カスタムエラーページが返された場合。
* ビューワーリクエストイベントによってトリガーされた関数からレスポンスが生成された場合。
* CloudFront で HTTP リクエストが自動的に HTTPS にリダイレクトされる場合 ([ビューワープロトコルポリシー] の値が [Redirect HTTP to HTTPS] の場合)

# オリジンリクエストとは
**現時点ではLambda＠Edgeのみ使用可能です。**
CloudFrontが受け付けたリクエストをオリジンに転送するタイミングで関数を実行します。
**※リクエストをオリジンに転送する場合にのみ実行されます。そのため、キャッシュ内にデータがある場合はオリジンへの転送が行われないため関数も実行されません。**

# オリジンレスポンスとは
**現時点ではLambda＠Edgeのみ使用可能です。**
オリジンからのレスポンスをキャッシュする前に関数を実行します。

# リダイレクト方法
DNSの設定値と変更イメージを以下に示す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/9760cb35-0824-006f-98b7-2ee6f76fb179.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/2e809295-7bfa-d116-7b48-03658376009e.png)


# さいごに
CloudFrontを使ったリダイレクトや構築については社内ブログの方で取り上げようと思っていますので気になる方は覗いていただけると嬉しいです。
今回はメモっぽい感じになりましたが以上になります。
【Ruby on rails】絞り込み表示機能

# はじめに
プログラミングを勉強して3か月ほどです。
プログラミングスクールを卒業し、現在就職活動をしています。

今回はオリジナルアプリの在庫管理アプリで絞り込み表示機能を実装したので共有したいと思います。
以下のような感じで在庫が不足しているアイテムのみを表示します。

[![Image from Gyazo](https://i.gyazo.com/413289fca9f324ec8b00379c985d6dff.gif)](https://gyazo.com/413289fca9f324ec8b00379c985d6dff)

※初心者なので間違っているところがあれば、ご指摘いただけると幸いです。

# Let's start!!!
## モデルとコントローラーの作成
今回はitemモデルとitemsコントローラーを作成します。
`rails g model item`
`rails g controller items`

## マイグレーションファイルの中身
```2023xxxxxxxxx_create_items.rb
class CreateItems < ActiveRecord::Migration[7.0]
  def change
    create_table :items do |t|
      t.string :name, null: false
      t.string :storage
      t.integer :quantity, null: false
      t.integer :lower, null: false
      t.text :explanation
      t.string :pdf
      t.boolean :taking, default: false, null: false
      t.references :user,  foreign_key: true
      t.references :group, foreign_key: true

      t.timestamps
    end
  end
end
```
色々書かれていますが、今回必要なものは`quantity`、`lower`の２つのカラムです。
`quantity`が数量を保存するカラム、`lower`が下限数量を保存するカラムです。
`lower`が`quantity`を下回った時が在庫が不足している状態になります。
記述ができたらマイグレートしましょう。
`rails db:migrate`

## ルーティングの設定
```routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: "groups#index"
  resources :groups do
    get "join" => "groups#join"
    delete "exit" => "groups#exit"
    post "invitation" => "groups#invitation"
    delete "cancel" => "groups#cancel"
    resources :items do
      collection do
        get 'search'
        get "shortage" #ここを記述
      end
      get "use" => "items#use"
      get "back" => "items#back"
    end
  end
  resources :notifications, only: :index
  resources :welcomes, only: :index
end

```
`shortage`アクションを追加します。
在庫不足アイテムを一覧で表示するだけなのでidまで取得する必要がありません。
なので今回は`collection`を用いてルーティングを設定しています。
※私のアプリの場合はグループの中にネストしているので上記のような記述になります。

## モデルの記述
```item.rb
class Item < ApplicationRecord

  def self.shortage
    Item.where("lower > quantity")
  end

end
```
`Item.where("lower > quantity")`
itemsテーブルの`lower`が`quantity`よりも大きいレコードを抽出しています。

## コントローラーの記述
```items.controller.rb
class ItemsController < ApplicationController

  def index
    @item = Item.new
    @group = Group.find(params[:group_id])
    @items = @group.items.includes(:user)
  end

  # 中略

  def shortage
    @group = Group.find(params[:group_id])
    @items = @group.items.shortage
    render :index
  end

end
```
※今回は必要なアクション部分のみ抜き出しています。

`@items = @group.items.shortage`の記述で在庫が不足しているアイテムを表示させます。
モデルに記述したshortageメソッドを使用することで在庫不足アイテムを抽出することができます。

# 終わりに
みなさん実装お疲れさまでした！
今回は絞り込み表示機能について共有させていただきました。
みなさんのお役に立てていれば幸いです。

最後まで読んでいただきありがとうございました！！！
【Unity】マウスホイールによるスクロールビューのスクロール方向を反転する

# マウスホイールによるスクロール方向に関して
#### スクロール設定が Vertical の場合
・前方回転で上方向にスクロール
・下方回転で下方向にスクロール

#### スクロール設定が Horizontal の場合
・前方回転で<font color="red">**右方向**</font>にスクロール
・下方回転で<font color="red">**左方向**</font>にスクロール

となっており、Horizontal 設定の場合 webページ等でよく使用されているスクロール方向とは逆になっています。

Qiita の場合は「Shift + マウスホイール」
```
横方向へのスクロールテスト 横方向へのスクロールテスト 横方向へのスクロールテスト 横方向へのスクロールテスト 横方向へのスクロールテスト 横方向へのスクロールテスト 横方向へのスクロールテスト 横方向へのスクロールテスト 横方向へのスクロールテスト
```

# スクロール方向を反転させる
スクロール方向を反転させるには、Scroll Rect の Scroll Sensitivity に負の値を設定します。
<img width="400" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531721/fc196ba7-a4c2-28fb-2191-20ca96063d10.png">

本来はスクロールイベントに対する感度設定用のプロパティですが、上記のような使い方もできるようです。

https://docs.unity3d.com/ja/2021.3/Manual/script-ScrollRect.html
OpenFoam v2306のインストール(AlmaLinux 9.2)

ディストリビューション：Alma Linux 9.2
実施日：2023/11/11


■インストール手順(Open Foam v2306)
#yum -y install dnf-plugins-core
#yum -y config-manager --set-enabled crb
#dnf -y copr enable openfoam/openfoam
#yum -y install openfoam

以下のディレクトリにインストールされる。
/usr/lib/openfoam/openfoam2306

テンプレートファイル(チュートリアル)は以下のディレクトリにある。
/usr/lib/openfoam/openfoam2306/etc/templates


■インストール手順(Paraview)
#yum install paraview

以下のディレクトリにインストールされる。
/usr/lib64/paraview


■Open Foamの起動
$openfoam

■Paraviewの起動
$paraview

■テンプレートファイルの計算実行→可視化手順
#sudo cp -r /usr/lib/openfoam/openfoam2306/etc/templates/axisymmetricJet /home/yuichiro_shimura/work
#cd /home/yuichiro_shimura/work/axisymmetricJet
#openfoam
#./Allrun
(メッシュ生成と計算が実行される。特にメッセージなどは表示されないので、終了するまで待つ。)

#foamToVTK
(コマンドの実態は、"/usr/lib/openfoam/openfoam2306/platforms/linux64GccDPInt32Opt/bin"にある。)

#paraview
(ParaviewのGUI上でVTKディレクトリ内にあるvtmのヘッダーファイル"axisymmetricJet.vtm.series"を読み込む→可視化完了)
【個人的まとめ】AWS Macie

# AWS Macie とは？機密データの保護を向上させるセキュリティサービス
AWS Macieは、Amazon Web Services（AWS）が提供するセキュリティサービスの1つで、機密データの検出と保護を向上させるために設計されている。この記事では、自分なりにまとめたMacieの基本的な機能や利点について紹介する。

https://docs.aws.amazon.com/ja_jp/macie/latest/user/what-is-macie.html

## Macieの概要
AWS Macieは、主にS3バケット内のデータに焦点を当てて、機密データの識別、分析、保護を行う。以下は、Macieの主な機能と特徴である。

### 1. データの分析と検出
Macieは、機密データ（例：個人情報、クレジットカード番号など）を自動的に検出するための高度な分析機能を提供する。これにより、データの保存や共有時に機密情報の漏洩を防ぐ。

### 2. 調査結果の作成
Macieが検出した結果は、調査結果としてまとめられ、AWS Management Consoleで簡単に閲覧できる。これにより、セキュリティチームや管理者は迅速に対応できる。

### 3. イベントの生成とEventBridgeとの統合
Macieは検出に基づいてイベントを生成し、これをEventBridgeのデフォルトイベントバスに送信することができる。これにより、検出に対するアクションを自動化しやすくなる。

## Macieの利用シナリオ
AWS Macieは、特に以下のような利用シナリオで効果的に活用できる。

### 1. データのコンプライアンスの向上
機密データの検出や保護を通じて、業界や法的なコンプライアンス要件を満たすための手段として利用できる。

### 2. セキュリティインシデントへの早期対応
Macieの調査結果を通じて、機密データの不正使用や漏洩の早期検出により、セキュリティインシデントへの対応時間を短縮できる。

## まとめ
AWS Macieは、データセキュリティを向上させるための優れたツールであり、特にクラウド上でデータを管理する組織にとって有益である。機密データの検出や保護を強化し、セキュリティポリシーの実施をサポートする。

※個人的な学習用にまとめた記事のため、AWS Macieに関する詳細な情報は、AWS公式ドキュメントを参照してください。
アイデンティティ・アクセス管理サービス ZITADEL メモ

* アイデンティティ管理サービスの`ZITADEL`についてメモする。

## 概要

* Auth0やKeycloakのように、アイデンティティ管理、アクセス管理の機能を提供するサービス

* 主な提供機能は下記となる。

  * OpenID Connect/OAuth連携
  * シングルサインオン
  * FIDO2
  * ユーザー名・パスワード認証でのログイン
  * 他要素認証 (OTP, U2F)
  * マルチテナントのユーザー管理
  * パスワードレス認証
  * ロールベースアクセス制御

    ...

* OSSやクラウドサービスとして利用可能

* KeyCloakやAuth0との違いについては、下記ブログで説明されている

  * https://zitadel.com/blog/zitadel-vs-keycloak
  * https://zitadel.com/blog/zitadel-vs-auth0



## 検証用にDockerで環境構築する場合

* 事前準備として、Docker,docker-composeインストール済みであること

* [公式サイト](https://zitadel.com/docs/self-hosting/deploy/compose)より`docker-compose.yml`を取得する

  ```yaml
  version: '3.8'
  
  services:
    zitadel:
      restart: 'always'
      networks:
        - 'zitadel'
      image: 'ghcr.io/zitadel/zitadel:latest'
      command: 'start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled'
      environment:
        - 'ZITADEL_DATABASE_COCKROACH_HOST=crdb'
        - 'ZITADEL_EXTERNALSECURE=false'
      depends_on:
        crdb:
          condition: 'service_healthy'
      ports:
        - '8080:8080'
  
    crdb:
      restart: 'always'
      networks:
        - 'zitadel'
      image: 'cockroachdb/cockroach:v22.2.2'
      command: 'start-single-node --insecure'
      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"]
        interval: '10s'
        timeout: '30s'
        retries: 5
        start_period: '20s'
      ports:
        - '9090:8080'
        - '26257:26257'
  
  networks:
    zitadel:
  ```

* ZITADELコンテナを起動する

  ```shell
  docker-compose up -d
  ```

  ※`http://localhost:8080`でコンテナが起動する

* <http://localhost:8080>にアクセスし、下記認証情報を入力してログインする※パスワード変更が求められる。

  - **username**: *zitadel-admin@zitadel.localhost*
  - **password**: *Password1!*

* 下記ダッシュボード画面が表示される。

  ![zitadel_dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/16c9e9f3-ec08-8193-8986-9b63d1b85374.png)


## 参考情報

* [Identity infrastructure, simplified for you](https://zitadel.com/)(ZITADEL公式)
AtCoder ABC322-B

AtCodeのビギナー用A問題をひたすら解いてます。 
たまーにB問題を解いて苦しんでます。。。💦 
# AtCoder Beginner Contest 322
https://atcoder.jp/contests/abc322/tasks/abc322_b

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556392/7e5ea343-ccd3-e4bf-7468-71ffa2a2a533.png)

なんか小難しく書いてあるけど、文字列Tの最初数文字が文字列Sと一致するか否か？
文字列Tの最後数文字が文字列Sと一致するか否か？の組み合わせですね。
```python
n,m=map(int,input().split())
s=input()
t=input()

if t[:n]==s:    #接頭辞
    print(0) if t[-n:]==s else print(1)
else:           #接頭辞じゃない
    print(2) if t[-n:]==s else print(3)
```
覚えたif文を1行でまとめるを無理やり使ったけど、かえってわかりづらくなったような？
積層２重量子井戸のポテンシャル

$$\left ( \begin{array}{cccccccccccccc}
\Delta E_c & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0  \\\ 
0 & \ddots& 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0  \\\ 
0 & 0 & \Delta E_c & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0  \\\ 
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0  \\\ 
0 & 0 & 0 & 0 & \ddots & 0 & 0 & 0 & 0 & 0 & 0 & 0  \\\ 
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0  \\\ 
0 & 0 & 0 & 0 & 0 & 0 & \Delta E_c & 0 & 0 & 0 & 0 & 0  \\\ 
0 & 0 & 0 & 0 & 0 & 0 & 0 & \ddots & 0 & 0 & 0 & 0  \\\ 
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \Delta E_c & 0 & 0 & 0 \\\ 
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0  \\\ 
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \ddots & 0  
\end{array} \right )
$$

$$\frac{d}{dz}\left(\frac{1}{m(z)}\right)\frac{d}{dz} \Psi(z) = \frac{d}{dz}\left(\frac{1}{m_m}\right)
\frac{\Psi_{m+0.5} - \Psi_{m-0.5}}{\Delta z}$$

$$= \left(\frac{1}{m_{m+0.5}}\right)
\frac{\Psi_{m+1} - \Psi_{m}}{\left( \Delta z \right )^2}- \left(\frac{1}{m_{m-0.5}}\right)
\frac{\Psi_{m} - \Psi_{m-1}}{\left (\Delta z \right)^2}$$

$$=\frac{\hbar^2}{\left (\Delta z \right)^2} \left\\{ 
-\frac{\Psi_{m+1}}{m_{m+1}} + \left(\frac{1}{m_{m+1}}+\frac{1}{m_{m-1}}\right) \Psi_m -\frac{\Psi_{m-1}}{m_{m-1}} 
\right \\} $$

$X=\frac{\hbar^2}{em_e\left (\Delta z \right)^2}$として、

$$H=X\times \left ( 
\begin{array}{ccccc}
\frac{\Delta E_c}{2X}+\frac{1}{m_W}+\frac{1}{m_B} & -\frac{1}{m_B} &0&0&0&0&0&0&0&0&\cdots&-\frac{1}{m_W}\\\ 
-\frac{1}{m_B} &  \frac{\Delta E_c}{X}+\frac{2}{m_B} & -\frac{1}{m_B}   & 0 &0 &0&0&0&0&0&\cdots&0\\\ 
0 & \ddots & \ddots & \ddots & 0&0 &0&0&0&0&\cdots&0\\\ 
0& 0& -\frac{1}{m_B} &  \frac{\Delta E_c}{X}+\frac{2}{m_B} & -\frac{1}{m_B} &0 &0&0&0&0&\cdots&0\\\  
0&0&0&-\frac{1}{m_B}&\frac{\Delta E_c}{2X}+\frac{1}{m_W}+\frac{1}{m_B} & -\frac{1}{m_W}&0&0&0&0&\cdots&0\\\  
0&0&0&0&-\frac{1}{m_W} &  \frac{2}{m_W} & -\frac{1}{m_W}   & 0  &0 &0&\cdots&0\\\ 
0&0&0&0&0& \ddots & \ddots & \ddots & 0&0&\cdots&0 \\\ 
0&0&0&0&0&0& -\frac{1}{m_W} &  \frac{2}{m_W} & -\frac{1}{m_W} &0 &\cdots &0 \\\  
0&0&0&0&0&0&0& -\frac{1}{m_W} &  \frac{\Delta E_c}{2X}+\frac{1}{m_W}+\frac{1}{m_B} & -\frac{1}{m_B}&\cdots&0\\\ 
0&0&0&0&0&0&0& \ddots & \ddots & \ddots & \cdots&0 \\\ 
-\frac{1}{m_W} &0&0&0&0&0&0&0&0 & \cdots &-\frac{1}{m_W} & \frac{2}{m_W} 
\end{array} \right )
$$

$$\frac{d}{dz}\left ( \epsilon (z) \frac{d\phi(z)}{dz}\right ) = \frac{\rho (z)}{\epsilon_0}$$
$$\epsilon (z) \frac{d\phi(z)}{dz} = \frac{1}{\epsilon_0}\int_0^z \rho(z)\\; dz $$
$$\frac{d\phi(z)}{dz} = \frac{1}{\epsilon_0}\int_0^z\left [ \frac{1}{\epsilon(z_1) } \int_0^{z_1} \rho(z_0) \\; d z_0 \right ] $$
JavaScript 日付について yyyy-mm-ddの出力

# Dateオブジェクトのyyyy-mm-dd出力
すぐ忘れるので、メモ。
多分書いたことも忘れる。

``` .js
console.log(new Date().toLocaleDateString('sv-SE'));
```
スウェーデンの出力文字形式だそうです。
そういえば、スウェーデンが福祉の国というのは覚えてる。
VBScriptで配列への要素追加（Push）

まだまだ現役？
Windows上でサクッと処理したいときの配列操作に
```VBScript:Push.vbs
arr1 = Array("aa", "bb")

Push arr1, "cc"

For Each elm In arr1
	MsgBox elm
Next

WScript.Quit

'--

Sub Push(p1, p2)
	ReDim Preserve p1(UBound(p1) + 1)
	p1(UBound(p1)) = p2
End Sub
```
マイグレーションファイルの仕組みと管理方法について

## なぜマイグレーションファイルが必要か？
マイグレーションファイルに、テーブルの定義内容が記述されている
```department.rb
class CreateDepartments < ActiveRecord::Migration[6.1]
  def change
    (テーブルの定義内容を記述する)
  end
end
```


## マイグレーションファイルはどこで管理しているか？
/[アプリ名]/db/migrate
```
[タイムスタンプ]_[テーブル定義内容]_[テーブル名].rb
```
①タイムスタンプから、どのバージョンかが分かる
②テーブル定義内容・テーブル名から、どんなマイグレーションファイルか推測しやすい
マイグレーションファイル名：add_image_name_to_usersの場合、
usersモデルに[image_name]のカラムを追加したマイグレーションファイル
だと推測できる


## テーブルの定義内容について
テーブルとカラムは追加・編集・削除が出来るけど、カラムは定義できる範囲が広い。例えば、

・データ型を指定する(文字列・整数型など種類はさまざま)
・桁(文字数)を指定する(小数点の場合は、小数点以下◯桁まで許可する)
・制約をつける(初期値の設定や重複の禁止など)

という様に、管理したいデータに応じてテーブルを定義する。


## マイグレーションファイルで間違えやすいポイント
**①ファイルにテーブルの定義内容を記述しただけで、定義内容が反映される訳ではない！！**
[Userモデルのマイグレーションファイル]
```user.rb
class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end
```
→Userモデルを定義してもUserテーブルを作成していないので、Railsコマンドでマイグレーションファイルを適用し、テーブルを作成する必要がある
[マイグレーションファイルを適用するRailsコマンド]
```
rails db:migrate
```

**②適用済みのマイグレーションファイルは削除しない！！**
マイグレーションファイルを基にテーブル管理しているので、SQLで直接テーブル定義を変更しない様に気をつけないといけませんね。
テーブル定義を変更したい場合は、以下のいずれかの対応を取りましょう。

**方法1.ロールバックして定義前の状態に戻す(テーブル作成のマイグレーションファイルも無効にすると、テーブルを削除してしまうので注意が必要)**
[適用済みのマイグレーションファイル一覧]
```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20230604234810  Devise create users
   up     20230604234841  Devise create advisers
   up     20230615223549  Create adviser users
   up     20230616150519  Create chat rooms
   up     20230619235331  Create messages
   up     20230627133529  Create categories
   up     20230627141038  Create contents
   up     20230627145915  Create content categories
   up     20230710121107  Create life logs
```
[ロールバックするRailsコマンド]
```
rails db:rollback (STEPを使って、複数のマイグレーションファイルをロールバックできる)
```
life_logsテーブルを作成するマイグレーションファイルをロールバックすると、テーブルと併せてレコードも削除される

**方法2.定義内容を追加したマイグレーションファイルを用意する**
[ユーザーのアバター画像追加のため、カラムを用意したマイグレーションファイル]
```
class AddImageNameToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :avatar, :string
  end
end
```
[マイグレーションファイルを適用するRailsコマンド]
```
rails db:migrate
```
マイグレーションファイルの数が増えるけど、レコードを残したまま定義変更できる


## 調べてみて分かったこと
マイグレーションファイルを使って、桁数や制約などの定義変更ができるんですね。テーブルの仕様を変えたくなったら、マイグレーションファイルを設定しようと思います。
css Webfont 適用方法

HTMLメールとかの字体をWebフォントにするといった話をよく聞くのでここにまとめようと思います。ほかのサイトなどでたくさんWebフォントに関しての内容などが記載されているものもあると思うのですがここでも話題にしていこうと思います。

Webフォントの適用方法に関しては主に、2つの方法があります。

- Webフォントのファイルをダウンロードしてきて、反映させる
- サーバーにWebフォントをアップロードして反映させる方法

この2つの方法です！！

### Webフォントのファイルをダウンロードして反映させる方法

この方法は、ネット上などで購入でもいいですし、無料ものでもいいですし(無料のものの場合、商用かどうかは気を付けないといけません。)、何かしらダウンロードしてきて、自身のローカル環境でファイルパスを指定します。

その後、cssファイルで以下のように指定します。

````main.css

    @font-face{
        font-family:"フォント名";
        src: url("ファイルパス名を入力") format("フォーマット名を入力");
    }

````

フォント名には独自の設定したフォント名を記入します。ファイルパス名は、ダウンロードしたファイルのファイル名を記入します。フォーマット名に関しては対応するフォーマットの名前を記入します。

以上でローカル環境にダウンロードしたWebフォントをcss経由で反映させることができます。

### サーバーにアップロードして反映する方法

この方法では、Webフォントのファイルをサーバーにアップロードしてリンクを作成します。

その後、先ほどと同様にして、

````main.css

    @font-face{
        font-family:"フォント名";
        src: url("アップロードしたサーバーのリンク名") format("フォーマット名を入力");
    }

````

urlの箇所にアップロードしたサーバーの名前を記入します。

以上の方法でWebフォントをサーバーにアップロードして使用することができます。

### format指定方法

formatは次の通りに指定するようにしましょう！

 |formatタイプ |fontタイプ |
 |---|---|
 |format : woff|Web Open Font Formatフォントを使用するとき|
 |format : truetype|TrueTypeフォントを使用するとき|
 |format : opentype|OpenTypeフォントを使用するとき|
 |format : embedded-opentype|Embedded-OpenTypeフォントを使用するとき|
 |format : svg| SVGフォントを利用するとき|

### 注意

Webフォントは無料のフォントと、有料のフォントが存在します。有料のフォントは問題ないのですが、無料のフォントを商用に使用する際は商用で使用してよいか注意が必要です！

また、最近では、Google フォントが万能で使用している人が多い印象です！！
AtCoder ABC322-A

AtCodeのビギナー用A問題をひたすら解いてます。 
簡単なのでモチベーションあがります。 
正解だったよっていうのを載せます！ 
たまーにB問題を解いて苦しんでます。。。💦 

# AtCoder Beginner Contest 322
https://atcoder.jp/contests/abc322/tasks/abc322_a

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556392/c5f8c581-3daf-507b-42ce-99df52191a0c.png)

```python
n=int(input())
s=input()

ans=s.find('ABC')+1 #文字列を検索し、ABCの位置を取得。indexを取得するので+1しておく。
if ans==0:      #ABCが見つからなかったら
    print(-1)
else:           #ABCが見つかったら
    print(ans)
```

if文、ずっとこうやって書いてきたけど、1行で書く方法があったらしい！
7行あったコードが4行になった。。。
```python
n=int(input())
s=input()

ans=s.find('ABC')+1 #文字列を検索し、ABCの位置を取得。indexを取得するので+1しておく。
print(-1) if ans==0 else print(ans) #←1行にした
```
要約するとこんな感じ
Trueの処理 if 条件式 else Falseの処理

今日も１つ賢くなりました:v:
【C++】クラスの練習

## 【C++】クラスの練習

クラス使う練習で、特徴を入力すると答えが出てくるプログラムを作っている最中です。。。
オブジェクト指向まだ勉強中で理解できていない段階ですが一旦作りかけ載せました。（※全然できていないので何も参考にはなりません。）

```C++
#include <iostream>
#include <string>

using namespace std;

class Fruit {
   public:
    void answer();
};

class Apple : public Fruit {
   public:
    void apple();
};

class Mango : public Fruit {
   public:
    void mango();
};

class Peach : public Fruit {
   public:
    void peach();
};

void Apple::apple() { cout << "りんご" << endl; }

void Mango::mango() { cout << "マンゴー" << endl; }

void Peach::peach() { cout << "もも" << endl; }

int main() {
    string future;
    do {
        cout << "フルーツの特徴を入力して下さい :";
        cin >> future;

        Apple a;
        Mango b;
        Peach c;

        if (future == "red") {
            a.apple();
        } else if (future == "orange") {
            b.mango();
        } else if (future == "pink") {
            c.peach();
        } else {
            cout << "再度入力して下さい" << endl;
        }
    } while (future != "red" && future != "orange" && future != "pink");
}
```


難しい…。
Macにnodejsをインストールする方法

# Macにnodejsをインストールする方法 #

Node.jsとnpmをインストールするには、公式のインストーラーを使用するか、Node.jsをパッケージマネージャーを介してインストールすることができます。以下に、Macでの2つの方法を示します。

## 1. 公式のインストーラーを使用する方法

1. **Node.jsとnpmをダウンロード:**

   Node.jsの公式ウェブサイト（https://nodejs.org/ ）にアクセスし、最新のLTS（Long Term Support）バージョンをダウンロードします。

2. **インストール:**

   ダウンロードしたインストーラを実行し、指示に従ってNode.jsとnpmをインストールします。

3. **確認:**

   インストールが完了したら、ターミナルで以下のコマンドを実行して、Node.jsとnpmのバージョンを確認します。

   ```bash
   node -v
   npm -v
   ```

## 2. Homebrewを使用する方法

1. **Homebrewのインストール:**

   ターミナルで以下のコマンドを使用してHomebrewをインストールします。

   ```bash
   /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
   ```

2. **Node.jsとnpmのインストール:**

   Homebrewを使用してNode.jsとnpmをインストールします。

   ```bash
   brew install node
   ```

3. **確認:**

   インストールが完了したら、ターミナルで以下のコマンドを実行して、Node.jsとnpmのバージョンを確認します。

   ```bash
   node -v
   npm -v
   ```

どちらの方法を選んでも、インストールが成功していれば、Node.jsとnpmが使えるようになります。
与えられた確率分布に従う乱数の生成法

## 逆関数法

### 累積分布関数の性質
連続確率変数$X$の累積分布関数を$F(x)=P(X \leq x)$とすると
$$P(F(X) \leq x)=P(X \leq F^{-1}(x))=F(F^{-1}(X))=x$$よって$F(X)$は$U(0,1)$に従う。逆関数法はこの応用である。

### 逆関数法
連続確率変数$X$の累積分布関数$F(x)$の逆関数$F^{-1}(x)$が求まる場合は、区間$[0,1]$上の一様乱数を$U$として、$Y=F^{-1}(U)$とすればよい。このとき$Y$は$X$の確率分布に従う乱数となる。
なぜなら、$Y$の累積分布関数を$G$としたときに
$$G(y)=P(Y \leq y)=P(F^{-1}(U) \leq y) = P(U \leq F(y))=F(y)$$
が成り立つからである。

### 逆関数法の例
$X \sim \rm{Exp}(\lambda)$ の場合、$F(x)=1-e^{-\lambda x}=u$を解くと$x=\frac{-1}{\lambda} \log (1-u)$となるので、$Y=\frac{-1}{\lambda} \log (1-U)$とすればよい。

### 逆関数法のコードの例
```python:
import numpy as np
import matplotlib.pyplot as plt

# 逆関数法で指数分布からサンプリングする関数
def inverse_transform_sampling(lambda_param, size):
    u = np.random.rand(size)  # 0から1の一様分布からのサンプリング
    x = -np.log(1 - u) / lambda_param  # 逆関数法で指数分布に変換
    return x

# パラメータの設定
lambda_param = 0.5  # 指数分布のパラメータ
sample_size = 1000

# 指数分布からサンプリング
samples = inverse_transform_sampling(lambda_param, sample_size)

# ヒストグラムの表示
plt.hist(samples, bins=50, density=True, alpha=0.7, color='blue', edgecolor='black')

# 理論的な確率密度関数の描画
x = np.linspace(0, max(samples), 1000)
pdf = lambda_param * np.exp(-lambda_param * x)
plt.plot(x, pdf, 'r-', lw=2)

plt.title('Inverse Transform Sampling: Exponential Distribution')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/9ab06382-209c-7f5b-dbbe-0dd57512d971.png)

## 棄却法

逆関数が複雑な時は棄却法を利用する。


$F$の確率密度関数を$f$として、その最大値を$f_{\rm{max}}$とする。このとき、確率$f(U)/f_{\rm{max}}$で$U$を保持し、$1-f(U)/f_{\rm{max}}$で棄却する。

すなわち$V$を区間$[0,1]$上の一様分布に従う確率変数としたときに$V \leq f(U)/f_{\rm{max}}$が成り立つならば$U$を保持するということである。

これを必要なサンプル数が得られるまで繰り返す。


### 棄却法のコードの例

```python:
import numpy as np
import matplotlib.pyplot as plt

# 目標確率分布（標準正規分布）の確率密度関数
def target_distribution(x):
    return np.exp(-0.5 * x**2) / np.sqrt(2 * np.pi)

# 提案確率分布（一様分布）の確率密度関数
def proposal_distribution(x):
    return 1.0 / np.sqrt(2 * np.pi)

# 棄却法によるサンプリング
def rejection_sampling(sample_size):
    samples = []
    for _ in range(sample_size):
        # 提案確率分布からサンプリング
        x_proposal = np.random.uniform(-3, 3)
        # 一様分布からサンプリング
        u = np.random.uniform(0, proposal_distribution(x_proposal))
        # 棄却条件を確認
        if u < target_distribution(x_proposal) / proposal_distribution(x_proposal):
            samples.append(x_proposal)
    return np.array(samples)

# パラメータの設定
sample_size = 1000

# 棄却法によるサンプリング
samples = rejection_sampling(sample_size)

# ヒストグラムの表示
plt.hist(samples, bins=50, density=True, alpha=0.7, color='blue', edgecolor='black')

# 目標確率分布の確率密度関数の描画
x = np.linspace(-3, 3, 1000)
plt.plot(x, target_distribution(x), 'r-', lw=2)

plt.title('Rejection Sampling: Normal Distribution')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.show()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/3abef0bc-ed6b-b48f-d8d4-6a6fb5323e07.png)
AtCoder ABC-323-B

AtCoder ABC-323_B
python 初心者 AtCoderBeginnerContest 

最近仕事がクッソ忙しく、全然勉強できなかった💦
そんなわけで久々に投稿します！
A問題がサクサク解けてきたので、B問題にも口をつけてます。
B問題はさすがに時間がかかる😢

# AtCoder Beginner Contest 323
https://atcoder.jp/contests/abc323/tasks/abc323_b

プレイヤー１、２、３といたとき、「o」をとった数をリストに突っ込んで降順に並べ替えればOKなのかな？と考えたのですが。
それだと、プレイヤーとoの数が紐づかないじゃん！？と気づき、辞書に突っ込む方法を考えました。

```
n=int(input())
dic={}
for i in range(n):
    s=input()
    dic[i]=s.count('o')    #oをカウントし、辞書に突っ込む
sort_dic=sorted(dic.items(),key=lambda x:x[1],reverse=True)    #値の降順に並べ替え
ans=[x[0]+1 for x in sort_dic]#キーに1足してリスト化

print(*ans) #リストを文字列に変換
```

今日初めて知ったのですが、リストを文字列に変換するときに
```
ans=['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
print(' '.join(ans)) 
```
とかやってたんですが、print(*ans)で行けちゃうって知ってました！？ねぇねぇ、知ってた！？？？？:joy:
Reactとは？なぜ使われているのか？

## はじめに
Reactの仕組みとなぜ使用するのか？理解するための備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇


## 内容
ReactはJavaScriptのライブラリの一種。

## なぜ仮想DOMを使うのか？

* 再利用するしやすい。
* パフォーマンスを向上。


### DOMとは
DOMとは
APIの一種。
HTMLを解析してツリー構造に変換して、一つ一つ（画像、リンクなど）にアクセスできるようにしたもの。

「特定の部分を変更や動き」を加えようとした場合、特定の部分とその子要素に影響があるため、ページの一部を再読み込み（レンダリング）しなければいけない。
→処理が重い。

### 仮想DOM（Reactなど）とは
「特定の部分の変更や動き」を加えようとした部分の処理をJavaScriptエンジンを使って処理することでブラウザのDOMの処理数を軽減することでレンダリング（ユーザーが見れるようにするためのプロセス）パフォーマンスが向上する。

### プログラミングイーターフェイス（API）とは？
「DOM」「CSSOM」「JavaScript API」など多岐にわたって存在する。
※ここでのAPIはWEB APIとは別物

### レンダリングとは
HTMLを解析→DOMツリーを構築→CSSでスタイルを決定→JavaScriptで動的なものを実装
このプロセスをレンダリングという。
Davinci Resolveを使って自動で音声のノイズを除去・軽減する手順

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はDavinci Resolveを使って動画の音声からノイズを自動で除去・軽減する手順を備忘録的に書いていきたいと思います。

# 手順
Davinci Resolveでプロジェクトを開いたら画面右下にあるFairlightを押下します。
![dr01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c226f59b-bf40-f467-a2b3-cf4ad448081a.png)
すると以下のような画面レイアウトになります。
画面左上にあるエフェクトを押下します。
![dr02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e6f76965-0026-ff53-1222-472b960ebf7c.png)
一覧からNoise Reductionを選択し、ノイズを除去・軽減したい音声までドラッグ＆ドロップします。
![dr03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/24df0ff0-e8f8-7b4b-f183-5f4d41ec0829.png)
黄色枠内のようなウィンドウが自動で開きます。7つくらいつまみがありますね。
![dr04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7c2ef3e5-6edf-8020-4958-b7d02835a48f.png)
黄色枠部分の自動を選択し、またノイズにチェックを入れます。
それぞれの設定の意味は以下となります。
- 自動を選択：この設定を入れることでDavinci Resolveが自動でノイズ部分を判断し、除去してくれるようになります。
- ノイズにチェック：ノイズ音声のみのを再生することが出来ます。これでノイズ部分にノイズとして除去すべきではない音声が入っていないかを確認することが出来ます。

![dr05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a8a05026-9838-8dc5-7656-de8cc293123c.png)
![dr06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f7d61c43-d281-0165-07bd-8e43d6d9b96a.png)
Noise Reductionの設定を一時停止・削除したい場合は画面左下あたりにあるエディットタブを押下して画面を遷移。右上にあるエディットから可能でした。
![dr07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/691cb62c-eb55-a570-e5c4-8bbe3c9b726c.png)

# 余談
ちなみに
Noise Reductionで7つくらいつまみがあった画面で、出力部分に記載されている【ドライ/ウェット】でノイズ除去の強弱（強ければ強いほどたくさん除去しようとするが人間の音声まで除去してしまう可能性が高くなる。）を決めることが出来、【レベル】で音量の調整が出来るみたいでした。
![dr04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7c2ef3e5-6edf-8020-4958-b7d02835a48f.png)

また自動でのノイズ除去にはまだ限界があるようで、本当にきれいさっぱり除去したいとなると、手動で対応していくしかなさそうです。
この辺りは今後勉強だなと思いました。
失敗した時の取り消し方法(git)

# はじめに
ここ最近、仕事でケアレスミスが多い・・
そこで、やってしまったあとのバージョン管理の取り消し方法をまとめてみた。

# 事前準備
```
 git log 
```

下記のようにログが表示されるので、取り消したいコミット記録の**ひとつ前**のコミットIDを使う。

(例)
```
commit ( hash_param ) ←これを無かったことにしたいときは
Author: 
Date:   

    test commit

commit ( hash_param2 ) ←このIDを使う
Author: 
Date:   

    test commit
```

# コミット後にミスに気づいた
### git add まで戻したい時
```
 git reset --mixed ( hash_param2 )
```

### ローカルの変更は残したい時
```
 git reset --soft ( hash_param2 )
```

### ローカルの変更も廃棄したい時
```
 git reset --hard ( hash_param2 )
```

# プッシュ後にミスに気づいた
※resetコマンドのオプションは任意で
```
 git reset ( hash_param2 )
```
上記コマンドの時点では、ローカルブランチの変更がもどっただけ。
その状態で、強制的にプッシュすることでリモートブランチもコミット履歴含め戻すことができる。
(ただし、コマンドを打ち込んだ日付になるので注意)
```
 git push -f origin main
```

# (おまけ)コミット履歴を残したい時はrevertを使う
resetと違い、取り消したいコミットログそのものを対象にする。
(例)
```
commit ( hash_param ) ←これを無かったことにしたいなら、このIDを使う
Author: 
Date:   

    test commit
```

```
 git revert ( hash_param )
```

これで、コミットを打ち消したというログが残る。
リモートに適用したい場合はpushする。

```
 git push origin main
```

# 参考
https://zenn.dev/nekoniki/articles/f238efa56eb869
https://wataru55120.hatenablog.jp/entry/2023/09/26/113827
https://nanayaku.com/git-delete-reset/
【ChatGPT GPTs】を触ってみました。


　どうも、カーブミラーです。

　今回は、ChatGPTのGPTsを触って、My GPTsを作ってみました。参考になるかはわかりませんが。いつものことか。

:::note info
本記事は、 GPT4での操作を
行なっています。あしからず。
:::

　まず、最初に、
　　アプリ版では、
　　　My GPTsを
　　　　作成することは
　　　　　できません。

　作成するための
　　項目がありませんので。

　それでも
　　人が作成して、
　　　リンクを公開してある
　　　　My GPTsは、使えます。

　また、
　　当然のことなのですが、
　　　ChatGPT無料版では、
　　　　作るどころか、
　　　　　リンクからも
　　　　　　アクセスできません。

　無料版は、
　　見た目も、中身も、
　　　変わっていません。
***
　そういえば、
　　気が付きましたか？

　アプリ（有料版）のUIが
　　変わったことに。

　細かいことは
　　省きますが、
　　　使いやすくなった
　　　　と思います。
***
　さて、
　　My GPTsを作ってみましょうか。

　まずは、履歴を出してください。
　　すると、以前にはなかった
　　　ものが上部に出てきています。

　一番上に、ChatGPT。
　次に、Explore。

　このExploreが、
　　今回の目的物です。

　タップして
　　GPT Builderを
　　　呼び出します。

　三つの項目があります。
　・My GPTs
　・Recently Used（すでに見たもの）
　・Made by OpenAI（OpenAI提供）

　＋マークで、
　　My GPTsの作成、
　　　つまり、GPT Builderに
　　　　行きます。

　GPT Builderの画面構成は上から
　左側に、前の画面に戻る < マーク。
　右側に、Saveボタン（まだ無効）。
　その下に、三つのタブ。
　　・Create（ここでやり取り）
　　・Configure（詳細設定）
　　・Preview（動作確認）

  パソコンだと、
　　Previewは、右側に出てます。

　My GPTsの作り方は、
　　Createでのやり取りから
　　　はじまります。
　　　　日本語で大丈夫です。

　GPT Builder側からは、
　　英語でしか返ってきません。
　　　カスタム指示に
　　　　「日本語で」と
　　　　　入れてみましたが
　　　　　　ダメでした。

　とにかく、
　　下部の入力枠に
　　　作りたいイメージを
　　　　入力していきます。

　英語は、
　　DeepLあたりで、
　　　翻訳してください。
　　　　面倒ですが。

　これで終わりかな、と
　　Builderが判断すると、
　　　勝手にアイコンを作成します。

　文句を言って、
　　直しましょうw

　終わったら、
　　Previewで動作確認します。

　Configureタブは
　　詳細の確認を
　　　する程度で
　　　　最初は構いません。

　動作確認が
　　終了したら、
　　　Saveします。

　このSaveをタップすると、
　　ポップアップ画面が
　　　現れます。

　・Only me
　・Only people with a link
　・Public
　　という選択肢があり、
　　　選んで、confirmボタンを
　　　　タップ。

　すると、
　　Published!という
　　　ポップアップ画面に。

　URLとView GPTボタンがあります。

　URLをコピーして、
　　ボタンをタップ。

　すると、
　　今、作成したMy GPTsに
　　　遷移します。
***
　自分で使用するのであれば、
　　そのままお使いください。

　ほかの方と
　　共用したい場合は、
　　　URLを渡してください。
***
　ただし、
　　注意点があります。

　このリンクからは、
　　アプリへと飛ぶように
　　　なっています。

　ですから、
　　そのことを相手に伝え、
　　　必ずログインしておくことを
　　　　伝えてください。

　また、
　　アプリへと飛ぶと、
　　　アプリ画面は、
　　　　ふつうのチャット状態
　　　　　なので、戸惑いますが、
　　　　　　すでに、セッションが
　　　　　　　開始されているので
　　　　　　　　そのまま使えます。

　ChatGPTモードから
　　この作成されたMy GPTsを
　　　使うには、履歴を開き、
　　　　選択するだけです。

　My GPTsを使用すると、
　　やり取りは、
　　　ふつうのChatGPTと同じく、
　　　　履歴に記録されます。
　　　　　そちらからの
　　　　　　再開も可能です。
***
　いかがでしょうか？

　簡単な説明ですが、
　　これでMy GPTsを作成する
　　　足掛かりになるのでは
　　　　ないでしょうか。

　頑張って
　　作成して、
　　　SNSに公表してください。

　今回は、ここまで。
***
　今回、作成したMy GPTsの
　　リンクを上げておきます。
　　　参考までに、どうぞ。

　OpenAIのサイトから情報を収集して、ユーザーの質問に答えます。

https://chat.openai.com/g/g-NqLchSJhl-kabumira-ai-qa-asisuto
確率統計学・統計検定学習備忘録　②統計検定1級2022数理統計　大問2別解・別解説

普段より、自分のプログラミング等に関する質問に答えて下さっている皆様ありがとうございます。m( _ _)m　よろしければ統計検定の学習等にご利用ください。マークダウンは雑ですみません。これから勉強します。 m( _ _)m

<h1> 2022数理統計1級　大問2 問題（と問題で考える領域の図）

https://drive.google.com/drive/folders/1PcxptffswGzET0oC_7T2atRS68VYzQ2w
<h1>(1)別解・別解説　偏微分の計算・周辺累積分布関数の導出

https://drive.google.com/drive/folders/12cxsFQbcx3EUyWNido2ar5-RICNXi7l7
<h1>(2)別解説等　確率変数が独立していることの確認の計算

https://drive.google.com/drive/folders/1t1gc7oOkoV2biUEs3rnQ_QbF8ACJ1__u

<h1>(3)別解・別解説　確率分布が連続型関数なので確率を重積分で計算（前半、極座標変換使って計算する方法、後半そのまま重積分で計算する方法）

https://drive.google.com/drive/folders/1Ri_i2XipAuFLVXqaumQRPPi5aLvXU_YE

<h1>(4)別解・別解説　(3)と同様に重積分を計算（※そもそもなぜ、急にv=u+1とv=u-1が出てきたのかの説明から）

https://drive.google.com/drive/folders/1OYIXvNUdfu2odFC1YFmnIj_yvdN-DBUO

※(5)は追加の条件付き確率（密度関数）を連続型で考えるときに導入する「たたみ込み」
　というのが、説明に下準備がかなりいるので（5）は記事を分けます。制作後リンクを貼ります



<h1>Githubリンク

https://github.com/thinking-weed/analysis-statics-memo

<h1>参考資料一覧（※全部の内容を自分も理解できているわけではないです。）

・統計検定1級公式問題集　実務教育出版　
　※過去問のページもありました。　https://www.toukei-kentei.jp/prepare/kakomon/
・青チャートI＋A、Ⅱ＋B　数研出版
・理工系の微分積分学　吹田信之、新保経彦　共著　学術図書出版書
・線形代数入門　齋藤正彦　著　東京大学出版会
・定本　解析概論　高木貞治　著　岩波書店　
・数学シリーズ　数理統計学　改訂版　稲垣萱生　著　裳華房
・数学シリーズ　集合と位相　内田伏一　著　裳華房
・one point 推定と検定　鷲尾泰俊　著　共立出版
・電磁場とベクトル解析　深谷賢治　著　岩波書店
KaliのFireFoxが真っ白

# 概要

FireFoxが急に動かなくなったので頑張った。

# エラー

立ち上げ後何も表示されない。表示されなさ過ぎてスクリーンショットすらない。

```
┌──(ayato㉿redTeam)-[~]
└─$ sudo firefox
[GFX1-]: glxtest: libpci missing
[GFX1-]: glxtest: libEGL missing
[GFX1-]: vaapitest: ERROR
[GFX1-]: vaapitest: VA-API test failed: failed to open renderDeviceFD.
```

これがCLIから立ち上げたときのやつ。

# 解決方法

```bash
sudo apt-get install libpci3 libegl1
```

done :white_check_mark:
[Windows] ゴミ箱に関する調査メモ

# 目的
ファイルやディレクトリをゴミ箱に移動させるプログラムを作成した時の調査メモを備忘録として記録する。

# 概要
Windowsの場合、ゴミ箱を操作するのは少々面倒。
というのもゴミ箱は特殊フォルダらしく、管理方法が通常のディレクトリと異なる。
そのため、単純にmove類のコマンドで操作することはできない（ゴミ箱の仕様に準拠せずに、ファイルを移動だけならできなくもない。GUI上のゴミ箱に表示されない可能性がある）。

# ゴミ箱の場所
C直下の隠しファイルである`$Recycle.Bin`がゴミ箱である。
```
C:\>dir /a
 C:\ のディレクトリ

2000/01/01  12:34    <DIR>          $Recycle.Bin
...(snip)
```

さらに中にはSID（セキュリティ識別子）ごとにディレクトリがある。SIDに関してはWiki[^1] 等を参考にされたい。
※ なお、SIDのリストはregeditで`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList`で確認することが可能
```
C:\> cd $Recycle.Bin && dir /a
 C:\$Recycle.Bin のディレクトリ

2000/01/01  12:34    <DIR>          .
2000/01/01  12:34    <DIR>          ..
2000/01/01  12:34    <DIR>          S-1-2-34
2000/01/01  12:34    <DIR>          S-1-2-34-1234567890-1234567890-1234567890-1234
```

SIDディレクトリの中には`$I*`と`$R*`で始まる、ランダムな文字列名のファイルやディレクトリが存在する。
```
 C:\$RECYCLE.BIN\S-1-2-34-1234567890-1234567890-1234567890-1234 のディレクトリ

2000/01/01  12:34    <DIR>          .
2000/01/01  12:34    <DIR>          ..
2023/11/11  20:47                88 $IQO4ITQ.txt
2023/11/11  23:36               104 $IW8DVKB
2023/11/11  20:47                24 $RQO4ITQ.txt
2023/11/11  23:36    <DIR>          $RW8DVKB
2000/01/01  12:34               129 desktop.ini
```

Windowsでは削除されたファイル1つに対して、`$I*`と`$R*`の1組のファイルが生成される。

- `$I*`
    - メタデータ[^2] 。以下はVersion2(Windows10以降)
    
    |オフセット(10進数)|サイズ(バイト)|概要|
    |-|-|-|
    |0|8|バージョン情報で、`02 00 00 00 00 00 00 00`|
    |8|8|サイズ情報|
    |16|8|削除した時間|
    |24|4|ファイルパスの文字数(NULL文字含む)|
    |28|2*文字数|ファイルパス|

- `$R*`
    - ゴミ箱に入れられたファイルやディレクトリ(実データ)


# 参考
[^1]: https://en.wikipedia.org/wiki/Security_Identifier
[^2]: https://github.com/danielmarschall/recyclebinunit/blob/master/FORMAT.md#version-2-introduced-somewhere-in-a-windows-10-release
お前らのコメントのせいで、エンジニア全体のレベルが下がるぞ

# この考えに至った経緯
コーディングをしている人で、小まめにコメントを残す人がいる。

がしかし、これは良い事だろうか？

確かに。ソースを読む時にコメントがあると、
処理の塊を判断しやすく、実装者の意図も汲み取りやすいメリットがある。
これは他の人に限らず、未来の実装者、自分に取っても同様の恩恵になるだろう。

私もそう思っていた。
しかし、ある熟練エンジニアの方とチーム開発をした際に、
その人は全くコメントを残さず、私は困惑した。

「この人は、他の実装者や未来の自分がコードを読み返すことを考えていないのか？」と。

しかしこの方は、かなりのレベルのエンジニアで数十年のエンジニア歴があり、
収入も私の３～４倍はあるだろうと言われるほど、社長や、社内・社外からの絶対の信頼を持つ方だ。

この方が意味もなくコメントを残さないなんてありえない。私はそう思った。
さらにはズボラな私よりも、性格的にもきっちりした方だ。

ここで一つの疑問を持った。

もしかして私の中の常識である、
「コメントはマメに書いた方が良いという、自分の中の常識が間違っている？」

私はその方を真似して、真意を探ることにした。
そして、2か月ほど共にチーム開発をしてみて、以下のメリットがあることに気が付いた。

# コメントを書かないメリット
## 適当な変数名を付けれなくなる
当たり前だがコメントが無い以上、処理の意図を判断する材料は純粋なコードのみになる。
エンジニアの皆様なら分かるだろうが、コメントはコードに置いて重要な判断材料だ。
今まで、意図の重みをコメントと分散してきたものを、変数名だけで賄う必要があるので、妥協が許されなくなる。この結果、`無意識的`に具体的な命名をするようになる。


## コードリーディングが劇的に速くなる。
コメントを書かないベテランエンジニアは他人のコードであっても、処理を理解するのが異常にはやい。
単なる経験歴によるものかもしれないが、それにしてもこんなにはやい事あるか？と思う程だ。
私は一つの仮説を立ててみた。
「処理の意図を理解するたに、今までコメントに頼ってきた時間がコードリーディングに当てられる。その結果リーディングのスピードもはやくなるのでは？」


その仮説は恐らく正しく、
個人の間隔的に、リーディング速度は1.3倍くらいになったと感じるかつ、
コードを追う時に心理的なハードルもかなり下がったように感じる。

## 意味の無いコメントを考える時間が無くなり、価値の高いコーディングをする時間が増える
皆さんはこんな事を思った事がないだろうか。

「コメントを読んでみたけど、よく分からなかった。もしくは、曖昧で色々な解釈があるがどれだろうか？」

私はこのようなコメントは、意味のないコメントだと思う。
全く枠割を果たしていないし、そういったコメントはよく分からないため、`永続的に放置され、よく分からないまま残り続ける。`

ここでまた問いだが、
「あなたは読解力と、説明する力にどの程度自身がありますか？」

もしここであなたが、どちらも100点満点だと答えたあなたでさえ、
コメントを書くには`不十分`だろう。
何故ならば、`例えあなたが満点でも、他の人をそうではないからだ。`
もしあなたが完ぺきなコメントを残したとしても、他の方が意図を読み取れるとは限らないし、
最悪、間違った解釈をして実装をするかもしれない。

寧ろ混乱を招く要因であり、これは間違った解釈に繋がりうる、`バグの種`だ。

そう言った上記のような、
意味もなく、寧ろ妨げになるコメントを考える時間を
変数名命名を考える時間時間に当てられるため、価値のあるコードが増えるだろう。

## バグの発見が容易になる
コードにコメントがあるとついつい読んでしまうが、
もしかしたら、それは`読んではいけないものかもしれない可能性`がある。

# それでもコメントは残すべきでは？という方へ
私もコメントを0にしろと言いたい訳ではないし、タイトルを吟味して欲しい。
要は、`安易にコメントするべきではない`と言いたいのだ。

現に私が参考にしたベテランの方も、0というわけでは無く。
非常に少ないというところに収まっているであろう。

コメントを残す場所は、私も完全に解を出せていないが、
時点での候補を挙げて見たいと思う。

## クラスや関数に残す
コメントを残すべきだと言うような、複雑なロジックは
そもそもの設計が間違っている可能性がある。

そういったものは、クラスや関数に切り出し、
クラス・関数、引数の命名を熟考するべきだろう。

また、引数レベルの極小の対象はコメントを残してもよいが、
出来れば、型情報レベルに留めて欲しいと思う。

## API・ミドルウェアレベルのバグに関する事
こういった、コードだけでは追えない、APIやミドルウェアレベルのバグはコメントを残すべきだ。

例として、
mysqlのバグで、同じ関数を2回連続して呼ぶ必要があるといった事を目にしたことがあるが、
もしこれに、コメントが無かった場合、私は冗長だと判断し片方を消してしまったかもしれない。
N+1問題の概要と解決方法 (Cakephp4)

# N+1問題とは

データベースから情報を取得するときのパフォーマンスの問題。
具体的には、SQLがN＋1回発行されてしまうことでパフォーマンスが低下する問題。

## **N+1問題の具体例**

### データベースの構造

N+1問題は、子テーブルの中に親テーブルに紐づく情報が複数存在するときに現れる。

例えば、学校テーブル（親）と生徒テーブル（子）があるとする。学校には複数の生徒が所属しているので、学校テーブルと生徒テーブルは１対多の関係にある。

![スクリーンショット 2023-11-11 11.33.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527059/c9b811fd-8580-8a3e-f9aa-8ce1408c016d.png)


田中ひめ、鈴木ひなは西高校に所属しており、それ以外の3人は中央高校に所属していることがわかる。

### 典型的なコード例でのN+1問題の発生

冒頭に示した通り、N+1問題はSQLがN＋１回発行されてしまうことでパフォーマンスが低下する問題である。
ここではSQLがN＋1回発行されるコードを見ていく。

```php
$schools = $db->query("SELECT * FROM schools");

$result = [];
foreach ($schools as $school) {
    $student = $db->query("SELECT * FROM students WHERE students.id = {$school['id']}");
    $result[] = [
        "id" => $school["id"],
        "school_name" => $school["id"],
        "students" => $student,
    ]
}
```

学校テーブルから情報を取得するのに１回のSQL発行を行なっている。
また、foreachループの中で、学校テーブルのレコードの数だけ（N回）SQL発行を行なっている。

つまり、N+1回のSQL発行を行なっている。

今回の例では合計３回のSQL発行で済んでいるが、親テーブルに何万レコードも存在することもある。
そんなにSQLを発行していたら、パフォーマンスは低下する。

# **N+1問題の解決策**

- JOIN句の活用
- Eager Loadingの導入

## JOIN句の活用

JOIN句を活用することで、学校レコードを取得するときに生徒レコードも一緒に取得できる。
SQLの発行は１回になる。

```php
$schools = $db->query(
    "SELECT * FROM schools LEFT JOIN students ON schools.id = students.id"
);
```

## Eager Loadingの導入

学校レコードの取得とは別に、生徒レコードをまとめて取得する。
SQL発行回数は２回になる。

```php
$schools = $db->query("SELECT * FROM schools");
$students = $db->query("SELECT * FROM students WHERE school_id IN (1, 2)");
```

# **ORM（Object-Relational Mapping）とN+1問題**

## ORMの概要

ORM（Object-Relational Mapping）は、データベースとオブジェクト指向プログラミング言語の間でデータを効果的にやり取りするための仕組みや手法のこと。

言い換えれば、データベースのテーブルとオブジェクト指向プログラム内のオブジェクトの間で、簡単にデータを変換したり、操作したりするためのツールやライブラリ。

## ORMがN+1問題をどのように扱うか

cakephp4だと、クエリビルダーの機能によってできるだけ最小のクエリで取り出せるように最適化してくれる。この機能を使うにはテーブル間の関連を記述する必要がある（テーブルファイルをbakeで生成する場合、自動的に書いてくれる事が多い）。

クエリオブジェクトを作成するときは、containを忘れずに書こう。

```php
$query = $articles->find('all');
$query->contain(['Authors', 'Comments']);
```

# **まとめ**

N+1問題はデータベースから情報を取得するときのパフォーマンスの問題。SQLの発行をループ処理の中で書こうとしているときは、一度立ち止まって考えてみてほしい。

本記事で誤っている点があったら、ご指摘いただけるとありがたいです。

# 参考

https://book.cakephp.org/4/ja/orm/query-builder.html#id17
Unityのバージョン変更が動かなかったときにしたこと

# はじめに

macOSでUnityを使っています。マイナーバージョンアップは頻繁にあるので、ときどきまとめて追随させてきました。ときには2020から2021へみたいにメジャーバージョンを変えてみたりもしています。

ちょっと前までUnity Hubからバージョン変更できていたのですが、いつの間にか変換中に固まるようになりました。そこで手動でファイルを編集して強制アップデートしたので、そのときの方法を記録します。

# プロジェクトツリー確認

Unityプロジェクトに必須のフォルダは以下になります。

* Assets
* Packages
* ProjectSettings

以下はUnity Editorが生成するので消しても構いません。
* Library
* Logs
* UserSettings
* *.csproj
* *.sln
* その他

# 事前作業

パッケージマネージャー画面で、なるべく更新しておいたほうがよいかと思います。

# バージョン変更

使用中のEditorのバージョンは、`./ProjectSettings/ProjectVersion.txt`にテキストファイルとして記載されています。2行しかありません。

```
m_EditorVersion: 2021.3.25f1
m_EditorVersionWithRevision: 2021.3.25f1 (68ef2c4f8861)
```

バージョンアップしたいエディタの`ProjectVersion.txt`が欲しいので、新規にプロジェクトをひとつ作ります。2021.3.32f1はこうでした。

```
m_EditorVersion: 2021.3.32f1
m_EditorVersionWithRevision: 2021.3.32f1 (3b9dae9532f5)
```

メジャーバージョンを変えるときも基本おなじです。一応マイナーバージョンを最新にしてから、メジャーバージョンを１つずつ変えて、なにかおかしくなっていないかよく調べたほうがよいと思います。

2022.3.12f1の`ProjectVersion.txt`はこうです。

```
m_EditorVersion: 2022.3.12f1
m_EditorVersionWithRevision: 2022.3.12f1 (4fe6e059c7ef)
```

ファイルを書き換えたら、Unity Hubのバージョンを変えてEditorを立ち上げます。もちろんUnity Hubを使ってない人は、アプリから直接読み込みます。

# パッケージのエラー

時々パッケージのバージョンでエラーがでます。Editor内蔵パッケージのため、ダウンロードして更新はできません。こちらも手直ししていきます。

パッケージは、`./Packages/manifest.json`にかかれています。パッケージマネージャーでワーニングアイコンがでていたところをメモし、バージョンを書き換えます。

私の場合、2021.3.32f1にしたときに書き換えた行だけ抜き出しています。

```
    "com.unity.render-pipelines.high-definition": "12.1.13",
    "com.unity.render-pipelines.universal": "12.1.13",
    "com.unity.shadergraph": "12.1.13",
```

次に2022.3.12f1にしたときも手修正しました。

```
    "com.unity.render-pipelines.high-definition": "14.0.9",
    "com.unity.render-pipelines.universal": "14.0.9",
    "com.unity.shadergraph": "14.0.9",
```

以上で無事問題なく新しいバージョンで動くようになりました。

# おわりに

アセットが少なかったのでうまくいきました。規模が大きいプロジェクトですと、こんなにうまくはいかないような気がします。

Unityのほうで対応してほしいです。お願いします。
wslでelixir その99

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
nx、やってみた。

# 参考にしたページ

https://qiita.com/sand/items/1ad04bafd4ef3d91a675


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/72f49fb0-5d97-86f3-ced4-a98365212023.png)

# サンプルコード

```
x0 = -5
x9 = 5
xl = [x0, x9]

yl = [
  Nx.to_number(LinearRegression.pred({w, b}, x0)),
  Nx.to_number(LinearRegression.pred({w, b}, x9))
]

Vl.new(width: 600, height: 400, title: "散布図と相関直線（加工後）")
|> Vl.layers([
  Vl.new()
  |> Vl.data_from_values(x: xl, y: yl)
  |> Vl.mark(:line)
  |> Vl.encode_field(:x, "x", type: :quantitative, title: "身長", scale: [zero: false])
  |> Vl.encode_field(:y, "y", type: :quantitative, title: "体重", scale: [zero: false]),
  Vl.new()
  |> Vl.data_from_values(height: Nx.to_flat_list(x), weight: Nx.to_flat_list(y))
  |> Vl.mark(:point)
  |> Vl.encode_field(:x, "height", type: :quantitative)
  |> Vl.encode_field(:y, "weight", type: :quantitative)
  |> Vl.encode(:color, value: "#db646f")
])
```

以上。
自作の高精度タイトルバー【C# .NET Framework】

# 自作タイトルバーが追従するようにしたはなし
C#.NETで`FormBorderStyle`を`None`にするとタイトルバーやその他諸々の余計な部分が消えます。
スタイリッシュになって、かっこいいけれどこのままではウィンドウを動かせません。
そこで、自作タイトルバーでウィンドウを動かす方法を調べました。
[タイトルバーのないフォームを移動できるようにするdobon.net](https://dobon.net/vb/dotnet/form/moveform.html)
しばらくの間この方法を使っていたのですが、こちらの記事にある方法では高速でウィンドウを動かすと、マウスの位置に対して、ウィンドウがあらぬ方向まで行ってしまうことがありました。
## 今まで使ってきたコードをベースに安定性を高める
``マウスの位置に対して、ウィンドウがあらぬ方向まで行ってしまう``という問題があったので、マウスの位置に対する相対位置を計算すればいいのでは？と思い、以下のコードを考え出したのでお勧めします。
※このコードを実行するためにはタイトルバーにMouseDownイベントとMouseMoveイベントを登録しておく必要があります。
```Csharp
private Point basePoint;

private void titleBar_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        basePoint = new Point(Control.MousePosition.X - Location.X, Control.MousePosition.Y - Location.Y);
    }
}

private void titleBar_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Location = new Point(Control.MousePosition.X - basePoint.X, Control.MousePosition.Y - basePoint.Y);
    }
}
```
こちらのコードは最初に押下したときにウィンドウの左上とマウスの相対位置を記録し、マウスを動かしたらその相対位置を用いてウィンドウの位置も調整するというコードです。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310502/e258189a-61d3-3de3-df35-91b84d9a9aff.png)

## 余談
気になったので画面外にウィンドウが行った時に自動で画面内に戻すようなプログラムを作ってみましたが、マルチモニターの場合画面間移動ができないのでやめました。(あと最近のWindowsは優秀なのでそんな機能いらなかったのかもしれない)