OmniAICreator/Qiita-1.07M huggingface dataset:
DjangoとPythonのsecretsを使ってパスワードの自動生成・ハッシュ化をしよう

## 概要
Djangoにはmake_random_password()というメソッドがあるのですが非推奨なので今回は公式で推奨されているsecretsを使ったパスワード生成方法を使用します
また、ハッシュ化はDjangoにある機能を使って行います

https://github.com/django/django/commit/00e187961059a0e77403151d2bb38c217101d5af#diff-7f8222e3ea4582896fd11abf2064580181e771c652e4e469b4a101fb3380a2c5

https://docs.djangoproject.com/en/4.2/releases/4.2/#id1

https://docs.python.org/3/library/secrets.html#recipes-and-best-practices

今回はDjangoのshellを使って自動生成します
secretsとstringをimportし、メソッドを実行します

```
poetry run python manage.py debugsqlshell
Python 3.11.2 (main, Mar 23 2023, 14:09:52) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import string
>>> import secrets
>>> alphabet = string.ascii_letters + string.digits + string.punctuation
>>> password = ''.join(secrets.choice(alphabet) for i in range(16))
>>> password
'i,Id1DtX$y5dNLo('
```

- ascii_letters
- digits
- punctuation

の中身は以下の通りです
```
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
```

また、range内の数字でパスワードの長さを調整できます

## パスワードのハッシュ化
fixtureを使う際にパスワードをハッシュ化する際はDjangoのmake_passwordメソッドを使います
make_passwordメソッドの中に先ほど自動生成したパスワードを入れます
```
>>> from django.contrib.auth.hashers import make_password
>>> make_password('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~')
'pbkdf2_sha256$600000$QcH0cm6kihyD7LCU3vL0XG$bcnfLwTFLzewYJj14xIhErzDY82qK57KRLLu0I7p6Ew='
```

以上です

## 参考
https://stackoverflow.com/questions/9480641/django-password-generator

https://www.idiotinside.com/2017/06/04/django-make-random-passwords/

https://docs.python.org/3/library/secrets.html#recipes-and-best-practices

https://pgstudio.oji-cloud.net/2021/03/17/post-2607/
PdMはプロダクトと事業をシンクロさせる

# はじめに
この記事は トラストバンク Advent Calendar 2023 の10日目の記事です。

ふるさと納税サイト「ふるさとチョイス」の CMS の PdM をやっている @TK2357 と申します。
多くのPdMが感じているように、私もPdMという役割は、企業や個人によって微妙な認識の違いがあると感じています。
今回は、そんなPdMの役割の中でも、あえてブレることがない部分について、書かせていただこうと思います。

# PdMがミニCEOと呼ばれる理由
PdMのことをミニCEOと呼ぶこともありますが、役員では無いPdMが事業責任を負わされることはありません。
それでも、ミニCEOと呼ばれるのは、CEOと同レベルで事業を理解した上で、それをプロダクトに反映することが求められる役割だからだと思っています。

# PdMの面白いところ
CEOレベルの事業理解を求められた上で、プロダクトマネージャーという名の通り、CEO以上に深くプロダクトに関わることになります。
大変な役割のように思うかも知れませんが、見方を変えれば、事業責任を負わずに、事業内容に踏み込むことができる上、プロダクトという現物を生み出すことまでできる、とても面白いポジションです。

# プロダクトビジョン・プロダクト戦略
PdMの主な仕事に、プロダクトビジョンとプロダクト戦略の策定があります。
これらは企業としてのビジョンや戦略とシンクロしている必要があります。

# 市場規模・事業戦略
言うまでも無く、企業が存続するには、売上と利益が必要です。
極論ですが、個人目線でも、会社の利益が増えれば賞与が増えますし、利益が減れば賞与が減ります。
つまり、経営目線でも個人目線でも、売上の中から利益を確保するために、コストがどこまで使えるかを意識する必要があります。
このコストの中には、プロダクト開発費も含まれます。

# プロダクトと事業のシンクロ
下記は、プロダクトと事業のシンクロを現した図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630254/52554104-cf45-bc90-763b-3901b6a56dfd.png)

#### ①．企業のビジョン・ミッション
プロダクト側もビジネス側も、企業のビジョン・ミッションを軸に戦略や戦術に落とし込みます。

#### ②．プロダクトビジョンと市場規模の関係性
プロダクトビジョンは、市場規模にシンクロしている必要があります。
例えば、弊社の主力事業である「ふるさと納税」は、日本限定の制度であり、市場規模は2兆6,000億円と言われています。
つまり、プロダクトビジョンが「世界最大のＥＣサイトを創る」だと成立しません。

#### ③．プロダクト戦略と事業戦略の関係性
プロダクト戦略と事業戦略もシンクロしている必要があります。
事業の方向性と関係ないプロダクトを作っても、経営からの評価は得られず、それが続けば組織は崩壊します。

#### ④．ロードマップ
プロダクトと事業のロードマップはシンクロせざる得ません。
事業だけが進んでプロダクトが無い状態や、逆に、優れたプロダクトだけ完成して売り込む市場が無い状態では、ビジネスとして成立しません。

#### ⑤．バックログとKPI/KGI
ここは、開発着手の承認を取る上で、必要となる仮設やエビデンスです。
どの数字を上げる（もしくは下げる）ために、どの機能を作るかという話で、ここが論理的に説明できないと、弊社に限らず開発着手の承認は下りないと思います。
そのため、バックログとKPI/KGIは、必然的にシンクロすることになります。
また、これらは部門や個人の目標とも連動しています。

#### ⑥．実行
ここまで来ると、もはやシンクロさせない方が難しくなります。
例えば、プロダクトのリリースに合わせたプレスリース等がそれに当たります。

# まとめ
PDMの役割の中でも、プロダクトと事業をシンクロさせる仕事は一番の醍醐味で、ここを美しくシンクロさせるPDMこそが、良いPDMだと思います。

# 最後に
トラストバンクでは一緒に働いてくれる方を募集中です！
まずはカジュアル面談からでも、お気軽にお声がけください。

https://www.wantedly.com/companies/trustbank/projects
Instagram Graph API 入門

# 概要
Instagramプロ(ビジネスとクリエイター)がアプリを使用してInstagramにおけるプレゼンスを管理することが可能。
例えば以下のようなことができる。

- メディアの取得と公開
- メディアへのコメントの管理と返信
- 他のInstagramユーザーが@メンションしたメディアの特定
- ハッシュタグ付きのメディアの検索
- 他のInstagramビジネスやクリエイターに関する基本メタデータと指標の取得

https://developers.facebook.com/docs/instagram-api?locale=ja_JP

# ノード
### 概要
Instagramのオブジェクトを表すデータベース内のエンティティ（データベースのモデル内で表現される実世界のオブジェクトまたは概念）。

### 例
| ノード          | 意味                                                  |
|---------------|-----------------------------------------------------|
| IGコメント      | Instagramコメントに該当する                                  |
| IGコンテナ      | Instagramの投稿を公開するためのメディアコンテナに該当する           |
| IGハッシュタグ   | Instagramハッシュタグに該当する                             |
| IGメディア      | Instagramの写真、動画、ストーリーズ、アルバムに該当する        |
| IGユーザー      | InstagramビジネスアカウントまたはInstagramクリエイターアカウントに該当する |
| ページ          | Facebookページに該当する                                    |

# エッジ
### 概要
ノード間の関係を表す。
例えば、ユーザーと投稿の関係、投稿とコメントの関係、ユーザーとユーザーの関係などがエッジとして表される。
ユーザーの投稿を取得したい場合は、ユーザーのエッジから投稿のエッジを辿ることで、投稿のデータを取得することができる。

### 例

**[ハッシュタグID](https://developers.facebook.com/docs/instagram-api/reference/ig-hashtag/?locale=ja_JP)**

IGハッシュタグのIDを取得できる。
API仕様は以下。

`GET /ig_hashtag_search?user_id={user-id}&q={q}`

- `{user_id}` (必須) — リクエストを実行するIGユーザーのID
- `{q}` (必須) — クエリ対象のハッシュタグ名

**[IGハッシュタグ付きの最近のメディア](https://developers.facebook.com/docs/instagram-api/reference/ig-hashtag/recent-media?locale=ja_JP#reading)**

特定のハッシュタグ付きで最近公開された写真および動画のIGメディアオブジェクトのリストを返す。
API仕様は以下。

`GET /{ig-hashtag-id}/recent_media?user_id={user-id}&fields={fields}`

- `{user_id}` (必須) — クエリを実行するIG利用者のID
- `{fields}` — 値を返したいフィールドのコンマ区切りリスト

# Instagram Graph API利用するための準備
Instagram Graph APIを利用するためには、以下の情報が必要である。

- ページアクセストークン
- InstagramビジネスID

上記の2つの情報を得るためには以下のステップを踏む必要がある。

- Facebookアカウント取得
- Facebookページ作成
- Instagramアカウント取得
- Instagramプロアカウント変更
- InstagramプロアカウントとFacebookページ連携
- Meta（Facebook） for Developersアカウント取得
- アプリの作成
- アプリにInstagramグラフAPI追加
- アプリID, app secretの確認
- アプリにFacebookページをリンク
- アクセストークン①（ユーザーアクセストークン）取得
- アクセストークン②（長期ユーザーアクセストークン）取得
- アクセストークン③（長期ページアクセストークン）取得
- InstagramビジネスアカウントID取得

https://blog.dtn.jp/2022/02/02/instagram-graph-api-ver12

# レート制限
レート制限とは、一定の時間内にAPIに対して送信できるリクエストの数を制限すること。
FacebookのAPIレート制限には、「プラットフォームレート制限」と「ビジネスユースケースレート制限」の2つが存在する。

https://developers.facebook.com/docs/graph-api/overview/rate-limiting
Reports & Dashboards for Lightning Experience >  Format Your Report



[Reports & Dashboards for Lightning Experience >  Format Your Report](https://trailhead.salesforce.com/content/learn/modules/lex_implementation_reports_dashboards/lex_implementation_reports_dashboards_report_formats)

# レポートに何にも表示されないらしい。　不思議だ

+ [レポートでデータが表示されない: I am not able to remove the unit filter and also data is not showing Format your report](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Jk8a8)

+ [My report doesn't give me any information...](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007RJws7)
+ [why do I not have any cases to filter?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epk2G)
整数型を文字列や日付型にする(SPSS Modeler データ加工逆引き2-17)

# 整数型を文字列や日付型にする

![スクリーンショット 2023-11-27 13.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1dd49df3-64a6-9080-cdfb-369c661e4d4c.png)

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

DBで定義されているデータの型を分析目的に応じて変更する
整数の商品IDは桁数ズレで問題が起こりやすいため強制的に文字列へ変更する

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

https://github.com/yoichiro0903n/blue/raw/main/integer2string_date.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-11-22 13.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a0d75762-e992-f6c9-14db-35f59c223e78.png)

a.入力するデータは以下の通りです。セルの右側に寄せられていることから整数型だとわかります。
![スクリーンショット 2023-11-27 13.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/882c242a-b093-2040-2f55-2b29b44cb460.png)

b.[データ型]ノードを確認します。　[日付]の左にあるアイコンからストレージが整数型だと認識されています。なお実数の場合アイコンにRの文字が付与されます。
![スクリーンショット 2023-11-22 13.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7ac1ce46-caaa-4c9f-60ae-f385806da546.png)

#### 整数型を文字列へ

c.[フィールド作成]ノードを編集します。　[置換]条件を[常時]にして、以下の関数で型を変更します。
![スクリーンショット 2023-11-27 13.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1dd918d8-8bf4-40f7-d2e7-43beebd2c754.png)

d.[データ]ノードを確認します。　フィールド列の日付の前にAのアイコンがあり、尺度も名義型と判別され文字列へ変更されたことがわかります。
![スクリーンショット 2023-11-22 13.43.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5635a677-7b08-8d55-2e6b-7873cfbcc1d4.png)

#### 整数を日付型へ

e.[フィールド作成]ノードを編集します。　[置換]条件を[常時]にして、以下の関数で型を変更します。整数から直接文字列に変換できないため、一度文字列に変更した上で変換しています。
![スクリーンショット 2023-11-27 13.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/21934c70-ccfb-3bcf-1c47-4c8ec4fe6a36.png)

f.[データ]ノードを確認します。　フィールド列の日付の前にカレンダーのアイコンがあり、尺度も連続型と判別され日付型へ変更されたことがわかります。
![スクリーンショット 2023-11-22 13.44.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fac30685-63e0-377a-b1ef-c2add638c0a2.png)

#### 注意事項

データ型の変更は参照しているDBによってはSQLプッシュバックが有効でない場合がありますので、確認後適切な方法を検討します。

## 4.参考情報

#### よく使う文字列関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Vue 基礎勉強 v-for

(Vue.js 3.1.5を使用)

**v-for**

以下のように書くと、配列の要素をすべて表示することができる。

```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        animals: ['カラス', '猫', '熊', 'キツネ', 'たぬき']
    })
})
app.mount('#app')
```

```html:html
    <div id="app">
        <ol>
            <li v-for="animal in animals">{{animal}}</li>
        </ol>        
    </div>
```

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/fa492acf-5678-c671-4a00-14f15bb1f893.png)


配列だけでなく、オブジェクトも扱える。


```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        book:{
            name: 'Vue 入門',
            author: 'やまだ花子',
            year: 2023,
            company: 'ほげほげ書房'
        },
    })
})
app.mount('#app')
```

```html:html
    <div id="app">
        <ul>
            <li v-for="value in book">{{value}}</li>
        </ul>        
    </div>
```

![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/06220885-491d-fd2c-6b32-731450cd7906.png)


htmlを以下のように書くと、各プロパティのvalueだけでなく、keyの値も表示できる。
```html:html
    <div id="app">
        <ul>
            <li v-for="(value, key) in book">
                {{key}}: {{value}}
            </li>
        </ul>        
    </div>
```
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/bbf38d3a-f8fc-97fe-4b32-cfd73d626268.png)
AI-102試験対策のまとめ「Azure AI Faceサービスの顔検出モデルの指定」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### Azure AI Faceサービスの顔検出モデルの指定
Faceサービスでは機械学習モデルを使用して、画像内の人間の顔に対して操作を実行  
⇒使用する顔検出モデルのバージョンは指定可能

#### **顔検出モデルの相違点**
| | detection_01 | detection_02 | detection_03 |
| --- | --- | --- | --- |
| リリース時期 | 初期 | 2019年5月 | 2021年2月 |
| 選択肢 | デフォルト | オプション | オプション |
| 小さい顔/横顔/不鮮明な顔での精度 | 最適化されていない | 精度は向上 | さらに精度向上 <br>(より小さい顔や回転した顔の向きなど) |
| 検出呼び出しで指定されている場合に返す顔の属性 | 主な顔の属性 <br>(頭部姿勢/年齢/感情など) | 返さない | マスクと頭部姿勢の各属性 |
| 検出呼び出しで顔のランドマークが指定されている場合 | 顔のランドマークを返す | 返さない | 顔のランドマークを返す |

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/computer-vision/how-to/specify-detection-model


## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Azure AI Visionによる不適切な画像の検出」**

https://qiita.com/fsd-jume/items/9636bee17ad2d1f249c1

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

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
BigQueryの静的テーブルをterraformで管理する

dbtやDataformの普及によって、データ集計定義をGitHubで管理しレビュー後に反映するというソフトウェア開発のプラクティスがデータ分析にも適用されることがよく見られるようになりました。
一方で毎日集計されるわけでも、更新頻度が高いわけでも無いテーブルは以前としてBigQueryのコンソールなどから手動で作成されることもよくあります。
そのため、この種のテーブル(静的テーブル）もterraformで管理し、GitHubのPullRequestによるレビューなどが行われるようなプロセスにしてみます。

テーブルを作成したい人がterraformに慣れ親しんでいるケースは少ないので、terraformに慣れていない人でも扱いやすいファイル構造にします。
まずは、以下のようにデータセットとテーブルの構造を以下のようなディレクトリ構造に対応付けます。

```plaintext
static_tables
├── データセット名1
│   ├── テーブル名1.yaml
│   └── テーブル名2.yaml
├── データセット名2
│   └── テーブル名3.yaml
└── データセット名3
    └── テーブル名4.yaml
```

そして、それぞれのYAMLファイルにはこのようにスキーマ情報を記述します。JSON形式はケツカンマ問題などがあり、書きづらいためにYAML形式にしています。

```yaml
schema:
  - name: カラム名1
    type: 型1
    mode: NULLABLE
  - name: カラム名2
    type: 型2
    mode: NULLABLE
  - name: カラム名3
    type: 型3
    mode: NULLABLE
```

最後に以下のようなterraformを用意すれば、YAMLファイルを追加してterraform applyするだけでBigQueryテーブルが自動生成されるようになります。
google_bigquery_tableのschemaフィールドはJSON形式のデータを要求しているので、yamldecodeした後にjsonencodeしています。

```terraform
resource "google_bigquery_table" "static_table" {
  for_each = fileset("${path.module}/static_tables", "*/*.yaml")

  project    = "プロジェクトID"
  dataset_id = split("/", each.value)[0]
  table_id   = trimsuffix(split("/", each.value)[1], ".yaml")

  schema = jsonencode(yamldecode(file("${path.module}/static_tables/${each.value}"))["schema"])
}
```
「Blazor WebAssembly アプリケーションプログラミング自習書」が .NET 8 対応しました

今年 2023 年 11 月の .NET 8 リリースにあわせ、「Blazor WebAssembly アプリケーションプログラミング自習書」も 1 年ぶりに .NET 8 対応のために更新しました。

https://github.com/jsakamoto/self-learning-materials-for-blazor-jp

「Blazor WebAssembly アプリケーションプログラミング自習書」について詳しくは、昨年の Blazor Adbent Calendar に投稿した下記記事を参照ください。

https://qiita.com/jsakamoto/items/244163860b4626c02ba0

ということで、本記事ではこの自習書を更新した際の四方山話を徒然に書き綴りたいと思います。

## 1. .NET 8 への対応

まず最初に、自習書の内容を .NET 8 に対応させる作業についてです。実のところ、本自習書は Blazor WebAssembly のみを対象としていたこともあり、.NET 8 でリリースされた Blazor SSR や Auto レンダーモードに影響を受けるような領域まで手を伸ばしていませんでしたので、大した作業は必要ありませんでした。C# 12 で導入されたプライマリコンストラクタとコレクション式を使ったソースコードに更新する程度で済み、スムーズに移行できました。

## 2. Visual Studio Code と C# DevKit 拡張の進化

いっぽうで、1年前と比較して、macOS や Linux 環境での開発環境が大きく進化しました。特に、Visual Studio Code 用の C# DevKit 拡張がリリースされ、その使い勝手が格段に向上しました。本自習書は実質 Windows + Visual Studio の組み合わせに基づいて作業手順を解説しており、今年の更新でもその点は大きくは変わっていません。しかし今年の更新では、Visual Studio Code + C# DevKit における作業手順の解説を、一部ではありますが、追加で盛り込んでおり、macOS や Linux 各種ディストリビューション上で自習される方にもよりわかりやすく且つ快適になっていると思います。

## 3. GitHub Codespaces の登場

そしてもうひとつ、昨年の更新と比較して大きく飛躍したのが、"GitHub Codespaces" です。

GitHub Codespaces とは、GitHub が提供する仮想マシン上に構築される開発環境です。インターネット接続と Web ブラウザ、GitHub アカウントさえあればすぐに利用が可能です (下記リンク先参照)。

https://github.co.jp/features/codespaces

昨年の自習書更新時点では、まだ GitHub Codespaces は一般公開されていませんでしたが、それから間もなく一般公開となりました。加えて、「クイックスタート」と呼ばれる、所定の URL を開くだけで、指定の GitHub リポジトリから GitHub Codespaces のインスタンスが作成されて開発作業を開始できる、"Deep Link" の機能も提供されるようになりました。

今年の自習書更新では、この GitHub Codespaces の一般公開と機能進化にあわせて、GitHub Codespaces を利用した自習の体制も整備しました。自習書内で GitHub Codespaces を使って自習を開始する手順に言及しているほか、前述の Deep Link 機能を利用して、自習開始用の URL も提供しました (下記)。

[![GitHub Codespaces で開く](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/jsakamoto/self-learning-materials-for-blazor-jp/tree/boilerplate%2Fv.8.0.0?quickstart=1)

GitHub Codespaces を利用することで、自習者は手元のPCを汚すことなく、事前の開発環境整備の手間なく自習を始められます。PC 上に .NET SDK をインストールする必要すらありません。Web ブラウザ上で Visual Studio Code 相当のコードエディタ環境が提供されるので、何となれば iPad をはじめとした PC 以外のデバイスでも作業できます。


## 4. 結局、今年も Microsoft Word で執筆・PDF で公開

自習書の提供フォーマットなのですが、昨年の Blazor Advent Calendar 記事で AsciiDoc や Draw.io を利用した記事作成などのご助言を頂いたものの、結局この 1 年間、そのための時間を取らずに終わってしまいました。ということで、今年も Microsoft Word で執筆継続 & PDF 形式にエクスポート、の提供形態で終わってしまいました。

折角ご助言・ご提案いただいたのにすみませんです。および、せまいデバイス幅での可読性向上を要望頂いていた皆さんのご要望にも、引き続きお応えできていないこと、ご了承ください。

----

以上、「Blazor WebAssembly アプリケーションプログラミング自習書」の .NET 8 対応 & 1年ぶりの更新と記事内容の進化について報告でした。

また、Blazor をご存じでない方々へは、本自習書を通して「へええ、C# で SPA が作れるって、ホントだったんだ」みたいな程度でいいので、皆さんの知見をちょっと広げる程度で構わないので、GitHub Codespaces での動作のお試しをしてもらえたらな、などと思っております。

_Happy Coding!_ :)
ASDFを使用して、Debian 12にErlangとElixirをインストールします



こんにちは！私はチリ🇨🇱出身のカミロです。言語翻訳プログラムを使っています。この情報がお役に立てば幸いです。

この記事では、asdf vm を使用して Debian 12 に Elixir をインストールする方法を説明します。

## なぜ Debian 12 なのか?

Debian (GNU/Linux 全般) では、非常に古いハードウェアを使用できます。私は古い Dell Latitude e430 (2007 年製) をなんとか復活させ、最新バージョンの Erlang、Elixir、Firefox を使用することができました。

古いマシンを使用して新しい命を吹き込み、電子廃棄物を減らし、地球に貢献するのは魔法のようなことです。

### Debian のインストール

Debian のインストールは、このチュートリアルの範囲外です。ただし、私の推奨事項は USB ドライブを使用することです。
`ext4` ファイルシステムと `xfce4` デスクトップ環境を使用してインストールします。

公式 [Debian Web サイト](https://www.debian.org/distrib/) からダウンロードし、次のように記述できます。
[Balena Etcher](https://etcher.balena.io/) または同様のツール。

## 空自とは何ですか?

[asdf はツールのバージョン マネージャーです](https://asdf-vm.com/guide/introduction.html)。すべてのツール バージョン定義は 1 つのファイル (.tool-versions) 内に含まれており、プロジェクトの Git リポジトリにチェックインしてチームと共有できます。_asdf_ は、プラグイン システムを介して多くのツールをサポートし、シェル構成に含める単一のシェル スクリプトのシンプルさと使いやすさにより、チームがまったく同じバージョンのツールを使用していることを保証します。

### asdf のインストール

[スタート ガイド](https://asdf-vm.com/guide/getting-started.html) に従います。

まず、asdf の依存関係をインストールする必要があります。

```shell
$ sudo apt install -y curl git
```

次に、_asdf_ をインストールします

```shell
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
```

そしてバイナリを `.bashrc` 環境に追加します。_bash_ 以外の他の環境についてはガイドを確認してください。

_vim_、_nano_、_emacs_、またはお気に入りのエディターを使用できます。

```shell
$ vim ~/.bashrc
```
ファイルの最後に次の行を追加します

```shell
. "$HOME/.asdf/asdf.sh"
. "$HOME/.asdf/completions/asdf.bash"
```

使えるようになりました

```shell
$ source ~/.bashrc
```


環境をリロードすると、_asdf_ のバージョンを取得できます。

```shell
$ asdf --version
v0.13.1
```

## Erlang と Elixir をインストールする

_asdf_ で Erlang をコンパイルする前に、一部の依存関係をインストールする必要があります。

```shell
sudo apt install -y build-essential autoconf automake m4 libcurses5-dev libwxgtk3.2-dev libwxgtk-webview3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-17-jdk
```

依存関係がインストールされたら、erlang のインストールに進むことができます。

```sh
$ asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git
$ asdf install erlang 25.3.2.7
$ asdf global erlang 25.3.2.7
```

そしてエリクサー

```sh
$ asdf plugin add elixir https://github.com/asdf-vm/asdf-elixir.git
$ asdf install elixir 1.15.7-otp-25
$ asdf global elixir 1.15.7-otp-25
```

これで、私たちの最愛の _elixir_ を使用できるようになりました


```sh
$ elixir -v
Elixir 1.15.7 (compiled with Erlang/OTP 25)
```

## 次のステップ
これで、Elixir でプログラミングするために必要なツールがすべて揃いました。

- [Phoenix Framework Toolsのインストール](https://hexdocs.pm/phoenix/up_and_running.html)
- [Postgresのインストール](https://github.com/smashedtoatoms/asdf-postgres)
- [Install Nodejs](https://github.com/asdf-vm/asdf-nodejs) (Phoenix に JS deps をインストールする場合)
- [Docker のインストール](https://docs.docker.com/engine/install/debian/)
- [Livebookのインストール](https://livebook.dev/)
お気に入りの機能


# Global Search でサポートされなくなった機能の代わり？

+ [Global Search](https://qiita.com/Keiji_otsubo/items/050b8bb76c6d7c74fbeb)

このリストにはいくつかの機能が欠けていることに気付いたかもしれません。特に、ユーザーが独自の検索結果をピン留めする機能、検索フィルター、ユーザー管理の列などです。これらはすべて Classic でも引き続き使用できます。

この要件を満たすために (これまでと同様に柔軟な検索を維持しながら)、Salesforce はお気に入りと呼ばれる新しい機能を導入しました。頻繁に表示する必要があるレコードについては、以下に示すように、ページの上にある星をクリックしてレコードをお気に入りにすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/501b6f4f-f6be-cae7-5574-58ec783e6deb.png)

# 「お気に入り」に登録していた内容が全て消えてしまう

+ [「お気に入り」に登録していた内容が全て消えてしまう事象について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007RKZ92)

:::note
ユーザを無効化すると、登録してあったお気に入りが消えるようなことが報告されています。
無効化されたりしませんでしたか？

 We were able to determine that it was caused by an update in our HR system that temporarily disabled their Salesforce user accounts. 

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

この情報はオブジェクトでないような... ユーザインタフェースUIのAPIで操作できる感じです。
:::

# Summer 24

+ [リリース後、ユーザーはリストビューをお気に入りに登録できない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epjb0SAA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c7474ad8-3280-f26d-0166-47a26f1714c6.png)

:::note alert
This item doesn't support favorites 
:::
このIT用語どう発音してる?

プログラム名、サービス名、法人名などIT業界では横文字や略語のオンパレードです。中何と読めばよいかわからない単語も多いと多いと思います。読み方のわからない単語を人前で読み上げないといけなくなり少し困った人もいるかもしれません。あるいはミーティング等で、他の人が個性的な読み方をしているときに、自分としては違和感を感じながらも自信が持てないので、他の人の読み方に合わせたことがある人もいるかもしれません。[^curl]

[^curl]: [GNU](https://www.gnu.org/gnu/pronunciation.en.html) や [cURL (curl)](https://curl.se/docs/faq.html#What_is_cURL) のようにプロジェクトが公式に発音を示す場合もあります。ちなみにcurlが【シーユーアールエル】と発音されるのを耳にしたことがありますが、左にリンクしたプロジェクト公式のFAQではcurl開発者たちは【カール】のように発音していると説明されています。

一例として [IANA](https://www.iana.org/) は、【アイエーエヌエー】と各アルファベットを一つずつ読み上げるべきでしょうか、それとも【アイアナ】と一単語のように発音するのが自然でしょうか。相手に通じれば何でも良いと言えばその通りですが、一般的にどう発音されているのか知りたいと感じたことは無いでしょうか? 

そんなときに使えるサービス [YouGlish](https://youglish.com/) を紹介します。

※本記事では、単語の読み方を示すために、日本語のカタカナを墨括弧の中に表記する形式を採用します (例えば IPv6【アイピーブイロク】)。これはかなり日本語に寄せた記法であり、発音の正確性が犠牲になりますが、便宜性、理解しやすさを重視したためです。

※本記事では、何が「正しい」発音であるかは扱いません。特定の用語がどう発音されているか、あるいはどういう発音が通じやすいかを考える参考になればと思います。

## YouGlish

[YouGlish](https://youglish.com/)は、YouTube動画の一部をサンプルとして、単語やフレーズをキーワード検索すると、動画の中でそのキーワードが発音されている場面を視聴できるサービスです。サービス名に表れている通り、英語のリスニング/スピーキング学習者向けサービスです。現在は他言語の動画も検索できます。

特長として以下が挙げられます:

* 検索した単語がまさに発音される位置から再生できるので動画の中を探し回らなくてよい
* 生身の人間が実際に発音した言葉を聞ける
* 複数のサンプルが得られるので、人や文脈による発音の違いや、どの読み方が多数派なのか分かる
* アメリカ英語、イギリス英語、オーストラリア英語でフィルタリングできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31469/4c244048-569c-46cd-caeb-c94edae352be.png)

[runc](https://github.com/opencontainers/runc) の読み方を知りたくて[検索](https://youglish.com/pronounce/runc/english?)してみました。全てのサンプルで【ランシー】のように発音されており、【ランク】のような読みはYouGlish上では見つからないことがわかりました。スキップボタン (濃い青のボタン) で次の動画に遷移できるので、複数のサンプルを次々に効率的に聴くことができます。ぜひ皆さんも、読み方の気になっている単語を調べてみてください。

注意点として、サンプル動画に偏りがあります。例えばGoogle系の動画はたくさんあるがAWS系の動画がほとんどないので、AWSの人によるAWS用語の発音サンプルはなかなか見つかりません。

## 普段あたりまえに使っている単語こそ調べてみる

海外の人たちと英語で話をする機会がある方や、英語学習者の方は、日本で普及している読みが英語では違う形で発音される場面を聞いたことがあると思います。意識せずに使っている単語こそ、一度調べてみると意外な発見や学びが見つかって楽しめると思います。個人的には、[ルータ (router) を調べてみたところ](https://youglish.com/pronounce/router/english?)は、アメリカ英語では【ラウター】、イギリス英語では【ルーター】が主流であることが、ささやかながら面白い発見としてありました。

ぜひ活用してみください。
[re:Invent2023 ざっくre:Cap]Keynoteの目玉！Amazon Qって何者？

re:inventの一番大きなKeynoteが実施され、今回の目玉とも言える「Amazon Q」が発表されました！
開発者の体験だけでなく、ビジネスパーソンの悩みやAWSネイティブでない方にも多大なベネフィットがありそうなので、ざっくり概要まとめます！

# Amazon Qとは
 以下が公式に発表された紹介文です。（[こちら](https://aws.amazon.com/jp/q/)から引用）


> Amazon Q は、企業の情報リポジトリ、コード、エンタープライズ システムにあるデータと専門知識を使用して、差し迫った質問に対する関連性の高い回答を迅速に取得し、問題を解決し、コンテンツを生成し、アクションを実行するのに役立ちます。Amazon Q とチャットすると、タスクを合理化し、意思決定を迅速化し、職場での創造性とイノベーションを促進するのに役立つ関連情報とアドバイスが即座に提供されます。


、、、この文章だけを読むと、「とりあえずなんでもできそう」ですよね。
では、具体的にどんなことができるのか、カテゴリごとに分けて見てみましょう。


## For Developer
まずは私たち開発者のベネフィットを見ていきます！

大きく以下のとおりです。
- コンソール上にチャット欄が追加
- エラーのトラブルシューティングをボタン１つで
- IDEに組み込むことで、コード提案を迅速に受けられる

詳細は[こちら](https://aws.amazon.com/jp/q/aws/)の記事からご覧いただけますが、特に私が注目しているのが「コンソール上でのトラブルシューティング」です！

コンソールでリソースを構築している際エラーが発生するのはよくありますが、このエラーに新しく登場する「Troubleshoot with Amazon Q」のボタンをクリックするだけで、トラブルシュート方法の提案を受けることができます！

<img width="1024" alt="image.png (116.9 kB)" src="https://img.esa.io/uploads/production/attachments/1854/2023/11/29/141998/f008694a-5622-49ee-875b-6abd1e7f32ea.png">



## Your business
続いて、ビジネスに役立つ機能を紹介します。
Amazon Qは、ビジネス上の課題に対し、社内のビジネスデータ等から最適な解を対話形式で提案することができます！
社内のビジネスデータは、40を超える外部サービスと接続することでAmazon Qの探索を可能にします。SlackやMicrosoft 365も含まれるので、幅広いユースケースに対応できそうです！

また、情報漏洩など危険性が高いと判断された質問に対しては、Amazon Qは回答を返しません。この辺りのセキュリティ対策もしっかりと行われています！

詳細は[こちら](https://aws.amazon.com/jp/q/business-expert/)からご覧ください。


## Amazon QuickSight
Amazon QuickSightとの統合も発表されました！
こちらでは、データセットに対して自然言語で得たい情報を指示することで、グラフの生成やデータの抽出を行うことができます。

クエリの知識がなくても、サクッと的確なグラフを作成できますね！

詳細は[こちら](https://aws.amazon.com/jp/quicksight/q/)からご覧ください。


## Amazon Q in Connect
Amazon ConnectとAmazon Qの統合も発表されました！
これを使用することで、お客様からの質問に対し、Amazon Qがデータソースから回答や推奨するアクションを提案することができます。
プロンプトを使用してチャットボットの回答や自動音声回答を生成できるので、コーディングなしでヘルプデスクの自動化ができそうです！

詳細は[こちら](https://aws.amazon.com/jp/connect/q/)からご覧ください。

#  最後に
以上、新発表されたAmazon Qをご紹介しました！
セッション中では触れられなかったAmazon Chatbotとの統合などもあり、今後の展開がますます期待できますね！
Rails – NULLは許可するがブランク(空文字など)は禁止するバリデーション

# 例

- presence 指定でブランクを禁止する
- ただし allow_nil で値が nil の場合はバリデーションをスキップする


```rb
validates :foo_attribute, presence: true, allow_nil: true
```


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
今年の振り返りと来年にやりたいこと

# はじめに

:::note info
本記事は、2023 初めてのアドベントカレンダー 1 日目の記事です。
:::

初めてのアドベントカレンダー 1 日目いただきました！🎉
今年作ったアプリやキャッチアップしたこと、来年の目標を書いていきます。

# 自己紹介

- ソフトウェアエンジニア
- 4 年目
- バックエンド
- 好きな言語は、Go
- 好きなお酒は、日本酒
- 好きな言葉は、

  **意識が変われば、性格が変わる**

# 今年作ったもの

- **SYQ**

私の推しであるである山本彩の楽曲の最初のフレーズを当てるゲームです。

https://sy-quiz.t09-blog.com/

- **MH Wordle**

Wordleを真似たモンハン版です。

https://mh-wordle.t09-blog.com

- **MH API**

モンスターハンターのモンスターの情報を取得できるAPIです。

https://github.com/o-ga09/MH-API

- **プロフィールサイト**

私の個人のプロフィールサイトです。

https://t09-blog.com

- **TODO アプリ**

**以下の３言語/ライブラリで作成**

とりあえず、TODOアプリってくらいには、今年は、TODOアプリを作りました。
なお、作っても活用できていない模様。

目標としては、三日坊主な私でも使うことができるTODOアプリを作りたいなと思います。

- Go
- React
- Flutter

# 今年初めて触ったもの

今年は色々触りました。
インプットが主でしたが、楽しかったです。
バックエンド、フロントエンドともに触れてよかったです。

ただ、**Rust**はちょっと難しすぎました。

- **言語**
  - Rust
- **ライブラリ**
  - React
  - ChakraUI
- **フレームワーク**
  - Next.js
  - Flutter
- **インフラ**
  - AWS

# GitHub

https://github.com/o-ga09

# 振り返り

- できたこと

  - TODO アプリを色んな言語、ライブラリ、フレームワークで作った
  - 技術書をいろいろ買ったり
  - オフラインの LT や勉強会、社内、社外問わずに参加した
  - インプットを多くした

---

- できなかったこと
  - 勉強法を確立できず、資格が取れませんでした
  - 収益につながる個人開発ができなかった
  - 爆速開発ができなかった

# 来年の目標

- 個人開発で収益を得る
- 爆速開発をする
- 勉強法を確立する
- アウトプットを多くする
- オフラインの勉強会、LT に参加する
- LT に登壇する

## 目標達成に向けて

- **今年やったこと**

  - CI/CD パイプラインの準備
  - フロントエンドのナレッジの蓄積
  - バックエンド API 構築のナレッジの蓄積
  - 勉強習慣を Notion で管理

---

- **もっとやらなければいけないこと**

  - 定期的な connpass のチェック
  - Qiita、Zenn への投稿頻度を増やす
  - Qiita Organization への投稿頻度を増やす
  - 社内勉強会への登壇

# さいごに

- 来年は、個人開発でも副業でも収益を得る開発がしたい
- 資格を１ヶ月に1つペースで取得する
- Qiitaへのアウトプットを週１投稿する

よろしければ、いいね、フォローよろしくお願いいたします。
STM32G031とMCP3425で電圧を測る3(浮動小数点を使わない)(ハードウェアシリアル出力)


STM32G031とMCP3425で電圧を測る3(浮動小数点を使わない)(ハードウェア_シリアル出力)


x 4PINをOBでGPIO

目的
カラー液晶の開発用
ハードウェア_シリアル出力


![o_cop816.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ac8ee109-2f9f-169f-937f-96f343ffd2c9.jpeg)


![o_cop817.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d33edd93-f0af-0839-9e6b-8f0764458f11.jpeg)


```c++



//mcp3425_to_volts_031_1


//インクルド
#include <Wire.h>


//定義
//MCP3425A0T-E/CHのアドレス
#define ADD 0x68
//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)
//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5


//初期化
void setup() {

  delay(3000); //do not delete

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

  //i2cの初期化
  Wire.setSDA(sdaPin);
  Wire.setSCL(sclPin);
  Wire.begin(); //pa12 pa11

  // 7 *(1)待ち
  // 6 *(0)
  // 5 *(0)
  // 4 (0)ワンショット,*(1)連続
  // 3 | (00)12ビット,(01)14ビット
  // 2 | *(10)16ビット
  // 1 I *(00)x1,(01)x2
  // 0 I (10)x4,(11)x8

  //初期値の書き込み
  Wire.beginTransmission(ADD);
  Wire.write(0b10011000); //16bit 15sps PGA x1
  Wire.endTransmission();
}//setup


//i2cの読み出し 出力は、16BIT
int read_data() {

  //2文字の読み込み
  Wire.requestFrom(ADD, 2);

  //戻し
  return ( (Wire.read() << 8 ) + Wire.read() );
}//read_data


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

  //変換、表示
  //16ビットadcの4ビットの変換テーブル
  char bit4[16][4] =
  { "000" , "062" , "125" , "187" ,
    "250" , "312" , "375" , "437" ,
    "500" , "562" , "625" , "687" ,
    "750" , "812" , "875" , "937"
  };

  int s = read_data();
  //s = ((1654*16)+8); //debug

  int e = (s >> 4);

  int g = '0';
  if      ( e >= 2000 ) {e = e - 2000;g = '2';}
  else if ( e >= 1000 ) {e = e - 1000;g = '1';}

  char str1[9];
  str1[0] = g;
  str1[1] = '.';

  str1[4] = '0' + (e - (DIV10(e) * 10)); e = DIV10(e);
  str1[3] = '0' + (e - (DIV10(e) * 10));
  str1[2] = '0' + DIV10(e);

  str1[5] = bit4[s & 0xf][0];
  str1[6] = bit4[s & 0xf][1];
  str1[7] = bit4[s & 0xf][2];

  str1[8] = 0;

  //表示
  Serial.print(str1);
  Serial.println();

  delay(1000); //1秒待つ
}//loop



```
suとsudoコマンドの違い

# suとsudoコマンドの違い

UNIXやLinux系のシステムで管理者権限が必要な操作を行う際、よく使われるコマンドが`su`と`sudo`です。これらは似ているようでいて、実は異なる機能を持ちます。この記事では、これら二つのコマンドの違いを初心者にも分かりやすく解説します。

## suコマンド

### 概要

- `su`（substitute user）コマンドは、別のユーザーの権限、特にroot（スーパーユーザー）の権限を一時的に借りるために使用されます。
- `su`コマンドを実行すると、指定したユーザー（デフォルトはroot）のパスワードを要求されます。
- このコマンドを使うと、ユーザー環境が完全に切り替わります。

### 使用例

```bash
su - ユーザー名
```

### メリットとデメリット

- **メリット**：特定のユーザーの環境で完全に作業できる。
- **デメリット**：パスワードを知っている必要があり、セキュリティリスクが高まる可能性がある。

## sudoコマンド

### 概要

- `sudo`（superuser do）コマンドは、指定したコマンドをroot権限で実行するために使用されます。
- `sudo`を使うと、現在のユーザーのパスワードで特定のコマンドをroot権限で実行できます。
- システム管理者は`/etc/sudoers`ファイルで、どのユーザーがどのコマンドをsudoで実行できるかを制限できます。

### 使用例

```bash
sudo コマンド
```

### メリットとデメリット

- **メリット**：必要なコマンドだけをroot権限で実行でき、セキュリティリスクを抑えられる。
- **デメリット**：設定が複雑になる場合があり、誤った設定はセキュリティ上の問題を引き起こす可能性がある。

## まとめ

`su`と`sudo`は、どちらも高い権限での操作を可能にするコマンドですが、用途と使い方には大きな違いがあります。`su`はユーザーの環境を完全に切り替えるのに対し、`sudo`は特定のコマンドのみを高い権限で実行することができます。どちらのコマンドも強力なため、使用には慎重さが求められます。安全なシステム管理のために、それぞれのコマンドの適切な使用方法を理解し、適切に活用しましょう。
パーミッション設定の読み方と変更方法（-rw-r--r--）

# パーミッション設定の読み方と変更方法（-rw-r--r--）

UNIXやLinuxなどのシステムでファイル操作をする際、ファイルの権限設定を理解することは非常に重要です。特に、`-rw-r--r--`のようなパーミッション表記はよく見かけるものです。この記事では、この表記の意味と、それぞれの権限がどのように機能するのかを初心者にも分かりやすく解説します。

## ファイル権限の基礎

- **所有者**：ファイルを作成したユーザー。最も高い権限を持ちます。
- **グループ**：特定のグループに属するユーザーたち。
- **その他のユーザー**：システムの他の全てのユーザー。

### 権限の種類

- **読み込み（r）**：ファイルの内容を見ることができます。
- **書き込み（w）**：ファイルの内容を変更できます。
- **実行（x）**：ファイルをプログラムとして実行できます。

### パーミッション表記の解読

- `-rw-r--r--`の表記は、10文字で構成されています。
- 最初の1文字はファイルの種類を表します。`d`はディレクトリ、`l`はシンボリックリンク、`-`は通常のファイルを意味します。
- 次の9文字は、3文字ごとに分割され、所有者、グループ、その他のユーザーの権限を表します。

### `-rw-r--r--`の具体的な意味

- **所有者権限（rw-）**：所有者はファイルを読み込み（r）、書き込み（w）ができますが、実行（x）はできません。
- **グループ権限（r--）**：グループのユーザーはファイルを読み込み（r）のみ可能です。
- **その他のユーザー権限（r--）**：その他のユーザーも読み込み（r）のみが可能です。

## パーミッションの変更方法

システム管理者やファイルの所有者は、`chmod`コマンドを使ってこれらの権限を変更できます。例えば、所有者に実行権限を追加したい場合は、以下のようなコマンドを使用します：

```bash
chmod u+x ファイル名
```

このコマンドは、所有者（u）に実行（x）権限を追加します。

## まとめ

ファイルのパーミッション設定は、システムのセキュリティと効率的なファイル管理のために重要です。`-rw-r--r--`のような表記は、ファイルに対する異なるユーザーの権限を示しており、この基礎を理解することは、UNIX系システムを扱う上で不可欠です。権限設定を適切に行うことで、ファイルのセキュリティを保ちつつ、必要なユーザーにのみアクセスを許可することができます。
UNIXのメイングループとサブグループの違い

# UNIXのメイングループとサブグループの違い

UNIXやLinuxにおけるユーザーアカウントは、複数のグループに属することができます。これらのグループは、ファイルシステムのアクセス権限の管理や、システムリソースの利用において重要な役割を果たします。特に、メイングループ（プライマリグループ）とサブグループ（セカンダリグループ）の違いを理解することは、効果的なシステム管理のために不可欠です。

## メイングループ（プライマリグループ）
- **定義**: ユーザーがログインした際に自動的に割り当てられるグループです。ユーザーごとに1つのメイングループが設定されます。
- **役割**: ユーザーが新しいファイルやディレクトリを作成したとき、それらの所有グループはデフォルトでメイングループに設定されます。
- **設定方法**: ユーザーアカウントの作成時や、`usermod`コマンドを使用して後から変更することができます。

## サブグループ（セカンダリグループ）
- **定義**: メイングループ以外にユーザーが所属できる追加のグループです。ユーザーは複数のサブグループに属することが可能です。
- **役割**: ユーザーが特定のファイルやディレクトリにアクセスするための追加の権限を提供します。これにより、異なるプロジェクトや部署間でのリソース共有を容易にします。
- **設定方法**: `usermod`コマンドを使用して、ユーザーをサブグループに追加します。

## まとめ
UNIX系システムにおけるメイングループとサブグループの概念は、ユーザーの権限管理において重要な役割を果たします。メイングループはユーザーごとに1つだけ設定され、新しく作成されるファイルやディレクトリのデフォルトのグループとなります。一方で、サブグループはユーザーが追加的に属することができるグループで、さまざまなリソースへのアクセス権限を拡張します。これらのグループを適切に管理することで、システムのセキュリティを強化し、柔軟なリソース共有が可能になります。
【React】Objects are not valid as a React child.エラーの対処法

## 環境

- React version18
- CodeSandBbox

## エラーの内容

Reactの[公式チュートリアル](https://ja.react.dev/learn/tutorial-tic-tac-toe#inspecting-the-starter-code)を試していたところ、以下のエラーが出た。


> Error
Objects are not valid as a React child (found: object with keys {value, onSquareClick}). If you meant to render a collection of children, use an array instead.

機械翻訳は以下の通り。

> オブジェクトは React の子として有効ではありません (見つかった: キー {value, onSquareClick} を持つオブジェクト)。子のコレクションをレンダリングする場合は、代わりに配列を使用してください。

## 仮説

まず、エラーで指摘されている`{value, onSquareClick}`が書かれている箇所を探した。
すると、`{}`がないものの、子コンポーネントへのpropsとして`value, onSquareClick`を渡していた。

```react:App.js
<Square value={squares[0]} onSquareClick={handleClick} />
```

```react:Square.js
export default function Square(value, onSquareClick) {
  return (
    <button className="square" onClick={onSquareClick}>
      {value}
    </button>
  );
}
```

エラーの`Reactの子として有効ではない`という文言から、子へのpropsの渡し方が誤っていると推測。

## 解決

試しに`{}`をつけて`{value, onSquareClick}`としてみたところ、エラーは解消された。

```react:Square.js
export default function Square({value, onSquareClick}) {
  return (
    <button className="square" onClick={onSquareClick}>
      {value}
    </button>
  );
}
```

そこで思い出したが、**propsを複数渡すときはオブジェクトのまま渡すか、必ず`{}`で囲んで分割代入しなければならなかった**。

`{}`で囲まずに`value, onSquareClick`としていたせいで、エラーで`(複数の引数を渡したいなら)配列を使って1つにまとめたら？`と指摘されていたのかもしれない。

## おわりに

Reactを始めてまだ3日目なので、エラー文はかなり推測して解釈しています。
誤りがあればぜひ教えていただきたいです！よろしくお願いいたします。

## 参考資料

- [公式：コンポーネントに props を渡す](https://ja.react.dev/learn/passing-props-to-a-component)
- [モダンJavaScriptの基礎から始める挫折しないためのReact入門](https://www.udemy.com/course/modern_javascipt_react_beginner/)
コマンド操作の超基本(コマンド11選と関連基礎情報)

# コマンド操作の超基本(コマンド11選と関連基礎情報)

UNIXやLinuxシステムは、コマンドラインインターフェースを使って操作されます。効率的に作業するためには、基本的なコマンドを理解することが重要です。ここでは、UNIX環境での作業に役立つ基本コマンドを10選挙げ、それぞれの使用方法と機能を詳細に解説します。

## 基本コマンド

### ① ファイル作成: `touch`
- **使用方法**: `touch ファイル名`
- **説明**: `touch` コマンドは新しい空のファイルを作成するのに使用されます。既存のファイルがある場合は、その更新日時を現在の時間に変更します。

### ② ファイルの中身表示: `cat`
- **使用方法**: `cat ファイル名`
- **説明**: `cat`（concatenateの略）コマンドはファイルの内容をコンソールに出力します。複数のファイルを連結して表示することもできます。

### ③ ディレクトリの作成: `mkdir`
- **使用方法**: `mkdir ディレクトリ名称`
- **説明**: `mkdir` コマンドは新しいディレクトリを作成します。複数のディレクトリを同時に作成することも可能です。
- `-p`オプションで同名ファイルが存在してもエラーを出さず強制的に作成する
- `-v`オプションで作成した際、作成完了のメッセージを表示する

### ④ ディレクトリの移動: `cd`
- **使用方法**: `cd ディレクトリ名`
- **説明**: `cd`（change directoryの略）コマンドは、ユーザーを指定したディレクトリに移動させます。`cd ..` は一つ上のディレクトリに移動し、`cd` のみでホームディレクトリに戻ります。

### ⑤ カレントディレクトリの確認: `pwd`
- **使用方法**: `pwd`
- **説明**: `pwd`（print working directoryの略）コマンドは、現在作業中のディレクトリの完全なパスを表示します。

### ⑥ ディレクトリの中身確認: `ls`
- **使用方法**: `ls`
- **説明**: `ls` コマンドは、現在のディレクトリにあるファイルやサブディレクトリの一覧を表示します。オプションを使うことで、詳細な情報や隠しファイルも表示できます。
- `-a`オプションを用いて隠しファイルの表示も可能
- `-l`オプションを用いて、ファイルやディレクトリの種類、パーミッション、所有者、サイズ、作成日時などの表示も可能です。

### ⑦ ファイルやディレクトリの移動: `mv`
- **使用方法**: `mv 移動させたいファイル 移動先ディレクトリ（既存で存在するディレクトリ名）`
- **説明**: `mv` コマンドは、ファイルやディレクトリを別の場所に移動するか、名前を変更するのに使われます。ディレクトリを移動する場合は `-r` オプションが必要です。

### ⑧ ファイルやディレクトリの名称変更: `mv`
- **使用方法**: `mv 変更前名称 変更後名称（既存で存在しない名前）`
- **説明**: `mv` コマンドは、ファイルやディレクトリを別の場所に移動するか、名前を変更するのに使われます。ディレクトリを変更する場合は `-r` オプションが必要です。変更後の名称を移動先と一緒に設定することも可能`mv before.txt ../after.txt`

### ⑨ ファイルやディレクトリのコピー: `cp`
- **使用方法**: `cp コピー元名称 コピー先名称`
- **説明**: `cp` コマンドはファイルまたはディレクトリをコピーします。ディレクトリをコピーするには `-r` オプションを使用します。

### ⑩　ファイルの削除: `rm`
- **使用方法**: `rm 削除したいファイル名`
- **説明**: `rm` コマンドはファイルを削除します。ディレクトリを削除する場合は `-r` オプションが必要です。
- ゴミ箱のように削除後復元することは出来ない

### ⑪　空のディレクトリを削除: `rmdir`
- **使用方法**: `rmdir 削除したいファイル名`
- **説明**: `rmdir` コマンドは空のディレクトリを削除します。サブディレクトリが存在する場合は削除されません。

### ⑫表示or追記or上書き: `echo`
- **使用方法**: `echo 表示したい内容`
- `echo 追記内容 >> ファイル名`
- `echo 上書き内容 > ファイル名`
- **説明**: ファイルの内容をCommandから上書きしたり追記します。

## ディレクトリの種類

- **カレントディレクトリ**: 現在作業中のディレクトリ。
- **ホームディレクトリ**: ユーザーの作業の起点。
- **ルートディレクトリ**: システムの最上層に位置するディレクトリ。

## 相対パスと絶対パス

- **相対パス**: カレントディレクトリを基準に設定するパス(/から初めなくて良い)
- **絶対パス**: ホームディレクトリを基準に設定するパス(~/から始める)

## ショートカットキー

- **Tabキー**: コマンド名やファイル名の自動補完に使用。
- **上下矢印キー**: コマンド履歴を参照。
- **Ctrl+L**：画面がクリアされて1行目だけが表示される
- **Ctrl+C**：実行中コマンドの終了

UNIXコマンドを理解することで、効率的な開発環境を構築し、作業の速度を大幅に向上させることができます。これらのコマンドは、日常的な操作に欠かせないツールです。練習を重ね、これらの基本コマンドを完全にマスターしましょう。
スキマ時間でG検定に合格した感想

## はじめに
2023年11月10(金)に行われた、
JDLA Deep Learning for GENERAL 2023#5(G検定)に合格することができました。

タイトルにもある通り、通学やバイトの空き時間、いわゆる「スキマ時間」を使うことで合格することができました。

普段研究室で、机でPCを触っていることもあり、それ以外の時間で机に向かって勉強するのは苦手です。
今回の勉強に使った時間は9割9分「スキマ時間」です。机に向かったのは試験本番くらいです。

今回の受験に当たって、自分の情報は以下の通りです。

・電気関係の学部所属4年生で、教養数学として線形代数、微積分を履修
・深層学習、機械学習に関して授業を受けたのは、3年後期(去年12月頃)の講義で少し触れた時のみ
・去年の今頃にG検定の事を知り、情報収集を始める

今年3月から深層学習を扱う研究室に所属していますが、画像分野中心で、**自然言語分野や強化学習などは独学**です。

何をどれくらい勉強したのか、学んだ事を備忘録として記させて頂きます。

## G検定で使った参考書・サイト
まず、「Ｇ検定　勉強法」などで検索して沢山出てきたサイトが出てきます。
サイトの8割は「**公式対策本で勉強**」が1番良いと書いてあったので、いわゆる「白本、赤本」と呼ばれるものを購入し、勉強に用いました。

>【白本】深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト

知識のインプットに使いました。
おすすめは、用語同士の繋がりを**マインドマップや樹形図のようにイメージできるように勉強**することです。
**浅く広く勉強**することも大事だと思います。

まず1周して赤本に入り、また戻り・・・の繰り返しで学習しました。

最後の章末問題は最初は飛ばしてもいいと思います。自分は最初飛ばしました。

https://www.amazon.co.jp/dp/B08XZDJDH2?tag=ukatta-22&linkCode=ogi&th=1&psc=1


>【赤本】最短突破 ディープラーニングG検定(ジェネラリスト) 問題集

問題演習に使いました。どこのサイトにも書いてありますが、**過学習しすぎない**ことが大事です。なぜこの解答なのかを考え、**汎化性能**を上げることをおすすめします。

**解けなかったり、偶然正解した所**を付箋しておき、2周目はその部分のみ勉強します。

白本にもない用語があるので(詳しさ的には白本ですが)、**最後の索引をA〜Z, あ行〜わ行まで読み、わからない用語に付箋をする**という方法を取りました。

https://www.amazon.co.jp/dp/4297129264?tag=ukatta-22&linkCode=ogi&th=1&psc=1

> G検定（AI・機械学習）用語集

白本を読んでもわからない所が出てくると思うので、そんな時はこのサイト...という感じでは無く、その逆で使っていました。　
**Ｇ検定で覚える用語が浅く広く解説**してあります。
電車で、付箋も本も開く暇が無い時などはこのサイトで、用語を説明できるか脳内で考えて、理解が曖昧なら覚え直す、という感じで利用していました。

理解が曖昧な用語が現れた時には、ChatGPTに聞くのもおすすめです。

https://zero2one.jp/ai-word/


## どれくらい勉強したか・どのように勉強したか
知識のインプット、問題演習合わせて大体100時間程勉強しました。

バイトでの休憩時間に赤本、白本を行い、
電車での通学時間で[先程のサイト](#https://zero2one.jp/ai-word/)や、「Ｇ検定　用語集」で調べて出てくるサイトを適当に読んでいました。
これを約1年間続けて行い、約100時間程の総勉強時間になります。

もちろん、休憩時間や通学時間で必ず毎回勉強してるわけでもなく、5回に1回(週に2,3時間)くらいの感覚です。

なぜスキマ時間で合格できたかを考えると、**雑音環境で勉強したことで集中力が付いた**のと、**継続的な勉強をしたことで無理なく覚えられた**ことが良かったのではないかと思います。あとは、**インプットとアウトプットの繰り返しにより、どんな問題が出るか考えながら勉強できたこと**が良かったと思います。

勉強する時に考えていたこととしては、上にも書いたのですが、**用語そのものや問題の解答を覚えるのでは無く、マインドマップや樹形図のように、ある用語から他の用語との繋がり、関係**を脳内で考えていました。

また、イメージとしては、「知識欲に従う」みたいな感じで勉強していました。
自分はハッカソンなどでアプリ開発経験があるので、「**深層学習で解ける社会問題**は何なのか」「**どのように**深層学習を使うか」「**著作権は大丈夫か**」などの部分について興味を持って勉強を行っていました。

## 試験後の感想
[シラバス](#https://www.google.com/url?q=https://www.jdla.org/download/g-syllabus_2021/&sa=U&ved=2ahUKEwjeop3CwueCAxW7l1YBHYnvDUsQFnoECAoQAg&usg=AOvVaw3ujoZTKLCVQN4cAw1r7eoQ)内で言うと、最初の人工知能辺りの分野よりもディープラーニングの概要辺りをもう少し勉強しておくべきだったと思いました。
全体で言うと、一応試験中でもインターネット検索できるのですが、**問題文は用語同士の繋がりのような部分**を問われることが多く、**調べても文章を隅々まで読まないと出てこず**時間が無くなってしまいます。
なので、散々書いた通り、用語よりも用語同士の繋がりを覚えるほうが試験で検索する時間を削減できます、
難易度としては、赤本をやっておけば大丈夫だと思います。
SQLの基本構文と使用上の補足情報15選

# SQLの基本構文と使用上の補足情報15選

SQL（Structured Query Language）は、データベースの操作に不可欠な言語です。この記事では、SQLの基本構文と役立つ補足情報を15項目に分けて解説します。これにより、データベースの操作がより効率的かつ効果的に行えるようになります。

## 1. SELECT文の基本と補足
SELECT文はデータベースからデータを取得するために使用されます。
- `SELECT <カラム名>`: 特定のカラムを取得します。`*`を使用すると、全てのカラムが選択されます。
- `DISTINCT(カラム名)`: 重複なしでデータを取得します。
- 四則演算: カラムに対して四則演算を行い、結果を取得できます。
- 集計関数: `SUM()`, `AVG()`, `COUNT()`, `MAX()`, `MIN()`などの関数を使用して、合計、平均、個数、最大値、最小値を計算できます。
- `AS "エイリアス"`: カラム名を任意の名前（エイリアス）に変更できます。
- `テーブル名.カラム名`: JOINしたテーブルに同じ名前のカラムがある場合、テーブル名を指定してカラムを区別します。

## 2. FROM句
- `FROM <テーブル名>`: 取得対象のテーブルを指定します。

## 3. WHERE句と補足
- `WHERE カラム名 = "値"`: 特定の条件に合致するレコードのみを取得します。
- `LIKE`: 部分一致検索が可能です。`%`を使用してワイルドカード検索もできます。
- `NOT`: 条件の否定形で絞り込みが可能です。
- サブクエリ: WHERE句内でサブクエリを使用できます。
- `IS NULL`: `NULL`値の検索には`IS NULL`を使用します。

## 4. AND/OR句
- `AND/OR`: 複数の条件を組み合わせて使用できます。

## 5. ORDER BY句
- `ORDER BY カラム名 ASC/DESC`: 指定したカラムを基準に、昇順（ASC）または降順（DESC）で並び替えます。

## 6. LIMIT句
- `LIMIT 数値`: 取得するレコードの数を制限します。

## 7. GROUP BY句とHAVING句
- `GROUP BY カラム名`: カラムの値が同じレコードをグループ化します。
- 複数個のカラムを通してグループ化することも出来ます。
- `SELECT`では集計関数または`GROUP BY`で指定したカラムのみ選択可能です。
- `HAVING 条件式`: GROUP BYでグループ化された後のレコードに対して、条件を指定します。

## 8. JOIN句
- `JOIN <テーブル名> ON 条件式`: 他のテーブルと結合します。外部キーがNULLのレコードは結合されません。
- `LEFT JOIN`: 外部キーがNULLのレコードも含めて結合します。

## 9. 追加（INSERT）
- `INSERT INTO <テーブル名> (<カラム名>) VALUES ('値')`: 新しいレコードを追加します。

## 10. 更新（UPDATE）
- `UPDATE <テーブル名> SET <カラム名>='値' WHERE 条件`: レコードの内容を更新します。WHERE句がない場合は全レコードが更新されます。

## 11. 削除（DELETE）
- `DELETE FROM <テーブル名> WHERE 条件`: 指定した条件に合致するレコードを削除します。WHERE句がない場合は全レコードが削除されます。

これらの基本的なSQLコマンドと補足情報を理解し活用することで、データベースの操作がより柔軟かつ効率的になります。SQLはデータを管理する上で非常に強力なツールですので、これらのコマンドを習得することはデータベース操作の基礎となります。
VirchalBoxをWifiでも使えるように

# 概要
喫茶店でwifiをつなごうと思った時にTeratermにつなげなくて困ったことがある。
そのため、有線ではなく`wifiでVirtualBox`を使える方法を紹介したい

# なぜ繋げなかったか
MACアドレスが被っていたから

# 解決方法
1.VirtualBox マネージャーの設定－ネットワークを開く
※アダプター1はNAT
![vir1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329178/d9767a19-6d3a-87be-e278-5aaa8877f40b.png)

2.MACアドレスの項目の右端の更新マークをクリックする
※アダプター2はブリッジアダプターで「Wireless･･･」を選択する

![vir2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329178/86a17dc1-4dc0-b321-029d-9484f9a45dfd.png)

これで割り当てられたIPが表示される
monorepo-symlink-testの、脆弱性警告に関する対処法(※スキャナーの偽陽性パターン)

# 問題について

Reactで作成していたプロジェクトをAWS fargateでホスティングしようとした際に
```
node_modules/resolve/test/resolver/multirepo/package.json
```
にある、monorepo-symlink-testというパッケージが脆弱性を持つのでスキャナー(Snyk cloud-native security scanner)から警告が発生したという問題に関する記事になります

# 原因
[monorepo-symlink-test](https://security.snyk.io/vuln/SNYK-JS-MONOREPOSYMLINKTEST-5865510)というパッケージ(すでにnpmからは削除済み)と、今回警告が出されている[resolve](https://github.com/browserify/resolve)のプライベートパッケージが偶然同じ名前であったため。おおお...

# 解決方法
2023/10/11に[名前の修正](https://github.com/browserify/resolve/commit/c24f45137a441bc7bf6723b34f8db5ea5ddcacfa)がされました、修正者の名前が先頭に追加されてるのが面白いですね。つまり、10/11以前に作られたものはこの問題に当たる可能性があります。

node_modulesを最新状態にすればいいので、まずnode_modulesとpackage-lock.jsonファイルを削除
```shell
$ rm -rf node_modules
$ rm package-lock.json
```
package.jsonの依存関係を最新化(管理者実行)
```shell
$ sudo npm install -g npm-check-updates
$ sudo ncu -u
```

改めてnode_modulesとpackage-lock.jsonの作成
```shell
$ npm install
```

これで"monorepo-symlink-test"が"ljharb-monorepo-symlink-test"になるかと思います！

## 余談
この問題はいわばスキャナーの問題で、開発のボトルネックになる要因の一つですね。今回は名前を変更して対処していますが、このようなスキャナーの短所を解決するのが根本的な解決だけれども、今回のような問題がマイナーなケースだとしたら一般的には興味が持たれないのかも
Gem追加したときの「まずはinstallコマンド実行してね」を見ていく

# 概要
Gemのファーストコミットをするタイミングがあり、既存のGemでは「初期設定コマンド実行してね。みたいなのがあるけれどどうやってやるのか」と見ていて、少しまとめたので書いておきます

ほとんどが [Railsガイド](https://railsguides.jp/v7.1/generators.html) に書いてある内容なため、初心者向けの記事となっています :pray:

## generate initializer
> 「初期設定コマンド実行してね。みたいなのがあるけれど...
これはアプリケーションにGemを追加したときに初期設定をアプリケーション側に記載する場合、Gem側からジェネレーターが提供されていることがあります

ここでは認証のgemとして使用する `devise` を例に取って確認してみます

### deviseの例
deviseのREADMEに書いてある通り下記のコマンドでdeviseの初期設定を行うと`config/initializers`配下に`devise.rb`が作成されます

```sh
$ rails generate devise:install
```

このコマンドを実行すると `lib/generators/devise/install_generator.rb` にあるメソッドが上から順に実行され、初回の`copy_initializer`内にて下記の記述があり

Gem側に存在する`lib/generators/templates/devise.rb`ファイルを
アプリケーションの`config/initializers/devise.rb`へコピーしています

```ruby:lib/generators/devise/install_generator.rb
template "devise.rb", "config/initializers/devise.rb"
```

そのため、deviseの設定をアプリケーション側で用意に変更ができます

### 実際に試してみる
deviseの例で出てきたgeneratorを作成するためのgenerateコマンドを実行します

```sh
$ rails generate generator initializer
      create  lib/generators/initializer
      create  lib/generators/initializer/initializer_generator.rb
      create  lib/generators/initializer/USAGE
      create  lib/generators/initializer/templates
```

実行すると上記の結果となり
- lib/generators/initializer
  - ディレクトリ
- lib/generators/initializer/initializer_generator.rb
  - コマンド実行時にアプリケーション側で実行させたい処理
  - ex. config/initilizers配下に設定ファイルを作成する
- lib/generators/initializer/USAGE
  - 使用方法のドキュメント
- lib/generators/initializer/templates
  - initializer_generatorから呼ばれるテンプレートの保存場所

deviseの例だと下記のコマンドでコンフィグファイルを生成していましたが、`InitializerGenerator`を利用しているので少しコマンドが異なります
```sh
# deviseの場合
$ rails generate devise:install

# 今回の例
$ rails generate initializer [Gemの名前]
```

基本的にはドキュメントに沿ったinitializerで作成するので良いと思います

https://railsguides.jp/v7.1/generators.html

## sample code

アプリケーションの役割として名ばかりのblogというディレクトリと
Gem側としてlistableというディレクトリを用意しました

listable側にはinitialierを生成する処理を作成していますので
アプリケーション側で`rails generate initializer listable`を実行し、initializerファイルが作成されてアプリケーション側からGemの設定した値を覗いてみると「default」であることが確認できます

```sh
$ docker compose run --rm web bundle exec rails generate initializer listable
      create  config/initializers/listable.rb

$ docker compose run --rm web bundle exec rails c
Loading development environment (Rails 7.1.2)
irb(main):001> Listable.sample_attribute
=> "default"
```

この状態で`config/initializers/listable.rb`のコメントを外して再度実行すると「changed」に変更されている事を確認できます

```ruby: config/initializers/listable.rb
Listable.configure do |config|
  config.sample_attribute = 'changed'
end
```

```sh
$ docker compose run --rm web bundle exec rails c
Loading development environment (Rails 7.1.2)
irb(main):001> Listable.sample_attribute
=> "changed"
```

サンプルコードはこちらに載せています

https://github.com/yothio/sample_gem_initialize_generator

## まとめ
あまりGemのinitializerなどを作成する機会はありませんでしたが既存の挙動がどうなっているのかを確認するよい機会となりました。
今回はinitializerだけをとりあげたものの、独自のgeneratorを作成するのはGemにかかわらずアプリケーション側でも行うことでより開発を加速させることができそうだと思うのでそのあたりも機会があれば見ていきます :dash:

## 引用・参照
https://railsguides.jp/v7.1/generators.html

https://github.com/heartcombo/devise
[Vim記録 part1]　新しく名前をつけて保存

# 編集する前にコピーするのはめんどくさい
Terminalにおけるテキスト編集の際には、ファイルをコピーしてバックアップをとった後に編集するのが常識だと思います。ただ、めんどくさいなと感じた時がありまして、その時のやり方が楽だったので記録します。

# `:w`によって「新しく名前をつけて保存」をする
やり方は標記の通りなんですけども、一応説明します。
まず、`vim FILE_NAME`でファイルを開きます。`Vim`の画面に移動して、編集します。その後、`:w NEW_FILE_NAME`とすれば、NEW_FILE_NAMEという名前で新しく保存できます。
保存後、`:q!`でエスケープすれば編集前のFILE_NAMEと編集後のNEW_FILE_NAMEがディレクトリに残ってるはずです。

以上です。本当はコピーしてから編集すべきですが、僕みたいな横着者向けのやり方を紹介しました。
いやー、`:`って便利ですね。今後も記事を作っていきます。
ひろゆき氏が投稿していた積分の問題について解いてみた

# はじめに

QiitaでMathJaxが使えたことを思い出したので、ひろゆき氏が出していた問題で練習してみます。

# Who am i ?

しがないエンジニアです。普段は資格の合格体験記などをベースに投稿しています。

# 本題

頭の体操だと思って、こちらの問題について解いてみました。（たぶんあっているはず。）

https://getnews.jp/archives/3461779/hirox20231119

※元ネタはひろゆき氏の投稿です。

上記で出てくる積分を解いてみました。まず与式$(*)$は被積分関数を展開してみると、積分の線形性により2つにばらせます。

```math
\begin{align}
&\int_{-2}^{2} \left(x^3 \cos \left(\frac{x}{2}\right) + \frac{1}{2}\right)\sqrt{4-x^{2}}~dx\cdots(\ast) 
\\
&=\underbrace{\int_{-2}^{2} \left(x^3 \cos \left(\frac{x}{2}\right)\right)\sqrt{4-x^{2}}~dx}_{(1):~\text{前半の積分}}
~+~
\underbrace{\frac{1}{2} \int_{-2}^{2} \sqrt{4-x^{2}}~dx}_{(2):~\text{後半の積分}}
\end{align}
```
以降では、$(1)$を前半の積分、$(2)$を後半の積分と呼ぶことにします。

ここで、後半の積分は原点中心で半径が$2$の円の面積の半分に$\frac{1}{2}$を掛けたものだから簡単に求められますので、下の式より$\pi$であることがわかります。

```math
\begin{align}
    \frac{1}{2} \int_{-2}^{2} \sqrt{4-x^{2}}~dx=\frac{1}{2}\left(\pi\times2^2 \times \frac{1}{2}\right)=\pi
\end{align}
```

また、前半の積分の被積分関数をよく観察すると、被積分関数が奇関数であることがわかります。
```math
\begin{align}
f(x):&=x^3 \cos \left(\frac{x}{2}\right)\sqrt{4-x^{2}}
\\
f(-x)&=(-x)^3 \cos \left(\frac{-x}{2}\right)\sqrt{4-(-x)^{2}}=-x^3 \cos \left(\frac{x}{2}\right)\sqrt{4-x^{2}}
\\
&=-f(x)
\end{align}
```
よって前半の積分については$0$であることがわかります。

以上より、
```math
\begin{align}
(\ast)=(1)+(2)=0+\pi=\pi
\end{align}
```
が$(\ast)$の値ですね。私は前半の積分については気づかないとたぶん解けません。。

積分の値の最初から10桁がwifiのパスワードになっているとのことなので、$\pi$の最初から10桁がパスワードに該当するということでしょうか。小数点以下からなのか3を含めるのか何とも言えないところではありますが。
```
3.1415926535
```

# 補足

前半の積分については、変数変換（置換積分）などを試してみましたが、思うような答えが出ませんでした。被積分関数が奇関数と気づけば簡単ですね。

ChatGPTでも同じような解法を提案されました。

![ChatGPT_int.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227947/b61e9af8-3476-e17d-9786-56d837030dd9.png)


# 最後に

おそらく上記が一番手っ取り早い解法だと思います。他の解法もあれば知りたいところです。
Proxmox リセラー事業を半年やった記念ポエム

## TL;DR

- Proxmoxにだけ詳しければいいと思っていたけど、そんなことはなかった！
- 事業として収支を上げるのは大変！
- 今後の目標

## 初めに

今年の７月から以下の通りProxmoxの日本国内リセラー事業を始めました。
だいたい半年、ハーフアニバーサリーなのでやってみて色々思ったことをポエムにします。

https://qiita.com/oishi-d/items/d7594492fc4113949838





## 技術的なこと

### アーリアダプターの技術力は高すぎる！

アーリーアダプターとは以下です。
※ChatGPTからの引用。

```
「アーリーアダプター」とは、新しい技術や製品を早期に受け入れ、使用する消費者やユーザーを指す言葉です。
この用語は、新しい技術や製品の市場導入の初期段階において、早くからそれらを採用する人々を特定するために使われます。
アーリーアダプターは通常、技術に対する高い関心を持ち、新しいアイデアや製品にオープンであり、それらを試すためのリスクを取る傾向があります。
彼らはしばしば意見リーダーとして見なされ、新しいトレンドや製品の普及において重要な役割を果たします。
```

現時点で仮想化・HCI製品としてのシェア・認知度が高くはないProxmoxを、有償テクニカルサポートを受けて利用検討している方は、まずアーリアダプターと言えると思います。

`アーリーアダプターは通常、技術に対する高い関心を持ち～`とある通り、技術的なことにとても明るい。
打合せの内容が毎回ディープすぎて、話についていくだけでも精いっぱいです。

特に既存の仮想基盤からProxmox移行というケースが多く、移行元の製品に関する知識のニーズが大きいと感じます。
また、セールスをするにあたり業界動向等にも意識を向ける必要があります。

**Proxmoxにだけ詳しければいいと思っていたけど、そんなことはなかった…**

そしてProxmoxはOSSですので、既にユーザー側で利用しており基本的な知識は充足していることも多く、Proxmoxの知識もより要求されるという状態です。

## 事業的なこと

### いい製品は儲かる、というわけではない。

Proxmoxのリセラー事業をやろうとしたきっかけは、社内システムで利用してみて「この値段でこの機能・性能なの？めっちゃいいじゃん！」と思ったからです。

計画時点でも消費者目線で喜んでいたのですが、会社の決算期をまたぎ真面目に収支予測をしてようやく、「お買い得すぎて売っても利益が残らないぞ？」と販売者目線になりました…

### 広告関連は鶏卵感！

広告を出さないと売上が上がらないけど、売上がないと広告を出すお金がない！
まさに鶏が先か卵が先か状態です。

弊社ではGoogle広告を出しています。
当初、予算は経営層判断（なんとなく）で月10万円としていたのですが、年120万の支出はかなり大きく、月1万まで削減しました。
もちろん根拠はあり、コンバージョン単価が高かったからです。

ちなみに月1万だと1日1,2クリックで予算を使い切ってしまうのでいたずらにクリックしないようにお願いします…

コスト効果の高い広告などのマーケティング手法を模索中です…

### 人件費も厳しい！
現時点で流行していない点を商機とした事業です。
そのため、本業のSES事業を通じてProxmoxに触れる機会は皆無。

別途技術的な検証をするするのであれば、それは人件費に…
では従業員の自助努力にフリーライドすれば労働倫理的にアウト。

~~でぇじょうぶだ、経営層がいる！（経営層は稼働しても収支上ノーカウントなので）~~


## 今後の目標

### シルバーパートナーを目指そう

１年目の目標としては、[パートナーシステム](https://www.proxmox.com/en/partners/explore)のリセラーパートナーのシルバーパートナーを目指して頑張ろうと思います。

シルバーパートナーになればディスカウントが受けられ、事業としてもより安定するので。

### 日本のProxmoxコミュニティ活動

[本家のコミュニティ](https://forum.proxmox.com/)活動は活発なのですが、日本でのProxmoxコミュニティはまだない認識なので、どのような形か検討もしてないですが、何か出来たら楽しいだろうな…と思っています。


## 参考

https://www.proxmox.com/en/

https://forum.proxmox.com/

https://proxmox.classact.co.jp/
Upsertについて

:::note
**Upsertとは**
INSERT文を実行する際、すでにデータが存在すれば UPDATEを実行し、なければそのままINSERT文を実行する
:::

### 利用ケース
##### データの同期
外部のデータソースからデータベースにデータを同期する場合、Upsert操作によって既存のレコードを更新し、新しいレコードを追加することができる。

##### 効率的なバッチ処理
多数のレコードを処理する際に、各レコードを個別にチェックして更新または挿入するのではなく、Upsertを用いることで効率的に処理を行うことができる。

参考

https://resanaplaza.com/2023/01/22/%E3%80%90%E7%B7%8F%E3%81%BE%E3%81%A8%E3%82%81%E3%80%91upsert%E3%81%A8%E3%81%AF%EF%BC%9Fdb%E3%81%94%E3%81%A8%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%EF%BC%9F/