OmniAICreator/Qiita-1.07M huggingface dataset:
[Bardに聞く]VS CodeではじめてのWEBスクレイピング

Qiita初投稿です^^

WEBスクレイピングをやろうとして
折角なのでGoogle Bardに聞いてみました。
https://bard.google.com/

# Bardへの質問と回答
「Visual Studio CodeでPythonを使用してWebスクレイピングを行う手順を教えてください」
![01_bard_cut_up.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/972909/c3617bc2-e049-5967-68e6-43c639165d9d.png)
~~~
import requests
from bs4 import BeautifulSoup

url = 'https://www.google.com/'

response = requests.get(url)

soup = BeautifulSoup(response.content, 'html.parser')

title = soup.find('title').text

print(title)
~~~
![01_bard_cut_ft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/972909/16a1a267-8456-32ae-cc4b-b69d23ade27b.png)

Bardが書いてくれたpythonコードを貼り付け、ファイル保存（拡張子.py）

# トラブル
不足手順があります。
VS Codeを新規インストールする手順ですが、ライブラリのインストールが行われていません。

~~~
# VS Code内のTerminalを開き、下記pipコマンドを実行

# HTTPリクエスト
pip install requests
# WEBスクレイピングを行うBeautiful Soup4
pip install bs4
~~~

上記を実行してもPROBLEMSペインに`Import "requests" could not be resolved from source`が表示され、解決しませんでした。

そこで予定を変更し、第１稿はトラブルシューティングがメイン課題となってしまいました！^^
VS Codeをインストールしたら、最初に設定すべきは下記だと思います。

VS Codeのターミナルを「選択でコピー」「右クリックで貼り付け」の設定に変更する
https://qiita.com/MtDeity/items/9382a992dbac0548b5a0

`pip uninstall requests`を実行してから、再度installしました。
解決しませんでした。
ところがターミナル内で
`python C:\***\WEB_scraping\01_bard_out_code.py`
を入力して実行すると、実行できてしまうのです。
これはVS Codeが実行に使用するPythonとVS Codeのターミナルが使用するPythonが別物になっているに違いありません。
ターミナルで
`python -c "import sys; print(sys.executable)"`
を実行してみます。
`C:¥***\anaconda3\python.exe`
が使用されているようです。
.pyコードとして実行してみます。
面倒なので実行コードを'''で括ってコメントアウトし、そのままのファイルに
`import sys; print(sys.executable)`
を書き、実行ボタンを押します。
`C:\***\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.10_***\python.exe`
でした。
VS Codeのsettings.jsonで変更します。
~~~
{
    "python.defaultInterpreterPath": "C:\\***\\anaconda3\\python.exe"
}
~~~
先程の.pyコードをそのまま実行して
`C:¥***\anaconda3\python.exe`
が表示されました。

この問題は私の環境設定でanaconda3フォルダにパスが通っているため発生しているので
動こうとしていたPythonSoftwareFoundationのフォルダにパスを通してpip installしてももちろん動くはずです。
VS Code的に、場所の見つけ方など正しい手順が他にありそうな気がしますが一旦放置します。
こういったトラブルシューティングも、検索ではなくChatGPTやBARDでやるようになるのでしょうね。

# 解決後
実行コードを元の内容に戻して実行し、「Google」が表示されることを確認します。

「VS Codeで」とした目的はPythonのデバッグ実行環境を構築するためですので、デバッグ実行も試してみます。

では、当初の目的であるWebスクレイピングができたので、次に進みます。

→【次稿】[Bardに聞く]WEBスクレイピングで子ページにある情報を検索
　https://qiita.com/ginger_ale/items/2ae4cbc1679ad2e87c69
【もうすぐ梅雨】なかなか進まずじめじめして蚊に刺され始めたので夕ご飯醸してみた

Quiitaに書きたい記事も、勉強して解読可能な文面で残したい内容も、全然記載ができず、来月からの勤務地も決まらず、然るべくして穿つが上がらない~~音ゲーとピッコマと駅メモをループしてしまう~~日々。
そして通路になぜか存在する排水路たちから湧き上がってくる弱々しい虫どもがドアの両面に配置した虫コナーズ&置くだけタイプの虫コナーズをあまりにも弱々しそうにすり抜け、小生の腕あたりに漂ってくるのだがしかし。
普通にティッシュでつまめるんだ。
蚊たちに伝えたい。
__蚊たちよ。よくぞここまで辿り着いた。我こそがラスボスじゃ。
一つだけ伝えたい。せめてすり抜けてくるならもっと勇ましくあろう。もし無理そうなら大人しく虫コナーズされよう。__
何はともあれサラテクト買わないと。

### おまけ①
良さげなサラテクト↓　※Colemanとコラボしてて洒落ている
虫除けスプレー＝サラテクトになってることについて訂正してお詫び申し上げます。

https://amzn.asia/d/1V0V6DN

虫コナーズ↓(意外と普通に高い)

https://amzn.asia/d/fkaEUUR

※送料かかるが見た目は可愛い↓(買わないけども)

https://amzn.asia/d/b3v70j6

置くだけタイプのやつ↓

https://amzn.asia/d/7FKIVEz

### おまけ(メイン)
ある日の夜ご飯()
ドレスコードは緑、なメシである。
![Quiita Green.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/0626d272-eef9-9082-e962-cddc5d06d877.jpeg)
UbuntuでDNSの設定を永続させる

## ubuntuの/etc/resolv.confが勝手に書き変わる問題
/etc/resolv.confを編集した後に、netplan apply等を実行するとデフォルトの設定に戻ってしまう場合がある。

## 手順
### aptを叩くために/etc/resolv.confを編集
```
nameserver 8.8.8.8
```

### resolvconfをインストール
```
sudo apt -y update
sudo apt -y install resolvconf
```

### 念のため手動で起動
```
sudo systemctl start resolvconf.service
sudo systemctl enable resolvconf.service
sudo systemctl status resolvconf.service
```

### /etc/resolvconf/resolv.conf.d/headの編集
```
nano /etc/resolvconf/resolv.conf.d/head
```
下記を追加
```
nameserver 8.8.8.8 
nameserver 8.8.4.4
```

### resolvconfの再起動
```
sudo systemctl restart resolvconf.service
sudo systemctl restart systemd-resolved.service
```

名前解決が出来れば完了！


##### 参考文献
https://ja.linux-console.net/?p=802#gsc.tab=0
terraformでLB＋VM×２を作った

# はじめに
terraformを手っ取り早く習得しようと思ってネットを調べた結果、、、
実は公式サイトを見た方が一番最新の情報で参考になる、というところにいきついたので
そのときのメモ

# 参考にしたサイト
リファレンス。これが無い詰む

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs

試しに動かしたtf

https://github.com/hashicorp/terraform-provider-azurerm/tree/main/examples/virtual-machines/linux/load-balanced

# 手順
前提としてterraformはインストール済み

## vscodeを起動してgit clone！
ピンポイントほしいコード取ろうと思ったけどうまくいかなかったので素直に公式が公開してるリポジトリをまるっと。

https://github.com/hashicorp/terraform-provider-azurerm.git

## お手本ディレクトリへ移動する

```
cd terraform-provider-azurerm/examples/virtual-machines/linux/load-balanced
```

## main.tf修正
実際にやってみると数か所誤っていたので修正した。
terraform plan実行時に出力されたエラーメッセージとリファレンスを参考に修正。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/cdb58464-2c69-27ed-7680-fbc88291cb0e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/597fcb2e-8668-7579-cbc7-96568c6e4a7d.png)

## 実行
以下の手順でつるっといけました。
最初、入力を求められたのでその部分も一緒においとく


```
$ terraform init
$ terraform plan -out plan.tfplan
var.location
  The Azure Region in which all resources in this example should be created.

  Enter a value: japaneast

var.prefix
  The prefix which should be used for all resources in this example

  Enter a value: dev
$terraform apply -input plan.tfplan
```

# 実行結果
いい感じ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/2a195c4e-2f69-053e-d4b1-9c8145c46c42.png)

# オマケ：VMサイズの変更の仕方
上記のterraform apply~でデプロイできたわけだけど
このあとすでにデプロイ済みのＶＭのサイズ変更とかってどうやるんだろって軽く調べると
tfファイルの部分をちょこっと直すだけでＯＫだそうだ、すご！

↓↓のようにVMサイズを停止している箇所を修正したあとに、普通にterraformコマンド実行でOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/007267aa-24cd-9a92-7079-ae50460bd107.png)

要するに、、、もう一回同じことをやればOK。

```
$ terraform init
$ terraform plan -out plan.tfplan
var.location
  The Azure Region in which all resources in this example should be created.

  Enter a value: japaneast

var.prefix
  The prefix which should be used for all resources in this example

  Enter a value: dev
$terraform apply -input plan.tfplan
```

超簡単ですね！IaCサイコー
ちなみに・・・変更にかかった時間は～…まぁaz cliでモデル変更したときと差はなかったです。
そりゃそうだ、って話。

# クリーンアップ
以下のコマンド実行

```
terraform plan -destroy -out main.destroy.tfplan
terraform apply main.destroy.tfplan
```

ちなみに今回は試しなので適当にモデルのところだけ変更したけど
軽く調べたところdepend onってのを使ったら、デプロイ順序がいじれるらしい。
これは追々試してみることにしよう。
SwiftでDate型をユーザーに合わせてフォーマットする方法 強制的に西暦にする、など

## 宣伝

アプリ作っているので入れてみてください！！
よろしくお願いいたします！！

https://apps.apple.com/app/6446189340


https://apps.apple.com/jp/app/meime/id6446994707?l=ja


## 本題




以下の関数をコピペで使えます。

```Swift
// 関数: formatDateToString
// Date型をStringにフォーマットする関数

func formatDateToString(date: Date) -> String {
    // DateFormatterインスタンスを作成
    let dateFormatter = DateFormatter()
    
    // dateStyleを.mediumに設定し、日付を表示する形式を指定
    dateFormatter.dateStyle = .medium
    
    // timeStyleを.noneに設定し、時間を表示しないように指定
    dateFormatter.timeStyle = .none
    
    // DateFormatterを使ってDate型をStringに変換
    let formattedString = dateFormatter.string(from: date)
    
    // 変換されたStringを返す
    return formattedString
}

```



dateStyleとtimeStyleには以下の値を設定することができます。

dateStyleの値:

.none: 日付を表示しない
.short: 短い形式の日付を表示 (例: 2022/01/01)
.medium: 中間の形式の日付を表示 (例: Jan 1, 2022)
.long: 長い形式の日付を表示 (例: January 1, 2022)
.full: 完全な形式の日付を表示 (例: Saturday, January 1, 2022)
timeStyleの値:

.none: 時間を表示しない
.short: 短い形式の時間を表示 (例: 13:30)
.medium: 中間の形式の時間を表示 (例: 13:30:00)
.long: 長い形式の時間を表示 (例: 13:30:00 GMT+09:00)
.full: 完全な形式の時間を表示 (例: 13:30:00 JST)



これらの値を組み合わせることで、さまざまな日付と時間の表示形式を選択することができます。適切な形式を選ぶためには、ユーザーのニーズやアプリのコンテキストに合わせて選択することが重要です。

これを使うことで、例えば令和表記にしているユーザには令和で表示されることになり、世界のいろいろな時間の表記法にも勝手に変換してくれるようです。



年号だけは指定のに指定場合は以下のように設定できます。

```Swift
// 関数: formatDateToString
// Date型をStringにフォーマットする関数

func formatDateToString(date: Date) -> String {
    // DateFormatterインスタンスを作成
    let dateFormatter = DateFormatter()
    
    // カレンダーをグレゴリオ暦に設定
    dateFormatter.calendar = Calendar(identifier: .gregorian)
    
    // dateStyleを.mediumに設定し、日付を表示する形式を指定
    dateFormatter.dateStyle = .medium
    
    // timeStyleを.noneに設定し、時間を表示しないように指定
    dateFormatter.timeStyle = .none
    
    // DateFormatterを使ってDate型をStringに変換
    let formattedString = dateFormatter.string(from: date)
    
    // 変換されたStringを返す
    return formattedString
}


```


Calendar(identifier: .gregorian)によってカレンダーをグレゴリオ暦に設定していますが、Calendarクラスのidentifierプロパティには他にもさまざまな値を指定することができます。いくつか一般的な値を挙げると、次のようなものがあります：

.gregorian: グレゴリオ暦
.buddhist: 仏暦
.chinese: 中国暦
.hebrew: ヘブライ暦
.islamic: イスラム暦
.japanese: 和暦
.persian: ペルシャ暦
.republicOfChina: 中華民国暦（台湾暦）
これらの値をCalendar(identifier:)に指定することで、異なるカレンダーシステムを使用することができます。ただし、使用可能なカレンダーはプラットフォームや地域によって異なる場合があります。



作ったアプリ。


https://apps.apple.com/app/6446189340


では。
【Python】大谷選手のホームランをリアルタイムで知らせてくれるLINE通知Botの作り方

# Pythonを使って大谷選手がホームランを打てばLINEに通知する

この記事では、大谷選手がホームランを打ったときにLINEで通知を受け取る方法を紹介します。
リアルタイムの試合データをPythonで取得し、大谷選手がホームランを打ったときだけLINEに通知を送るというプログラムを作成します。

## LINE Notify API の利用準備

前回と同じく、LINE Notify APIを利用します。APIのトークンは LINE公式サイト から取得できます。

## 必要ライブラリのインストール

今回は、前回同様にLINE APIにHTTPリクエストを送信するための``requests``と、
リアルタイムの試合結果を取得するためのライブラリ``pybaseball``を利用します。

``$ pip install requests pybaseball``

## コーディング

以下のコードは、大谷選手がホームランを打ったときにLINEに通知を送るPythonスクリプトの例です。

```python:linebot.py
import requests
from pybaseball import playerid_lookup, statcast

def send_line_notify(notification_message):
    line_notify_token = '取得したトークンを記載'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'message: {notification_message}'}
    requests.post(line_notify_api, headers=headers, data=data)

def check_hr(player_id):
    data = statcast('2023-05-01', '2023-05-30')
    player_data = data[data['batter']==player_id]
    hr_today = player_data[player_data['events']=='home_run']
    if not hr_today.empty:
        send_line_notify('大谷選手がホームランを打ちました！')

if __name__ == '__main__':
    player = playerid_lookup('ohtani', 'shohei')
    player_id = player.key_mlbam[0]
    check_hr(player_id)
```

このスクリプトは、指定された期間（ここでは2023年5月1日から5月30日）
の試合結果を取得し、その中で大谷選手がホームランを打った試合があるかどうかを確認します。
ホームランを打った試合があれば、LINEに通知を送ります。


## まとめ

今回は、大谷選手がホームランを打った際にLINEで通知を受け取るプログラムを作成しました。
Pythonを使って試合結果を取得し、ホームランがあったときだけLINEに通知を送るという仕組みです。
なお、このスクリプトは一度だけ実行するものであり、リアルタイムに試合を監視するものではありません。
スクリプトを定期的に実行するためには、スケジューリングツール（cronなど）を利用するなどの追加の設定が必要です。

また、データの取得は一定の期間を指定して行っていますが、
具体的な期間はスクリプトを実行するタイミングによって適宜変更する必要があります。

最後に、このスクリプトはサンプルであり、実際に運用する際には適切な
エラーハンドリングやトークンの管理など、セキュリティ面の考慮が必要です。
今後も大谷選手から目が離せませんね！その活躍をPythonと共に追いかけましょう！
以上、ご訪問ありがとうございました。
Laravel x Vue.jsの組み合わせのパターン整理

## はじめに

LaravelとVueを使用して開発を進めていく際に、色々自由度がありすぎて決まらずいったん整理した。本記事は、その備忘録となる。

## 開発パターン

以下のパターンを特定した：

1. **パターン１：Laravelをメインに使用**
2. **パターン２：LaravelをAPIとして使用し、フロントエンドはVueで対応**
    - 2-1: Laravel Mix等を使用し、LaravelにVueコンポーネントを記載
    - 2-2: webpackを主体とし、Vueを組み込む
    - 2-3: LaravelとVueを完全に分離
3. **パターン３：LaravelをAPIとして使用し、フロントエンドを別のプロジェクトで対応**
4. **パターン４：Inertia.jsを使用し、バックエンド主体でフロントエンドはVueに対応**

## 考慮すべきポイント

LaravelとVueのバージョンアップを考慮するときに、以下のポイントを考慮する：

- ViteかWebpackを使用するか
- Laravel Mixを使用するか
- Vue2を使用するか、それともVue3に移行するか

## 進め方の方針

この中で進め方は、"パターン2-3：LaravelとVueを完全に分離"することにした。
プロジェクトは１つで進める。次に"パターン4：Inertia.jsを使用し、バックエンド主体でフロントエンドはVueに対応"を検討する。

Laravel Mix、Webpack、Vue2の場合は、直近に合わせる：

- Laravel Mix：使用しない
- Webpack：代わりにViteを使用
- Vue2：Vue3に置き換える

以上の方針で、LaravelとVueの開発を進めていく。

## 終わりに
とりあえず前に進めていきたい。


## 参考文献
[Laravel x Vue.jsの組み合わせのパターン紹介](https://zenn.dev/m2/articles/2679cf85b49b50)

(パターン３:LaravelをAPIとして使用、フロントを違うプロジェクト)
[フロントエンド、バックエンドを個別に構築して相互連携させる開発手法について語る](https://qiita.com/ison12/items/23704d44bd5afa71eff8)

(パターン2-3:完全にlaravelとvueを分離)
[Vue.js + LaravelでシンプルなSPA構築チュートリアル：概要編](https://qiita.com/minato-naka/items/2d2def4d66ec88dc3ca2)

(パターン2-1:vueのlaravel-mix等使用(laravelにvueコンポーネントを記載))
[Laravel と Vue と Docker でシンプルな SPA を作る ①【フロントエンド】](https://qiita.com/yutotakakura/items/88f0dfcb98beacb4725c)

(パターン2-2:webpackを主体とし、vueを組み込む)
[Vue.jsのSFC（単一ファイルコンポーネント）＋PHPでWebアプリケーションを構築する - フロントエンド環境編](https://qiita.com/ison12/items/b336766bd6ca01cd62a3)
未経験からエンジニアへ：時間割引率とマシュマロテストに基づく挑戦

### 序章：エンジニアを目指すあなたへのメッセージ

エンジニアを目指しているあなたへ。あなたは既に重要なスタートラインに立っています。それは長く、時には厳しい道のりかもしれませんが、それは素晴らしい未来への第一歩です。今日は、「時間割引率」と「マシュマロテスト」、そして「燃え尽き症候群」を通じて、自分自身の学習の姿勢を理解し、バランスを見つける方法を見てみましょう。

### 第一節：時間割引率って何？

時間割引率とは、未来の価値を現在の価値に変換する際のレートを表す経済学の概念です。この概念は、お金だけでなく、日々の生活や決定にも深く関わっています。簡単に言えば、それは我々が今すぐ楽しむことと、将来の成功のために今を犠牲にすること、どちらを優先するかを示すものです。

時間割引率が高いと、我々は今すぐ楽しみを優先することを選びます。一方、時間割引率が低いと、我々は将来の報酬を手に入れるために、現在の楽しみを犠牲にすることがより可能になります。

### 第二節：マシュマロテストとの関連性

この考え方はマシュマロテストという心理学の実験と関連しています。マシュマロテストとは、小さな報酬をすぐに得るか、我慢して待って大きな報酬を得るかを子供たちに選ばせる実験です。我々が日々経験する「今を楽しむか、将来のために我慢するか」という選択と同じです。

エンジニアになるために学習に時間を投資することは、待つことで大きな報酬を得るために小さなマシュマロ（つまり今すぐの楽しみ）を我慢することに似ています。

### 第三節：燃え尽き症候群との関連性

しかし、ただ我慢すればいいというものではありません。学習の過程で身体や心が疲れ果ててしまうと、燃え尽き症候群（バーンアウト）に陥る可能性があります。バーンアウトは、持続的なストレスや過労が原因で、無気力、倦怠感、やる気の低下などを引き起こします。

ここでも時間割引率の視点が役立ちます。あまりにも高い割引率を設定してしまうと、すぐに結果を求め過ぎて過度のストレスを感じ、バーンアウトにつながる可能性があります。逆に、適切な割引率を設定し、適度な休息と楽しみを設けながら、長期的な成功に向けて進むことが重要です。

### 第四節：エンジニアへの道

エンジニアに転職するための学習は、一見辛い道のりのように思えます。それは将来の報酬を手に入れるための重要なステップです。適度な時間割引率を設定し、燃え尽き症候群を予防しながら、短期的な楽しみを我慢してでもエンジニアリングスキルを磨く時間を確保する、つまり長期的に見据えることが、あなたが夢を追求するための大切な要素となります。

私たちはあなたがエンジニアリングを学び、成功へと向かうことを全力で応援しています。時間割引率とマシュマロテストの考え方を用いて、自分自身の学習姿勢を理解し、情熱を保つことが重要です。そして、未来のエンジニアとして成功をつかむために、今日から一歩一歩進みましょう。この記事があなたの挑戦の助けとなれば幸いです。

### 結び：あなたの未来へ

あなたの挑戦は価値があります。それはあなた自身の成長と未来の成功のための重要なステップです。時間割引率とマシュマロテストを理解し、それらを自分自身の学習の道程に適用することで、あなたはバランスの取れた学習姿勢を維持し、燃え尽き症候群を避けることができるでしょう。そして、エンジニアとしてのキャリアを築く道のりで、あなたの成功を全力で応援しています。この記事があなたの挑戦を支える一助となることを願っています。
スマートウオッチ作る(4) オリジナル画面の追加

今回の内容
--
- 前回作った環境を使って、オリジナル画面を追加する方法を確認していきます
- テンプレートから生成した空の画面を時計に追加してみます

## 1.開発の流れ
前回クローンした[公式サイトのGithub](https://github.com/joeycastillo/Sensor-Watch/tree/main/PCB/Sensor%20Boards)には、このボード専用のフレームワークも含まれています。このフレームワークには７セグメントに文字を表示するためのフォント、画面遷移前後に処理させるためのイベント、秒表示更新のための定期的なイベント、ディープスリープ制御などが含まれています。

このフレームワークを使った開発は、標準の時計画面、ストップウオッチの画面など、画面ごとに行います。１つの画面ごとに１対のヘッダファイルとcソースが対応しています。なので
- 各画面のソースを作り、画面の表示順をmovement_config.hに書いた後、
- エミュレータで動作確認し(emmake make → ブラウザで確認)問題ないことを確認後
- 実機用にmakeし、出来上がった uf2ファイルを実腕時計に書き込み
となります。

### 1-1.テンプレートフォルダの確認

Win10のスタート→Ubuntu で前回作った環境に入ったら、watch_faceフォルダに行きフォルダの中身を確認しておきます
5つのフォルダがあり、それぞれが公式が準備してくれている５種類のテンプレート名になります
今回は、全部入りと思われるcomplicationを使っていきます。
メモリを節約するならコンパクトなものを選ぶと良いと思います

```
$ cd Sensor-Watch/movement/watch_faces/
$ ls
clock  complication  demo  sensor  settings
```

### 1-2.テンプレートを使ったcソースとヘッダファイルの準備
templateフォルダに行って、pythonスクリプトを実行し、１画面分のcソースとヘッダファイルを準備します。今回は以下の通りで行ってみます
- 使用するテンプレート：complication
- 作成する画面名(face名）：hello
```
$ cd ../template
$ python3 watch_face.py complication hello
```

ソースとヘッダファイルは、~/Sensor-Watch/movement/watch_faces/[テンプレート名]に準備されます
今回の場合は、以下のようにファイルが出来ているのが確認できます
```
$ cd ../watch_faces/complication/
$ ls hello*.*
hello_face.c  hello_face.h
```

### 1-3.生成されたソースの確認
今回と次回に関係あるところだけ見て行きます

hello_face.hには、 hello_state_tという構造体が定義されています。
これは作成するhell画面内および他、画面に遷移してもDeep Sleepから復帰しても残る変数保管場所です
テンプレートによりダミーで unusedというのが定義されていますが、これを削除し必要な変数名を追記して使います。
``` hello_face.h部分
typedef struct {
    // Anything you need to keep track of, put it here!
    uint8_t unused;
} hello_state_t;
```

hello.cには、先ほどのhello_state_tのコンストラクタの下に hello_face_loopが定義されており、
その中に各種イベントが準備されています
```hello.c部分
case EVENT_ACTIVATE:  //最初に呼ばれる場所、初期表示したいものなどを書く場所
   <略>
case EVENT_TICK:　　　//標準だと１秒ごとに読まれる場所、時刻表示更新などを書く場所
　 <略>
case EVENT_MODE_BUTTON_UP: //モードボタンが押された時の動作 
            movement_move_to_next_face();
            break;
case EVENT_LIGHT_BUTTON_UP: //ライトボタンが押された時の動作
            movement_illuminate_led();
            break;
```

### 1-4.画面の追加とコンパイル
生成された状況では、確認したようにEVENT_ACTIVATEなどの中は空なので表示は何もされないですが、
画面切り替えボタンと、ライト点灯ボタンは標準で画面遷移と数秒バックライトを点灯するコードが
書かれているので、このままでも最低限の動作はできます。
何も編集しないまま、コンパイルしてエミュレータ上で実行してみたいと思います

~/Sensor-Watch/movement　フォルダにある movement_config.hを開き、生成されたソース名(.cは不要)を追記します。
並び順は時計のMODEボタンを押した際の画面遷移順になります。
今回は、通常の時刻表示画面(simple_clock)の後にhello_faceを追加してみました。
``` movement_config.h部分
const watch_face_t watch_faces[] = {
    simple_clock_face,
    hello_face, //add
    world_clock_face,
    sunrise_sunset_face,
    moon_phase_face,
    stopwatch_face,
    preferences_face,
    set_time_face,
};
```

追加したら、~/Sensor-Watch/movement/make　に移って
```
$ emmake make
```
を実行するとコンパイルされるので、前回同様以下を実行し
```
$ python3 -m http.server -d build-sim
```
Win10側のブラウザで[エミュレータ画面](http://localhost:8000/watch.html)を開くと以下のようになります。
左下のモードボタンを１回押すと文字は何も表示されない今回追加した画面になり、
左上のバックライトボタンで光るだけの画面が追加されているのが確認できるかと思います

![20230517_ＬチカHelloWorld_のっぺらぼう.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436645/356eff3a-0292-0492-bcd3-c1701928dd4b.jpeg)


2.次回
---
次回は今回作った画面に「Hello Worl」と表示させつつ、バックライト用LEDを1秒おきに点滅する画面に更新してみます


ご参考
---
https://www.sensorwatch.net/docs/movement/newface/
本日の微分方程式（16日目）

前回の内容はこちら

https://qiita.com/Schwarzschi1d/items/8e9b0a984e910f1ddde0

## 問題
積分因子を用いて，以下の微分方程式の一般解を求めよ．

```math
\begin{align}\tag{1}
y^\prime +\frac{2y}{x} = 4x.
\end{align}
```

## ポイント
- $\dfrac{\mathrm{d}y}{\mathrm{d}x}+P(x)y=Q(x)$ の形式の微分方程式は，**一階線形微分方程式**と呼ばれます．
- **積分因子**とは， $e^{\int P(x)\mathrm{d}x}$ のことです．一階線形微分方程式は，積分因子をかけることで，左辺が積の微分の形になります．
- 一階線形微分方程式については，ヨビノリさんの動画もご参照ください．

https://www.youtube.com/watch?v=Hfby9zyZ0HY&list=PLDJfzGjtVLHnmhT1AhMx7bSt0ZOGbIP3c&index=4

## 解説

まずは積分因子を具体的に求めていきましょう．
$P(x)=\dfrac{2}{x},~Q(x) = 4x$ ですから，

```math
\begin{align}\tag{2}
e^{\int P(x)\mathrm{d}x}
&=e^{\int \frac{2}{x}\mathrm{d}x}\\
&=e^{2\log |~x~|}\\
&=e^{\log |~x~|^2}\\
&=e^{\log x^2}\\
&=x^2,
\end{align}
```

と求まります（ここの積分においては，$P(x)$ の原始関数を1つ求めるだけでいいので，任意定数は不要です．[参考](https://qiita.com/Schwarzschi1d/items/aa2abcda639b8f0e2550)）．

これを与えられた微分方程式（1）の両辺にかけていきましょう．

```math
\begin{align}\tag{3}
y^\prime\times x^2 +\frac{2y}{x}\times x^2 &= 4x\times x^2\\
\therefore y^\prime\times x^2 +y\times 2x &= 4x^3.\\
\end{align}
```

さて，左辺は積の微分の形になっているはずです．
積の微分公式 $\left(f(x)g(x)\right)^\prime = f(x)^{\prime}g(x)+f(x)g(x)^{\prime}$ と，にらめっこしてみましょう． 
$f(x)=y,~g(x)=x^2$ としてみれば，$\left(f(x)g(x)\right)^\prime$は，

```math
\begin{align}\tag{4}
(y\times x^2)^\prime = y^\prime\times x^2 + y\times 2x,
\end{align}
```

と表すことが出来ます．紛れもなく式(3)の左辺と一緒です．
したがって，式(4)の結果を式(3)に代入すれば，

```math
\begin{align}\tag{5}
(y\times x^2)^\prime = 4x^3,
\end{align}
```

との関係式を得ます．後は両辺を $x$ で積分して完了です．

```math
\begin{align}\tag{6}
\int (y\times x^2)^\prime \mathrm{d}x&= \int 4x^3\mathrm{d}x,\\
y\times x^2&= \int 4x^3\mathrm{d}x,\\
y\times x^2&= x^4 +C~~~(C:任意定数),\\
\therefore y&= x^2 +\frac{C}{x^2}~~~(C:任意定数),\\
\end{align}
```


## 【参考】 Wolframalpha

非常に便利なので皆さん積極的に使っていきましょう．

https://www.wolframalpha.com/input?i=y+%E2%80%B2+%2B2y%2Fx+%3D+4x&lang=ja
UUIDバージョン4メモ

UUIDのバージョン4の実装がシンプル且つjs及びビット演算の再確認になったため、ここにメモを残します。

## UUIDとは
Universally Unique Identifier。ソフトウェア上でオブジェクトを一意に識別するための識別子である。UUIDは128ビットの数値だが、16進法による550e8400-e29b-41d4-a716-446655440000というような文字列による表現が使われることが多い。元来は分散システム上で統制なしに作成できる識別子として設計されており、したがって将来にわたって重複や偶然の一致が起こらないという前提で用いることができる。
UUIDのバージョン4は、16進表記では、RRRRRRRR-RRRR-4RRR-rRRR-RRRRRRRRRRRRという形式で表される。3番目のブロックの先頭はバージョン4を表す。4番目のブロックの先頭は現行の規格では上位2ビットが10であることが定められているので、16進表記では8（1000）、9（1001）、A（1010）、B（1011）のいずれかとなる。 [^1]

## UUIDバージョン4の実装サンプル（js）[^2]
~~~Javascript
function generateUUIDv4() {
  var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = Math.random() * 16 | 0,
        v = c === 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
  });
  return uuid;
}
~~~
## メモ
* replace関数。第一引数。xあるいはyの文字列を正規表現でひっかけている。
* replace関数。第二引数にfunctionを指定することができる。
* Math.randomの行。 Math.random()は0以上1未満の範囲の浮動小数。
Math.random()*16は0 ～ 15の整数。それに0とのOR演算を行っており、これで整数化している（ビット演算時に32ビット整数に変換される）。
~~~js
> var s = Math.random() * 16;
> var n = s | 0;
> console.log('s=' + s + ',  n=' + n); 
s=8.660867119575208,  n=8
s=3.4914822265590573,  n=3
s=0.8758466412762864,  n=0
~~~
* v=の行。3項演算子の形式となっている。
cが'x'の場合は0 ～ 15の整数、それ以外の場合は8、9、A、B（16進表記）となる。
* r & 0x3 | 0x8 に関して。0 ～ 15の整数と3のAND演算となる。この演算で0 ～ 15の整数の下位2ビットを抽出している。
それに8のOR演算を行っている。これは上位2ビットの10を作っている（8（1000））。
例：整数が5の場合
 5（0101） & 3（0011） | 8（0011） = 1（0001） | 8（1000） = 9（1001）
例：整数が14の場合
14（1110） & 3（0011） | 8（0011） = 2（0010） | 8（1000） = 10（1010）（16進表記でA）
* toString(16)で16進表記の文字列に変換。

[^1]:https://ja.wikipedia.org/wiki/UUID
[^2]:ChatGPTに「UUIDのVersion4を生成する関数をJavascript作成してほしいです」とお願いして生成
Apache Solrのご紹介

社内むけを含む説明用のスライドですが、私用の時間で作成されており、かつ、社外秘情報を含まないため公開します。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/4acbd214-144d-448c-c0c1-316556a6e856.png)
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/19aa2c8d-8aab-b69c-5496-d4c3ea10bb71.png)
![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/cfa8cd4e-6c3a-7fe0-469b-0a778413c603.png)
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/1a2d894f-55ae-bcc0-fa56-74d4a8086ee4.png)
![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/d57640b1-36b2-fd0a-876e-8ea56e9a0258.png)
![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/75fcc922-5e41-b266-97d4-cfb53ec2678a.png)
![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/f3af1d55-d7be-6178-2cbf-257f9675cbb0.png)
![スライド9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155352/246b2704-0e5b-ef89-9e96-4582dcf6668f.png)
[Web3]Next13+Web3(Metamask)+MongoDBでログイン機能を実装

# はじめに

今回はMetamaskを使ったログイン機能を実装しました。
成果物：https://shoslabo.vercel.app/web3auth
Github:https://github.com/foasho/shoslabo
※Githubは常に更新してるのでapp/web3authを確認してください。

環境
- Next13: v13.4.2
- ethers: v5.7.2
- siwe: v2.1.4

動作GIF
![next-web3auth.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/0934742c-aca6-7df1-17e3-0af26ea4c1cc.gif)
【学習】Ruby on Rails チュートリアル 第7版 - 第7章 ユーザー登録

5/20 15:15 開始

REST(REpresentational State Transfer)：
アプリケーションを構成するコンポーネントを「リソース」としてモデル化することを指す。
これらのリソースは、リレーショナルデータベースの作成/取得/更新/削除（Create/Read/Update/Delete: CRUD）操作と、
4つの基本的なHTTP requestメソッド（POST/GET/PATCH/DELETE）の両方に対応している。

*debuggerメソッド
アプリケーションのdebuggerが呼び出された瞬間の状態を確認できる。

例えば...
↓にdebuggerメソッドを差し込むと

    class UsersController < ApplicationController

      def show
        @user = User.find(params[:id])
        debugger
      end
        .
        .
        .
    end

Railsサーバーを立ち上げたターミナルに
rdbg（Ruby debugger）プロンプトが表示され、色々確認できる。

    (rdbg) @user.name
    "xxxx"
    (rdbg) @user.email
    "xxxx"
    (rdbg) params[:id]
    "1"

Ctrl-Dを押し、debuggerの行を削除することで
アプリケーションの実行を続行できる。

7.1.3まで終了

16:15 終了

16:45 開始

*form_with
Active Recordのオブジェクトを取り込み、そのオブジェクトの属性を使ってフォームを構築する。

(使用例)
<%= form_with(model: @xxx) do |f| %>
  .
  .
  .
<% end %>


fオブジェクトは、HTMLフォーム要素（テキストフィールド、ラジオボタン、パスワードフィールドなど）に対応するメソッドが呼び出されると、@xxxの属性を設定するために特別に設計されたHTMLを返す。

<%= f.label :name %>
<%= f.text_field :name %>

　↓のHTMLを返す

<label for="user_name">Name</label>
<input type="text" name="user[name]" id="user_name" />


<%= f.label :password %>
<%= f.password_field :password %>

↓を返す

<label for="user_password">Password</label>
<input type="password" name="user[password]" id="user_password" />

※パスワードフィールド（type="password"）は文字がドットに置き換わって表示される。

↓のHTMLも生成される。

<form action="/users" accept-charset="UTF-8" method="post">
※formタグ：入力・送信フォームを作成する時に使うタグ

action="/users" method="post"
→/usersに対してHTTPのPOSTリクエストを送信する

/routesで確認してみると、↑の/usersへのPOSTリクエストはcreateアクションに送られる。

POST /users(.:format) users#create


7.3まで終了

5/20 18:30 終了


5/22 8:20開始


・ユーザー登録に成功後の動き

*別のページにリダイレクト（Redirect）する ※Webでは一般的

(例)redirect_to @userを追記

    def create
        @user = User.new(user_params)
        if @user.save
          redirect_to @user
        else
          render 'new', status: :unprocessable_entity
        end
    end


redirect_to @userは↓と同義
redirect_to user_url(@user)


*DBのリセット
rails db:migrate:reset


7.4まで終了

5/22 9:00 終了

5/22 18:30 開始

・プロ品質のデプロイ

*ユーザー登録をセキュアにする
sample_appは、ユーザー登録フォームで送信するとデータがネットワーク越しに流される。
→ネットワークに流れるデータは途中で捕捉できるため、扱いには注意が必要⚠️

Transport Layer Security（TLS）を用いてセキュアにする。
TLS：ローカルのサーバーからネットワークにデータを送信する前に大事な情報を暗号化する技術。


config/environments/production.rbにて
config.force_ssl = true
とすることで、あらゆるブラウザでTLSを強制し、httpsによる安全な通信を確立する。

    Rails.application.configure do
      .
      .
      .
      # Force all access to the app over SSL, use Strict-Transport-Security,
      # and use secure cookies.
        config.force_ssl = true
    end


Renderドメイン内で実行されるアプリケーションについては、RenderのTLS証明書が利用できる為
デプロイすれば、自動的にTLSが有効になる。

*本番環境
本番環境ではPumaというHTTPサーバーを使う。
Pumaは、大量のリクエストを受信できる能力を備えたサーバー。
※Rails 5以降ではデフォルトでPumaが使えるようになっている。

*RenderのStart Commandを設定。
Renderダッシュボード「Settings」で、
デフォルトの
   Start Command
↓
   bundle exec puma -C config/puma.rb
に置き換える。

*本番データベースの設定

本番環境のデータベースでPostgreSQLが使われるように設定する。

データベース設定ファイルconfig/database.ymlのproductionセクションを追記↓

    production:
      <<: *default
      adapter: postgresql
      encoding: unicode
      url: <%= ENV['DATABASE_URL'] %>

第7章終了!

5/22 19:00 終了
【Paiza問題集】標準出力メニュー/改行あり出力

# Paiza問題集 
Pythonで回答

## 標準出力メニュー 改行あり出力

### Step1 1行の出力
```Python
"""
1行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_step1
"""

# 整数813を表示する
print(813)
```


### Step2 2行の出力
```Python
"""
2行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_step2
"""

# 8と13を2行で出力する
print(8)
print(13)
```


### Step3 3行の出力
```Python
"""
3行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_step3
"""

# 8,1,3を出力する
print(8)
print(1)
print(3)
```


### Step4 10行の出力
```Python
"""
10行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_step4
"""

# 配列に数字の列を代入する
numbers = [813, 1, 2, 923874, 23648, 782356, 3256, 2342, 24324, 112]

# 数字の列を表示する
for num in numbers:
    print(num)
```


### Final問題
```Python
"""
【改行あり出力】1000行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_boss
"""

# 1から1000まで表示する
for i in range(1, 1001):
    print(i)
```
JavaScript関数の定義方法とそれぞれの特性を理解する

# 関数定義
JavaScriptの関数は様々な方式で定義することができます。
それぞれの方式が適しているシーンを理解し、適切に使い分けることが重要です。
以下にそのいくつかを示します。

## 関数宣言
最も基本的な関数の定義方法で、名前を持つ関数を作成します。
関数宣言はコードが実行される前に読み込まれるため、コードのどこからでも呼び出すことが可能です。
この性質は、ある程度大きな処理をモジュール化し、何度も使用するようなシチュエーションで有用です。
```javascript: 最も一般的な関数の定義
function greet() {
    console.log('Hello, world!');
}
greet(); // 実行 => Hello, world!
```

## 関数式
関数を変数に代入する方法です。
これは匿名関数または名前付き関数を変数に割り当てることができます。

関数式は変数のスコープに依存するため、ローカルスコープで関数を制限したい場合に便利です。
また、即時実行関数など、特定のパターンで使われることがあります
```javascript: 関数を変数に代入する
let greet = function() {
    console.log('Hello, world!');
}
greet(); // 実行 => Hello, world!
```

## アロー関数
ES6で導入された新しい関数の定義方法で、短く書くことができる他、thisの挙動が変わります。
一般的にはコールバック関数や配列操作（map, filter, reduceなど）の中でよく使われます。
```javascript: アロー関数
const greet = () => {
    console.log('Hello, world!');
}
greet(); // 実行 => Hello, world!
```

## 即時実行関数
関数を定義と同時に実行します。
一度だけ実行したいコードを隔離するために使われます。
関数内で定義された変数はその関数のスコープ内に閉じ込められるため、グローバルスコープを汚染せずにコードを実行できます。
```javascript: 即時実行関数
(function() {
    console.log('Hello, world!');
})();
// 即時実行 => Hello, world!
```
```javascript: 即時実行関数（アロー関数を使った例）
(() => {
  // 関数の内容
})();
```

```javascript: 即時実行関数（private変数・関数のような使い方の例）
(function() {
  let privateVariable = "I'm private!";
  console.log(privateVariable);  // "I'm private!"
})();

console.log(typeof privateVariable);  // "undefined"
```
この例では変数（privateVariable）は即時実行関数内でしかアクセスできません。
このような特性を利用して、他のコードとの名前の衝突を防いだり一時的な作業変数を隔離したりすることができます。

※最近のJavaScript（ES2020以降）では、
クラス内で"#"を使ってprivateメソッド関数を定義することができます。

```javascript: 参考）privateメソッド（ブラウザがES2020以降に対応済みなら以下の動作になる）
class MyClass {
  #privateMethod() {
    return "Hello, World!";
  }
  callPrivateMethod() {
    return this.#privateMethod();
  }
}
const myInstance = new MyClass();
console.log(myInstance.callPrivateMethod()); // "Hello, World!"
console.log(myInstance.#privateMethod()); // Error: Private field '#privateMethod' must be declared in an enclosing class
```



## コンストラクタ関数（非推奨）
JavaScriptのコンストラクタを用いて関数を定義する方法もありますが、通常は使用されません。
なぜなら、関数の内容が文字列として評価されるため、パフォーマンス上の問題やセキュリティリスク、そしてスコープの問題が伴うためです。
```javascript: 通常はnew Function() 構文を使用することは非推奨です
let greet = new Function('console.log("Hello, world!");');
greet(); // 実行 => Hello, world!
```

以上のようにJavaScriptでは、様々な方法で関数を定義する事ができます。
これらの関数の性質を知っておくと、より効率的にコードを書き、他の人が書いたコードを理解しやすくなります。
Unity Package ManagerのAdd package from git urlで追加する

# 最低条件

```
公開したいデータのRoot/
┣ Scripts
┣ ┗ hoge.cs
┣ {パッケージ名}.asmdef
┗ package.json
```
```json :package.json
{
    "name": "com.tomoi.unityeasynet",//小文字
    "displayName": "UnityEasyNet",//パッケージの名前
    "version": "0.0.1",//パッケージのバージョン
    "unity": "2021.3",//Unityの最低バージョン
    "description": "Simplify Unity communication.",//パッケージの説明
    "author": {
        "name": "tomoi",
        "url": "https://github.com/tomoi"
    }
}
```



# サンプルを追加する場合
```
公開したいデータのRoot/
┣ Sample~
┃ ┗ {パッケージ名}
┃    ┗ {サンプルの名前}
┃       ┗ //内容
┃    //サンプルを追加する場合は{パッケージ名}直下に配置する
┣ Scripts
┣ ┗ hoge.cs
┣ {パッケージ名}.asmdef
┗ package.json
```
package.jsonに以下を追加する
```json :package.json
    ,
    "samples": [
        {
            "displayName": "ChatSample",//サンプルの名前
            "description": "Sample of sending and receiving strings.",//サンプルの説明
            "path": "Samples~/UnityEasyNet/1.ChatSample"//rootからサンプルまでの相対パス
        }
    ]
}
YoutubeのAPIリファレンスからchannelIdを調べる

# 結論
リファレンスにあるAPIの試し実行を使用して調べたいチャンネルのchannelIdを調べることができました。

# はじめに
Youtubeで調べたいチャンネルのchannnelIdを調べたいと思い、どうすればいいか調査したのですが、他の記事に掲載されているような方法だとなぜかなかなかうまくいきませんでした。結果、最終的にこの方法で私なりに調べることができたので記事としてまとめようと思います。

# 前提
Googleのアカウントが必要です。

# 手順
- リファレンスのSerch:listの画面にアクセスします。

https://developers.google.com/youtube/v3/docs/search/list?hl=ja

- 「実際に試してみる」の部分まで画面をスクロールします。
- partに「snippet」、qに調べたいチャンネルの動画がヒットしそうなキーワードを入力します。
- ※追記(2024/05/08)さらにtypeに「channel」と入力しておくと、チャンネルだけを出力してくれるので絞り込みやすくなります。

![channnelId01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/fbd22148-e232-ec57-815b-60a502fd0719.png)
![channnelId02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/41af81ff-1c7b-4373-af58-2131cf1da072.png)

- 「EXECUTE」をクリックします。
- Googleの認証が始まります。ログイン、認証の許可を行います。
- 結果に「200」と表示されていることを確認します。
- 結果のJSONの中から調べたいチャンネルの情報であろうものを探します。
- その情報にある「channelId」がchannelIdです。
![channnelId04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/5473371a-d311-09bc-0baa-de343acff6a4.png)

以上です。
インラインで使ってるSVG画像の一部が消える！

無駄に1時間ぐらい掛かったしchatGPT先生もお悩みだったので書き残し。

## 起きた事
1. SVG画像をインラインで利用する必要があり複数の画像を設置
2. PCで確認すると一部の画像が欠けている
2. 正しく表示されている画像もある

## 原因
複数の画像でidが重複していた事が原因。
今回だとclip-pathに指定されるIDが複数の画像で同一名になっていました。

```html
<svg>
  <defs>
    <clipPath id="clip-path">
      <rect />
    </clipPath>
  </defs>
  <g clip-path="url(#clip-path)">
    <path />
  </g>
</svg>
```

## 対応
idに連番などを付けてユニークな値にする
Macの初期設定-Pythonの導入とtkinterの設定

# はじめに
<!-- 発端や概要を記載 -->
Macの初期化をしたので最初のHomebrewとanyenv,pyenvのインストールの仕方を残しておく。
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Homebrew](#Chapter1)
1. [anyenv](#Chapter2)


#環境・バージョン
- macOS BigSur ver11.3
- Python 3.9.4
- anyenv 1.1.2
- pyenv 1.2.26

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 1.Homebrew
[ここ][1]の記事を参考にHomebrewのインストールを行う。

[1]:https://qiita.com/zaburo/items/29fe23c1ceb6056109fd
<a id="#Chapter2"></a>
# 2.anyenv,pyenv,python,tkinter
[ここ][2]の記事を参考にanyenvとpyenvを使ってpythonをインストールを行うが、このままではtkinterが8.5verのまま呼び出されてしまい表記ミスが多々あるのでpythonインストールの前に[ここ][3]の記事を参考にtcl-tkとpythonのインストールを行う。
pyenvのインストールが下記のスクリプトでtcl-tkのインストールをする。

```ruby:
brew install tcl-tk
```

インストール完了後下記のような設定をするように指示されるので従う。

```ruby:
If you need to have tcl-tk first in your PATH run:
  echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> /Users/myname/.bash_profile

For compilers to find tcl-tk you may need to set:
  export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
  export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
```

export ~で書かれている部分をコピーして以下のスクリプトでbashへの書き込みが行えるので設定後:wqで編集を終了する。

```ruby:
vi .bash_profile
```

その後pythonのインストールを行うが以下の記述を追記する。

```ruby:
PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'" pyenv install 3.9.4
```

これはbrewでインストールしたtcl-tkが8.6なのに対してpyenvが8.5を使用するところをオプションで8.6で行うようにしている。
下記の二つのスクリプトを実行しtkinterのバージョンが8.6になっている事を確認する。

```ruby:
pyenv global 3.9.4
python -m tkinter
```

[3]:https://qiita.com/saki-engineering/items/92b7ec12ed07338929a3
[2]:https://qiita.com/suke_masa/items/f4db76408b4739de11e3
<a id="#reference"></a>
【Paiza問題集】標準入力メニュー/N行M列のデータの入力

# Paiza問題集
Pythonで回答

## 標準入力メニュー　N行M列データの入力

### Step1 3行3列の整数の入力
```Python
"""
3行3列の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_step1
"""

# 配列を作成する
number = []

# 数字の行列を受け取る
for i in range(3):
    number_i = list(map(int, input().split(' ')))
    number.append(number_i)

# 数字の行列の表示
for i in range(3):
    print(*number[i])
```


### Step2 N行3列の整数の入力
```Python
"""
N行3列の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_step2
"""

# 整数を受け取る
count = int(input())

# 配列を作成する
number = []

# 整数列を受け取る
for i in range(count):
    number_i = list(map(int, input().split()))
    number.append(number_i)

# 整数列を表示する
for i in range(count):
    print(*number[i])
```


### Step3 3行M列の整数の入力
```Python
"""
3行M列の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_step3
"""

# 整数を受け取る
count = int(input())

# 配列を作成する
number = []

# 整数の行を受け取る
for i in range(3):
    number_i = list(map(int, input().split()))
    number.append(number_i)

# 整数の行を表示する
for i in range(3):
    print(*number[i])
```


### STEP4 N行M列の整数の入力
```Python
"""
N行M列の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_step4
"""

# 整数を受け取る
num1, num2 = map(int, input().split(' '))

# 配列を作成する
number = []

# 整数の行列を受け取る
for i in range(num1):
    number_i = list(map(int, input().split(' ')))
    number.append(number_i)

# 整数の行列を表示する
for i in range(num1):
    print(*number[i])
```


### Final問題 行ごとに要素数の異なる整数列の入力
```Python
"""
行ごとに要素数の異なる整数列の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_boss
"""

# 整数を受け取る
count = int(input())

# 配列を作成する
number = []

# 整数列を入力する
for i in range(count):
    number_i = list(map(int, input().split()))
    number.append(number_i[1:])

# 整数列を表示する
for i in range(count):
    print(*number[i])
```
pythonで読み込んだCSVデータから集計値を取得する

## 目的
こんなCSVデータを読み込んだ時に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353370/23eac87b-247c-ef80-6d76-878d80ec2e05.png)
列データの合計（値段の場合500+400+600=1500）を出力する方法

## 環境
jupyter notebook
python

## 例
* CSVを読み込んで変数（例；sample_data）に入れる
```
import pandas as pd
sample_data = pd.read_csv("サンプルデータ.csv", encoding="shift_JIS")
```
* 変数["集計したい列名"].sum() で合計値が出力される
```
sample_data["値段"].sum()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353370/ceba2c15-a7bc-eacb-644b-2a4fb379d883.png)

* 文字が入っている列の場合、文字が結合されて出力される。
```
sample_data["種類"].sum()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353370/fc7fcf7b-dc8d-5b09-06b7-a8005308761c.png)
ChatGPTはエンジニア不足問題を解消する銀の弾丸か？

## 業界の構造的に不足するエンジニア

『2030年にIT人材が最大79万人不足する』とのレポートが出ています。
これを回避するためには『未経験エンジニア』を積極的に採用して『一人前エンジニア』に育てていかないといけません。

ところが、SESで人月商売では『パイセン１人月』、『未経験エンジニア１人月』といった **人単位の契約** となっており、**パイセン側も自分の仕事をするので精一杯で未経験エンジニアを育成する余裕がない**ということが発生します。

昔から銀の弾丸の様に語られがちな OJT(On the Job Training) という案件をやりながら訓練するという方法は、そういった問題について考慮がなされておらず、以下の式で表される変数の多いガチャとなっていると言えるでしょう。

- **OJTでの成長 = 本人の素養 x メンター x 案件**

パイセンのパイセンに色々教えてもらって育ったメンターパイセンは、下の人に色々教えるかもしれませんし、その逆もあるかもしれません。また、そもそも手順書通りやるだけの案件に配属された場合は、教育や育成といった概念が存在しないかもしれません。
当然本人の素養がない場合は、メンターや案件がいくらよくても成長しないという結果にもなりえます。

そんな中で、忙しそうにしているパイセンの顔色とタイミングを伺い、なんとか質問をして案件の課題を解決しつつ自分も成長していくというのには限界があるように感じていました。

…そんな最中、ChatGPTが登場しました。

## 最強のメンター ChatGPT？

『**いつでも聞けて、何でも怒らずに答えてくれる**』

人類が、ない時間を削って『アンガーマネジメント』の本など読んで、なんとかして怒らない方法を身につけている間に、全く怒らない何でも答えてくれる最強の先生が登場しました。

たまに（頻繁に？）嘘をつきますが、人間のパイセンも何でも答えられるかというとそうでもないということを考えると、充分よい先生であると言えるでしょう。
知識をひけらかしたり変なマウントを取ったりせずに、質問のレベルに合わせて回答のレベルを調整して簡潔に答えてくれるのもポイントが高いと言えるでしょう。**心理的安全性マックス**です。

若手を観測していたところ、パイセンに質問することなく知識を効率的に身につけているようにも見えたので、これは現場の教育などの考え方を大きく変える可能性があるなと感じました。

## コミュニケーションスキルが低下する？

深刻なメンター不足問題が解決するかに思えたのですが、不意に次の問題が頭をよぎりました。

コミュニケーションスキルの低下問題です。

人間には「**使わないスキルは衰える**」という恐ろしい性質があります。

開発工程の作業など、自分がスキルを身につけられれば後は時間をかければ一人で解決できる課題については、ChatGPT先生は最高に優秀なメンターとなってくれるでしょう。

ところが、パイセンに些末な質問はしなくてよくなるかもしれませんが、**要件や仕様** などは確認する必要がでてきますし、経験年数が上がって立場も上がればお客様に直接質問する機会もでてくることでしょう。

この時に、**人間は全く汲み取ってくれず、コミュニケーションが成立しない** という絶望を経験するかもしれません。

ChatGPT先生としか会話をしないことにより無自覚のうちに「**相手のことを慮る能力**」や「**整理して説明する能力**」などを使う機会がなくなり、それらの能力が衰えていく可能性があるように思えました。

## 上流工程人材不足に拍車をかけるのでは？

要件定義や外部設計の難しさは、**多くの利害が異なる関係者の意見を集めて、できるだけ多くの人が納得するように調整すること**にあると思います。

ChatGPT先生の登場によって、短期的には、目先の開発力を維持することはできるかもしれないけれども、長期的に見た場合に、要件定義や外部設計を行う人材の確保が一層難しくなっていくようにも思えました。

その場合、要件が定義できず外部設計もできなくなり、開発案件が減り、「IT人材」は不足しているけれども、開発者が余っているという不思議な状況になることも考えられました。

## おわりに

ChatGPT先生の登場により、深刻なメンター不足問題が解決する可能性が垣間見えました。
ただ、その背後にはより難しい問題が見え隠れしている様にも思えました。

とは言え、ChatGPT先生をあえて使わない意味はないと思います。

われわれが作るソフトウェアは、**AIではなく人間を幸せにするためのモノ**であるはずなので、目の前のパイセンや同僚やお客様とコミュニケーションを取って、自分の作るソフトウェアの素晴らしさをきちんと伝えたり、お客様の想いをきちんと受け止めたりすることを忘れずに、用法・用量を守って利用していくのが良いのかなと感じました。

## おまけ１（新卒エンジニア向け手紙）

https://qiita.com/kaku3/items/2c8d4d783be7ce4fc9ea

https://qiita.com/kaku3/items/0bf1703cb8d6f84afbc5

## おまけ２（新卒エンジニア向け記事）

https://qiita.com/kaku3/items/fb949aa1a53f1f71c796

https://qiita.com/kaku3/items/aa2f81cf1e3974b8ad3a

https://qiita.com/kaku3/items/937354cc180c8bee823b

https://qiita.com/kaku3/items/b1c94328f273c750286b

## おまけ３（...は難しいシリーズ）

https://qiita.com/kaku3/items/f8411523cce000de750e

https://qiita.com/kaku3/items/b4e038f5e91895aae163

https://qiita.com/kaku3/items/5b11d2e1aace73c36340

https://qiita.com/kaku3/items/34b40446337a59213a75

## おまけ４（営業A短編シリーズ）

https://qiita.com/kaku3/items/03aae7b9e3c70c55f513

https://qiita.com/kaku3/items/3378ea55b1240d7360a1

## おまけ５（エンジニアのためのお仕事問題集）

2030年にIT人材が最大79万人不足するとのことで、学習用の資料をgitで**無料**公開してます(不定期更新)。
よろしければどうぞ。

[エンジニアのためのお仕事問題集](https://github.com/kaku3/workbooks)
PySimpleGUIでボタン一つでファイルの取得

# やりたいこと
PysimpleGUIでファイル/フォルダなどを取得したい。(ボタン1つで)

# 1.ポップアップで取得する
公式のドキュメントはこちら

https://docs.pysimplegui.com/en/latest/call_reference/tkinter/popups/popup_get_file/

https://docs.pysimplegui.com/en/latest/call_reference/tkinter/popups/popup_get_folder/

これを見るのが一番早いと思います。ここでは特に重要なものを紹介します。
## ファイルを1つ取得
```python
import PySimpleGUI as sg
value = sg.popup_get_file('ファイルを選択してください!')
print(value)
```
実行結果
![スクリーンショット 2024-03-09 013257.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111324/d1d7d1c9-a963-d6ef-d0ec-62c402fd9564.png)

Browseを押すとファイルダイアログが開きます。
Okを押すとテキストボックスの入力値が、Cancelを押すと`None`が帰ってきます。
「Browse」「Ok」「Cancel」などを日本語にはできないようですね。

## ファイルを複数取得
```python
import PySimpleGUI as sg
value = sg.popup_get_file('ファイルを選択してください', multiple_files=True)
print(value)
```
`multiple_files=True`を追加すれば、ファイルを複数選択できるようになります。
Okを押すと、選択したファイルが`;`区切りで返ってきます。

## ファイルの拡張子を指定
```python
value = sg.popup_get_file('ファイルを選択してください',
                          file_types=(('Text Files', '.txt'),('すべてのファイル', '.*')))
print(value)
```
file_types=((`typeの名前`,`.拡張子名`),)　のように、tuple区切りで指定します。
サンプルコードは拡張子が.txtのファイルか、すべてのファイルを取得できるようにしたものです。
![スクリーンショット 2024-03-09 021754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111324/9eb14915-47e1-c52f-3120-ac909574b0f3.png)

:::note warn
macだとこの機能がうまく働かないようですので注意してください。
:::

## フォルダを取得
`popup_get_file`を`popup_get_folder`に変えるだけです。(multiple_filesやfile_typesは使えません)

# 2.FilesBrowseやFolderBrowseを使う
公式のドキュメントはこちら

https://docs.pysimplegui.com/en/latest/call_reference/tkinter/elements/pre_defined_buttons/#filebrowse
```python
import PySimpleGUI as sg

layout = [
    [sg.Text('ファイルを選択して下さい')],
    [sg.InputText(),sg.FileBrowse('開く', key='filebtn')],
    [sg.Button('パスを表示', key='printbtn')]
]

win = sg.Window('ファイルの選択', layout)

while True:
    event,value = win.read()
    if event == 'printbtn':
        print(value['filebtn'])
    elif event == sg.WIN_CLOSED:
        break

win.close()
```
実行結果
![スクリーンショット 2024-03-09 095515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111324/4b432e5c-0d71-9d91-8baf-90234f709760.png)
**開く**をクリックするとファイルダイアログが開き、ファイルを選択すると、 InputText の領域にファイル名が表示されます。
**パスを表示**をクリックするとファイル名が出力されます。

ファイルを複数取得可にしたい場合は`FileBrowse`を`FilesBrowse`にします。
フォルダを取得したい場合は`FolderBrowse`にします。

### ボタン一つでやりたい
InputTextをなくして、かつファイルを選択したときに(**パスを表示**を押さなくても)自動でパスが出力されるようにしたい。
```python
import PySimpleGUI as sg

layout = [
    [sg.Text('ファイルを選択して下さい')],
    [sg.FileBrowse('開く', key='filebtn', enable_events=True)]
]

win = sg.Window('ファイルの選択', layout)

while True:
    event,value = win.read()
    if event == 'filebtn':
        print(value['filebtn'])
    elif event == sg.WIN_CLOSED:
        break

win.close()
```
実行結果
![スクリーンショット 2024-03-09 103051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111324/52ccc321-6cdb-974a-fb02-15cc05db8804.png)

`InputText`は、別になくてもかまわないので普通になくす。
    また、`FileBrowse`に`enable_events=True`を追加し、eventで検出できるようにする。
Sandboxの超基本

## はじめに
このブログは自学自習用に、salesforceの初学者向けのコンテンツを投稿していく予定です。
今日は、salesforce認定資格でもよく問われるSandboxについてまとめていきます。
## そもそもSandboxとは
Sandbox上では、本番環境のメタデータがそのままコピーされている。本番環境にリリースするApexクラスやApexトリガを開発・テストするための環境として使用することができる。
## Sandboxには4つの種類がある
各Sandboxの特徴を下記の通り。
|  | Developer Sandbox| Developer Pro Sandbox| Partial Copy Sandbox| Full Sandbox|
|:--|:--|:--|:--|:--|
|更新間隔|1日|1日|5日|29日|
|ストレージ制限|200MBまで|1GBまで|5GBまで|本番環境と同等|
|コピーできる内容|メタデータのみ|メタデータのみ|メタデータとサンプルデータ|メタデータとすべてのデータ|
|テンプレート|利用できない|利用できない|必要|利用可能|
|使用用途|開発、単体テスト|開発、単体テスト（Developer Sandboxの強化版）|ユーザ受け入れテスト、インテグレーションテスト、トレーニングなどの品質保証作業|負荷テスト|

※Partial Copy SandboxとFull Sandboxは、1組織につき1環境のみの作成となる。
※Full Sandbox は更新間隔が長いため、開発には不向き。

Sandboxに関する用語の意味は下記の通り。
- テンプレート
    - 上記の表の通り、Full Sandbox または Partial Copy Sandbox でのみ使用可能。
    - Sandbox の作成時または更新時にコピーする特定のオブジェクトとデータを選択して、各 Sandbox のサイズおよびコンテンツを制御する。
- 更新
    - 「リフレッシュ」とも呼ぶ。
    - 本番環境のメタデータが更新される。例えば、Sandbox上で開発した機能を本番環境にリリースした後、再びSandboxを本番環境のメタデータに合わせたいときに更新（リフレッシュ）機能を使用する。
## Sandboxの作成手順
1. Salesforceの「設定」画面上から「Sandbox」を検索して呼び出す。当該 ページには、既存で作成されたSandboxやライセンス情報が表示される。
1. 「新規Sandbox」を選択し、新しいSandboxに対して「名前」や「説明文」などを入力する。
1. Sandboxの種別下部にある「次へ」を選択し、「作成」の選択により完了する。
※Sandboxの作成は、本番環境からしか実施できない。
## ライセンスとSandboxの関係
どの種類を何個まで作成可能かは、契約しているライセンスによって変わる。
|  | PROFESSIONAL EDITION| PROFESSIONAL EDITION| UNLIMITED EDITION| PERFORMANCE EDITION|
|:--|:--|:--|:--|:--|
|Developer Sandbox|10|25|100|100|
|Developer Pro Sandbox|-|-|5|5|
|Partial Copy Sandbox|使用不可|1|1|1|
|Full Sandbox|使用不可|-|1|1|
## まとめ
-  Sandboxとは、「本番環境のコピー」である。
- Sandboxには4種類存在する。それぞれのSandboxは、その使用用途（開発 or テスト、テストの場合はその種別）によって使い分けられる。
docker環境のMySQLデータベース初期化でサンプルデータインポートができなくて詰まった

# はじめに
開発学習用のメモとして投稿します。
dockerで、MySQL8.0のコンテナを立ち上げる際に、次のデータベース初期化処理を自動的に行う設定を行いました。
1. データベースの構築
2. テーブルの構築
3. サンプルデータのインポート

その際、3のサンプルデータのインポートで詰まったので、どのように解決したかについて書いていきます。

# データベース初期化の方針
dockerのMySQLイメージでは、コンテナ内の/docker-entrypoint-initdb.dというディレクトリに、拡張子が.sh、.sql、.sql.gz、.sql.gzのデータベース初期化用のファイルを配置すると、コンテナを起動した時に実行してくれます。そこで、データベース初期化は次のように行うことにしました。

- データベースの構築、テーブルの構築、サンプルデータのインポートを行う.sqlファイルを用意し、コンテナ上の/docker-entrypoint-initdb.dにマウントする。実行順序はファイル名によるため、次のようなファイルを用意する。
  - 01_create_database.sql
  - 02_create_table.sql
  - 03_load_data_infile.sql
- サンプルデータのcsvファイルを用意し、コンテナ上で、ファイルの読み取り、書き込みが許可されるディレクトリにマウントする。なお、ファイルの読み取り、書き込みが許可されるディレクトリは、secure-file-priv変数で設定できる。

## 問題点
上記方針のもと必要なファイルを用意し、`docker compose up`コマンドで、コンテナを立ち上げて、MySQLに接続してみると、サンプルデータが入っていませんでした。。

## 試したこと
データベース、テーブルは存在していたので、01_create_database.sql、02_create_table.sqlに問題があるわけではなさそうです。
とりあえず、MySQLに接続し、03_load_data_infile.sqlに記載していたクエリを実行すると、次のエラーが返ってきました。
```
ERROR 1148 (42000): The used command is not allowed with this MySQL version
```

## 原因
エラー内容でググってみると、local_infileの設定が無効になっていたことが原因でした。MySQL8.0で`LOAD DATA INFILE`ステートメントを使用するには、サーバー側とクライアント側の両方でlocal_infileを有効にする必要があるとのことです。

https://dev.mysql.com/doc/refman/8.0/ja/load-data-local-security.html#load-data-local-configuration

## 解決策
local_infileを有効とするには、シェルスクリプトを用意して、/docker-entrypoint-initdb.dにマウントしても実現できそうでしたが、my.cnfファイルに設定を記述する方が簡単そうだったので、次のようなmy.cnfを用意してコンテナ上の/etc/mysql/my.cnfにマウントすることにしました。

```my.cnf
[mysql]
local-infile=1 

[mysqld]
local-infile=1 
```

再度やり直してコンテナを立ち上げると、サンプルデータがインポートされていました！

参考にした記事

https://qiita.com/yes_dog/items/57c1a8c03aff8bb177de

https://zenn.dev/thefirstpenguin/articles/117321e71a3625
ExcelでCSVデータを作成する方法

## 目的
pythonでデータ分析する方法をメモするために、簡単なサンプルデータを作りたくなったため。
エクセルにデータを入力した後に、CSVにする。

## 使用環境
Windows11
アプリ版Excel
jupyter notebook

## 方法
エクセルに情報を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353370/881978db-93b3-3f49-00aa-1074636f3ee5.png)

名前を付けて保存
* 任意のファイル名を付ける。
* ファイルの種類を「CSV(コンマ区切り)(*.csv)」にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353370/7748daa3-1c0f-9b34-8794-27d62c623446.png)
CSVデータができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353370/4562cdc2-0ff1-389a-8853-51ef3e36231c.png)

## pythonで読み込めるか確認
pasdasライブラリをインポートして、サンプルデータcsvを読み込んでみる
* endoding="shift-jis"　を入れているのは、日本語の表記が含まれているため。英語のみであればencoding="shift-jis"は不要。
```
import pandas as pd
pd.read_csv("サンプルデータ.csv", encoding="shift-jis")
```
読み込めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353370/9c028553-5fe1-00a7-cbf1-a27ddb45cae9.png)

## 失敗例
encoding="shift-jis　なしだと「UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte」というエラーが出た。
```
import pandas as pd
pd.read_csv("サンプルデータ.csv")
```

## 参考文献、感謝
CSVに日本語表記が含まれている場合のエラー対処について、[こちらの記事](https://qiita.com/Louis23fc/items/e41733416957408c93fb)を参考にさせていただきました。ありがとうございました。
カスタムメタデータとカスタム設定の使い分け

## はじめに
初投稿です。
前回の資格試験のときにつまづいた、カスタムメタデータとカスタム設定の違いについて、まとめていこうと思います。

## カスタムメタデータ
カスタムオブジェクトのように、項目（カスタムメタデータ型項目）を定義し、レコードを作成、更新、削除できる。

### 大きな特徴
- 作成したレコードのリリースが可能。変更セットやMetadata APIでのリリースに含めることができる。マスターデータ（業務を遂行する際の基礎情報となるデータ、更新頻度が低いことが特徴）の管理に向いている。
- データへのアクセスが容易。SOQLや数式からの参照が可能である。
※SOQLにおいては、ロングテキスト項目を含まない場合に限り、ガバナ制約の対象外。
```java
SELECT Id, SampleField__c FROM SampleMetaData__mdt WHERE DeveloperName = 'TestA' LIMIT 1]
```
- テストメソッドにおいて、seeAllData=trueを使用せずに、レコードにアクセスが可能。

### 使い方
1. 「設定/カスタムメタデータ型/新規カスタムメタデータ型」を選択し、ラベルとAPI名を入力して保存する。
1. カスタム項目セクションの「新規」を選択する。データ型、ラベル、API名（、文字数）などを入力し、保存する。
1. 「設定/カスタムメタデータ型/レコードの管理/新規」を選択し、ラベル、API名、カスタム項目を入力し、保存する。
※カスタムメタデータには、複数選択リストや数式などのデータ型の項目が作成できない、レコードタイプが存在しないなどの制約事項もある。
※カスタムメタデータのレコード一括作成を行いたい際には、以下の記事を参照。

https://qiita.com/Aptenodytes9/items/ebf059fe35aea153b494


## カスタム設定
一つのレコードに対して、たくさん項目を作成し、固定値を設定するようなイメージ。
カスタム設定には「リスト」と「階層」の2つの設定種別がある。
※現在、「リスト」形式のカスタム設定は新規作成できなくなっており、代わりにカスタムメタデータの利用が推奨されている。

### 大きな特徴
- 特定の組織、プロファイル、ユーザ単位で定義することが可能。
- 作成したレコードは、変更セットやMetadata APIに含めることができない。そのため、リリース後は手動で追加する必要がある。
- 数式からの参照が可能。
```java
$Setup.SampleCustomeSetting__c.SampleField__c
```
- テストメソッドにおいて、アクセスが不可。アクセスするためには、seeAllData=tureが必要。

### 使い方
1. 「設定/カスタム設定/新規」を選択し、ラベルとオブジェクト名を入力して保存する。
1. カスタム項目セクションの「新規」を選択する。データ型、ラベル、API名（、文字数）などを入力し、保存する。
1. 「設定/カスタム設定/Manage」を選択し、カスタム項目を入力し、保存する。この時点で、組織のデフォルト値か、プロファイル・ユーザごとの値かを選択し、使い分ける。
※カスタム設定は、カスタムオブジェクトの一種。各カスタム設定は、組織で使用可能なカスタムオブジェクトの総数の一部として加算される。

## まとめ
- 数式やソースコードに対して、IDやURLをべた書きしないためには、必須の機能。
- 基本的にはカスタムメタデータの使用を検討し、要件が満たせないとき（プロファイル、ユーザ単位で値を切り替えたいなど）はカスタム設定の利用を検討する。

## 参考サイト
- [カスタムメタデータ型（SALESFORCE ヘルプ）](URL "https://help.salesforce.com/s/articleView?id=sf.custommetadatatypes_overview.htm&type=5")
- [カスタム設定（SALESFORCE ヘルプ）](URL "https://help.salesforce.com/s/articleView?id=sf.cs_about.htm&type=5")
【AndroidStudio】コードが右端までいったら折り返す設定

# はじめに
コードが右端までいったら折り返す設定を行ったので記録しておきます。

# 設定
① 「AndroidStudio」を選択します
② 「Settings...」を選択します
![スクリーンショット 2023-05-14 0.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1f3a8ad9-40ee-f5aa-0159-41b764147cfb.png)

③ 「General」を選択します
④ 「Solt-wrap these files」のチェックボックスにチェックをいれます
![スクリーンショット 2023-05-14 0.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b727fcd1-6909-bff9-5f83-afb3dac8dd88.png)

⑤ 折り返しを適用したいファイルの拡張子を追加します(私はDartを追加しました)
![スクリーンショット 2023-05-14 0.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a61b7475-d923-eb38-bcb1-24954483d460.png)

:::note warn
**注意**
区切りは`;`です
:::

⑥ 「Apply」を押します
![スクリーンショット 2023-05-14 0.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1a592882-81ee-fd25-c207-fdff9d80d9bb.png)

# おわり
折り返しを設定することができました！！