OmniAICreator/Qiita-1.07M huggingface dataset:
自作PCで、古いバージョンのBIOSをアップデートする際につまずいた話

## 概要
中古で購入したASRock製マザーボード(A320M-HDV)の動作が不安定だったので、最新のBIOSへアップデートを試みたら上手くいかなかったが、色々試行錯誤しているうちに成功したので備忘録も兼ねてメモ。
## 対象
- 自作PC初心者
## アップデート前の環境
- ASRock A320M-HDV R4.0(P3.70)
## 結論
**古いBIOSからいきなり最新のBIOSにアップデートはできないため、現在マザーボードにインストールされているバージョンの１つ上のバージョンからアップデートする必要がある。**
今回は以下の順番でアップデートを行った。
| BIOS Ver. |備考|
|---:|------------|
|P3.70(作業前)|AMD CPU fTPMを切る必要あり|
|P4.00|UEFIの見た目が変わる|
|P7.00||
|P7.10||
|P7.20||
|P7.40||
|P8.01|正式版最終バージョン|
|P10.08(作業後)|ベータ版|
## 手順
![P_20240727_130924.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656975/589f4fa9-7aac-c321-698b-3c9e28820dfc.jpeg)
BIOSアップデート作業前の画面。
![P_20240727_130944.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656975/3debf8a0-7c65-ab14-fac9-12e048583149.jpeg)
P4.00より前のバージョでは「AMD CPU fTPM」を切らないとInstant Flashが使えないため、
Advanced→「CPU Configuration」→「AMD fTPM Switch」
から設定を「Disabled」にしておく。
![P_20240727_131041.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656975/fa2a324b-1891-1cde-e89e-eb32991b6a71.jpeg)
BIOSバージョンがP3.70の状態でP10.08のBIOSにアップデートしようとした際の画面。もし間違ったBIOSファイルを選んだとしても即破損には繋がらないため安心してほしい。
![P_20240727_131737.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656975/9ba9df4e-0ec5-2af3-b4ee-b04e39a76b1e.jpeg)
P3.70からP4.00にアップデートした際の画面。UEFI画面の印象がガラリと変わった。
![P_20240727_132327.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656975/ca0247f1-69bf-bf9b-fec8-d6b26745d7e8.jpeg)
>BitLockerと、TPMに依存する暗号化またはセキュリティを一時停止してください。回復キーがすでに保存され、バックアップされていることを確認してください。暗号化がアクティブなときに回復キーが見つからない場合、データは暗号化されたままとなり、システムはオペレーティングシステムを起動できません。
>BIOS を更新する前にfTPMを無効にすることをお勧めします。そうしないと、予期しない障害が発生する可能性があります。

BitLockerでストレージを暗号化している場合は、BIOSアップデートを行う前にWindowsを開き直して暗号化の解除を行う。P4.00よりAMD fTPMの解除は任意となった。（万全を期すなら解除しておこう）
![P_20240727_145202.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656975/322f9c58-5845-2247-3d7d-62b83e03a2ce.jpeg)
BIOSアップデート作業後の画面。
## 参考記事
[ASRock BIOS アップグレードについての説明](https://www.asrock.com/support/BIOSIG.jp.asp?cat=BIOS10)
[A320M-HDV R4.0 BIOSダウンロードページ](https://www.asrock.com/mb/AMD/A320M-HDV%20R4.0/index.jp.asp#BIOS)
ずんだもんとお喋りするアプリを作った

# 概要
ChatGPTを使ってずんだもんとお喋りするアプリを作りました。

全体の仕組みは完全に「ムーザルちゃんねる」さんのものをそのまま使っています。
ありがとうございます。

https://youtu.be/oOUBvdLKLK4?si=ZtvLxtI6skVSJZDz

# デモ
ずんだもんモード

https://youtu.be/svX6x7vH3mU?si=TcoP7Hwe-SLVNL1w

※以降は雑音が酷いので自分の音を消しています。

仏陀モード

https://youtu.be/4VIVDoGF22I

クールポコモード

https://youtu.be/OVNXRnx1zEA

# 技術
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/98442622-b527-e68f-0291-7bb599c2519a.png)

サーバの実装はC#（.NET CORE MVC）を使いました。

ChatGPTにプロンプトを投げる実装はサーバに書いていますが、コードはたった2行です。
```
ChatClient client = new(model: "gpt-4o", "[APIキー]");
ChatCompletion completion = client.CompleteChat([プロンプト].ToString());
```

1年くらい前に試した時も簡単で驚きましたが、さらに簡単になっていますね..。

# 感想
ものづくり欲が目覚めたので色々と作っていきたいです。
【CSS】ダークモードのCSSを記述する方法

ダークモードのCSSを記述するには以下のように`@media (prefers-color-scheme: dark)`の中に記述します。

```css
@media (prefers-color-scheme: dark) {
  /* ダークモードの設定 */

}

```
 
```css
@media (prefers-color-scheme: dark) {
  body{
    background: #151515;
    color: #F7F7F7;
  }
}

 ```
掛け算の符号を処理して遊ぶ(普通の人には、一生、知らなくてもいい情報)(本当だよ)


x 普通の人には、一生、知らなくてもいい情報

目的
表引き後の符号処理
マイナス方向の配列は、ないので
負の数なしの整数で掛け算して、後で符号を足す

いろいろ
なんでアクセスカウンターが回転するんだ
ちゃんと注意書をかいてあるぞ
エーーーーーーーーーー


結果

![o_coq259.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e7a0fb4e-4ce1-4646-fce6-f6fe9df426de.jpeg)



プログラム

オンラインコンパイラ

```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    int a = -1;
    int b =  1;
    int p;
    int c = 1234;
    
    p = a ^ b;
    p = (p >> 31);
    c = (c ^ p) - p;
    printf("%d",c);
    
}


```
<table>を使って文の頭をそろえる

お疲れ様です。

今日は、昨日から自己紹介ページに自分の職歴を載せている箇所があるのですが、西暦と出来事が空白なく、くっついた状態で箇条書きにして示していましたが、やっぱり微妙と思い、訂正していました。
しかし異動回数が多く、年はわかるのですが何月だったかはっきりせず、省いているところがあります。
本来は2024年7月　〇〇〇　と書きたいのですが、
一部は2024年　〇〇〇　と書いており、全体を見たときにガタガタになってしまっているのをどうにかしようと調べてみました。

今回参考にさせていただいたページは以下のリンクです。勉強になりました！
[歯車加工技術研究所](https://kwk-gear.com/column/Web/HTML_CSS/20201222_How_to_insert_a_space.php)

始めに試したのは、 &ensp; などの空白を駆使してそろえようと思いましたが、 &ensp; 1つ書いたところで、できる空白は全角スペース1つ分くらいの空白…
これでは全然そろわなかったですし、

```diff_html
<span>2024年7月</span>&ensp;&ensp;&ensp;出来事
```
と書いたところでごちゃごちゃ感が否めず、すぐに止めちゃいました:frowning2:
<br>
上記リンク様にもあるように、最終的には table 要素を使ってそろえることにしました。
```diff_html
<table>
 
 <tr>
  <td><span>2024年7月</span></td> <td>出来事</td>
 </tr>
 <tr>
  <td><p><span>2024年</span></td> <td>出来事</td></p>
 </tr>
 
</table>
```
![291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/25a8303e-c305-126d-7b95-85d5ce5c6d62.png)

という書き方にしました。するとこちらが空白していしなくても文の頭がそろいました！
結果は画像の通りです。

ちなみに
```diff_html
<tr>
 <td><p><span>2024年</span></td> <td>出来事</p></td>
</tr>
```
![292.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/2604baf1-6cf5-a4b8-342a-675857d6597e.png)
/p の位置が違うと崩れてしまったので、書く順番は注意が必要なようです。
<br>
そしてcssにて
span {
 padding-right: 〇〇px;
}
とすれば空白を好きな幅で空けることもできました。
table は表を作るときに使う要素だと思い込んでいましたが、今回のような箇条書きをする部分にも使えるんだと学びがありました:relaxed:
RTK QueryのキャッシュキーをRedux DevToolsで確認する

RTK Queryのカスタムフックの引数をRedux DevToolsで確認してみました。

始めにcreateApi関数でAPIを作成します。
baseUrlにはダミーデータが取得できるURLを設定します。
```react:apiSlice.ts
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";

export const apiSlice = createApi({
  reducerPath: "api",
  baseQuery: fetchBaseQuery({
    baseUrl: "https://jsonplaceholder.typicode.com",
  }),
  endpoints: (builder) => ({
    getAllUser: builder.query({
      query: () => "/users",
    }),
  }),
});

export const { useGetAllUserQuery } = apiSlice;
```

次にstore.tsに記述を追加します。
```react:store.ts
import { configureStore } from "@reduxjs/toolkit";
import { apiSlice } from "./apiSlice";

export const store = configureStore({
  reducer: {
    [apiSlice.reducerPath]: apiSlice.reducer,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware().concat(apiSlice.middleware),
});

```

最後にRTK Queryが自動生成したカスタムフックの呼び出し部分を記載します。
カスタムフックであるuseGetAllUserQueryの引数はキャッシュキーとして使用されます。データがキャッシュに存在しない場合は再取得されます。

ここではユーザー情報の取得処理のため、引数を「users」と指定します。

```react:reduxPractice.tsx
import { useGetAllUserQuery } from "./apiSlice";

export const ReduxPractice = () => {
  const { data } = useGetAllUserQuery("users");

  return (
    <div>
      {data.map((d: any) => {
        return <div key={d.id}>{d.name}</div>;
      })}
    </div>
  );
};
```

Redux DevToolsで確認してみます。
すると、先ほど引数で設定した「users」はキーとして設定されていることがわかりました。

![スクリーンショット 2024-07-29 23.06.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689023/0243fde3-9213-50e2-4475-59b56c1e5a26.png)


参考：
https://redux.js.org/tutorials/essentials/part-7-rtk-query-basics#query-arguments-and-cache-keys

## キャッシュから取得していることを確認する

同じキャッシュキーを使用して複数呼び出してみます。
先ほど作成したreduxPractice.tsxに追記します。

```react:reduxPractice.tsx
import { useGetAllUserQuery } from "./apiSlice";

export const ReduxPractice = () => {
  const { data } = useGetAllUserQuery("users");
  + const { data: usersData } = useGetAllUserQuery("users");

  + console.log("data", data);
  + console.log("usersData", usersData);

  return (
    <div>
      {data.map((d: any) => {
        return <div key={d.id}>{d.name}</div>;
      })}
    </div>
  );
};
```

コンソールには2つの出力がされていますが、Redux Toolsでは1度しか呼び出されていないためコンソールに出力されているusersDataはキャッシュからの出力だということがわかります。
![スクリーンショット 2024-07-30 0.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689023/ff48157b-f852-d622-cfde-c66849f29801.png)

![スクリーンショット 2024-07-29 23.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689023/ee3056c9-cc0e-6295-8025-ca69d982cea1.png)
テストタイプとテストレベルについてのまとめ

## 前書き
JSTQBの勉強をしていて、曖昧となっている「テストレベル」「テストタイプ」を自分なりに非常に簡略化してまとめていきます

## テストレベル（4）
* コンポーネントテスト
* 統合テスト
* システムテスト
* 受け入れテスト


## テストタイプ（4）
* 機能テスト
* 非機能テスト
* ホワイトボックステスト
* 変更関連のテスト（確認テスト・リグレッションテスト）

:::note info
上記テストレベルとテストタイプは、JSTQB Foundation Level のシラバス（Version 2018V3.1.J03）で定められてるものとなります。
:::

## テストレベルとは？
V字モデル開発の上流工程に該当する3つのフェーズを確認するテスト
* 要求定義 - システムテスト
* 基本設計 - 統合テスト
* 詳細設計 - コンポーネントテスト（単体テスト）
* 実装 - （コンパイラ）

## テストタイプとは？
テスト対象の、特定の性質をテストするための活動。それぞれのテストタイプでは、
* 機能テスト…システムが「何をするべきか」を確認する
* 非機能テスト…システムが「どのように上手く」振る舞うかを確認する。（例）性能効率性やセキュリティなど
* ホワイトボックステスト…システムの内部構造や実装に基づいて確認する
* 変更関連のテスト…システムの変更をした後、変更が問題なく行えている事と、他の部分に悪い影響が出ていない事を確認する。（例）欠陥を修正した後の確認テストや機能を追加した後のリグレッションテストなど
:::note info
全てのテストレベルで、全てのテストタイプが適応できる。
:::

## 例題
下記のシステムについて、テストレベルとテストタイプを考えてみます。
#### ショッピングサイト。ユーザー情報（氏名、生年月日、メールアドレス、パスワード）を登録しておき、会員画面にログインできる。お気に入り登録や購入履歴、カートへの追加や削除ができる。

* 単体テスト　ユーザー新規登録ができる
　├ 機能テスト　氏名などの情報が定められた要件通りに入力でき、保存される
　├ 非機能テスト　電波の不安定な状況下での登録機能の確認
　├ ホワイトボックステスト　パスワードは大文字を含み、8文字以上という要件がある場合、それを考慮する
　└ 変更関連のテスト　パスワードが小文字のみでも登録可能な欠陥を修正した後の確認テスト
 
* 統合テスト　ユーザーを新規追加し、登録した情報を使ってログインできる
　├ 機能テスト　ログインできる
　├ 非機能テスト　電波の不安定な状況下でのログイン 
　├ ホワイトボックステスト　一度登録した情報を削除してログイン不可を確認
　└ 変更関連のテスト　欠陥修正後の確認テスト
 
* システムテスト　ユーザー新規登録、ログインをして商品の購入ができる
　├ 機能テスト　商品の購入までできる
　├ 非機能テスト　購入した商品の情報が履歴としてデータベースに保存される
　├ ホワイトボックステスト　一度購入をキャンセルして別の商品を購入したとき、正しい商品が購入できる
　└ 変更関連のテスト　欠陥修正後の確認テスト
 
* 受け入れテスト　ショッピングサイトとして、一連の活動ができる
　├ 機能テスト　ユーザー登録、ユーザー情報の修正、商品の購入などができる
　├ 非機能テスト　保存されたユーザー情報には登録ユーザーしかアクセスできない
　├ ホワイトボックステスト　ログアウトすると、ログインor新規登録をするまで購入不可
　└ 変更関連のテスト　有料会員のみ送料無料の機能を追加したときのリグレッションテスト


## あとがき
システムのテストについて自分なりに考えることで、「テストレベル」と「テストタイプ」について理解を深めることができました。非機能テストとホワイトボックステストについては理解が不十分なので、さらに学習を進めていきます！
【Javascript】よく使うオブジェクトの操作を覚える

# はじめに
Javascriptでよく使う構文を勉強していく中で、よく使うオブジェクトの操作について勉強しましたので、共有いたします。
他にも、オブジェクトの操作でよく使うものがありましたら、共有くださると幸いです。

# オブジェクト操作一覧

勉強していた中で特によく使うと言われているオブジェクト操作一覧についてご紹介します。

### プロパティ追加
プロパティを追加する際には、`obj.キー = 値`もしくは`obj["キー"] = 値`で追加します。このとき、キーは追加するオブジェクトに**存在していない**ことが条件です。
また、記法のうち`obj.キー`を**ドット記法**、`obj["キー"]`を**ブラケット記法**と呼びます。

```js
// オブジェクト作成
const obj = {
    name: "Yuto",
    age: 26,
};

// プロパティ追加(ドット記法)
obj.country = "Japan";
console.log(obj); // { age: 26, country: "Japan", name: "Yuto" }

// プロパティ追加(ブラケット記法)
obj["country"] = "Japan";
console.log(obj); // { age: 26, country: "Japan", name: "Yuto" }
```

また、別のオブジェクトに複製したい場合は、スプレッド構文(`...obj`)で複製でき、追加してプロパティの設定も可能です。

```js
// オブジェクト作成
const obj = {
    name: "Yuto",
    age: 26
};

// オブジェクト複製
console.log({...obj, country: "Japan", language: "Japanese"}); // { age: 26, country: "Japan", language: "Japanese", name: "Yuto" }
```

さらに、`Object.assign(obj1, obj2)`とすることで、オブジェクト同士を結合することもできます。

```js
// オブジェクト作成(2個)
const obj1 = {
    name: "Yuto",
    age: 26
};
const obj2 = {
    country: "Japan",
    language: "Japanese"
};

// オブジェクト複製
console.log(Object.assign(obj1, obj2)); // { age: 26, country: "Japan", language: "Japanese", name: "Yuto" }
```

### プロパティ取得
`obj.キー`もしくは`obj["キー"]`でプロパティを取得できます。
また、オブジェクトのキーを全て取得する場合は`Object.keys(obj)`、値を全て取得する場合は`Object.values(obj)`、キーと値を両方取得する場合は`Object.entries(obj)`をそれぞれ使います。

```js
// オブジェクト作成
const obj = {
    name: "Yuto",
    age: 26,
    country: "Japan"
};

// プロパティ取得(ドット記法)
console.log(obj.country); // "Japan"

// プロパティ取得(ブラケット記法)
console.log(obj["country"]); // "Japan"

// オブジェクトのキー取得
console.log(Object.keys(obj)); // ["name", "age", "country"]

// オブジェクトの値取得
console.log(Object.values(obj)); // ["Yuto", 26, "Japan"]

// オブジェクトのキーと値を両方取得
console.log(Object.entries(obj)); // [["name", "Yuto"], ["age", 26], ["country", "Japan"]]
```

### プロパティ更新
記法はプロパティ追加と同じですが、更新の場合は、キーが追加するオブジェクトに**存在する**ことが条件です。

```js
// オブジェクト作成
const obj = {
    name: "Yuto",
    age: 26,
    country: "Japan"
};

// プロパティ更新(ドット記法)
obj.age = 27;
console.log(obj); // { age: 27, country: "Japan", name: "Yuto" }

// プロパティ更新(ブラケット記法)
obj["age"] = 27;
console.log(obj); // { age: 27, country: "Japan", name: "Yuto" }
```

### プロパティ削除
オブジェクトからプロパティを削除する場合は、`delete obj.キー`もしくは`delete obj["キー"]`と記述します。

```js
// オブジェクト作成
const obj = {
    name: "Yuto",
    age: 26,
    country: "Japan"
};

// プロパティ削除(ドット記法)
delete obj.country;
console.log(obj); // { age: 26, name: "Yuto" }

// プロパティ削除(ブラケット記法)
delete obj["country"];
console.log(obj); // { age: 26, name: "Yuto" }
```

### プロパティ存在チェック
in演算子(`"キー" in obj`)を用いることによって、オブジェクトにプロパティが存在するか否かをチェックできます。

```js
// オブジェクト作成
const obj = {
    id: 1,
    name: "Yuto",
    age: 26
};

// プロパティ存在チェック
console.log("name" in obj); // true
console.log("address" in obj); // false
```
WiresharkでVLAN tagを確認するのが面倒らしい

こんにちは。E-kan株式会社の藤尾です。

タイトルの通りWiresharkでVLAN tagがどうなっているか確認しようとしただけなのに、手順が思ったより複雑だったという話を聞いたので、ここにメモします。

どういうことかというと、つまりこういう事らしいです。

https://wiki.wireshark.org/CaptureSetup/VLAN#windows

>Windows has no built-in support mechanisms for VLANs. There aren't separate physical and VLAN interfaces you can capture from, unless a specialized driver that adds such support is present.
>So whether you see VLAN tags in Wireshark or not will depend on the network adapter you have and on what it and its driver do with VLAN tags.

VLAN IDが一覧にないから見ずらいな～などという話ではなく、モノによってはサポートしていないと言っています。
<br>
そのお話をしてくれた方がIntelのNICだったらしいのですが、解決方法はレジストリをいじることらしく「結構な大事じないか……！」となりました。
PCﾁｮｯﾄﾀﾞｹﾜｶﾙ人間としてはレジストリの編集はあまりしたくない。

https://www.intel.com/content/www/us/en/support/articles/000005498/ethernet-products.html

<br>
ちなみに、私のPCのNICはRealtecだったのですが、調べてみたところ、そちらはドライバの設定を変えることが可能みたいです。以下には一応レジストリの編集についても書いてありました。

https://osqa-ask.wireshark.org/questions/5996/how-to-configure-realtek-pcie-gbe-family-controller-to-capture-vlan-tag-packet/

<br>
設定画面はこんな感じでした。
変更した記憶がないので、デフォルトで有効みたいですね。こんな面倒くさそうな話も知らなったわけです。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/b2f47459-81b8-f447-4f07-9e51dd17bf65.jpeg)

<br>
ちょっとパケット見ようと思ってこんなトラブルシューティングさせられたら、かなり疲れそうなので事前に知識を得られて良かったです。


# 最後までお読みいただき、ありがとうございます！
イーカンは世界中のエンジニアとともに、ワクワクしたITの未来を作り上げることを楽しみにしています。

新しいテクノロジーとアイデアをブレンドして、もっと便利で効率的なソリューションを世界へ届けることに情熱を注いでいます。

イーカンの目指す未来は、テクノロジーの進化が生活やビジネスに影響を与えて、社会をポジティブな方向に進めていくことです。世界中のエンジニアのビジョンや目標をサポートし、共に成長できることを期待しています！

最新情報やイベントについては、弊社ウェブサイトやSNSアカウントを通じてご案内していきますので、ぜひご覧ください。
エンジニアの皆様との新たな出会いに感謝し、これからも一緒に未来を切り拓いていけることを楽しみにしております。

私たちとともにITの発展を追求していきましょう！

[E-kan株式会社　イーカンカブシキガイシャ]
ウェブサイト：https://e-kan.tokyo/
採用サイト：https://en-gage.net/e-kan/
Twitter：https://twitter.com/EkanTw
Facebook：https://www.facebook.com/ekan0507
centos9でlibyaml-develが見つからない

conohaサーバーを借り、ruby3.2.2をasdf経由でインストールしようとしていた際、libyaml-develが必要だからインストールしてね、と出るのにインストールコマンドを打つと、

```:command
$ sudo dnf install -y libyaml-devel
Last metadata expiration check: 0:00:43 ago on Mon 29 Jul 2024 11:00:14 PM JST.
No match for argument: libyaml-devel
```
となり、見つからないとなってしまった。その際解決した手順の忘備録です。

## 対処法

下記ページの通りに実行したところ、無事インストールできrubyのインストールも完了しました。

https://github.com/rbenv/ruby-build/discussions/2197

参考ページの通り、以下のコマンドを実行します。
```:command
sudo dnf install -y epel-release
sudo dnf config-manager --enable epel
sudo dnf config-manager --set-enabled crb
sudo dnf repolist | grep crb
sudo dnf install libyaml libyaml-devel
```

## 解決理由を調べてみる
まず、EPELというのは Extra Packages for Enterprise Linux の略で、標準のCentOSやRHELリポジトリにない追加パッケージを提供してくれるもののようです。
それをインストールし、有効化しているのが以下コマンドです。
```
sudo dnf install -y epel-release
sudo dnf config-manager --enable epel
```

そして、CRBというのがCodeReady Builderの略で、こちらも開発用ライブラリやツールを提供してくれます。
（以前のPowerToolsリポジトリ、という言葉が散見されるので調べてみると、下記のように似た記事が出てきます。両者の違いを調べるまではしていませんが、どうやらcentos9ではPowerToolsは利用でず、CRBを利用する形になっているようです。これでちょっとハマりました。）

https://pocketstudio.net/2022/01/28/enable-centos-stream-8-powertools/

https://furuya7.hatenablog.com/entry/2022/06/16/083845
> 問題点: 「CentOS Stream 9」では、「powertools」リポジトリが使えません。

それを有効化します。
```
sudo dnf config-manager --set-enabled crb
```

ちゃんと有効化されているか確認。
 ```
sudo dnf repolist | grep crb
```
私の場合は以下のように出力されました。
```
crb                 CentOS Stream 9 - CRB
```

そして、当初の目的であるパッケージをインストールして完了です。
 ```
sudo dnf install libyaml libyaml-devel
```

要するに、centos streamにないパッケージの広範な有効化をした結果、libyaml-develのインストールができたということでしょうか。（直接の解決要因はcrbのような気がします。が、間違っていましたら申し訳ないです）

これでcentos9環境でもrubyやrailsの作業ができそうです。よかった。
AtCoder 勉強記録[C++] その35

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Prefix?
[B - Prefix?](https://atcoder.jp/contests/abc268/tasks/abc268_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  string s, t;
  cin >> s >> t;
  for(int i = 0; i < s.size(); i++){
    if(s[i]!=t[i]) {
      cout << "No" << endl;
      exit(0);
    }
  }
  cout << "Yes" << endl;
}
```
### 解法
`S`の文字数分の回数ループを回しその間`S`と`T`が一致するかどうかを判定することで結果が求まる。
【Python】DataFrame系ライブラリ統一されてた

PythonにはDataFrameを扱うライブラリがいくつかあり、人それぞれで好きなものが違うと思います。
王道の`pandas`を使う人、APIの清潔さに惹かれて`polars`を使う人（僕）、GPUで高速化するために`cuDF`を使う人、頑なに`pyarrow`を使う人（見たことない）など...

これらを統一的に扱える`narwhals`というライブラリがあったので紹介します。DataFrameを引数に取るようなライブラリを開発するときは、積極的に使っていきたいですね。

https://github.com/narwhals-dev/narwhals

ちなみに"narwhal"はイッカクというクジラの一種で、こう名付けた理由は "coz they are so awesome" だかららしく、こちらの[YouTubeの動画](https://www.youtube.com/watch?v=ykwqXuMPsoc)の通りとのことです。欧米のノリ、微塵もついていけない。

## 使い方

多くのAPIは`polars`から来ています。`polars`が一番きれいなので当然の設計です。DataFrameの引数・返り値を`FrameT`で型注釈して`narwhalify`で関数をデコレートすることで任意のDataFrameで動きます。

``` python
import narwhals as nw
from narwhals.typing import FrameT

@nw.narwhalify
def func(df: FrameT, value: float) -> FrameT:
    return df.with_columns(
        x_added=nw.col("x") + value
    )
```

例えば、

``` python
import polars as pl
func(pl.DataFrame({"x": [1, 3, 5]}), 10)
```

```
shape: (3, 2)
┌─────┬─────────┐
│ x   ┆ x_added │
│ --- ┆ ---     │
│ i64 ┆ i64     │
╞═════╪═════════╡
│ 1   ┆ 11      │
│ 3   ┆ 13      │
│ 5   ┆ 15      │
└─────┴─────────┘
```

``` python
import pandas as pd
func(pd.DataFrame({"x": [1, 3, 5]}), 10)
```

```
   x  x_added
0  1       11
1  3       13
2  5       15
```

`narwhalify`は[methodにも使える](https://narwhals-dev.github.io/narwhals/basics/complete_example/)みたいです。
以上です。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（79/100）

【79日目】
トピック 8：SAPS/4HANAの製造指図（11/15）

≪問題79≫
製造指図の場合は、原価対象管理（COC）を指図関連基準または製品関連基準で実施することができます。以下のどの事項を考慮する必要がありますか。
（２つ選択）
□製品関連基準COCは、連産品の生産で使用される。
□指図関連基準COCは、フレキシブル生産環境で有利である。
□製品関連基準COCでは、すべての原価が製品原価コレクタに借方転記/貸方転記される。
□指図関連基準COCでは、個別の製造指図には原価セグメントが割り当てられない。

≪解答≫
□製品関連基準COCは、連産品の生産で使用される。
■指図関連基準COCは、フレキシブル生産環境で有利である。
■製品関連基準COCでは、すべての原価が製品原価コレクタに借方転記/貸方転記される。
□指図関連基準COCでは、個別の製造指図には原価セグメントが割り当てられない。

≪解説≫
◆指図関連の原価対象管理の特徴は以下のとおりです。
（1）指図決済では、原価要素に従って貸方転記されますが、この決済は、決済プロファイルを使用して制御されます。
（2）指図関連の原価対象管理は、次のような場合に有益です。
・フレキシブル生産環境
・フレキシブルな製品範囲
・個々の見込製番の原価管理
・指図ごとの原価管理
・高額な段取費用
・連産品の製造
◆製品関連の原価対象管理の特徴は以下のとおりです。
（1）個々の製造指図には、原価セグメントや決済規則がなく、すべての原価が製品原価コレクタに借方転記および貸方転記されます。
（2）製品関連の原価対象管理は、次のような場合に有益です。
・見込生産
・繰返生産や大量生産
・収益性分析のみでの受注管理
このように指図関連と製品関連の原価対象管理には、それぞれ適した利用環境と特徴がありますので、状況に応じて最適な方法を選択することが重要です。
Autowareの環境構築でひっかかった(./setup-dev-env.sh)

# はじめに
本記事は[【2024年1月版】Autoware x AWSIM の環境構築 (Ubuntuインストール後から)](https://qiita.com/Bob_Alice/items/1c8120dd5f5ee69b381c)を基に実施しています。

# 引っかかった箇所
Autoware の環境構築部分で引っかかりました。
```
./setup-dev-env.sh
```

# エラーの確認
エラー箇所をみると
```
TASK [autoware.dev_env.cuda : Install cuda-drivers] ...(以下略)
```
の部分でどうも**cuda-drivers**のインストール中にパッケージの依存関係の問題が発生しているっぽいです。

# やったこと
#### 1. パッケージリストの更新：
パッケージリストを最新の状態に更新し、利用可能なアップデートをすべて適用します。
```
sudo apt-get update
sudo apt-get upgrade
```
#### 2. 破損したパッケージの修正： 
破損したパッケージを修正します。
```
sudo apt-get --fix-broken install
```
#### 3. 特定のCUDAバージョンのインストール：
CUDAドライバのバージョンを指定して手動でインストールを試みます。
自分は**nvidia-driver-550 - third-party non-free**を入れたので、それにあったCUDAドライバを指定しました。
```
sudo apt-get install cuda-drivers-555
```
#### 4. 古いNVIDIAパッケージのクリーンアップ：
古いNVIDIAパッケージが競合している可能性があるため、以下のコマンドでクリーンアップします。
```
sudo apt-get remove --purge '^nvidia-.*'
sudo apt-get autoremove
sudo apt-get autoclean
```
#### 5. 再インストールの試行：
上記のステップを実行した後、再度スクリプトを実行すると成功しました。
```
sudo ./setup-dev-env.sh
```

# nvidiaドライバでひっかかるとき
[UbuntuにAWSIM（自動運転シミュレータ）をインストールする](https://qiita.com/Yujisuper/items/b53a29e2e5949a3a24c7)によると**nvidia-driver-XXX-open**のように-openがついたドライバはうまく認識しないみたいです。
自分はたまたまopenじゃないやつだったけど、けっこうトラップありますね。
他には**Nouveauの無効化**とかあったけどYoutubeのやつを真似したら問題なかったです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/cJHIKrMudnY?si=odzuqe2NH-csoVkr" 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>

# おわりに
はじめてデュアルブートでLinux環境を触ってるけど便利だわ…。
ガレリアPC改造&増設系も意外に説明がないから、そっち書いていってもいいですね。
paizaの問題をPowerShellで解いてみた【文字列収集 (paizaランク S 相当)】

この記事はpaizaのプログラミング問題をPowerShellで解いてみようという試みの記事です。

## paizaのプログラミング問題とは？
ブラウザ上でコードを書いて実行できる、無料プログラミング練習問題集です。

## 難易度別に問題を選ぶ
- 問題文を読んで、解答コードを書く
- 提出するとテストケースが実行されて結果をわかる
- 正解・不正解だけではなく、解答コード例や解説も見ることができるので、プログラミングの習得から復習まで活用できます

## こんな人におすすめ
- プログラミングスキルの腕試しをしたい方
- プログラミングのスキルアップしたい方
- 新しい言語にチャレンジをしたい方

通常は問題をc言語やJavaなどで解くのですがPowerShellで解いてみます。

## 問題

文字列収集 (paizaランク S 相当)

https://paiza.jp/works/mondai/real_event/word_collection


### 問題文
あなたは文字列の愛好家で、文字列を収集することにとても熱心です。

文字列は市場で高値で取引されています。今、市場には N 個の文字列が出まわっており、文字列 S_i (1 ≦ i ≦ N) の価格は P_i です。 あなたは数ある文字列の中でも、とくに先頭がある特定の文字列で始まる文字列に興味があり、そのような文字列をすべて買い占めたいです。例え、同じ文字列が複数売っていたとしてもそのすべてを買います。

そこで、市場に出回っている N 個の文字列 S_i とそれぞれの価格 P_i (i ≦ i ≦ N)、また、M 個のクエリ文字列 Q_i (1 ≦ i ≦ M) が与えられるので、それぞれのクエリ Q_i に対し、市場に出回っている文字列の中で先頭が Q_i で始まる文字列すべてを買い占めるのに必要な金額を出力するプログラムを作成してください。

### 入力
入力は以下のフォーマットで与えられます。

N M
S_1 P_1
S_2 P_2
...
S_N P_N
Q_1
Q_2
...
Q_M

ただし、文字列 S_i, Q_j (1 ≦ i ≦ N, 1 ≦ j ≦ M) は英小文字のみから構成されます。P_i は整数です。


### 出力
それぞれのクエリに対し、必要な金額を一行に出力してください。


### コード
~~~
# 文字列数Nとクエリ文字列数Mを受け取る
$N,$M=(read-host).split()
$N=[int]$N
$M=[int]$M

# 文字列と価格をリストに分割して格納
$strings=@()
$price=@()
for($i=0;$i -lt $N;$i++){
    $s,$p=(read-host).split()
    $strings+=$s
    $price+=$p
}

# クエリを格納
$queries = @()
for($i = 0;$i -lt $M;$i++){
    $queries+=(read-host).split()
}

# クエリごとに合計金額を計算して出力
foreach($q in $queries){
    $total=0
    for($i =0;$i -lt $N;$i++){
        if($strings[$i].StartsWith($q)) {
            $total += $prices[$i]
        }
    }
    write-host $total
}

~~~

### 解説
問題文をそのままプログラムに落とし込むと完成します。
途中で使っているStartsWith($str)は$strで始まるか？という意味、$strで始まれば$True。同じようなメソッドのEndsWith($str)は$strで終わるか？の意味。

### 終わりに
noteにPowerShellのサンプルコードの記事を書いています。そっちも見てね
[PowerShellまとめ](https://note.com/mahalo_/m/m421b17a881c8)

https://note.com/mahalo_/m/m421b17a881c8
【java】String.equalsでNullPointerExceptionを回避する

## はじめに
初めまして、AraNekoです。
初めての投稿ということで、現場で学んだ小技をメモがてら記事として残しておこうと思います。
文章の作成が苦手なので、ChatGPTにいくつか修正してもらいました。

## equalsで比較する
```java:test.java
String test1 = null;
String test2 = "テスト";

System.out.println(test1.equals(test2));
```
### 解説
`test1`が`null`である状態でequalsメソッドを呼び出しています。この場合、`test1`が`null`であるため、メソッド呼び出し時に`NullPointerException`が発生します。

```
java.lang.NullPointerException
```
## nullポ回避法
次に`NullPointerException`の回避するための方法を紹介します。
```java:test.java
String test1 = null;
String test2 = "テスト";

System.out.println(test2.equals(test1));
```
### 解説
このコードでは、equalsメソッドを`test2`に対して呼び出しています。`test2`には値が入っているため、equalsメソッドの呼び出し時に`NullPointerException`は発生しません。また、`test2`と`test1`を比較しているため、結果は`false`になります。
したがって、メソッドを呼び出すオブジェクトが`null`でないことを保証することで、`NullPointerException`の発生を回避できます。
```
false
```

## おわりに
最後まで読んでいただきありがとうございます！
初めての投稿で苦戦しましたが、なんとか形にできました。
これからも頑張っていきます！
掛け算を分けて計算してあそぶ


参考

https://qiita.com/caa45040/items/6b4044b200e89f7227b5

x 過去ログを見よ。

目的
8x8のハードウエア乗算器等を拡張する
掛け算を分けて大きい数を計算する
4回、計算する必要がある


結果


![o_coq258.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/da787587-bae8-d840-022a-5ecbb3e2b670.jpeg)



プログラム

オンラインコンパイラ

```c++

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    //1234 x 5678の計算
    //7,006,652
    int a=12; int b=34;
    int c=56; int d=78;
    int k;
    //   (672 0000)  (936 00)    (1904 00)   (2652)
    k = (a*c*10000)+ (a*d*100) + (c*b*100) + (b*d);
    printf("%d",k);
}


```
VsCodeの拡張機能Mark Sharpが便利そう

# はじめに

[vscode market place](https://marketplace.visualstudio.com/vscode)のFeaturedを見ていたらこんなのを見つけた。

[Mark Sharp](https://marketplace.visualstudio.com/items?itemName=jonathan-yeung.mark-sharp)

マークダウンで書いたプレビュー画面で編集できるらしい

なにこれ便利そう

公式サイト

https://www.marksharp.co/

というわけでこの記事をmarksharpで書いてみる

# 使ってみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302637/4e356330-6c39-c036-bcdf-b98ab3ac8f2e.png)

右上のMと上矢印​を押すと使用開始

新たにMarkSharpのタブが表示される

もとのMarkdownのを変更してもすぐにMarkSharpの画面に変更が反映。逆もしかり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302637/7aafec07-20e7-232b-be65-1d3d75e5bcb2.png)

見出しをクリックすると編集できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302637/117a43fe-ea5f-228c-dd6a-906889d62cf9.png)

なおマークダウンの表示をしているときは全画面選択ができない

# 料金プラン

無料と買い切りの$12のライセンスがある

## 無料

以下和訳

- VS CodeでのシングルペインMark Sharp体験の基本を提供。
- GitHub Flavored MarkdownのWYSIWYG（見たままの状態で表示）レンダリング。
- シームレスなエディタの切り替え。
- 基本的なスラッシュコマンド。
- テーブルのレンダリング。
- フロントマターの編集。
- KaTeX数式の表示。

## 有料

同様に以下和訳

Mark Sharpの全機能を永久ライセンスで解放しましょう。以下の機能が含まれます：

- 強力なスプレッドシートのようなテーブル編集機能
- お気に入りのVS Codeテーマに合わせた完全なテーマサポート
- 完全にアンロックされたスラッシュコマンドで素早くMarkdownを記述 - テーブル、図、画像、脚注を数回のキーストロークで作成
- Mermaidダイアグラムのサイドバイサイド編集とレンダリング、すべてのチャートタイプに対応する組み込みテンプレート
- ストリームラインされた画像ワークフロー - ドキュメントに画像をドラッグ＆ドロップするだけ
- ドラッグ可能な要素 - 要素を直感的にドラッグしてドキュメントを再配置
- その他多くの機能！

じぶんだけかもしれないけ​まあまあ日本語が変な感じになるのでそこは直ってほしい

今後に期待
【JavaSilver】モジュール

# モジュール				
* module -info.javaのファイル名は固定。			
* Javaモジュールシステムのニーズ			
・信頼できる構成		
→モジュール単位で必要なモジュールの不足を検証する	
・強力なカプセル化		
				
* モジュールシステム			
・利用するモジュールは、module-info.java内で宣言されていなければならない。	
・デフォルトで、モジュールは、モジュールが動作するディレクトリ内にはアクセスができる。	
・従来のモジュールを使用していないパッケージは、構成違いによって自動モジュールと無名モジュールに分類される。		
				
* 無名モジュール			
・module-info.javaはもたない。		
・クラスパス上に存在するクラスファイル。		
・すべてのパッケージが公開である。		
				
* モジュールには複数のjavaパッケージを含めることができ、			
javaパッケージは単一のモジュールにのみ含めることができる。		
				
* JDKをモジュール化する理由			
・アプリケーションモジュールとJDKのモジュールリンクが容易に構築できる。
・セキュリティとメンテナンス性が向上する。
 
* モジュール化型JDKの利点			
・アプリケーションのサイズをより小さくパッケージ化できる。		
・不必要な内部APIを非公開にすることができる。		
・開発時や実行時に不足しているパッケージを検出できる。		
				
* exports文はこのモジュールから公開するパッケージの指定。			
* export to文はそのモジュール内における公開パッケージを指定する。
公開するパッケージは1文に1つだが、to句を使用した公開先のモジュールは「,」で区切って、複数列挙できる。		
(例)export foo to boo, bee 		
				
* requires文はそのモジュールが依存するモジュールを指定する。			
				
* クラスの依存関係を調べるコマンド			
jdeps <省略>		
				
* モジュールの依存関係を調べるコマンド			
java --show -module -resolution		
				
* 情報を表示するコマンド			
jdeps --check		
				
* モジュールの解決の様子を出力されるコマンド			
javac --show -module -resolution<省略> 		
				
* 2つのファイルをコンパイルするコマンド			
javac -d <パッケージのルートディレクトリを格納するディレクトリソースファイル名> 		
				
* コンパイル時に必要になるモジュール検索パス(場所)を指定するオプション
--module -path = -p		
				
* モジュールを含めた実行クラス名を指定する場合「-m」、「--module」
* クラスを実行するコマンド			
java -p <モジュールが格納されている場所> -m <モジュール名> / < mainクラスの完全修飾名 >
	
* 複数のモジュールの入力ソース・ファイルの参照先を指定するコマンド
--module -source -path		
				
* 観測可能なモジュールのリストを確認するコマンド			
java --list -modules		
				
* 観測可能なモジュールが検索される順番			
ルートモジュール→コンパイルモジュール→アップグレードモジュール→システムモジュール→アプリケーションモジュール		
				
* モジュール記述子の情報を参照するコマンド			
--describe -module		
				
* モジュールの設定情報を調べるコマンド			
java --describe -module		
jmod describe		
				
* exportsされていないパッケージを一時的に利用するコマンド			
--add -exports		
				
* 循環する依存関係が確認されるとコンパイルは失敗
```java:実装例
module bar {	
    requires foo;
}	
module foo {	
    requires bar;
}	
```	
* カレントディクトリ以外にあるクラスファイルを実行するときは、javaコマンドに-cpオプションを付けて、クラスパスを指定する
モバイルアプリ開発者向け：FlutterとApache Cordovaの比較と選び方

モバイルアプリ開発者の皆さん、アプリ開発においてどのフレームワークを選ぶか悩んでいませんか？今回は、FlutterとApache Cordovaという二つの人気フレームワークについて比較し、それぞれの利点と特徴を解説します。これを読めば、あなたのプロジェクトに最適な選択肢が見つかるはずです。

# 結論

**Flutter**は、美しいUIと高速なパフォーマンスが求められるプロジェクトに最適です。一方、**Apache Cordova**は、Web技術を活用しながらネイティブ機能にアクセスする必要がある場合に適しています。

# 理由

## Flutterの特徴と利点

- **クロスプラットフォーム開発**: 一つのコードベースからAndroid、iOS、Web、デスクトップなど複数のプラットフォームに対応。
- **Dart言語使用**: 高速なパフォーマンスを実現するためのDart言語を採用。
- **ウィジェットベースのUI**: 再利用可能なコンポーネントを組み合わせてカスタマイズ性の高いUIを効率的に作成。
- **ホットリロード**: コード変更後すぐにアプリに反映できるため、開発スピードが向上。
- **一貫したUI**: 各プラットフォームで同じデザインと操作感を提供。

https://flutter.dev/

## Apache Cordovaの特徴と利点

- **Web技術の活用**: HTML5、CSS、JavaScriptを使用しているため、Web開発者にとって学習コストが低い。
- **プラグインアーキテクチャ**: カメラやGPSなどネイティブデバイスの機能に簡単にアクセス可能。
- **ハイブリッドアプリ**: Web技術とネイティブ技術の融合により、多様な機能を持つアプリが開発できる。
- **マルチプラットフォームサポート**: Android、iOS、Windowsなど複数のプラットフォームに対応。

https://cordova.apache.org/

# 具体例

例えば、美しいUIが求められるEコマースアプリや、複雑なアニメーションを多用するゲームアプリにはFlutterが向いています。Flutterのウィジェットベースのアプローチにより、カスタムデザインが容易に実現できます。

一方、既存のWebサイトをモバイルアプリとして提供したい場合や、短期間でのプロトタイプ作成が必要な場合は、Apache Cordovaが適しています。Web技術をそのまま活用できるため、開発スピードが速く、プラグインを使ってネイティブ機能も手軽に利用できます。

# 選び方のポイント

- **プロジェクトの要件**: 要件に応じて、UIの複雑さやネイティブ機能の利用頻度を考慮。
- **既存のスキルセット**: 開発チームのスキルに基づいて選択。Web技術に強いならCordova、Dartを学ぶ意欲があるならFlutter。
- **将来的なメンテナンス**: 長期的なメンテナンスを見据えた選択。Flutterは急成長しているが、Cordovaは成熟して安定。

# まとめ

FlutterとApache Cordovaは、それぞれ異なるニーズに対応できる優れたフレームワークです。プロジェクトの具体的な要件や開発チームのスキルセットに基づいて、最適なツールを選択することで、効率的かつ効果的なモバイルアプリ開発を実現しましょう。
git logコマンドで自分がこれまでにcommitした内容をすべて見る

git repositoryの中で自分がこれまでに書いた差分を振り返ったり、自分が書いた範囲だけで検索したいときなどに使うワンライナーです。

```bash
git log --pretty=format:"%an %h" | grep suzuki | perl -nle 'print "git show $1" if /\b([a-f0-9]{9})\b/' | bash | less
```

`grep` のところで自分のcommitしているときの名前を入れます。

端末上でカラフルに表示したい場合は

```bash
git log --pretty=format:"%an %h" | grep suzuki | perl -nle 'print "git show --color=always $1" if /\b([a-f0-9]{9})\b/' | bash | less -R
```

こんな感じで見れるはずです。

```diff
commit a2c89149042310b34583cfbaf7b2b98ca5b8fea4
Author: suzuki
Date:   Fri Jul 26 12:12:49 2024 +0900

    commitコメントコメントコメント...

diff --git a/src/hello.py b/src/hello.py
index b06e8ccb4..cabe8a15d 100644
--- a/src/hello.py
+++ b/src/hello.py
@@ -112,7 +112,7 @@ def hello(
     ...
     ...
     ...
-    aaa
+    bbb
     ...
     ...
     ...

commit a571ee8f8cf0eec4bc7f57f35f151ca9fbb7598b
...
```

lessコマンドの中で検索できますので、過去に自分が書いたはずの部分がどこだったか忘れたときにこれで検索できます。
基本情報技術者試験 1ヵ月で合格プラン

### 1.目標
基本情報技術者試験を2024/08/31までに合格する
### 2.試験内容
・科目A試験 -全60問で4択
・科目B試験 -多肢択一の長文読解形式。全20問。
→B試験はアルゴリズムとプログラミング、情報セキュリティから出題
### 3.現在の学習状況
ITパスポート取得済みなのでそこそこIT理解はある。
AWSを勉強してきたのでなんとなくインフラ系のイメージはつく。
アルゴリズムとプログラミングが触れてきていないので課題。
### 4.具体的な学習計画
現在~8/10まで　Udemyで基本情報技術者試験の講座を受け、試験内容を把握。
8/11~8/25まで 過去問を解いて不明点を調べ、苦手分野の把握、克服
8/26~8/30まで 模擬試験を解き、自信をつける
絶対値を求めてあそぶ(32ビット系)


参考


https://bleis-tift.hatenablog.com/entry/20070620/1182344738



x 過去ログを見よ

目的
小マイコンで符号操作するための参考にする
(ほぼ記事の紹介)

結果


![o_coq257.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2768e12d-6de2-7333-8f95-82d04459f9d2.jpeg)



プログラム

オンラインコンパイラ


```c++

int myabs(int b){
    
    return (b ^ (b >> 31) ) - (b >> 31);
    
}

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    printf("%d",myabs(-123));
}


```
AWS全冠＆2024 Japan AWS Jr.Champions受賞！新卒2年目の活動と今後の抱負

## はじめに

こんにちは、yasu08_です。2024 AWS Summit Tokyoで、今年のAWSに関する受賞者が発表され、私は以下の2つの賞を受賞しました！

- **2024 Japan AWS Jr. Champions**
- **2024 Japan AWS All Certifications Engineers**

この記事では、主にJr. Championsに焦点を当て、Jr. Championsとは何か、目指した経緯、そして今後の抱負について書いていきます。

「2024 Japan AWS All Certifications Engineers」について、取得に至った動機やメリットについての詳細は別の記事に記載していますので、そちらもぜひご覧ください。

[AWS全冠を新卒2年目で達成した理由と得られたメリット](https://qiita.com/yasu08_/items/6868137639394048c80c)
## 表彰制度について

「2024 Japan AWS Jr. Champions」と「2024 Japan AWS All Certifications Engineers」の各表彰プログラムは、それぞれ異なる観点から評価されるものです。

まずは、それぞれの説明と選出基準についてご紹介します。

### Japan AWS Jr. Championsとは

「Japan AWS Jr. Champions」は、社会人歴1～3年目で突出したAWS活動実績を持つ若手エンジニアに対する表彰プログラムです。日本独自のプログラムで、昨年度に設立されました。

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-jr-champions-criteria/

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-jr-champions/

### Japan All Certifications Engineersとは

「Japan All Certifications Engineers」は、AWS Partner Network (APN) に参加している会社に所属し、「AWS 認定資格を全て保持している」AWSエンジニアを対象とした表彰プログラムです。

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-all-certifications-engineers-criteria/

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-all-certifications-engineers/

## 2024 Japan AWS Jr. Championsを目指したきっかけ

「2024 Japan AWS Jr. Champions」を目指すきっかけは、同じチームの先輩が「2023 Japan AWS Jr. Champions」を受賞していたことでした。その影響で、私も勉強会や技術イベントに参加するようになり、日頃の業務では得られない貴重な経験を積むことができました。また、資格取得を通じて、毎年ラスベガスで開催されるAWS最大のカンファレンス「re:Invent」に参加し、2023 Japan AWS Jr. Championsの方々と交流できたことも大きな影響を受けました。

さらに、チーム内には「2023 Japan AWS Top Engineers」の方もおり、表彰制度に積極的に応募する風土があったため、とても恵まれた環境でした。

## 選出されるには

Japan AWS Jr. Championsの評価では、資格取得だけでなく、積極的なアウトプットや発信が重視されます。

💡 **Japan AWS Jr. Champions への期待**
2024 Japan AWS Jr. Champions の皆様には、今後さらに AWS のスキルアップをし、外部への発信を行う人材になることを期待しています。以下のような方を対象にしています。 
- 自らの学びや経験をアウトプットし、積極的にコミュニティへ貢献できる方
- AWSに関する知識や経験を発信し、若手のロールモデルとなれる方
- 技術力を高め、次のステップとして [Japan AWS Top Engineers](https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-top-engineers-criteria/) への選出を目指す方
- 将来的に [AWS Ambassadors](https://aws.amazon.com/partners/ambassadors/) へのステップアップが期待される方

応募には、「AWSを学び始めたきっかけ」と以下の3つのカテゴリの記載が必要でした。
- **Challenge**: AWS に関して実践してきたチャレンジ (500 文字以内)。例えば、AWS の技術的な挑戦や、新しいことへのチャレンジなどです。
- **Influence**: 周囲に与えた影響 (500 文字以内)。例えば、コミュニティのリードや、自ら起点となって発信しているかなどです。
- **Output**: アウトプットを通じた周囲への貢献 (500 文字以内)。例えば、勉強会や発表、外部イベント登壇、社内トレーニング整備などです。

私は「グループ会社を含めた勉強会への登壇」「AWSリソースを最大限に活用したIaCコードの自動生成システム構築」等の活動を評価していただき、選出されたと考えています。

業務でAWSを利用していない人でも、3つのカテゴリにまつわる行動ができれば、選出される可能性は十分にあります。

## 今後について

Jr. Championとして今後取り組んでいきたいことは以下の通りです。

1. **技術力の向上**
    - Jr. Championsの活動（Meetupや勉強会）を通じて、さらに技術力を向上させます。
2. **影響力について学び、発揮する**
    - 毎月のイベントや勉強会で様々な人の発表や話を聞き、周囲に影響を与えるスキルを学びます。
    - Jr.Championsという肩書きを活かし、社内外問わずイベントや勉強会で登壇して周囲に良い影響を与えていきます。
3. **自らのキャリアビジョンの明確化**
    - 明確なキャリアビジョンはまだ描けていませんが、行動と経験を通じて目指すべき姿がクリアになると信じています。AWSの利用促進や技術情報の発信を通じて多くの人と対話し、様々な経験を積むことで、自分の目標を明確にしていきたいと考えています。

1年の任期で再任はないため、後悔のないように取り組んでいきたいです！

## さいごに

将来的に `AWS Top Engineers` さらにはその先の `AWS Ambassadors` になれるよう日々取り組んでいきたいと思います！

今後も定期的にJr.Championsとしての活動や経験を記事に残していきたいと思います。これからも新しい挑戦を続け、さらに成長していきたいと思います。

最後までお読みいただき、ありがとうございました！
【Angular】HttpClientのObservableはunsubscribe不要

rxjsって難しいけど、うまく書けた時ガッツポーズを決めちゃう泉（[@izumin_0401](https://twitter.com/izumin_0401)）です。

## ブログ記事はこちら

https://traveler0401.com/angular-httpclient-observable-unsubscribe

# unsubscribeしてる？
Angularでは何かとObservableを扱うと思います。

で、一般的にObservableはngOnDestroyとかでunsubscribeすることが多いと思います。

で、気になって色々調べてみたわけです。

# Observableには有限と無限がある
こんなマニアックな情報知ってる人少ないと思うけど、Observableには有限と無限があります。

たとえば、HttpClientのメソッドから返却されるObservableは有限なので、[unsubscribe](https://traveler0401.com/angular-unsubscribe/)する必要がありません。

逆に（逆でもないけど）、valueChangesなどは無限なのでunsubscribeする必要があります。

# 有限なObservable
```typescript
getHeroes(): Observable<Hero[]> {
  return this.http.get<Hero[]>(this.heroesUrl);
}
```
これは有限なのでunsubscribe不要。

# 無限なObservable
```typescript
this.hoge.valueChanges
  .subscribe(x => {
    console.log(x);
  });
```
これは無限なのでunsubscribe必要。

# まとめ
HttpClientを使ったAPIの実行で毎回unsubscribeしてたのは〜どこのどいつだ〜〜い。

私だよ！！

# 最後に
暇つぶしに[Twitter](https://twitter.com/izumin_0401)と[ブログ](https://traveler0401.com/)もやってるので見てね。
TROCCO®のMySQLコネクタでTiDB Cloudにデータを投入してみた話

# はじめに

ここ数日、TROCCO®を使ったTiDBからのデータ抽出について技術検証をしていました。そこで、Data Serviceという機能を使えばHTTP・HTTPSコネクタで、またMySQL互換であることからMySQLコネクタでもデータを抽出できることがわかりました。

これらをやってみたところ、MySQLの接続情報が作成できるということはTiDB Cloudへのデータ投入もできるのでは？？と気になって夜も眠れなくなってしまい、なんとなく楽しそうだったのでこちらも検証してみました。

:::note info
本記事を利用するための事前の設定については、

- [TiDB Cloudに登録して30分以内にTROCCO®のHTTP・HTTPSコネクタでデータ転送してみた話](https://qiita.com/SoySoySoyB/items/ea63699205ff78167fdd)
- [TROCCO®によるTiDB Cloudからのデータ転送はMySQLコネクタでもできた話](https://qiita.com/SoySoySoyB/items/f4e21cb813736dec4562)

の記事をご確認ください。
:::


# TiDBへの転送設定を作成する

MySQL（TiDB）への接続情報が作成できている前提で、ローカルファイル→MySQLの転送設定を作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/d2413034-3236-b6ae-440e-8824967cbc53.png)

転送するデータとしてTitanicのtrain.csvのファイルをアップロードし、ファイル形式と文字エンコーディングを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/86aed8c5-0c53-dd2c-3001-202d4d080f37.png)

転送先MySQLの設定として、TiDBで作成した接続情報を選択し、データベースやテーブルを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/e35d316b-9ccf-bce2-89b6-d2cc24538f26.png)

STEP2に移るとデータのプレビューが表示されるので、データ型を全てstringに変更して（データ上部だけを読んだ自動型定義だと、後半に異常レコードがありエラーになるため）、設定を保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/fc3bf539-7906-6fd9-94f2-c0e0d3b2899c.png)


# TiDBにデータを転送する

保存した転送設定で、転送ジョブを実行します。ステータスSUCCESSで転送に成功しました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/ea9265fe-06d3-b32a-83f0-ffab30fbdee1.png)


# TiDBでデータを確認する

TiDBのコンソールにログインし、SQL Editorからテーブルを確認します。確かに設定したtrain_inputのテーブルが存在し、クエリを打つこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/9fc4dda3-542a-7fbf-006b-84ef379550be.png)


# さいごに

MySQL互換であるTiDBは、TROCCO®のMySQLコネクタを使用することで、データ抽出だけでなくデータ投入も行うことができました。HTAPのデータベースに外部からデータ投入するユースケースがあるのかは正直よくわからないですが（笑）、これは！というものが思いつく方はぜひ利用してくださいませ！
paiza Dランク問題を Elixir で解いてみた

## はじめに

キャンペーンをやっていたので、 Elixir で参戦しました

https://qiita.com/official-events/9ab96aa95d62fe3cbdd7

## paiza とは

https://paiza.jp/

paiza は IT エンジニア向け転職・就活・学習サービスです

その中でも、 paiza ラーニングは初心者向けのプログラミング学習ができるようになっています

https://paiza.jp/works

初学者向け AtCoder という感じですが、キャラクターが描かれていたりして、全体的にかわいい感じが良いです

![スクリーンショット 2024-07-29 22.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e1ee6f1b-6891-21cf-3b84-e9cdac8bb542.png)

回答に使える言語の選択肢に Elixir がありますが、まだ Beta とのこと

![スクリーンショット 2024-07-29 22.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/096f304c-f929-6bf4-76bc-f5129b28a3e4.png)

Elixir のバージョンは 1.12.3 で、結構古めです

https://paiza.jp/guide/language

残念ながら、スキルチェック問題では Elixir が選択できませんでした

本記事では、記事投稿キャンペーンの対象になっている問題から、 D ランクの問題を解いていきます

## 文字の一致

二つの入力文字列が一致しているかどうかを判定します

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/diff_str

何も考えずに書いたコード
（最初は trim してなかったので失敗しました）

```elixir
a = IO.read(:stdio, :line) |> String.trim()
b = IO.read(:stdio, :line) |> String.trim()

IO.puts(if a == b, do: "OK", else: "NG")
```

モジュール化して、 Elixir らしいパターンマッチを使ったコード

```elixir
defmodule Paiza do
  def main do
    a = read_line()
    b = read_line()
    solve(a, b)
  end

  defp read_line() do
    :stdio
    |> IO.read(:line)
    |> String.trim()
  end

  def solve(a, a), do: IO.puts("OK")
  def solve(a, b), do: IO.puts("NG")
end

Paiza.main()
```

## 一番小さい値

入力された数値から最小値を返す

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/min_num

全てパイプで繋げました

```elixir
defmodule Paiza do
  def main do
    :stdio
    |> IO.read(:all)
    |> String.trim()
    |> String.split("\n")
    |> Enum.map(&String.to_integer(&1))
    |> Enum.min()
    |> IO.puts()
  end
end

Paiza.main()
```

## 足し算

入力した数値を足します

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/addition

こちらも全てパイプで繋げました

`Enum.map` が Elixir らしいですね

```elixir
defmodule Paiza do
  def main do
    :stdio
    |> IO.read(:all)
    |> String.trim()
    |> String.split(" ")
    |> Enum.map(&String.to_integer(&1))
    |> Enum.sum()
    |> IO.puts()
  end
end

Paiza.main()
```

## Eメールアドレス

入力された行を `@` で接続します

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/email_address

改行を `@` に置換するだけですね

```elixir
defmodule Paiza do
  def main do
    :stdio
    |> IO.read(:all)
    |> String.trim()
    |> String.replace("\n", "@")
    |> IO.puts()
  end
end

Paiza.main()
```

## N倍の文字列

入力された数値の分だけ `*` を出力します

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/square

Elixir 1.12 なので `then` が使えます

```elixir
defmodule Paiza do
  def main do
    :stdio
    |> IO.read(:all)
    |> String.trim()
    |> String.to_integer()
    |> then(&String.duplicate("*", &1))
    |> IO.puts()
  end
end

Paiza.main()
```

## まとめ

D ランクなので、全て超入門という感じですね

早く Elixir でスキルチェック問題が回答できるようにしてもらいたいです
1D-CAE(OpenModelica)覚書

# はじめに
なにかものを作るとき、まずは概念的な機能設計をしてから具体的な形状の検討に進む。
通常のCAE(3D-CAE)では形状がある程度定まってからその形状や特性を「評価する」ことが一般的である。
概念設計段階では形状が定まらないなかで「特性値の管理」や「要件定義」を実施することができる。(1D-CAE)

今回はオープンソース1D-CAEソフトウェア「OpenModelica」に触れてみたためチュートリアル的覚書を作成する。

# モデル作成準備
OpenModelicaを起動し「新規Modelicaクラス作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/7d4bea55-0289-145b-75e4-6aaa9558c214.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/802e0c30-cad3-a353-941c-32efbd901b3a.png)

任意の名称でOKクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/54cacc89-8b00-9e13-b938-4dac47030415.png)

# モデル作成

画面左のライブラリからコンポーネントをドラッグ&ドロップする。今回はサンプルとして回路モデルを作成するが、物理モデルや熱流体、電磁場など支配方程式があるモデルを作成できるらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/555209ad-f69c-b1b5-c5ba-62faec991524.png)

D&Dしたコンポをダブルクリックし、パラメータを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/1763a817-ab4e-4860-9752-74b8c3a35349.png)

レイアウト終了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/5343dad9-2c96-b7c1-c7b7-771c878557ff.png)

レイアウトが終わったら「接続/接続解除モード」をONにし、各要素をつなぐ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/4bd7c90c-ddbb-f845-8a31-4c3135f7939a.png)

モデル完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/bdf49e38-f812-cd40-b44c-308638f4f27b.png)

# モデルチェック
モデルチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/2e395e2e-60e1-5ec0-75e2-9e84825f22d8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/cb5c0001-25a4-0bba-c509-78bd18cc76bf.png)

# 解析条件の設定
時刻やタイムステップなどを設定する。デフォルトではこのままOKを押すと解析が実行される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/2500ed27-cb07-07b4-d76f-b29814a2bfb4.png)

今回は時刻0s～10sでタイムステップ0.001sに設定している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/e3b0f4f0-f070-924a-947a-cca98a0b26c4.png)


# 解析結果確認
シミュレーション実行後は自動で「プロット」ウィンドウに飛ばされる。
各物理量のチェックボックスをONにすることでグラフが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/de5ef495-8f54-370d-f9d8-76e3f2df54fd.png)

結果はcsvとして出力することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/b9339a58-c882-d5d7-fc22-2ec457aa73b6.png)


「モデリング」タブをクリックすればモデル作成に戻ることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/e07e3051-0712-9c18-8b0c-d7cb53374f4f.png)

# さいごに
1D-CAEめっちゃおもろい、3Dほど計算時間もかからないしモデルもシンプル。
しかし実現象を単純化（本来の意味でのモデル化）センスは問われると感じる。
どのようにモデル化するか、コンポーネントのパラメータをどのように設定すべきかなどは3D-CAEと同様に深い理解が必要そうだ。

# 参考
https://1dcae.jp/about/
【ExcelVBA】データ型を調べる

# はじめに

随分前にVBAでデータ型を判定する関数がないかと思って調べてみると、[VarType 関数](https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/vartype-function)という関数があることが分かりました。
ただ、JavascriptにおけるNumber.isInteger()のようにデータ型をbooleanで返す処理ではなかったため、備忘録として記事をまとめてみることにしました。

# VarType関数の概要

* `VarType(varname)`で、変数varnameのデータ型を調べることができますが...
* 「変数のサブタイプ、またはオブジェクトの既定のプロパティの型を示す整数型 (Integer) の値を返します」という説明の通り、データ型が整数として返されるのがポイントです。

|定数|値|説明|
|---|---|---|
|vbEmpty|0|空 (未初期化)|
|vbNull|1|Null (有効なデータではない)|
|vbInteger|2|Integer|
|vbLong|3|長整数|
|vbSingle|4|単精度浮動小数点数|
|vbDouble|5|倍精度浮動小数点数|
|vbCurrency|6|通貨値|
|vbDate|7|日付値|
|vbString|8|String|
|vbObject|9|Object|
|vbError|10|エラー値|
|vbBoolean|11|ブール値|
|vbVariant|12|バリアント型 ( Variant ) (バリアントの 配列でのみ使用される)|
|vbDataObject|13|データ アクセス オブジェクト|
|vbDecimal|14|10 進値|
|vbByte|17|バイト値|
|vbLongLong|20|LongLong 整数 (64 ビット プラットフォームでのみ有効)|
|vbUserDefinedType|36|ユーザー定義型を含むバリアント|
|vbArray|8192|配列 (この関数によって返されたときに常に別の定数に追加されます)|

* 例えば以下のような形で`VarType`関数を使うと、上記の表のルールで整数が返されるので、結果だけを見ても何のデータ型なのかパッと理解しづらいと思います。

```vb:VarType関数の利用例
Sub test()
    myVal = 3
    Debug.Print VarType(myVal)
End Sub
```

```text:実行結果
2
```

# 少し別のアプローチをしてみる

* 単にデータ型名を調べるだけなら、データ型名が返される`TypeName`関数を使った方が分かりやすいと思います。

```vb:TypeName関数の例
Private Sub test2()
    myVal = 3
    Debug.Print TypeName(myVal)
End Sub
```

```text:実行結果
Integer
```

* データ型に応じて処理を分岐させるのであれば、以下のようにデータ型を判定してtrue/falseで返す関数を作った方が良いかもしれません。
 * Nullの判定は組み込みの`isNull`関数、エラー値も同様に組み込みの`isError`関数が使えるので、一部のデータ型の判定については自作する必要がありません。

```vb:データ型を判定する関数の例
Function IsInteger(var As Variant) As Boolean
    IsInteger = (VarType(var) = vbInteger)
End Function

Function IsLong(var As Variant) As Boolean
    IsLong = (VarType(var) = vbLong)
End Function

Function IsString(var As Variant) As Boolean
    IsString = (VarType(var) = vbString)
End Function
```

# まとめ

* `IsInteger`や`IsString`程度の関数は組み込みで用意してあるのが普通だと思っていたので、少々意外な結果でした。
* こういうちょっとした機能が足りていないのが、多くの人がVBAを微妙だと感じる原因なのかもしれません...

# 参考URL

* [VarType 関数 - Microsoft Learn](https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/vartype-function)
AWS全冠を新卒2年目で達成した理由と得られたメリット

## はじめに

こんにちは、yasu08_です。2024年4月から新卒3年目のエンジニアとして働いています。AWS歴は約2年弱で、2024年3月までに(新卒2年目で)AWSの12資格を取得し、以下の賞を受賞することができました。


- 2024 Japan AWS All Certifications Engineers

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-all-certifications-engineers-criteria/

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-all-certifications-engineers/

この記事では、なぜ全冠を目指したのか、その過程で得たもの、そして今後の抱負についてお話しします。資格取得を目指している方、特に若手エンジニアの皆さんに向けて、私の経験が少しでも参考になれば幸いです。

## なぜ全冠を目指したのか

### 焦りからのスタート

全冠を目指すことになった最初の理由は「焦り」でした。新卒で今のチームに配属された際、全冠達成者やTop Engineer、一つ上の年次で多くの資格を取得している人がいて、業務についていけないのではないかという不安がありました。実際、周りの会話や業務内容が理解できないことが多く、少しでも知識を追いつかせるために資格取得に励んだことが全冠のきっかけでした。

### 資格取得の継続を支えた要因

資格取得の過程で、弊社では資格取得数がランキング形式で見える化されており、自分の努力が客観的に評価されることがモチベーションにつながりました。また、資格取得は上司に対して意欲と能力を示す手段としても有効であり、その結果、様々な仕事を任せてもらう機会が増えました。

このような経験から、モチベーションを落とすことなく資格取得を継続できました。

## 全冠を達成して得たもの

・ **信頼と仕事の機会**

資格取得を通じて、周囲から「できるやつだ」と思われ、仕事を任される機会が増えました。若手のうちは意欲があっても、それをアピールする機会が少ないため、資格取得はやる気と知識を示す良い方法でした。実際に様々な仕事を任され、日々新鮮な気持ちで業務に取り組むことができています。

・ **re:Inventへの参加**

資格取得に励んでいたことと運が良かったことが重なり、毎年ラスベガスで開催されるAWS最大のカンファレンスである「re:Invent」に参加できました。これにより、多くの技術者と交流し、自分の知見を広げ、最新の技術動向を学ぶことができました。

・ **社内イベントへの招待**

社内のイベントや勉強会に呼んでいただけるようになり、普段仕事をする上で会えない方々との接点ができました。これにより、新たな知識を得るだけでなく、人脈も広がりました。

・ **2024 Japan AWS Jr. Champions**

資格取得も「2024 Japan AWS Jr. Champions」に選出される一因となりました。この受賞は私にとって大きな励みとなり、さらに高い目標を持つきっかけとなりました。

## 資格取得の限界と実務経験の重要性

資格は一つの指標でしかなく、実務経験やスキルが伴わないと意味がないと感じることも多くありました。資格取得だけで満足せず、実際の業務でどれだけ活用できるかがやはり重要なので、今後は実務経験を積み重ね、さらにスキルを磨いていきたいと思います。

## 今後の抱負

今後は、全冠を取得したことで得た知識や経験をもとに、社会や周囲の人々に良い影響を与えられるエンジニアになりたいと思います。また、新しい人との出会いや経験を通じて、さらに成長していきたいと考えています。

## さいごに

この記事を読んでくださり、ありがとうございました。今後も挑戦を続け、1年後にはさらに成長した姿で振り返りの記事を書けることを目指しています。私の経験が、少しでも皆さんのキャリアの参考になれば幸いです。
配列の各要素ごとにカウントする方法【Ruby JS】

# はじめに

配列の各要素ごとにカウントする方法について記述していきます。

今回はHashの形でreturnします。

# Rubyの場合

簡単です。`tally`メソッドを使用します。

```rb
arr = ["apple", "banana", "apple", "orange", "banana", "apple"]
tallied = arr.tally
# => {"apple"=>3, "banana"=>2, "orange"=>1}
```

https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/tally.html

# JSの場合

最も美しいのは、`reduce`メソッドを使用し`tally`メソッドを再現することだと思います。

```js
function tally(array) {
  return array.reduce((acc, item) => {
    acc[item] = (acc[item] || 0) + 1;
    return acc;
  }, {});
}

const arr = ["apple", "banana", "apple", "orange", "banana", "apple"];
const tallied = tally(arr);
// => { apple: 3, banana: 2, orange: 1 }
```

また、`lodash`ライブラリから、`countBy`メソッドを使用することができます。

```js
const _ = require('lodash');

const arr = ["apple", "banana", "apple", "orange", "banana", "apple"];
const tallied = _.countBy(arr);
// => { apple: 3, banana: 2, orange: 1 }
```

---

https://www.codewars.com/kata/52efefcbcdf57161d4000091/solutions/javascript

これは文字列から文字の出現回数をカウントせよという問題です.

この解答として以下のコードがありました。

```js
const count = require('lodash').countBy;
```

これで動くんですね。

引数の引き渡しなどがどう処理されているのか、詳しいことはわかりません。

---

以上、配列の各要素ごとにカウントする方法でした。