OmniAICreator/Qiita-1.07M huggingface dataset:
動画生成AIでSF映画を作ってみた

# 動画
普段妄想している「宇宙で孤独に灯台守をしている老人」の映画を、
生成AIで作ってみました。1分くらい。

<iframe width="560" height="315" src="https://www.youtube.com/embed/WhfNzMWX-m0?si=HTVw2ktuD8cfnlFf" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 使用した生成AIと設定
SoraとRunwayという2つの動画生成AIで、
同じプロンプトを使って30秒くらいずつ生成してみました。

## ①Sora 
- プラン：Plus Plan（月20ドル）
- モデル：たぶん共通で1個しかない（テキストのみで動画生成可能）
- 画質：480p
- 長さ：10s
- 所感：すごいリアル。人物すごい。動きが静かな動画の方が物理的に整合性が取れそう。
- フレームレート：デフォルトで30fps
※変え方不明。ここに気を付けないと動画編集ソフトでカクカクする。
- 備考：プロンプトによっては、シーンを切り分けて解釈する「Storyboard」を提案してくれる。（最初から使うこともできる。）50個くらい動画を作ったら1ヶ月の上限になる。
#### Storyboard機能の詳細
あるシーンを細かく分解して、より具体的に作らせることができます。

例えば **「風船を掴む女性」** の動画、という指示を、
1. 女性が公園で風船を見つける
2. 女性が風船に近づく
3. 女性が風船の下の紐を掴む
というふうに分解して、この順番に動作する5秒の動画を作る、という感じ。


## ②Runway
- プラン：Standard Plan（月12ドル）
- モデル：Gen 3 Alpha（テキストのみで動画生成可能）
- 画質：1280 x 768
- フレームレート：デフォルトで24fps
※変え方不明。ここに気を付けないと動画編集ソフトでカクカクする。
- 長さ：5s/10s
- 所感：すごいリアル。人物すごい。同じく動きが静かな動画の方が物理的に整合性が取れそう。
- 備考：プロンプトのトークン上限が1000までなので、生成したプロンプトをそのまま貼り付けると上限になっちゃうこともある。同じく50個くらい動画を作ったら上限になりそう。

# 使用したプロンプト
ChatGPTのo1-miniで、「Runwayで動画作る用のプロンプトを作れ」「灯台守の老人の設定はこれこれ」という感じで作らせました。自分でゼロから書いて作るより、ざっとAIにプロンプトを出させた方が、細かい設定とか考えてくれて良いです。

詳細はこちら。
https://chatgpt.com/share/6770e2ea-4714-8012-a250-3f273d97250a
Streamlitで風船を飛ばそう、雪を降らそう（st.balloons(), st.snow()）

# Streamlitとは
Streamlitは、データサイエンスや機械学習のためのダッシュボードWebアプリケーションを簡単に構築できるPythonのライブラリです。
ただ、Streamlitで単にデータを可視化したりアプリを動かしたりするのに飽きたあなた。風船を飛ばしたり雪を降らせたりしてみませんか。
あなたのダッシュボードやアプリケーションが一段と魅力的なものに変わるでしょう。

絶対に使いたい、`st.balloons()`と`st.snow()`を紹介します。


# サンプルアプリ
サンプルアプリは[こちら](https://balloons-snow.streamlit.app/)

![スクリーンショット 2025-01-12 15.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954993/4788e5f3-b512-6eb5-57de-04e2d40cf513.png)

![スクリーンショット 2025-01-12 15.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954993/cc637604-1786-838a-a281-eb60745e25ff.png)



# st.balloons()とst.snow()の紹介
* `st.balloons()`: 風船を飛ばす関数
* `st.snow()`: 雪を降らす関数

### 実装例

```python
import streamlit as st

st.title(":streamlit:")

col1_1, col1_2 = st.columns(2)

with col1_1:
    st.header("balloons")
    if st.button("風船を飛ばす"):
        st.balloons()

with col1_2:
    st.header("snow")
    if st.button("雪を降らす"):
        st.snow()
```

# おまけ：Streamlitのアイコンを表示させる

バージョン1.40.0からは、Streamlitのアイコンを表示させることができるようになりました。
Markdownで使うことができます。

`:streamlit:` → ![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954993/c3b8d47a-7255-fe66-d2e2-e55832f8acdb.png)
誤り制御

# フレームが途中で消えると確認が取れなくなる
>ハードウェアのトラブルによりフレームが完全に消えてしまう可能性があることから（たとえばバースト雑音）、自体はさらに複雑となる。この場合、受信側は反応する理由がないので全く反応しない。
同様に、確認通知フレームが失われた場合、送信側は先に進むのにどのようにしたら良いのかわからないだろう。フレームを送信した後、送信側が肯定または否定の確認通知を待つようなプロトコルでは、例えばハードウェアの不具合や故障した通信チャネルなどによりフレームが失われると、永久に止まってしまうことが明らかであろう。

# タイマーで期限を超えると問題の可能性を警告する
>この可能性には、データリンク層にタイマーを導入することで対処できる。通常、送信側がフレームを送信するとタイマーが起動する。タイマーは、フレームが宛先に到着してそこで処理され、確認通知が送信側に戻ってくるのに十分な感覚の後で切れるように設定される。通常、フレームは正しく受信されてタイマーが切れる前に確認通知が戻り、その場合にはタイマーはキャンセルされる。
　しかし、元のフレームまたは確認通知のいずれかが失われると、タイマーはきれ、送信側に問題の可能性を警告する。自明的な解決法は、フレームを再度送信することである。しかし、フレームが複数回送信されると、受信側が同じフレームを二回以上受理し、ネットワーク層に二回以上渡してしまう危険性がある。

# 順序番号で再送分を分け、タイマーで察知するのことがデータリンク層の役目の一部
>これを避けるためには、出力フレームに順序番号を割り当てて、受信側が再送を本来のものと区別できるようにする必要がある。

>タイマーと順序番号を管理して、各フレームが宛先のネットワーク層に一回より多くも少なくもなく、ちょうど一度だけ渡されるようにすることが、データ・リンク層(およびより上位の層)の重要な義務の一部である。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
git checkoutしようとしたら「error: pathspec '~' did not match any file(s) known to git」と出て「🤔」となった話

# はじめに

チームで開発をしていると、

現在自分が作業をしているブランチから別のブランチに移動する、

だなんてことがよく起こります。

ブランチの移動の際は

`git checkout 移動先のブランチ`

こういったコマンドでチェックアウトをするかと思われます。

# 困ったこと、その原因...

しかし、

```bash
error: pathspec '~' did not match any file(s) known to git
```

このようなメッセージがコンソールに出て、チェックアウトできないことがありました。

今回、このメッセージが出現したケースは以下の通りです。

* チームメンバーから依頼され、別のブランチにチェックアウトする必要があった
* `git checkout 移動先のブランチ`をしたが、上記のメッセージが出た
* 上記コマンドのtypoはなかった
* `移動先のブランチ`はリモートにはあるが、自分の手元（ローカル）にはなかった

この

「**`移動先のブランチ`はリモートにはあるが、自分の手元（ローカル）にはなかった**」

ここがポイントでした。

手元にないのですから、上記のメッセージが出るのも頷けますね...💦

# 解決策

ということは、

リモートにしかない移動先のブランチがローカルにも存在していれば良さそうですね。

そこで、

```bash
git fetch
```
このコマンドを使い、

リモートの内容をローカルにある「リモート追跡ブランチ」と同期させてあげましょう。

こうすることで、

手元になかった移動先のブランチにチェックアウト出来るようになります。

# 参考

https://git-scm.com/docs/git-fetch

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AE%E4%BD%9C%E6%A5%AD

[リモートブランチにcheckout する方法 ~git fetch をお忘れなく~](https://atsashimipy.hatenablog.com/entry/2022/01/17/061215)
PythonだけでWebデザイン！Streamlitを使ってみた

# はじめに
僕は最近PythonでWebアプリ的な物をいつも作っています。
しかし、そういう時は大体Flaskでサーバーを立て、
HTMLを返すような構造にしています。HTMLを間に挟まないとアプリが作れないのです！

# Streamlitとは？
Streamlitとは、フロントエンドを別で書かなくても
PythonでコーディングするだけでWebアプリが作れるというものです！

## 特徴
- PythonだけでWebアプリが作れる
- 簡単なコードでボタン、テキストボックスなどが配置できる
- MarkdownやHTMLにも対応している
- 最初から見た目が調整されている

# 使ってみよう
さっそく使ってみましょう。
インストールからサンプルコードまで解説します！

### インストール
Streamlitは標準ライブラリではないので、
pipでインストールする必要があります。
```shell
pip install streamlit
```

:::note warn
Python3.14を使ったら、インストールできませんでした。
~~ベータ版なので、使っている人いないと思いますが~~
:::

### サンプルを動かそう
```python
import streamlit as st

st.title("Hello, world!")
st.write("This is a sample streamlit application!")
button = st.button("Say hello")

if button:
    st.info("Hello world!")
```
このファイルを任意の名前で保存し、以下のコマンドを実行してください。
```shell
streamlit run <ファイル名>
```
すると...
![streamlit-sample](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/7bac7fe7-103c-f22d-f6e4-dc40cb7016b0.png)
ブラウザが開き、サンプルページが表示されました！

# 解説
### ```st.title```
タイトルを配置します。

:::note warn
ページのタイトルとは違うので注意です。
:::

### ```st.write```
ページに文字列を書き込みます。
Markdown,HTMLにも対応しています。

:::note warn
HTMLを使うときは、```unsafe_allow_html=True```を指定すること。
:::

### ```st.button```
ページにボタンを配置します。
ボタン押下時の動作は、
```python
if button:
    # 動作
```
と書くことで可能です。

# ほかの機能
Streamlitには他にも機能があります！
## ほかの要素
### ```st.radio```
第一引数にラベル、第二引数に選択項目を指定すると、
![radio](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/ce3f1559-695f-beb5-6254-b02cdd76ada2.png)
ラジオボタンが配置できます。

### ```st.text_input```
![textinput](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/379b9a6c-f284-7eef-0d27-f365e48fc804.png)
文字入力欄が作れます。placeholderも指定できます。

## その他
- ファイルを変更したら自動でリロードされる
- ```config.toml```でテーマが指定できる

# 感じたこと
- HTMLやCSSを習得しなくてもWebアプリが作れるのはうれしいと思った
- ルーティングができないのは不便
- 最初からレイアウトが整っているのがいい

# 終わりに
皆さんもStreamlitでWebアプリを作ってみてはいかがでしょうか？
最後まで読んでいただきありがとうございます。
コメント、いいねもお願いします:cheese::cake:
旧iOS端末にも対応できるオーバーレイ背景スクロールさせない方法

今回は旧iOS(12,13など)にもオーバーレイ（モーダルウィンドウ）が表示されたときに
背面のコンテンツがスクロールされないように制御する方法をお伝えします。

他端末ではうまく処理できていて背面のコンテンツが静止するのに
iOS12ではうまく制御できないといった方に使える手法です。

## まずはAndroid,iOS端末気にしない方向け
とりあえずスクロールさせないようにするには以下制御で解決します。
```CSS:CSS
/* モーダルが開かれたときに設定 */
.body {
  overflow: hidden;
}
```


:::note info
また最近では`overscroll-behavior`が主要なブラウザでサポートされていますので
上記でも設定可能です。
:::

## iOS12でも背面コンテンツを制する
前述のみだとiOSでは独自の制御で以下のような動きが見られる時があります。

・上部、下部のアドレスバーが動いてしまい、ウィンドウが固定されない。
・iOS12だと`overscroll-behavior`がそもそもサポート外で機能しない。
・bodyだけの制御では背面コンテンツがスクロールできてしまう。

上記のような挙動を解決するために以下の設定を行ってください。
```CSS:CSS
.overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%; /* vhより%推奨 */
  background: rgba(0, 0, 0, 0.6);
  display: flex;
  z-index: 10;
  overflow-y: scroll; /* 必須 */
  touch-action: none;　/* 必要であれば */
}

.overlay::before,
.overlay::after {
  content: "";
  width: 1px;
  height: calc(100% + 1px);
  display: flex;
}
```


`height: calc(100% + 1px);`の記述に関しては以下記事を参考にさせて実装致しました。
解説もありますので、どのような実装になっているか分かりやすいです。
[【PC・スマホ両対応】CSSだけでモーダルの背景をスクロールさせない新しい方法（つっかえ棒式モーダル背景固定法）](https://qiita.com/yowatsuyoengineer/items/b43b64e1419fa285b758)


:::note warn
注意
`height: 100%`の部分はiOS15だとアドレスバーが上下してオーバーレイで表示されたものが動いてしまうといった事象がありましたので`vh`より`%`で対応しました。
必須や重要な部分以外においてはお好きなカスタマイズで設定ください。
:::


中央に画像などを表示させたい場合は以下設定
`align-items: center;
justify-content: center;`


### スクロール背面静止できているか不安な方向け

```JavaScript:JavaScript
document.querySelector('#openButton').addEventListener('click', overlayOpen);
document.querySelector('#closeButton').addEventListener('click', overlayClose);

```

フレームワークに合わせて、各種イベントの設定をHTMLにしてください。Vueでしたら`@open="openButton"`、Reactなら`onRequestClose={openButton}`といった記述で設定可能です。



## あとがき
正直かなり詰まった部分だったので、困っている方も多いかなと思い作成しました。
お役に立てていれば幸いです。
[OutSystems]Web Developer Specialization (ODC)のサンプル問題について解説 2/2 (#6-#10)

全部で10問で、この記事は6問目-10問目が対象。
1問目-5問目

https://qiita.com/jyunji_watanabe/items/aed7527ebb8cea79a50d

# 6 Asynchronous Processes
OutSystemsのベストプラクティスとして、長時間実行されるTimerについては、

- 処理対象を一定件数ごとに区切る
- 一定件数の処理が終了したら、処理対象のEntityに終了を示す変更を行う
- 処理対象が残っているなら次の一定件数を処理する
- この時、事前に定めた一定時間以上過ぎていたら、一旦そのTimerは終了させ、自分自身をWake Timerで実行させる

実装をとる。この問題はそのベストプラクティスに照らして合わない部分を訊かれている

Actionのフローを追うと、RegistrationというEntityが処理対象データを持つEntity。
Aggregateで一定件数のデータを取得し、結果をループで処理している。ループの最後でUpdateRegistrationを呼んで、そのレコードは処理済みであるというマークをつけている。

ところが、ループを終えた後でCommitTransactionを呼んでいないために、例外やタイムアウト発生時には、それまでに行われた処理が反映されず、次回のTimer実行時に同じ対象を処理することになる。

という点を指摘している選択肢4が正解。

# 7 Screen and Block Lifecycle
[Screen and block lifecycle events - ODC Documentation](https://success.outsystems.com/documentation/outsystems_developer_cloud/building_apps/user_interface/screen_and_block_lifecycle_events/#lifecycle-event-handlers)で解説されている、Screenが備えているEventについての問題。

この問題について訊かれているOnInitializeについては

> Occurs after checking the permission of the user to access the Screen, but before navigating to the Screen and fetching data. In Blocks, it occurs after the navigation. You can use it to initialize the Screen or Block by setting its default data.

とある。つまり

- 権限チェックが行われた後、実際の画面遷移とデータ取得前に発生
- データの初期化に使う

もの。この前提で選択肢を見ていく。

1. ×：DOM要素へのListner追加には使えない。なぜならOnInitialize時点ではDOM要素の準備は終わっていない。その用途では、OnReadyを使う
1. ×：OnInitializeで時間がかかる処理を行うと、描画を遅延させる可能性はあるとドキュメントに書かれている(it may delay the rendering of the Screen or Block)
1. ○：↑の説明通り
1. ×：データ取得より前に動くので、画面中で取得するデータにはアクセスできない

# 8 Troubleshooting
画面から参照されているService Actionをデバッグするときに、どこで操作を行うか、という問題。

選択肢3, 4では、Entry appを指定する、という操作が含まれる。
[Debugging apps - ODC Documentation](https://success.outsystems.com/documentation/outsystems_developer_cloud/debugging_apps/)によると、

> Stepping into a Service Action from a consumer app isn't supported.

であるからこの操作は、Service Actionには行えない。
よって、素直にService Actionを含むEmployees Appでデバッグを開始する、としている選択肢1が正解。

# 9 Best Practices - Queries
MakerというマスタEntityと、それを参照するCarというEntityがある。
このMakerが持っている名前を含めてCarの一覧をExcelに出力したい。

Actionフローを見ると明らかに非効率な実装をしているので、これを改善する選択肢を選ぶ問題。

フロー中では、MakerをAggregateで取得→ループして各MakerごとにCarを取得→取得したCarをリストに貯める、という実装を取っている。
ループ中でEntityを取得に行くのはベストプラクティス違反。この場合は、MakerとCarをジョインした上で1回のAggregate呼び出しにまとめれば良い。

これを素直に表している選択肢3が正解。

# 10 REST APIs

1. ○：Consume REST APIの定義を作成するときに、対象APIのサンプルリクエスト・レスポンスからInput・Output Parameterへの自動マッピング（Structureが作成される）可能
1. ○：Consume REST API実行時に、リクエスト・レスポンスから事前に定めたOutSystems型へのマッピングは自動で行われる
1. ×：GETメソッドの場合、Input ParameterのSend in=Bodyを設定すると、「Invalid HTTP Method Input parameters with Send In property set to 'Body' are not allowed for GET methods. 」というエラーになる
1. ○：Consume REST API作成時の標準的な作業手順。指定したアドレスとパラメータでテスト実行し、レスポンスを使ってOutSystems上の対応Structureを自動作成する

問題は、「できないこと」を聞いているので選択肢3が正解。
Ubuntu で Python の仮想環境を使う

Ubuntu24.10 で　pip を使うと次のようなメッセージが出ます。

```text
$ pip install pykakasi
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
```

指示に従い、仮想環境を使います。

## 仮想環境を作成

```bash
python3 -m venv myenv
```

## 仮想環境をアクティベイト

```bash
source myenv/bin/activate
```

切り替わったことを確認

```text
$ which python
/home/uchida/myenv/bin/python
```

## pip でインストール

```bash
pip install pandas pykakasi
```

## テスト

```bash
python hiragana_sort.py
```

```py:hiragana_sort.py
import pandas as pd
from pykakasi import kakasi

# ------------------------------------------------------------------
def kanji_to_hiragana(kanji):
	kks = kakasi()
	result = kks.convert(kanji)
	hiragana = ""
	for converted_word in result:
		hiragana += converted_word['hira']
	return hiragana

# ------------------------------------------------------------------
data = {
    'name': ['山田','佐藤','山内','鈴木','伊藤','田中','高橋','野田','相川'],
    'age': [25,30,22,35,28,31,27,21,32]
}

df = pd.DataFrame(data)

df['name_hiragana'] = df['name'].apply(kanji_to_hiragana)

sorted_df = df.sort_values(by='name_hiragana')

print(sorted_df[['name', 'name_hiragana']])

# ------------------------------------------------------------------
```

## 仮想環境を非アクティベイトする方法

```bash
deactivate
```
Bodhi Linuxで日本語が入力できるようにする

　富士通のサーバ PRIMERGY TX120 S3 にBodhi Linuxをインストールしたことは、前回掲載しましたが、 Bodhi Linux で日本語入力ができるようにしたときに、ハマったところがありましたので、記録として残すことにします。

### Bodhi Linux の設定（日本語入力編）
　インストール直後は、日本語が入力できないので、Mozc をインストール。
 このとき、インストールを実行したときのコマンドは下記の通り。
　` # apt install fcitx-mozc `
　無事に日本語が入力できました。

### しかし
　まさかこんなことになるとは、思ってもいませんでした。
　OSをアップデートしたら、突然、日本語入力が再びできなくなってしまったのです。
まさか、Bodhi Linux も PRIMERGY TX120 S3 と相性が悪いOSだったのではないかという、OS探しの苦難の道を歩んだ記憶（前回掲載）が頭をよぎりながら、原因を探るべくコテコテすることに。
　Linuxで日本語を入力できるようにするということが不勉強であった当方は、やがてBodhi Linux内にある iBus なるものたどり着くことに。
　iBus って、なんやねん。この間まで、日本語入力ができとったやん。という気持ちを抱えながらも、iBus がOSにプリインストールされている事実から、深堀をしていきました。
 　結局、iBus という言語入力の仕組み（インプットメソッドフレームワークと呼ぶらしい）と、何も知らずにインストールした fcitx という言語入力の仕組みがバッティングして日本語入力ができなくなっていたのでした。
  
  このため、まずはバッティングしている fcitx ベースの Mozc をアンインストールします。
　` # apt remove fcitx-mozc `
 
 　そして改めて、iBus をベースとした Mozc をインストールします。
 　` # apt install ibus-mozc `

　これで、日本語の入力が再びできるようになりました。
【AWS SAP】OrganizationAccountAccessRoleとは

# AWS OrganizationAccountAccessRoleとは

**OrganizationAccountAccessRole** は、AWS Organizationsで作成されるデフォルトのIAMロールで、管理アカウントからメンバーアカウントにアクセスできるようにするために使用されます。このロールは、AWS Organizationsを使用して新しいアカウントを作成する際に自動的に設定されます。

以下は、OrganizationAccountAccessRoleに関する重要なポイントです。

## 1. ロールの概要
- **用途**  
  管理アカウントのユーザーがメンバーアカウントにアクセスできるようにする
- **作成タイミング**  
  AWS Organizationsを通じて新しいアカウントを作成した場合、自動的に作成される
- **権限**  
  このロールは、管理アカウントからアカウント間での操作を実行するために必要なアクセス権限を付与する

## 2. デフォルトの設定
- **ロール名**  
  `OrganizationAccountAccessRole`
- **信頼ポリシー**  
  管理アカウントの「ルート」アカウントを信頼する設定が含まれている

信頼ポリシーの例:
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<ManagementAccountID>:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

- **アタッチされるポリシー**  
  権限ポリシーは利用シナリオに応じてカスタマイズ可能だが、初期設定では広義なアクセス権限が付与される

## 3. 利用シナリオ
以下のような状況で利用されます:
- **アカウント間の管理作業**  
  管理アカウントの管理者がメンバーアカウントにサインインして設定を確認したり変更したりする
- **サービスコントロールポリシー (SCP)** の適用や確認  
  メンバーアカウントに適用されたSCPの影響範囲を確認するためにログイン
- **リソースのトラブルシューティング**  
  メンバーアカウントでリソースの問題を証明

## 4. OrganizationAccountAccessRoleのアクセス方法
管理アカウントからメンバーアカウントにアクセスする手順:
1. 管理アカウントにログイン
2. AWS Management Consoleで「AWS Organizations」に移動
3. メンバーアカウントを選択し、「アカウントに切り替え」をクリック
4. 指定されたIAMロールで「OrganizationAccountAccessRole」を選択

CLIを使用する場合:
```bash
aws sts assume-role \
    --role-arn "arn:aws:iam::<MemberAccountID>:role/OrganizationAccountAccessRole" \
    --role-session-name "SessionName"
```

## 5. 注意点
- **メンバーアカウントのロール削除**  
  デフォルトロールを削除すると、管理アカウントからアクセスできなくなるため注意が必要
- **ロール名のカスタマイズ**  
  デフォルト名を変更することは可能だが、変更後は手動でアクセス方法を調整する必要がある
- **SCPの制約**  
  SCPによってOrganizationAccountAccessRoleの権限が制限される場合がある

## 6. よくある質問
**Q: OrganizationAccountAccessRoleを削除した場合、再作成する方法はありますか？**  
A: 手動でIAMロールを作成し、信頼ポリシーを管理アカウントに設定すれば再作成可能です。

**Q: 管理アカウントからすべてのメンバーアカウントに同時アクセスできますか？**  
A: できません。STSを使用して1アカウントずつアクセスする必要があります。

## 類似のロール
| ロール名                         | アタッチ先                                    | 詳細                                                                                   |
|----------------------------------|---------------------------------------------|----------------------------------------------------------------------------------------|
| OrganizationAccountAccessRole    | 子アカウント                                 | AWS Organizationsの管理アカウントが引き受けて使用。子アカウントに自動的に作成される。    |
| AWSServiceRoleForOrganizations   | AWSサービス                                 | AWS ConfigやAWS SSOなど特定のサービスが使用。サービスがリソースにアクセスする際に必要。   |
| AWSControlTowerExecution         | AWS Control Tower                           | Control TowerがLanding Zoneを管理する際に使用。新しいアカウント作成やガードレール適用時。|
| CrossAccountRole                 | 任意のアカウント（トラスト設定に応じる）       | 他のAWSアカウントまたはAWSサービスが引き受けて使用。トラストポリシーにアクセス元を設定。   |
| AWSManagedServicesRole           | AWS Managed Services（AMS）                 | AMSが顧客のリソースを管理する際に使用。顧客アカウント内で自動的に作成される。            |


## まとめ
**OrganizationAccountAccessRole** は、AWS Organizationsでアカウント管理を効率化するための重要な仕組みです。メンバーアカウントの管理やトラブルシューティングを行う際に役立つため、適切な理解と管理が求められます。
エクセルで新規シートを開くと、罫線非表示設定になる - テンプレートシートでの部分的解決方法 -

## はじめに
皆さんは、「Excelのシート画面」と聞いた時、どのような画面を想像するでしょうか？ 恐らく、デフォルト設定である、薄い灰色の罫線の引かれた表をイメージするのではないでしょうか。
ところが最近のExcelでは、新規シートを開いたときのみ、デフォルトの罫線表示設定が「非表示」になる場合がある模様です。(※Office365でこの事象が発生することは実機で確認。ネットの大海を探すとExcel2016でもあったみたい。参考文献参照。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725026/085e209f-a999-8088-e97d-d861eba8f78b.png)
(a)新規**ブック**を開いた状態。目盛線にチェックが入っている。(b)このブックで新規**シート**を開くと、デフォルトで目盛線のチェックが外れる。

つまり、この投稿で想定している課題は次の通りです。
- エクセルの新規ブックを開いたとき、最初に立ち上がるシートには罫線が表示されているが、
- 新規シートを開くと、デフォルトの設定で罫線(目盛線)が非表示となる。
- 以降、新規シートを開くたびに罫線が非表示のまま。

## 解決方法
タイトルにも書いたように、今回はテンプレートシートで解決する方法を紹介します。

#### 1. テンプレートシート作成
まずは新規シートとして開きたいシートを、通常のエクセルソフトで作成します。
凝ったファイルにしても構いませんが、とりあえず今回の課題を解決するためには、リボンの"表示"項目の中にある"目盛線"のチェックを入れるのを忘れないようにします。

シート名は"Sheet"または"Sheet1"としましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725026/3ea34ee5-508f-aab7-793a-0e30d4cbf872.png)

#### 2. テンプレートシートを保存
シートを作成したら、ファイル名を"**Sheet.xltx**"として保存します。
ほかの名前じゃダメです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725026/17a15f8c-4567-796e-f379-d4c00b87ee19.png)

作成した"Sheet.xltx"は、下記フォルダに置いてください。
```
C:\Users\%username%\AppData\Roaming\Microsoft\Excel\XLSTART
```
エクセルをcloseして立ち上げ直すと、罫線入りの新規シートが開けるようになっているはずです。

## 備考
今回紹介した方法は、新規シートを開く時間が体感0.5秒程度掛かります。
急いでいるとややじれったいので、いずれ抜本的に直せるといいのですが。。。
(そういう意味で、"**部分的**解決方法"としてエントリーしました。)

抜本的な対策方法、ご存じの方がいればぜひ教えてください！

## 参考文献

https://qiita.com/waokitsune/items/42f99108cb3b84071dc9

過去にExcel2016で発生していた事象
1. https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%81%AE/7cadedf5-2a94-4a07-8d23-a3af7bac536f
1. https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12215930167
[ServiceNow]Configurable Workspaceでヘッダー位置変更

## 概要
Configurable WorkspaceではAgentWorkspaceと比べてヘッダーの位置が変更されています。

 ![スクリーンショット 2024-12-29 15.14.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487914/0ff767b4-de33-a023-aab0-794aa3535879.png)
そのためAgentWorkspaceと同じ位置に表示する方法を検証
 
## 検証環境
バージョン：Xanadu(PDI)
 
## 設定方法
1. [すべて] > [Now Experience フレームワーク] > [エクスペリエンス] > [CSM/FSM 構成可能ワークスペース]に移動します
![スクリーンショット 2024-12-29 15.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487914/c687fc32-2449-3dc3-afc0-28c3325ba3e9.png)


2. [ユーザーエクスペリエンスページプロパティ] リストで下記のリストを開く
   record_secondary_values_location

3. Valueをheaderに変更して保存

## 結果
下図のようにAgentWorkspaceと同様の位置へ設定可能
![スクリーンショット 2024-12-29 15.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487914/7f5cddd8-405c-7a72-b736-206b6563504d.png)

## 参考
[コンテキストサイドパネルにフォームリボンとフォームヘッダーのセカンダリ値を表示する](https://www.servicenow.com/docs/ja-JP/bundle/utah-customer-service-management/page/product/customer-service-management/task/config-csm-display-header-in-sidebar.html)
link_to_if

# link_to_ifとは？
与えられた条件がtrueならリンクにfalseならリンクにしないという振る舞いをするメソッド。
## flat_mapを実際利用した場面
`link_to_if`を使わない場合、下記のようなコードになっていた。冗長なのと、なんかダサい。
```ruby
- if hoge.present?
  = link_to 'リンク', hoge_path
- else
  ー
```
`link_to_if`を使った場合
```ruby
= link_to_if hoge.present?, 'リンク', hoge_path do
  ー
```
とスリムにすることができた。
ただ今回の使い方をするのであれば
```ruby
= hoge.present? ? link_to('リンク', hoge_path) : 'ー'
```
のように書けば一行で済んだのと、使うのであれば
```ruby
# userが必ずいると仮定
= link_to_if user.active?, user.name, user_path(user)
```
のように、**同じ文字列をリンクにするかしないか**と言う条件に対して使うのが良さそう。
KiCad で引っ掛かったところ @2024.12

件の、環境計測 + 素子の電気的特性計測 2 点 の試作は先行していた i2c 経由の環境計測に加え 1:n(broadcast) の private LoRa も概ね仕上がったので全体の回路はほぼ固まったことになりまして、…

基板起こしを始めましたが … なにぶん KiCad に限りませんけどその手のものを使うのは初めてなので時々引っ掛かる、わけですよ。 

で、列挙の形式になりますけどとにかく書き留めておくことにした次第。
<br>

１． バス

結論から言うとバスには内容を列挙したラベルをつけなくてはならない、らしい。

データバスのようなものの場合は後文字（suffix）は 0..7 のような省略ができる、ようですが私の場合は i2c の引き出しに割り込み線を追加したものなので {SDA, SCL, INTR} と全部列挙で描きました。
<br>


２． 電源線

パンタグラフのようなアレです。 回路屋的には全く必要のないものですが異なる立場からすれば「業界内の暗黙」だから理解が難しい、と考えればまあしょうがないかなということにしました。
<br>


<br>
随時適宜追記修正の予定。
【HTML+JS】Canvas でお絵かきアプリを実装してみた

## はじめに
最近、お絵かきアプリの実装に興味を持ち、そこでHTMLのCanvasという機能を知りました。Canvasを活用すると、直感的な描画機能が簡単に実装できます。この記事では、HTMLと JavaScriptを使って実装したコードを紹介しながら、解説していきます。

## Canvas とは？
Canvasは、HTML5で導入された要素の一つで、ブラウザ上でグラフィックの描画を行うための機能です。2Dグラフィックスやアニメーション、ゲームなどをブラウザ内で実装することが可能になり、いろいろなインタラクティブコンテンツを手軽に作ることができます。

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

## 今回の実装の概要
今回のコードでは、以下のような機能を実装しています。

1. ブラウザ上に 1 つの Canvas を表示
2. マウスのドラッグ操作で線を描画
3. マウスの左ボタンを離したり、Canvas からマウスが外れたタイミングで描画を終了
4. リセットボタンを押すと、Canvas を初期状態にクリア

## ソースコード
以下が今回実装したサンプルコードです。
```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>最小限のCanvasサンプル</title>
  <style>
    /* Canvasの枠線を見やすくするために設定 */
    #canvas {
      border: 1px solid #000;
    }
  </style>
</head>
<body>
  <h1>Canvasでお絵描き</h1>
  <canvas id="canvas" width="500" height="400"></canvas>
  <br>
  <button id="resetButton">リセット</button>

  <script>
    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');

    let drawing = false;

    // マウスを押したときに描画開始
    canvas.addEventListener('mousedown', (e) => {
      drawing = true;
      ctx.beginPath();
      ctx.moveTo(e.offsetX, e.offsetY);
    });

    // マウスを動かしている間、線を描く
    canvas.addEventListener('mousemove', (e) => {
      if (!drawing) return; 
      ctx.lineTo(e.offsetX, e.offsetY);
      ctx.stroke();
    });

    // マウスを離したら描画終了
    canvas.addEventListener('mouseup', () => {
      drawing = false;
    });

    // マウスがCanvasの外に出た場合も描画終了
    canvas.addEventListener('mouseleave', () => {
      drawing = false;
    });

    // リセットボタンを押すとCanvasをクリア
    resetButton.addEventListener('click', () => {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
    });
  </script>
</body>
</html>
```

## 実行結果
上記のコードを .html ファイルとして保存しブラウザで開くとこんな感じでマウスで絵を描くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817084/cf027f47-0d07-aa93-5e82-728a0e0bafd5.png)

## おわりに
今回、HTMLのCanvasを使って最小限の機能でお絵かきアプリを実装してみました。
めちゃくちゃ簡単でしたね！！
今後はもっと複雑な機能を持ったアプリにカスタマイズしてみたいと思ってます。そのときはまた記事に。

この記事が参考になりましたらぜひ「いいね」「フォロー」など励みになるのでよろしくお願いします！
PRIMERGY TX120 S3を再利用する

### 目指したのは静音デスクトップPC
　自宅にてオブジェと化している富士通のサーバ PRIMERGY TX120 S3 に、新たな命を吹き込むために、デスクトップパソコン化してみました。このような事例は少ないでしょうから、記録として残すことにしました。
 　今回は、静音デスクトップパソコンをコンセプトに改良してみました。

### ハードウェアの改良
　そもそもサーバであるため、デスクトップパソコンについているようなHDMI端子、DVI端子、DPポート、音声出力端子などはなく、VGA端子があるだけ。またサーバの機能であるRAID機能は逆に必要ありませんでした。主な改良点は下記の通り。

- ストレージ周り
RAIDコントローラカードを取り外し、マザーボードについているSATAのコネクタにHDDとSSDを接続。ディスクの書き込みは、AHCHモードにすることを忘れずに。
- 画面出力と音声出力
グラフィックカードを増設。どのグラフィックカードが動くのか、コテコテ調べた結果、NVIDIA NVS 310 が動作するようでしたので、これで挑戦することに。
- メモリの増設
自宅に余っていた hynix製のメモリ 4GB を在庫一掃を兼ねて取り付け。

 ### OS
 　Linuxを入れようと最初から計画しており、定番ともいえるUbuntuをインストールしょうとしましたが、きれいにインストールされない。何とかインストールに成功しても動作がおかしい。今思うと、これが長いOS探しの始まりでした。
　なかなか先の見えない苦難の道でした。途中でやめようかとも思いました。コテコテした結果は以下の通り。
 - Ubuntu22.4.3LTS
 - Xubuntu
 - Ubuntu MATE
 - Linux Mint
 - Alter Linux
 - Debian xfce
 - Ubuntu Studio
上記のOSは、すべてNGでした。
　ようやくまともにインストールできたのは、Bodhi Linuxでした。
 
### Bodhi Linux の設定（グラフィックカード編）
　増設したグラフィックカードから最低限必要な画像が出力されたので、そのまま設定に利用。
　NVIDIA NVS 310 のドライバは、2015年8月28日にリリースされた バージョン 352.41 が最終である様子。コテコテ調べた結果、下記の手順でドライバのインストールに成功。
- 利用可能なドライバを探す
　` # ubuntu-drivers devices `　
を入力すると、結果として利用可能なドライバの候補が表示される。
　` nvidia-driver-390 `
　` nvidia-driver-340 `
今回は二つの候補が表示された。
- ドライバのインストールと再起動
二つのドライバが表示されたため、どちらをインストールしたらよいのか迷いましたが、番号の新しい方が新しいバージョンではなかろうかと考えて、390 の方をインストールすることに。
　` # apt install nvidia-driver-390 `
　` # reboot `

　これで、オブジェ化していた PRIMERGY TX120 S3 が、デスクトップパソコンとして新たなスタートを切ることができました。
DrupalのState API と Config APIの違いメモ

# 概要
これまでState APIを使ったことがなかったです。
どういうものかすら知らなかったので、メモとして残します。

## 本題
ドキュメントを見てから、どこに保存されていか調べると、
State APIはテーブル「key_value」に保存され、Config APIの「config」テーブルとテーブルの構造も似ています。

![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280639/3b10a8d1-e222-f5c4-665c-eece4a0e0db0.png)

ここまで分かった段階でそれぞれの使い分けが分からなくなりました。


Drupalの質問サイトでも同じように悩んでいる方がいましたので、紹介します。

https://drupal.stackexchange.com/questions/269890/what-is-the-difference-in-state-api-and-config-api

## 自分の解釈

### Config API
Drushなどから、設定情報をエクスポートやインポートできる機能がある。
そのため、テストサイトから本番サイトへの設定情報の同期する必要があるデータを保存する。(コンテンツタイプの設定など)

### State API
エクスポートやインポート機能はない。
サイト固有のデータを保存する。
例えば、ある条件の場合の、モジュールの実行した時間など。
同期する必要がない情報を保存する。


## 一部の環境でだけ、設定値を同期させたくない場合

ここで悩んだのが、本番とテスト環境で違う値を使用するケースです。
例えば、EC-CUBEを例に挙げると、多くの決済代行業者を決済プラグインを出していますが、開発時と本運用時で設定項目が別で、あったります。(ダミーのクレジットのテストなど)
そういったケースの場合は、この流れからいうと「State API」を使うのが良いのかなと思いますが、サイトの状態かというと微妙な気がしました。
その場合は、コントリビュートモジュールの「Configuration Split」を使うと解決できると思いました。
一部だけは、Config APIのデータを同期させないなどを設定が、できるモジュールのようです。

https://www.drupal.org/project/config_split

まだ使ったことはありませんが、便利そうなモジュールなので、使いこなせれば、開発時に威力を発揮しそうです。
Raspberry Pi(ラズパイ) 5 / 3 / 1 / 0 : CPU温度の比較(通常時＆負荷時)

## はじめに
Raspberry Piシリーズは、小型でありながら多くの用途に対応できる優れたシングルボードコンピュータとして人気があります。
最新モデルのRaspberry Pi 5は、従来モデルに比べて性能が大幅に向上していますが、その一方で消費電力や発熱量も気になるポイントです。

今回の投稿では、Raspberry Pi 5と過去のRaspberry PiのCPU温度を比較し、それぞれの通常時および負荷時の違いを報告します。

---

## 実験環境

### 使用したデバイス

- Raspberry Pi 5
    - OS: Raspberry Pi OS（64-bit）
- Raspberry Pi 5（公式のアクティブクーラー取付）
    - OS: Raspberry Pi OS（64-bit）
- Raspberry Pi 3 Model B
    - OS: Raspberry Pi OS（64-bit）
- Raspberry Pi 1 Model B+
    - OS: Raspberry Pi OS（32-bit）
- Raspberry Pi Zero W
    - OS: Raspberry Pi OS（32-bit）

## 実験条件
- 物理的な状況
    - 素のOSインストール直後の状態で測定
    - ケース無しの裸
    - アクティブクーラー使用を明示しているもの以外はクーラー等のオプション無し
    - 実験した部屋の気温：約20°C
- 通常時: OS起動後、アイドル状態で5分間放置
- 負荷時: stress コマンドでCPUを100%使用し、3分間実行
　ラズパイ5&4は4コアなので、stress -c 4 で負荷をかける
  　ラズパイ1&Zeroはシングルコアなので、stress -c 1 で負荷をかける
- 測定ツール : vcgencmd measure_temp
　測定開始 1分後、2分後、3分後の温度を計測

---

## 結果
以下の表に、通常時と負荷時のCPU温度をまとめました。

| デバイス | 通常時 | 1分後 | 2分後 | 3分後 |
| --- | --- | --- | --- | --- |
| Raspberry Pi 5 | 40.0°C | 82.3°C | 84.5°C | 86.2°C |
| Raspberry Pi 5(クーラー) | 40.0°C | 55.4°C | 58.2°C | 59.8°C |
| Raspberry Pi 3 | 39.7°C | 65.6°C | 72.5°C | 76.3°C |
| Raspberry Pi 1 | 34.2°C | 34.7°C | 35.8°C | 35.8°C |
| Raspberry Pi Zero W | 38.5°C | 42.8°C | 42.8°C | 43.3°C |

---

## 考察

### 通常時の温度

Raspberry Pi 5&3は性能向上に伴い、`通常時の温度も気持ち若干高め`となっています。

### 負荷時の温度

負荷をかけた場合、Raspberry Pi 5(クーラー無し)は急激に温度が上昇しました。
ラズパイは85°Cが動作限界温度とされているようで、温度もその付近で上がらなくなりました。
`vcgencmd get_throttled`コマンドで見ると、80°C到達時点でリミット到達した旨が確認できているので、強制的に処理能力を落とされているのかと思います。
Raspberry Pi5(クーラー有り)は負荷をかけるのと同時にファンが回り始め、3分経過しても60°C以下をどうにかキープしました。

---

## まとめ

複数コアのラズパイは負荷が高くなるとCPU温度が一気に上がります。
最も高機能なラズパイ5はアクティブクーラーが存在するので、これを付けると良いかと思います。
また、処理内容とその想定負荷、設置場所の気温に応じて、機器選定やケース選定、冷却対策が必要です。
[初心者向け]ハッシュを使用するときに注意すること[Ruby]

# はじめに
こんにちは。プログラミングスクールRUNTEQで勉強中のやま さかな@YamzknAと申します。

学習中、 **ハッシュを使用して条件分岐を簡単に書けるのでは？** と思って調べた際に、いくつか注意点が浮かんだので、ここにまとめます。

:::note warn
プログラミング初学者の記事になります。
間違いや不足等あれば、教えていただけると幸いです。
:::
<br>

ハッシュに関しては以下を参照してください↓↓

https://docs.ruby-lang.org/ja/latest/class/Hash.html

## 前提
この記事では`Ruby`にて解説を行います。

環境
- ruby 3.2.3

# 条件分岐をハッシュで書くとは

先達が分かりやすく書いてくださっている記事があったので、
この部分に関しては以下の記事を参照してください↓↓

https://qiita.com/ysk91_engineer/items/9bff6c8b8bc2272f074f


簡単に説明すると、以下のように書き換えることができます。
```ruby
#priceの値を求める処理
# if文を使った例
fruit = "apple"
if fruit == "apple"
  price = 100
elsif fruit == "banana"
  price = 150
end

# ハッシュを使った例
prices = {
  "apple" => 100,
  "banana" => 150
}
price = prices["apple"]  # キー"apple"に対応する値を直接取得
```
# ハッシュを使用する際に気を付けること
今回は2つのケースについて説明します。

1. キーが存在しない場合に注意！
1. キーのデータ型に注意！

## 1. キーが存在しない場合に注意！
指定したキーが存在しない場合は`nil`が帰ってきてしまうので、存在確認を行うなどして回避する。
```ruby
def get_price(fruit)
  prices = {
    "apple" => 100,
    "banana" => 150
  }
  prices[fruit]
end

p get_price("orange")
=> nil
```
↓
```ruby
def get_price(fruit)
  prices = {
    "apple" => 100,
    "banana" => 150
  }
  # キーの存在確認
  prices[fruit] || "価格不明"
end

p get_price("orange")
=> "価格不明"
```
or
```ruby
def get_price(fruit)
  prices = {
    "apple" => 100,
    "banana" => 150
  }
  
  if prices.has_key?(fruit)
    prices[fruit]
  else
    "価格不明"
  end
end

p get_price("orange")
=> "価格不明"
```
など

## 2. キーのデータ型に注意！
指定したキーの型が違う場合も`nil`が返ってきます。

```ruby
def identify_bakufu(year)
  bakufu = {
    "1185" => "鎌倉幕府",
    "1603" => "江戸幕府"
  }

  bakufu[year]
end 

p identify_bakufu(1185) #ハッシュでは文字列型をキーとしているためnilが返る
=> nil

p identify_bakufu("1185")
=> "鎌倉幕府"
```
<br>
加えて、ハッシュをシンボルで定義している場合も注意が必要です。

```ruby
def get_price(fruit)
  prices = {
    apple: 100,
    banana: 150
  }

  prices[fruit]
end

p get_price("apple") #これではnilになる
=> nil

p get_price(:apple) #しっかりシンボルで指定する
=> 100
```
or
```ruby
def get_price(fruit)
  prices = {
    apple: 100,
    banana: 150
  }
  # キーの存在確認
  prices[fruit.to_sym] #文字列オブジェクトをシンボルに変換する
end

p get_price("apple")
=> 100
```

# さいごに
ハッシュは中身を書き換えることができる点にも注意が必要です。
条件分岐と違って、ハッシュは後からアクセスして編集することができてしまいます。
つまり、呼び出した際にすでに書き換わっている危険性をはらんでいるわけです。
関数の外でハッシュを定義する場合などは、必要に応じて`.freeze`することも視野に入れると良さそうです。

また、今回は<INS>あくまで読みやすいコードにすることが目的</INS>ですので、どちらが読みやすいかを意識して書いていきたいです。
ハッシュは入れ子になると、途端に見づらくなるので、そういった点も意識しておきたいですね。

`.freeze`に関しては以下を参照↓↓

https://qiita.com/yukiyoshimura/items/a5e3deb501a742302d2c

以上になります。
ありがとうございました。
【ゼロからのOS自作入門】Day00-Day01

ゼロからのOS自作入門を、読み始めました。

Cは参考書を読んだ程度、C++は勉強も触ったこともなく、最後まで実施できる自信はないですが、なんとか頑張ってみます。

Day00とDay01はなんなく進められましたね。
私は、VirtualBoxで実行しました。
ChatGPTを使いながら、Rustでも書いてみましたが、うまくいきませんでした。
ビルドでは、エラーがでなかったのですが。。。
![スクリーンショット 2024-12-29 140530.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498946/5a7f9346-15e7-9f76-27d0-5ad38f61c14a.png)

以下は、VirtualBoxの仮想マシンを作成から、起動までのコマンドになります。
```
# 仮想マシンを作成
VBoxManage createvm --name "HelloWorld" --register

VBoxManage createhd --filename "C:\Users\mniyk\VirtualBox\HelloWorld\HelloWorld.vdi" --size 1024

VBoxManage modifyvm "HelloWorld" --firmware efi

VBoxManage storagectl "HelloWorld" --name "SATA Controller" --add sata --controller IntelAhci

VBoxManage storageattach "HelloWorld" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium "C:\Users\mniyk\VirtualBox\HelloWorld\HelloWorld.vdi"

# VDIにEFIをコピー
sudo modprobe nbd

sudo qemu-nbd --connect=/dev/nbd0 /mnt/c/Users/mniyk/VirtualBox/HelloWorld/HelloWorld.vdi

❯ sudo fdisk /dev/nbd0
Welcome to fdisk (util-linux 2.39.3).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0x6ea7a64e.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-2097151, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2097151, default 2097151):

Created a new partition 1 of type 'Linux' and of size 1023 MiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

❯ sudo fdisk -l /dev/nbd0
Disk /dev/nbd0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6ea7a64e

Device      Boot Start     End Sectors  Size Id Type
/dev/nbd0p1       2048 2097151 2095104 1023M 83 Linux

sudo apt install dosfstools

sudo mkfs.vfat /dev/nbd0p1

❯ sudo fsck /dev/nbd0p1
fsck from util-linux 2.39.3
fsck.fat 4.2 (2021-01-31)
/dev/nbd0p1: 0 files, 1/261367 clusters

sudo mkdir -p /mnt/nbd

sudo mount /dev/nbd0p1 /mnt/nbd

sudo mkdir -p /mnt/nbd/EFI/Boot

sudo cp /mnt/c/Users/mniyk/VirtualBox/HelloWorld/BOOTX64.EFI /mnt/nbd/EFI/Boot/bootx64.efi

sudo umount /mnt/nbd

sudo qemu-nbd --disconnect /dev/nbd0

# 仮想マシンの起動
VBoxManage startvm "HelloWorld" --type gui
```
Git基本コマンドと運用ガイドを自分なりにまとめた

# 背景

初めてのチーム開発を行うにあたってGitを使うことになりまして、

基本的な使い方を学習してきました。

# Gitの基本的なコマンド

### **リポジトリの初期化と設定**

- **`git init`**
    
    新しいリポジトリを初期化します。
    
- **`git clone <リポジトリURL>`**
    
    既存のリポジトリをローカルに複製します。
    
- **`git config --global user.name "名前"`**
    
    ユーザー名を設定します。
    
- **`git config --global user.email "メールアドレス"`**
    
    メールアドレスを設定します。
    

---

### **変更の追跡**

- **`git status`**
    
    現在のリポジトリの状態を表示します。
    
- **`git add <ファイル名>`**
    
    変更をステージングエリアに追加します。
    
- **`git add .`**
    
    すべての変更をステージングエリアに追加します。
    
- **`git commit -m "コミットメッセージ"`**
    
    ステージングエリアの変更をリポジトリにコミットします。
    

---

### **履歴の確認**

- **`git log`**
    
    コミット履歴を表示します。
    
- **`git log --oneline`**
    
    履歴を簡略化して表示します。
    

---

### **ブランチの操作**

- **`git branch`**
    
    現在のブランチの一覧を表示します。
    
- **`git branch <ブランチ名>`**
    
    新しいブランチを作成します。
    
- **`git checkout <ブランチ名>`**
    
    指定したブランチに切り替えます。
    
- **`git checkout -b <ブランチ名>`**
    
    新しいブランチを作成し、同時に切り替えます。
    

---

### **リモート操作**

- **`git remote add origin <リポジトリURL>`**
    
    リモートリポジトリを追加します。
    
- **`git pull origin <ブランチ名>`**
    
    リモートリポジトリから変更を取得してマージします。
    
- **`git push origin <ブランチ名>`**
    
    ローカルの変更をリモートリポジトリに送信します。
    

---

### **マージと競合解決**

- **`git merge <ブランチ名>`**
    
    指定したブランチを現在のブランチにマージします。
    
- **`git diff`**
    
    変更点を表示します。
    
- **`git reset <ファイル名>`**
    
    ステージングエリアから変更を削除します。
    
- **`git reset --hard`**
    
    変更を完全に取り消し、最新のコミット状態に戻します。
    

---

### **その他便利なコマンド**

- **`git stash`**
    
    現在の変更を一時的に退避させます。
    
- **`git stash pop`**
    
    一時退避させた変更を復元します。
    
- **`git tag <タグ名>`**
    
    コミットにタグを付けます。
    
- **`git show`**
    
    詳細情報を表示します。
    

---

# ブランチ

ブランチとは履歴の流れを分岐して記録していくためのものになります。

分岐したブランチはほかのブランチの影響を受けないので複数人で開発を進める際も同じリポジトリの中で複数の変更を同時に進めていくことができます。

開発の際には基本のmainブランチでは作業を行わずにdevelopブランチのような開発用のブランチを作成する。そこからさらに機能実装などのタスクごとにブランチを切り分けてdevelopブランチにマージを行っていくような流れが多いみたいです。

---

# **.gitignore**

自動生成されるファイル(sessionファイルなど)やパスワードが記載されているファイルは

gitに上げたくないなって時があると思います。その際に便利なのがこのgitignoreです。

```php
.gitignoreファイルの書き方

# 指定したファイルを除外
index.html
# ルートディレクトリを指定
/root.html
# ディレクトリ以下を除外
dir/
# /以外の文字列にマッチ「*」
/*/*.css
```

このように記載して置いておくことで管理しないファイルをGitの管理から外すことができます。

---
未経験からJavaScript学んでみたのでまとめてみた

## はじめに
こんにちは！takuhuyuです。
現在実務未経験でエンジニア転職を目指しています。
今回は、**プログラミング未経験でJavaScriptをこれから学びたい方向け**にチートシート（的に）まとめてみました。
私のような未経験から挑戦したいという方はぜひ参考にしてみてください。

## 初学者向け JavaScript基礎まとめ
### 変数とデータ型
JavaScriptでは、変数を使ってデータを保存します。変数を定義する方法には、var、let、constがあります。
```
let age = 25; //数値
const name = "John"; //文字列
var isStudent = true; //ブール値
```

データ型には、数値、文字列、ブール値、null、undefinedなどが含まれます。

### 演算子と式
演算子を使うと、変数や値に対して操作ができます。

```
let sum = 5 + 3; // 8
```

### 条件分岐
条件分岐を使うと、特定の条件が満たされた時に異なるコードを実行できます。

```
if (age > 18) {
    console.log("Adult");
} else {
    console.log("Minor");
}
```
switch文も使えます。
```
switch(day) {
    case 0:
        console.log("Sunday");
        break;
    case 1:
        console.log("Monday");
        break;
    // その他のケース
}
```

### ループ（for, while, do...while）
ループを使うと、同じコードを繰り返し実行できます。
```
for (let i = 0; i < 5; i++) {
    console.log(i);
}
```

### 関数の定義
関数は、特定のタスクを実行するためのコードのブロックです。
```
function greet(name) {
    return "Hello, " + name;
}
console.log(greet("Alice")); // Hello, Alice
```

### オブジェクト
オブジェクトは、関連するデータや機能をまとめるために使います。

```
let person = {
    name: "John",
    age: 30,
    greet: function() {
        console.log("Hello!");
    }
};
```
### 配列
配列は、複数の値を格納するために使います。
```
let fruits = ["Apple", "Banana", "Cherry"];
console.log(fruits[0]); // Apple
fruits.push("Orange");
console.log(fruits.length); // 4
```

### DOM操作
DOM（Document Object Model）は、HTMLの構造を表します。
HTMLから直接操作せず、JavaScriptを使って、ウェブページの要素を操作できます。
```
let element = document.getElementById("myElement");
element.textContent = "新しいテキスト";
```

### イベント処理
イベント処理を使うと、ユーザーの操作に応じてコードを実行できます。
```
document.getElementById("myButton").addEventListener("click", function() {
    alert("Button clicked!");
});
```

## まとめ
いかがだったでしょうか？
プログラミング学んだことない方でJavaScriptを学んでみたいという方は、これを見ればだいたい基礎はおさえられると思います！
これらを使いこなすためには、とにかく簡単なアプリケーションを作ってみて、どんな時に使うのか体感してみて欲しいです！
次回は、JavaScriptを理解する上での注意点について書いていきます。
基本情報技術者試験に合格した勉強方法を振り返る

# はじめに
こちらは、今年合格した資格試験の勉強方法を年内に投稿しておきたいと思い、作成した記事のひとつです。
今回は「基本情報技術者」について。

# 合格時のスキル
・ITやエンジニア系の業種は未経験。
・実務経験があるプログラミング言語はExcel VBA（独学）のみ。
・競技プログラミングへの参加経験あり（使用言語：C++）。

# 学習期間と受験時期
約3ヵ月の学習期間を経て、2024年3月に受験。

# 学習方法
### ひたすら過去問を解く
科目Aの対策として行いました。
 **試験本番に近い時間構成で過去問を解き、誤答した問題は数日後に解き直す。** 
試験対策としては一般的なやり方だと思いますが、これが一番効果があると感じました。
Web上で利用できる「[基本情報技術者過去問道場](https://www.fe-siken.com/fekakomon.php)」が便利です。

### 参考書で勉強する
前述した過去問道場では科目Bの対策は難しく感じたため、参考書で対策を行いました。
使用した参考書は「[情報処理教科書 出るとこだけ！基本情報技術者［科目B］](https://www.shoeisha.co.jp/book/detail/9784798182520)」です。掲載されている解き方を練習することで、試験本番でも落ち着いて挑むことができました。


# 試験本番での解き方
・ **少しでも「わからない」と思ったら次の問題に進む。** 
問題を見たとき『これはすぐ解答できる！』と感じたものからまず解いていき、難しい問題のために時間を残しましょう。
焦ってしまうと、簡単な問題であっても誤答してしまう危険性が高まります。

・ **未回答のまま時間切れになることだけは避けましょう。** 
もし『時間をかけても正解できるか自信がない』問題があれば、「それっぽい」と感じた選択肢を選ぶのも一つの手段です。（変数名に使われている英単語から推測するなど）

<br>
結果、科目A・Bともに7割以上の得点を得て合格することができました。

試験に挑戦しようと考えられている方々の参考になれば幸いです。
お読みいただき、ありがとうございました。
html上でのjavascriptの読み込み

※本記事は数年前に書いたままだった下書きを投稿したものです。更新日時よりも情報が古い可能性があります。


# はじめに
ウェブページのユーザビリティ向上には、Javascriptの読み込み順序や読み込み方法について考えることが必要になる場面があります。本記事は、ウェブページにおけるJavascriptの読み込みに関して、各種サイトの情報を私なりにまとめた形になっています。

# WHERE:どこにJavascriptを書くか
Jascriptを読み込む方法には、次の2種類があります。

1.1. html自体への直接の書き込み (インラインスクリプト)
1.2. 外部ファイルの読み込み

これらの記載位置として、主に次の3つがあるかと思います。

2.1. header
2.2. bodyの中 (属性の間など)
2.3. bodyの末尾 (`</body>`の直前)

``` html
<html>
<header>
    <script> (2.1) の書く場所 </script>
</header>
<body>
    <div> hoge </div>
    <script> (2.2) の書く場所 </script>
    <div> hoge </div>
    <script> (2.3) の書く場所 </script>
</body>
</html>
```


原則として、scriptは、htmlに記載された順番で読み込まれます。そのため、

- body本体よりも先に、最初に読み込んでおきたい場合は **(2.1) header** に書く
- そうでない場合は **(2.3) bodyの末尾** に書く
- その他何らかの事情があれば、**(2.2) bodyの中** に書く 

とするのがよいとされています [1]。
なぜなら、jsをはじめや途中で読み込んでしまうと、DOM (htmlの構造) の構築が阻害されてしまうからです。
ページのユーザービリティを上げるには、こうしたJSの記載場所や処理順序を考える必要が出てくる場合があります。

# WHEN:いつJavascriptを読み込むか
上記では、「どこにscriptを書くか」に注目しましたが、ここでは「どのタイミングで読み込むか」に注目して、より深堀したいと思います。
そこで、次の新たな用語を導入します[2][3]。

3.1. **DOMContentLoaded**イベント：DOMツリー (htmlの構造) が構築された直後に発火するイベント
3.2. **load**イベント：ブラウザが他の要素全てを読み込んだ後に発火するイベント
3.3. **unload**イベント：ユーザーがページを離れるときに発火するイベント

説明からも分かるように、**3.1 -> 3.2 -> 3.3** の順番でスクリプトが実行されます。
最初に述べたように、Jacascriptの基本的な読み込みは、**2.1 > 2.2 > 2.3** で読み込まれるので、
これらの位置のどこかで、特定のスクリプトが **3.1 - 3.3** のタイミングで動くように、特別に設定する必要があります。
これらを実現する仕組みは、javascript自体やライブラリにもあるので、次の文献[3]などをご参照ください。

https://ja.javascript.info/onload-ondomcontentloaded

# HOW:どうやってJavascriptを読み込むか
本節では、3つのjavascriptの読み込み方を紹介します。

4.1. default (同期的)
4.2. async
4.3. defer

以下のの文献[4]が本当に美しくまとまっているので、こちらを読んでください。

https://qiita.com/phanect/items/82c85ea4b8f9c373d684 


簡潔に述べると、デフォルトでは同期的に、すなわち最初から順番にscriptが処理されていきます。
asyncでは、scriptのロードをhtmlのパースの裏で行うなどすることで、効率化が見込めます。ただし、「非同期」というワードからわかるように、scriptの実行順序は保存されません。そのため、「効率化はしたいけど処理を後ろにはあまり回したくない」という場合に使うことが考えられます。
deferでは、htmlの処理が終わった後、DOMContentLoadedが実行される前に実行を行います。事前のロード自体はasync同様に行われるので、defaultよりも効率的になる可能性が高いです。こちらは、実行順序は保存されます。

これらは、次のように書くことで実行できます。

``` html
<script src="hoge.js" async></script>
<script src="hoge.js" defer></script>
```


# まとめ
ユーザービリティ向上に関連するjavascriptの内容について、次の3つの観点を取り上げました。

- **WHERE**：scriptの記入位置
- **WHEN**：scriptの実行タイミング
- **HOW**：scriptの読み込み方法

言えることは、「不要であれば後に配置/実行する」「htmlの邪魔をしない」ということです。
ウェブページのパフォーマンス改善には、念頭に入れたいですね。


# 参考文献
[1] https://webukatu.com/wordpress/blog/39711/
[2] https://noumenon-th.net/programming/2017/06/11/domcontentloaded/
[3] https://ja.javascript.info/onload-ondomcontentloaded
[4] https://qiita.com/phanect/items/82c85ea4b8f9c373d684
AdaBoostとは？仕組みと処理内容を徹底解説

本日は、**AdaBoost**と**LightGBM**の違いについて、基本的な概念から仕組みまで、できるだけ分かりやすく解説します。最初に、AdaBoostの処理内容をステップバイステップで解説した後、LightGBMとの違いを表記形式で比較します。
※この記事は、ChatGPTの出力を基に作成しています。

---

## AdaBoostの処理内容をステップバイステップで解説

AdaBoostは、簡単なモデルを組み合わせて何度も改善を重ねて、最終的に高い予測能力を実現するアルゴリズムです。ここでは、その処理内容をステップごとに分解します。

### ステップ 1、初期化
1. **データを準備**：
   - 特徴量と正解ラベルを含むデータを準備します。
2. **データに重みを付与**：
   - 初期では、すべてのデータに一様の重みを付けます。重みは、データの総数で割った値です（例：個々100個のデータなら、重みは1/100、という感じです）。

### ステップ 2、弱いモデルを作成
1. **弱いモデルを設計して訓練**：
   - 毎回、簡単なモデル（例：深さが1の決定木）を訓練します。
2. **エラー率を計算**：
   - モデルが予測を間違えたデータに付けられた重みの合計から、エラー率を計算します（例：0.2なら、20%のデータを間違えた、という意味）。
3. **モデルの信頼度を決める**：
   - 信頼度は次の式で計算します：
     
     $$\
     \alpha =  \frac{1}{2} \ln\left(\frac{1 - \text{Error}}{\text{Error}}\right)
     \$$
     
     エラー率が低いほど、信頼度は高くなります。

### ステップ 3、データの重みを更新
1. **間違えたデータに重みを増やす**：
   - モデルが間違えたデータにより重きを付けます。
2. **重みを正規化する**：
   - すべての重みの合計を1に調整し、続けて訓練できるようにします。

### ステップ 4、弱いモデルを続けて作成
- 弱いモデルを続けて訓練し、信頼度を計算するプロセスを「持続的に」追加していきます。この過程を例えば「たくさんのせんせいが共同で予測を出す」ような様子です。

### ステップ 5、最終的な予測
- すべての弱いモデルの信頼度を考慮しながら、最終的な結論を出します。

---

## AdaBoostとLightGBMの違い

AdaBoostとLightGBMは、どちらもブースティングという概念に基づいていますが、その仕組みと用途に大きな違いがあります。ここでは、両者の違いを表記形式で比較します。

| 特徴                 | **AdaBoost**                                     | **LightGBM**                                |
|-----------------------|-------------------------------------------|-------------------------------------------|
| **基本概念**        | データの重みを更新して改善       | 残差を目標に改善                   |
| **実装方法**      | 弱いモデルを並列組み込む         | 決定木をリーフワイズで構築     |
| **訓練の主軸**   | データの重みに基づく改善         | 残差の相象値を目標に改善         |
| **スピードとスケール** | レーテが気にならない小規模に適している | 大規模でも高速に動作                   |
| **用途の例**       | 簡易な分類タスクの解決             | ランキングや大規模データの処理 |

---

AdaBoostは、学習が視覚的で解釈しやすい一方、LightGBMは大規模データを高速に処理できる為、小規模タスクと大規模タスクで使い分けることが重要です。
GitHubのコミット署名の設定でハマった話

# 背景
GitHubではコミットに署名するとコミットの横に`Verified`マークが付きます。
公式ドキュメントにやり方はバッチリ書いてあるのですがなぜか何回やっても`Permission denied(pubilckey)`になりpushに失敗していました。

# 原因
コミット署名用のSSHキーしかGitHubに登録していなかったのが原因でした。

GitHubに公開鍵を追加する際にKey typeを選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069730/ceaf7e99-9c8b-3bd4-1005-0f5fa9201a94.png)

`Authentication Key`は認証用、`Signing Key`はコミット署名用のキーですね。Signing Keyしか登録しなかったので、アクセスが拒否されていたという訳です。
どこにも解決方法が書いてなかったのですが、当たり前すぎて書かれていなかったんでしょうねぇ...お恥ずかしい。

# 補足
公式ドキュメントによると認証用のキーと署名用のキーは同じものを使用できます。
https://docs.github.com/ja/authentication/managing-commit-signature-verification/about-commit-signature-verification#ssh-commit-signature-verification

SSHキーの登録からpushまでの流れ、およびコミット署名の方法については先人の記事がいっぱいあるので割愛。
Something is already running on port 3000. Probablyの解決方法

## 問題
```
npm run start
```

でをいつも通りプロジェクトを立ち上げると以下のようなエラーが出てきた。

**Something is already running on port 3000. Probably**

どうやら、すでにポート 3000 で何かが実行されているみたいなので代わりのポート番号で実行しますか？的なエラーのようです。
npm run start で毎回出るのは嫌なので解決策を探しました。

## 解決方法
PORT 3000を利用しているプロセスを確認します。
出力結果のPID番号を覚えておきます。
```
lsof -i:3000
```
以下のコマンドで強制終了。
```
kill -9 PID番号
```

で解決しました。
【備忘録】npx shadcn で EEXIST エラーが発生した

# はじめに
既存のNext.jsプロジェクトに`shadcn/ui`をインストールしようとしたら
以下のようなメッセージが表示されインストールに失敗しました。
```
npx shadcn@latest init
Need to install the following packages:
shadcn@2.1.8
Ok to proceed? (y) y

npm error code EEXIST
npm error syscall rename
npm error path /Users/username/.npm/_cacache/tmp/83dee5e8
npm error dest /Users/username/.npm/_cacache/content-v2/sha512/18/38/941bc1f5577dc3fe96fc9b16115bd62c87fc2cf81f7cf66f801bd006ec09d903433cae8305138aa1fd38c9ce3ec2caa0096ead18785b706289d01f41df6c
npm error errno EEXIST
npm error Invalid response body while trying to fetch https://registry.npmjs.org/@babel%2fhelper-create-class-features-plugin: EACCES: permission denied, rename '/Users/username/.npm/_cacache/tmp/83dee5e8' -> '/Users/username/.npm/_cacache/content-v2/sha512/18/38/941bc1f5577dc3fe96fc9b16115bd62c87fc2cf81f7cf66f801bd006ec09d903433cae8305138aa1fd38c9ce3ec2caa0096ead18785b706289d01f41df6c'
```

# 対処法
キャッシュのコピー時にpermission deniedが発生しているので、
npmのキャッシュをクリアしてみた。
```
sudo npm cache clean --force
```

# 結果
`shadcn/ui`のインストールが無事に完了した。
以降は同様の事象が発生したらキャッシュをクリアしようという話でした。
(権限問題なのでsudo npxとしたら上手くいくかもしれない。試してないけど。。)
```
npx shadcn@latest init
Need to install the following packages:
shadcn@2.1.8
Ok to proceed? (y) y
```
Goにおける関数

## はじめに

Goの関数についてまとめる

### 関数の変数的な使い方

関数の引数に取ることができ、戻り値としても利用でき流。


```Go
package main

import (
	"fmt"
	"math"
)

func compute(fn func(float64, float64) float64) float64 {
	return fn(3, 4)
}

func main() {
	hypot := func(x, y float64) float64 {
		return math.Sqrt(x*x + y*y)
	}
	fmt.Println(hypot(5, 12))

	fmt.Println(compute(hypot))
	fmt.Println(compute(math.Pow))
}
// 13
// 5
// 81
```

###  クロージャ

Goの関数はクロージャ。
クロージャは外部から変数を参照する関数値。
参照された変数へアクセスして変えることができる。
以下のコードだとクロージャは```adder()```の静的スコープにある```sum```変数を保持し続けている。

```Go
package main

import "fmt"

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	pos, neg := adder(), adder()
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(i),
			neg(-2*i),
		)
	}
}
```
【不合格体験記】プロジェクトマネージャ試験(PM)に落ちました(2024/10/13)【R6秋】

# 目次
[#1.はじめに](#1はじめに)
[#2.筆者のスペック](#2筆者のスペック)
[#3.学習内容](#3学習内容)
[#4.試験](#4試験)
[#5.あとがき](#5あとがき)

# 1.はじめに

題名の通り、プロジェクトマネージャ試験(PM)に落ちました。

https://x.com/ss_IT_study/status/1872122356455608798

論文区分は初挑戦でなんとか論文の採点まではたどり着きましたが、
B評価で一歩届きませんでした。
リベンジしようと思っているので、記録として残しておこうと思います。

# 2.筆者のスペック

* 大学は情報系
* SIerで10年程度勤務
* 情報処理試験だとFE、AP、SCについては取得済み
* SC取得により午前Ⅰについては免除

# 3.学習内容

①[情報処理教科書 プロジェクトマネージャ 2024年版](https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3-2024%E5%B9%B4%E7%89%88-IT%E3%81%AE%E3%83%97%E3%83%AD46/dp/4798185752)

みよちゃん本と呼ばれる参考書です。三好さんの本はSCの重点対策も過去利用しました。
基本的にはこの参考書に従い、午前Ⅱ、午後Ⅰ、午後Ⅱすべての学習を行いました。


②[プロジェクトマネージャ試験過去問道場](https://www.pm-siken.com/pmkakomon.php)

午前Ⅱ対策の定番ですね。過去問題についてひたすら反復しました。
①のWebコンテンツとして午前Ⅱの問題集も付属しているのですが、
過去APやSCで利用して使い慣れていたので試験一ヶ月前に課金して利用しました。
※2024秋から有料化したようです

# 4.試験

試験の結果としては以下内容でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324575/eec6cb15-3de4-f95e-4020-5a98d8e377db.png)


選択問題は以下です。
午後Ⅰ：問２、問３
午後Ⅱ：問１

午後Ⅰについては77点で余裕をもって通過。
アイテックによると問３は難易度が少し高めだったとのことなので、
おそらく問３選択のおかげだと思います。
※実際には時間がギリギリで問３は一部解ききれなかった

午後Ⅱについては問１はコストマネジメントに関する問題で苦手意識が、問２は手持ちの論文骨子と内容が離れており、試験当日はかなり選択に迷いました。
最終的には「不確かな内容」という部分が令和２年の過去問にかなり近く、コストの面を除けば論文が書きやすそうな問１を選択しました。

結果としてはランクBで文字数は足りていて問題に対する答えは書いているもののもう一歩という評価になりました。
採点講評の公開前ではありますが、個人的に意識していたことと次回に向けた反省点をまとめておきます。

- 意識したこと
    - セオリーから外れた行動をするときは明確に根拠を記載する
    - プロジェクトマネージャは極力手を動かさず、指示を行う
    - ステークホルダーとのコミュニケーションは合意の証明として書く
- 反省点
    - 不確かさとして未知の技術を利用した場合の生産性を採用したが、具体的にな生産性の数値、追加でかかるコストの数値を記載できなかった
    - 午後Ⅰの学習に時間をとりすぎてしまい、午後Ⅱの準備として論文を2本しか書いておらず、複数のテーマに対する対策ができなかった

# 5.あとがき
プロジェクトマネージャ試験(PM)の不合格体験記でした。
申込時はお試し受験のつもりでしたが、実際に勉強を進めていると合格したくなりとても悔しかったです。
午前Ⅰ免除もなくなりそうなので今後の計画は考える必要がありますが、IPA、ベンダー資格共に頑張ろうと思います。
WindowsPCにプログラミング向きのフォントをインストール

# はじめに
WindowsPCを新調し、やっとVisual StudioでC#のプログラミングできるー！と思っていたのですが
久しぶりに見るとフォント見づらいですね。。。
そこで以前から利用していた、「Ricty Diminished」インストールしようとしたのですがサポート終了しているとのことなので今回は後継として利用されてることが多いみたいなので「PlemolJP」をインストールすることにしました。(フォントのインストール方法は特に他のフォントでも特段変わらないと思います。)

# 手順

1. [GitHub](https://github.com/yuru7/PlemolJP)からフォントをダウンロード
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/0afaf67e-929c-ac4d-a125-ecd0f4c80c4a.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/2b978d53-5d87-2875-9c37-3fb739549e00.png)

1. zipファイルを解凍して対象のフォルダに配置
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/adf8da0a-193e-9d96-9cf5-25cc988c7c73.png)

    中身は以下
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/381fedc3-2c1b-ac70-c8ad-12090f465a0d.png)

    それぞれのフォルダの中身を確認したが個人的に「PlemolJP」のみあればいいかなと思ったので今回は「PlemolJP」のみインストールすることに。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/5ce907c4-903b-74a7-2eca-8ab834dbab85.png)

    以下のように複数のフォントスタイルが追加される。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/2b15ff35-a2cc-81c6-cadd-a989c3254e15.png)

    後はVisual Studioで適用したら終わり。手順は以下
    「Ctrl + ,」でダイアログ表示 > 機能検索タブに切り替え > 「フォント」と入力 > 検索結果をダブルクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/e85bd3bb-f43b-4327-555d-174cdffd9c07.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/79a80d3b-a17b-47ec-9a42-9574b337cb01.png)

    フォント関連の設定ダイアログが出てくるので後はMS ゴシックの部分をお好みのフォントに変更してOKで終了です。

    比較画像は以下。(左が規定値のMSゴシック、右がPlemolJP)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457845/90d9a881-91b5-6dc1-50e7-f830b9316941.png)

    変更して思ったけどMSゴシックだからこそThe Visual Studioって気もするのでやっぱりMSゴシックに戻すかな。


---
[サポート終了を知るきっかけとなった記事](https://zenn.dev/tatto/articles/48a53259cf0881)