OmniAICreator/Qiita-1.07M huggingface dataset:
Astro + pagefindで手軽に検索機能の実装

[pagefind](https://pagefind.app/)は、大規模なサイトでも優れたパフォーマンスを発揮する、静的サイト向け全文検索ライブラリです。
UIも提供されているので、サクッと導入することできます。
今回はAstroのプロジェクトにpageindexを導入してみます。
## pagefindのインストール
まずは`pagefind`と`@pagefind/default-ui`というパッケージをインストールしていきます。
pnpmやyarnを使っている人は適宜読み替えてください。
```bash
$ npm install pagefind @pagefind/default-ui
```

## 検索用コンポーネント
デフォルトで用意されているUIがあるので、そちらを使って検索用のUIコンポーネントを実装します。
```js:components/Search.astro
---
import "@pagefind/default-ui/css/ui.css";
---

<div id="search"></div>

<script>
  import { PagefindUI } from "@pagefind/default-ui";

  new PagefindUI({
    element: "#search",
    // element以外のオプションは任意で設定
  });
</script>
```
作成したコンポーネントは任意のファイルでインポートしてください。
今回は、src/pages/index.astroに追加しておきます。
```js:src/pages.index.astro
---
...
import Sarch from '@components/Search.astro'
---

 <Layout>
   <Search />
 ...
 </Layout>
```

TypeScriptを使用してる場合、@pagefind/default-uiには型定義が存在しないため、build時にエラーが発生します。そのため、下記をenv.d.tsに追加しておいてください。
```ts:src/env.d.ts
declare module "@pagefind/default-ui" {
    declare class PagefindUI {
        constructor(opts: {
            element?: string | HTMLElement,
            bundlePath?: string,
            pageSize?: number,
            resetStyles?: boolean,
            showImages?: boolean,
            showSubResults?: boolean,
            excerptLength?: number,
            processResult?: any,
            processTerm?: any,
            showEmptyFilters?: boolean,
            debounceTimeoutMs?: number,
            mergeIndex?: any,
            translations?: any,
            autofocus?: boolean,
            sort?: any,
        })
    }
}
```

## 検索用indexの作成
最後に検索用のindexを作成します。
```bash
$ npm run build
```
Astroでは、dist配下にbuild後のファイルが作成されます。
そのため、distをオプションに設定し、pagefindの検索用indexを作成する下記コマンドを実行します。
また、生成されるindexはbuild後のHTMLファイルのlang属性に基づいて、言語が判定されるため、build前にlang属性を統一しておくことをおすすめします。
複数言語での検索ができないわけではないので、複数言語で検索機能を実装したい場合は[公式サイト](https://pagefind.app/docs/multilingual/)を参考にしてみてください。
```bash
$ npx pagefind --site dist
```
本番環境へのデプロイ時にbuildと同時にindex作成できるようにしておきたい（かつ毎回build→indexの作成を行うのは面倒くさい）ので、buildコマンドを実行したタイミングでindexも作成できるようにしておきましょう。
```js:packge.json
{
  "scripts": {
    "build": "astro build && pagefind --site dist"
  }
}
```
これでpagefindを使った全文検索の準備は完了です。
```command
$ npm run preview
```
実際にbuild後のプロジェクトを確認してみると全文検索が機能していることが確認できると思います。
## まとめ
pagefindを使えば手軽に全文検索機能を実装することができました。
今回は最小限の部分しか解説していないですが、このほかにも様々なオプションが用意されています。
[公式サイト](https://pagefind.app/)を参考にしながらぜひ好みにカスタマイズしてみてください。

日本語の検索でも基本的に問題なく、動作も非常に軽く使い勝手が良いため、今後もし静的サイトに全文検索を実装するとなったら使いたいと思えるライブラリでした。
ただ、若干公式サイトを見ても分かりにくかったり、ググった時の情報が少ないので、詰まった時は苦労するなぁーとは思いますが、、
【React】マウントとは

# マウントとは
Reactにおける「マウント」とは、ReactコンポーネントがDOMに初めて描画されるプロセスを指します。つまり、コンポーネントがページに表示される最初の瞬間を指します。Reactのコンポーネントは、マウントされるときにいくつかの特定のライフサイクルメソッドが呼び出されます。

# 手順
マウントの過程は以下のような手順で行われます：

1\. constructor()メソッドの呼び出し:
コンポーネントのインスタンスが生成され、constructorメソッドが呼び出されます。この段階では、コンポーネントの初期化が行われます。

2\. render()メソッドの呼び出し:
コンポーネントのUIがrenderメソッドで定義された内容に基づいて描画されます。

3\. componentDidMount()メソッドの呼び出し:
コンポーネントがDOMに正常にマウントされた後、componentDidMountメソッドが呼び出されます。この段階では、APIからのデータ取得やDOMの操作などの初期化処理が行われます。

マウントされたコンポーネントは、以降の更新や破棄のためのライフサイクルメソッドが呼び出されるまで、Reactアプリケーションに表示されます。マウントされたコンポーネントが更新される場合は、更新のプロセスが実行され、それぞれの更新に対応するライフサイクルメソッドが呼び出されます。

要するに、マウントはReactコンポーネントがDOMに最初に描画されるプロセスであり、その際に特定の初期化処理が行われる重要なステップです。
【React】ライフサイクルとは

# ライフサイクルとは
Reactのライフサイクルとは、Reactコンポーネントが生成され、更新され、破棄される過程全体を表すものです。Reactコンポーネントは、これらのライフサイクルメソッドを使用して、各段階で特定の動作を実行することができます。React 16.3以降、ライフサイクルメソッドはクラスコンポーネントでのみ使用され、フックが導入されたReact 16.8以降は関数コンポーネントで代替されることが一般的です。

以下は、Reactの主要なライフサイクルメソッドの概要です。

1\. **マウント（Mount）** :
- `constructor()`: コンポーネントのインスタンスが初期化されるときに呼ばれます。
- `render()`: コンポーネントのUIが描画されます。
- `componentDidMount()`: コンポーネントがDOMにマウントされた後に呼ばれます。APIのデータ取得やDOMの操作など、副作用のある処理を実行するために使用されます。

2\. **更新（Update）** :
- `render()`: コンポーネントが更新されるたびに呼ばれ、UIが再描画されます。
- `componentDidUpdate()`: コンポーネントの更新がDOMに反映された後に呼ばれます。前回のプロップスやステートと現在のプロップスやステートを比較して、必要に応じて追加の処理を行うことができます。

3\. **アンマウント（Unmount）** :
- `componentWillUnmount()`: コンポーネントがDOMからアンマウントされる直前に呼ばれます。リソースのクリーンアップやタイマーの解除など、後始末の処理を行うために使用されます。

4\. **エラーハンドリング（Error Handling）** :
- `componentDidCatch()`: コンポーネント内でエラーが発生した場合に呼ばれます。エラーをキャッチして、エラー画面やログ出力などの処理を行うために使用されます。


これらのライフサイクルメソッドを使用することで、Reactコンポーネントが異なる段階で必要な処理を実行し、UIの振る舞いや状態を適切に管理することができます。
【React】レンダーツリーとは

# レンダーツリーとは
Reactにおける「レンダーツリー（Render Tree）」は、Reactコンポーネントの階層構造を表現したものです。Reactアプリケーションは、複数のネストされたコンポーネントから構成されており、これらのコンポーネントが相互に組み合わさってUIを形成します。レンダーツリーは、これらのコンポーネントの階層構造を木構造で表現したものです。

レンダーツリーは、ReactアプリケーションのUIの構造を視覚化するのに役立ちます。各コンポーネントは、その子コンポーネントを含むように定義され、ツリーの上位に位置するコンポーネントから下位のコンポーネントへと継承されます。Reactは、このレンダーツリーを元に、各コンポーネントのレンダリングを管理し、変更が発生した場合に適切に再レンダリングを行います。

レンダーツリーの概念は、Reactの仮想DOM（Virtual DOM）とも関連しています。Reactは、仮想DOMを使用してコンポーネントのレンダリングを効率化し、変更があった部分のみを再レンダリングすることでパフォーマンスを最適化します。レンダーツリーは、この仮想DOMの一部として機能し、Reactがコンポーネントのレンダリングを効果的に管理できるようにします。

# まとめ
簡潔に言えば、レンダーツリーはReactアプリケーションのUIの階層構造を表し、ReactがUIを構築し、管理し、更新する際に使用される重要な概念です。
【React】条件付きレンダリングとは

# 条件付きレンダリングとは
Reactにおける「条件付きレンダリング」とは、ある条件が満たされた場合にのみ特定の要素やコンポーネントをレンダリングすることを指します。これにより、動的なUIを作成し、特定の状況に応じて異なるコンポーネントや要素を表示することができます。

条件付きレンダリングを実現する方法にはいくつかのアプローチがありますが、一般的な方法のいくつかを以下に示します。

# 使用方法
1\. 条件付き演算子（Ternary Operator）を使用する:
```jsx
function MyComponent({ isLoggedIn }) {
  return (
    <div>
      {isLoggedIn ? <p>Welcome, user!</p> : <p>Please log in.</p>}
    </div>
  );
}
```

2\. 論理 && 演算子を使用する:
```jsx
function MyComponent({ isLoggedIn }) {
  return (
    <div>
      {isLoggedIn && <p>Welcome, user!</p>}
    </div>
  );
}
```

3\. 条件付きレンダリングを行うための関数を作成する:
```jsx
function MyComponent({ isLoggedIn }) {
  const renderWelcomeMessage = () => {
    if (isLoggedIn) {
      return <p>Welcome, user!</p>;
    } else {
      return <p>Please log in.</p>;
    }
  };

  return (
    <div>
      {renderWelcomeMessage()}
    </div>
  );
}
```

# まとめ
これらの方法を使用すると、特定の条件が満たされた場合にのみコンポーネントや要素がレンダリングされるように制御できます。条件付きレンダリングは、ユーザーの認証状態やアプリケーションの状態に基づいて動的なUIを作成するために広く使用されます。
Salesforce認定アドミニストレーターを受験することになったから過去問を解いてアウトプットしていこうと思う。Q11 ~ Q20

# Q11. ユーザーは, 2週間ごとに繰り返されるタスクを作成できることを望んでいる. この要件を満たすために管理者は何をするべき？
A: 繰り返しタスクの作成を有効にする
### 解説
繰り返されるタスクを有効にすることで, ユーザーは定期的に繰り返されるタスクを簡単に設定することができる.

# Q12. A社は営業担当者が商談レコードにアクセスする際, 関連するカウント情報を簡単に確認できるようにしたいと考えている. 現在, 営業担当者はアカウント情報を見るために別のタブを開く必要があり, 効率が悪いと感じている. 管理者はこれに対してどのようなアクションをとるべきですか？
A: 商談オブジェクトにアカウントのクロスオブジェクト式フィールドを作成する.
### 解説
クロスオブジェクト数式って, 特別な呼び名がついているだけでただの数式項目らしい. クロスオブジェクト数式を使用すると, 商談ページ上で直接関連するアカウント情報を表示することができる.

# Q13. SalesforceのUnlimited Edition (UE) では、AppExchangeからのアプリのインストールに制限がありますか？あるとしたらどれくらい？
A: 無制限
### 解説
SalesforceのUnlimited Edtionでは, AppExchangeからのアプリのインストール数に制限がないため, 組織はビジネス要件に合わせて必要なアプリを自由にインストールすることができる.

# Q14. カスタムリンクは, 次の目的で使用できる.
選択肢 : A 外部URLの起動 B レポートの実行 C Sコントロールの実行 D 上記全て
A: D 上記全て
### 解説
Salesforceのカスタムリンクでは,　外部のURLを起動したり, 特定のレポートを実行したり, Sコントロールを実行したりするなど様々なアクションをトリガーするリンクを作成することができる.

※Sコントロールを使用することで, 独自のカスタムデータフォームを作成して表示するなど, Salesforceユーザーインターフェースを柔軟かつオープンな方法で拡張できる.
-- 公式ヘルプ --
https://help.salesforce.com/s/articleView?id=sf.dev_scontrol.htm&type=5

# Q15. 依存ピックリストの制御側にできない(使用できない)のは次のうちどれ？
選択肢 : A 標準ピックリスト B 複数選択ピックリスト C チェックボックス D カスタムピックリスト
A: B 複数選択ピックリスト
### 解説
Salesforceの依存ピックリストでは, 制御側として複数選択ピックリストを使用することはできない.依存ピックリストとは, あるピックリストの選択に基づいて別にピックリストの利用可能な選択肢を制御するためのものだが, 複数に選択肢を同時に制御することはできない.

# Q16. 小計のないデータの単純なリストを提供するレポートタイプとは？
A: 表形式
### 解説
表形式のレポートは, Salesforce内のデータを単純なリストとして表示するためのもの.
表形式は, 小計や集計を提供せず, 単純にレコードのリストを提供するのでここでは表形式が妥当.

# Q17. 製品カテゴリという名前のリードにカスタムフィールドがある.　経営陣はこの情報がリードの変換時に商談の一部になることを望んでいる. この要件を満たすために管理者はどのようなアクションを実行する必要がある？
A: 商談でカスタムフィールドを作成し, 2つのフィールドをマッピングする.
### 解説
リードのカスタムフィールドと商談のカスタムフィールドをマッピングすることによって, リードが変換されるときにその情報が正しく商談に移動する.

# Q18. 管理者は, リードにカスタム選択リストフィールドを持っており,　リードが変換されたときに連絡する. これらの値が入力されていることを確認するために, 管理者が行う必要がある項目は次のうちどれ？2つ答えよ.
選択肢 : 
A リードオブジェクトで選択リスト項目が必須になるように設定します。
B リードのピックリストフィールドを連絡先にマッピングします。
C 入力規則を使用してピックリストの値を更新します。
D 連絡先にカスタムピックリストフィールドを作成します。

A: B, D
### 解説
リードのカスタムピックリストフィールドを連絡先に持ち込むためには, まず連絡先に同じ名前のカスタムフィールドを作成する必要がある. その後, リードのピックリストフィールドを連絡先にマッピングする, という手順を踏む.


# Q19. レポートをスケジュールするときに何を指定する必要がある？
A: 「レポートの実行」をクリックし, ドロップダウンメニューから「将来の実行スケジュール」を選択する.
### 解説
レコードの実行ページのドロップダウンメニューを開き「将来の実行のスケジュール」を選択する必要があり, これによってレポートの定期的な実行をスケジュールし, 指定した受信者に結果を送信することができる.

# Q20. ワークフローフィールド更新では, 更新するフィールドとその新しい値を指定する. フィールドのタイプに応じて次の例外を実行できる.
A: フィールドを削除
### 解説
特定の条件が満たされたとき, フィールドを更新することができる. しかしこの機能を使用して, フィールドを空白に設定したり値を変更することは可能だが, フィールドを削除することはできない.
【React】propsとは

# propsとは
Reactにおけるpropsは、コンポーネントに渡されるパラメーターのことです。Reactコンポーネントは、propsを受け取り、それに基づいて自身の描画内容を決定します。

propsは、親コンポーネントから子コンポーネントにデータを渡すために使用されます。親コンポーネントが子コンポーネントを呼び出す際に、JSXの属性としてpropsを指定します。

# 使用方法
以下は、propsを使用してコンポーネントを呼び出す例です。
```jsx
import React from 'react';

// 子コンポーネント
function ChildComponent(props) {
  return <div>{props.message}</div>;
}

// 親コンポーネント
function ParentComponent() {
  return <ChildComponent message="Hello, world!" />;
}
```

上記の例では、`ParentComponent` が `ChildComponent` を呼び出しています。`ChildComponent` には `message` という名前のpropsが渡されており、その値は `"Hello, world!"` です。`ChildComponent` 内で `props.message` を参照することで、親コンポーネントから渡された値を取得して表示しています。

propsはイミュータブル（不変）であり、コンポーネント内で直接変更することはできません。propsの値が変更されると、Reactは自動的にコンポーネントを再レンダリングし、新しいpropsの値を反映します。

# まとめ
propsには任意の名前の属性を指定できます。この属性は子コンポーネント内で`props`オブジェクトとしてアクセスできます。propsは関数コンポーネントやクラスコンポーネントの両方で使用されます。
【React】レンダーとは

# レンダーとは
Reactにおける「レンダー(render)」とは、コンポーネントがUIを描画するプロセスを指します。Reactのコンポーネントは、`render` メソッドを実装することで、そのUIを定義します。

# 使用方法
レンダリングのプロセスは次のようになります。

1\. コンポーネントがマウントされる時、またはその状態が変更された時に、Reactはコンポーネントの `render` メソッドを呼び出します。

2\. `render` メソッド内では、JSX構文を使用してUIの要素を定義します。これにはHTML要素、他のReactコンポーネント、またはJavaScriptの式や変数を埋め込むことができます。

3\. `render` メソッドは、React要素（Reactが内部で使用する仮想DOM）を返します。

4\. ReactはこのReact要素を実際のDOMに反映し、画面上にUIを描画します。

レンダリングは、ユーザーのアクションやアプリケーションの状態の変化に応じて、必要な時に再実行されます。Reactは、コンポーネントの状態が変化した場合や、親コンポーネントが再レンダリングされた場合などに、再度 `render` メソッドを呼び出し、UIを更新します。

# まとめ
Reactのレンダリングは効率的で、Reactの仮想DOMの機能により、実際のDOMへの変更が最小限に抑えられます。これにより、高パフォーマンスで動的なUIを実現することができます。
【React】JSXの{{}}

# JSXの{{}}について
ReactのJSX内で二重波括弧 `{{}}` を使用する場合、これはオブジェクトのリテラルを埋め込むために使用されます。

# 使用方法
例えば、スタイルをインラインで設定する場合によく使われます。一重の波括弧 `{}` の中にオブジェクトを記述し、その中でCSSプロパティと値のペアを指定します。
```jsx
import React from 'react';

function MyComponent() {
  const styles = {
    color: 'red',
    fontSize: '20px',
    fontWeight: 'bold'
  };

  return (
    <div style={styles}>
      This text has custom styles.
    </div>
  );
}

export default MyComponent;
```

上記の例では、`styles` という名前のオブジェクトを作成し、`color`、`fontSize`、`fontWeight` のプロパティを指定しています。このオブジェクトを style 属性の値として設定することで、その要素に指定されたスタイルが適用されます。

# まとめ
二重波括弧を使用することで、外側の波括弧 `{}` はJavaScriptの式として解釈され、内側の波括弧 `{}` はオブジェクトのリテラルとして解釈されます。
【React】JSXの{}

# JSXの{}について
ReactのJSXでは、波括弧 `{}` を使用して、JavaScriptの式や変数を埋め込むことができます。これにより、動的なコンテンツを生成したり、JavaScriptのコードを実行したりすることが可能になります。

# 使用方法
具体的な例を見てみましょう。
```jsx
import React from 'react';

function MyComponent() {
  const name = 'John';
  const age = 30;
  
  return (
    <div>
      <h1>Hello, {name}!</h1>
      <p>You are {age} years old.</p>
      <p>The current time is {new Date().toLocaleTimeString()}.</p>
    </div>
  );
}

export default MyComponent;
```

上記の例では、波括弧 `{}` を使用して、`name` 変数や `age` 変数、`new Date().toLocaleTimeString()` のような JavaScript の式を JSX 内に埋め込んでいます。これにより、`name` や `age` の値や現在の時刻が動的に表示されます。

# まとめ
JSX の中では、波括弧 `{}` 内には任意の JavaScript 式が記述できます。ただし、ブロック文（`if` 文や `for` 文など）や変数の宣言（`let` や `const`）などの文は直接記述できません。代わりに、関数の呼び出しや式の評価などの JavaScript 式を使用することができます。
Pythonでインピーダンスグラフの作成

# インピーダンスのグラフを書きたい
と思うことが年に1回ありますが、その度に1から調べて書いてる気がします・・・

備忘録としてプログラムを残します。

# プログラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/b40cb15a-cfd2-4534-7f6b-b7fba9976dc5.png)




```python
import matplotlib.pyplot as plt
import numpy as np

import cmath
import math

r = 100
c = 100e-6
c2 = 100e-5

"""
omega = 1
z = -1/omega/c*1j + 1/(1/r + omega*c2*1j)
print(z.real)
"""

omega = np.logspace(-2,7,num = 100000)  #10^-2 ~ 10^3
#z = -1/omega/c*1j + 1/(1/r + omega*c2*1j)
z = r  -1/omega/c*1j


fz = omega / 2 /np.pi

fig = plt.figure(figsize=(8, 12))
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)


ax1.plot(fz,abs(z))
ax1.set_xscale("log")
ax1.set_yscale("log")

ax1.set_xlabel("freq[Hz]")
ax1.set_ylabel("Imp[Ω]")

ax2.plot(fz,np.angle(z)*180/np.pi)
ax2.set_xscale("log")


ax2.set_xlabel("freq[Hz]")
ax2.set_ylabel("phase[deg]")

plt.show()
```
【React】マークアップとは

# マークアップとは
Reactのマークアップとは、JSX（JavaScript XML）を使用して記述された、Reactコンポーネント内部のHTML構造や要素のことを指します。JSXは、JavaScriptの構文を拡張し、HTML風の記法でUIを記述するためのものです。

# 使用方法
以下は、Reactのマークアップの例です。
```jsx
import React from 'react';

function MyComponent() {
  return (
    <div>
      <h1>Hello, world!</h1>
      <p>This is a paragraph.</p>
      <button>Click me</button>
    </div>
  );
}

export default MyComponent;
```

この例では、`<div>`、`<h1>`、`<p>`、`<button>`などのHTMLタグが使用されていますが、これらはReactのコンポーネント内部で記述されています。JSXは、JavaScriptの中にHTMLを記述できるようにし、JavaScriptとHTMLの間の統合性を高めるためのものです。

# まとめ
Reactのマークアップでは、通常のHTMLと同様に、属性やイベントハンドラーを設定することもできます。また、JavaScriptの変数や式を埋め込んで動的なコンテンツを生成することも可能です。このように、JSXはReactでUIを構築するための主要な手段の一つであり、Reactの強力な機能の一つと言えます。
【React】JSXのルール

# JSXのルール
ReactのJSX（JavaScript XML）は、JavaScript内にHTMLライクな構文を使ってUIを記述するための拡張構文です。JSXの基本的なルールは次のとおりです。

1\. タグは必ず閉じる必要があります。たとえば、<div>タグは<div></div>のように、または自己閉じタグ <img /> のように記述します。

2\. JSX内ではJavaScript式を {} で囲んで埋め込むことができます。例えば、<div>{variable}</div>のように変数を埋め込むことができます。

3\. JSX内でのコメントは {/* */} の形式で記述します。

4\. class属性はJavaScriptのclassキーワードとの競合を避けるためにclassNameとして使用します。<div className="container"></div>のように記述します。

5\. JSXでは、for属性ではなくhtmlFor属性を使用します。

6\. JSX内で複数の要素を返す場合、それらは通常1つのラップされた要素で囲む必要があります。たとえば、<div>などの要素で囲むか、<React.Fragment>を使用して囲むことができます。

7\. JSX内では、HTML要素の属性を設定する際には文字列として指定するか、JavaScriptの式を {} で囲んで埋め込むことができます。

8\. 条件付きレンダリングやループなどの制御構文は、JavaScriptのifやmap関数などを使って記述します。JSX内でのif文は、三項演算子や論理演算子を使用して行います。

これらのルールに従ってJSXを記述することで、Reactコンポーネントを効果的に構築することができます。
【React】コンポーネントのインポート・エクスポート

# コンポーネントのインポート・エクスポート
Reactのコンポーネントのインポートとエクスポートについて、以下の点を説明します。

### インポート（Import）
Reactのコンポーネントを他のファイルで使用する場合、`import`キーワードを使用してインポートします。一般的なインポートの方法は次のとおりです。
```js
import MyComponent from './MyComponent';
```

上記の例では、`MyComponent`という名前で、同じディレクトリ内の`MyComponent.js`ファイルからコンポーネントをインポートしています。拡張子（.js）は省略可能です。

### エクスポート（Export）
Reactのコンポーネントを他のファイルで利用可能にするために、`export`キーワードを使用してエクスポートします。一般的なエクスポートの方法は次のとおりです。
```js
export default function MyComponent() {
  return <div>This is my component</div>;
}
```

上記の例では、`MyComponent`という名前でデフォルトエクスポートしています。他のファイルでこのコンポーネントをインポートする際には、`import`文で`MyComponent`という名前を使用します。
```js
import MyComponent from './MyComponent';
```

他にも、名前付きエクスポートを使用することもできます。
```js
export function MyComponent() {
  return <div>This is my component</div>;
}
```

この場合、MyComponentを名前付きエクスポートしています。他のファイルでこのコンポーネントをインポートする際には、import文で同じ名前を使用してインポートします。
```js
import { MyComponent } from './MyComponent';
```

# まとめ
Reactのコンポーネントのインポートとエクスポートは、JavaScriptのモジュールシステムを使用しており、モジュール間でのコードの再利用や整理に役立ちます。
【イベント出展】Streamlitコミュニティでオープンソースカンファレンス2024に出展をした話

# 前置き
こんにちは。データエンジニアの山口です！
本日の記事は2024年3月10日に開催された
オープンソースカンファレンス2024の参加のお話です。

SnowFlakeのコミュニティ(SnowVillage)では
毎週土曜日の9:00~11:00にて Streamlitのもくもく会が行われております。

今回はもくもく会に参加されているメンバーの方々と オープンソースカンファレンスで出展をしてきたので
そのお話をさせていただきます。


https://usergroups.snowflake.com/snowvillage/

※Snowflakeコミュニティ(SnowVillage)は、こちらから参加できます。




# オープンソースカンファレンスについて
たくさんの企業やコミュニティが
オープンソースのIT技術に関する情報やサービスの紹介やデモを実施されておりました。

組込み系のシステムの展示や知らない技術など 普段見ないようなものの展示を見ることができて勉強になりました。
また、発売前の書籍がなどが売られていたりもしていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/e472e265-3138-04ed-fa10-97ad7f932bb9.png)



https://ospn.connpass.com/event/304655/


# Streamlitコミュニティのブース
Streamlitのコミュニティではこういった感じでブースを出しておりました。
![IMG_2216.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/8a1354e0-3296-8661-935c-104f8bcd9f49.jpeg)

HiyamaさんがStreamlitで 以下のようなアプリを作成してデモをされていらっしゃいました。

https://x.com/toru_data/status/1766822727317635116?s=20

PCに接続したセンサーを動かすと
それに合わせてリアルタイムで表示されている3Dのオブジェクトが動くといった非常にすごいものでした。
仕組みも教えていただくき 大変勉強になりました。


# まとめ
コミュニティの方々からStreamlitについての情報も学ぶことができ 非常に勉強になった1日でした。
次回出展する際は 自分もデモアプリを作成して参加できたらいいなと考えています！
以上です！



# 採用
GENDAデータチームではプロダクトのデータ解析や機械学習プロジェクトを推進できるデータサイエンティストを募集しています。
興味を持っていただけましたら、是非ご連絡いただけると幸いです！

https://hrmos.co/pages/genda/jobs/1700006587045969926
【事務自動化】Mosh.jpでのサービス申し込みされたときに反応するGAS

ECサイトMoshでユーザーから申し込みがあった時、自社システムと連携したい時、ありますよね。

`JavaScript`分かる人向けですが、こちらを用意しました。

https://github.com/konbraphat51/MoshGmail2API

申し込みメールに反応するGAS (Google Apps Script)です。

使い方はトップページのREADMEに書いてあります。

```javascript
//新規データ分についてAPI叩く
	emailsContentNew.forEach((emailContent) => {
		//WTF you want to do
	})
```

この箇所に自社サービスのAPI叩くなり好きなコードを書いてください。
HuggingFaceのTRLでGemmaをファインチューニングしてみました

昨日、HuggingfaceのTRLライブラリを使って、finetuningしてみました。
TRL（Transformer Reinforcement Learning）はhuggingfaceのトレーニング用ライブラリで、RLHFなどの強化学習を簡単に行うことができます。もちろん、SFTなどのfinetuningも可能です。
初めての試しですが、非常に使いやすかったです。
また、flash-attentionも試してみました。Flash Attentionは、Transformerモデルのアテンション計算を高速化し、モデルのトレーニング速度を向上させる技術です。
具体的には、既存のTransformerの実装におけるアテンション層を、ほとんどモデルの構造やハイパーパラメータを変更することなく、シームレスに置き換えることができます。これにより、モデルの高速化を実現できます。
試した結果、学習速度が確かに速くなり、トレーニングにかかる時間を短縮することができました。

以下は今回試したfinetuningの流れです。

# 1.データセット
使用したデータセットは、HuggingFaceで見つけた、日本の官公庁のWebサイトに掲載されている「よくある質問」のQAデータです。30000件程度なので、今回の試しには最適だと思って使いました。（イメージは⇩です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/5adff53f-5dfa-c85a-1b8e-d80d3cc98d0b.png)


# 2.トレーニング結果

トレーニングは約1時間半で終わりました。（9000ステップを1時間半でこなすことができました。半年前に同じくらいの量をトレーニングしたときは、20時間ほどかかった記憶があります。もちろん、モデルの大きさやGPUの性能、パラメータの設定などの違いもありますが、それでも大幅に高速化されたと実感しています。）

（wandbでのlossは⇩、少しづつに下がりました。2.5⇒1くらいまで(3epoch終了時点)）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/d0baa392-a507-f579-4d02-0119212d2e09.png)

# 3.検証結果
モデルの試し結果は⇩です。（finetuning前）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/2394d9af-477f-3e2a-0140-ebf750f89016.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/b5c8222e-4075-a9a6-253a-5aa1e4ca4a16.png)

質問の内容は理解していますが、英語または日本語で一言を繰り返すようになっています。（ここで試したのはinstructionモデルではないので、このような繰り返しが起こるのは問題ないと言えます。むしろ、こういう課題を解決するためにfinetuningが必要です）

finetuning後の結果は⇩です。（パラメーターなどはすべて同じように設定しています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/04dfe6f5-67f2-4e34-45a7-62a87268df1e.png)

モデルが日本語でこの質問に答えられるようになったことが確認できました。label（origianl answer）の回答とは異なりますが、それでも正しい内容となっていますので、finetuningは成功したと言えます。
もちろん精度上げたいなら色々改善点ありますが、今回はTRLの試しなのでこれで以上です。

興味ある方：

TRL：

https://huggingface.co/docs/trl/en/index

ここでfinetuningしたモデル：

https://huggingface.co/kanxxyc/gemma-2b-japaneseQA-instruct
React × Django × OpenAI apiを活用したチャットアプリケーション開発

## はじめに
今回は、ReactとDjangoを組み合わせて、リアルタイムチャット機能を持つWebアプリケーションの開発過程を共有します! このアプリはプロダクトの資料に合わせてAIがチャット形式で自動でインタビューをしてくれるものとなっています。手軽に生活者の意見を聞きたい時に活用したいと思い開発しました。この記事では機能の概要のみを説明するため、詳細なコードにご興味のある方はコメントいただければ幸いです！

![アプリ概要vol3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/9e5cb667-644c-e45b-cbb5-865ad88c6d75.jpeg)

## プロジェクトの概要
このチャットアプリケーションは、ユーザーがリアルタイムでメッセージを交換できる機能を提供します。Reactを使用してインタラクティブなユーザーインターフェースを構築し、DjangoをバックエンドのAPIサーバーとして使用しています。

## 主な機能
### ファイルアップロード
最初にユーザーは、チャット内で使うファイルを共有できます。Djangoのバックエンドでファイルアップロード機能を実装しています。
![Web キャプチャ_30-9-2023_152359_localhost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/1f7f1db2-c14a-4884-87b9-c50617c92803.jpeg)


### リアルタイムチャット
ユーザーは、リアルタイムで他のユーザーとメッセージを交換できます。WebSocketを使用して、フロントエンドとバックエンド間でリアルタイム通信を実現しています。
![アプリ概要vol3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/9e5cb667-644c-e45b-cbb5-865ad88c6d75.jpeg)

### 管理画面でインタビューデータの確認
プロジェクトとユーザーごとにインタビューデータを確認できます。簡単な指標の確認やサマリーの機能も実装しています。
![アプリ概要vol3 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/d917922a-001f-d643-ac62-81d755ff4759.jpeg)

## まとめと今後
Azureでデプロイして簡単に使っていたのですが、クラウド代とapiの料金がかかってしまうのでもっと手軽にできたらいいなと思っています！Streamlitとかで代替できるか模索中です。
コードは整理中なので今後気が向いたら載せたいと思っています。もしご興味がある方がいれば詳細を説明します！
React × Django × OpenAI api × Zoom SDKを使ったオンラインインタビューアプリ

## はじめに
インタビューは、プロダクト開発や市場調査において重要な役割を果たしますが、その準備と分析には時間がかかります。そこで、AIを活用して、このプロセスを簡単で効率的なものに変えるアプリケーションを開発しました。このアプリケーションでは、ユーザーの要件に基づいたインタビューフローを自動生成し、実際のインタビュー中はAIが対話を導き、リアルタイムで重要なデータを収集。そして、インタビューが終わると、直感的に理解できるダッシュボードで結果を分析し、深い洞察を得ることができます。フロントエンドはReact,バックエンドはDjango(一部Node.js),Zoom SDKでオンラインビデオの環境を作成し、Open AIのapiを使って様々なタスクを処理しています。
本記事では、簡単に機能についてご紹介します。詳細なコードはご興味があればコメントください。
 
## 機能説明 

### テンプレートに沿ったインタビューフローの自動生成
このアプリでは、特定のプロジェクトやインタビューの目的に応じてカスタマイズされたインタビューフローをAIが自動で生成します。ユーザーはプロジェクトの属性や目的を入力することで、そのニーズに合わせたインタビューの質問セットを手に入れることができます。これは、インタビューの準備時間を大幅に削減し、より一貫性のあるデータ収集を可能にします。また、インタビュー中の画面に作成したフローが表示されます。


![アプリ概要vol3 (6).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/8d9bef65-e605-91df-9748-6665121e98b8.jpeg)


### インタビュー中の質問と自動記録
インタビュー実施中は、独自に役割を設定したAIが参加者に対して設定された質問を次々と提示し、その反応をリアルタイムで記録します。インタビューアーは、参加者の反応に集中することができ、ノートを取る必要がないため、より自然体での会話が可能になります。
![アプリ概要vol3 (8).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/32f7bbcb-8d71-70c0-23e9-24d8a2638276.jpeg)

![Web キャプチャ_18-9-2023_171043_localhost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/9ed37b74-9f66-befd-3793-88f87f99e682.jpeg)

### ダッシュボードでのインサイトの分析
インタビュー後は、収集したデータをダッシュボードで分析できます。ユーザーは、インタビューごとの反応や、特定のキーワードに対する参加者の反応を見ることができ、インサイトを即座に把握することができます。
![アプリ概要vol3 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/6e22e42f-33ee-11cf-0862-7c4ae3596b04.jpeg)


### データベースの構築、比較
さらに、私たちのアプリでは、インタビューで得られたデータを基にデータベースを構築します。インタビューの全体的な傾向や、比較、特定の回答が多かった質問など、幅広い分析が可能です。これにより、より深い洞察を得ることができます。
![Web キャプチャ_23-9-2023_01610_localhost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/59d2e70e-80e1-9930-478a-8990a68fa045.jpeg)

![アプリ概要vol3 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/6b15d31f-1473-f4e7-8769-23bc14893d7e.jpeg)

## まとめ
このアプリケーションの開発を通じて、インタビュープロセスの省力化ができました。AIがインタビューフローを自動生成し、リアルタイムでの質問と記録を可能にすることで、インタビュアーはデータ収集の負担を大幅に減らし、参加者との対話に集中できるようになります。さらに、ダッシュボードでのインサイト分析は、インタビュー終了後の速やかな意思決定をサポートします。
Crunchbaseデータを用いたスタートアップと投資家のネットワーク可視化

## はじめに
スタートアップエコシステムは複雑で、多くのプレイヤーが絡み合っています。スタートアップにとっての資金調達は、その成長の鍵を握る一大イベントですが、どの投資家がどの企業に関わっているかを把握することは一筋縄ではいきません。そこで、この記事では、Pythonを活用して、Crunchbaseデータを基にスタートアップと投資家の関係を視覚化する方法をご紹介します。

## データセットの準備(Crunchbase Proプランが必要です)
まず、Crunchbaseから取得したデータセットを用意します。このデータには、スタートアップの名前とトップ5の投資家がリスト化されています。以下のように自分のリストにTop 5 Investorsを追加します。 これをcsvとして任意のディレクトリの保存します。
![mylist.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/a7fed88e-d402-6ae1-d08e-0dd43a63d834.jpeg)
本記事の例では、データからランダムに100件を抽出して使用します。これにより、データの取り扱いが容易になり、グラフの複雑さを適切なレベルに保つことができます。

## ネットワークグラフの構築
次に、NetworkXライブラリを使ってネットワークグラフを構築します。各企業と投資家をノードとして、その間の関係をエッジとしてグラフに追加していきます。ここで、投資家ノードは特別な色でマークすることで、スタートアップと区別します。
グラフの可視化にはPyvisライブラリを用います。PyvisはNetworkXグラフをインタラクティブなHTML形式で表示するためのツールです。可視化されたグラフでは、ユーザーがノードにマウスをホバーすることで、追加の情報を得ることができます。また、ネットワークの特定部分をズームイン・アウトして詳細を確認することも可能です。

```python
from pyvis.network import Network
import pandas as pd
import networkx as nx

df = pd.read_csv('your_data')
#dfの中のランダム100件を抽出
df = df.sample(100)
# 企業名と投資家名を分割する
df['Investor'] = df['Top 5 Investors'].str.split(',')
df.drop(columns='Top 5 Investors',inplace=True)
df['Investor'].fillna('該当なし')

# ネットワークグラフを作成する
G = nx.Graph()

# 企業ごとに投資家リストを作成し、ネットワークグラフに追加する
for i, row in df.iterrows():
    company = row['Organization Name']
    investors = str(row['Investor']).split(',')
    for investor in investors:
        # 投資家がまだネットワークグラフに存在しない場合は追加する
        investor = investor.replace("[","").replace("]","") # [ ] を除去する
        if not G.has_node(investor):
            G.add_node(investor, color="#FFB6C1") # 投資家のノードの色を変える
        # 企業と投資家の間にエッジを追加する
        G.add_edge(company, investor)

# ネットワークのインスタンス生成
network = Network(
    height="600px",
    width="800px",
    bgcolor="#ffffff",
    font_color="#333333",
    notebook=True,
    directed=False,
)

# グラフにノードとエッジを追加
for node in G.nodes():
    if node not in df['Organization Name'].values: # 投資家の場合は色を変える
        network.add_node(node, size=10, color="#FFB6C1")
    else:
        network.add_node(node, size=10, color="#00AEEF")
for source, target in G.edges():
    network.add_edge(source, target, width=1, color="#707070")

network.show_buttons()  # 各種ボタンの表示
# プロットを表示
network.show("network_sample.html")
```
今回の場合は私の研究で使っていた米国のスタートアップのとあるリストを使ったため、アメリカ国立科学財団(Nationnal Science Foundation)が幅広いスタートアップに中核となって投資していることがわかりました。

![pyvis.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397323/87067224-0aa2-d934-76fa-079304a93a08.jpeg)


## まとめ
この可視化コードを利用することで、スタートアップと投資家の関係を一目で理解することができます。特に、ある特定の投資家が多くのスタートアップに投資しているパターンや、ある分野に特化した投資家の動向など、投資の傾向を把握するのに役立ちます。今回のツールはデータサイエンティスト、マーケットアナリスト、または起業家自身にとって、価値あるインサイトを提供する可能性を秘めています。今後より詳細なネットワーク分析の手法を用いたいと考えています！
Vueで「静的img画像」を使用する方法

完全honaki用
悪しからず

## フォルダの作成
```
「app/resources/独自のフォルダ/img」
```
この中に「sample.jpg」などを入れていく

## imgタグの静的なsrc属性で指定
```app/resources/js/components/○○Component.vue
<template>
<header class="header">
    <img src="../../独自フォルダ/sample.jp">
  </div>
</header>
</template>
```

これで完了！
他の方法もある。
参考サイトに載ってる。

## 参考
https://devsakaso.com/vue-js-img-in-assets/
【Python】defaultdictの使い方とは？サンプルコードで解説

# 通常の`dict`との違いは？
Pythonの`defaultdict`を使ってみたので紹介します。

普通の`dict`の場合は、存在しないキーはエラーになります。
しかし、`defaultdict`を使えば、存在チェックが不要になる、というのがメリットです。

`defaultdict`は、`collections`モジュールのクラス。
引数に`list`や`int`などを指定することで、デフォルトの値を提供してくれます。ちなみに`lambda`関数や通常の関数を渡してあげることも可能です。

公式ドキュメントはこちら。

https://docs.python.org/ja/3.6/library/collections.html#collections.defaultdict


# サンプルコード

```py
from collections import defaultdict

# リストをデフォルト値とする
d = defaultdict(list)

# キー'fruits'に対して値を追加
d['fruits'].append('apple')
d['fruits'].append('banana')

# キー'vegetables'に対して値を追加
d['vegetables'].append('carrot')

for key, value in d.items():
    print(f'{key}: {value}')

# 出力結果
# fruits: ['apple', 'banana']
# vegetables: ['carrot']
```

上記の場合、`d = defaultdict(list)`を`d = {}`にすると、`KeyError: 'fruits'`になることがわかります。事前チェックが不要な場合は`defaultdict`の方が楽ですね。
MYSQL5.7 → MYSQL8.0に移行の時にCOLLATIONでつまづいた

弊社で使っているMySQLを5.7からMySQL8.0に移行する作業を行いました。
その際にデータを移行していたところ、COLLATIONで少しつまづいたので解決方法を記載します。
## COLLATIONの確認
デフォルトの照準順序はMYSQL5.7まではutf8mb3_general_ciだったが、MySQL8.0ではutf8mb4_0900_ai_ciになっていました。
RDSのパラメータグループでcollation_connectionとcollation_serverの値は変更できるので、utf8mb4_general_ciに変更しました。

![スクリーンショット 2024-03-11 18.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2200261/e2b55bfb-dea1-faae-55e4-f37ea9c504a2.png)

ただ、default_collation_for_utf8mb4は変更できないので直接DBを変更するしか無いです。
```
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
```
### 補足
DBをインポートする際に、character_setは--default-character-setオプションで指定できますがdefault_collationは指定ができない。

```
mysql>use [DB名]
mysql>SELECT @@character_set_database, @@collation_database;
```
をすると、
```
 @@character_set_database = utf8mb4
 @@collation_database = utf8mb4_general_ci
 ```
になってると思います。

ただ、この状態でインポートしてもテーブルとカラムは、utf8mb4_general_ciになりません。
## 解決方法
```
mysql>SHOW TABLE STATUS;
mysql>SHOW FULL COLUMNS FROM　[テーブル名]
### Collationカラム　は　utf8mb4_0900_ai_ci　になる。
```
なぜ？？？？？？？？？
エクスポートしたファイルの中身を見てみると、CREATE文がCHARSETしか指定されておらず、COLLATEが指定されてない！
だから、Collationはグローバルデフォルトのutf8mb4_0900_ai_ciになっていた？のかもしれない。（正確にはわかりません。）
他に手段がないので、エクスポートしたファイルのCREATE文に `CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci` を追加しました。

RDSのtime_zoneのデフォルトはUTCになってました。
DBパラメータのtime_zoneをAsia/Tokyoに指定して、変更を保存をクリックする。

```
mysql>SHOW VARIABLES LIKE '%time_%';
| system_time_zone                | UTC               |
| time_zone                       | Asia/Tokyo  |
```

## 余談
```
mysqldump: Got errno 28 on write
```
が出た時はファイルの容量が圧迫している可能性があります。
```
ls -al
```
でファイル容量を確認して削除できる大きいファイルを削除しましょう。
Vueで独自cssを使う方法

完全honaki用
悪しからず

## フォルダの作成
```
「app/resources/独自のフォルダ/css/style.css」
```

## import
```app/resources/js/app.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import '../独自フォルダ/css/style.css'; // ここを追加
```

これで完了！

## 参考
https://zenn.dev/itouuuuuuuuu/articles/284c8420d835ed
MySQLのSQL文メモ


### 動作確認環境
- Windows 10 Pro(64bit)
- 8.0.36 MySQL Community Server - GPL

:::note info
随時、追加予定
:::


### データベースを作成
```mysql:基本文
create database <database_name>;
```
```mysql:具体例
create database mydb;
```

### 使用するデータベースを切り替える
```mysql:基本文
use <database_name>;
```
```mysql:具体例
use mydb;
```

### 作成したデータベース一覧を表示する
```mysql
show databases;
```

### データベースのバージョンを知る
```mysql
select version();
```

### 作成したテーブル一覧を表示する
```mysql
show tables;
```


### 作成したテーブルの各カラムのデータ型を知りたい(簡易版)
```mysql:基本文
show columns from <table_name>;
```
```mysql:具体例
show columns from mytable;
```

### 作成したテーブルの各カラムのデータ型を知りたい
- 上記に加えて、Collation, Privilages, Commentの列が追加されています。
```mysql:基本文
show full columns from <table_name>;
```
```mysql:具体例
show full columns from mytable;
```

### 現在日時、時刻を表示する
```mysql
select now();
```

### UNIXタイムスタンプを表示する
```mysql
select unix_timestamp();
```
[Python] %%timeitの回数設定

Jupyter Notebook（IPython）では、`timeit`モジュールをインポートせずに、マジックコマンド`%%timeit`が使える。

`%%timeit`では、セル全体の実行時間を計測する。
* `r`：繰り返し回数
* `n`：ループ回数

```python
%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)

# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
```

処理時間の長いコードで行う際などに、実行回数は以下のように指定できる。

```python
%%timeit -r 1 -n 1

#
# 処理
#
```
Pythonで「Pythonでの正規表現の利用方法」の動作を確認してみた

# 概要

Pythonで「Pythonでの正規表現の利用方法」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index1.html

# 実装

以下のファイルを作成しました。
```sample.py
import re

target = 'apple and orange'

pattern = re.compile(r'a.{3}e')
result = pattern.search(target)

if result :
  print(result.group())
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
apple
```

# まとめ

何かの役に立てばと。
macのターミナルの文字サイズを変える方法


macのターミナルの文字サイズを大きくするには
command + ＋（プラス）
![IMG_9717.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083099/ea59c628-72ff-ea2e-94b0-eba49b53bcd9.jpeg)




文字を小さくするには
command + -（マイナス）

![IMG_9718.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083099/93bf2ab2-8710-e99a-97b2-bfc2401db34f.jpeg)
【新卒エンジニア就活】メガベンチャー内定までの流れ

## はじめに

愛知県の工業大学に通っています！
25卒でエンジニアとして就活をしてきました。
Web系を中心にフロントエンドエンジニアを志望していました。

## 技術スタック
- フロントエンド
    - HTML/CSS,JavaScrit,React,TypeScript
- バックエンド
    - Python,Node.js,PHP
- データベース
    - MySQL,MongoDB


## 就活の流れ

- 2023年6月　逆求人ナビ登録
    - 逆求人ナビのイベント初参加
- 2023年8月　逆求人ナビのイベントで出会った企業の初面接（Speee株式会社）
    - 逆求人ナビイベント参加（計2回）
- 2023年9月　サポーターズ登録
    - ハードウェアのコンテスト参加（最優秀賞受賞）
    - 逆求人ナビイベント参加（計3回）
    - インターン参加
- 2023年10月　キャリアセレクト登録
    - インターン参加
    - 逆求人ナビイベント参加（計3回）
- 2023年11月　逆求人ナビイベント参加（計2回）
    - インターン参加
    - ハッカソン参加（最優秀賞受賞）
    - 初内定を頂く
- 2023年12月　逆求人ナビイベント参加（計2回）
    - 内定2社頂く
-　2024年1月　内定2社頂く
- 2024年2月　内定を承諾し就活終了（合同会社DMM.con）

## やっておいてよかったこと

- 開発物の作成
- 先輩との繋がり
    - 研究室の先輩と交流を持つことによって面接における重要事項を聞ける
- インターン参加
    - 短期インターンに複数参加
- 逆求人への参加
    - 逆求人ナビのイベントに計12回参加
    - １日で多くの面談を行うことができ、本番にとても近い面接練習となる

## 逆求人ナビを使ってよかったこと

- １日で多くの面談を行うことができ、本番にとても近い面接練習となる
- イベントで参加した際に使う自己紹介スライドは自己分析に直結する
- 面談で企業側から好印象を得ると特別選考をもらえる
- 早期から始めれば一つのサイトでインターンと本選考が完結する

## まとめ

ざっくりと自身の就活の流れをまとめただけですが、皆さんの今後の就活の参考になれば幸いです。ここまで読んでいただきありがとうございました。
今後さらに編集していきさらに詳細にブラッシュアップしていきたいと思います。

### 就活で使ったサイト
- 逆求人ナビ

https://www.studenthunting.com/
- キャリアセレクト
- サポーターズ
AWS WAFとDeepSecurityで考えるセキュリティ 

# ■初めに
AWS WAFとDeepSecurity、導入するならどちらかでいいんじゃない？という話があり、少し調べ直してみました。
何と無く理解しているものの少し漠然としている部分もあったので復習ついでに書いてみます。（出来るだけ簡単な表現で書いてみます）

# ■まずネットワークのレイヤーについて
WAFやDeepSecurityの話に入る前に、この辺り整理していた方が良いと思われます。

ネットワークのレイヤーは、通信プロトコルに基づいて役割の違いで階層分類したものです。
主な階層分類モデルには、「OSI参照モデル」と「TCP/IPモデル」があります。

今回「OSI参照モデル」で進めていきます。

# ■「OSI参照モデル」とは
コンピュータネットワークに求められる機能（通信機能）を「7階層」の構造に分割し定義したものです。
OSI参照って何だという感じですが、バラバラだった基準を統一したモデルという理解で一旦良いと思います。

# ■「OSI参照モデル」の7階層

以下の7階層に分かれていますので、一言ずつ添えます。

#### 【7層	アプリケーション層】
具体的なアプリケーションの通信規則を定めます。HTTP、SMTP、FTPなどがここに属します。

#### 【6層	プレゼンテーション層】
データ表現と暗号化を行います。圧縮、暗号化、文字コード変換が含まれます。

#### 【5層	セッション層】
通信手段を提供し、セッションの確立・維持・終了を管理します。セッションキー、ダイアログ制御が関連します。

#### 【4層	トランスポート層】
エンド間の通信制御を担当します。データのセグメンテーション、再送制御、フロー制御が行われます。

#### 【3層	ネットワーク層】
データを送る相手を決め、最適な経路で送信します。IPアドレス、ルーター、ルーティングが含まれます。

#### 【2層	データリンク層】
隣接する機器同士の通信を実現し、フレームとしてデータを送受信します。MACアドレスやイーサネットスイッチが関連します。

#### 【1層	物理層】
データをビット列として送信するための物理的な接続を担当します。ケーブル、電気信号、ハブなどが含まれます。

# ■上記「7層」の説明について
ここでは簡単に記載しましたが、分かりやすい解説がなされているサイトがたくさんあるので詳しくはそちらでお願いします…

以下辺りおすすめです。

OSI参照モデルとは？TCP/IPとの違いを図解で解説
https://www.itmanage.co.jp/column/osi-reference-model/

AWS WAFとTrend Micro Deep Securityによるフルスタック防御について #reinvent
https://dev.classmethod.jp/articles/aws-waf-trend-micro-deep-security/


# ■AWS WAF は「7層」をカバー

> 【7層	アプリケーション層】
> 具体的なアプリケーションの通信規則を定めます。HTTP、SMTP、FTPなどがここに属します。

AWS WAFはWebアプリケーションファイアウォールです。
通信の一番最初の段階で防護壁になってくれて、DDoS攻撃であったり、クロスサイトスクリプティング攻撃等から守ります。


# ■DeepSecurity は「4〜6層」をカバー

> 【6層	プレゼンテーション層】
> データ表現と暗号化を行います。圧縮、暗号化、文字コード変換が含まれます。

> 【5層	セッション層】
> 通信手段を提供し、セッションの確立・維持・終了を管理します。セッションキー、ダイアログ制御が関連します。

> 【4層	トランスポート層】
> エンド間の通信制御を担当します。データのセグメンテーション、再送制御、フロー制御が行われます。

ホスト上で動作して、主に以下の項目のカバーを行ってくれます。

```
・不正プログラム対策 (アンチマルウェア):
リアルタイムでファイルの受信、開封、ダウンロード、コピー、編集などの処理を監視し、
セキュリティ上のリスクがないかどうかを検出します。

・侵入防御 (IDS/IPS):
受信および送信トラフィックを検査し、不審なアクティビティを検出してブロックします。
既知またはゼロデイの脆弱性に対する攻撃を防ぎます。

・変更監視:
不審なアクティビティを示している可能性があるファイルや重要なシステム領域への変更を検出します。

・セキュリティログ監視:
システムログをキャプチャして分析し、重要なセキュリティイベントを識別するのに役立ちます。
```

# ■「1〜3層」は…？
AWSを利用している場合、AWS側でコントロールする必要があります。
物理はAWS側が管理してますね。

```
第1層 (物理層):
AWSは物理的なネットワークインフラストラクチャを管理しています。
はデータセンター、サーバー、ネットワークケーブル、ルーター、スイッチなどが含まれます。

第2層 (データリンク層):
AWSは仮想ネットワークを提供し、仮想マシン（EC2インスタンスなど）を接続するための
仮想スイッチや仮想ルーターを管理しています。
VPC（Virtual Private Cloud）やサブネットも含まれます。

第3層 (ネットワーク層):
AWSはルーティング、ネットワークアドレス、セキュリティグループ、
ネットワークACL（Access Control List）などを管理しています。
これにより、トラフィックの制御やセキュリティの強化が行われます。
```

# ■AWS WAFとDeepSecurity、導入するならどちらかでいいんじゃない？

最初の話に戻りますと、ここまでの説明の通りそれぞれ役割が違う事がわかりました。
AWS WAFとDeepSecurityを併用する事により広域をカバーできます。（フルスタックの防御とかとも言うらしい）

# ■DeepSecurityでもDDoS対策は出来る
みたいなんですが、ホスト上に設定するものになるので、
例えばALBにWAFを紐づけている場合はサーバーまでは到達してしまいます。
攻撃が発生した場合はサーバーリソースに影響が出るものと思われますので、やはり併用するのが安心ですね。

長くなりましたが以上です！
Claudeの領収書・請求書発行方法【Anthropic】

## Claudeの領収書・請求書発行方法

Claudeの領収書・請求書発行方法をまとめていきます。
&nbsp;
&nbsp;
### メールが届いているはず
まずは、「Your receipt from Anthropic #XXXX-XXXX」の表題でメールが来ているので確認しましょう。メールに領収書と請求書が添付されています。

![Claude-領収書・請求書発行方法.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336223/91f0bb01-7dff-e504-e2af-c1036a63a7d1.jpeg)


&nbsp;
&nbsp;
### 手順解説

&nbsp;
&nbsp;
Claudeにログインして、左下のアイコン（メールアドレス）から「Settings」をクリック
https://claude.ai

![スクリーンショット 2025-02-22 3.06.07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336223/31f26f1a-069d-4ac0-b1c0-1161a8b8fbca.jpeg)

&nbsp;
&nbsp;
発行したい領収書・請求書の日付横の「View」マークをクリック。
![スクリーンショット 2025-02-22 3.06.33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336223/65d08d4f-cd3e-4e2f-ab5e-b4a7becf2c44.jpeg)

&nbsp;
&nbsp;
宛名を変えたい場合は、請求先情報を変更してください。
領収書・請求書をダウンロードして、完了。

![Claude-領収書・請求書発行方法-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336223/9a7258eb-4f98-6b13-91c1-c64a75f6f286.jpeg)


&nbsp;
&nbsp;
以上！
CS0104 'ooo'は、'xxx'と'yyy'間のあいまいな参照です。

# CS0104 `ooo`は、`xxx`と`yyy`間のあいまいな参照です。

## 原因
これは、`ooo`が、`xxx`と`yyy`の両方で存在していて、PCがどっちの`ooo`を選べばいいかを悩むと発生するエラーです。

## スマートに解決

```csharp
using xxx;
using yyy;
```
と一番上のところに書いてある場合がほとんどだと思うので、
使いたい方を残して、いらない方の行を消します。
今回は、`xxx`の方を使いたいと仮定すると結果は以下のようになります。
```csharp
using xxx;
```

## 共存させる形のスマートな方法(2024/3/11更新)

エイリアスを使うことで、共存させつつ、スマートに解決することが可能です。
エイリアスとは、
```csharp
using 名前 = 名前空間;
```
という形でusing文を使うことで、名前空間の部分を名前で代用することが可能です。
例でいうと以下のような感じです。
```csharp
//例
using X = xxx;
using Y = yyy;

var X1 = new X.ooo();
var Y1 = new Y.ooo();
```

## ゴリ押しで解決

`xxx`と`yyy`の両方を消したくない!
となると、以下のようにするのが、一番いいですね。
```csharp
xxx.ooo;
yyy.ooo;
```
`xxx`や`yyy`にコロンをつけることで、
明確に、`xxx`の`ooo`や、`yyy`の`ooo`だとわかるので、
PCが悩まずに済むように、なります。
上記のコードだと、少しわかりにくいので、例を示します。
```csharp
//例
var vector3A = new UnityEngine.Vector3();
var vector3B = new System.Numeric.Vector3();
```
JScriptでCSVファイルをSQLで検索


# 概要
録画ワークシート（.ods）をCSVで保存し、SQLでグループ集計する。

# 環境
- Windows 11 Pro (64bit)
- Microsoft Access database engine 2016 (English)
- LibreOffice Calc

# 手順
## CSVファイルの用意
録画.odsをCSVで名前を付けて保存する。
ファイル名：録画.csv
ファイルの種類：テキストCSV(*.csv)
文字コード：日本語(Windows-932) 或いはShift-JIS
フィールドの区切り記号：,

## CSVファイルの加工
日付項目はその日の先頭行以降は省いているため補間する。
日付、タイトル項目を抽出。
JScriptファイルはANSI（Shift-JIS）で保存する。

```csvproc.js
/*
cscript //Nologo csvproc.js < 録画.csv > rokuga.csv
*/
{
	var d;
	while (! WScript.StdIn.AtEndOfStream) {
		var rec = WScript.StdIn.ReadLine();
		var f = rec.split(",");
		if (f[2]) {
			d = f[2];
		}
		var fld = [d, f[8]];
		WScript.StdOut.WriteLine(fld.join());
	}
}
```

## ファイルDSNの作成

スタートメニューをクリックし、odbcと入力して「ODBCデータソースアドミニストレーター(64ビット)」を起動する。
「ファイルDSN」タブの追加ボタンをクリックする。
ドライバーから「Microsoft Access Text Driver (*.txt, *.csv)」を選択しdsnファイルを作成する。
設定はデフォルト値で。

Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント（accessdatabaseengine_X64.exe）が必要。

https://www.microsoft.com/ja-jp/download/details.aspx?id=54920

```hoge.dsn
[ODBC]
DRIVER=Microsoft Access Text Driver (*.txt, *.csv)
UID=admin
UserCommitSync=Yes
Threads=3
SafeTransactions=0
PageTimeout=5
MaxScanRows=25
MaxBufferSize=2048
FIL=text
Extensions=txt,csv,tab,asc
DriverId=27
DefaultDir=C:\Projects\etc\db
```

## Schema.iniの用意
ANSI（Shift-JIS）で保存する。

```Schema.ini
[rokuga.csv]
Format=CSVDelimited
ColNameHeader=True
MaxScanRows=25
CharacterSet=932
Col1=日付 Text
Col2=タイトル Text
```

Schema.ini ファイル (テキスト ファイル ドライバー) - Open Database Connectivity (ODBC) | Microsoft Learn

https://learn.microsoft.com/ja-jp/sql/odbc/microsoft/schema-ini-file-text-file-driver

## グループ集計
JScriptファイルはANSI（Shift-JIS）で保存する。

```group.js
/*
cscript //Nologo group.js > result.csv
*/
{
	var cn = WScript.CreateObject("ADODB.Connection");
	cn.Open("FileDSN=./hoge.dsn;");

	var sql = "select min(日付),count(*),タイトル"
		+ " from [rokuga.csv]"
		+ " group by タイトル having count(*)>1"
		+ " order by 1";

	var rs = cn.Execute(sql);
	for ( ; ! rs.EOF; rs.MoveNext()) {
		var fld = [];
		for (var i = 0; i < 3; i++) {
			fld[i] = rs(i);
		}
		WScript.Echo(fld.join("\t"));
	}
	rs.Close();
	cn.Close();
}
```

Microsoft OLE DB Provider for ODBC - ActiveX Data Objects (ADO) | Microsoft Learn

https://learn.microsoft.com/ja-jp/sql/ado/guide/appendixes/microsoft-ole-db-provider-for-odbc

# おまけ

総務省｜地方行政のデジタル化｜全国地方公共団体コード

https://www.soumu.go.jp/denshijiti/code.html

から「都道府県コード及び市区町村コード」`000925835.xls`をダウンロード。CSVファイルで保存。
ヘッダ行の改行を修正する。

```Schema.ini
[000925835.csv]
Format=CSVDelimited
ColNameHeader=True
MaxScanRows=25
CharacterSet=932
```

```shin.js
/*
cscript //Nologo shin.js > result.csv
*/
{
	var cn = WScript.CreateObject("ADODB.Connection");
	cn.Open("FileDSN=./hoge.dsn;");

	var sql = "select * from [000925835.csv]"
		+ " where 市区町村名（漢字） like '%新%'";

	var rs = cn.Execute(sql);
	for ( ; ! rs.EOF; rs.MoveNext()) {
		var fld = [];
		for (var i = 0; i < 5; i++) {
			fld[i] = rs(i);
		}
		WScript.Echo(fld.join("\t"));
	}
	rs.Close();
	cn.Close();
}
```
TP-link Omada ControllerをUbuntu22.04にインストールする

TP-linkの業務用無線APはソフトウェア型コントローラーが無償で提供されています。今回はUbuntu 22.04上にコントローラーを構築していきます。Ubuntu22に対応していると公式HPには記載されていますが、マニュアル通りにやっても上手くいかない部分があったので、今回記事にしておきます。

なお、中小規模向けにはハードウェア型コントローラー、大規模向けにソフトウェア型コントローラーという棲み分けらしく、本番環境利用では大人しくハードウェア型コントローラーまたはクラウド管理を利用した方がよいでしょう。

# 環境
今回は以下の環境で構築します。
- Ubuntu 22.04LTS (LXC on Proxmox VE8.1.4)
- Omada SDN Controller v.5.13.23
- TP-link EAP610 firm ver.1.4.3

サポートOSは以下のようですが、古いOSばかりなので、今から構築するのであればUbuntu22.04一択になりそうです。
> Ubuntu 16.04, 18.04, 20.04, 22.04
> CentOS 6, 7
> Debian 8, 9, 10, 11

# 必要なもをインストール
omadaの動作には以下のコンポーネントが必要です。
- Java8
- MongoDB v4系
- jsvc
- curl
- OpenSSL 1.1.1

まずはJava8とその他の必要なパッケージをインスールします。gnugpはMongoDBのインストール時に必要です。
```
apt install openjdk-8-jre-headless curl jsvc gnugp
```
Java11でも動作するようですが、標準リポジトリにはるjsvcよりも新しいバージョンが必要らしいです。

OpenSSLをインスールしますが、バージョンが古くUbuntu22.04のリポジトリからは外されているよううで、直接ダウンロードしてきます。
以下から持ってきます。
http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/

```
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb
dpkg -i libssl1.1_1.1.1f-1ubuntu2.22_amd64.deb
```

# MongoDBのインストール
まずは公開鍵をインポートします。公式ドキュメントにある`apt-key`は非推奨になっています。
```
wget -qO -  https://www.mongodb.org/static/pgp/server-4.4.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-4.4.gpg
```
MongoDBのリポジトリを追加します。v4.4は22.04に非対応とのことで、20.04向けのを無理やり追加します。
```
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
```
インストール
```
apt update
apt install mongodb-org
```

# Omada SDNインストール
[ここから](https://www.tp-link.com/jp/support/download/omada-software-controller/#Controller_Software)debファイル版をダウンロードしインストールします。
```
wget https://static.tp-link.com/upload/software/2024/202402/20240227/Omada_SDN_Controller_v5.13.30.8_linux_x64.deb
dpkg -i Omada_SDN_Controller_v5.13.30.8_linux_x64.deb
```
インストールすると自動起動しますので、`http://<ip>:8088/`にアクセスし、指示通りに初期設定を行います。

# APの設定
管理画面Mnagemanet>ControllerのInform URIにコントローラーのIPアドレスを入力し、Saveするとコントローラーに登録されます。

# 参考文献
https://www.tp-link.com/jp/support/faq/3272/
https://blog.puvvadi.me/posts/omada-sdn-controller-ubuntu-22-04/
コントラクトの脆弱性を報告した話

# 背景
お触り系タスクでありがちな，「一日一回無料でNFTをMintできる」類のタスクを自動化するために，該当するコントラクトの関数を見ていた時に発見(具体的なコントラクト名は伏せる)．

# コントラクト
まず，該当するコントラクトの関数部分を見てみる．
## mintDailyNFT
```
function mintDailyNFT(
    address to,
    uint256 quantity,
    uint256 nonce,
    bytes memory signature
) public nonReentrant{
    _mintWithSignature(to, NFT_TOKEN_ID, quantity, nonce, signature, true);
    emit MintDailyOma(to, quantity);
}
```
これが一日一回NFTをMintできる関数である．動作としては，reentrancyを回避しつつ_mintWithSignatureを実行し，フロントエンドにイベントを送信している．ここでの疑問は，引数にあるsignatureとは何か？だろう．これは_mintWithSignatureを見ることで解決できる．

## _mintWithSignature
```
function _mintWithSignature(
    address to,
    uint256 tokenId,
    uint256 quantity,
    uint256 nonce,
    bytes memory signature,
    bool isDaily
) internal {
    // nonceが既に使われていれば例外を投げる
    require(!usedNonces[nonce], "nonce already used.");
    
    // 引数からmessageを作成
    bytes32 hash = keccak256(
        abi.encodePacked(to, tokenId, quantity, nonce, address(this), isDaily)
    );
    bytes32 message = _prefixed(hash);
    
    // signatureを使用してmessageからsigner addressを復元
    address signer = message.recover(signature);

    // signer addressがDEFAULT_ADMIN_ROLEを持っていなければ例外を投げる
    // つまり，signerがadmin(contract creator)でなければ無効なtxである
    require(
        hasRole(DEFAULT_ADMIN_ROLE, signer),
        "bad signer role signature."
    );

    // nonceを使用済みにする
    usedNonces[nonce] = true;

    // NFTをMint
    _nftMint(to, tokenId, quantity);
}
```
ここで，signatureはadminによる署名であることが分かる．つまり，__フロントエンドからMintしないと有効なsignatureは作れない__ ということである．更に，nonceがあるため署名の再利用はできない．よくできているなと感心しつつ，フロントエンドを介さないとMintできない事実に落胆した．

# MintのInput Data
気を取り直して，フロントエンドからMintした際のInput Dataを見てみる．

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950815/6877506f-4f92-1504-8fc1-031a6acbfe08.png)

他は予想通りだが，nonceに謎の値が使用されていることが分かる．ここで話は変わるが，MetaMask等のWalletアプリでは，txの送信前にtxの内容を確認できる機能が付いている．実際に，mintDailyNFTをフロントエンドから実行しようとした際のtxの内容を確認してみる．

![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950815/13f90cbf-5409-1fca-6f7f-8c4581645fa6.png)

ここで，青線がnonce，赤枠がsignatureである．次に，このtxを送信せずにバツを押し，再度mintDailyNFTをフロントエンドから実行しようとした際のtxの内容を確認すると，以下の様になっていた．

![test3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950815/0dd23bd3-b9ed-6ccb-8f1c-90cc8ab1f279.png)

なんと，nonceの値が全く異なる．要するに，フロントエンド側はtxごとにランダムなnonce値を使ってsignatureを作成しているということである．これの何が脆弱性なのかというと，__無限にnonceが異なるsignatureを作り放題=無限にMintし放題__ ということである．

# 実際にやってみた
複数のsignatureを作成し，三連続でmintDailyNFTを実行してみた．

![test4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950815/9c050f94-f8c1-48e3-1a93-7e0f98e16f53.png)

実行できてしまった．(MintしたNFTはburn済)

# 脆弱な点まとめ
1. nonceをtxごとに乱数で作成していた
2. Mintが一回目かどうかをフロントエンド側で判断していた(これは仕方ない？)

以上，この記事がよりセキュアなコントラクト作成に活用できれば幸いです．

# 3/19 追記
脆弱性が修正されていました．おそらく日付毎に固定のnonceが設定されている様子．
MAC OSの「webfilterproxyd」の内容とプロセスの止め方

## 「webfilterproxyd」とは

「webfilterproxyd」はWebフィルタリングを行うデーモンです。
コンテンツフィルタリングを行なっているため、メモリの使用率が高くなりやすいです。

WebFilterProxyの主な機能は以下の通りです。
- コンテンツフィルタリング
    - アクセスされるWebサイトの内容を解析し、不適切なコンテンツをブロックする
- ペアレンタルコントロール
    - 親が子供のMacやiPadでWebサイトの閲覧を制限する
- ログ記録
    - ブロックされたWebサイトアクセスのログを記録する
- SSLトラフィックの監視
    - SSLで暗号化された通信もフィルタリング対象


## 「webfilterproxyd」の原因・対処方法

WebFilterProxyは、macOSの「スクリーンタイム」の機能の一部として使用されています。
スクリーンタイムを有効にすると、自動的にWebFilterProxyの「webfilterproxyd」が起動します。

設定は「システム環境設定」-「スクリーンタイム」から行えるのでオフにするとよいでしょう。暫定的な対処であればプロセスのKillを、恒久的な対処であればスクリーンタイムをオフにしましょう。


以上！
Java ラッパークラスについて

## ラッパークラスとは

基本データ型のデータをオブジェクトとして包み込むクラスのことです。
また基本データ型とラッパークラスでは自動的に型変換が行われます。


:pushpin:基本データ型のおさらい

https://qiita.com/nukoxo/items/5d9d72f3e451a9afb781

## :ledger:ラッパークラスの種類

8種類のラッパークラスが`java.langパッケージ`に用意されています。
一覧にまとめてみました。

| データ型 | ラッパークラス |
|:-:|:-:|
| byte  |  Byte |
| short  |  Short |
| int  |  Integer |
| long  |Long   |
|  float | Flort  |
| double  | Double  |
| char  | Character  |
| boolean  |  Boolean |

int型とchar型以外は一文字目が大文字になります

:::note info
ラッパークラスは参照型なので、初期化していない場合の値がnullになっています。
値を設定していない時に参照型→基本データ型への自動変換が行われると
プログラムの実行時にエラーが出てしまいます。
:::

## :ledger:ラッパークラスからStringへのキャスト
ラッパークラスのインスタンスメソッド `toString()` を使用します。

数値の変数名.toString() と書いて実行することで、その数値がString型へ変換されます。

~~~java
Integer A = 123;
String number = A.toString();
~~~

## :ledger:Stringからラッパークラスへの変換
Stringを整数のint（Integer）へ変換したい場合は
`Integer.parseInt() `というstaticなメソッドを使います。

~~~java
String S = "123";
int number = Integert.parseInt(S);
~~~

### :pushpin:String（参照型）のおさらい

https://qiita.com/nukoxo/items/2d61319e607c53a397c9
どれを選ぶ！？自社サvs受託vsSESエンジニア

エンジニアのキャリアとして、自社サービス企業か受託開発企業かSES企業を選ぶかは、大きな話題、課題だと思います。
そして、ネット上では、どれが良いとか悪いとかという話も沢山展開・議論されてます。
私は、自社サービス企業、受託開発企業、SES企業の全ての企業で取締役CTOを経験してきました。
その立場からは、単純に議論すべきではなく、その人のタイミングやキャリア形成など考慮する事が重要だと思ってます。

全てのエンジニアのキャリア形成のために選択の参考になればと思います。

## 自社サービス開発企業

### いいところ
そのサービスが凄ければ凄いほど、色んな経験が積める
いるエンジニアが優秀、広告なら高トラフィックのさばき方とか、マーケティングとか、機械学習やAIとか、サービスによってそういうことを学べる。
高トラフィックでは、お陰でソシャゲで落ちなかったり、Line砲でも大丈夫だったりの経験が積める。

特に儲かっていれば、投資もあるのでチャレンジしやすい

### マイナス面
いい場所に入れるのは一部のエンジニアで、同じ仕事をやり続けることの方が多い（他人がつくったソースを改修し続ける、うまくいってないサービスだとコスト削減のためとか、保守的な改修がメインでエンジニアとして面白いと思える部分が意外と少ないかも知れない）

年代：ある程度スキルが出来上がっててる中盤～シニア向けエンジニアは、ゆっくりと落ち着いて仕事が出来て良いと思う
もちろん、優秀であれば、若手から行ってドンドン活躍できると思う

**年代別おすすめ度**

* **中盤～シニアエンジニア:** 豊富な経験を活かして、安定した環境で働きたい人におすすめ
* **若手エンジニア:** 優秀なエンジニアも場合は良いが、入社難易度が高いし、成長できない可能性も高い

## SES企業

### いいところ
昔はブラックなイメージが多かったですが、最近のは残業管理がしっかりしている、早く終えて、自分の勉強の時間を確保したり、プライベートを充実させたり、ワークライフバランスが良い、嫌なPJなら辞めたいと言う事も出来るし、自分のキャリア戦略にそった案件が選べるところもある。

キャリアの選択肢として良い部分がある

### マイナス面
ある程度の年齢になってくると、スキルの切り売りみたいな部分がでてくる、サービスにコミットしたい、リーダーとして育てていきたい等の部分が経験できない
年代：自分のスキル、キャリア形成のために若いころとシニアの時に利用するのはあり

### SESは40歳以降だとしんどい？
スキルさえあれば、そんなことない！
そもそもプログラミングだけのエンジニアだとキツイけど、それはもうそもそもの話。
これからは生成AIがドンドン進化してきてプログラミングだけしか出来ないエンジニアは不要なってくる。
40歳超えても、アーキテクチャを考えれたり、要件定義とか設計力が高かったり、PM力とかスクラムマスターが出来たり、パフォーマンスチューニングが得意だったり、プログラミング以外の部分の能力があれば、十分やっていける。

僕自身も採用側をやってますが、40歳超えててもハードルにはなりません
△10年前だとハードルだったかも

## 受託開発企業
### いいところ
お客様の案件で新しい技術にチャレンジできる、色んな方と巡り合える、成長の可能性がとても高い。
Poc的にブロックチェーン案件や生成AI案件とかも受託だから出来る部分だったりするし、納品後の面倒もみなくて良い場合もあるので、手離れよく別の案件に移ることも出来る。

### マイナス面
納期があり、残業が発生する事が多い、プレッシャー、PJで当たりハズレがあるので精神的にまいってしまう
やる気もあり、精神力が強い人は、ドンドン成長できる可能性はある。

年代：体力的にしんどいので若手向け

# 25~34歳のエンジニアに向けた森川のオススメ
大手SIerや大手SESがオススメですね。
大手SIerも嫌われたりしてるけど、若いうちは、落ち着いて勉強できるし、教育支援とか福利厚生とかもしっかりしてるので、大手SIerはめちゃくちゃオススメ。ベンチャーだとイキナリ、ソースコード書かされて、マネージャーもマネージャー教育を受けてないマネージャーばかりで、ちゃんと成長できない。
↑ここ重要で、ベンチャーにはマネージメントを知らないエンジニアマネージャーがゴロゴロいます

その点大手SIerは、マネージャー教育もしっかりしてるので、大丈夫なマネージャーも多いし、スキルアップのサポートが充実してます。

ある程度、スキルが出来てきたら、フリーランスへチャレンジしたり、自社サのエンジニアになったり自分なりのスキルアップも考えられると思います。"
Rails 6.1においてのAWSへのwebcompile

## Rails 6.1で起こったwebcompile errorについて
以前webcompileをしたときの内容の備忘録です。何か間違えがあればよろしくお願いします。
Referencesにおいてある記事はHerokuについて書かれているものもあったのですが、AWSでも機能したので、メモ程度に書いておきます。

### 環境設定
node -v 16.17.0
yarn -v 1.22.19
ruby -v 3.0.2
rails -v 6.1.4

### 最初に起こったエラー

```
Compiling...
Compilation failed:
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error: Cannot find package '@babel/plugin-proposal-private-methods' imported from ...
```
  AWSでprecompileを実行したらこのエラーに遭遇しました。
初めに@babel/plugin-proposal-private-methodsが存在しないようだったので、nodeを再度インストールを試みました。しかしながら、@babelにはすでに@babel/plugin-private-methodが存在していました。

よって先人の知恵を借りて以下のようにbabel.config.js変更しました。
```
@babel/plugin-proposal-private-methods
↓
@babel/plugin-proposal-private-property-in-object
```
```
@babel/plugin-transform-private-methods
↓
@babel/plugin-transform-private-property-in-object
```
このように変更することでAWSでも無事precompileできました。

個人的な話ですが、多くの方が思っていることですが、エラー文を確認する癖をつける必要があると感じました。

## References

https://github.com/rails/rails/issues/48372

https://github.com/nori0906/flamenco_session/pull/66

↓こちらが同じ現象でわかりやすいと思います

https://mrradiology.hatenablog.jp/entry/2023/09/29/122815