OmniAICreator/Qiita-1.07M huggingface dataset:
terraform stateのサブコマンドを整理する

## はじめに
`% terraform state`のサブコマンドの内、いくつかを業務で使ったので、これを機に`% terraform state`のサブコマンドの使用例やシチュエーションについてまとめたいと思います。


## 本編
### terraform state list 
`% terraform state list`はstate内のリソース一覧を取得できます。

```bash 
% terraform state list 
aws_instance.example
module.example
module.example.module.child
module.example.aws_instance.example
...
```

`-state=statefile`でstatefileを指定できたり、`-id=ID`でID指定もできます。
ID指定以外の絞り込みは`grep`さえ使えば良さそうです。

### terraform state mv
`% terraform state mv`はリソース名の変更やリソースのモジュールへの移動等ができます。また異なるステートファイルへの移動も可能です。

```bash 
% terraform state mv aws_instance.old aws_instance.new
```

また`terraform`では破壊的変更が加わるコマンドには`-dry-run`オプションがついていることが多く(全てついているかもしれません)、`terraform state mv`も例外ではありません。

以下のように実行するのをオススメします。
```bash 
% terraform state mv -dry-run aws_instance.old aws_instance.new
% terraform state mv aws_instance.old aws_instance.new
```


:::note warn 
`mv` は破壊的コマンドなので使用には十分注意し、適宜バックアップをとって実行して下さい
:::

### terraform state pull 
`terraform state pull`はステートファイルをプルして標準出力するコマンドです。


```bash 
% terraform state pull 
```

特定のファイルに保存するために、リダイレクトと一緒に使うと良いでしょう。

```bash 
% terraform state pull > backup.tfstate
```

`terraform state pull`はステートを変更する作業を実施する際には、バックアップを取るという意味で実施した方が良いでしょう。

### terraform state push
`terraform state push`はローカルのステートファイルをリモートへプッシュするコマンドです。

```bash 
% terraform state push　backup.tfstate
```

`-force`で強制pushも可能です。


### terraform state replace-provider
`terraform state replace-provider`はステートファイル内のプロバイダー情報を置換するコマンドです。プロバイダーのアップグレードや変更時に役立ちます。 

```bash
% terraform state replace-provider registry.terraform.io/-/aws registry.terraform.io/hashicorp/aws
```

### terraform state rm
`terraform state rm`はステートファイルからリソースを削除するコマンドです。

```bash 
% terraform state rm aws_instance.unwanted
```

先述した理由と同じ理由で`-dry-run`をつけて実行するのが良いでしょう。

```bash 
% terraform state -dry-run rm aws_instance.unwanted
% terraform state rm aws_instance.unwanted
```

### terraform state show
`terraform state show`はステートファイル内の特定のリソースの詳細情報を表示できます。
`terraform state list`で正確なリソース名を取得してから実施すると良いでしょう。

```bash 
% terraform state show aws_instance.example
```

## おわりに
いかがだったでしょうか。
知識の整理に役立てば幸いです。

## おまけ
合わせて読みたい記事(個人的偏見に基づく)

https://qiita.com/takkii1010/items/082c0854fd41bc0b26c3#terraform-fmt

https://qiita.com/minamijoyo/items/b4d70787556c83f289e7#state-mv
VSCodeでもAndroidの実機をPC上に表示できるようにしたいんじゃ！！（scrcpy）

![スクリーンショット 2024-06-17 20.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/a70a683f-9bcc-3480-cf89-635376294f0c.png)


# はじめに
なかなか忙しくて記事を書く暇がない時期ですが、時間を作ってかけるだけ書こうと思います。なぜならのちに自分にとって役に立つからです。

:::note warn
警告
scrcpyは、VSCode内に埋め込めたり VSCodeと連携している訳ではなくて、完全に別のプロセスとして実行されているそうです。
:::

アドバイスいただきありがとうございます🙇


https://x.com/YumNumm/status/1802680730436149290



# やりたいこと
- VSCodeでもAndroidの実機をPC上に表示できるようにしたい

# 背景
- Android Studioではとても簡単にAndroidの実機をPC上に表示できましたが、VSCode初心者の僕はすぐに見つからなかった


# やり方

:::note info
以下のリポジトリから引用させていただきます。
:::

https://github.com/Genymobile/scrcpy


### Homebrewからインストールをする

```
brew install scrcpy
```

### adbからアクセスできるようにする

```
brew install android-platform-tools
```

### 実際に表示してみる
:::note info
前提として、実機を繋いている状態になっている必要があります。
:::

```
scrcpy
```


# 実際のデモ画像

![スクリーンショット 2024-06-17 21.11.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/2bc247a4-b81e-250a-454a-963072e37a89.png)
[Terraform]CloudfrontにWAFアタッチ時にエラー

# TerraformでCloudfrontにWAFアタッチ時にエラー

TerraformでWAFをCloudfrontにアタッチしようとした際にエラーが発生しました。

WAFとCloudfrontは公式モジュールを利用して作成しています。

- エラーログ

```log
╷
│ Error: updating CloudFront Distribution (E3SVU6W6XV9FRF): InvalidWebACLId: Web ACL is not accessible by the requester.
│  status code: 400, request id: ac4db5f0-b3ac-4c1f-8c70-b099df011216
│
│   with module.cloudfront.aws_cloudfront_distribution.this[0],
│   on .terraform/modules/cloudfront/main.tf line 15, in resource "aws_cloudfront_distribution" "this":
│   15: resource "aws_cloudfront_distribution" "this" {
│
```

## 対処法

WAFv2の場合はWebACLのARNを指定する必要がある

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_distribution#web_acl_id

マニュアルに書いてありましたw

なので以下のように変更しました。

```diff
<   web_acl_id   = module.waf.web_acl_id # WAFのWebACL IDを指定
---
>   web_acl_id   = module.waf.web_acl_arn # WAFのWebACL ARNを指定
```

設定項目が web_acl_idなのでそのままweb_acl_idでいいだろうと思ってしまったのが
敗因ですね。

自身の固定概念にとらわれず、ちゃんとマニュアルを読みましょうということで。

## 確認

- WAF適用前

```sh
curl -I https://d2XXXXXXXXXXX.cloudfront.net
HTTP/2 200
content-type: text/html; charset=UTF-8
server: nginx
```

- WAF適用後

```sh
curl -I https://d2XXXXXXXXXXX.cloudfront.net
HTTP/2 301
server: CloudFront
date: Mon, 17 Jun 2024 11:57:26 GMT
```

WAF設定詳細は省きますが、カスタムレスポンスで明示的に別のページを表示させる仕様になります。

なのでステータスコードが301になっていれば想定している動作となり稼働確認OKです。
tailコマンドを使用してリアルタイムでログを眺める

今回はtailコマンドを使用してリアルタイムにログを確認する方法を解説致します。

## リアルタイムで確認するには？

tailコマンドの「-f」オプションを使用する事でログ等のファイルをリアルタイムで確認する事が出来ます。

動作確認を行う際にリアルタイムに反応を確認できる為、非常に便利なオプションとなっております。

下記コマンド例となります。

```
tail -f ファイルパス
```

## メールログをリアルタイムで確認する

先程解説したコマンドを使用しメールログをリアルタイムで確認してみます。

下記コマンドとなります。

```
tail -f /var/log/maillog
```

```
Jun 17 12:34:56 mailserver postfix/smtpd[12345]: connect from example.com[192.168.1.1]
Jun 17 12:34:57 mailserver postfix/smtpd[12345]: 3F1E12ABCD: client=example.com[192.168.1.1]
Jun 17 12:34:57 mailserver postfix/cleanup[12346]: 3F1E12ABCD: message-id=<1234567890@example.com>
Jun 17 12:34:58 mailserver postfix/qmgr[12347]: 3F1E12ABCD: from=<sender@example.com>, size=1234, nrcpt=1 (queue active)
Jun 17 12:34:59 mailserver postfix/smtpd[12345]: disconnect from example.com[192.168.1.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Jun 17 12:35:00 mailserver postfix/local[12348]: 3F1E12ABCD: to=<recipient@example.com>, relay=local, delay=4, delays=2/0/0/2, dsn=2.0.0, status=sent (delivered to mailbox)
```
※上記は例となります。値に意味はありません。

## 検索条件を追加してみる

先程のtailコマンドにgrepを使用する事で条件に絞った出力を行う事が出来ます。

下記例となります。

```
tail -f /var/log/maillog |grep "status="
```

今回はstatusのみを確認できるように指定しました。

```
Jun 17 12:34:58 mailserver postfix/qmgr[12347]: 3F1E12ABCD: from=<sender@example.com>, size=1234, nrcpt=1 (queue active)
Jun 17 12:35:00 mailserver postfix/local[12348]: 3F1E12ABCD: to=<recipient@example.com>, relay=local, delay=4, delays=2/0/0/2, dsn=2.0.0, status=sent (delivered to mailbox)
Jun 17 12:36:02 mailserver postfix/smtp[12349]: 4G2H34EFGH: to=<another@example.com>, relay=smtp.example.com[192.168.1.2]:25, delay=3, delays=1/0.5/1.5/0, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9C1D12ABCD)
Jun 17 12:37:05 mailserver postfix/qmgr[12347]: 5I3J45IKLM: from=<noreply@example.com>, size=5678, nrcpt=1 (queue active)
Jun 17 12:37:07 mailserver postfix/local[12348]: 5I3J45IKLM: to=<user@example.com>, relay=local, delay=5, delays=3/0.5/1/0.5, dsn=2.0.0, status=sent (delivered to mailbox)
```
Vue.jsにおけるデータ監視：watch() vs watchEffect()、どちらを選ぶべき？

# ■はじめに
Vue.jsを学習中のエンジニアです👩🏻‍💻
今回は、開発中にデータの変更を監視する際、**watch()**、**watchEffect()**　実際どちらを使用するのがオススメなのかについて記事を書こうと思います！
Vueの公式ドキュメントに詳細がありますが、簡潔に理解できるようにまとめましたので、サクッと理解したいという方にも読んでいただけると嬉しいです！

# ■watch()、watchEffect()の特徴
### watchEffect()
- リアクティブ変数の変化を監視する
  - コールバック関数内で利用されているリアクティブ変数を**全て**監視する
  →そのため、**どれか１つの変数**でも値が変更されるとコールバック関数を実行してしまう🙄
```
watchEffect((): void => {
 リアクティブ変数に応じて実行される処理
})
```

### watch()
- 監視対象を明示的に指定する
- コールバック関数内で変更前と変更後の値にアクセス可能
```
watch(監視対象リアクティブ変数, (newValue, oldValue) => {
  // 監視対象が変化した際に実行される処理
})
```
第一引数：監視対処リアクティブ変数
第二引数：コールバック関数

# 異なる点
初期起動時にコールバック関数を実行する点に違いがある！
- **watch()**:初期起動時にコールバック関数を実行しない
- **watchEffect()**:初期起動時にコールバック関数を実行する

# ■watch()メソッドでよく使用されるオプション
※個人的によく使用するオプションを2つ紹介しています。
- **{ immediate: true }**
初期起動時にコールバック関数を即時実行する
```
watch(監視対象リアクティブ変数,(): void => {
 監視対象が変化した際に実行される処理
}),
{immediate: true}
```

- **{ deep: true }**
オブジェクトや配列内の深い階層まで監視する必要がある場合に役立つ！
通常、Vue.jsはオブジェクトや配列のプロパティの変更をトップレベルでしか監視しない
→このオプションを使用するとネストされたプロパティの変更も検知することができる✨
```
const state = reactive({
  user: {
    name: 'John',
    age: 30,
    address: {
      city: 'Tokyo',
      country: 'Japan'
    }
  }
})

watch(
  () => state.user,
  (newValue, oldValue) => {
    console.log('User info changed:', newValue);
  },
  { deep: true }
)

// state.user.address.city の変更を監視
state.user.address.city = 'Osaka'
```
→コンソールに 'User info changed:' というログが出力される

つまり、{ deep: true }オプションを使用することでstate.userオブジェクト内のaddress.cityプロパティの変更も検知することができるようになる

# ■結果：watch()推奨
watchEffect()を使用するメリット：
コールバック内で使用される全てのリアクティブ変数を自動的に追跡するため、設定がシンプルになる
→**意図しない処理が行われてしまう可能性がある**

**結論**
監視対象を明示的に指定するため、コードの予測可能性が高まり、意図しない処理が実行されるリスクを回避できるwatch()を推奨！

# ■おわりに
ここまで読んでくださりありがとうございます🙇🏻‍♀️
もしwatch()、watchEffect()のどちらを使用したらいいのか迷った際は、watch()を試してみてください！
G検定合格までの勉強法と感想：AI初心者だった医者の挑戦

2022年開催の日本ディープラーニング検定のG検定 JDLA Deep Learning for GENERAL 2022 #3合格時の感想と行った勉強を投稿する。

G検定は、AIやディープラーニングに必要な基礎的な知識を問うもので、機械学習を学ぶ第一歩として位置づけられている。

私は、プログラミング言語や数学が得意というわけではないが、医学や臨床、基礎研究に機械学習を取り入れたいと思っている。

自分のようにIT関連のバックグラウンドがなくても、AIに興味があるけれど何をやったらよいかわからないという人には最初の一歩としておすすめ。ただし、G検定を取得しても実際に実装ができるレベルにはならない。検定ではAIに関する社会的、倫理的な知識も含めて広く浅く問われる。AI関連の用語を理解できるレベルにはなったので、やってよかったと感じている。

自分が行った勉強法を紹介しようと思う。ちなみに、試験勉強は2週間前から始めた。それまではGoogle Colabでコードをいじって遊んでいた。

1. **UdemyのG検定対策講座**
   理解が必要な部分だけ視聴した。本当は全部見たかったが、こういう講座系は私は寝てしまうので無理だった。

2. **Study AI**
   β版を登録し、時間制限なくひたすら知識を整理した。ここから約3割くらい出題された感じ。

3. **DIVER**
   G検定の無料模試があったので、直前に解きまくった。120分でオンラインで解く形式なので、時間配分の練習になった。これも約3割くらい出題された感じ。

②と③は完璧になるまで解きまくった。

**G検定本番の感想**
受験中にググって調べることも可能だが、とにかく時間が足りない。ノー勉では受からないと思う。試験問題は模試よりも長文が多く、ググってもわからないような工夫がされていた。「知識を詰め込むだけでなく、本質や意味をちゃんと理解していますか？」というメッセージが感じられた。
モチベーション維持のコツ

# はじめに

こんにちは！仕事をする上で、モチベーションを維持する方法って、永遠のテーマですよね。

先日、モチベーション維持について質問を受けたので、開発エンジニアの視点から、私なりの考えをシェアしたいと思います。

# モチベーションが高い人と低い人の違い

まず、モチベーションが高い人と低い人の特徴を比べてみましょう。

### モチベーションが高い人の特徴

* **目標志向**: 明確な目標を持ち、それを達成するために努力を続けられる
* **成長意欲**: 新しい技術や知識を積極的に学び、スキルアップを目指している
* **課題克服**: 困難な課題にも積極的に取り組み、解決方法を見出す
* **達成感**: 目標達成やスキルアップを実感し、大きな喜びを感じている
* **周囲との協調性**: チームメンバーと協力し、共通の目標に向かって進んでいく

### モチベーションが低い人の特徴

* **目標不明確**: 目標が曖昧で、具体的な行動計画がない
* **現状維持**: 新しいことに挑戦する意欲が低く、現状維持を好む
* **困難回避**: 困難な課題を前に、すぐに諦めてしまう
* **達成感の欠如**: 目標達成やスキルアップを実感できず、満足感を得られない
* **孤立**: チームメンバーとのコミュニケーションを避け、孤独を感じている

#  モチベーション維持の鍵

では、どうすればモチベーションを維持できるのでしょうか？

**1. 全ての経験はプラスになる！**

仕事は楽しいことばかりではありません。しかし、どんな経験も必ず将来役に立ちます。

理不尽な状況は別として、経験をプラスに捉え、前向きに取り組みましょう。

**2. 作業への取り組み方を深める**

単調な作業も、ただこなすのではなく、品質や効率、セキュリティ、ユーザー体験など、より深い視点で取り組むことで、仕事の質が向上し、充実感も生まれます。

例えば、テスターなら、単にテスト項目を消化するだけでなく、「品質管理」という視点で、より良い製品作りに貢献することを意識してみましょう。

**3. 将来のビジョンを描く**

これは少しエネルギーが必要ですが、現在の作業から将来のビジョンまで、具体的なステップを描き出すことで、目の前の作業が、そのビジョンを実現するための重要なステップになります。

例えば、以下のようなポジティブなロードマップを作ってみましょう。

- 実装とテストを担当している →
- コーディング能力と品質管理の視点が磨かれる →
- 設計を任せられるようになり、人に教えることができるようになる →
- チームリーダーを任される →
- スペシャリストまたはマネジメントの道が開ける →
- CTOや部門長、事業部長になる →
- コンサルや事業作りができるようになる →
- 人脈もでき、定年後も個人で稼いでいける

このように、未来のポジティブな自分をイメージすることで、現在の作業へのモチベーションを高めることができます。

## まとめ

開発エンジニアとして、モチベーション維持は非常に重要です。

未来へのビジョンを描き、目の前の課題を乗り越えることで、より充実した開発ライフを送ることができるでしょう。

皆さんの開発が、より一層充実したものになることを願っています！
コンソール画面をニーアレプリカント風のデザインにしたい

## コンソール画面をニーアレプリカント風のデザインにしたい

今回はコンソール画面をニーアレプリカント風のデザインにした記事となります。

## 試行錯誤

ニーアレプリカントではハッキングというミニゲームがあります。

その際に近未来的なコンソール画面が表示さるのですが
その画面がめちゃくちゃカッコいいんです!

という理由で、今回は上記のゲーム画面の配色を元に雰囲気を寄せたコンソール画面を作成する事が目標となります。

## 色を合わせた場合
ニーアレプリカントでのハッキング画面は背景色が「白色に近いベージュ」となり、文字色が「淡いグレー」となります。

下記試してみた画面となります。

![na002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/6a7e499b-2866-b90c-c264-9d4ee2ea0ad4.png)

カラーコードは以下となります。

```
#背景
HEX:   #c1baa0
RGB:   rgb(193,186,160)


#文字
HEX:   #333232
RGB:   rgb(51,50,50)
```


上記、雰囲気を近づける事が出来ましたが...個人的に文字の視認がしずらいと感じました。

こちらでは障害対応等で深夜にパソコンを開くと明るすぎて目にダメージが.....といった事が予想されます。

## 雰囲気をそのままに視認性を上げてみる

上記の反省を活かし背景色と文字色を入れ替えてみます!

下記試してみた画面となります。

![na001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/61b4c338-0b82-3082-c370-d887ab981c2a.png)

カラーコードは以下となります。

```
#背景
HEX:   #333232
RGB:   rgb(51,50,50)


#文字
HEX:   #c1baa0
RGB:   rgb(193,186,160)
```

かなりバランスの良い配色になりました!
皆様の是非、好みに合わせてカスタムしてみてはいかがでしょうか。
【ShellScript/PowerShell】コマンドの途中で改行する方法

## シェルスクリプト

バックスラッシュ`\`を用いると、コマンドの途中で改行し見やすくできます。

```bash
$ docker container run \
    --name ubuntu1     \
    --rm               \
    ubuntu:22.04       \
    cat /etc/lsb-release
```

## Windows PowerShell

PowerShellの場合は、バックスラッシュ`\`ではなくバッククォート<code>`</code>を使用します。

```powershell
> docker container run `
    --name ubuntu1 `
    --rm `
    ubuntu:22.04 `
    cat /etc/lsb-release
```

## 参考

https://www.tohoho-web.com/ex/power-shell.html

https://qiita.com/suin/items/96232f2d60ca5a13ac6d
【Progate】SQLコースを終えての所感

## 自己紹介
29歳。文系卒。新卒入社でWebディレクターを２年半経験。
その後は番組の字幕制作の仕事に従事。
現在はエンジニア転職を目指して勉強中。

## SQLの印象
データベースを操作する言語で、SELECT文を使って情報を取得する。
そんなぼんやりとした記憶のまま臨みました。

## 覚えておきたいこと
今後の自分が役立ててくれることを信じて、学んだことをレッスンごとにまとめます。

### レッスン１
式の末尾には必ずセミコロンが必要ですが、以降では省略します。
~~~sql
/* カラムの取得 */
SELECT カラム名,カラム名...
FROM テーブル名

/* 全カラムの取得 */
SELECT *
FROM テーブル名

/* 条件指定 */
/* 文字列は""で囲む */
/* 「=」以外にも「>=」などの演算子を使用可能 */
WHERE カラム名 = 条件

/* LIKE演算子 */
/* 指定した文字列を含むカラムを取得 */
/* 前後に「%(ワイルドカード)」を使用可能 */
WHERE カラム名 LIKE "文字列"

/* NOT演算子 */
/* 条件を満たさないデータを取得 */
WHERE NOT カラム名 = 条件

/* NULLの指定 */
WHERE カラム名 IS NULL

/* NULLではない指定 */
WHERE カラム名 IS NOT NULL

/* AND演算子 */
WHERE カラム名 = 条件
AND カラム名 = 条件

/* OR演算子 */
WHERE カラム名 = 条件
OR カラム名 = 条件

/* 並び替え */
/* 「ASC」 昇順*/
/* 「DESC」 降順*/
ORDER BY カラム名 並べ方

/* 必要な数だけ取得 */
LIMIT 数
~~~

### レッスン２
~~~sql
/* 重複する値を除外*/
SELECT DISTINCT(カラム名)
FROM テーブル名

/* カラム名には四則演算(+,-,*,/)が使用可能 */
SELECT カラム名-カラム名

/* 合計値 */
SELECT SUM(カラム名)

/* 平均値 */
SELECT AVG(カラム名)

/* レコードの数 */
/* NULLはカウントされない */
SELECT COUNT(カラム名)

/* 最大値 */
SELECT MAX(カラム名)

/* 最小値 */
SELECT MIN(カラム名)

/* データのグループ化 */
/* SELECTで使えるのは、GROUP BYに指定しているカラム名と、集計関数のみ */
GROUP BY カラム名,カラム名...

/* HAVING */
/* グループ化から更に絞り込む */
GROUP BY カラム名
HAVING 条件
~~~
#### ※実行される順番
WHERE(取得条件)
GROUP BY(グループ化)
SUM...(関数)
HAVING(絞り込み)

### レッスン３
~~~sql
/* サブクエリ */
/* 複数のクエリを一つにまとめる */
/* ()内にセミコロンは不要 */
WHERE カラム名 条件演算子 (
     クエリ
)

/* カラム名の付与 */
SELECT カラム名 AS "文字列"

/* テーブルを紐づける */
/* ONで結合条件を指定(主キー、外部キーを紐づける) */
/* 外部キーがNULLのレコードも取得するには「LEFT JOIN」を使用 */
SELECT *
FROM テーブルA
JOIN テーブルB
ON テーブルA.カラム名 = テーブルB.カラム名
JOIN... /* ３つ以上のテーブルを結合可能 */

/* 複数テーブルでのカラムの指定 */
SELECT テーブル名.カラム名
~~~
#### ※実行される順番
FROM(テーブルの指定)
JOIN(テーブルの結合)
WHERE(取得条件)
GROUP BY(グループ化)
SUM...(関数)
HAVING(絞り込み)
SELECT(検索)
ORDER BY(順序)
LIMIT(件数)

### レッスン４
~~~sql
/* レコードの挿入 */
/* idは自動で割り当てられる */
INSERT INTO テーブル名 (カラム名,カラム名...)
VALUES (値,値...)

/* データの更新 */
/* WHEREで更新するレコードを必ず指定する */
UPDATE テーブル名
SET カラム名 = 値,カラム名 = 値...
WHERE id = 値

/* データの削除 */
/* WHEREで更新するレコードを必ず指定する */
DELETE FROM テーブル名
WHERE id = 値
~~~


## まとめ
SQLはそんなに難しくない…と思っていましたが、実際に問題を出されると手こずる部分がありました。
なんとか試行錯誤(＋カンニング)して突破できましたが、基本的なことは一発でバシッと解けるようになりたいです。そのために、定期的に道場レッスンに挑戦しようと思います。DBなんてモロ丁寧に扱わないと危険な代物でしょうし、本番なら試行錯誤なんて絶対にNGですもんね。

間違いがあればご指摘いただけますと幸いです。

今後も継続して学習を続けていきたいと思います。

[Progate](https://prog-8.com/)
Jetson Nano 2GB のLinux Kernel を再構築する


```bash
# Before
$ cat /proc/version
Linux version 4.9.337-tegra (gcc version 7.3.1 20180425 (Linaro GCC 7.3-2018.05) ) #1 SMP PREEMPT Thu Jun 8 21:19:14 PDT 2023

# After
$ cat /proc/version
Linux version 4.9.337-tegra-customX (gcc version 7.5.0 (Linaro GCC 7.5-2019.12) ) #1 SMP PREEMPT Mon Jun 17 10:42:29 UTC 2024
```

### まずこちらのGitをクローンしてください
https://github.com/hexaforce/jetson-nano-kernel-rebuild.git

### 1.l4tのカーネルをダウンロードして解凍する
#### 執筆時の最新版は r32_release_v7.4
```bash
wget https://developer.nvidia.com/embedded/l4t/r32_release_v7.4/sources/t210/public_sources.tbz2
tar -xjf public_sources.tbz2
rm -f public_sources.tbz2
cd Linux_for_Tegra/source/public
tar -xjf kernel_src.tbz2
```

### 2.コンパイルコンテナーを作成します
#### 執筆時のLinaro7.x系の最新版は GCC 7.5-2019.12
```bash
$ docker build . -t hexaforce/jetson-kernel-rebuilder
```

### 3.1 メディアカードリーダーの[MOUNTPOINTS]を確認する
```bash
$ lsblk /dev/sdb
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sdb    8:16   1 29.5G  0 disk /run/media/{xxxx-USB-xxxx}
```

### 3.2 コンパイルコンテナーでビルド
#### {xxxx-USB-xxxx}は上記で出力されたもの

* コンテナ内からホストのUSBを参照します
```bash
$ docker run --privileged --rm -it \
-v $(pwd)/Linux_for_Tegra:/Linux_for_Tegra \
-e LOCALVERSION=-tegra-customX \
-v /run/media/{xxxx-USB-xxxx}:/usb \
hexaforce/jetson-kernel-rebuilder
```

### 4.1 ビルドコンテナの[CONTAINER ID]を確認する
```bash
$ docker ps
CONTAINER ID   IMAGE                             COMMAND
{xxxx-ID-xxxx} hexaforce/jetson-kernel-rebuilder "bash /docker-entryp…"
```

### 4.2 コンテナーに侵入
#### {xxxx-ID-xxxx}は上記で出力されたもの
```bash
$ docker exec -it {xxxx-ID-xxxx} bash
```


### 5.1 SDカードのImageとdtbを上書きする

```bash
sudo cp $TEGRA_KERNEL_OUT/arch/arm64/boot/Image /usb/boot/Image
sudo cp -r $TEGRA_KERNEL_OUT/arch/arm64/boot/dts/* /usb/boot/dtb
```

### 5.2 SDカードにカーネルモジュールをインストールする
```bash
sudo make ARCH=arm64 O=$TEGRA_KERNEL_OUT modules_install INSTALL_MOD_PATH=/usb
```
【SQLServer】特定のカラム名を持つテーブルを検索するSQL

## はじめに

業務上でSQLServerManagementStudioで検索したいカラム名を持つテーブルを探す必要が生じた。

ネット上で色々と調べて出て来たSQLを参考にしても自分の環境では全然上手くいかなかったのだが、その後もトライ＆エラーを繰り返しなんとか上手くいったので他の誰かの役に立てばと思い、ここに備忘録として残します。

## それでは本題

いきなりですが、こちらがそのSQLになります。

```sql
SELECT 
DISTINCT
	 TABLE_CATALOG AS 'データベース名'
	,TABLE_SCHEMA AS 'スキーマ名'
	,TABLE_NAME AS 'テーブル名'
	,COLUMN_NAME AS 'カラム名'
FROM
	(検索したいデータベース名).INFORMATION_SCHEMA.COLUMNS
WHERE
	COLUMN_NAME LIKE '%検索したい文字列%'
```




----

※補足ですが、INFORMATION_SCHEMA.TABLESを追加してTABLE_TYPEをSELECTに追加するとさらにTABLEかVIEWかなどが分かるようになりますが、検索結果も冗長になるのでご注意ください。
また、その場合はINFORMATION_SCHEMA.TABLESとINFORMATION_SCHEMA.COLUMNSで同じ列名が存在しますので、上記のSQLのSELECTにある4つはINFORMATION_SCHEMA.COLUMNSの列別名を付与しないと意図しない結果が出ますので合わせてご注意ください。

## おわりに

世の中はMySQLが主流だと思いますが、自分の職場はSQLServerを主に使用しています。
SQLServerもSQLServerManagementStudioも難しいですがこれからも日々精進していきます。
ここまでお付き合いいただきありがとうございました。
【Java】文字列⇔数値の相互変換

# はじめに
Javaを学びたくて読み始めた本、

「[プロになるJava ―仕事で必要なプログラミングの知識がゼロから身につく最高の指南書](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8BJava%E2%80%95%E4%BB%95%E4%BA%8B%E3%81%A7%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E7%9F%A5%E8%AD%98%E3%81%8C%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E6%9C%80%E9%AB%98%E3%81%AE%E6%8C%87%E5%8D%97%E6%9B%B8-%E3%81%8D%E3%81%97%E3%81%A0-%E3%81%AA%E3%81%8A%E3%81%8D/dp/4297126850)」

を読んでいたら無性にアウトプットしたくなり投稿しました。
# 本題
数値⇔文字列の相互変換について書きました。
## 数値⇒文字列
1つ目は、String.valueOf()メソッドを利用した場合。
2つ目は、文字列を結合した場合。(計算後に値を文字列にする場合)
3つ目は、文字列を結合した場合。(計算前に値を文字列にする場合)
~~またInteger.toString(数値)という方法もあるが、値がnullだった場合に例外が起こる。~~
```java:java
// 1つ目
String s1 = String.valueOf(100); //100から"100"に変換

// 2つ目
String s2 = 100 + 100 + ""; // 100 + 100から"200"に変換

// 3つ目
String s3 = "" + 100 + 100; // 100 + 100から"100100"に変換

```

## 文字列⇒数値
1つ目は整数(int型)に変換する場合。
2つ目は実数(double型)に変換する場合。
```java:java
// 1つ目
nt n1 = Integer.parseInt("100"); //"100"から100に変換

// 2つ目
double n2 = Double.parseDouble("100"); // "100"から100.0に変換

```

# 最後に
まだまだ学習が不足しているので続けていきたいです。

# 参考文献
「[プロになるJava ―仕事で必要なプログラミングの知識がゼロから身につく最高の指南書](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8BJava%E2%80%95%E4%BB%95%E4%BA%8B%E3%81%A7%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E7%9F%A5%E8%AD%98%E3%81%8C%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E6%9C%80%E9%AB%98%E3%81%AE%E6%8C%87%E5%8D%97%E6%9B%B8-%E3%81%8D%E3%81%97%E3%81%A0-%E3%81%AA%E3%81%8A%E3%81%8D/dp/4297126850)」
「[【Java】toString()だと『ぬるぽ』になる話](https://qiita.com/yama_coco/items/422a96dddfde3438bace)」
【AWS CF】組み込み関数「!ImportValue」と「Fn::Sub」を使ってインポートする

# 概要
AWS Cloudformationで組み込み関数を使ってインポートする場合、うまくいかずにエラーになることがあります。
正常にインポートできる方法を紹介します。

# サンプル
例えば、とあるスタックで以下のようにエクスポートしたとします。

```yaml
'PublicSubnet1-${Tag1}-${Tag2}'
```

これを、パラメータ`${Tag1}`と`${Tag2}`を同じ値の定義とする、別のテンプレートでインポートするとします。

この時、以下だとエラーになります。

```yaml
SubnetId: !ImportValue
  !Sub 'PublicSubnet1-${Tag1}-${Tag2}'
```

エラー内容：

```
E0000: did not find expected key
```

何だか一見上記でいけそうですが、Cloudformationの組み込み関数の使い方としては不適切でした。

正しくは以下です。

```yaml
SubnetId: !ImportValue 
  Fn::Sub: 'PublicSubnet1-${Tag1}-${Tag2}'
```

`!Sub`を`!ImportValue`の引数として直接使用することはできません。
代わりに`Fn::Sub`を使用すれば、`!ImportValue`の引数として解釈される文字列を生成することができます。

これにより、`Fn::Sub`が`PublicSubnet1-${Tag1}-${Tag2}`という文字列を生成し、その結果が`!ImportValue`によってインポートされ、エラーが解消されました。

組み込み関数`Fn::Sub`についての公式ドキュメントは以下。

>組み込み関数 Fn::Sub は、入力文字列の変数を、指定した値に置き換えます。テンプレートで、スタックを作成または更新するまで使用できない値を含むコマンドまたは出力を作成するために、この関数を使用できます。


https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（10/100）

【10日目】
トピック2：SAPS/4HANA生産計画の概要（4/5）

≪問題10≫
計画方針40（最終組立ありの計画）では、計画独立所要量の消費がいつ発生しますか。
□MRPによって計画手配が登録されるとき
□MRPによって従属所要量が登録されるとき
□受注を登録するとき
□受注を出荷するとき

≪解答≫
□MRPによって計画手配が登録されるとき
□MRPによって従属所要量が登録されるとき
■受注を登録するとき
□受注を出荷するとき

≪解説≫
◆最終組立ありの計画は、見込生産において最も一般的な計画方針の1つです。
◆計画独立所要量は、最終製品に必要な構成品目や組立品目の調達や生産をトリガし、受注の数量および日付に基づいて計画独立所要量が消費されます。
◆得意先所要量が計画独立所要量を超える場合、次回の計画実行時にその数量を充足するための計画手配が自動的に登録されます。
【Next.js】クライアントサイドで環境変数が使えない時

# はじめに
開発をしている時に.envに記載した環境変数が読み込めなかったのでメモ

# 環境変数とは
本番や開発など、環境ごとに中身を変えたい変数のこと。
環境変数を用いることで同じ記述のまま値の出しわけができる。

# 対策
変数名の先頭に`NEXT_PUBLIC_` をつける必要がある。
Next.jsのルールで先頭に付与しないと認識されないようです。

```
NEXT_PUBLIC_API_KEY='DUMMY_KEY'
```

# 参考

https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables#bundling-environment-variables-for-the-browser
Seccon Beginners CTF 2024 解けたやつ

# reversing
## assemble
わからんっていいながら assembly を書いた。
open -> read -> write すればよい

`flag.txt` を反転させるには、
https://gchq.github.io/CyberChef/
で、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323117/3927075f-98f7-5dc9-cc8f-e40c74eef47a.png)

すれば簡単です。


```asm

mov rbp, rsp
mov RDX, 0x7478742e67616c66
push RDX
mov RAX, 2
mov RDI, RSP
mov RSI, 0
mov RDX, 0
syscall

mov RDI, RAX
mov RAX, 0
mov RDX, 0x0000000000000000
push RDX
mov RSI, RSP
mov RDX, 32
syscall
mov RAX, 1
mov RDI, 1
mov RSI, RSP
mov RDX, 32
syscall

```

syscall のどのレジスタに入れるかは↓を見た。

https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md


## cha-ll-enge
LLVM-IR

メインのロジック部分をぱっと見 xor があったので、定数の謎の数値配列を xor で出せばよい。

```go
package main

import "fmt"

func main() {
	a := []int{119, 20, 96, 6, 50, 80, 43, 28, 117, 22, 125, 34, 21, 116, 23, 124, 35, 18, 35, 85, 56, 103, 14, 96, 20, 39, 85, 56, 93, 57, 8, 60, 72, 45, 114, 0, 101, 21, 103, 84, 39, 66, 44, 27, 122, 77, 36, 20, 122, 7}
	for i := 0; i < len(a)-1; i++ {
		fmt.Printf("%d,", a[i]^a[i+1])
	}
}

```

# misc

## getRank
parseInt で基数の指定がないので、 
```
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ...
```

みたいなのをpayloadで post すればよい。

## clamre

なんとなく正規表現っぽい。
asciiコードが見られるので、直すと ctf ... になっているので直す。
`\3` みたいなのは、正規表現のキャプチャかなと思ったので、先頭から順にマッチしているリストを用意して、求めた。


```
0/^((\x63\x74\x66)(4)(\x62)(\{B)(\x72)(\x33)\3(\x6b1)(\x6e\x67)(\x5f)\3(\x6c)\11\10(\x54\x68)\7\10(\x480)(\x75)(5)\7\10(\x52)\14\11\7(5)\})$/

```

# web
## wooorker
CSRF ですね。
(js ファイルを眺めてなくて、穴がないなあとずっと考えていた)

get parameter に next を設定するとクローラーが踏んでくれるので適当にトラップしたサイトで get parameter をはかせれば勝ちです。

6/15の16時ごろ、crawlerが遅くて来なかったが、discordで改良した報告の後は動いていた。

## wooorker2

wooorker との diff を見たところ、 get でtokenが埋め込まれていたやつから、hashに変わったいた。
hash から取得して、getにつけなおして、wooorkerで使ったurlに送りなおせばよいですね。

```php
<?php
file_put_contents("./nyaan.txt",$_GET['token']);

```

## ssrforlfi

file protocolってリモート指定できるのを知らなかった。

```
file://localhost/proc/self/environ
```
メール配送がブロックされた場合の確認方法/解除方法

今回はメールがブロックされた場合の確認方法/解除方法について解説致します。

## なぜブロックされるのか？

メール配送がブロックされる代表的な理由としては以下となります。

* 存在しないドメインからの送信
* ウイルスが搭載された可能性ある
* スパム判定されている
* スパムメールを継続的に送信していた
* 大手サービスドメインと類似したドメインを使用している
* メールブラックリストに載っている
* 送信元の信頼性が低い

## ブロックの確認方法の流れ

1\.エラーメールが届く
2\.サーバーでログを確認
3\.原因調査、対応
4\.サイトにて解除申請

## 代表的なサービス

### 「spamcop.net」にブロックされた場合の確認方法

![blok001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/6e01e10b-00b9-2407-e084-0f0c11124f5a.png)

[spamcop](https://www.spamcop.net/bl.shtml)

### 「trendmicro.com」にブロックされた場合の確認方法

![blok002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/8e35681c-d6d0-b0e7-7952-935c8bbe9fc9.png)

[trendmicro1](https://www.ers.trendmicro.com/reputations/index)

![blok003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/05b53add-2f75-7350-134c-fa6582ac57ac.png)

[trendmicro2](http://www.mail-abuse.com/cgi-bin/lookup)


### 「senderscore.org」にブロックされた場合の確認方法

![blok004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/7f08d166-ca0f-16dc-c4a2-0e15cf927ecb.png)

[senderscore](https://senderscore.org/rtbl/)

### 「barracudanetworks.com」にブロックされた場合の確認方法

![blok005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/87235a4d-36e1-45ec-de1b-b413e1aa4454.png)

[barracudanetworks](https://www.barracudacentral.org/lookups/lookup-reputation)
数式の認識とOCR`pix2tex`とポモドーロタイマー

# pix2texの数式認識OCRに関するお話です。

pix2texは数式の認識とOCRに特化したツールです。
手書きや印刷された数式をスキャンして、
LaTeX形式のテキストに変換します。
使い方は以下の通りです：

1. **画像のアップロード**：数式の写真やスキャンした画像をアップロードします。
2. **テキスト変換**：pix2texは画像内の数式を認識し、LaTeX形式のテキストに変換します。
3. **LaTeXコードの取得**：変換されたLaTeXコードをコピーして、自分の文書やプロジェクトに貼り付けます。

# LaTeX形式？

数学的な式や数式を記述するためのマークアップ言語です。
LaTeXは、科学技術分野や学術論文、プレゼンテーション、書籍などで広く使用されています。

例えば、次のような数式をLaTeX形式で表現できます

`f(x) = \frac{1}{x^2+x}`

出力は

$f(x) = \frac{1}{x^2+x}$

# 作業に没頭しやすい性質

集中力の高さを示していますが、適切な休憩も重要です。ポモドーロテクニックは、25分間の集中作業後に5分間の休憩を取る方法で、このリズムを維持することで効率的に作業を進めることができます。

# ポモドーロタイマーとは？

長時間の作業には、ポモドーロタイマーの使用をお勧めします。これにより、集中と休憩のバランスを保ちながら、時間を有効に管理することが可能になります。注意点として、集中力を保つためにポモドーロテクニックを試してみることをお勧めします。25分作業して5分休憩するサイクルを繰り返すことで、効率的に作業できますよ。🙂

また、数式を一定数スキャンした後に休憩を取るなど、明確な目標を設定することも効果的です。適切な休憩を取りながら、時間を意識することが、持続可能な作業習慣を築く鍵となります。
本番サーバーにSSHした際のルーティーン

サーバーエンジニアとして5年ほど働いている物です。

今回は私個人が本番サーバーにSSHした際の作業前ルーティーンをご紹介します。

基本的には意図しない事故を防ぐ為の対策となります。


## 1.「IPアドレスを確認する」

初めにログインしたサーバーのインターネットインターフェイスに割り当てられた
IPアドレスを確認します。

こちらは対象サーバーに間違いがないかを確認する為となります。

```
#コマンド
ip a

#結果例

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
     inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
     inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
        valid_lft forever preferred_lft forever
```
※IPは例となります。

## 2.「ホスト名を確認する」

次にログインしたサーバーのホスト名を確認します。

こちらもIP確認同様に対象サーバーに間違いがないかを確認する為となります。

```
#コマンド
uname -n

#結果例
servername
```

※「hostname」コマンドでも同様にホスト名を確認する事が出来ますが、名称を変更してしまう可能性がある為、おすすめは出来ません。

## 3.「ログインユーザーを確認する」

次に「w」コマンドでログインユーザーを確認致します。

こちらは、現在ログイン中の活動状況を把握し作業を進める為となります。

```
#コマンド
w

#結果例
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
user1    tty1     -                10:00    2:03m  0.11s  0.05s sshd: user1 [priv]
user2    tty2     -                09:30    5:00   0.05s  0.02s sshd: user2 [priv]
user3    pts/0    IP               08:00    1.5s   0.20s  0.10s ssh user3@server
```

## 4.「タブ名を変更する」

最後にターミナルソフトの「タブ名」を分かりやすい名前に変更します。

デフォルトでは接続を行ったIP名やホスト名が表示されているかと思います。

ただし大量にサーバーに接続を行った場合等、視認性が低下し異なるサーバーで作業をしてしまうリスクが高くなります。

その為、認識しやすい名称に変更する事で事故を防ぎます。

※不必要なサーバーはこまめにログアウトする事をお勧めいたします。
Warudo と Twitch でチャネポ交換で何かして N 秒後に何かするブループリントの作り方

こんにちは、 Twitch で Beat Saber などのゲームプレイ配信をしているうさぎ博士ちゃんこと Dr.USAGI です。今回は「 Warudo で Twitch のチャネポ交換をトリガーにしつつ、その N 秒後に何かするブループリント」の簡単な作り方を紹介します。

### ブループリントの全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33891/cf8c7b44-d7ba-43d5-55e7-766fc066dd32.png)

### 使用するプラグイン

- [Timer 计时器](https://steamcommunity.com/sharedfiles/filedetails/?id=3004122621) - LiYin(CubeSky)

### 解説

ブループリントの上の方が「チャネポ交換で何かしつつ、N秒タイマーをセットする」実装部分、下の方が「そのN秒後に何かする」実装部分、右側のプロパティがその動作に使う変数です。

この例では 

- Integer 型の変数 `cp_cam_timer` をブループリントに用意し、
- 下部の `On Every N Seconds` ノードをトリガーに毎秒 `cp_cam_timer` を `1` 加算し続け、
  - `cp_cam_timer` が `0` の場合に「カメラを `main cam` に変更する（戻す）」処理を行い、
- 上部の `Twitchチャンネルが忠誠ポイントを交換する場合` ノードをトリガーにチャネポ交換タイトルが特定の文字列値かつ `cp_cam_timer` が `0` 以上の場合のみ「カメラを `zoom cam` に変更する」処理を行いつつ、
  - `cp_cam_timer` を `-5` に設定

しています。

`cp_cam_timer` は初期値 `0` で始まりチャネポ交換の状態によらずとにかく毎秒 +1 されます。`+` (正) の値の場合は何もしません。 `-` (負) の値の場合も何もしません。 `0` の場合のみ「カメラを戻す」処理を行っています。

特定のチャネポ交換が発生した際に `cp_cam_timer` が `+` の値の場合は「カメラを変更する」処理を行いつつ `cp_cam_timer` に何かしたい `N` 秒後の `N` を `-` の値で設定しています。

なお、今回紹介した方法のような簡単な仕組みで「トリガーのN秒後に何かする」処理を実装する場合は Twitch 側の該当するチャネポ交換の「引き換えのクールダウン時間」も `N` 秒に設定すると視聴者さんに親切かもしれません。

### おまけ FAQ

Q 「Integer の変数を1秒毎にずーっとカウントアップしている処理は、オーバーフローで動作異常する可能性はありませんか？」

A 68年以上配信し続ける（Warudoを起動し続ける）予定がある場合のみ計算して必要なリセット処理を追加すればよいです。たかだか数時間や数日や数年ではカウンター変数のオーバーフローによる問題は発生しません。
ファビコンは明示的にタグで指定せずとも自動設定される

webサイトの顔の一つともいえるファビコンですが、実はブラウザーにより
明示的にタグで指定ぜずとも自動的に設定される事をご存知でしょうか。

## 通常の指定方法
ファビコンは通常下記の様にHTMLタグでパスを指定し設定を行います。

```HTML
<link rel="icon" href="/パス/favicon.ico" type="image/x-icon">
```

## 自動的に設定される？

現在、多くの主要なブラウザー（Chrome、Firefox、Safariなど）ではウェブサイトのルートディレクトリからアイコンを自動的に取得する仕様となるようです。

ただし、ルートディレクトリ以外にアイコンを保存している場合タグによる明示的な指定が必要となります。

## ファビコンをチェックできるサイト紹介

ファビコンの設定状況を簡単に確認したい場合はツールサイトの利用をお勧めいたします。
下記ファビコンを確認できるツールサイトとなります。

### 1　「Favicon checker」

![fav001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/ac43b8b7-2c96-83f5-7cc9-d0f7a8ab18dc.png)

[Favicon checker](https://realfavicongenerator.net/favicon_checker)


### 2  「IconView(ベータ版)」
![fav002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/6d3d4d70-95d4-5717-603a-2af0bcfb8f8c.png)

[IconView(ベータ版)](https://favi.r1999.com/)
2024 Data + AI Summit Keynote -Mosaic AIに関するアップデート事項-

## はじめに
本記事では、Databricksのイベント「Databricks Data + AI Summit 2024」で発表されたKeynoteの内容、特にMosaic AIのアップデートに関する日本語訳を紹介します。

## Mosaic AI Model Training Fine-tuningの発表
LLMモデルに対して、GUI上でノーコードでファインチューニングが可能になりました。ビジネスにおいて特定のタスクに特化したモデルを作成する場合、この機能は非常に有用です。セッション内で言及された2つの例を以下に紹介します。

### FOX SPORTSによるAIモデルのファインチューニング
FOX SPORTSは、過去100年間のプレイバイプレイコンテンツを活用してAIモデルをファインチューニングしています。これにより、スポーツイベントで以下の内容を自動的に識別し、視聴者に提供することが可能になりました。

- 重要度が高い場面：「The highs」とラベル付けされた勝利の瞬間や重要なプレイのシーン
- 重要度が低い場面：「The lows」とラベル付けされた敗北や失敗のシーン
ATLASIANによるクエリ生成モデルのファインチューニング
ATLASIANは、顧客のためにクエリを生成するモデルをファインチューニングしています。これにより、ユーザーの要求に応じた効率的なクエリ生成が可能になりました。

### HTMLドキュメントの抽出：コード生成のために必要なHTMLドキュメントを抽出
- JSONディスクリプタへの変換：抽出したドキュメントをJSONディスクリプタに変換
- 入力/出力ペアの生成（LLM）：大規模言語モデル（LLM）を用いて入力と出力のペアを生成
- パラフレーズおよび変異体の作成（LLM）：LLMを用いて異なるバリエーションのクエリを生成
- 入力と出力の収集：生成されたクエリの入力と出力を収集
- 曖昧なクエリの自動フィルタリング（LLM）：曖昧なクエリを自動的にフィルタリング
- 必要に応じた手動フィルタリング：手動でフィルタリングすることで精度をさらに向上


## Mosaic AI Vector Searchの発表
Mosaic AI Vector Searchは、エンタープライズデータを迅速に検索可能にするソリューションです。完全に管理された埋め込み生成を提供し、新たにGTE埋め込みモデルを導入しています。

セッション内では Vector Search の例として Corning 社の例が言及されていました。

### Corning 社における研究支援の例
- 材料研究はコーニング社の知的財産の中心であり、彼らは研究を容易に利用できるようにするためのAIツールを構築しています
- Mosaic AI Vector Searchを使用して、特許データを活用した拡張モデルが研究者を支援します

コーニング社が材料研究においてVector Searchを活用し、特許データを利用して研究を支援するためのAIツールを構築していることが強調されていました。

 ### Mosaic AI Tool Catalogの発表
企業向けAIツールを簡単に作成、公開、共有するためのプラットフォームです。UnityCatalogに統合されるため、ガバナンスを担保しながら利用可能な点が特徴です。

 ## Mosaic AI Agent Frameworkの発表
 エージェントおよび RAG（Retrieval-Augmented Generation）アプリケーションを迅速に構築および展開するためのフレームワークです。主な機能として以下の点が言及されていました。
 
- Agent SDK：エンドツーエンドのエージェントおよびRAGアプリケーションを迅速に構築
- Agent Serving：リアルタイムAPIエンドポイントとしてエージェントとRAGアプリケーションを展開

## Mosaic AI Agent Evaluationの発表
AIアプリケーションの品質を評価し、フィードバックを収集して問題を特定および改善するためのツールです。
具体的には以下のフローを繰り返すことでアプリケーションの質の評価を実施します。

1.基準を定義する（Define ground truth）：評価の基準を定義。
2.人間による評価（Human grading）：人間の評価者からのフィードバックを収集。
3.AI評価者（AI evaluators）：AIによる自動評価。
4.低品質を追跡してデバッグする（Track and debug low quality）：低品質の部分を追跡しデバッグ。


## MLflow 2.14の発表
Tracing が発表されており、使用することでモデルとエージェントの推論についての記録やパフォーマンス問題のデバッグが可能になるといった、開発者をサポートする機能となっています。


## Mosaic AI Gatewayの発表
AIの利用において、レート制限や使用状況などの利用に関する管理、権限やクレデンシャルの管理などセキュリティに関する制御を強化するツールとなっています。

## まとめ
昨今の市場においては、生成AIの導入がある程度進んでおり、自社データに対して生成AIをどのように最適化するかが重要な課題となっています。その中で、今回のアップデートは開発者の負担を軽減するものと思います。個人的には、プロジェクト実行時に性能の評価が問題になることが多いため、Mosaic AI Agent Evaluationに非常に注目しています。

## Databricks Champion からのコメント
LLM の Evaluation は確かに課題になることは多いですね。
Databricks ではただモデルを作るだけのプラットフォームにとどまらず、今後評価・改善していくフェーズを見据えた機能が続々とアップデートしていくのが非常に魅力的です。
これらのアップデートによってモデル開発者の負担を減らし、各企業のビジネスにバリューをだしてくれるモデルが誕生してくれることに期待です！
【Java】ABC081A_ Placing Marbles  #AtCoder

自分用にAtCoderの解答をまとめていきます。誤った情報があったら、申し訳ございません。

## 覚えること
- charAtメソッド
文字列からn番目の文字列を引き出すためのStringクラスのメソッド。文字列の先頭は0文字目。

## コード
```java:ABC081A_PlacingMarbles
import java.util.Scanner;

public class ABC081A_PlacingMarbles {
    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            String str = sc.next();
            System.out.println(cal(str));
            }
        } 

    public static int cal (String str) {
        int count = 0;
        for (int i = 0 ; i < str.length() ;i++ ){
            if (str.charAt(i) == '1'){
                count++;
            }
        }
        return count;
    }
}

```

## 参考にしたサイト
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/String.html

https://java-code.jp/185
linuxで現在いるディレクトリ内の容量を測る方法 

linuxでディレクトリ内のファイルやディレクトリの容量が知りたいと思ったことはございませんか？

今回はlinuxでディレクトリ内の容量を測る方法をご紹介します。

今回使用した環境は以下となります。

* 	AlmaLinux 9 系

## 確認方法

使用するコマンドはduとなります。「-s」オプションを指定しファイル、またはディレクトリの合計容量のみを表示します。
パスにはワイルドカードを指定し現在のディレクトリ内の全てのファイル、ディレクトリを指定します。

下記は実行例となります。

```bash
#コマンド
du -sh ./*

#結果
4.0K    ./test.txt
12K     ./directory1
36K     ./script.sh
1.2G    ./test.zip
```

## 1ギガ以上のファイルを表示したい場合

ギガ以上のファイルを表示したい場合はgrepを使用し「G」を含む結果のみ表示させる方法が楽かと思います。

ただしファイル名等に「G」が含まれている場合は表示されてしまうので注意が必要です。

```bash
#コマンド
du -sh ./* |grep "G"

#結果
1.2G    ./test.zip
```


## 隠しファイルを計算する方法

先程紹介したコマンドでは隠しファイルの容量を表示できません。
下記の様にしていする事で隠しファイルの容量を計算する事が出来ます。

```bash
#コマンド
du -scmh ./.[^.]*

#結果
4.0K    ./.git
36K     ./.config
12K     ./.bashrc
```
「AWSが分かっていない」のではなく、コンピュータサイエンスが分かっていなかった

## はじめに

◆この記事は何？
焦ってAWSの勉強をするよりもコンピュータサイエンスの基礎を勉強してからの方がよかったという私の経験を紹介する記事です

◆対象は？
AWSの勉強をしている方
特に若手

◆この記事のねらい
AWSの勉強効率を上げる

## 先に結論
- AWSの勉強に時間がかかったのは**コンピュータサイエンスの基礎ができていなかった**から
- コンピュータサイエンスの基礎を勉強してからの方が、圧倒的に効率が良い
- 遠回りに見えるが、近道だと考える

## 急にAWSを勉強した

新卒1年目からデータサイエンティストとして働いています。

急にAWSが必要になったので、急いでAWSの勉強をしました。
結果的には、「AWS Certified Cloud Practitioner」「AWS Certified Solutions Architect - Associate」を取得しました。

当時は知らない用語ばかりで勉強に苦労しました。資格は取得できましたが、付け焼き刃になってしまった感は否めませんでした。

## 数年後に勉強し直した

数年後、アプリ開発を主導する立場になったこともあり、改めて**セキュリティとネットワークを基礎からやり直しました**。

次の記事を書ける程度のレベルの基礎をやり直しました。

https://qiita.com/mkt_hanada/items/f9b1fae7d74c40d1df1e

その後、AWSの勉強を再開すると、体験したことがないくらい効率的にAWSを学ぶことができました。
「AWS SAA」よりも上位資格を勉強していますが、理解のスピードが段違いです。

冷静に過去を振り返ると、AWSの勉強で時間がかかっていたのではなく、セキュリティやネットワークについて調べることに時間を要していました。

**分かっていなかったのはAWSではなく、コンピュータサイエンス**でした。

## 過去の自分に伝えたいこと

「AWSが必要だからといって、焦ってAWSを勉強しない方が良かった」と今では後悔しています。

コンピュータサイエンスの基礎、特にセキュリティとネットワークを着実に身に付けてからAWSを勉強する方がよかったです。

一見すると遠回りですが、実際は基礎から始める方が近道だったと思います。

## おわりに

この記事では、AWSの勉強方法について私の経験を紹介しました。

少しでも参考になれば幸いです。
公式パッケージへのプルリクが通ることを祈ったお話

# はじめに
<font color="Red">**私がプルリクを出したわけではございません！！！**</font>
Docker環境で開発を進めているのですが、ある日コンテナを起動すると見知らぬエラーが出ました。
その時の状況を振り返っておきたいと思います。

# 状況
以下のエラーがコンソールログに出ていました。

```
# error memoizee@0.4.16: The engine "node" is incompatible with this module. Expected version ">=.0.12". Got "20.11.1"
# error Found incompatible module.
```
nodeの要求バージョンがおかしなことになっていました。
memoizeeパッケージの公式サイトを覗いてみると、issueにプルリクが出ていました。
内容を確認してみると、前日に開発者がリリースを行った際にバージョン表示をタイプミスしていることが原因でした。

このmemoizeeパッケージはserverless frameworkに依存しており、我々はプルリクが通るまで祈ることしかできませんでした。(その日の夕方にはプルリクが通っていました)


# おわりに
他の開発者が作ってくれた技術を無償で使えることに感謝しないといけないなと改めて感じました。
ちなみに私は日ごろのタイプミスをするのでコミットの際は気を付けます…。
~~(ブランチ名をfeatureで切るべきところをfetureにしたりすることもあったりなかったり)~~
また、私にも貢献できることがあれば積極的に発信していこうと思います。
Excel VBA チェックボックスのリンクを設定する

## チェックボックスのリンクを一括で設定する方法

セルに配置したチェックボックスのリンクをひとつずつ右クリックで設定する場合

![チェックボックスpng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/81b17d6e-1c93-2653-6857-183f5d955e47.png)
チェックボックスの数だけ右クリックしてセルを選択するのはめんどくさいですね

チェックボックスのひとつ右のセルとリンクさせるコード
```vb
Sub AllCheckBoxLink()

Dim CheckBox As CheckBox

For Each CheckBox In ActiveSheet.CheckBoxes

  CheckBox.LinkedCell = CheckBox.TopLeftCell.Offset(0, 1).Address

Next CheckBox

End Sub
```

実行結果
![チェックボックス2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/e67e83e4-446f-f11f-2889-3f3b4e8f6cd4.png)

E列の字の色をセルの色と合わせるとTRUE / FALSE が見えなくなってすっきりします。
スクラム開発はどのようなPJが合うの？

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。（同担OKです😉）
今回は自分が業務で行なっているスクラム開発について、フィットするPJとしないPJは何だろうと考えたものをまとめたものです。

ポエムなので一意見として見ていただけると幸いです！
（ご意見あればコメントお願いします🙇）

# スクラム開発とは？
スクラム開発はアジャイル開発から派生した手法であり、5~10人でスクラムチームを組み各役割同士がコミュニケーションを密に行う開発形態です。

プロダクトオーナー、スクラムマスター、ディベロッパーの3つの役割があり、全ての役割が積極的なカイゼンを行うことでプロダクトの品質を上げることを目的としています。
（カタカナのカイゼンは、悪いものを良いものにする意味だけでなく、良いものをより良いものにするという意味が込められているようです。🥹）

だいたい以下のようなメリットがあるかと思います。
- 工数の見積もりが正確になっていく
- チームビルディングが行いやすい
- ユーザのニーズを反映しやすい
- 開発効率が上がる（大きな手戻りが少なくなる）
- 問題の早期発見が可能

# 向いていると思うPJの特徴
上記のメリットから、個人的には以下のように考えています。
- 同じメンバーで開発から保守まで長く続けるPJ
- ガッチリと要件が固まっていないPJ
- 流動的にニーズや優先度が変化するPJ
- リリースまでの日程がガチガチに決められていないPJ

一つづつ考察していきます。
### 同じメンバーで開発から保守まで長く続けるPJ
個人的には最も合いそうだと感じています。
スクラムは同じメンバーでやればやるほど醸成するため、どんどん開発がスムーズになります。

また、コミュニケーションの障壁が取り除かれていくため、メンバーがカイゼン意識を持っている場合はどんどん良質なプロダクトへと進んでいくんじゃ無いかなと思います。

逆に肌感が合わない方や他のことにチャレンジしたい方が抜けにくい環境になってしまう可能性も孕んでいますが、そこはチームビルディング次第ということで。。。😇

:::note warn
ただし、メンバーがカイゼン意識を持ち、ステークホルダーが求めるものを生産し続けないと巷で囁かれているゾンビスクラムになるので要注意
:::

### ガッチリと要件が固まっていないPJ
スクラムだとチーム全員がそれぞれの立場関係無しにアイデアを出し合うことで要件を固めていく、という初期フェーズの行動がマッチしているので良いのでは無いかなと思いました。

初期フェーズという事もあり、チームの雰囲気次第にはなってしまうのですが、やはりチームが一丸となって同じプロダクトを作るために要件を決めていくという手法はスクラムでの良い部分です。

そもそも要件が固められていれば、もうウォーターフォールで作りきっちゃった方が早いのでは？という考え方です。🤫

:::note warn
チームの方向性がバラバラ＆言い出しにくい雰囲気だとあまりスクラムをやる価値が無いので、初期は特にチームビルディングが大事
:::

### 流動的にニーズや優先度が変化するPJ
スクラムは短いスパン（1~3週間程度）で目的を決めて開発を行うため、変化に対して柔軟に対応できます。
そのため、ステークホルダーの要求でタスクの優先順位が変わりやすいPJやユーザのニーズが変化しやすいPJだとスクラムという手法が合うのかなと思います。
（ニーズが変化しやすいものは沢山当てはまりそうですが、そこは深く突っ込まないでください🥹）

特に、スクラムは価値を出し続けないといけない風潮もあるようですので、そういった要求にすぐ対応する必要のあるPJだと真価を発揮しやすいのでは無いでしょうか。

:::note warn
変化には柔軟だが大局的な目的を見失ってあちこち彷徨わないよう、目的の確認は随時行う必要あり
:::

### リリースまでの日程がガチガチに決められていないPJ
これはもう当然では無いかなと思います。
「何月にリリースだ！🥸」と言われている案件では、スクラムをやる価値はほぼ無いんじゃ無いでしょうか。

スクラムは、カイゼンするために開発以外にも時間を使います。
そのため、日程がガッチリ固まっているPJでは品質より納期がファクターとして重要視されると思いますので、ウォーターフォールで一気に作りきってしまった方が良いです。

繰り返しますがこれに関しては相性の良いPJというより、最低条件なのでは？と考えています。

:::note warn
スクラムは開発目的でなく手法なので、合わないPJは潔く引こう
:::

# おわりに
スクラムについて個人的に考えてることをまとめてみました。
ポエムとして、気楽に読んでいただければと思います。🤯

ここまで読んでいただきありがとうございました。
以上、センリツでした🤓
WindowsでZSHを使いたい。

# はじめに

この記事は、Qiita Engineer Festa 2024 2個目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/b653e3851db100acc931

# 本題

前回はどこでも自分にとっての好みのZSHを整えたい！という話をしていたのですが、今回はなかなか皆さんがされていないWindowsでのZSH環境を整えるということをしてみたいと思います。ここまでしてZSHを使いたいという人はおそらく稀ですが、そんな方々に役立つ記事となれば幸いです。

以下に、参考にさせていただいたサイトを掲載しますので、ぜひこちらも併せてご確認ください。

https://renan-costaalencar.medium.com/zsh-and-oh-my-zsh-on-windows-via-git-bash-a2f21b85b51c

https://qiita.com/suke_masa/items/404f06309bb32ca6c9c5

### Git Bash for Windowsをインストール

以下の公式HPより、Gitのインストーラーを使ってGit Bash for Windowsをインストールしてください。インストール方法はWeb上でたくさん公開されていますので、ここでは説明を割愛させていただきます。

https://git-scm.com/downloads

### Windows TerminalにGit Bashの環境を追加する

以下よりZSHのソースをダウンロードします。

https://packages.msys2.org/package/zsh?repo=msys&variant=x86_64

ファイルをダウンロードしたのち、ZIP内のファイルをGitのインストールされているディレクトリに全てそのままコピーします。元のファイルと統合してください。添付している者品で例えるならば、左のエクスプローラーに表示されているファイルをそのまま右のウィンドウにコピーします。

![Screenshot 2024-06-17 185449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/45cc251a-4ca1-38aa-c580-a09b66a2dbcb.png)

### Windows Terminalにプロファイルを追加する

WindowsターミナルにZSHのプロファイを追加します。コマンドラインのところにいつも通り追加してください。

![Screenshot 2024-06-17 191413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/7b7c7cae-d8cf-3d4c-d983-a5b3194d836f.png)

```powershell:command
"C:\Program Files\Git\bin\bash.exe" --login -i  "C:\Program Files\Git\etc\usr\bin"
```

最後にZSHのプロファイルを開いて、初期設定を行なって終わりです。お疲れ様でした！

# 最後に

今回はZSHをWindowsに設定してみました。Powershell以外のことはここからできますので、ぜひ皆さんもトライしてみてください！
ちょっとテスト期間が重なった都合で投稿が遅くなってしまったので、残りの期間で借金を返済していきたいと思います。それでは、次回の投稿まで！
闘魂Elixir ーー AtCoder Beginner Contest 340(A)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 340](https://atcoder.jp/contests/abc340)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [A - Arithmetic Progression](https://atcoder.jp/contests/abc340/tasks/abc340_a)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

入力値を読み取ればできあがったも同然かもしれません。[first..last//step](https://hexdocs.pm/elixir/Kernel.html#..///3)でつくるのがぴったりです。

```elixir
defmodule Main do
  def main do
    [a, b, d] =
      IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    
    solve(a, b, d)
    |> IO.puts()
  end
  
  def solve(a, b, d) do
    a..b//d
    |> Enum.to_list()
    |> Enum.join(" ")
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 340](https://atcoder.jp/contests/abc340)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
HTML,CSS超初心者向け　クラス名の付け方

__CSS設計を学びたい！__
　どうもエンジニアになって数ヶ月のひよっこすらなっていない卵エンジニアです！🐣

　この記事を見ているのはmarginなどのプロパティやレスポンシブ、flexを学んだばかりという方が意外と悩みがちなクラス名をどうつけるかについて記事にしました！参考にしたのは『技術評論社　CSS設計完全ガイド　半田淳志　第5版』です。有名な本なだけあってわかりやすく、分厚い本でしたがスラスラ読めました。
 
 まず、クラス名をつける前に、みなさんはWebサイトを制作するときにどんなことを意識していますか？クラス名をつける前に、制作するWebサイトをどれだけ細分化と抽象化して見ることが出来ているかが大切です。では細分化と抽象化とは何か？それはWebサイトを見たときに、ブロックやパーツごとに分けることを細分化、デザインが共通してるパーツやブロックを見つけることを抽象化と言います。

  ## 細分化
  細分化をするメリットとして、共通するデザインのパーツやブロックを見つけやすくなったり、どこのクラスにpddingやmarginなどのプロパティを配置すればいいかも考え安くなリます。また、とりあえずプロパティを配置していくという初心者がやりがちなミスもなくせます！細分化するときに、まず初めに大きなブロックから順番に細かく分けていくようにしていきます。(親要素から小要素)
  
では御社の公式ホームページの一部を抜粋してを参考にやってみましょう！このサイトのheaderは画面上部に固定されているものですが、今回のメインはServiceと書かれているブロックを使うので、細かいことはあまり気にせずやります。
![スクリーンショット 2024-06-15 9.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799198/629a03dc-2bda-59c7-a839-ca05f8d0e4df.png)

こちらをブロックごとに分けてみましょうか
![スクリーンショット 2024-06-15 9.24.41のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799198/a0f74f2e-01bb-7230-f04e-aecd219f4e2a.png)

こうなりました！赤い線＞オレンジ線＞水色＞ピンク＞青色の順番で小さくなっていくのがわかりますか？
* 赤い線　→ まず大きくheaderとserviceのセクション（クラス名　section Service）に分ける
* オレンジ線→section serviceの中にセクションのタイトル(クラス名section-title)とその内容（クラス名content）に分ける
* 水色→ contetの中をそれぞれ三つの記事に分ける（三つともクラス名　service-article）
* ピンク→ articleの中が左右で文字列と画像に分かれている（クラス名　画像：aritcle__img, 文字列：article__texts）
* 青色→ article__textsをさらに分ける（クラス名　タイトル：article__title, テキスト：article__text, ボタン：article__btn）

このように大きなブロックからどんどん分解して細分化すると分けやすくなります。

## 抽象化
　さて今度はデザインが共通しているパーツやブロックを見つけていきます。共通しているデザインはコードを使いまわしすことが出来ます（コンポーネント化）。これをするメリットは
 * 書くコードを減らすことで時間短縮
 * コードが減って、コードがみやすくなる
 * 後に修正するとき、一度の修正で済む
などがあります。
上記のサイトを例に出すならば、クラス名articleの中身はどれも同じなのでコンポーネントできるでしょう。では、下の画像のボタンはどうでしょう？なんだか難しそうですね…ですが、ボタンの形やグラデーションになっているデザインなどは一緒なので一部はコンポーネント化できそうですね！異なる部分は別クラスを付与するなどして対応します。
```
例(class="article__btn abroad__btn")
```
だと、他の人が見たときにセクションなのか記事のタイトルなのかわからないですね。これはセクションのタイトルなので

```
class= "saection-title"
```
![スクリーンショット 2024-06-15 9.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799198/5f87978a-7084-b932-62dd-0a24ae12676a.png)

![スクリーンショット 2024-06-15 9.24.41のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799198/99785c80-2f69-e102-02ef-549f5137d1ca.png)


## クラス名の付け方
やっと本題です。細分化と抽象化を意識した上でポイントを伝えていきます。
### クラスの影響範囲を踏まえてつけよう
　webサイトは大きくなればなるほどクラスも増えて行くので、「このクラスを編集すると、どの範囲に影響するのか」が、わかるようなクラス名が望ましいです。
 例えばさっきのサイトを例に出すと真ん中の青枠のタイトルにクラスをつけるときに
  ![スクリーンショット 2024-06-15 9.24.41のコピー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799198/f06a8970-1973-8e79-1ace-4ddfdf8f624b.png)
 
 ```
 class= "title"
 ```
 とつけてしまうとセクションのタイトルのことをさしているのか、記事のタイトルをさしているのかがわかりません。
 指したいのは記事のタイトルなので

 ```
 class= "article-title"
 ```
 とするといいですね。


### クラスの役割を考えよう
 クラス名というのは後から見たときに、どのようなブロックにまたはどんな機能を備えているかが一目見てわからないといけません。なので、そのクラスの役割に応じた名前をつける必要があります。
* そのブロックの内容を記載しているなら→ content
* 文字列のクラスなら→ text

などがあります。よく使われる名前を説明付きでわかりやすくまとめてくれている方の記事があったのでご紹介します。

https://qiita.com/manabuyasuda/items/dbb76ed36970bec95470

### -や_を使いこなそう
　クラス名をつける際に、単語が二つ並ぶときは-か２つ目の単語の頭文字を大文字にする方法があります。また、itemやbtnなど単語の状態や見た目を表すものは__（アンダースコア２つ）で繋げるとより見やすくなります。
闘魂Elixir ーー AtCoder Beginner Contest 341(A)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 341](https://atcoder.jp/contests/abc341)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [A - Print 341](https://atcoder.jp/contests/abc341/tasks/abc341_a)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

[Enum.map](https://hexdocs.pm/elixir/Enum.html#map/2)関数を解法の骨格にすえて、1からはじめて奇数番目は`1`、偶数番目は`0`ということを無名関数に書きました。

```elixir
defmodule Main do
  def main do
    n = IO.read(:line) |> String.trim() |> String.to_integer()
    
    solve(n)
    |> IO.puts()
  end
  
  def solve(n) do
    (1..(n + n + 1))
    |> Enum.map(fn 
      i when rem(i, 2) == 1 -> 1
      _i -> 0
    end)
    |> Enum.join()
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 341](https://atcoder.jp/contests/abc341)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
大学時代に統計学基礎3回落第した人が80hで統計検定2級に合格するまで


以前、CBT方式で統計検定2級の合格しましたので
勉強方法や裏技（？）について書いてみます。

<h2>統計検定2級を受験することにした理由や動機</h2>

もともとデータアナリストに興味があり、

「データアナリスト＝データ分析」「データ分析＝統計学」
↓
「データアナリスト＝統計学」

みたいな理解の下、統計の知見を証明できる統計検定2級を受けることにしました。

<h2>結果と勉強時間</h2>

2回受験をして、下記のような結果でした。
<br>

1回目 59点（不合格） 50時間
2回目 85点（合格）　 80時間
※統計検定2級の合格点は60点

1回目で1点不足で落ちたのは結構落ち込みました。。。。

ただ1回目受験の時点で試験の基礎学習は終えていたので、
2回目受験までは過去問の勉強を繰り返して確実に合格するよう心掛けました。


<h2>勉強方法</h2>

使用した教材は下記3つです。
<b>
①読み物（『統計学のしくみ』）
②過去問 販売されている年度分すべて
③テキスト（『統計検定2級チートシート』）
</b>


僕は統計学の知識が皆無で興味すらなかったので、
①で統計学の実例を知ってまず興味を持つことから始めました。


2回くらい①を読んだのち、試験対策に着手。

②には試験で出てくる公式がコンパクトにまとまっているので、
①を進めていく中でわからなかったことををどんどん書き込んでいきました。

<br>
過去問は20回分くらいやったと記憶しています。
<br>

CBT形式になってからは過去問の類似問題が頻出します。

解法が頭に浮かべば、あとは計算ミスが無いよう正確に計算するだけなので
数をこなして解法を覚えられるようになるといいかなと思います。


<h2>勉強する上でのポイント</h2>


簿記の試験を受けたことがある方はわかるかもしれませんが、
繰り返し電卓を叩いて計算処理を早く正確に行うことが大事です。

僕は計算ミスが非常に多いので、意識的に電卓を沢山叩くようにしました。

<h2>裏技</h2>


過去問は<b>「古い順」</b>にやっていくといいかもしれません。

直近4回分くらいの過去問はCBTよりも明確に難易度が高く、
勉強にはなるものの試験対策という面では過学習感があります。

あともう1つ古い順からやるべき理由があるんですが、
多くを語ってはいけない内容なので控えさせていただきます。
<br>

とにかく古い順からやりましょう！！

<h2>最後に</h2>

以上が統計検定2級合格までの対策方法でした。

僕に限った話かもしれませんが、
取得することで統計学を深く理解できたとは口が裂けても言えません。

ただデータサイエンスを学ぶ良いきっかけにはなったので、
データ人材になりたいという方にはお勧めの資格です。

<h2>ご紹介</h2>

株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area