OmniAICreator/Qiita-1.07M huggingface dataset:
【実践編】プロジェクト管理：要件定義フェーズからリリースフェーズまでの行程についてのドキュメント一覧：例

> 要件定義からリリースまでの行程についてのドキュメント一覧を洗い出して

要件定義からリリースまでの行程に含まれるドキュメント一覧は、プロジェクトの規模や業界、使用する開発方法論（例：アジャイル、ウォーターフォール等）によって異なりますが、一般的に必要とされるドキュメントを以下に示します。

# プロジェクト管理

### プロジェクト計画書

プロジェクトの目標、スコープ、リソース、スケジュール、コミュニケーション計画などを記載したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/47e53f58c2a4a8daac0a

### リスク管理計画

プロジェクトに潜在するリスクの特定、分析、対策計画をまとめたドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/b8aaad76501da98886ea

# 要件定義フェーズ

### 要件定義書

プロジェクトの目的、スコープ、機能要件、非機能要件、ユーザーストーリーなどを記載したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/6aaa8c970e83fa691503

### ステークホルダー分析書

プロジェクトに関わるステークホルダーの識別とその利害関係、要求事項をまとめたドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/abcfa5f841c4152192b1

### ビジネスケース定義書

プロジェクトの経済的正当性、コストと利益の分析、リスク評価を含むドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/57d9eefc415123506513

# 設計フェーズ

### システム設計書

基本設計書、システムの全体構造、コンポーネント間の関係、データフロー、インターフェースの定義などを記述したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/d1fea8de3bc66425cf6a

### データベース設計書

データモデル、ER図、データベーススキーマなど、データベースの設計に関する詳細を記載したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/14ec4576e6beaee46756

### 詳細設計書

各機能の具体的な処理フロー、アルゴリズム、クラス設計、インターフェースの詳細などを記述したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/b3018268964c321dc93f

# 開発フェーズ

### 開発ガイドライン
コーディング規約、開発ツールの使用方法、バージョン管理システムの利用ガイドなどを記述したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/941d55b3e41b2cc2f2df

# テストフェーズ

### テスト計画書

テストの目的、スコープ、戦略、リソース、スケジュールなどを定義したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/123bf47f27fe077621d8

### テストケース

各テスト項目について、入力値、実行条件、期待される結果などを記述したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/ca912dc61252d0b4ea9d

### テスト結果報告書

テスト実施結果、発見されたバグや問題点、修正状況などをまとめたドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/cc7abdf377bb5b549b21

# リリースフェーズ

### リリースノート

新機能、改善点、既知の問題など、リリースに関する重要な情報を記載したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/6324e24ffe22fe4b9dd9

### ユーザーマニュアル

エンドユーザー向けにシステムの使用方法を詳しく説明したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/69e742be961dc501a3e0

### 運用マニュアル

システムの運用、保守に必要な情報（システム構成、バックアップ手順、トラブルシューティングガイドなど）を記載したドキュメント。

> ログイン機能を例に

https://qiita.com/sunstripe2011/items/1d250a364ee7db0cc694

この一覧は基本的なものであり、プロジェクトの特性や開発プロセスに応じて、必要なドキュメントは増減する可能性があります。また、アジャイル開発などの柔軟な開発方法論を採用している場合は、ドキュメントの種類や詳細度が異なることもあります。
【実践編】スクラムマスターとして要件定義を行うためには

> あなたは、ゲーム開発のスクラムマスターです。
要件定義を行うためには、どのようなステップを踏めばいいですか？

ゲーム開発におけるスクラムマスターとして要件定義を行うためには、以下のステップを踏むことが一般的です。

### プロジェクトビジョンの確立

プロジェクトの目的やゴールを明確に定義します。ゲームのコンセプト、ターゲットユーザー、市場での位置づけなどを考慮に入れます。

### ステークホルダーとの連絡と初回ミーティングの開催

ゲームの関係者（ステークホルダー）との連絡を行い、初期ミーティングを開き、プロジェクトのビジョンや期待される成果について話し合います。ステークホルダーには、開発チーム、マーケティングチーム、顧客代表、投資者などが含まれます。

### ユーザーストーリーの作成

ゲームを利用するユーザーの視点から、彼らがゲームで達成したいことや体験したいことを短い文（ユーザーストーリー）で表現します。これにより、要件を具体的かつ分かりやすく表現できます。

### プロダクトバックログの作成

すべてのユーザーストーリーを優先順位付けし、プロダクトバックログとして整理します。このバックログは、開発プロセスを通じて継続的に更新されます。

### スプリントプランニングミーティングの開催

開発チームと一緒にスプリントプランニングミーティングを行い、次のスプリントで取り組むべきタスクを決定します。これには、プロダクトバックログから選択されたユーザーストーリーが含まれます。

### 定期的なレビューと調整

スプリントの終わりにはレビューミーティングを開催し、完成した作業をステークホルダーに提示します。フィードバックを受けて、必要に応じてプロダクトバックログを調整し、次のスプリントの計画を立てます。

### リスク管理と問題解決

開発プロセスを通じて、潜在的なリスクや問題を特定し、それらに対処するための戦略を立てます。

要件定義はゲーム開発の初期段階で非常に重要なプロセスであり、プロジェクトの成功に直接影響します。スクラムマスターとしては、チームがスムーズに進められるようにサポートし、効果的なコミュニケーションと協力を促進することが求められます。

> 開発者のチームに対して何を伝えますか？重要なポイントを教えてください

開発者のチームへ伝えるには、以下のような重要なポイントがあります

### 1. クリアなビジョンと目標の共有
プロジェクトの最終目標とそのビジョンをチーム全員と共有し、各メンバーの貢献が全体の成功にどのように繋がるかを理解を深めます。

### 2. コミュニケーションの促進
開放的で透明性のあるコミュニケーションを奨励し、定期的なミーティングやスタンドアップミーティングを通じて情報共有を行なっていきます。

### 3. 技術スキルと知識の向上
最新の技術トレンドやベストプラクティスについてのトレーニングや勉強会を定期的に開催し、チームメンバーのスキルアップを支援・サポートします。

### 4. アジャイル開発プロセスの適用
スクラムやカンバンなどのアジャイル開発手法を採用し、柔軟性と迅速なフィードバックのループを実現していきます。必要に応じてスクラム説明会などを行うことで全体的に開発チームをスキルアップしていきます。

### 5. コード品質と標準化の重視
コードレビュー、ペアプログラミング、継続的インテグレーション（CI）と継続的デリバリー（CD）の実践を通じて、高品質なコードの維持と改善を促します。スクラムでは、チーム全体での品質を担保していきます。

### 6. エラー管理とリスクの軽減
エラー管理プロセスを確立し、リスクを早期に特定して対処する体制を整えます。特に問題が起きた際は、チーム全体で対応を行い、適宜ミーティングを行います。事前にリスク対策を練っておきます。課題や問題を妨害リストをチームで全体で情報シェアし、それぞれの優先順位を行なっていくことで、問題を取りこぼさないようにします。

### 7. ユーザー中心の設計
開発の各段階でユーザーのフィードバックを取り入れ、ユーザビリティを最優先する開発姿勢を意識付けしていきます。

### 8. ワークライフバランスの尊重
プロジェクトの期限とチームメンバーの健康や個人的な時間を尊重するバランスを保ちます。納期だけが重要ではありません。このプロジェクトを通してチームメンバーの底上げ、スキルアップ、メンタルアップを目指していきます。

### 9. 成果と貢献の認識
チームメンバーの成果や貢献を認識し、適切なフィードバックと評価を行います。チームメンバーとレトロスペクティブなどで感謝を伝えることは重要ですね。

### 10. 継続的な改善
プロジェクトのレトロスペクティブを定期的に実施し、問題点の特定とプロセスの改善を図ります。

これらのポイントを実践することで、効率的かつ効果的な開発プロセスを実現し、チームメンバーのモチベーションと満足度を高めることができます。
QuickSight(異常検知、ナラティブ、テキスト)

https://catalog.us-east-1.prod.workshops.aws/workshops/aa601d0b-84c9-4f77-b9a7-5954d8574cd5/ja-JP/3-build-advanced-dashboard/create-analysis-and-publish-dashboard/anomaly-layout-and-publish

上記サイトの演習で異常検知、ナラティブ、テキストについて以下quiita記事とは別に作成することにした。
https://qiita.com/run_way/items/81459536058adf199e9c

# 異常検知の設定をする

1,最初のシートで、メニュー下のアイコンから インサイトを選択し、+追加ボタンをクリックし、計算タイプにて、異常値検出を選択し、選択を押します。
![スクリーンショット 2024-02-05 20.01.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555220/8af85879-c5c1-ede6-c55c-6d5c6d101a6f.png)
![スクリーンショット 2024-02-05 20.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555220/d6263517-01bd-4ec3-22c1-5c57c67dcd3c.png)

2,フィールドウェルの、時間にオーダー日付、値に利益率（集計）、カテゴリに地域をドラッグ＆ドロップします。

3,フィールドウェルの時間にあるオーダー日付の　∨ をクリックして、集計=>週 を選択します。
週単位にすることで、ここでは計算量を減らします

4,インサイトの今すぐ始めるを押し、設定画面が開きます。
![スクリーンショット 2024-02-05 20.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555220/2847f99a-9580-ecb0-6430-9719cb68ec20.png)

ここで、分析する組み合わせや、表示オプション、スケジューリングをすることができます。また、異常値を検出した際、その異常がどのフィールドの組み合わせによって起こったのかという計算（寄与率の算出）を実施し、その内容を表示させる上位寄与要因を設定することもできます。今回は、利益率という集計指標を使用した計算フィールドを設定したため、当機能は利用できませんが、利益や売上を値に設定した場合は利用することができます。

![スクリーンショット 2024-02-05 20.03.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555220/15d3da43-30fd-876a-c0b7-0b27763a1390.png)


# 異常検知のナラティブを作成
上記1)の異常検知にて生成されたナラティブを、手動で日本語に変換します。

1,インサイト右の … をクリックし、説明をカスタマイズ” を選択します。
2,ナラティブエディタが表示されたら、以下のように変更します。



![スクリーンショット 2024-02-05 20.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555220/10c88ce4-fd19-a10b-cb1e-ce2ebcffb855.png)

日本語化
![スクリーンショット 2024-02-05 20.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555220/9302a2cf-3958-3fe5-e0e8-cc74a2510c3d.png)


# テキストの追加
以下画像の箇所のボタンを押すとテキストを追加できます
![uploading...0]()
フリーランスエンジニアの年収価値は社員の2分の1以下だ

フリーランスは額面ほどに稼げているわけではない。

社員の給与に比べてその価値は2/3程度だと言われる。
つまり社員で500万円稼いでいる人と、フリーランスで750万円稼いでいる人は、稼いでいるお金の価値でいうと同程度だということだ。

だが計算してみると断然、それ以下なのかもしれない。


# 消費税でマイナス10%

10%かかる。

もちろん自分ではなくクライアントが支払うものではあるのだが、もし税込み分の収入額を「年収」と錯覚していているようであれば、その額よりも10%ぐらいは収入の額面は低い。
自分がフリーランスになった当初はこの消費税のことが念頭になく、完全に計算違いをしていた。

ちなみに「みなし税率」の仕組みもあるが、それでも差し引き5%はかかる。

# 事業税でマイナス5%

問答無用で5%ぐらいかかる。

# 年金 でマイナス9%

フリーランスは国民年金に加入する。

フリーランスの手取りが多いからと言って手放して喜んではいけない。
その手取りを社員相当分、貯めるか何かしておかないと、要するに自分の将来を食いつぶしていることになる。

社員の場合は年金保険料の9%程度を会社が負担するが、フリーランスは同等額を将来のために使おうと思ったら、この9%を自己負担する必要がある。



# 社会保険料でマイナス15% ( 年金含む )

ひとつ前に年金のことを書いたが、健康保険料などの会社負担も考えると、社員の給与額に対して15%ほどを会社が負担するらしい。
つまりフリーランスは15%のマイナスだ。


# 仕事が途切れた場合でマイナス10%

1年間フルで働けた場合の計算でも上のとおりなので、仕事が途切れる期間があるとさらに状況は厳しくなる。
1年の10%ぐらいは仕事が途切れている期間があるとすると、10%のマイナスだ。

# 有給や特別休暇がないのでマイナス10%

フリーランスには有給や特別休暇がないため、その分、実働時間に対しての収入は低くなる。
フリーランスには有給、年末年始の休暇、ゴールデンウィーク、シルバーウィークはない。

たとえばホワイトな企業の社員の場合、年間休日125日+有給20日の、労働日数は220日程度。
だがフリーランスが1年通して平日全て働いた場合は、244日程度だ。

つまり同じく「1年働く」と言っても、労働時間に対する時給は10%ほど低いことになる。

さらには育児休暇や結婚休暇や他もろもろの休暇を加算すれば、時給はもっと低くなるだろう。


# 合計マイナス 45%

ここに出てきた全てを単純計算すると、なんとマイナス50%近くになってしまった。信じがたい。

つまりフリーランスで1000万円の収入があっても、社員給与に換算したら550万円程度の価値しかないということだ。

フリーランスの収入の価値は社員の1/3から1/2程度とは言うが、1/2程度という話もうなずける。

# 個人事業主なら経費申請の裁量が大きいのではないか？

そんなことはない。仕事に必要な出費を経費にするわけであって、それ以上でもそれ以下でもない。



# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
グループ毎のユーザー管理をグループ毎に分けてみた

# 概要
New Relicのユーザーを管理する際に、各グループのユーザー管理は各グループに任せたいと考えたことは無いでしょうか？特に関係する部門が多かったり、ユーザー数がそもそも多いと、ユーザー管理が負担になることもあるかと思います。

New Relic アップデート(2023年11月)の中で、ユーザー管理の権限を各ユーザーグループに移譲できるようになったというアップデートがあるので試してみます！

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2023年11月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202311 "New Relic アップデート(2023年11月)")
[New Relic アップデート](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート")
:::

公式ガイドはこちらになります。

https://docs.newrelic.com/jp/docs/accounts/accounts-billing/new-relic-one-user-management/user-management-concepts/#group-admin


# 概念
これまでは、下図の様にグループが複数別れていても、全体で一律ユーザーを管理していましたが、、、

<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/774dee3f-7008-06f9-2c5e-0742e3f16030.png">

ユーザー管理の権限を各ユーザーグループに移譲できるアップデートが出てきたので、下図の様に各グループを管理するためのグループを作成して、そのグループのメンバーに各グループのユーザー管理を任せられるようになっています！

<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/499ed3be-8704-01aa-e5f1-14227d607699.png">

# 事前準備
管理されるグループを１つ用意してください。
以降は、このグループを **［Team A］** として進めていきます。

グループの作成方法は下記を参照ください。

https://docs.newrelic.com/jp/docs/accounts/accounts-billing/new-relic-one-user-management/account-user-mgmt-tutorial/#grants-ui

# 手順
## 1. Team Aを管理するグループを作成

Administration > Access Management > Group で [Create new group] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/323ecefc-bf56-a811-706e-bc7623bc5387.png)

グループ作成の詳細画面で、グループ名、認証ドメイン、メンバーを設定します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/f576ecf6-ff88-74f9-7ab7-40d830a5722f.png">

また、Group RolesでGroup Adminを設定し、管理する対象となるグループを設定し、

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/77756ebd-bd36-6af6-9bb5-fd0d28d574ae.png">

Administration settingsのAuthentication domain settingsで"Add Users"を設定します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/8de83404-3e70-b8af-1cb2-933af8e33bdf.png">

Saveボタンをクリックして、Team Aを管理するグループを保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/3c201cce-aa51-0532-59ef-a38a60c665fe.png)

## 2. Team Aを管理するグループの動作を確認
それでは、Team Aを管理するグループのユーザーでNew Relicにログインして、実際にどの様に管理できるか試してみます。

管理者グループのユーザーでログインして、Administration > Access managementを開くと、管理対象のTeam Aのグループを確認することができました。Team Aをクリックした先の画面で、グループへのユーザーの追加削除が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/b9b79003-6cc7-fa40-7c10-379c87644c5e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/4c8978b4-e3c4-ce91-7503-14d830263216.png)


# まとめ
ユーザー管理の権限を各ユーザーグループに移譲する機能を試してみました！
組織が大きく分かれているときなどはぜひ試してみてください。

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2023年11月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202311 "New Relic アップデート(2023年11月)")
[New Relic アップデート](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート")
:::

:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
無料IPaaSであるn8n.ioをSynology NASのDockerで動かす

普段の生活において、何かと自動化を求めてしまうこの頃。

IFTTTなど数々のIPaaS製品を使ってきたものの、サービス終了や有料化の波が押し寄せ、
「なんとか無料でできないか」と諦めて課金していたときに n8n.io に出会いました。

https://n8n.io/

他のIPaaS製品と同じようなものかーと思っていたんですが、よく見るとソースがgithubに公開されているではないか！

**自前でサーバやNASなどを持っている人は無料で使える**とのことなので、昔から使っているSynology NASにインストールしてみました。

# 環境

今回インストールしたNASは以下のとおり

* Synology DS220+
* DSM 7.2.1-69057 Update 4

パッケージセンターから「Container Manager」をダウンロードしておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296012/f3a3d87b-2361-f3a3-ab8b-487078d1dedf.png)

* Container Manager
* v20.10.23-1437

# Dockerからファイルのダウンロード

n8n.ioのGitHubには、docker-composeを使う場合のファイルが用意されています。

以下のURLから**3種類のファイルをダウンロード**しておきます。

https://github.com/n8n-io/n8n-hosting/tree/main/docker-compose/withPostgres

* .env
* docker-compose.yml
* init-dash.sh

# ファイルの編集

ダウンロードしたファイルの中で、「.env」ファイルはそのまま利用できません。

以下のように中身を書き換えてください。

``` .env
POSTGRES_USER=n8nuser
POSTGRES_PASSWORD=n8npass
POSTGRES_DB=n8n

POSTGRES_NON_ROOT_USER=n8nuser
POSTGRES_NON_ROOT_PASSWORD=n8npass
```

**書き換えないとデータベースとの接続がうまくいかない**ので注意が必要です。

# Synologyにファイルをアップロード

先ほどダウンロードしたファイルをSynologyにアップロードします。

Container Managerをインストールすると同時にできたフォルダ「Docker」内に、
「n8n」というフォルダを作成し、2つのファイルをアップロードしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296012/24f2e23c-9640-124a-9f22-51b762771a0d.png)

* .env
* init-data.sh

# Dockerを起動

Container Managerを開き、プロジェクト > 作成 をクリックします。

| 項目 | 内容 |
|:-:|:-:|
| プロジェクト名 | （任意の名前を記入） |
| パス | docker > n8n を指定 |
| ソース | 「docker-compose.ymlをアップロード」を選択 |
| ファイル | （ダウンロードしたdocker-compose.ymlをアップロード） |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296012/90da9025-b1ca-577b-fbfb-fc564b9641cf.png)

「次へ」をクリックすると、プロジェクトが作成されます。

インストールまでしばらく時間がかかるので待ちましょう。

# n8nにアクセス

当初、私はここで躓きました。

「localhost:5678でアクセスできるよ」とメッセージが出てくるのですが、それはあくまでNAS上の話。

クライアントパソコンからどうやってNASのlocalhostにアクセスするんだ！と悩みました。

答えは簡単で、「**リバースプロキシ**」で解決できたのです。

コントロールパネル > ログインポータル > 詳細設定 > リバースプロキシ をクリックしていくと、設定画面が表示され、新たに設定を追加しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296012/e6a0979f-8659-0be6-7afe-dc4cacd05027.png)

私はポート番号12000を叩くと、localhost:5678に届くよう設定。

もちろん12000以外のポート番号にしてもOKです。

カスタムヘッダーも忘れずに設定。作成 > WebSocket で追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296012/496da5a9-3c77-ca2d-af98-6c9f030853dc.png)

普段からQuickConnectで接続している方は、DDNSの設定をしておきましょう。

DDNS設定はこちらの記事がわかりやすいです。

https://masao-tec.com/set-up-ddns-and-access-from-the-internet/

これにより、 https://xxxxxxx.synology.me:12000 を叩くとn8nの設定画面が表示されるようになりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296012/a64c0070-0205-e3f3-539e-5cf49ce52528.png)

皆さん、良い自動化ライフを！
LLM自身が自分をチューニングする手法：Self-Rewarding について

先日、LLMに関する記事を読んでいた際に、Metaから1月下旬に発表された「Self-Rewarding Language Models」という興味深い論文を発見しました。この論文では、新しいLLMのチューニング手法「Self-Rewarding」を紹介しています。Self-Rewardingは名前の通りに、LLMが自分自身へ報酬を与えて、チューニングすることです。

この手法は、従来の「RLHF」を改善したようなものです。RLHFは、人間がLLMのoutputにスコアをつけて、このスコア付けされたデータを基に、LLMの出力を評価できる教師モデル(reward model)を作成します。その後、この教師モデルの評価を参考してLLMをトレーニングします。（RLHFはGPTモデルを訓練際に、非常に効果がよかったので、その後はほとんどLLMのトレーニングで使われる手法です。）

Self-Rewardingもoutputを評価するステップありますが、評価用のモデル（reward model）はLLM自身となります。
処理の流れとしては、まず、LLMがランダムな問題を生成し、次にその問題に自ら解答します。その後、自分の解答に対して自分自身でスコアをつけ、そのスコアに基づき自身のパラメーターを調整してトレーニングを行います。あと、この生成されたデータもトレーニングデータセットに追加します。このように自己トレーニングのサイクルを繰り返すことで、モデルの精度を徐々に向上します。

イメージとしては以下の通りです。（LLMが自分で作成した質問に回答を生成し、自分で評価して学習データに追加します。）

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/522788ad-eaea-d67c-7fbe-cc59343b2486.png)



このSelf-Rewardingの研究は、MetaがLlama-70Bモデルを使って行われました。Self-Rewardingでトレーニング前のLlama2-70Bの精度はAlpacaEval2というオープンランキングで約13％だったですが、３回（3epoch）の訓練を経て、その精度は約20％に向上し、GPT-4の旧バージョンやGemini Proなど多くの既存LLMを上回りました。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/df518821-a3be-4a16-a20d-a995ffc3cfc5.png)


この研究はまだ始まったばかりですが、LLMの自己チューニングはこれから非常に期待できる分野だと思います。最近ツイッター上でも、RAGを使ってLLMをfine-tunningする方法も話題になっているようです。（LLMが自分で生成したoutputを使ってRAGし、RAGからの結果に基づいて生成された内容が良いかどうかを判断して、自分のパラメーターをチューニングすること）

興味ある方:

https://arxiv.org/abs/2401.10020
Iphone X以降のホームバー対策

# はじめに
IphoneX以降、ホームボタンがなくなり、新しくホームバーが誕生した。
それにより、ホームバーとアプリ画面が被ってしまい操作しにくいことが起きている。


![S__96362498.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291381/90ab4837-92a4-8496-ac70-9f82e1528ade.jpeg)





:::note info
この現象は特にPWAを使用している際に生じる。

:::





https://developer.mozilla.org/ja/docs/Web/Progressive_web_apps


この問題を解決するのが`セーフエリア`である。

## セーフエリアについて

セーフエリアとは、iphoneX以降のホームバーやカメラに対応して、アプリの表示を調節してくれる考え方のことである。


![safe-areas-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291381/a33c3887-726e-c3ce-0e23-5a5c8ab92ef9.png)

[^https://webkit.org/blog/7929/designing-websites-for-iphone-x/
]:以下の記事から画像引用 

以下の記事から画像引用
[^https://webkit.org/blog/7929/designing-websites-for-iphone-x/]


### 実装方法

実装方法はとてもシンプルで、HTMLとCSSに少し記載だけである。

まず、HTMLのmetaタグに以下のコードを記載する。


```html
<meta name='viewport' content='initial-scale=1, viewport-fit=cover'>

```

:::note info
・metaタグについて
・viewportについて

:::
https://developer.mozilla.org/ja/docs/Web/HTML/Element/meta

https://gmotech.jp/semlabo/seo/blog/howto-viewport/




次にbottomの要素またはbody要素にCSSセレクタに以下のコードを記載する。

```css
  padding-bottom: env(safe-area-inset-bottom);

```

https://developer.mozilla.org/ja/docs/Web/CSS/env


**完成！**

![S__96362503.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291381/7a2c42d6-f11d-e27a-7f62-f4bc69c1a780.jpeg)



## 参考にした記事
https://www.bambi.pro/entry/iphone-X-screen-adjustment
Line Sticker Downloader LINEスタンプダウンロード

<p class="codepen" data-height="720" data-default-tab="result" data-slug-hash="VwRdmLB" data-user="04" style="height: 720px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/VwRdmLB">
  Line Sticker Downloader LINEスタンプダウンロード</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

スマホの場合は右上からリンクコピーできるよ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/2a54abde-2fa1-efbe-0d58-6aa2f4a03717.png)


# ソースコード

https://dash.deno.com/playground/line-sticker

```typescript
import { DOMParser } from "https://deno.land/x/deno_dom/deno-dom-wasm.ts"
import { JSZip } from "https://deno.land/x/jszip/mod.ts"

const headers = { 'Access-Control-Allow-Origin': '*' }

Deno.serve(async (req: Request) => {
    const m = req.url.match(/\d+/)
    if (!m) return new Response()
    const r = await fetch(`https://store.line.me/stickershop/product/${m[0]}/ja`)
    if (!r.ok) return new Response()
    const document = new DOMParser().parseFromString(await r.text(), 'text/html')
    const stickers = [...document.querySelectorAll('li[data-preview]')].map(li => JSON.parse(li.dataset.preview))
    if (req.url.includes('.zip')) {
        const zip = new JSZip()
        const static_promises = stickers.map(async s => s.staticUrl && zip.addFile(s.id + '.static.png', await fetch(s.staticUrl).then(r=>r.blob())))
        const animation_promises = stickers.map(async s => s.animationUrl && zip.addFile(s.id + '.animation.png', await fetch(s.animationUrl).then(r=>r.blob())))
        const popup_promises = stickers.map(async s => s.popupUrl && zip.addFile(s.id + '.popup.png', await fetch(s.popupUrl).then(r=>r.blob())))
        const sound_promises = stickers.map(async s => s.soundUrl && zip.addFile(s.id + '.sound.m4a', await fetch(s.soundUrl).then(r=>r.blob())))
        await Promise.all([...static_promises, ...animation_promises, ...popup_promises, ...sound_promises])
        const zipFile = await zip.generateAsync({ type: 'uint8array' })
        return new Response(zipFile, {
            headers: {
                'content-type': 'application/zip',
			    'content-disposition': `attachment; filename=${m[0]}.line.zip`,
                ...headers
            }
        })
    } else {
        return Response.json(stickers, { headers })
    }
});
```
Cloud Composer の異常検知を Cloud Functions で実装するときの注意点

Cloud Composer が正常に動作していることを確認する仕組みを作るときにハマったポイントが有るためメモも兼ねて記事にしました。

## やりたいこと

- Cloud Composer のジョブが起動していないことを検出する
- Cloud Composer のジョブが異常終了していることを検出する

特に起動していないことを検出する観点があることに注意が必要です。
エラーが発生していることを検出するだけなら Cloud Logging への出力でアラートを上げればよいのですが、そもそもジョブが起動しなければ Cloud Logging へも出力されないため、Cloud Composer の外から起動できているか確認する必要があります。

## やったこと

Cloud Functions でジョブの起動履歴を取得して、特定の時間以降の起動がなければエラーを吐く実装をしました。

### ハマったこと

ジョブの起動履歴を取得するときに、 Airflow の API を呼び出す方法を考えました。
[List DAG runs API](https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html#operation/get_dag_runs) を叩くことで実行履歴を取得できます。

ただし Cloud Functions から Airflow の API を叩いて実行履歴を取得するには Cloud Functions の使用するサービスアカウントを Airflow ユーザーとして登録し権限を与える必要があります。

この登録する方法が分からずドキュメントを探し回りました。

### 解決方法

Cloud Composer の [サービス アカウントを使用して Airflow REST API にアクセスする](https://cloud.google.com/composer/docs/composer-2/access-airflow-api?hl=ja#long-service-account-email) のページに書いてありました。

次のコマンドを実行します。
```shell
gcloud composer environments run ENVIRONMENT_NAME \
    --location LOCATION \
    users create -- \
    -u accounts.google.com:NUMERIC_USER_ID \
    -e UNIQUE_ID  \
    -f UNIQUE_ID \
    -l - -r Op --use-random-password
```

`accounts.google.com:NUMERIC_USER_ID` には Airflow の API を叩く Functions の NUMERIC_USER_ID を入れます。
NUMERIC_USER_ID は次のコマンドで取得可能です。

```shell
gcloud iam service-accounts describe \
  SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
  --format="value(oauth2ClientId)"
```

これで Cloud Functions のサービスアカウントを Airflow ユーザーとして登録できました。

## まとめ

- Airflow の List DAG runs API でジョブの起動履歴を取得できる
- Airflow の API を叩くには Airflow ユーザーの登録と権限付与が必要
- 登録と権限付与は gcloud コマンドで可能

### 実装した感想
最短の手順は上記の通りですが、先述の通りドキュメントを探し回ってようやく最短手順がわかりました。
やったこととしては
1. 「セキュリティのタブからユーザー登録可能」という記述を見つけてユーザー登録を試みる
1. そもそもセキュリティのタブが表示されていないことを確認した
1. 表示するに Airflow ユーザーの Admin 権限を必要とするがわかった
1. それには [Airflow UI にユーザーを登録する](https://cloud.google.com/composer/docs/composer-2/airflow-rbac?hl=ja#registering-users) という部分を読めばやり方が書いてあった
1. ここまできて記事に書いていた方法を見つけた

という感じで遠回りしてしまいました。

もうちょっとドキュメントを探すのうまくなりたい。
Android端末はインターネットアクセスの夢をみるか？

# はじめに
Android端末をインターネット接続のないWi-Fiアクセスポイントに接続しようとして、接続・切断を繰り返して安定しないという現象に遭遇し、ワークアラウンドを見つけたので紹介します。
# 環境
ある試験のため、SIMなしAndroid端末をインターネット接続のないクローズドなLAN環境にWi-Fi接続しようとしました。アクセスポイントのSSIDを選択してパスワードを入れると、一旦接続されるのですが数秒後に切断され、その後接続・切断を繰り返して接続が完了しません。

環境を簡単に書くと、

Buffalo Wi-Fiルータ 192.168.1.1（ブリッジモードでDHCPサーバ兼用）
+-Windows10 PC（Wi-Fi接続 or 有線接続どちらでも）
+-Android端末（SIMなし、Android 12 or 13どちらでも）複数機種で再現

Android端末をインターネットにアクセスできない環境で使うというのは特殊な状況と思いますが、電波暗室で測定したいとか、工場内でクローズド環境で工具として使いたいとか、そんな場面があると思います。

ちなみに、同じ環境でiPhoneならば素直に接続できます。
# ワークアラウンド
上記の環境に、Linuxサーバー（AlmaLinux8.6)を追加したところ、Android端末がWi-Fiに接続したのち「このWi-Fiはインターネット接続がないけどつないでいい？」みたいなメッセージが出て、OKすると安定して接続が確立しました。
# 考察（未完）
AndroidOSはインターネット接続があるかどうか何かのパケットで見ているのでは、と推測し、確認のためにLinuxのサービスをいくつか停止してみましたが絞り込めませんでした。（当初DNSだろうと推測した）
DNS/NTP/Samba/FTPあたりは空振りで、それらが止まっていてもLinuxPCがつながっていればAndroidのWi-Fi接続が安定します。どういう条件で判断しているかご存じの方、ご教授いただければ幸いです。
AWSにLinux GSMを使ってPalworldを構築しGSAで管理

AWS(Amazon Web Services)にLinux GSM(Game Server Managers)を使ってPalworldを構築したうえで、GSA(Game Server App)で管理してみた。

## 概要
まず、料金に関して、立てっぱなしが前提なら、[Conoha](https://www.conoha.jp)や[X Server](https://game.xserver.ne.jp)などのVPSのほうが安上がりであり、Conohaであれば16GBプランが割引込で9,430円/月となっている。私としては月約1万を少々お高く感じたので、ゲームをプレイするときだけサーバを上げる運用を前提として、AWSを選定した。
次に、構築に関してはLinux GSM(Game Server Manager)を利用した。ゲームサーバの構築・運用を楽に行えるようにするためのツール。構築やアップデートなど、面倒な処理はすべて半自動でやってくれる。
加えて、GSM推奨のGSAというWebサービスも利用した。ゲーム内の情報をわかり易く表示してくれたり、Discordとの連携機能を提供してくれたり、なかなか使えるサービスだ。Palworldで公式に提供されている、RCON(Remote Console)というAPI(?)を用いて実現されており、ゲームの外から、ゲーム内の情報を取得したり、ゲームの設定を変更したりできる仕組み。RCON自体は一般的な概念らしい、実装はゲームによってまちまちらしいが。

## AWS設定
### インスタンス選定
メモリ16GBは必要との公式情報をもとに、どのインスタンスタイプが良いか[調べた](https://techblog.forgevision.com/entry/aws-ec2-instance-bgr)結果、「m7a.xlarge」を選定。[オンデマンド料金](https://aws.amazon.com/jp/ec2/pricing/on-demand/)を見ると「USD 0.23184/h」なので、こまめに電源OFFする前提での運用を想定し、3,441円/月=34.41円/h\*5h\*20dayと見積もった。加えて、電源OFF時に少額の維持費がかかる。

### OS
今回は[Linux GSM](https://linuxgsm.com/servers/pwserver/)で構築する前提なので、サポートされている「Ubuntu 20.04 LTS」を選定。

### セキュリティグループ
インバウンドに「UDP8211（ゲームプレイ用のデフォルトポート）」と「TCP25575（後述するGSAから接続するためのRCONデフォルトポート）」を開放する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2560507/ce63c2e0-416f-8f63-a2ea-6fa3aff37d40.png)

### ElasticIP
このままだと起動し直すたびにIPアドレスが変わるので、ElasticIPを払い出ししてサーバに割り当てる。[お値段は0.005 USD/h](https://aws.amazon.com/jp/vpc/pricing/)とのことなので、530円/月ほど。

## サーバ構築
### Linux GSMで構築
基本は下記手順に則って実施する。抜粋しておくが、変わる可能性があるので、原典を当たっていただきたい。

:::note
AWSにおけるUbuntuインスタンスで、SSH可能なデフォルトユーザは`ubuntu`です。
:::

https://linuxgsm.com/servers/pwserver/

1. まずはUbuntuのパッケージを全体的にアップデート
   1. `apt update`
   2. `apt upgrade`
2. Dependenciesから必要なパッケージをインストール（詳細は上記リンク参照）
`sudo dpkg --add-architecture i386; sudo apt update; sudo apt install curl wget file tar bzip2 gzip unzip bsdmainutils python3 util-linux ca-certificates binutils bc jq tmux netcat lib32gcc1 lib32stdc++6 libsdl2-2.0-0:i386 steamcmd`
3. Install からゲームをインストール（詳細は上記リンク参照）
   1. `adduser pwserver`
   2. `su - pwserver`
   3. `curl -Lo linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh pwserver`
   4. `./pwserver install`
4. Basic Usageを読んで使い方を理解

## GSA(Game Server App)にRCONで接続
GSAに登録する。ちなみに、AWSで固定IPを割り付けていない場合、起動し直すたびに毎回IPアドレスが変わるので、設定し直しが大変というオチ。

### PalWorldSettings.iniを編集
まずは、PalworldのRCONを有効化する。`./pwserver details | grep Config`を実行すると設定ファイルの場所がわかるので、`vi /home/pwserver/serverfiles/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini`で編集する。AdminPasswordに任意の文字列を設定し、`RCONEnabled=True`とすれば良い。

```PalWorldSettings.ini
ServerDescription="",AdminPassword="任意の文字列",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=True,RCONPort=25575,Region=""
```
:::note warn
`./pwserver stop`でPalworldを止めた状態で編集すること。そうしないと、設定が巻き戻る。
:::

### GSAでRconConnect設定
Connect Rcon Connectから`Server IP`と`RCON port`と`RCON password(AdminPassword)`を設定する。Query portは使っていないのか、何でも良かった。

https://www.gameserverapp.com/

### GSAでDediConnect設定
SSH設定をしてやることで、サーバ自体をいじくれるようにもなるらしい。軽くやってみた感じ、rootでのSSHを許容しなければならなさそうだった。
【PHP】代入演算子の返り値が変わることがある

PHPの[代入演算子](https://www.php.net/manual/ja/language.operators.assignment.php)は式なので値が返ってきます。
どういうことかというと、`$a = 10`という代入式を書くと`$a`に10が代入されますが、それとは別に`$a = 10`全体としての値も10となるわけです。


# 多重代入

時々ある

```php
$a = $b = $c = 10;
```

という書き方、これは

```php
$a = ( $b = ( $c = 10 ) );
```

と解釈されます。
まず`$c = 10`で`$c`に10が代入され、`$b`には`$c = 10`の返り値10が代入され、`$a`には`$b = ( $c = 10 )`の返り値10が代入される、ということになり、結果として`$a`・`$b`・`$c`すべてが10になります。


プロパティも同じです。

```php
$c = new stdClass();
$a = $c->b = 10;

var_dump($a, $c); // $a=10, $b=stdClass{b=>10}
```

# プロパティ型指定

実は、プロパティに型指定がある場合、返り値が変わることがあります。

```php
class C{
  public string $b;
}

$c = new C();
$a = $c->b = 10;

var_dump($a); // "10"
```

`$c->b = 10`の返り値は`10`ではなく`"10"`です。
`$c->b`はPHPの自動型変換でstring型に変換されますが、式全体の返り値もその変換後の値になるというわけです。

マジかよこんなん知らんかったわ。

この情報、[マニュアル](https://www.php.net/manual/ja/language.operators.assignment.php)には記載がなく、Qiitaやその他ブログ等の記事でも全く見たことがありません。
私は[プロパティフックのRFC](https://wiki.php.net/rfc/property-hooks)で初めて知りました。
他にこの情報について言及されているところを見かけた人は、ぜひ教えてください。

そういえば他の言語ではどうなってるんだろう(調べる気はない)


# strictモード

[strictモード](https://www.php.net/manual/ja/language.types.declarations.php#language.types.declarations.strict)を有効にすることで、ほとんどの自動変換を阻止することができます。
唯一の例外はfloat型にintを渡した場合で、`10`が`10.0`になります。
これはstrictモード自体で元々許容されている動作であるため、仕方ないところでしょう。
実害もほぼありませんしね。


# おまけ

リファレンスを使うと変数値をこっそり変更することができます。

```php
$c = new class{
    public string $b = "";
};
$b = & $c->b;
// ↑ここまでどこかに隠しておく

$a = $b = 10;
var_dump($a, $b); // $a="10", $b="10"
```

[変数の型指定](https://qiita.com/rana_kualu/items/8337e5ead7d52badf3e1)の応用です。
使い道はさっぱりわかりませんが、なんかの引っかけにでも使えるかもしれません。


# Csharp

調べる気はないと言ったな。

```cs
int a;
float b;
a = b = 1; // error CS0266: Cannot implicitly convert type `float' to `int'

(b = 1).GetType(); // System.Single
```

int型にfloat型を突っ込もうとしてエラーになりました。
直接確認してみたところ、実際に`(b=1)`の返り値はfloat型になっていました。
C#では[代入式の返り値は左側の型](https://learn.microsoft.com/ja-jp/cpp/cpp/assignment-operators)になります。

つまり、型によって代入演算子の返り値が変わるのはPHPに固有の現象ではなく、他の言語でもよくあることのようです。
なんてこった。
Amazon Q for AWS Builder Useの会話型Q&A機能を使ってみた

# 1.Amazon Q for AWS Builder Userとは
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/amazonq/latest/business-use-dg/what-is.html)の記事によると以下の説明がされています。

>生成型人工知能 (AI) を活用した会話型アシスタントであり、AWS アプリケーションの理解、構築、拡張、運用を支援するだけでなく、AWS に関する質問にも回答できます (サポート、アーキテクチャ、ベストプラクティス、ドキュメントに関する質問を含むが、これらに限定されない)。Amazon Q は機能および能力を継続的に更新し、ユーザーの質問が状況に応じて最も適切で実用的な回答を得られるように努めています。これには必要に応じて人とつながる機能も含まれています。

一言でいうとAWSに関する様々な質問に答えてくれる生成AIアシスタントサービスですね。AWSサービスに特化している旨が記載されていることから、アーキテクチャー設計や普段サポートに問い合わせてる内容などを回答してくれる期待があります。

Amazon Q for AWS Builder Userには様々な機能がありますが、今回は会話型Q&A機能を試しに使っていきます。

# 2.実際に試してみた
まずはAWSコンソールにログインします。 AWS re:Invent のキーノートでAmazon Qが発表されて以降コンソール画面の右上に正六角形のボタンが追加されています。

![amazonq開くためのキャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683522/0c16d3bd-5cf6-6231-055c-7df8b8e31ac4.png)

こちらを押すと質問を入力する画面が表示されます。ChatGPTと同様の形式ですね。現在は英語のみがサポートされています。
下の「Ask me anything about AWS」に質問を英語入力します。

![amazonq入力画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683522/474442d1-19e3-26a0-5a9a-d3bf9a05a498.png)

### 静的ホスティングアーキテクチャーについて色々聞いてみた
自分の中でアーキテクチャーがある程度思いつく静的ホスティングについて聞いてみました。以下が質問とAmazon Q 回答です。実際は英語でやりとりしてます。

内容| 日本語訳|
|:------------------|:------------------|
|質問|静的ホスティングを実現するアーキテクチャーをすべて教えてください。|
|Amazon Q回答|AWS で静的ホスティングを可能にする主なアーキテクチャがいくつかあります。<br>1,Amazon S3 - S3 を使用すると、Web サイトホスティング用のバケットを設定し、静的ファイルをバケットにアップロードできます。 S3 はファイルをユーザーに直接提供します。これを設定するには、S3 バケットの [プロパティ] タブで [静的 Web サイト ホスティング] を選択します。<br>2,Amazon S3 + CloudFront - より高いパフォーマンスを得るには、S3 をオリジンとして使用し、CloudFront を S3 の前の CDN として構成できます。これを行うには、まず前述のように S3 バケットを設定します。次に、CloudFront で新しいディストリビューションを作成し、オリジンとして S3 バケットを選択し、Web サイト配信を有効にします。<br>3,EC2 + ロードバランサー - ALB や NLB などのロードバランサーの背後にある EC2 インスタンスで静的ファイルをホストできます。ロード バランサーは、高可用性と自動スケーリングを保証します。これを設定するには、EC2 インスタンスをプロビジョニングし、ターゲット グループを作成し、トラフィックをターゲット グループにルーティングするようにロード バランサーを構成します。

３つのアーキテクチャーについて提案してくれてます。かなり細かい構成情報まで書いてあります。
セキュリティとコストそれぞれで最も優れた方法も追撃で質問してみます。

内容| 日本語訳|
|:------------------|:------------------|
|質問|最もコスト効率が良い方法とセキュリティレベルが高い方法をお教えてください。|
|Amazon Q回答|AWS で静的ウェブサイトをホストする最もコスト効率の高い方法は、S3 を単独で使用することです。 S3 では管理するサーバーがないため、コンピューティング リソースの料金を支払う必要がありません。ファイルをホストするために使用されるストレージの料金を支払うだけです。<br>最高レベルのセキュリティを提供する方法は、CloudFront とともにストレージに S3 を使用し、認証/認可を構成することです。このアーキテクチャでは次のようになります。<br>静的ファイルは、安全なストレージを提供する S3 バケットにプライベートに保存されます。<br>CloudFront は S3 バケットの前に位置し、WAF、キャッシュ制御ヘッダー、アクセスを制御するクエリ文字列フィルタリングなどの機能を構成できます。<br>認証は Cognito または外部プロバイダーを通じて処理できるため、許可されたユーザーのみがコンテンツにアクセスできます。<br>HTTPS は CloudFront エッジで強制され、トラフィックを安全に暗号化します。<br>これにより、ストレージには S3 、アクセス制御およびセキュリティ機能には CloudFront の両方の長所が活用されます。これにより、許可されたユーザーのみが安全な方法でプライベート静的コンテンツにアクセスできるようになります。

セキュリティ、コストそれぞれ優れた方法を細かい説明のある根拠付きで教えてくれました。参考となるURLも提示してくれており情報としては確かなように思います。

# 3.まとめ
今までサポートに問い合わせたり、自分でドキュメントを見つつ調べたりなどしてた内容をAmazonQに聞くことでスピード感をもって効率的に正解にたどり着けるようことが可能になりました。
今後各AWSサービスと統合されて多くの機能追加がされることでさらに便利なサービスとなることを期待します。
HelloWorld本 第4章

# glibc

GNUの標準Cライブラリ実装であり、スタートアップ・システムコールラッパー・ライブラリ関数を提供する。
アセンブラと最適化に詳しい場合、自作することもできる。

# アセンブラが必要な機能

カーネルだと、ブート・割り込み・ディスパッチ。
アプリケーションだと、スタートアップ・システムコールラッパー・setjmp()とlongjmp()。

# ソースコードの検索

特徴的なキーワードで検索し、以下の条件に当てはまる行を除き、lessで反転表示する。

- 異なるアーキテクチャ
- 明らかに無関係なファイル

# APIとABI

APIは機能、ABIは実装を規定する。
APIはソースコードとライブラリのインターフェースであり、ソースコードを無修正で移植できる。
ABIはバイナリとシステムのインターフェースであり、バイナリを無修正で移植できる。

- 命令セット、エンディアン、アライメント
- 呼び出し規約
- システムコール
- ファイル形式

# glibcのビルド

glibcをビルドすると、標準CライブラリをC言語ベースで動的解析でき、ビルド時に生成されるファイルを調べることもできる。
ソースコードからインストールする時は、慣習的に以下のコマンドを使用する。

- ./configure (環境毎のMakefileを生成)
- make (ビルド)
- make install (インストールディレクトリにコピー)

# ./configure

インストールディレクトリを変更し、--disable-werrorを使用する。
アセンブラやリンカのバージョンやオプションのチェックでエラーになる為、エラー処理自体を無効化する。

# make

エラーになるマクロやシンボルは無効化する。
ライブラリはソースコードのリンクを保持する為、ソースコードを削除すると参照できない。
laravel Torでプロキシを通す

## やりたい事
セキュリティのテストの為、
違うIPアドレスからアクセスしたい。

## Tor（トーア）とは
Tor（The Onion Router）は、プライバシーと匿名性を保護するための無料のソフトウェア。
通信を匿名化するために使用されます。
Torは、複数の中継ノードを経由して匿名性を高めています。
用途が違うかもしれませんが、今回はテストの為にTorを使います。

## 公式サイトからTorをDL
https://www.torproject.org/download/

インストール後TORクライアントを実行
「〇〇\デスクトップ\Tor Browser\Browser\TorBrowser\Tor\tor.exe」


```php:プロキシ
socks5://127.0.0.1:9050
```

## コントローラー側
```php:コントローラー
use Illuminate\Support\Facades\Http;
//...
        //パラメータ
        $url = 'https://www.cman.jp/network/support/go_access.cgi';
        $headers = [
            'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
            'Accept-Encoding' => 'gzip, deflate, br',
            'Accept-Language' => 'ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7',
            'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
        ];
        $proxy = 'socks5://127.0.0.1:9050';
        $response = Http::withOptions([
            'proxy' => $proxy,
            'verify' => false, // SSL証明書の検証を無効にする
            ])
            ->withHeaders($headers)
            ->get($url);
            // ->post($url, ['name' => "value"]);
        
        //文字コードを確認
        $contentType = $response->header('Content-Type');
        preg_match('/charset=(.+)/', $contentType, $matches);
        $encoding = isset($matches[1]) ? $matches[1] : 'UTF-8';

        $content = $response->body(); //コンテンツ取得
        $content = mb_convert_encoding($content, 'UTF-8', $encoding); //文字化け対策
        dd($content);

```
https://www.cman.jp/network/support/go_access.cgi
などIPアドレスを返してくれるサイトを指定して動作確認。


※TORの使用は法的かつ倫理的な観点から注意が必要であり、
　適切な利用が求められています。
シングルタスク・マルチタスク・タスクスイッチングの違いは何なのだろうか (職業プログラマの生産性の話)

# まとめ

- 純粋な意味で言うマルチタスクは人間の誰にもできないし、極めて効率が悪い。超人を夢見た空想である。
- タスクスイッチングにメリットがあればそうすれば良いし、デメリットが大きいようであれば避ければ良い。
- 「タスクスイッチングしながら、シングルタスクでタスクを各個撃破する」という仕事法もある。

# 人間はシングルタスク


人間はそもそもシングルタスクしか出来ないらしい。
なので仕事は各個撃破、シングルタスクで臨むべきという。自分もそれに賛成する。

だがシングルタスクとマルチタスクの違いはたまによく分からない時がある。

たとえばタスクAをしている最中に、緊急でタスクBをする必要が生じ、そのタスクBにシングルタスクで専念する。
そしてタスクBを終えてタスクAに戻りしばらくすると、今度はタスクCが現れて、またそれに専念する。

このようにタスクスイッチングを頻繁におこないながら、それぞれシングルタスクで当たるのは、果たして「シングルタスク」なのだろうか。

# 最悪のマルチタスク

かつて自分は、最悪のマルチタスクをしようとしていた時があった。

なんとなく「いつでもPCを開き続けて、作業をし続ける人」になりたくて、自分の脳をマルチタスク化に慣らそうとチャレンジしたことがあった。

たとえばPCで作業をしながら人と話す。電車の中でもPCを開く。
それを開発者同士のランチでもやってひんしゅくを買ったことがあった。

今思えばあの時は、複数のことを同時にやっているつもりでいて、その実、なにひとつ進んでいなかったのだ。
シングルタスクでそれぞれに当たれば100%ずつの力が発揮していただろうに、無謀なマルチタスクをしようとすることによって、それぞれの能率・効果を10%以下に落としていたのではないだろうか。

そのぐらいに生産性は下がっていたと思う。
(幸いに、なんの得もない「マルチタスクもどき」はその後、すぐにやめたのだが)

# 頻繁なタスクスイッチングは是か非か

それでは頻繁なタスクスイッチングは是なのだろうか非なのだろうか。

プログラミングの仕事であれば、基本的にはある程度の集中時間を確保して、開発に集中するのが良いと言われる。

だが、迅速なレスポンスがチームやクライアント、プロジェクト全体の利益にもなる場合もあるということだ。
自分が速く反応すればするほど、周りの人は「待ち状態」をすぐに解消できて、タスクスイッチングのコストを減らすことが出来る。

なのでここも塩梅だと思う。

素早いレスポンスとタスクスイッチングに利益があるようならばそうしたら良いし、そうでないならば控えれば良い。
さすがに1分に1度タスクスイッチングしていては集中力の必要な仕事が成り立たないだろうし、逆に1週間に1度しか返信が返ってこないメンバーとはやりづらいだろう。


#  タスクスイッチング + シングルタスクの威力

自分の実感としては、目の前に現れたタスクに一瞬で反応して、次々に片付けていくのも良いと感じている。
なぜなら素早く臨時タスクを片付けるということは、すなわち素早くそれを解消して、メインのタスクに戻れるということでもあるからだ。

素早いレスポンスは時に、むしろ、自分のシングルタスクを助けてくれると思う。
誰だって、山程の些末なタスクが意識に残った状態では、足を取られてしまうだろう。

#  参考文献

## SINGLE TASK 一点集中術――「シングルタスクの原則」ですべての成果が最大になる

<img width="422" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/73c29273-44f3-4be6-b491-0cdf3ecd9a15">

##  Deep Work

「大事なことに集中する―――気が散るものだらけの世界で生産性を最大化する科学的方法」

<img width="1457" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/82cf7705-3b2d-4cba-8645-3cb1d2520914">

## 世界一流エンジニアの思考法

<img width="697" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/28f1b3e8-2535-4b8c-a57f-092d8c5c103a">






# チャットメンバー募集


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

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


# プロフィール・経歴 ( Githun )

https://github.com/YumaInaura/YumaInaura
Kubernetes(kubelet)でcertificate_managerがCNログを大量に吐き出した話

# 事象
Kubernetesのワーカーノードで`journalctl`や`systemctl status kubelet`でこんな感じのログが大量発生しました。

```
Current certificate CN (kubelet) does not match requested CN (system:node:xxx)
```

# 対処方

CSR名を洗い出し
```
kubectl get csr | grep Pending
```

承認する
```
kubectl certificate approve csr-xxxxx
```

※PendingのCSRが出なくなるまで繰り返し

# 原因
多分、kubeletの`--rotate-server-certificates`パラメータが原因。
CSR承認しろって書いてあった。

https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
> Requires the RotateKubeletServerCertificate feature gate to be enabled, and approval of the submitted CertificateSigningRequest objects. 

# 余談
ApproveしたCSRはしばらくすると`kubectl get csr`で見られなくなるので、エビデンス求められるなら早めにとった方が良さげ

# 確認した環境
OKE v1.27.2
デフォルトでは`--rotate-server-certificates`入っていないが、カスタムして入れました
M5Stack 開発環境と使い方　memo

# M5Stack 開発環境と使い方
 M5stackを使った開発環境の構築と初期動作確認を行った際のメモ
 下記の記事を参考にした時のメモを。
* [M5Stack Basicの使い方、端子配列、サンプルプログラムで詳しく紹介](https://logikara.blog/m5stack-basic/)

# 開発環境
* windows

# M5のコーディング環境
３パターンある模様
* PlatformIO
 ⇒VScodeで使える
* UIFlow
 ⇒MicroPythonが使える
　 プログラムが一つのアプリとみなされ，動作内容が選択できる
* Arduino IDE
 ⇒今回割愛

# 1. PlatformIOのセッティング
## 1.1 準備
* [M5Stack 開発環境構築（PlatformIO IDE編)](https://frees.jp/2021/06/27/m5stack-platformio-ide/)
　VScordとPlatformIOのインストール
 
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/22356393-8a24-5d71-1b35-9fb8966adb67.png width=400>

## ビルド
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/d7ec09b7-1cd1-1065-914b-50f4241b26da.png width=320>

## TERMINALでビルド操作
VScodeのアイコン操作でビルドができない場合に下記方法で解決した。
ビルドしたいprojectのディレクトリに移動し
```py:ビルド
pio run  
```
```py:アップロード
pio run -t upload 
```

# 2. UIFlowのセッティング
## 2.1準備
* [最新版UIFlowの使い方。初期設定から動作確認まで詳しく紹介
](https://logikara.blog/uiflow/)
* [M5Burnerのダウンロードと使用方法](https://shop.m5stack.com/pages/download)
* [USBドライバのインストール](https://docs.m5stack.com/en/download)
 

## 2.2 インストール版
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/3c49a378-21e4-8fb6-3698-46c93a02e181.png width=320>

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/728c8de0-7ab6-e962-e032-c27fa33d3181.png width=320>


## 2.3 ブラウザ版

https://flow.m5stack.com/

* [M5　Guide for UIFlow2.0](https://x.com/m5stack/status/1721874583773642903?s=46&t=ORkp3jCf1MDmZu5WZj7Lkw)
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/69aa7698-82d3-4825-0d52-01ad28f06935.png width=400>

# 3. M5Unified 共通ライブラリ
 便利なライブラリがあるらしい。
* [M5Unifiedの紹介](https://speakerdeck.com/lovyan03/m5unifiednoshao-jie)
* [M5Unified のVSCode+PlatformIOでの環境構築ガイド](https://twitter.com/gomihgy/status/1658437635306823680?s=46&t=ORkp3jCf1MDmZu5WZj7Lkw)
* [platformio-examples](https://github.com/platformio/platformio-examples)

以上

# 参考サイト
* [M5Stack Basicの使い方、端子配列、サンプルプログラムで詳しく紹介](https://logikara.blog/m5stack-basic/)
### PlatformIO
* [PlatformIO アクション](https://pleiades.io/help/clion/platformio.html#cmake-profiles)
* [マイコン開発するならPlatformIOがめちゃくちゃいいぞ](https://qiita.com/JotaroS/items/1930f156aab953194c9a)
* [Visual Studio Code + PlatformIO 環境で M5Stack Core2 for AWS でHello Worldしてみました](https://dev.classmethod.jp/articles/m5stack-core2-for-aws-hello-wprld/)

### UIFlow
* [M5Stack UIFlow Desktop IDE(Micro Python)開発環境の構築](https://interface.cqpub.co.jp/m5stack-micropython/)
* [最新版UIFlowの使い方。初期設定から動作確認まで詳しく紹介](https://logikara.blog/uiflow/)
小学生が使えるARアプリのUIを初心者が考える

# はじめに
筆者はUIについての専門知識は全くありません。
今回は、小学生の教育に使えるARアプリを考える機会があったので、その中で特にUIについて考えた点について書き記します。

# 目次
[1. 小学生向けのARアプリを考えたきっかけ](#1-小学生向けのarアプリを考えたきっかけ)
[2. 今回考えたARアプリの概要・想定](#2-今回考えたarアプリの概要・想定)
[3. UIを考える際に留意すべきこと](#3-uiを考える際に留意すべきこと)
[4. 実際に考えたUI](#4-実際に考えたUI)
[5. まとめ](#5-まとめ)

# 1. 小学生向けのARアプリを考えたきっかけ
デバイスの進化や文化の移り変わりにより、ARやVRがどんどん身近になっていると感じる昨今。筆者は学校教育にARが使われる環境が整ってきていると感じています。実際のところ、小中学校の生徒には一人一台のタブレットやPCが支給され、教育に使われています。それらを活用して、ARアプリを導入すれば、より楽しく、わかりやすい教育ができるのではないかと考えました。

# 2. 今回考えたARアプリの概要・想定
今回考えたARアプリは、学校の授業の中で、生徒の関心を高めながら理解を助ける補助教材という立ち位置で考案しました。
教科書や電子教材などの平面的な情報よりも、立体的に観察できた方が理解しやすい単元（天体や地学など）で、ARを使った補助教材を使用することを想定して制作しました。
また、今回考えたアプリは生徒と教員がそれぞれタブレット端末を持って体験するもので、教員が教材を選択して表示し、それが生徒の画面にリアルタイムで共有されるという手法をとっています。


## 2-1. 位置合わせの手法
まずはARの位置合わせについてです。
ARを見る際、位置合わせに使われる手法はマーカーを使う方法、センサーを使う方法、画像の特徴点を使う方法などがあります。その中で、予算や利便性を考慮すると、小学校で使用するのに現実的なのはマーカーを使う方法でしょう。

## 2-2. 授業スタイルの想定
マーカーを机の上に置き、立ってタブレットを見るスタイルが、マーカーへの距離が適切でARも見やすい形だと考えられます。

## 2-3. 使用するデバイスや操作の想定
小学校で使われているタブレットは、iPadやChrome Bookが主流です。
今回もiPadまたはChrome Bookを使用する想定です。

それぞれ操作方法はほぼ変わらず、タップ、ピンチイン/アウト、スワイプなどが使用できる操作です。
また、ARということで、生徒自身が動いてAR教材を見る視点を変えることも可能です。


# 3. UIを考える際に留意すべきこと
次に、UIを考える上で心にとめておいた方が良いと考えた点について記述します。

主に考えた点は以下の3つです。
1. 小学生がの指が届く範囲にUIを置く
1. 画面を触る場面を少なくする
1. 教員の負担を減らす

このような点を考慮した目的は、

- 利便性を向上させて満足度を向上させる
- 導入に対するハードルを下げる
- 生徒が余計な部分に気を取られないようにする
- 無理のない操作で、タブレットを落とすなどのリスクを減らす

などが挙げられます。
では、具体的に紹介していきましょう。

## 3-1. 小学生の指が届く範囲にUIを置く
まず考えるべきは、小学生がタブレットを持った時に無理なく触れる範囲です。
今回、タブレットの向きは横向きで考えました。

これは右利きの生徒向けに考えたものです。
青色の部分は、両手で持った際に簡単に指が届くと考えられる範囲です。
また、右利きの生徒が片手で持ち、片手で操作する場合は水色の範囲が触りやすいと考えられます。


![iPad Pro 11_ - 1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692466/878f1886-2d5c-d952-073d-f9f0971a20cb.png)


また、位置に加えて大きさも大きくすると操作しやすくなると思います。

## 3-2. 画面を触る場面を少なくする
AR教材の利点として、立体的に教材を観察できるという点があります。開発側の目線からすると、生徒はその利点に集中してほしいです。教員側も同じ意見だと思います。そこで私は、生徒が画面を触って操作できる機能を最低限に抑えるべきだと考えました。

具体的には、生徒側には教材を見る視点を操作する機能のみを実装し、教材の選択や大きさの調整は教員が操作して、それを生徒に共有するという手法です。

そうすることで生徒の余計な行動を減らしつつ、教員が伝えたい部分を伝えやすくなるのではないでしょうか。


## 3-3. 教員の負担を減らす
授業で取り扱うという前提上、教員は複数人の生徒に対して対応しなければなりません。操作方法の説明に時間がかかってしまっては元も子もないので、操作は可能な限り簡単で、直感的に理解できるようにする必要があります。UIの大きさを大きくし、機能を単一にして生徒がすぐに理解できるようにすべきでしょう。



# 4. 実際に考えたUI
以上の考慮すべき点を踏まえ、実際に考えたUIがこちらになります。

教員用
![Screenshot_20240207_121301_20240115_ARAppForEducation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692466/e4546d12-39d2-524a-6b3c-87e1919673fe.jpeg)


生徒用
![Screenshot_20240207_121106_20240115_ARAppForEducation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692466/6a04a88e-36f2-6666-eb29-5af105b60bc1.jpeg)


これは、天体の動きを観察する教材を想定して制作しました。

生徒はARマーカーの上に出現する教材を観察できます。さらに、オブジェクトの表面をタップするとミニカメラを設置し、そこから見える星の映像を画面左上の黒いウインドウから観察できます。画面右下のリセットボタンで、ミニカメラの位置が元に戻ります。

教員は出現する教材を切り替えたり、大きさを変えたり、教材の時間を進めて星を動かすことができます。その結果は生徒に共有されます。


# 5. まとめ
「小学生が使えるARアプリのUIを初心者が考える」ということで、

1. 小学生がの指が届く範囲にUIを置く
1. 画面を触る場面を少なくする
1. 教員の負担を減らす

の三つの点を考えて制作した結果が上記のようになりました。
左利きの方のことを考え、UIの位置を左右反転できる機能をつけるべきだったなど反省点はありますが、UIについて真剣に考えたのは初めてだったので、いい経験になりました。
これからもアプリ制作の際は、実際の利用者のことを考えてUIを設計していきたいと思います。
ここまでお読みいただき、ありがとうございました。
Photon Fusion2でFieldAccessExceptionが発生する

# 事象

Fusion2環境で以下のエラーが発生する。
Fusion1では同様のコードで発生しない。

```
FieldAccessException: Field `Fusion.NetworkBehaviour:Ptr' is inaccessible from method "other method"
```

# 解決方法
unsafeを許可していない場合はこのエラーが発生するようです。
以下のいずれかのチェックをオンにすることでエラーが発生しなくなります。

## PlayerSettings
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/7728f146-4684-269b-347f-f18c9dfc38ec.png)

## Asmdef
アセンブリを分けている場合はAsmdef側の設定を変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/30b9dc54-236e-fd74-cd7d-d9ce845032a9.png)
VagrantでGuest Additionsアップデート時にYumRepo Errorが出る

## はじめに
Vagrant で CentOS 6.5 の環境構築を行った際に少し苦労したのでその備忘録です。
メモ書き殴り形式になっているのであくまでもチラシの裏だと思って読んでください。

## Guest Additionsのアップデート

Vagrantを立ち上げ（`vagrant up`）すると、GuestAdditionsが原因のエラーメッセージが出る
```
[default] GuestAdditions versions on your host (7.0.14) and guest (5.2.26) do not match.
```
VirtualBoxのバージョンアップが結構頻繁に行われるので、boxのGuest AdditionsのバージョンとVirtualBox本体のバージョンがずれてしまうらしい。

そこでVagrantには **vagrant-vbguest** というプラグインがあり、自動的にゲストOSにGuestAdditionsをインストールしてくれる仕組みがある。

### vagrant-vbguestを利用してGuest Additionsの自動バージョンアップを行う
https://jitsu102.hatenablog.com/entry/2014/04/12/235946


Vagrantを立ち上げた状態で（vagrant up時）
以下のコマンドを入力し、virtual boxのGuest Additionsをアップデートする
（初回一度のみでおｋ）
```
$ vagrant plugin install vagrant-vbguest
$ vagrant vbguest
```

本来はこれで無事にGuest Additionsがアップデートされるはずなのだが…
ここで別のエラーが発生！
```
Error: Cannot find a valid baseurl for repo: base
```

## CentOS側でYumRepo Errorが発生する

CentOSのサポートが切れるとyumコマンドが失敗するらしい。
CentOS 6 系 は 2020年11月30日にサポートが終了されたため、Yum リポジトリのデフォルトの設定が使えなくなってしまったというのが原因。
ということで、こちらの記事を参考にしてYumリポジトリの設定を変更してみる。

https://qiita.com/fallout/items/64777c552a11c74ff74b

Yumリポジトリの設定は、/etc/yum.repos.d/ 配下の **CentOS-Base.repo** というファイルに記述されているので、これを修正する。
```
$ vi /etc/yum.repos.d/CentOS-Base.repo
```

[base] に書かれたデータ取得先 URL が使用できないので、
mirrorlist= の行を # でコメントアウトし、
新たに baseurl= の行を追加して適切な URL を記述する。

:::note warn
先に言っておくと、このURLでこの後ハマった
（最後まで読んでからURLを書き換えてほしい）
:::

```CentOS-Base.repo
[base]
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra　 ←★コメントアウトする
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
```

[base] ブロック以外にも [updates] 、[extras]、[centosplus]、[contrib] のブロックがあるので同様に書き換えます。

修正が終わったら、`vagrant reload`で仮想マシンを再起動
これでvagrant-vbguestがうまく動くはず…

ところが、`[default] GuestAdditions versions ～` のあと応答なしで固まってしまう状態に…


## YumリポジトリのURLが違う

こちらの記事に記載されているURLで解決した。

https://www.khstasaba.com/?p=914

`baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/`
↓
`baseurl=http://vault.centos.org/6.10/os/$basearch/`

追加した行の数字部分はCentOSのバージョンにあわせて書き換えてください。
`https://vault.centos.org/6.5/os/Source/` ←こんな感じ



**URLがちょっと違うとかわからんがな…**

## まとめ
Guest Additionsのアップデートするだけで2日間も費やしてしまいました。
環境構築って難しいね…
LaravelのDebugbarでTo enable publicエラーが出たときの対処方法

# 概要
LaravelのDebugbarで下記エラーが表示されDebugbarが使えなくなった。

```
!! To enable public access to previous requests, set debugbar.storage.open to true in your config, or enable DEBUGBAR_OPEN_STORAGE if you did not publish the config. !!
```

![266790655-48463090-a498-45e4-892a-7cbbe35edc54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329178/d4140d2b-0b32-ab29-fb54-b2881b012eab.png)

# 対応
とりあえずキャッシュクリア系コマンドをすべて実行してもダメ。

```
php artisan route:clear
php artisan route:cache
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan optimize
composer dump-autoload
```

# 対処法
1.`config/debugbar.php`ファイルを削除
2.再度Debugbarを利用するコマンドを打つ
```
php artisan vendor:publish --provider=Barryvdh\\Debugbar\\ServiceProvider
```
# 引用
https://github.com/barryvdh/laravel-debugbar/issues/1459
[Windows] Google日本語入力でMacのように英数、かな入力を切り替えたい

# はじめに
`2024/02/05`という今日の日付を素早く入力したいなと思い、Google日本語入力をインストールしました。

私はMicrosoft IMEにおいて、「無変換」「変換」キーをMacの「英数」、「かな」に対応するように設定していたので、それをGoogle日本語でも設定しました。

# 環境
OS Windows 11

# 目次
1. [Google日本語入力のプロパティの設定](#google日本語入力のインストール)
1. [Chapter2](#chapter2)
1. [参考文献](#参考文献)

# Google日本語入力のインストール
以下のサイトからできます

https://www.google.co.jp/ime/


# Google日本語入力のプロパティの設定
・タスクバーの言語バーにある「A」または「あ」のアイコンを右クリックし、「プロパティ」を選択します。
・「キー設定」>「キー設定の選択」>「編集」を選択します
・以下の画像のように３箇所編集します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289319/dcd833c2-fe5f-75e0-8064-36f2e8392b4b.png)
・「OK」>「適用」を選択します
・Google日本語入力を再起動して完了です（Microsoft IMEに切り替えて戻すでもよいです）

# 補足
yyyy/mm/dd形式の日付を変換入力する方法については下記サイトを参考にさせていただきました。

https://www.bousaid.com/2016-11-27-123310/
Brainfuck Transpiler in C

Cで書いたbrainfuck Transpilerです。
30分で書けました。

ファイルからbrainfuckのソースを読み込んで、C言語に落としたものを、標準出力に出力します。リダイレクトして使用します。

出力したC言語のコードは、完全に機械独立で、一般のCコンパイラに通ると思います。

compile:
cc bfc.c -o bfc

使い方：
./bfc <file>
for ex.
$ ./bfc sample.bf >sample.c

```bfc.c
#include    <stdio.h>
#include    <stdlib.h>
void main(int argc,char *argv[]) {
    FILE *fp;
    int  c;
    if (argc!=2) {
        fprintf(stderr,"Usage: bfc <file>\n");
        exit(1);
    }
    fp=fopen(argv[1],"rt");
    printf("#include    <stdio.h>\n");
    printf("void main() {\n");
    printf("char array[30000]={0};\n");
    printf("char *ptr=array;\n");
    while((c=fgetc(fp))!=EOF) {
        switch (c) {
            case '>':
                printf("ptr++; ");
                break;
            case '<':
                printf("ptr--; ");
                break;
            case '+':
                printf("(*ptr)++; ");
                break;
            case '-':
                printf("(*ptr)--; ");
                break;
            case '.':
                printf("putchar(*ptr); ");
                break;
            case ',':
                printf("*ptr=getchar(); ");
                break;
            case '[':
                printf("while(*ptr){ ");
                break;
            case ']':
                printf("} ");
                break;
            default:
            }
    }
    fclose(fp);
    printf("}\n");
    exit(0);
}

```