OmniAICreator/Qiita-1.07M huggingface dataset:
情報Ⅰの学習・指導ポイントをまとめてみた

## この記事を書いた目的
教育現場では自校や他校との間で情報科担当先生の授業方針や計画が全く共有されていないので、結果的にクラスごとに全く違う内容を教えていたり、本来教えるべき内容を教えなかったりする認識の違いが発生した。この記事を通して情報科の意義を再確認したうえで適切な教育を行いたいと考えた。
（このような事態に陥っているのは私の学校だけなのかもしれない。）
## 参考教材
萩谷昌己　実教出版　最新情報Ⅰ　（文部科学省検定済教科書）
## 学習指導要領から考える情報科の目的
情報科の目的は以下の３つ
１\.情報活用能力の育成
２\.プログラミング的思考の育成
３\.情報社会の倫理観と責任感の育成
### 情報活用能力の育成
・必要な力を取集・整理・分析し、目的に応じて効果的に活用する力（情報リテラシー）。
・データの分析や問題解決における論理的思考力（データサイエンス的思考）。
・情報モラルやセキュリティ意識を持ち、責任ある情報社会の一員として行動する力。
### プログラミング的思考の育成
・課題を分解し、アルゴリズムとして具体化する能力（論理的思考力）。
・プログラミングを使って問題を解決する想像力と実行力。
・プログラムの動作や構造を理解し、他者と協力して開発する協働力。
### 情報社会の倫理観と責任感の育成
・情報技術が社会や生活に与える影響を多面的に理解する力。
・情報倫理を守り、責任をもって情報を活用する力。
・持続可能な社会の実現に向けて、情報技術を活用する責任感。
## 課題点
### 生徒から見た学習上の課題
・得にくい学びの実感
→学んだものがどう社会で使われているのかわからない・想像できない。
・スキル差の拡大
→学校では最低限度の知識や技能、人間性を育成する。
・抽象概念の難しさ
→アルゴリズムやネットワークの難解さ。
### 教員から見た指導上の課題
・教科の新しさ
→受験勉強にも一定程度の影響。
・設備と時間の不足
→情報科＝つまらない、役に立たない　だけは避けたい。
・指導力の二極化
→どのあたりまでを学ばせるべきかの下限を定義する。
## 今後の指導方針
1\.実践・段階を踏んだ学びの提供
→実務で用いられている問題解決のプロセスやプロジェクトを使うことで生徒の興味を引き出す。
2\.教師間のスキル向上と協働体制の構築
→現実的な開発手法を用いて業務の効率化を目指す。
3\.環境整備とICT機器の活用
→授業環境に適したICT機器やソフトウェアを整備
→システム開発の例を挙げ生徒の興味を引き付ける。
## 最後に
私も2024年に教育実習で母校に訪れたことがあるが、情報Ⅰという未知数の科目に対して生徒・教員は非常に困惑していた。2025年の共通テストにも導入される情報Ⅰ。副教科だから数学免許のついでに情報免許を与えようという短絡的な考えではいけないだろう。専門性の高い教員や講師の採用が急務となっているのは間違いない。
## 参考文献
[高等学校学習指導要領（平成３０年告示）解説](https://www.mext.go.jp/content/1407073_11_1_2.pdf)
WebView10年戦争

以下、スマホアプリとWebViewの歴史（2011年から2024年のスパンで）

- ガワネイティブという手法
    - ガワだけでネイティブで中身はWebViewで作るという手法
    - スマホWebで公開していたものをそのままアプリにするのには楽な方法だった
    - あまりにスカスカだとAppleの審査が落ちた
    - Phonegap（現Cordova）などで楽ちんに作れる
- ゲームはWebViewでは厳しい
    - Flashが使えなくなったことでブラウザゲームは死んだ
    - 「それHTML5でできるよ」とFlash排除の判断をなぜか後押しする先進的なユーザもいたが、実際にはHTML5ゲームでできることはかなり限られていた
    - Cocos2dxやUnityがスマホゲームのフレームワークとしてのスタンダードになった
    - ただし、ニュースアプリなどのの文字のレンダリングが多いものは、ゲームフレームワークではどうにもならない
- 非ゲームのマルチOSフレームワーク
    - WebViewのいいところは主要機能がAndroidとiOSで共通で作れるというところ
    - そこでWebViewを使わない形で次々にマルチOSのフレームワークが登場
        - Xamarin
        - ReactNative
        - Flutter
    - マルチOSだからといって一個のソースでいいかというとそうでもない
        - 新型コロナの感染通知アプリのCOCOAはXamarinで作られていたが、肝心のOS依存の分岐があまかったことで大きなバグを生んだ（実際にはテストしづらい環境が問題ではあった）
    - 何よりも、「画像とその周りに文字を流し込む」という機能はブラウザのレンダリングエンジンがめちゃくちゃ高性能
    - ニュース機能の画面などは結局どのネイティブフレームワークで作ってもWebViewになりがち
- WebViewのやなところの「タップが遅い」
    - WebViewの基本的な動きは「タップの後のダブルタップをまつ」というのがデフォルトの動きだった
    - これだけのことでWebViewはとにかくもっさりしていた
    - 表示した後に全てのアンカーに対して「ダブルタップのイベントを殺す」ということをやればいいけど、その初期化にも時間がとられるが厄介だった
        - 当初まだfastclickというjsでしのいでいた
            - https://qiita.com/igtm/items/0d421d3284c8ff1cc7aa
    - 当然いろいろ進化してダブルタップによるズーム機能を殺すことをブラウザ側が対応しはじめた
        - Android
            - https://developer.chrome.com/blog/300ms-tap-delay-gone-away?hl=ja
        - iOS
            - https://webkit.org/blog/5610/more-responsive-tapping-on-ios/
    - WebViewでも十分アプリとして快適に使えるようにもなった
- 外部環境として「徹底したCookie排除」
    - AppeleはとにかくCoookieを排除する姿勢を一貫してとおしてる
        - https://www.braze.co.jp/resources/articles/cookie#:~:text=2022%E5%B9%B49%E6%9C%88%E4%BB%A5%E9%99%8D,%E3%81%AB%E7%9F%AD%E7%B8%AE%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82
    - ログインせずに前回の情報を記憶しておいてほしいというシンプルな作りをブラウザベースで作るのが難しくなってる
    - 単なるWebで良かったものもアプリにせざるを得ない
    - サクッとWebViewで作りたいニーズもでてきてる
- WebViewアプリの代替物としてのPWAも追いやられてる
    - PWAという手法もあるがこちらもAppeleとしては消極的
        - https://www.gaji.jp/blog/2024/07/26/20262/
    - EU地域ではAppeleがPWAそのものを廃止
        - https://gigazine.net/news/20240227-apple-drop-iphone-pwa-scrutiny-eu/
- もっとWebViewを認めてあげてもいいんじゃないでしょうか
    - 過去の歴史では「WebUI」が常に戦火に負われながら逃げ惑ってきた
    - 実はみんなSPAの腕前も上がってきたので、WebViewでアプリっぽい動きがどんどんこなれてたんじゃないでしょうか
    - 「ReactNativeでスマホアプリ作っていました！」（でも大半はWebViewなんだよなぁ）みたいな「後ろめたさ」はある
    - トラフィックをみていると「あれ？大半がHTMLなんすけど？」ということは結構ある
    - もうみんな堂々と「WebViewでいいよね」と言い切ってはどうでしょうか
Windows Edgeに生えたCopilotを使ってPostgreSQLにテーブルを作成するから私はYouTubeを見る

# アプリ開発を生成AIでやってみようシリーズ

TBD

# PostgreSQLのインストール（データを持つ場所）

https://qiita.com/tom-sato/items/037b8f8cb4b326710f71

この方の手順でインストールしてください。
動作確認はしてもしなくても大丈夫です。次の手順で確認できます。
また、パスワードは次の手順でも使用するので、忘れないようにメモしてください。
（いや、次の手順で使わなくても忘れないでくださいｗ）

# Pgadmin4のインストール（データを見るためのGUI）

https://www.sraoss.co.jp/tech-blog/pgsql/pgadmin4/

この方の手順でインストールしてください。
インストールができたら、PostgreSQLで設定したパスワードで起動してください。
通常は、Windows では自動的にローカルホストの DB サーバを検出し、登録してくれるようです。

# Windows Edgeに生えたCopilotでDDLの作成

Edgeを起動して、画面上部右端にあるCopilotのアイコンをクリックして、
DDLを作成してもらいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/bcf4a150-18c7-17ed-5a05-40f474c4a3c2.png)

# DDLを実行してテーブルのデータを確認

Pgadminに戻って、クエリ画面を起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/72a1b52c-2bc5-97de-7c4f-7b0c3c72bb8c.png)

入力エリアにCopilotに作成してもらったDDLを貼り付けて、実行ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/06b0679c-26e0-798d-5bb4-49ebc5303d82.png)

成功のメッセージが出たら成功です。（あの人構文）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/40e2ee63-856d-86bb-089c-9d623618ab83.png)

デフォルトスキーマは「Public」になっているので、この後の作業用にカレントスキーマもついでに設定して、
作成されたテーブルを確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/e9914f20-9fa2-f5a2-4857-ba3953a4a4ae.png)

上手く作成できましたね。

# まとめ

人間いらんな～
【1ヶ月】AWS SOA-C02に合格した体験記

## 概要
タイトルにある通り、1ヶ月勉強しAWS SOA-C02に合格しました。
受験した動機や前提知識等を含め、どのような勉強を行ったか記します。

## 前提
### 筆者について
理系の大学院を修了し、現在社会人3年目です。
ユーザ企業のシステム部門にて、システム開発の企画やベンダーマネジメントをしています。
AWSの知識としては、SAA-C03を取得済みであり、基本的なサービスの概要は理解しているつもりです。
実務でAWSを触る機会はほとんどないです。
また、個人開発でAWSを使ったこともあまりありません。Lambdaでスクレイピングツールを作成したことがある程度です。

### 受験動機
新たにAWS環境を構築する案件に参画したことがきっかけです。
クラウドは現在非常にトレンドであり、これをきっかけにAWSの知見を深めたいと思いました。
そのため、最低限アソシエイトレベルのSAA, SOA, DVAは前提知識として身につけておきたいと考えた次第です。

受験を決意した際、すぐに試験の申し込みをしました。
先に試験日を決めることをお勧めします。勉強の計画を立てやすくやる気が出るためです。
※SOA-C03の際は試験日を先延ばしにしてしまい、勉強期間を3ヶ月もとってしまいました。
また、試験日の24時間以上前であれば、試験日の変更やキャンセルもできます。

## 勉強法
### 教材
1. CloudTech
SOAの問題(計180問)を2週しました。
1週目では正答率5割程度、2週目では8割程度の出来でした。
解けなかった問題は解説を熟読し、必要に応じてAWSの公式ドキュメントや生成AIを活用して、自分なりの解釈を持つようにしました。
また、正しい選択肢を理解するだけでなく、正しくない選択肢が不適当な理由も合わせて考えるようにしていました。
こうすることで、初見の問題に対する適応力が身につくと思います。
CloudTechの問題は本番レベルといっていいと思います。本試では、CloudTechと類似したが10問程度出題されました。

1. Udemy模試
https://www.udemy.com/course/aws-certified-sysops-administrator-associate-practice-exams-soa-c02/?srsltid=AfmBOoow2MrMmO_YLnq4mCGXqB9hG9vqpmnXuuVVu6SepwiVnXZHQUiW&couponCode=V2JPLETSLEARN

SOAの模試を5回分解くことができます。問題文は全て英語ですが、Google翻訳を併用することで十分活用できます。
筆者はあまり時間がなく、2回分しか解けませんでした。
成績は下記のとおり。合格点には届いていないです...
1回目: 63%
2回目: 71%

問題のレベルとしては本番同等だと思います。ただ、個人的にはCloudTechの方が本番の問題に類似している印象です。
CloudTechで基本的な知識を習得し、力試しとしてUdemy模試を活用する形が良いと思います。

### 勉強時間
約1ヶ月です。1日1~2時間程度勉強しました。
会社員のため、勉強時間の捻出には苦労しました。通勤時間や始業前、昼休み時間を活用しました。

## 受験当日のお話
筆者は都内のテストセンターにて受験しました。試験時間は10:00~12:10です。
オンライン試験も可能なのですが、他の方の合格体験記を拝見すると何かとトラブルが多い印象ですので、個人的にはテストセンターで受験した方が良いと思います。

### 受験中
CloudTech、Udemy模試と類似した問題が多かったため、落ち着いて回答できました。
特に先述したとおり、CloudTechと類似した問題が10問程度出題されたため、合格は堅いと確信しました。
SAA-C03と比べると問題文も短く、解きやすいと思います。
筆者は30分程度余して全問回答しました。見直しフラグをつけた問題数は、33/65問です。
### 受験後
20:16に合格メールを受信しました。
合格点は720点であるのに対し、筆者の点数は778点でした。
体感的には800点超えていると思ってたのですが...
![スクリーンショット 2024-12-28 21.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452125/b6a48433-56e6-e859-ffa3-3510a711d4d1.png)


## まとめ
以上、SOA-C02の合格体験記でした。
SAAで出題される内容と被る部分もあるため、SAAを取得されている方は比較的取得し易いと思います。
この記事が少しでも参考になれば幸いです。
監視カメラ　ステップ

cv2の cap.read()がどうしても動かないので、libcameraコマンドを実行するように変更。
そぞらさん（https://sozorablog.com/camera_shooting/#toc2）
から、「V3を使用するには、公式のライブラリであるPicamera2を使用する必要があります。」との回答あり。
色々と考えたが、libcameraコマンドを呼ぶ方法とした。
参考サイト　これはRPZ-IR-Sencer　のサイト。ここにサンプルコーデイングがあるので、引用＆加工。
https://www.indoorcorgielec.com/resources/raspberry-pi/pir-camera/

ますはひまじんがジムで不在の9:30ｰ11:30の間にだれがが侵入した場合、動画をとるように作成。
画像もパラメータ変更でとれます。
cronで9;30に実行して、2Hで終了させるpython　作成。
参考サイトのpythonを加工して以下で、camara_jinkan.pyで保存して確認。
これは動画でも画像でもとれるようになっています。
# 2025/1/12　人感センサーはあきらめました。コードを変更しています。
https://qiita.com/m_sunafukin77/items/291f101f88b31a3b008b
```
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import os
import time
import datetime
import subprocess

GPIO_PIN = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN,GPIO.IN)

# 時間計測開始
t_start = time.perf_counter()

# オプション
#  HQカメラの場合
#   写真の最大サイズは4056x3040
#   動画(H.264)の最大サイズは1920x1080, 最大画角は1440x1080
image_size = (1440, 1080)  # 撮影サイズの横幅, 高さ
mode = 'movie'  # 写真なら'photo', 動画なら'movie'
# pi5 = False  # Raspberry Pi 5の場合True, それ以外はFalse (動画撮影の手順が異なる)
save_dir = '/home/pi'  # 写真や動画を保存するディレクトリ
# interval = 60  # 1度撮影した後、再開するまでのインターバル時間[秒]
movie_duration = 10  # 動画の撮影時間[秒]

while True:
# 現在時刻取得
    t_end = time.perf_counter()
# 経過時間計算
    elaps = t_end - t_start
# ２Ｈ超えたらブレーク    
    if elaps > 7200:
        break
    print(elaps)
    if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
       print("man search")
       dt = datetime.datetime.now()
       if mode == 'photo':
            save_file = os.path.join(save_dir, dt.strftime('%y_%m%d_%H%M_%S.jpg'))
            subprocess.run([
                'libcamera-still', '-n', '-o',
                os.path.join(save_file), '-t', '1', '--width',
                str(image_size[0]), '--height',
                str(image_size[1])
                ])
            time.sleep( 10 )
            break
       elif mode == 'movie':
            save_file = os.path.join(save_dir, dt.strftime('%y_%m%d_%H%M_%S.mkv'))
            h264_file = os.path.join(save_dir, 'tmp.h264')
            pts_file = os.path.join(save_dir, 'tmp.txt')
            subprocess.run([
                'libcamera-vid', '-n', '-o', h264_file, '--save-pts', pts_file, '-t',
                str(movie_duration * 1000), '--width',
                str(image_size[0]), '--height',
                str(image_size[1])
                ])
            subprocess.run(['mkvmerge', '-o', save_file, '--timecodes', '0:' + pts_file, h264_file])
            os.remove(h264_file)
            os.remove(pts_file)
            time.sleep( 10 )
            break
    else:
        print("man no search")
        time.sleep( 1 )
GPIO.cleanup()
```
これで　ＯＫ。　

クーロンの登録
```
sudo crontab -e
```
ひまじんの不在タイミングに合わせて実行。
30 9 * * * /usr/bin/python3 /home/pi/camera_jinkan.py
インフラエンジニアが転職して4ヶ月経過した感想（SIer→自社サービス）

# 近況

お久しぶりです。
長らく記事を書けていなかったですが、無事に仕事納めができたので今年の一大イベントだった自身の転職について記事を書こうと思います。
前回の記事はこちら！！！

https://qiita.com/syupee/items/99ac1d8e88058d5b023e

そして近況ですが、今年は**株式相場**がよかったり**AWSの資格(SAP)に合格**したりなど、いいことが多かったです。
ちなみに今年4月ごろに上場したRubrik株を買っていたんですが、なんと90万円→215万円になりました！（2024年12月27日現在）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/a59eeab3-ffbe-323e-3773-bce062b2a2c5.png)



また、個人的な来年の目標は「**副業を始めること**」に設定しようかなと思っています。
土日や祝日などに数時間の間だけでも、インフラSEとしてバイト感覚で何か出来ればいいな〜と楽観的に考えています。
そんなに世の中甘くないとも思いますが・・・

# 生活の変化
前職もほぼフルリモートだったので、基本的には変わっていないです。
ただ、会社の規模は小規模になったので会議の数はかなり少なくなり、作業できる時間が増えたなあと感じています。

また、始業時間や残業時間に関して何か言われるといったことは無くなりました。
僕は比較的早起きなので、7時に業務開始することもありますが特に何も言われません。
今の会社では「固定残業代」があるので、その範囲内ならいつ働いてもOK！という感じです。
個人的にはとても快適に働かせてもらっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/4269827e-5b03-7598-fa7a-676521e8adc1.png)

# 気持ちの変化

転職先で「使えないやつ」認定されることがとても怖かったので、以下のことを実行しました。

### ① さっさとAWSの資格を取り、最低限の知識があることをアピールする
社内にAWSの資格保持者がいなかったので、存在感アピールのためです。
ちょっと勉強すれば受かるレベルだったけどサボってました。

### ② TeamsやSlackのチャットの反応速度を意識する（基本即レス）
これは特に意識しました。即答えられない内容であっても、「確認しますので、少しお待ちください」、「すぐに回答できないので今から調べます」といった返信をすぐにしています。

### ③ わからないことをすぐ聞く、理解したフリをしない、適切な頻度で報連相をする
理解したフリをしないのは、意外と勇気が要ることです。
『**聞くは一時の恥、聞かぬは一生の恥**』ですね！！！
　　
　　
以前の自分（前職のまま）では考えられないことですが、なんとか実行できたと思います。（もちろん今後も継続してやっていきます）

自分でなぜ姿勢が変わったのかを分析してみたんですが、「新卒X年目の新卒社員」から「一定以上の働きを期待される中途社員」へ立場が変わったことが原因なのではないかと思っています。

なんでもやってくれる実家暮らしから、全て一人でやらなければいけない一人暮らしに変わった感じです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/87053650-f259-c38b-dca8-bc855a85683f.png)



# ここ最近のやっていること

最近は本当に色々なことを任せてもらっています。
経営層とも距離が近いので、システムの更改（クラウド化）の説明や来期予算の説明を部長に行うこともあります。

#### ・社内利用システムのオンプレ→クラウド移行に関するあれこれ
→基本設計や移行方針策定、AWS環境構築などなど・・・

#### ・自社サービスの一部システム冗長化対応

#### ・オンプレ、クライアント端末、AWSのログ収集システムの構築

#### ・省庁ガイドラインの対応あれこれ

　　
SIerでは、「色々な業界のお客さんと関われるから〜」とか思っていましたが、今のところ自社サービスでもとても楽しく過ごしています。


# さいごに
個人的にとてもよかったなあ〜と感じたのは、自身の精神面の成長です。
まさか転職にこんな側面があるとは・・・
これからも精一杯見栄を張るために努力していく所存です！
それではまたどこかで。
ゲームボーイ RGBDS 開発メモ 第1回 サンプルコードをビルド

### これからなにをしていくか
RGBDSの公式に、[GB Assembly tutorial](https://gbdev.io/gb-asm-tutorial/) というページがあり、これをすすめていけばようそうです。ただアルカノイドみたいなゲームをつくるみたいで、そこまで試すかは要検討です。とりあえずは、こちらの Hello World! をすすめていきたいと思います。

### githubにレポジトリ作成

とりあえず README だけ作りました。

https://github.com/hiro824ab/gameboy

### RGBDSのインストール

公式サイトにあるように brew でインストール可能でした。

### エディタをどうするか

検討した結果、チュートリアルにあるように[Sublime text](https://www.sublimetext.com/) と [sublime-RGBDS](https://github.com/ISSOtm/sublime-RGBDS) を使用することにしました。
はじめて使ってみたのですがすごく軽快。

### とりあえず、チュートリアルのhello worldを動かしてみる

https://gbdev.io/gb-asm-tutorial/part1/hello_world.html

hello-world.asm （これがソース) hardware.inc をダウンロードしてコマンドを叩けば .gb ファイルが作成できました。この.gbファイルがROMファイルですね。

```
% rgbasm -o hello-world.o hello-world.asm
% rgblink -o hello-world.gb hello-world.o
% rgbfix -v -p 0xFF hello-world.gb
```

Sublime textでビルドもショートカットでできそう。あとでやってみます。

### .gb ファイルを エミュレータで起動

チュートリアルでは、[Emulicious](https://emulicious.net/) というエミュレータを使用していました。デバッガとかもあるようなので、ここはしたがって Emulicious を使ってみます。

![スクリーンショット 2024-12-28 21.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733735/8ff7d490-93c9-a76d-60b8-6f8bace1fae8.png)

無事起動できました！１バイトもコードを書いていなく、サンプルコードをビルドしただけですが、これでも感動します。大きな一歩ですね。有名なHello Worldもゲームボーイだとグラフィック（笑）

### 次回

次回はさらにチュートリアルをすすめていきます。
デザイントークンって何？

# デザイントークンとは？

デザイントークンは、プラットフォームに依存しない方法でデザインを表現して、様々なツールで共有できるようにする方法論です。デザイントークンによって、ツール間、チーム間でデザインに関する語彙を共有することができるようになります。

デザイントークンは記述のルールであり、実装はそれぞれのデザイナーや開発者に委ねられています。

例えば
次のように名前と値のペアのひとつひとつがデザイントークンです。

```
font-size-heading-level-1: 44px;
```

```
color-text-primary: #000000;
```


デザイントークンとしてやりとりできるようにしたもののサンプル
```
{
  "alert-border-style": {
    "$type": "strokeStyle",
    "$value": {
      "dashArray": ["0.5rem", "0.25rem"],
      "lineCap": "round"
    }
  }
}
```

# 何が嬉しいの？

デザイントークンをデザインツールなどで設定し、別のデザインツールやフロントエンド開発ツールに持っていくことで同じデザイントークンを共有することができるようになります。

ツール間でデータを移動させる場合、データのフォーマットに互換性が必要になります。この互換性を定めているのがデザイントークンフォーマットモジュールになります。

デザイントークはW3Cにあるコミュニティでドラフトが作られています。

:::note warn
ドラフトなので注意が必要です
:::

https://www.w3.org/community/design-tokens/

https://second-editors-draft.tr.designtokens.org/format/

W3C標準というわけではありませんが、参加している企業の顔ぶれを見ると十分に実効性を持ちそうです。

- Adobe
- Figma
- Google Material Design
- Sketch
- UXPin
など


# 「The single source of truth」

デザイントークンを語る上で大事なのが次の考え方です。
The single source of truth　信頼できる唯一の情報源

:::note info
すべてのデータが1か所でのみ作成、あるいは編集されるように、
情報モデルと関連するデータスキーマとを構造化する方法
Wikipediaより
:::

もしも、データが複数箇所で管理されていたら、開発者はどこのデータを見て実装すれば良いのでしょうか。そのようなことにならないようにデータを１か所で管理しようという考えです。また、例え１か所で管理していたとしてもデータフォーマットに互換性がなければツールを限定することになってしまいます。

# デザイントークンを構成するもの

## タイプ

- 色
- サイズ
- 間隔

## グループ

特定のカテゴリに属するトークンのセットを任意で指定できます。
例として、レイアウトやブランドなどが挙げられています。

## エイリアス

サンプル

```
$color-palette-black: #000000;
$color-text-primary: $color-palette-black;
```
$color-text-primaryは#000000ということ。

## コンポジットデザイントークン

```:サンプル
{
  "shadow-token": {
    "$type": "shadow",
    "$value": {
      "color": "#00000088",
      "offsetX": "0.5rem",
      "offsetY": "0.5rem",
      "blur": "1.5rem",
      "spread": "0rem"
    }
  }
}
```

## ファイルタイプ

デザイントークンファイルは、JSONファイルで交換することが想定されています。

## ツール
- Photoshop
- Affinity Photo
- Paint.net
- Illustrator
- Inkscape
- Adobe XD
- UXPin
- Sketch
- Figma

実際にこれらのツールがデザイントークンに対応しているかは分かりませんが、ドラフトに名前が記載されています。

# 具体例

W3Cのデザイントークンはあくまでフォーマットの仕様なので、どんなデザイントークンをどんな名前・値で定義するかといった具体的な実装はそれぞれのデザイナーや開発者に委ねられています。

デザイントークンの具体的な実装として、Open Props というものがあります。

### Open Props サイト

https://open-props.style/

Open Props のデザイントークン

https://unpkg.com/open-props/open-props.tokens.json

# 最後に

最近のデザインツールやフロントエンド開発ツールの進化は目覚ましいものがあります。そんな中デザイントークンというキーワードをよく見かけるようになりました。
デザイントークンを「デザインの要素」といった具合に抽象的な言葉として扱っている場合もありますが、今回紹介したW3Cのドラフトを指すことも増えてきているようです。
今後、各ツールがデザイントークンに対応していけば「The single source of truth」が実現され、デザイナーや開発者が快適な環境でプロダクト開発に取り組んでいけるようになるのかなと思いました。
片側検定

## はじめに

本記事では、**片側検定**の誤解をときます。

## 誤解その1 `片側検定を使うには、片側の根拠を示す必要がある`

片側検定するにあたって、**片側という根拠は示すことなく使えます**。

この誤解は、「片側検定は両側検定より有利になる。だから、根拠のある時しか使えない」という思い込みが原因と考えられます。

しかし、片側検定の主張は、両側検定の主張より狭い範囲です。

* 両側検定の「XXXの平均はYYYでない」という主張は、以下の2つの主張を含む
  * 片側検定の「XXXの平均はYYYより小さい」という主張
  * 片側検定で「XXXの平均はYYYより大きい」という主張

片側検定は、両側検定の主張の半分だけ主張しています。そのため、その主張の範囲においては両側検定より成立しやすくなります。

## 誤解その2`片側検定の帰無仮説は、「平均がある値と同じ」である`

片側検定の帰無仮説と対立仮説は次のどちらかです。

|             | 帰無仮説         | 対立仮説               |
| :---------- | :--------------- | :--------------------- |
| ケースその1 | 平均がある値以下 | 平均がある値より大きい |
| ケースその2 | 平均がある値以上 | 平均がある値より小さい |

この誤解は、「『平均がある値と同じ』にしないと`p値`を計算できない」という思い込みが原因と考えられます。

しかし、「平均がある値以下」という仮説の元で`p値`は計算できます。詳しくは下記を参照してください。

https://blog.pyq.jp/entry/pyq_release_200214

帰無仮説を「平均がある値と同じ」として棄却した場合に、「平均がある値より大きい」を採用することがおかしいです。「平均がある値と同じ」を棄却した場合に主張できるのは「平均がある値でない」です。

## さいごに

片側検定の考え方自体はシンプルです。今後は正しく使われることを願っています。

## 参考

https://docs.pyq.jp/python/pydata/scipy/ttest.html#id12

https://blog.pyq.jp/entry/Python_kaiketsu_210224

以上
IAMポリシーの種類と設計手法について


## IAMポリシーの種類
まず、IAMポリシーの全体像を把握するためにIAMポリシーの種類についてまとめます。以下の6つのIAMポリシーがあるようです。基本的に使う機会があるのが、アイデンティティベースのポリシーとリソースベースのポリシーになるかと思います。

### 1.アイデンティティベースのポリシー
アイデンティティ (ユーザー、ユーザーのグループ、ロール) がどのリソースに対してどんなアクションが実行できるかを指定します。ポリシーを作成してアイデンティティにアタッチすることでポリシーを付与します。

#### 管理ポリシーとインラインポリシー
アイデンティティベースのポリシーは管理ポリシーとインラインポリシーに分類できます。
管理ポリシーは独立したポリシーとして存在して複数のアイデンティティにアタッチすることが可能です。
さらに管理ポリシーには、AWSが作成しているAWS管理ポリシーとユーザーが作成するカスタマー管理ポリシーがあります。

インラインポリシーはアイデンティティとポリシーが1対1で紐づくポリシーのことです。

### 2.リソースベースのポリシー
S3のバケットポリシーなどリソースごとに設定するJSONで記述するポリシーのことです。リソースベースのポリシーはリソースとポリシーが1体1で紐づくのでインラインポリシーです。設定したリソースにプリンシパル（AWSリソースにアクセスする主体（人やサービスなど）のこと）がアクセスできるかの許可と実行できるアクションを設定します。

### 3.IAM アクセス許可の境界（Permissions Boundary）
Permissions BoundaryはIAMユーザーやロールに設定することが出来ます。名前の通りIAMユーザーやロールの権限に境界を設定することができます。

IAMユーザーに権限を付与してもPermissions Boundaryで拒否されているとアクションは実行可能になりません。
つまり、IAMユーザー、ロールでとPermissions Boundary両方で許可されていないと実行可能にならないということです。

### 4.サービスコントロールポリシー (SCP)
WS Organizationsで提供される機能で、組織内のアカウントや組織単位（Organizational Unit、OU）に適用されるアクセス許可を制御するためのポリシーです。グループ内のアカウントすべてにサービスのアクセス制限を設定する時などに便利です。

### 5.アクセスコントロールリスト (ACL)
リソースに対してどのエンティティがアクセスできるかを定義します。S3バケットのACLやネットワークACLがあります。

### 6.セッションポリシー
セッションポリシーはAssumeRole を使用するときに設定できるポリシーのことです。セッションでのロールの権限に制約を加えるときに使用します。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html#policies_id-based

## ポリシーの評価論理について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622891/010e9cc7-946c-0bd4-e8a8-8a621f10cec8.png)


https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_evaluation-logic.html

IAMポリシーの種類を紹介しましたが、評価論理は図のようになっています。複雑なので全体像は把握しておいてポリシーの設定の際にしっかり確認する必要がありそうです。


## IAMポリシーの基本動作
明示的拒否、明示的許可、暗黙的拒否という3つの基本動作が重要な役割を果たします。この仕組みを理解することで、セキュリティポリシーの設計やトラブルシューティングがより効果的になります。

**基本動作の優先順位**
IAMポリシーの評価は、以下の順序で行われます。
１明示的拒否: 最優先で評価され、どのような場合でもアクセスが拒否されます。
２明示的許可: 明示的許可がある場合、そのアクションやリソースへのアクセスが許可されます。
３暗黙的拒否: 許可ポリシーがない場合、すべてのリクエストはデフォルトで拒否されます。

## IAM設計手法について
ホワイトリスト方式、ブラックリスト方式、ハイブリッド方式の3つの設計アプローチがあります。

### ホワイトリスト方式
ホワイトリスト方式は、明示的に許可されたアクションやリソースのみアクセスを許可する方法です。最小権限の原則に基づいて必要最低限の権限のみ許可しやすいのがメリットです。一方で必要なアクションを正確に洗い出す作業が必要になります。

### ブラックリスト方式
ブラックリスト方式は、特定のアクションやリソースへのアクセスを拒否し、それ以外を許可する方法です。許可範囲が広い環境で特定の操作だけを制限したい場合に適しています。許可されるアクションの範囲が広がりやすく、意図しないアクセスが発生する可能性がある点がデメリットです。

### ハイブリッド方式
ホワイトリストとブラックリストを組み合わせた設計方法です。この方法では、通常はホワイトリスト方式を採用し、特定の例外をブラックリストで補完します。セキュリティと柔軟性のバランスを取りたい場合に最適です。

## 管理ポリシー (AWS Managed Policies)について
ポリシーにはAWSが用意してくれている管理ポリシー (AWS Managed Policies)と自分で作成するカスタムポリシー (Customer Managed Policies)があります。

初心者でも管理ポリシーを使用することで、簡単にIAMの設定ができます。利用する機会は多いと思うのでどのようなポリシーがあるか簡単に把握しておくとスムーズに設定できます。

IAMポリシーで指定できるアクション、リソースなど

https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html

## まとめ
AWSの運用をしていてIAMの理解が不十分だったのでまとめてみました。IAMは独特な用語が多くて最初は混乱してしまいますが、全体像を把握することで理解しやすくなると思いました。
Google Cloud Compute Engineインスタンスのディスクサイズを変更する方法

eve-ngを触っていた際に途中でディスク容量が足らなくなりディスクサイズ変更して対処したのでその方法をメモ

### 1.ディスクサイズ変更
「Compute Engine」→ 「ストレージ/ディスク」→選択して編集→サイズを変更して保存

### 2.パーティション拡張
```
sudo growpart /dev/sda 1
sudo resize2fs /dev/sda1
```
こんな感じ
```
root@eve:# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             91G     0   91G   0% /dev
tmpfs            19G   18M   19G   1% /run
/dev/sda1       146G  118G   28G  81% /

root@eve:# growpart /dev/sda 1
CHANGED: partition=1 start=227328 old: size=314345439 end=314572767 new: size=524060639 end=524287967
root@eve:# resize2fs /dev/sda1
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 19, new_desc_blocks = 32
The filesystem on /dev/sda1 is now 65507579 (4k) blocks long.

root@eve:# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             91G     0   91G   0% /dev
tmpfs            19G   18M   19G   1% /run
/dev/sda1       243G  118G  125G  49% /
Java の EnumSet についてメモ



## はじめに
Javaを学び直している途中に聞き慣れないコードを発見したのでメモ。
EnumSet について書こうとしたものの、前提の Enum や Set についての説明の方が多くなってしまった。

### 目次
* [そもそも Enum とは？](https://qiita.com/bayastea/items/cd9d9c106372f589fe7a#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82-enum-%E3%81%A8%E3%81%AF)
* [そもそもSetとは？](https://qiita.com/bayastea/items/cd9d9c106372f589fe7a#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82set%E3%81%A8%E3%81%AF)
* [（本題） EnumSet について](https://qiita.com/bayastea/items/cd9d9c106372f589fe7a#%E6%9C%AC%E9%A1%8C-enumset-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
* [余談：Kotlinだとどうなる？](https://qiita.com/bayastea/items/cd9d9c106372f589fe7a#%E4%BD%99%E8%AB%87kotlin%E3%81%A0%E3%81%A8%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8B)

## そもそも Enum とは？
列挙型とも呼ばれる。
下記のような形で、要素や区分を一覧でまとめるときに使われる。

```Feetype.java
enum Feetype {
    adult, 
    child,
    senior
}
```
  呼び出し側
```Test.java
class Test {
    Feetype type;

    boolean isAdult() {
        // enum のクラス名.列挙子名の形で呼び出せる
        // その際の型はFeetype型になる
        return type.equals(Feetype.adult); 
    }
}
```
_____________

enum もクラスの一種なので、通常のクラスと同じように変数やメソッドを持つことができる。

```Feetype.java

enum Feetype {
    adult( new AdultFee() ),
    child( new ChildFee() ),
    senior( new SeniorFee() )

    private Fee fee;

    // enum のコンストラクタは private にする必要がある（外部からのインスタンス生成は不可）
    private Feetype(Fee fee){
     this.fee = fee;
    }

    // 円を返すメソッドを実装
    Yen yen() {
        return fee.yen();
    }
}
```

元から用意されているメソッドには下記のようなものがある。
### `valueOf`
文字列から列挙子名を取得する。
APIから渡された文字列をアプリ内で使う enum に変換する時に使われそう。

例：
`Feetype.valueOf("adult")`
→Feetype 型の`adult`が返却される。

### `valueOf`
全ての列挙子を返却する。

例：
``Feetype.values()``
→Feetype[] 型で全ての列挙子が出力される

## そもそもSetとは？
（ざっくり）
List型に似ている型。
Setの場合は順番が保証されず、ユニーク制約がついている点がListとは異なるらしい。

## （本題） EnumSet について
Enum型でのみ使えるSetのこと。
`EnumSet.of()`で Enum のSetを作成することができる。
Enum のグループを作りたい時に使うと便利そう。
```Test.java
Set overTwenty = EnumSet.of( Feetype.adult, Feetype.senior );

if(overTwenty){
    // 大人に対して行いたい処理
}
```

## 余談：Kotlinだとどうなる？
Enum, Set, EnumSet ともにKotlinでも同様のメソッドが用意されているので、基本的には同じノリで使える様子。
ただし Set の場合は `MutableSet` と `Set` が用意されているので状況によって使い分けると良さそう。
【Pybulletサンプル解説】任意の物体間の衝突の設定【collisionFilter.py】

Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです（一覧は[こちら](https://qiita.com/akinami/items/7b433b60aeb5115ba4d7)）。

<br>

今回は、collisionFilter.pyを解説します。（コードのリンクは[こちら](https://github.com/bulletphysics/bullet3/blob/master/examples/pybullet/examples/collisionFilter.py)）

本コードを実行すると、指定した任意の物体間の衝突の設定ができます。


![collisionFilter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/fbd847b5-9713-8918-bca4-8218321686fe.gif)

# 使用している機能

本コードは、以下の機能を使用すると「指定した物体の衝突フィルターの設定」「任意の物体間の衝突の有効化/無効化」を設定できます。

## 指定した物体の衝突フィルターの設定

`setCollisionFilterGroupMask`関数を使用することで、任意のグループに属した物体間の衝突を有効化/無効化できます。

```python
pybullet.setCollisionFilterGroupMask(objectID, linkId, collisionFilterGroup, collisionMask)
```
- `objectId`: フィルターを設定するオブジェクトのID
- `linkId`: フィルターを設定するオブジェクトのリンクのID
    - `-1`を指定した場合、ベースのリンクが対象となる
- `collisionFilterGroup`: 指定したオブジェクト、リンクをどの衝突フィルターグループに設定するか
- `collisionFilterMask`: 指定したオブジェクト、リンクをどのグループに属した障害物と衝突させるか

<br>

例えば、以下のような場合、オブジェクトAとオブジェクトBはたがいに衝突するようになります。

```python
# オブジェクトAの設定
p.setCollisionFilterGroupMask(objectAId, -1, 1, 2)  # グループ1に属し、グループ2と衝突

# オブジェクトBの設定
p.setCollisionFilterGroupMask(objectBId, -1, 2, 1)  # グループ2に属し、グループ1と衝突
```

## 任意の物体間の衝突の有効化/無効化

`setCollisionFilterPair`関数を使用することで、任意の物体間の衝突の有効化/無効化を設定できます
```python
pybullet.setCollisionFilterPair(objectId1, objectId2, linkId1, linkId2, enableCollision)
```
- `objectId1`: 衝突を有効化/無効化したいオブジェクトのID（1つ目のオブジェクト）
- `objectId2`: 衝突を有効化/無効化したいオブジェクトのID（2つ目のオブジェクト）
- `linkId1`: 衝突を有効化/無効化したいオブジェクトのリンクのID（1つ目のオブジェクト）
    - `-1`を指定した場合、ベースのリンクが対象となる
- `linkId2`: 衝突を有効化/無効化したいオブジェクトのリンクのID（2つ目のオブジェクト）
    - `-1`を指定した場合、ベースのリンクが対象となる
- `enableCollision`: 「オブジェクト1のリンク1」と「オブジェクト2のリンク2」間の衝突を有効化/無効化する

# コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります（もともとあった不要と思われるコメント等については削除しています）

```python
import pybullet as p 
import time
import pybullet_data 

# GUI付きの物理サーバーに接続
p.connect(p.GUI)  

# URDFファイルの検索パスを設定
p.setAdditionalSearchPath(pybullet_data.getDataPath())  

# planeのURDFを読み込む
planeId = p.loadURDF("plane.urdf", useMaximalCoordinates=False)  

# cubeのURDFを読み込み、初期位置を設定
cubeId = p.loadURDF("cube_collisionfilter.urdf", [0, 0, 3], useMaximalCoordinates=False)  

# 衝突フィルターを設定（直後にsetCollisionFilterPairでplaneとcubeの間の衝突を有効にしているため、このコード内ではあまり意味がない処理）
collisionFilterGroup = 0  # 衝突フィルターグループを定義
collisionFilterMask = 0  # 衝突フィルターマスクを定義
p.setCollisionFilterGroupMask(cubeId, -1, collisionFilterGroup, collisionFilterMask)  # cubeの衝突フィルターグループとマスクを設定

# planeとcubeの間の衝突を有効にする
enableCollision = 1  # 衝突を有効にする
p.setCollisionFilterPair(planeId, cubeId, -1, -1, enableCollision)  # planeとcubeの間の衝突フィルターペアを設定

# リアルタイムシミュレーションを有効にする
p.setRealTimeSimulation(1)  

# シミュレーション内の重力を設定
p.setGravity(0, 0, -10)  

# 接続されている間シミュレーションを実行
while (p.isConnected()):  

    # 指定した時間だけ待機
    time.sleep(1. / 240.)  
```
Python_collectionsライブラリで使用頻度が高い標準クラスとメソッド10選

## Python_collectionsライブラリで使用頻度が高い標準クラスとメソッド10選

- **用途**: 高度なデータ構造を簡単に利用可能にするツール。
- 例: `collections.Counter`, `collections.defaultdict`, `collections.deque`。

```python
import collections
```

## 使用率が高いクラスとメソッド10選

1. **`collections.Counter`**: イテラブル内の要素をカウントする辞書のサブクラス。
    ```python
    from collections import Counter
    data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
    counter = Counter(data)
    print(counter)
    ```

2. **`collections.defaultdict`**: キーが存在しない場合にデフォルト値を自動的に生成する辞書。
    ```python
    from collections import defaultdict
    default_dict = defaultdict(int)
    default_dict['apple'] += 1
    print(default_dict)
    ```

3. **`collections.OrderedDict`**: 挿入順を保持する辞書。
    ```python
    from collections import OrderedDict
    ordered_dict = OrderedDict()
    ordered_dict['a'] = 1
    ordered_dict['b'] = 2
    print(ordered_dict)
    ```

4. **`collections.deque`**: 高速な追加と削除が可能な両端キュー。
    ```python
    from collections import deque
    d = deque([1, 2, 3])
    d.append(4)
    d.appendleft(0)
    print(d)
    ```

5. **`collections.namedtuple`**: フィールドに名前を付けることができるタプル。
    ```python
    from collections import namedtuple
    Point = namedtuple('Point', ['x', 'y'])
    p = Point(1, 2)
    print(p.x, p.y)
    ```

6. **`deque.append(x)`**: データを右端に追加。
    ```python
    d = deque()
    d.append(1)
    print(d)
    ```

7. **`deque.popleft()`**: 左端の要素を削除して返す。
    ```python
    d = deque([1, 2, 3])
    print(d.popleft())
    print(d)
    ```

8. **`Counter.most_common(n)`**: 最も頻度が高い要素をn個返します。
    ```python
    data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
    counter = Counter(data)
    print(counter.most_common(2))
    ```

9. **`defaultdict.default_factory`**: デフォルト値を生成するファクトリ関数。
    ```python
    def default():
        return "default value"
    d = defaultdict(default)
    print(d['missing_key'])
    ```

10. **`OrderedDict.move_to_end(key, last=True)`**: 指定したキーを末尾または先頭に移動します。
    ```python
    d = OrderedDict(a=1, b=2, c=3)
    d.move_to_end('b')
    print(d)
    d.move_to_end('b', last=False)
    print(d)
ChatGPT障害に対して1年目エンジニアが場当たり的に考えるとこうなる！

# 伝えたいこと
ChatGPT以外にもLLMを使える手段を持っておくと、障害に強いよ。ということを学びましたので共有します。

# ソース
まだまだ勉強中ですが、作成したソースは下記に公開しています！

https://github.com/Grow-some/Azure-AI

# 背景・前提条件

最近chatGPTの障害が平日に起きることがあり、業務に少なからず影響が出ました。
要約ができない。WEB検索しづらい。翻訳してくれない。画像を貼り付けて質問できない。などなど。
ちょうどAzureにもOpenAIをデプロイして使えることを思い出して作りました。

:::note warn
いきなり使えなくなって困った状況を想定しています。見通しが立つときはよく設計してから構築しましょう。
:::

# 段取り
1. `git clone`を使ってこのソースを取得する。
2. AzureにログインしてLLMをデプロイする。
   `az login`
   ```
    az cognitiveservices account deployment create `
    -g AI_agent_service `
    -n home-service `
    --deployment-name CLI_model `
    --model-name gpt-4o `
    --model-format OpenAI `
    --model-version "2024-08-06" `
    --sku-capacity 10 `
    --sku-name "GlobalStandard" `
    --debug
   ```

   
3. Azureでapikeyなどの機密データをkeyvaultに登録する。詳細はソースを確認すること。
    ```
    az keyvault secret set `
    --vault-name "chatbotkey2" `
    --name "openai-api-key-chatbot" `
    --value "" `
    --debug
    ```
4. `apt install apache2`を使ってWEBサービスを立ち上げる。
5. 設定をstreamlitに合わせて書き換える。
6. streamlitをサービス化する。
7. streamlit →apache2の順で起動する。

画面はこんな感じ。結構見やすいです。突貫で作りましたが、ライブラリもきれいに使いたいです。質問は業務に関係ないトピックです。

![3_1_pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891945/488a8a35-f3e1-7fc5-1654-edc2581b8e9b.png)



# 余談
今思うと、[perplexity](https://www.perplexity.ai/)の無料アカウントとか、ローカルにモデル持ってきて使う。という案もありました。汗
障害で仕事できないときも工夫して持続的に業務ができると良いですね。

かかったお金はこんな感じです。このお金より構築に2時間構築リードタイムがかかり、20分コーディングが素早くできたという点を評価すると・・・これを次の機会やほかの方が活かせるように共有しないと赤字ですね

![costanalysis_charts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891945/b5ab053c-e1b7-6de1-d6d5-72a27e2d5caf.png)

# 参考文献
Azureのシークレットキー管理はよくわからなかったので下記を参考にしています。特にシークレットとキー、証明書の違いはサービス提供するなら知っておいて損はないなと思います。

https://learn.microsoft.com/ja-jp/azure/key-vault/
【エコな未来を作る！】地球に優しいMLって？AWSが進める次世代テクノロジー

# はじめに
皆さん、「AIの力ってすげーー！」って感じたこと、ありませんか？最近では機械学習やAIが日常のあらゆる場面に登場して、私たちの生活や仕事をどんどん便利にしてくれていますよね。便利さを享受している私たちですが、実はその裏で「膨大な電力」が消費されているんです！😱

これ、地球にとってはちょっとした問題なんですよ。だって、AIが進化するたびに電気を大量に使って、結果的に地球温暖化が進んでしまうんですから。技術が進化することで便利さも増しますが、消費エネルギーが増えると温暖化が進んでしまう。これって、なんだかジレンマですよね…。でも、そんな問題を解決すべく、AWSは環境負荷を減らしつつ、技術を支える方法を模索しています！どんな取り組みをしているのか、一緒に見ていきましょう！

## なせエネルギー消費が問題なのか
まずは現状の問題についてざっくり説明します。AIが活躍するためには、膨大な計算力が必要です。そのためにコンピュータを長時間動かし続けるわけですが、その間、ずっと電力を消費し続けるんです。で、計算が終わるころには、なんと大量のエネルギーを使ってしまっているわけです。これが問題なんです。

### エネルギー消費の増加と環境への影響
みなさん、パソコンが熱くなったことってありますか？あれ、電力をたくさん使っている証拠なんです。でもこの**電力大量消費アチアチPC**が何万台、何十万台と集まっているのが「データセンター」なんです…！データセンターでは、膨大な計算をするためにコンピュータが常に稼働していて、その電力消費、PCから発する熱がすんごいことになっています。

その電力を供給するために、化石燃料を使うことが多く、結果的に温室効果ガスが増加し、地球温暖化を加速させるんです。さらに、これらのサーバーは冷却もしなきゃいけません。サーバーが熱を持つから、冷却システムがフル稼働しているんですね。まるでクーラーが24時間動いているようなものです！これが、AIや機械学習が進化するたびにますます深刻化していく問題なんです。

だからこそ、環境への負荷を減らしながら、AIの進化を支える方法を考えなければならないんです！

## AWSの取り組み
さて、ここからはAWSがどんな風にこの問題を解決しているのか見ていきましょう！AWSは、エネルギー効率を向上させるために、再生可能エネルギーの活用や効率的なプロセッサの導入など、さまざまな工夫を行っています。

###  再生可能エネルギーの活用
まず、AWSはすでに消費した電力の**100%を再生可能エネルギーで賄うという目標**を**達成**しています。これ、すごくないですか？さらにAWSは、**2040年までにネットゼロカーボンを達成する**というAmazon全体の目標に向けて取り組んでいます。

これ、言い換えれば「もう石油や石炭に頼らない！」という強い意志の表れです。再生可能エネルギーを活用することで、環境への負荷を減らすだけでなく、AIの計算に必要な電力もクリーンエネルギーで賄えるようになります。

>ネットゼロカーボン（Net Zero Carbon）とは、温室効果ガス（主に二酸化炭素）の排出量を、実質的にゼロにすることを目指す取り組みのことです。具体的には、企業や団体が自ら排出する温室効果ガスを削減し、残った排出分については、再生可能エネルギーの使用や炭素の吸収活動（例：植樹、カーボンクレジットの購入など）によって相殺することを意味します。

https://sustainability.aboutamazon.com/products-services/aws-cloud?energyType=true

### AWSの専用プロセッサによる効率化
次にAWSさん、計算をもっと効率的にするため、専用のプロセッサを作っちゃいましたって話です。この専用プロセッサを使うことで、電力を無駄にせず、効率よく計算できるんです。

#### 1.Gravitonプロセッサ
「Graviton」って名前、まるでSF映画に出てくる悪役みたいですが、実はAWSが開発したARMベースのプロセッサで、従来のものより効率的に計算ができるんです。これ、データセンターの電力消費を大きく減らすことができるんですよ！

https://aws.amazon.com/jp/ec2/graviton/

#### 2.Inferentiaプロセッサ
もう一つ、「Inferentia」というAI推論を効率的に行う専用プロセッサも開発しました。これを使うことで、AIの計算エネルギーを節約しつつ、推論が高速に行えるんです。

https://aws.amazon.com/jp/ai/machine-learning/inferentia/

### AWS Carbon Footprint ToolによるCO₂排出量の可視化
でも、「自分の会社がどれだけCO₂を出しているか、分からないよ！」って思う方、安心してください。AWSにはCarbon Footprint Toolという便利なツールがあって、自分の使用しているサービスがどれくらいCO₂を排出しているか、簡単に確認できるんです。これで、「あ、今度はもっと環境に配慮しよう！」って気づくことができるんですね。
Carbon Footprint Toolを使って、リアルタイムで環境への影響を追跡できるので、企業の環境配慮が一歩進みますよ！

https://aws.amazon.com/jp/aws-cost-management/aws-customer-carbon-footprint-tool/

### データセンターの効率化と冷却技術
最後に、AWSはデータセンターの効率化にも力を入れています。例えば、外気冷却システムや液冷技術を使って、無駄な電力消費を抑えているんです！これにより、冷蔵庫のように無駄なエネルギーを使わず、効率よく冷却しています。

さらに、データセンターの立地選びにも配慮しており、気候が適した地域に建てることで、冷却にかかる電力を大幅に削減しています。

https://aws.amazon.com/jp/compliance/data-center/controls/

# 結論
AIや機械学習の進展によって、エネルギー消費が急増し、環境への影響が懸念されていました。しかし、AWSが積極的に取り組んでいる再生可能エネルギーの使用や効率的な計算技術、冷却技術などが、その課題を解決に向かわせています。これらの取り組みは、技術の進歩と地球の未来を両立させる道しるべとなるでしょう！

AIがますます進化しても、それに伴う環境負荷が減少し、私たちの生活がより持続可能なものへと変化していくことを信じています。これからもAWSの取り組みを追い、私たち一人一人が環境保護に貢献する方法を考えていきましょう。
Python_subprocessライブラリで使用頻度が高い標準メソッド10選

## Python_subprocessライブラリで使用頻度が高い標準メソッド10選

- **用途**: サブプロセスの生成、外部コマンドの実行。
- 例: `subprocess.run`, `subprocess.Popen`。

```python
import subprocess
```

## 使用率が高いメソッド10選
1. **`subprocess.run(args, *, capture_output=False, text=False, check=False, ...)`**: 外部コマンドを実行し、プロセスが終了するのを待ちます。
    ```python
    result = subprocess.run(["echo", "Hello, World!"], capture_output=True, text=True)
    print(result.stdout)
    ```

2. **`subprocess.Popen(args, *, stdin=None, stdout=None, stderr=None, ...)`**: 外部コマンドを非同期で実行します。
    ```python
    process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)
    output, error = process.communicate()
    print(output.decode())
    ```

3. **`subprocess.check_output(args, *, input=None, text=False, ... )`**: コマンドを実行し、その出力を取得します。
    ```python
    output = subprocess.check_output(["echo", "Hello, World!"], text=True)
    print(output)
    ```

4. **`subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, ... )`**: コマンドを実行し、終了コードを確認します。
    ```python
    subprocess.check_call(["echo", "Checking Call"])
    ```

5. **`subprocess.DEVNULL`**: 出力を無視するために使用します。
    ```python
    subprocess.run(["ls", "/nonexistent"], stderr=subprocess.DEVNULL)
    ```

6. **`subprocess.PIPE`**: 標準入力、標準出力、または標準エラーにパイプを指定します。
    ```python
    process = subprocess.Popen(["echo", "Pipe Example"], stdout=subprocess.PIPE)
    output = process.communicate()[0]
    print(output.decode())
    ```

7. **`subprocess.STDOUT`**: 標準エラーを標準出力にリダイレクトします。
    ```python
    subprocess.run(["ls", "/nonexistent"], stderr=subprocess.STDOUT)
    ```

8. **`process.communicate(input=None)`**: サブプロセスと対話し、標準入出力を取得します。
    ```python
    process = subprocess.Popen(["cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    output, _ = process.communicate(input=b"Hello\n")
    print(output.decode())
    ```

9. **`process.wait()`**: サブプロセスの終了を待ちます。
    ```python
    process = subprocess.Popen(["sleep", "2"])
    process.wait()
    print("Process completed.")
    ```

10. **`process.terminate()`**: サブプロセスを終了します。
    ```python
    process = subprocess.Popen(["sleep", "10"])
    process.terminate()
Python_randomライブラリで使用頻度が高い標準メソッド10選

## Python_randomライブラリで使用頻度が高い標準メソッド10選

- **用途**: 擬似乱数の生成、ランダムな選択や並べ替え。
- 例: `random.random`, `random.randint`, `random.choice`。

```python
import random
```

## 使用率が高いメソッド10選
1. **`random.random()`**: 0.0以上1.0未満の乱数を返します。
    ```python
    print(random.random())
    ```

2. **`random.randint(a, b)`**: 指定した範囲 `[a, b]` 内の整数をランダムに返します。
    ```python
    print(random.randint(1, 10))
    ```

3. **`random.uniform(a, b)`**: 指定した範囲 `[a, b]` 内の浮動小数点数をランダムに返します。
    ```python
    print(random.uniform(1.0, 10.0))
    ```

4. **`random.choice(seq)`**: シーケンスからランダムに要素を1つ選択します。
    ```python
    print(random.choice(["apple", "banana", "cherry"]))
    ```

5. **`random.choices(population, weights=None, k=1)`**: 指定した重みを持つ要素から重複を許可してk個選択します。
    ```python
    print(random.choices(["red", "blue", "green"], weights=[10, 1, 1], k=2))
    ```

6. **`random.sample(population, k)`**: 指定した要素から重複せずにk個ランダムに選択します。
    ```python
    print(random.sample(range(1, 50), 6))
    ```

7. **`random.shuffle(x)`**: リストの要素をランダムに並び替えます（インプレース操作）。
    ```python
    numbers = [1, 2, 3, 4, 5]
    random.shuffle(numbers)
    print(numbers)
    ```

8. **`random.seed(a=None)`**: 乱数生成のシードを設定します（再現性のある結果を得るため）。
    ```python
    random.seed(42)
    print(random.random())
    ```

9. **`random.getrandbits(k)`**: kビットのランダムな整数を返します。
    ```python
    print(random.getrandbits(8))
    ```

10. **`random.gauss(mu, sigma)`**: 指定した平均(mu)と標準偏差(sigma)の正規分布に従う乱数を返します。
    ```python
    print(random.gauss(0, 1))
    
# +å 小数点以下の桁数を指定する方法

Pythonでは、数値の小数点以下の桁数を指定する方法がいくつかあります。以下に主要な方法をまとめます。

---

## 1. `round()` 関数を使う
`round()` 関数を使用して指定した桁数に丸めることができます。

```python
value = 3.14159265

# 小数点以下2桁に丸める
result = round(value, 2)
print(result)  # 出力: 3.14
```

**注意:** `round()` は四捨五入の挙動をします。

---

## 2. フォーマット文字列 (f-string) を使う
表示用に桁数を揃えたい場合に便利です。

```python
value = 3.14159265

# 小数点以下2桁まで表示
result = f"{value:.2f}"
print(result)  # 出力: 3.14
```

**注意:** この方法は文字列として扱われます。計算には使用できません。

---

## 3. `format()` メソッドを使う
フォーマット文字列と同様に、小数点以下の桁数を指定することができます。

```python
value = 3.14159265

# 小数点以下2桁まで表示
result = "{:.2f}".format(value)
print(result)  # 出力: 3.14
```

---

## 4. `Decimal` モジュールを使う
高精度の計算や桁数の厳密な制御が必要な場合は、`decimal.Decimal` を使用します。

```python
from decimal import Decimal, ROUND_HALF_UP

value = Decimal("3.14159265")

# 小数点以下2桁に丸める
result = value.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(result)  # 出力: 3.14
```

**ポイント:** `Decimal` は金融計算や誤差にシビアな用途に適しています。

---

## 5. 数学的な方法 (10の累乗を使う)
数学的に小数点以下の桁数を直接制御する方法です。

```python
value = 3.14159265

# 小数点以下2桁まで計算
factor = 10 ** 2
result = int(value * factor) / factor
print(result)  # 出力: 3.14
```

---

## **どの方法を選ぶべきか？**

- **計算目的:** `round()` や `Decimal`
- **表示目的:** f-string (`f"{value:.2f}"`) や `format()`
- **高精度計算:** `Decimal`

用途に合わせて最適な方法を選んでください！
Python_mathライブラリで使用頻度が高い標準メソッド10選

## Python_mathライブラリで使用頻度が高い標準メソッド10選

- **用途**: 数値計算、数学的操作。
- 例: `math.sqrt`, `math.pow`, `math.sin`。

```python
import math
```

## 使用率が高いメソッド10選
1. **`math.sqrt(x)`**: 数値の平方根を返します。
    ```python
    print(math.sqrt(16))
    ```

2. **`math.pow(x, y)`**: xのy乗を計算します。
    ```python
    print(math.pow(2, 3))
    ```

3. **`math.factorial(x)`**: 数値xの階乗を計算します。
    ```python
    print(math.factorial(5))
    ```

4. **`math.gcd(x, y)`**: 2つの数値の最大公約数を返します。
    ```python
    print(math.gcd(48, 18))
    ```

5. **`math.fabs(x)`**: 数値の絶対値を浮動小数点で返します。
    ```python
    print(math.fabs(-7.5))
    ```

6. **`math.ceil(x)`**: 数値xを超えない最小の整数を返します（切り上げ）。
    ```python
    print(math.ceil(2.3))
    ```

7. **`math.floor(x)`**: 数値x未満の最大の整数を返します（切り捨て）。
    ```python
    print(math.floor(2.7))
    ```

8. **`math.sin(x)`**: 角度x（ラジアン）の正弦値を返します。
    ```python
    print(math.sin(math.pi / 2))
    ```

9. **`math.log(x, base=e)`**: 指定された底(base)におけるxの対数を返します。
    ```python
    print(math.log(100, 10))
    ```

10. **`math.isclose(a, b, rel_tol=1e-9, abs_tol=0.0)`**: 2つの数値が指定された許容範囲内で等しいかを判定します。
    ```python
    print(math.isclose(1.000001, 1.0, rel_tol=1e-6))
Python_datetimeライブラリで使用頻度が高い標準メソッド10選

## Python_datetimeライブラリで使用頻度が高い標準メソッド10選

- **用途**: 日付や時間の操作、計算、フォーマット。
- 例: `datetime.now`, `datetime.timedelta`, `datetime.strptime`。

```python
from datetime import datetime, timedelta, timezone
```

## 使用率が高いメソッド10選
1. **`datetime.now()`**: 現在の日付と時刻を取得します。
    ```python
    now = datetime.now()
    print(now)
    ```

2. **`datetime.today()`**: 現在の日付と時刻を取得します（`now()`とほぼ同じ）。
    ```python
    today = datetime.today()
    print(today)
    ```

3. **`datetime.strptime(date_string, format)`**: 文字列を指定したフォーマットで`datetime`オブジェクトに変換します。
    ```python
    date = datetime.strptime("2023-12-28", "%Y-%m-%d")
    print(date)
    ```

4. **`datetime.strftime(format)`**: `datetime`オブジェクトを指定したフォーマットの文字列に変換します。
    ```python
    now = datetime.now()
    formatted_date = now.strftime("%Y/%m/%d %H:%M:%S")
    print(formatted_date)
    ```

5. **`datetime.date()`**: `datetime`オブジェクトから日付部分を取得します。
    ```python
    now = datetime.now()
    print(now.date())
    ```

6. **`datetime.time()`**: `datetime`オブジェクトから時刻部分を取得します。
    ```python
    now = datetime.now()
    print(now.time())
    ```

7. **`timedelta(days=0, seconds=0, ...)`**: 時間差を表すオブジェクトを作成します。
    ```python
    delta = timedelta(days=7)
    print(datetime.now() + delta)
    ```

8. **`datetime.timestamp()`**: `datetime`オブジェクトをタイムスタンプ（エポック秒）に変換します。
    ```python
    now = datetime.now()
    print(now.timestamp())
    ```

9. **`datetime.utcfromtimestamp(timestamp)`**: タイムスタンプからUTC日時を生成します。
    ```python
    utc_time = datetime.utcfromtimestamp(1672531200)
    print(utc_time)
    ```

10. **`datetime.replace(**kwargs)`**: 指定した値で`datetime`オブジェクトを置き換えます。
    ```python
    now = datetime.now()
    new_time = now.replace(hour=20, minute=0)
    print(new_time)
    ```

    ↓datetimeのフォーマット各種はこちらから↓
     
https://qiita.com/mitsuha_003/items/d5a579b41fefd77b5db7

# 🔳用語説明
# エポック秒とは

エポック秒（Epoch Time）は、コンピュータで日時を扱う際によく使われる方法の一つで、**「1970年1月1日00時00分00秒（UTC）」** を基準とし、その時刻からの経過秒数を整数値で表したものです。この基準点は「**UNIXエポック**」と呼ばれています。

---

## エポック秒の特徴
- **基準時刻:** 1970年1月1日00:00:00 UTC（協定世界時）。
- **整数表現:** 小数部を持たず、時刻を「経過秒数」としてシンプルに扱える。
- **タイムゾーン:** エポック秒はUTCを基準としており、タイムゾーンの違いを補正しないとローカル時刻との差異が発生します。

---

## エポック秒の例
以下に具体的な例を挙げます。

| **エポック秒**     | **対応する日時 (UTC)**         |
|------------------|-----------------------------|
| `0`              | 1970-01-01 00:00:00        |
| `86400`          | 1970-01-02 00:00:00        |
| `1672531200`     | 2023-01-01 00:00:00        |

---

## エポック秒をPythonで扱う方法

エポック秒を日時に変換するには、Pythonの`datetime`モジュールを使用します。

### 例: エポック秒を日時に変換（UTC）
```python
from datetime import datetime, timezone

# エポック秒
timestamp = 1672531200

# UTCで日時を取得
utc_time = datetime.fromtimestamp(timestamp, tz=timezone.utc)
print(utc_time)
```

**出力:**
```
2023-01-01 00:00:00+00:00
```

### 例: エポック秒をローカル時刻に変換
```python
from datetime import datetime

# エポック秒
timestamp = 1672531200

# ローカルタイムで日時を取得
local_time = datetime.fromtimestamp(timestamp)
print(local_time)
```

**出力例（日本時間の場合）：**
```
2023-01-01 09:00:00
``` 

---

## 注意点
1. エポック秒はタイムゾーン情報を含まないため、ローカル時間を正確に計算するにはタイムゾーンの考慮が必要です。
2. UNIXエポック（1970年以前）や非常に未来の時刻では、互換性の問題が発生する場合があります。

これを意識すると、エポック秒を安全かつ効率的に活用できます！
LINE BOT用のAPIGatewayの設定について（備忘録）

個人開発用のメモになりますが、引っかかっている人もいると思うため、Qiitaに公開します。
2024年12月時点でのlambdaを使ってlineのMessangingAPIを開発する際のAPIGatewayの設定方法となります。lineもawsもUIが変わっているためいいね数の多い記事が必ずしも分かりやすいわけではない点に注意する。

# 基本方針
10記事以上見ましたが、こちらの記事が一番分かりやすかったため参考にしています。

https://qiita.com/zono345/items/9cae36373049071de0ea

## ポイント
- lambdaのトリガーの追加ではなくAPIGatewayを0から作る
- httpではなくREST APIを選択する
- CORSの設定は有効にしなくても動くが、設定する際はリソースの詳細で設定可能


# 成功事例
line側は502エラーでも動く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/7e1b9cdd-6b4b-edee-cd38-7effd8578745.png)

CORSの設定方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/fdb26095-046e-a6d4-bc8b-e3b5f532c8a8.png)

リソースの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/fbb4ddb1-decc-cb24-b534-85bfab1ee3e8.png)
【3ヶ月で合格】応用情報技術者試験に合格するための道しるべ

## 初めに
令和6年秋季に受けた応用情報技術者試験を一発合格したので
勉強法等をここに残しておきます。

## 著者の前提知識
・高卒（機械工学科）
・Javaエンジニア2年目
・2024年夏に基本情報取得

## 使用した参考書、サイト
最新版を購入する必要はなし。1-2年前のものであればメルカリ等でかなり安く買えます。

### [応用情報技術者過去問道場](https://www.ap-siken.com/apkakomon.php)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/644de862-d4fd-104f-721d-b2d0fa35a834.png)

午前対策
アカウントを作成すると間違えた問題だけできたり、学習の記録ができるのでアカウント登録は必須。

### [キタミ式イラストIT塾 応用情報技術者 令和07年](https://amzn.asia/d/71Ap3vt)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/8003851c-e4a1-cd84-04a1-37c186a4c93a.png)

教科書的な存在、令和5年の物を使用。
一から読むというよりは過去問道場を解いていく中で解説では理解できない部分に対して理解を深めるために使用。

### [令和06年【秋期】応用情報技術者 パーフェクトラーニング過去問題集 ](https://amzn.asia/d/61Kw3n1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/7ca5e618-b190-fabc-9be3-02806652e1ab.png)

午前、午後問対策。

### [令和04-05年 応用情報技術者 試験によくでる問題集【午後】 情報処理技術者試験](https://amzn.asia/d/hkk7KxX)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/2e881a45-fc10-1b20-ede8-e40d1df30660.png)

午後問対策。全て解く。

### [2024　応用情報技術者　午後問題の重点対策](https://amzn.asia/d/4BqxAi1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/e72a5693-06e6-87f9-9fc4-1a2f0e56bd03.png)

午後問対策。全て解く。

## 勉強方法
### 勉強時間
#### ・試験3か月前～1か月前まで
　平日1時間
　休日2時間

####  ・試験1か月前～前日
　平日2時間
　休日4時間

####  時間で区切るというよりは解く問題数を時間換算して行う。
例：一時間の場合
午前問題30問（試験時間150分/80問＝約1問2分換算）
午後問題2問（試験時間150分/5問＝約1問30分換算）

毎日やることは難しいので週単位でノルマを目指していくイメージ。
平日が忙しい場合には週末に平日こなせなかった分を実施するなどしてトータルで上記の勉強時間を達成できるようにする。

### 午前対策
### ひたすら過去問道場を行う
目標は8割程度を問題なくとれるレベル。それ以外は参考書の過去問を1回通しで解いたのみ。
通勤時間やジムの休憩時間、寝る前のベットの上などでひたすら解いた。
過去問道場は勉強というよりはスマホのゲームのような感覚でできるため個人的には絶対に取り入れたほうがいい。

### 午後対策
ここが応用情報の一番の難所
試験1か月前からの9割くらいの時間は過去問対策にあてました。
午後は分野により難易度が毎回異なり、運要素が強いため
特定の5分野よりは7分野程度を抑えてあとは当日問題を見て決めるのがいい。

自分は以下の記事を参考にして午後の問題を決めた。

https://qiita.com/app_js/items/28b1b720a8f3ae9a3d2d

https://qiita.com/railgun-0402/items/fdc7ef895ca59bcd8c75

https://qiita.com/mono_glyceride/items/db8996cf056bc1d5b243

### 勉強した分野（★は当日選択）
・情報セキュリティ★
  →必須
・システム監査★
　→ほとんどが問題文からの抜き出しの為（おすすめ）
・情報システム開発★
　→業務の内容が活かせる為。
・データベース★
　→業務に直接かかわる内容の為。
・組み込みシステム
　→開発の知識が活かせる為。
・プログラミング
　→開発の知識が活かせる為。
・プロジェクトマネジメント★
　→業務に直接かかわる内容の為。

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/0c69f6e2-9a4d-2eec-9f6d-f6583c71d4e5.png)

## 試験の感想
午前試験は比較的余裕をもって解けたが午後試験は全く手ごたえがなく自己採点では5割程度だったため完全に落ちたと思っていました。
午後試験は上記の★と組込みシステムを途中まで解きましたが、あまり自信がなく別の選択をとることにしました。結果、時間が足りず一部解けていない問題もありました。
結果としては部分点等でギリギリ合格できたのでほっとしています。


## スペシャルサンクス（参考にした記事）
https://qiita.com/app_js/items/28b1b720a8f3ae9a3d2d

https://qiita.com/railgun-0402/items/fdc7ef895ca59bcd8c75

https://qiita.com/mono_glyceride/items/db8996cf056bc1d5b243
PHP-FPM必須初期設定【max_children】

php-fpm／nginxの導入を調べたらsocketファイルしか出て来ませんが、実は「max_children」などの項目も最初から設定しておくべきです。max_childrenが少なすぎても多すぎても大変なのでぜひご参考になればと思います。

## max_childrenとその他の計算の仕方
プロセスの平均メモリー使用量の計算
```
$ ps -C php-fpm -o rss=
  620
25460
24156
24724
26536
```
最初の行はマスタープロセスなので、それを除外して平均が25MBなの分かります。
「max_children」の計算はこうなります。
```
[max_children] = [PHPが使えるRAM] / [プロセスの平均メモリー使用量]
```
ご利用のサーバーは8GBのRAMがあってもPHPが使えるRAMはそれ以下になりますのでご注意ください。
後は設定ファイルに
```
pm.max_children = [max_children]
pm.start_servers = [25% max_children]
pm.min_spare_servers = [25% max_children]
pm.max_spare_servers = [75% max_children]
```

[計算方法はここを参考にしました。](https://chrismoore.ca/2018/10/finding-the-correct-pm-max-children-settings-for-php-fpm/)
というかまとめて直訳だけしましたので、詳しく知りたい方はぜひ原文を読んでください。

## 一緒に働く仲間を募集しています！
株式会社コネクター・ジャパンでは一緒に働いてくれる仲間を募集しています！

事業拡大に伴い、エンジニアを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/cnctor/about
▼代表メッセージ
https://cnctor.jp/10years-anniversary/
▼応募はこちら
https://www.wantedly.com/companies/cnctor/projects