OmniAICreator/Qiita-1.07M huggingface dataset:
TCP/IPにおける通信の仕組み

### 宛先情報はMACアドレス、IPアドレス、ポート番号
IPアドレスとMACアドレスを元にデータを届けるだけで、通信先のソフトウェアを指定しないと同士が通信できない。そこで、通信先のソフトウェアの指定に使われるのが、ポート番号という通信ソフトウェアを特定できる番号。
　MACアドレス+IPアドレス+ポート番号+データ
　MacアドレスとIPアドレスの情報から宛先のノードが分かる。
ポート番号は　通信先のソフトウェアを指定

### ウェルノウンポート
アプリケーション層のプロトコルが使用するポート番号は、あらかじめ決められています。例として、Webブラウザを使ってインターネ。ットサイトにアクセスすると　HTTPというプロトコルが使用され、この時のアクセス先のWebサーバのポート番号は80番と決まっており、Webブラウザからは、宛先情報として80というポート番号が付加された要求メッセージがWebサーバに送信されます。このように、TCP/IPの主なプロトコルで使用されているポート番号のことをウェルノウンポートという。
### 三つの宛先情報は各層で順番に付加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/2cf5a54c-d42d-7f74-4830-ee12c4a385eb.png)
送信データに付加される宛先情報は、これらの機能を実現するために付加されるアドレス情報で、
TCP層では通信ソフトウェアにデータを届ける為、ポート番号を付加する。
IP層では異なるLANに属するノードにもデータを届ける為、IPアドレスを付加する。
ネットワークインタフェース層、ノードにデータを届ける為、Macアドレスを付加する。
各層では宛先アドレス情報のほか、送信元のアドレス情報など、それぞれの層が役割を果たすために必要となるいろいろな情報を付加される。
この付加される情報をヘッダといい
TCP層⇒　TCPヘッダ　⇒　TCPセグメント
IP層　⇒　IPヘッダ ⇒　IPパケット
ネットワークインターフェース層　⇒　イーサネットヘッダ　⇒　イーサネットフレーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/19ab8259-cb1b-7b1b-bf77-1818468d5b24.png)

### MACアドレスやIPアドレスを取得するプロトコル
宛先アドレス情報として付加するMACアドレスやIPアドレスがわからない場合、プロトコルのARPとRARPが重要。
ARP（Address　Resolution　Protocol）TCP/IPネットワークにおいてIPアドレスからMACアドレスを求めるプロトコルである。これと逆に、Macアドレスを元にIPアドレスを求めるプロトコルがRARP
ARP　IPアドレス　⇒　MACアドレス
RARP　MACアドレス　⇒　IPアドレス
ARPの仕組み
①通信相手のMACアドレスを取得したいノードは、通信相手のIPアドレスを指定したARPを要求パケットをLANないのすべてのノードに送信する。
②ARP要求パケットを受信した各ノード、自分のIPアドレスかどうかを判断する。一致したノードは、ARP応答パケットに自分MACアドレスを入れて返す。

一つのLAN内のすべてのノードに対して同時に一度の送信、同じデータを送信することを　ブロードキャスト（同時通報）　という。
また、ブロードキャストが伝わる範囲内を　ブロードキャストドメインという。
その他、一つのアドレスを指定して特定の相手に送信することをユニキャスト、複数の相手を指定して送信することを　マルチキャスト　という。

練習
データを送信する際に、宛先情報はIPアドレス、Macアドレス、ポート番号の三つのアドレスを情報が付加される。
ポート番号は、TCP層で付加される。
IPアドレスは、IP層に付加される。
TCP/IPの主なプロトコルで使用されているポート番号をウェルノウンポートという。
せんせー、バイオベースプラスチックってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、バイオベースプラスチックってなに？

# バイオベースプラスチックとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## バイオベースプラスチックって何？

みんな、プラスチックのおもちゃや容器を見たことがあるよね？普通のプラスチックは、石油というものから作られるんだ。でも、「バイオベースプラスチック」は、植物などの自然のものから作られる特別なプラスチックだよ。

## どういうこと？

普通のプラスチックは、地球に優しくないことがあるんだ。でも、植物から作るバイオベースプラスチックは、地球にやさしいと言われているんだよ。

## どうしてそれがすごいの？

たくさんのプラスチックを使うと、地球が困ってしまうことがあるんだ。でも、植物から作ったプラスチックは、地球を守るための一つの方法として考えられているよ。

## だから、バイオベースプラスチックってなに？

バイオベースプラスチックは、植物などの自然のものから作る、地球にやさしいプラスチックのことなんです。

# まとめ

このように、バイオベースプラスチックは、環境や地球を考えて、
より良い方法で作られる新しいタイプのプラスチックなんです。
せんせー、宇宙マイニングってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、宇宙マイニングってなに？

# 宇宙マイニングとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## 宇宙マイニングって何？

みんな、宝探しをしたことがあるよね？宇宙マイニングは、宇宙の中で宝物を探しに行く大冒険のことです。

## どういうこと？

地球の外には、月や小惑星という大きな岩がたくさん浮いているんです。
そして、その岩の中には、私たちにとって価値がある素材や宝石のようなものが隠れていることがあります。
宇宙マイニングは、その宝物を探して取りに行くことなんです。

## どうしてそれがすごいの？

地球にはない、特別な素材や宝石を宇宙から取りに行けると、新しい技術や製品を作ることができるかもしれないんです。それに、宇宙での冒険はとってもわくわくすることですよね。

## だから、宇宙マイニングってなに？

宇宙マイニングは、宇宙の中の岩や星から宝物を探しに行く大冒険のことなんです。
このように、宇宙マイニングは、宇宙の奥深くに隠された資源を探し求める新しい冒険の一つなんです。

# まとめ

このように、宇宙マイニングは、宇宙の奥深くに隠された資源を探し求める新しい冒険の一つなんです。
【Mac】Flutterのパスを通す

Mac環境でのFlutterのパスを通す作業についての備忘録です。
Flutterのインストールは<a href="https://docs.flutter.dev/get-started/install/macos" target="_blanc">こちら</a>からどうぞ！

### 1.使用シェルを確認し、エディタを起動
ターミナルで以下コマンドを実行。
```
echo $SHELL
```
↓
・```/bin/zsh```と返ってきた場合：シェルはzshなので、以下コマンドを実行。
```
vim .zshrc
```
・```/bin/bash```と返ってきた場合：シェルはbashなので、以下コマンドを実行。
```
vim .bash_profile
```

### 2. パスを追記する
編集モードに切り替えて（```i```キー）、以下のパスを通すための記述を追記する。
```
export PATH="$PATH:/Users/ユーザ名/flutterを設置しているディレクトリ/flutter/bin"
```
例えば、flutterディレクトリの設置場所が /Users/hoge/Desktop/development/の場合だと以下のようになる。
```
export PATH="$PATH:/Users/hoge/Desktop/development/flutter/bin"
```
編集モードを終了（```esc```キー）したら、編集内容を保存＋終了（```:wq``` + ```Enter```キー）をする。

### 3.パスを確認する
ターミナルで以下コマンドを実行してパスが返ってきたらOKです。
```
which flutter
```
↓　返ってくるパス
```
/Users/ユーザ名/flutterを設置しているディレクトリ/flutter/bin/flutter
```

:::note warn
もし```which flutter```を実行しても何も返ってこなかった場合は、**ターミナルを一旦終了**してから再度開き、もう一度上記のコマンドを実行してみてください！
:::

おわり\:raised_hands_tone2:
EclipseからGradleタスクに引数を渡す

EclipseのGradleタスクで引数を渡す方法についてのメモです。

:::note info
動作環境
Java 18（Amazon Corretto v18.0.2.9.1）
Gradle Wrapper v8.0.2
pleiades / java-win-64bit / v20230617
Powershell v7.3.4
:::

# Mainクラス
とりあえずMainクラスを作ります。
長さと中身をコンソール出力するだけの簡単なものです。

```java:Main.java
package jp.co.hollage.sample;

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    System.out.println("args.length = " + args.length);
    Arrays.asList(args).stream().forEach(arg -> System.out.println(arg));
    return;
  }
}
```

# CLIコマンドでの実行方法

まずはCLIコマンドで実行してみます。
Gradle 4.9以降であれば __--args__ オプションを付けてあげれば良かったですね。
参考：[gradle run で実行する Java の引数は --args で指定できる (Gradle 4.9 から) - Qiita](https://qiita.com/niwasawa/items/533385a7c718a1dc39a3)
```powershell:powershell
PS C:\pleiades\workspace\gradle-sample-project> .\gradlew run --args="a b c"

> Task :run
args.length = 3
a
b
c

BUILD SUCCESSFUL in 908ms
3 actionable tasks: 1 executed, 2 up-to-date
```

「a b c」と言う一つの引数として渡したい場合は文字列をクォートで括ってあげれば期待通りに動きます。
```powershell:powershell
PS C:\pleiades\workspace\gradle-sample-project> .\gradlew run --args="'a b c'"

> Task :run
args.length = 1
a b c

BUILD SUCCESSFUL in 904ms
3 actionable tasks: 1 executed, 2 up-to-date
```

# Eclipseからの実行

実行 -> 実行構成 -> Gradleタスク から、Gradleタスクを新規作成してください。

Gradleタスク欄にrunが表示されると思いますが、追加ボタンを押して __--args=a b c__ と入力、実行することで引数3つのrunタスクが走ります。

![eclipse1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/71453e51-8317-a74b-d97f-281c930b0706.png)

CLIと同様に「a b c」と言う一つの引数として渡したい場合は以下の通り __--args='a b c'__ と入力、実行してください。
![eclipse2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919779/8ffe3ddb-acd5-be72-131d-4b8b7be99426.png)

# まとめ

ダブルクォートとシングルクォートについては入れ替わっても問題ありませんが、
例えばCLIの引数1つとして __--args=""a b c""__ とするのはNGです。
||CLI|Eclipse|
|----|----|----|
|引数1つ|--args="'a b c'"|--args='a b c'|
|引数複数|--args="a b c"|--args=a b c|
JavaScript の Selenium 使い方メモ (Node.js (Mocha))

JavaScript の Selenium の使い方メモ
HTML の要素(DOM) 取得は一番使い勝手が良い `By.css` になれると良さそう
環境構築とかはこちらを参考にしてください
- [JavaScript の Selenium 実行環境 (Node.js (Mocha) から Selenium 実行)](https://qiita.com/sueasen/items/cf6379a7efd0dea668ee)

あと公式ドキュメントはこちら
- https://www.selenium.dev/ja/documentation/

# 実行の待機
```JavaScript
await driver.sleep(1500) // 引数はミリ秒
```

# ファイル操作
```JavaScript
const fs = require('fs');

// 存在確認
fs.existsSync(filePath)
// ディレクトリ作成 (filePath 多重階層OK)
fs.mkdirSync(filePath, { recursive: true })
// ディレクトリ削除（filePath 直下にファイルあってもOK）
fs.rmdirSync(pdfPath, { recursive: true })
// ファイルコピー
fs.copyFileSync(oldFilePath, newFilePath)
```

# スクリーンショット取得
```JavaScript
// 全体
driver.takeScreenshot().then(function (image) {
    fs.writeFileSync(filePath, image, 'base64');
});

// 部分(タグ指定)
const element = await driver.findElement(By.css("#id"));
element.takeScreenshot().then(function (image) {
    fs.writeFileSync(filePath, image, 'base64');
});
```

# URL入力
```JavaScript
await driver.get(pageUrl)
```

# ブラウザサイズ変更
```JavaScript
await driver.manage().window().setRect({ width: 800, height: 600 })
```

# テキスト入力, 要素クリック
```JavaScript
await driver.findElement(By.css("#inputId")).sendKeys(value)
await driver.findElement(By.css("#clickId")).click()
```
Pandas操作

# Pandasメソッド
①Pandas、データの読み込みと確認
②データの抽出
③データの変換
④データの欠損
⑤値や欠損値の削除や置換
### ①Pandas、データの読み込みと確認
```python
#Pandasの読み込み
import pandas as pd
#データの読み込み
df = pd.read_csv('読み込むデータ.csv')
#先頭５行を表示
df.head()
```
### ②データの抽出
```python
#10行とColumn_nameの取得
df.loc[10,'Column_name']
#10行３列を表示
df.iloc[10,3]
#条件を指定して抽出1  (10より小さいものを抽出)
df[df['Column_name'] < 10]
#条件を指定して抽出1  (70から80の間を抽出)
df.query('70 <= Column_name <= 80')
#重複の削除
df.drop_duplicates()
#データの量の確認
df.shape
```
### ③データの変換
```python
#列をindexにする
df.set_index('Column_name', inplace=True)
#Columnの名前を変更
df.rename(columns={'Column_name':'NewColumn_name'})
Column列を降順にする
df.sort_values(by='Column_name', ascending=False)
```
### ④データの欠損確認
```python
#データの欠損値の状態確認
df.isnull().sum()
```
### ⑤値や欠損値の削除や置換
```python
#Column_nameにある欠損値を平均値で置換
df['Column_name'].fillna(df['Column_name'].mean(), inplace=True)
#欠損値がある行を削除
df.dropna(subset=['Column_name'], inplace=True)
#列ごと削除
df.drop('Column_name', axis=1)
```
Custom Search APIを利用して検索結果を取得してCSVに出力する

```
import requests
import csv
from datetime import datetime

API_KEY = 'YOUR_GOOGLE_CUSTOM_SEARCH_API_KEY'
CSE_ID = 'YOUR_CUSTOM_SEARCH_ENGINE_ID'
INPUT_CSV_FILE_PATH = 'queries.csv'  # 入力用のCSVファイルのパス
OUTPUT_CSV_FILE_PATH = 'results.csv'  # 出力用のCSVファイルのパス

# Googleカスタム検索を行い、結果を返す関数
def google_search(query, api_key, cse_id):
    url = f"https://www.googleapis.com/customsearch/v1?q={query}&key={api_key}&cx={cse_id}"
    response = requests.get(url)
    return response.json()

# 入力用のCSVファイルを開き、クエリを読み込む
with open(INPUT_CSV_FILE_PATH, 'r') as csvfile:
    csvreader = csv.reader(csvfile)

    # 出力用のCSVファイルを開き、結果を書き込む
    with open(OUTPUT_CSV_FILE_PATH, 'w', newline='', encoding='utf-8') as outcsv:
        csvwriter = csv.writer(outcsv)
        
        # ヘッダーを書き込む
        csvwriter.writerow(["Query", "Rank", "Title", "URL", "Retrieved Time"])
        
        for row in csvreader:
            query = row[0]
            data = google_search(query, API_KEY, CSE_ID)
            
            rank = 1
            retrieved_time = datetime.now().strftime('%a %b %d %H:%M:%S %Y')
            
            if 'items' in data:
                for item in data['items']:
                    csvwriter.writerow([query, rank, item['title'], item['link'], retrieved_time])
                    rank += 1

print(f"Results saved to {OUTPUT_CSV_FILE_PATH}")
```
SAP on Azure デプロイ自動化フレームワーク - SAPシステムの作成（OS設定＆SAPインストール）

# ブログの内容
赤点線枠の仮想マシンにSAPのインストールをしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521211/583516a3-e0af-0097-e7db-5739b04410ed.png)
作業内容として、以下作業をコントロールプレーン側から実施してSAPのインストールを実施していきます。

+ Ansibleのプレイブックを実行

# Ansibleプレイブック
githubで公開されているプレイブックのメニューは以下になります。

<details><summary>メニュー</summary>

```rb
1) Validate parameters  6) Database Instance installation  11) Application Server installations   16) Post SAP Installation tasks (10-11)
2) Base Operating System configuration  7) Database Load  12) Web Dispatcher installations   17) All Playbooks
3) SAP specific Operating System configuration  8) Database High Availability Setup  13) HCMT   18) Quit
4) BOM Processing  9) Primary Application Server installation  14) BOM Download
5) SCS Install 10) Oracle High Availability Setup  15) Configure and install SAP (1-9)
```
</details>
今回の構成は、HAの構成ではないため以下順でプレイブックを実施していきます。

1 -> 2 -> 3  -> 4  -> 5  -> 6 -> 7  -> 9 -> 11 -> 12

:::note warn
プレイブックを実行した際、メニューからの選択ではうまく動作しませんでした。
デバッグコマンドを利用してコマンドを取得し、直接プレイブックを実行しています。
:::

<details><summary>実行コマンドの確認
</summary>

```rb
az logout
az login --service-principal -u "appId" -p "password" --tenant "xxxxxxxxxx"
cd ~/Azure_SAP_Automated_Deployment/WORKSPACES/SYSTEM/DEV-JAEA-SAP01-X00
DEBUG=yes ~/Azure_SAP_Automated_Deployment/sap-automation/deploy/ansible/configuration_menu.sh

Please select playbook: 1
You selected (1) Validate parameters
ansible-playbook --inventory-file=X00_hosts.yaml --private-key=sshkey --extra-vars=_workspace_directory=/home/azureadm/Azure_SAP_Automated_Deployment/WORKSPACES/SYSTEM/DEV-JAEA-SAP01-X00 --extra-vars=@sap-paramet
ers.yaml --extra-vars=BOM_CATALOG={{ lookup(env, BOM_CATALOG) }} -e ansible_ssh_pass={{ lookup("env", "ANSIBLE_PASSWORD") }} /home/azureadm/Azure_SAP_Automated_Deployment/sap-automation/deploy/ansible/pb_get-sshk
ey.yaml /home/azureadm/Azure_SAP_Automated_Deployment/sap-automation/deploy/ansible/playbook_00_validate_parameters.yaml
```
</details>

順番に実施していき、「PLAY RECAP」の結果にて『failed』のエントリーがないことを確認します。
OSの設定とDB側のインストール作業にかなりの時間を要しましたが、12のプレイブックを除いて約3時間30分ほどで設定/インストール作業は完了しました。

:::note alert
プレイブック「12) Web Dispatcher installations」は、正常終了せずWeb Dispatcherのインストールに失敗する。
https://github.com/Azure/sap-automation/issues/447
:::

# 所感
出来上がったSAPシステムにSAP GUIでのログインやHANA Studioでのログインは問題なくできたものの、Web Dispatcherのインストールに失敗したりと全工程を問題なく実施はできなかったことが分かりました。

しかし、動くシステム（SAPシステムってどんなものなのだろうか）を知るために、とりあえず作成してみようで利用するのはアリなのかなと思います。
※ SAP推奨のOS設定をプレイブックで設定してくれたり新規でインストールしてくれるのはとても楽だなと思いました。

# おしまい
長くデプロイ自動化フレームワークの記事を投稿してきましたが、こちらで以上になります。
実施タイミングによって私のブログ内容と違う結果になることもあるかと思いますが、参考になれば幸いです。
SQL文基礎 (データの取得編)

# こちらの記事について
「基本的なSQL文をざっと見たい！」または「SQLでこの動きをしたいんだけどなんだったっけ？」という方向けです。
このは基礎的なSQL文をまとめています。
自己学習のアウトプットと誰かの役に立てればと思い書きました。
⚠️こちらの記事につきまして初心者が書いたものになります。表現が間違っていることがございます、ご了承ください。

# まずSQL文とは
SQL文とはRDBMS(リレーショナルデータベース管理システム）を操作するための言語になります。
まずRDBMSってなんだよ(´Д｀；)/
RDBMSでは今回深くは追求しませんがイメージしやすいのはエクセルのような縦、横とマスがあり縦にそれぞれの種類、横にそれぞれの種類にそったデータがどんどん入っていくイメージです。またデータベースの中にテーブルというものがありそちらに値が入るものになります。
下にテーブルのサンプルを用意しましたので参考までに！

# データベース
下のテーブルはある飲食店のドリンクメニューをテーブルに起こしたものになります。
idカラム:それぞれのデータに番号を振っています。
name:商品名
price:値段
temp:hotかiceか

***drinksテーブル***
| id | name | price | temp |
| :-- | :-: |:-: | --: |
| 1 | お茶 | 100 |ice|
| 2 | オレンジジュース | 200 |ice|
| 3 | ホットコーヒー | 300 |hot| 
| 4 | アイスコーヒー | 300 |ice| 
| 5 | 紅茶 | 300 |hot|

## 取得
### ・FROM
どこのテーブルから取得するかを指定する際に使用する。
### ・SELECT
どのカラムを取得するのかを指定する。
```sql
SELECT name, price 
FROM drinks;
```
結果
| name | price |
| :-- | --: |
| お茶 | 100 |
| オレンジジュース | 200 |
| ホットコーヒー | 300 |
| アイスコーヒー | 300 |
| 紅茶 | 300 |

### ・WHERE
テーブル内に入っている値を検索する際に使用する。
検索に使われるものとして比較演算子,LIKE演算子がある。

drinkesテーブルからname,priceカラムをとってくる。

```sql
SELECT name, price 
FROM drinks
WHERE price=300;
```

結果
| name | price |
| :-- | --: |
| ホットコーヒー | 300 |
| アイスコーヒー | 300 |
| 紅茶 | 300 |

drinkesテーブルからname,priceカラムをとってくる。
priceが300未満の時。

```sql
SELECT name, price 
FROM drinks
WHERE price<300;
```

結果
| name | price |
| :-- | --: |
| お茶 | 100 |
| オレンジジュース | 200 |

drinkesテーブルからname,priceカラムをとってくる。
条件としてnameが**~コーヒー**だったとき
⚠️「コーヒー」の時でも含まれます。

```sql
SELECT name, price 
FROM drinks
WHERE name LIKE '%コーヒー';
```
結果
| name | price |
| :-- | --: |
| ホットコーヒー | 300 |
| アイスコーヒー | 300 |

### ・AND演算子
条件式にて条件をもっと絞り込みたいと思った時これを使うべき！
drinkesテーブルからname,priceカラムをとってくる。条件としてpriceが300の時**かつ**temoがhotの時。
```sql
SELECT name, price 
FROM drinks
WHERE price=300 AND temp="hot";
```
結果
| name | price |
| :-- | --: |
| ホットコーヒー | 300 |
| 紅茶 | 300 |

### ・OR演算子
AND演算子では全ての条件が当てはまらなければ処理が実行されないがOR演算子の場合ではどれか一つの条件が当てはめまれば処理が実行される
drinkesテーブルからname,priceカラムをとってくる。条件としてpriceが300の時**または**temoがhotの時。
```sql
SELECT name, price 
FROM drinks
WHERE price=300  OR temp="hot";
```
結果
| name | price |
| :-- | --: |
| ホットコーヒー | 300 |
| アイスコーヒー | 300 |
| 紅茶 | 300 |

### ・ORDER BY
さてテーブルからデータを取得しくる際に並び順を変えたいと思ったことはないでしょうか？
その際に使うのが***ORDER BY**です。
こちらはカラムを昇順/降順と並び替えてくれる代物です。
ちなみに昇順の場合はASC、降順はDESCで指定ができる。(何も指定をしていなかったらデフォルトの昇順になる)
```sql
SELECT * 
FROM drinks
ORDER BY price DESC;
```
※ SELECTの後ろに記述のある「*」は全てのカラムという意味です。
結果
| id | name | price | temp |
| :-- | :-: |:-: | --: |
| 3 | ホットコーヒー | 300 |hot| 
| 4 | アイスコーヒー | 300 |ice| 
| 5 | 紅茶 | 300 |hot|
| 2 | オレンジジュース | 200 |ice|
| 1 | お茶 | 100 |ice|

### ・LIMIT
テーブルから取得する際にどのくらいの数のレコードを取得するかを指定する際に使用するものになります。

```sql
SELECT * 
FROM drinks
LIMIT 3;
```
| id | name | price | temp |
| :-- | :-: |:-: | --: |
| 1 | お茶 | 100 |ice|
| 2 | オレンジジュース | 200 |ice|
| 3 | ホットコーヒー | 300 |hot|
gopls was not able to find modules in your workspace. への対処

## VSCodeにおけるGoのモジュール周りのエラー

参考書の写経やハンズオンイベントでのコード管理で、たまに出会います。

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366105/c936bc7d-ff34-211e-9a94-8c2f39d82517.png)


```
gopls was not able to find modules in your workspace.
When outside of GOPATH, gopls needs to know which modules you are working on.
You can fix this by opening your workspace to a folder inside a Go module, or
by using a go.work file to specify multiple modules.
See the documentation for more information on setting up your workspace:
https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
```
このエラーにたまに出会うので、対処法をまとめておきます。

### 環境
- macOS Ventura 13.5
- VSCode バージョン: 1.81.1
- go version go1.20.7 darwin/amd64

### サンプルのディレクトリ構成
上の画像で `package main`に赤線が引かれた状態のディレクトリ構成は以下です。
```
.
├── sample1
│   ├── go.mod
│   └── main.go     <-------- ここのpackage mainでエラー
└── sample2
    ├── go.mod
    └── main.go     <-------- ここのpackage mainでエラー
```

### 対処
エラーを読むと、
```
using a go.work file to specify multiple modules.
```
とありました。`go.work`を使えばいいみたいです。
#### go.workとは
go 1.18から追加されたWorkspace　modeと呼ばれるものです。複数モジュールを管理しやすくするものです。（ざっくり）

### `go.work`を作る
```
$ go work init 
or 
$ go work init 
$ go work use ./sample1 ./sample2
or 
$ go work init ./sample1 ./sample2
```
でできます。
`go mod`に少し似てますね。
作った後のディレクトリ構成としては、
```
.
├── go.work
├── sample1
│   ├── go.mod
│   └── main.go
└── sample2
    ├── go.mod
    └── main.go
```
のようになります。
すると、
![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366105/8acf52b7-323d-fa34-6869-821a20eeab14.png)
消えました。
ヤッターーー

### 注意する点
#### `go.work`はルートディレクトリに作らないといけない
  - 今回だと、sample1やsample2の上に作らないといけないです。
#### `go.work`内のuseに注意
- 開いているフォルダが`go.work`のuseに指定されていない時、
  ```
  This file is within module "sample1/sample1-1", which is not included in your workspace.
  To fix this problem, you can add this module to your go.work file (/Users/itoushingo/workplace/Practice_golang/test/go.work)
  See the documentation for more information on setting up your workspace:
  https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
  ```
    という文とともにpackage mainに黄色波線が引かれます。
    新しくフォルダを作って実装を始めたら、`go work use`で追加します。
- モジュール名が被ってると、
  ```
  packages.Load error: err: exit status 1: stderr: go: module モジュール名 appears multiple times in workspace.
  ```
  というエラーが出ます。
  `go mod init`の時に指定するモジュール名が被らないよう注意します。

### VSCodeのsetting.jsonについて
setting.jsonに
```
{
    "gopls": { 
        "experimentalWorkspaceModule": true
    }
}
```
を記述すると、私の環境では
```
Invalid settings: gopls setting "experimentalWorkspaceModule" is deprecated
```
となり、非推奨になったみたいです。

### おわりに
今後気になったら随時追加修正していきます。
webpack5にした時にprettycronで利用しているlaterでエラーが出たので原因と恒久対応について調査したメモ

## [bunkat/later](https://github.com/bunkat/later)

webpackでエラーが出る。
興味があれば、以下のissueを参照。
[Can't find later-cov.js? #155](https://github.com/bunkat/later/issues/155)

対応しているリポジトリ、npmのパッケージがある。
[RickCarlino/later](https://github.com/RickCarlino/later)
[meteor-later](https://www.npmjs.com/package/meteor-later)

新しいものがあるので、以下を使うのが良い。

[breejs/later](https://github.com/breejs/later)

```sh
npm install @breejs/later
```

## 補足

古いlater(bunkat/later)を使っているライブラリがあると実行時にエラーになる。
webpackで問題出る。webpack4まで大丈夫でもwebpack5でダメになる。

例) [prettycron](https://www.npmjs.com/package/prettycron)

#### 対処方法

[breejs/later](https://github.com/breejs/later)に置き換えた状態のprettycronをメンテナンスしている以下のリポジトリのものをインストール

[brstyl/prettycron](https://github.com/brstyl/prettycron)

```sh
# コマンドの説明
#
# Githubまたはローカルのnpm のパッケージをinstall
# npm install  アカウント名/リポジトリ名

npm install brstyl/prettycron
```
Windows11でタッチパッドの反応が急に鈍くなる現象の対処法

## 事象
タイトルのまんまです。
Windows11でタッチパッドの感度が急に鈍くなる現象に遭遇しました。
全く動かないわけではなく、若干遅延しつつ移動が突っかかる感じで、かなりストレスでした。
PC起動時はスムーズに動いているので、ハードの故障ではないことは確かなのですが、
プロセスモニタ監視してても事象のトリガーとなるソフトウェアが特定できず、困っていました。
<br>

## 対処法
結論から言うと<ins>Fn＋F10キー同時押しで一度タッチパッドを無効化し、再度FnとF10キー同時押しで有効化するだけ</ins>です。
※端末によってタッチパッド無効化のショートカットキーは違うと思うので、説明書とか確認してください。
<br>

## ps
タッチパッドの初期化ドライバの更新やら再インストールやらをやって治らなかったのに、なぜこれで治るのか...
ともあれ、いつから発生していたのか覚えておらず、端末初期化も考えていたので直ってよかったです。
原因ご存じの方はコメント頂けると幸いです。
<br>

## 端末情報
OS 名:                  Microsoft Windows 11 Home
OS バージョン:          10.0.22621 N/A ビルド 22621
OS ビルドの種類:        Multiprocessor Free
登録されている組織:     HP
システム製造元:         HP
システム モデル:        OMEN by HP Laptop 16-c0xxx
システムの種類:         x64-based PC
プロセッサ:             1 プロセッサインストール済みです。
                        [01]: AMD64 Family 25 Model 80 Stepping 0 AuthenticAMD ~3201 Mhz
BIOS バージョン:        AMI F.19, 2023/01/09
Ubuntu Desktop 22.04 LTSのVagrant boxを作成する時にハマったところ

[Ubuntu Desktop 日本語 Remixのダウンロード](https://www.ubuntulinux.jp/download/ja-remix) で提供されている `ubuntu-22.04.3-desktop-amd64.iso` を元に、Vagrantのboxを作成する時にハマったところを備忘録として残します。

## `vagrant ssh` を実行した時に "vagrant@127.0.0.1: Permission denied (publickey)." が返ってきて仮想マシンへSSH接続できない
  - 対応方法
    - Vagrantfile へ `config.ssh.insert_key = false` を追加する。
  - 参考
    - Vagrant Cloudで公開されている公式の `ubuntu/jammy64` でも、この事象が発生しました。

## `vagrant up` を実行した時に "default: Warning: Authentication failure. Retrying..." が複数回表示される
  - boxを作成する前の仮想マシンで `/etc/ssh/sshd_config` へ `PubkeyAcceptedAlgorithms +ssh-rsa` の行を追加する。
  - 解決時にお世話になったページ: <https://it-jog.com/khow/vag/vaguperror-ubuntu2204>

## `vagrant ssh` を実行して仮想マシンへSSH接続した後、 `ls -al /vagrant` でホストの共有フォルダーを参照しても Vagrantfile 等が表示されず owner, group が共に root になっている
  - boxを作成する前の仮想マシンで以下の手順を実施し、 Guest Additions を再設定することで解決しました。
    - VirtualBoxの「デバイス」→「Guest Additions CD イメージの挿入...」を選択
    - ターミナルで以下のコマンドを実行
    
        ```shell
        sudo apt -y install build-essential perl
        sudo sh '/media/vagrant/VBox_GAs_x.y.z/VBoxLinuxAdditions.run'
        sudo /sbin/rcvboxadd quicksetup all
        ```

  - 解決のきっかけ
    - `ubuntu/jammy64` とのサービスの違いを比較するために `systemctl list-unit-files -t service` を実行した時、 `vboxadd.service` が failed になっていました。 `systemctl status vboxadd.service` で状態を確認すると、Guest Addtitions の設定を試行して gcc, make, perl が見つからず `vboxadd` ユーザーの追加に失敗した旨のエラーメッセージが表示されていました。
【Linux】ディレクトリ内のファイル容量を確認する

## `du`コマンド

`du`コマンドを使用することでディレクトリ内のファイル容量を表示させることができます。

```terminal
$ du .
8328	./sample/example
280240	./sample
7670680	.
```

## オプション（一部）

### `-h`
次のように実行すると、適切な単位で表示します。

```terminal
$ du -h .
4.1M	./sample/example
137M	./sample
3.7G	.
```

### `-s`

次のように実行すると、指定したディレクトリの合計を表示します。

```terminal
$ du -s .
7670776	.
```

### `-d 深さ`

次のように実行すると、表示する深さを指定できます。

```terminal
$ du -d 1 .
7670680	./sample
7670776	.
```

## 容量が大きい順に表示する

以下のように実行すると容量が大きい順に表示されます。

```terminal
du -h . | sort -n -r
```
公式Dockerfileとcreate-next-appでNext.jsプロジェクトを開始

## はじめに
Next.jsは公式でDockerfileを提供しており、非常に始めやすいです。

https://github.com/vercel/next.js/tree/canary/examples/with-docker

しかし公式の[How to use](https://github.com/vercel/next.js/tree/canary/examples/with-docker#how-to-use)に則ってプロジェクトのスケルトンを作成するのは少し自由度が低いですよね。純粋に`create-next-app`したいものです。

この記事では公式のDockerfileを活用しつつ、自身で`create-next-app`することでプロジェクトの初期設定を行う方法を紹介します。

## 手順

### 1. 新しいディレクトリの作成

まずはプロジェクト用のディレクトリを作成し、移動します。

```bash
$ mkdir nextjs-docker
$ cd nextjs-docker
```

### 2. Dockerを利用してcreate-next-app実行

公式のDockerfileのベースイメージがnode:18-alpineですので、これをpullして`create-next-app`を実行します。

```bash
$ docker run --rm -it -v $(pwd):/app node:18-alpine sh -c "cd /app && npx create-next-app ."

Need to install the following packages:
  create-next-app@13.4.19
Ok to proceed? (y) y
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias? … No / Yes
Creating a new Next.js app in /app.

Using npm.

Initializing project with template: app-tw 
```

これで Next.jsプロジェクトを作成できました。

### 3. 公式のDockerfileを取得

```bash
$ curl https://raw.githubusercontent.com/vercel/next.js/canary/examples/with-docker/Dockerfile > Dockerfile
```

### 4. standaloneで起動設定の追加

公式Dockerfileはstandaloneでのビルドを想定しているため、その設定を行います。

```next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
    output: 'standalone'
}

module.exports = nextConfig
```

### 5. Dockerイメージのビルドと起動
```
$ docker build -t next .
$ docker run -p 3000:3000 next
```

これで、http://localhost:3000 にアクセスすると、Next.jsの初期画面が表示されます🚀。

## まとめ

今更ですがよく使うので備忘録です。
皆様のNext.jsがより快適になることを祈っています🫶。

Tips：compose.yamlは雑に作っています。
```commpose.yaml
version: '3.7'
services:
  next:
    image: node:18-alpine
    ports:
      - "3000:3000"
    volumes:
      - ./:/app
    working_dir: /app
    command: sh -c "npm i && npm run dev"
```
Linuxでシェルの切り替え

自分用に，シェルの切り替え方法をまとめます．
環境はUbuntu 22.04.3 LTSです．
- シェルの一覧表示
```
$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
```
- 現在使用しているシェルを表示
```
$ echo $SHELL
/bin/bash　←bashが使用されている
```
- シェルの切り替え
```
$ /bin/bash　←使いたいシェルを直接起動するだけ
```
- ログイン時のシェルを変更
```
$ chsh
Password:
Changing the login shell for hoge
Enter the new value, or press ENTER for the default
        Login Shell [/bin/bash]: /bin/sh
```
## 参考
https://mo-gu-mo-gu.com/linux-unix-shell-related-basic-commands/#i-5

https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/106chgshell.html
【Python】deepcopy

# 【Python】deepcopyについて
メモ程度に書いてみた。



deepcopy(深いコピー）は、例えば下記のように`元を変更してもコピー先には、影響しない。`

```py
import copy

original_list = [[1, 3], [5, 4]]
copied_list = copy.deepcopy(original_list)

# コピー元を変更しても、コピー先には影響がない
original_list[1][1] = 100  # リストのインデント1番のリストのさらに1番目を100に
print(original_list)
print(copied_list)
```

```py
[[1, 3], [5, 100]]  # original_list コピー元
[[1, 3], [5, 4]]    # copied_list コピー先
```

逆も同じことです。


```py
import copy

original_list = [[1, 3], [5, 4]]
copied_list = copy.deepcopy(original_list)

# コピー先を変更しても、コピー元には影響がない
copied_list[1][1] = 100  # リストのインデント1番のリストのさらに1番目を100
print(original_list)
print(copied_list)
```
```py
[[1, 3], [5, 4]]     # original_list コピー元
[[1, 3], [5, 100]]   # copied_list コピー先
```
アドレスとメモリの内容の理解メモ

## 注意
こちらの記事はアドレスとメモリについての個人的なメモ。
なぜ、下記のようにアドレスが16byteごとなのか、メモリの内容とリンクしなかった。
> 0x7fffffffdc20: ...
> 0x7fffffffdc30: ...

## 対象プログラム
```c
#include <stdio.h>

int
main() {
    char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\0";
    printf("s = %s\n", s);
}
```

## アドレスとメモリの内容表示
```
gdb-peda$ x/32xw $rsp - 16
0x7fffffffdc20: 0x00000000      0x00000000      0x00000000      0x00000000
0x7fffffffdc30: 0x44434241      0x48474645      0x4c4b4a49      0x504f4e4d
0x7fffffffdc40: 0x54535251      0x58575655      0x00005a59      0x00000000
0x7fffffffdc50: 0x00000001      0x00000000      0xf7db4d90      0x00007fff
0x7fffffffdc60: 0x00000000      0x00000000      0x00401136      0x00000000
0x7fffffffdc70: 0x00000000      0x00000001      0xffffdd68      0x00007fff
0x7fffffffdc80: 0x00000000      0x00000000      0x99b65ce0      0xbac8aaa4
0x7fffffffdc90: 0xffffdd68      0x00007fff      0x00401136      0x00000000
```

## 理解メモ
例) "ABCD"の場合
0x41(***1byte***) = 0b01000001(8bit)
0x44434241(***4byte***) = 0b01000100_01000011_01000010_01000001(32bit)

`
0x7fffffffdc30: 0x44434241      0x48474645      0x4c4b4a49      0x504f4e4d`のように、***4byteが4つ***あるので、アドレスが16byteごとになっている。
> 0x7fffffffdc20: ...
> 0x7fffffffdc30: ...
> 0x7fffffffdc40: ...
> 0x7fffffffdc50: ...

***ビットとバイトについて***
8bit = 1byte
32bit = 4byte
64bit = 8byte

***16進数について***
0x10(16進数) = 16(10進数)
tail -f の使い方を知るためだけのシェル作成

# tailってなに？
> tailコマンドは、ファイルの末尾数行を標準出力に表示するコマンドです。
[tail - ファイルの末尾数行を表示 - Linuxコマンド](https://webkaru.net/linux/tail-command/)
* いつ使うかわかりません！！！
* どうやら-fのオプションでログファイルに追記されていく様子を見るのに使われるらしい
    * どんな使い方が出来るのか、シェルをつくって確かめてみよう
# 今回作ったシェル

```add_text.bash
for i in {1..100};
    do date >>test.txt
    sleep 3;done
```
* dateをただただテキストファイル(test.txt)に追記していくだけのシェル


# 実際にやってみた
1. bashファイルが保存してあるディレクトリへ移動
1. 作ってみたシェルをフォアグランドで実行
    ```terminal
    (user dir) % bash add_text.bash
    ```
1. ちょっとまって止めてみる（Ctrl + Z）
1. テキストを開いてみて、追記されているのを確認してみる
![スクリーンショット 2023-08-22 23.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491087/7e001b0d-13fd-e8ac-15b8-674236bc3faa.png)

1. バックグラウンドで再開
    ```
    (user dir) % bg %(ジョブID)
    ```
    jobIDがわからない場合は、「jobs」で確認する！
1. 「tail -f (textファイル)」を実行
    ```
    (user dir) % tail -f test.txt
    ```
1. 書き込まれている様子がわかる！
![_2023-08-22 23.14.59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491087/8e41b286-bd88-0294-adcf-43fd72515455.gif)

以上です！
ジョブを停止するのもお忘れなく:relaxed:
### お疲れ様でした！
Java 配列、ArrayListの重複をなくす

##### 配列の中にある重複をなくし、Hashsetに保存
```java
HashSet<String> set = new HashSet<>(Arrays.asList(arrays));
```

---
##### 配列の中にある重複なしの要素のカウントする
```java
int arrayCount = new HashSet<>(Arrays.asList(arrays)).size();
```
--- 
##### ArrayListの中にある重複をなくし、Hashsetに保存
```java
HashSet<String> set = new HashSet<>(arrayList);
```
--- 
##### ArrayListの中にある重複なしの要素のカウントする
```java
int arrayListCount = new HashSet<>(arrayList).size();
```
C言語環境構築

# C言語環境構築
プロフィール
　春から社会人になったぴよっこです
　SESとして入社した会社で、実際の開発現場には携わることができず、派遣社員状態です
　（新卒で入った会社を半年もしない間に転職するって根性がないように思われそう、、）

　学生時代にはAWS、Gitを触り、ドメインの追加やALBを使用し可用性強化に努めました。
　Pythonメインで開発してました。
 
 今回の記事について、確認はしておりますが、なにかミスなどが見当たりましたら、コメントにてご指摘いただけると幸いです。
 分からないことがあれば、お聞きください。

　

### 今回環境構築をしようと思ったきっかけ
・新卒で入った会社を年末で退職し、転職先で使う言語の再履修の為です（PC構築しなおした）



### 前提条件
・VScodeインストール済み

### 対象読者
・C言語を学びたいプログラミングのプの字も知らない人向け

# GCCインストール
とりあえずC言語を学ぶには必須です

インストールは以下のサイトを参考にしてください
凄くわかりやすいですよ
https://katakago.sakura.ne.jp/pgm/gcc.html

## VScode環境構築
GCCのインストールが終わったら、VScodeを開き左側の下から二番目のアイコンを開き、
検索欄に「C」を入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603625/56db437f-b3b3-5762-6bce-4cada5457a05.png)

一番上に出てきたものをインストール
インストール後、有効ボタンをクリックする必要があります
（アンインストールの横に出てくる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603625/8ef960dd-18d7-aeee-8fae-97f6e79981b1.png)


# いざ実行！！
```C:hello.c
#include <stdio.h>
int main(void) 
{
    printf("Hello, World!");
    return 0;
}
```

VScodeで記述してください
保存先はデスクトップにファイルを作成してください
今回はわかりやすく「C」としています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603625/d8b86116-0334-f8e3-bda2-516def80d5fc.png)
保存後はエクスプローラーを開き、Cと書かれている余白をクリックし、出てくるすべての文字をコピーしてください
![スクリーンショット 2023-08-24 221213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603625/9e377142-287c-afab-3ddf-d9c5e8034006.png)





保存後はターミナルを開き、
```
cd 〇〇
```
〇〇にさっきコピーしたものをCtrl+Vで貼り付けてください
実行します


そのまま下のコードをターミナルで実行してください
```
gcc hello.c
```
を実行してください
エラーなく実行出来たら、「hello.c」を保存していたところに
「a.exe」が生成されているはずです


保存が確認出来たら、
```
a.exe
```
を実行します

するとあら不思議、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603625/a6082f24-91a3-3a76-59ed-89fc35dc1512.png)
ターミナルさんがご挨拶してくれます

# あとがき
記事を書いたのが、過去一度だけなので、あまりノウハウがつかめていません。
生暖かい目で見ていただけると幸いです。
そのうち技術的なこともまとめていこうと考えています。

転職頑張ります。
ナイーブな再帰フィボナッチでマイクロベンチマーク

# これは何？

もともと
https://qiita.com/fsdg-adachi_h/items/5feeda2ed19f879fdf9a
という URL で公開されていた記事に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/fd51abff-28a5-b664-b4a3-9b6773e7adf3.png)

というコメントを書いたら、その記事は削除されて。
同じ方が、全く同じような内容で

https://qiita.com/fsdg-adachi_h/items/c54135cf0a562019295c

という記事を公開されて。
なぜか私はコメントできない（ブロックされてるのかな）ようなので、コメントで書きたかった追加情報に関する記事を書こうと思った。

## int の長さの影響なのかどうか

元のコードが go は `int`。環境から類推するに 64bit 整数。
C / C++ は、おそらく 32bit。Java の int は 32bit。ということで不公平。

※ 公平になりようがない Python・NodeJS なんかもいるので完全な公平は期待できない。そういう意味で、元の記事が悪いということではない。

というわけで、

```go:goint32
// フィボナッチ数列を再帰的な方法で計算する関数
func fibonacci(n int32) int32 {
	if n == 0 || n == 1 {
		return n
	} else {
		return fibonacci(n-2) + fibonacci(n-1)
	}
}
```

を加えてみた。

## 環境

環境は元記事とは全然違い、MacBook Pro (Apple M1 非Max)。

コンパイラやら VM やらは、下記。

* Apple clang version 14.0.3 (clang-1403.0.22.14.1) Target: arm64-apple-darwin22.6.0
* g++-13 (Homebrew GCC 13.1.0) 13.1.0
* gcc-13 (Homebrew GCC 13.1.0) 13.1.0
* openjdk version "20.0.2" 2023-07-18
  * OpenJDK Runtime Environment (build 20.0.2+9-78)
  * OpenJDK 64-Bit Server VM (build 20.0.2+9-78, mixed mode, sharing)
* go version go1.20.6

そういえば、元の記事で gcc は 11.4.0 なのに g++ は 11.3.0 なのが気になっていた。Ubuntu だとよくある環境なのかな。

Rust・Node・Python は入れなかった。なんとなく。

## 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/7fe66f02-0f65-b9de-f383-499160fc2d02.png)

こんな感じ。
横軸は時間なので、長いほうが遅い。
参加者の説明をすると。

|名前|説明|
|:--|:--|
|java|普通に java で実行|
|goint32|go で、int を 32bit にしたもの|
|goint|go で int  を使ったもの。つまり 64bit|
|rosetta_c|C言語。clang で x86_64-apple-darwin でビルド。Rosetta2 で実行|
|gcc|C言語。gcc-13 でネイティブコードを作って実行|
|clang|C言語。clang  でネイティブコードを作って実行|
|rosetta_cpp|C++。clang++ で x86_64-apple-darwin でビルド。Rosetta2 で実行|
|gpp|C++。g++-13 でネイティブコードを作って実行|
|clangpp|C++。clang++  でネイティブコードを作って実行|

## 感想

* go の整数が長いのが不利だと思ったけど、int32 にしても誤差程度の差しかない。意外。呼出規約的に差がないのかな。
* それにしてもネイティブコードの割に go は遅い。
* 同じ C++ でも、コンパイラによって倍以上違う。なお、この件では gcc / g++ が速いけど、clang が速いこともある。
* ネイティブコードの clangpp より、rosetta2 を経由する、つまりネイティブコードではない rosetta_c の ほうがわずかに速い。
* グラフに含めなかったけど、Java で JIT を off にすると 40秒ぐらいかかる。JIT 偉い。

ということで、ネイティブコードが速いという感想にはあんまりならない。
プログラミング初心者の医学生が残り少ない夏休みでGithubcopilotとchatGPTの力を借りてアプリ開発してみた Day3

# これまでの経過
* [Day1(2023/08/20)](https://qiita.com/Shigemaxxx/items/606e7e58fe83f98bb780)
* [Day2(2023/08/21)](https://qiita.com/Shigemaxxx/items/ab1f0aecc291bb77534d)
   > - [x] 1. アイデアと計画
   > - [x] 2. DartとFlutterの学習
   > - [x] 3. 開発環境のセットアップ
   > - [ ] 4. デザインと開発
   > - [ ] 5. テスト
   > - [ ] 6. UIとUXの改善
   > - [ ] 7. アプリアイコンとアセット
   > - [ ] 8. ローカライゼーション
   > - [ ] 9. バックエンドとAPI
   > - [ ] 10. ベータテスト
   > - [ ] 11. App StoreとGoogle Playの開発者アカウント
   > - [ ] 12. アプリの提出
   > - [ ] 13. アプリレビュープロセス
   > - [ ] 14. アプリのリリース
   > - [ ] 15. マーケティングとプロモーション
   > - [ ] 16. モニタリングとアップデート 

# Day3(2023/08/22)
> ## 4. Design and Developmen
> 	Construct app UI with Flutter widgets. Develop app functions according to the plan. Rigorously test for bugs during development.
* 今日から取り掛かるデザインと開発が一番時間がかかりそう．
* 数日かけて取り組んでいこうと思う．

さっそく，Githubcopilotに"I want to make todo_list_app"と書き込んだところ...
> I want to make todo_list_app

残りの"with flutter and firebase."も自動的に補完するわけですよ．

> I want to make todo_list_app with flutter and firebase.

Githubcopilotがコメントの途中で補完してくるとは思ってなかったので，これはすごい!と思いまして，それはもうEnterキーとTabキーの連打ですよw
プログラミング初心者ですから上手くいったと思ってましたら，どうやらこの赤い波線はエラーのようで．．．
![スクリーンショット 2023-08-22 7.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532964/6462438e-59f8-0e3f-34bd-3668b8b8612b.png)
そんなに簡単にはいきませんでした．終いにはハングル文字まで出てきまして...
私を韓国人と認識してくれたようです.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532964/a5b82f04-770d-5def-1e28-807e0f5869c9.png)
たくさんあるエラーの部分は一つずつググって解決しようと思います．

importのエラーはGithubcopilotを使う以前の問題みたいで，pathも通していたつもりでしたが改善しなくて，ググっても分からず途方に暮れ，一度VScodeを再起動したら勝手にエラーは消えていました．

importのエラーが消えるとまた新たなエラーが出てきました...
間違いなくSDKはダウンロードしたはずなのに，もう一度ダウンロードしないといけないのでしょうか...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532964/51d5f9df-33da-6411-30ae-9f26149d77dc.png)
普段プログラミングをしている方からすると笑われるようなレベルと思いますが，一つずつ解決していきたいと思います．
基本的なこと，初歩的なこと，根本的なことを理解していない状態なのでずっと，ずーっとレベルを落として，

https://qiita.com/t_k_t/items/29848ac897e159030843

この記事にある，おそらく最もシンプルなToDoリストアプリを２，３日で作れるようになることが直近の目標です．

今日の進捗は...
> - [x] 1. アイデアと計画
   > - [x] 2. DartとFlutterの学習
   > - [x] 3. 開発環境のセットアップ
   > - [ ] 4. デザインと開発
   > - [ ] 5. テスト
   > - [ ] 6. UIとUXの改善
   > - [ ] 7. アプリアイコンとアセット
   > - [ ] 8. ローカライゼーション
   > - [ ] 9. バックエンドとAPI
   > - [ ] 10. ベータテスト
   > - [ ] 11. App StoreとGoogle Playの開発者アカウント
   > - [ ] 12. アプリの提出
   > - [ ] 13. アプリレビュープロセス
   > - [ ] 14. アプリのリリース
   > - [ ] 15. マーケティングとプロモーション
   > - [ ] 16. モニタリングとアップデート 

今日は全然進みませんでした．今日はここまで．
他に必要なことやアドバイス等ありましたらぜひコメントにて教えてください．
NotionでGitHubリポジトリをいい感じに並べるTips

# OGP画像というらしい
**`OGP(Open Graph Protcol)`** 画像という名前すら、つい最近まで知りませんでした。
要するに、ここで**右側に表示されている画像**です。

https://github.com/increments/qiita-cli

- リポジトリのステータス画像
- リポジトリのサムネイル画像
- Contributors / Issues/ Stars/ Fork がまとまった画像

このあたりで検索しても日本語のサイトが全くヒットせず苦戦したため、
備忘録としてここに残します。

# 取得方法

```
https://opengraph.githubassets.com/1/<owner>/<repo>
```

# 使用例

`Notion`のカバー画像にこのURLを埋め込むと、いい感じのギャラリービューの出来上がり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701843/81f1b07b-90ff-be76-7daf-ffe1b3271a6b.png)

# 結論
物凄くシンプルでした。
【独学】マーケティングビジネス実務検定B級勉強法

<h1>この記事でわかること</h1>
<ul>
<li>おすすめの教材</li>
<li>おすすめの勉強方法</li>
</ul>

<h1>おすすめ教材</h1>
以下の教材がおすすめです。
<ul>
<li>マーケティング・ビジネス実務検定 アドバンスト版テキスト</li>
</ul>

こちらの教材は公式の参考書です。
こちらの教材からほとんど変わらない形式で出題されている問題も多々ありました。そのため、この参考書をベースに勉強し、演習量に不安な方は公式サイトから過去問を購入することをお勧めいたします。

<h1>マーケティングビジネス実務検定B級勉強</h1>
<ol>
<li>まず1周ざっくり読む</li>
<li>キーワードになりそうな語句に赤線でマーカーする(赤シートで隠れるように)</li>
<li>赤シートを使い、穴埋め形式で3~5周解く</li>
<li>マーカーした語句だけを見て、その定義を説明できるようになる</li>
</ol>

<h1>1.まず1周ざっくり読む</h1>
まずは、1周読みどのような内容が範囲となっているのか確認しましょう。社会人の方であれば、聞いたことあるような内容も多いと思います。これってこういうことだったのかなど、さっくり読みましょう。


<h1>2.キーワードになりそうな語句に赤線でマーカーする(赤シートで隠れるように)</h1>
1周読み終わったら、参考書に書かれている中でキーワードになりそうな語句にマーカーをつけていきましょう。サプライチェーンや金なる木など、固有の単語は狙われやすいです。キーワードの選定方法が分からない場合は一度過去問を解くと、わかりやすいかと思います。

<h1>3.赤シートを使い、穴埋め形式で3~5周解く</h1>
赤シートを使うとキーワードが隠れると思うので、説明文から語句を答える練習をしましょう。本番は選択形式なので、完璧に覚える必要はないですが、似たような定義を持つ語句が多くあるので、説明から語句を答える練習を繰り返し、違いを明確にしておきましょう。

<h1>4.マーカーした語句だけを見て、その定義を説明できるようになる</h1>
説明から語句を答える練習を繰り返したあと、語句から説明をする練習をすると、より記憶に定着します。この段階まで来ると、似たような語句が多々あることにも気付いていると思いますので、そこを重点的に練習しましょう。

<h1>まとめ</h1>
この記事ではマーケティングビジネス実務検定B級の勉強方法を紹介しました。体系的にマーケティングについて学ぶことができるので、とても勉強になりました。もう少し詳しく学びたい方はA級の受験をお勧めします。
First と FirstOrDefault どちらを使うべきか。ついでに OfType と Cast の使い方

バックエンドエンジニアの大和道子です
今回は私が C# を使い始めて最初のころに迷った First と FirstOrDefault。OfType と Cast についての勉強メモをご紹介します。

# はじめに
読むのにかかる時間：3分
経緯：「常にFirstOrDefaultを使うべき」という記事を見たため

**「これが正解」というブログは信じない**
　→常に、最も適切なメソッドを使うという原則こそが「正解」である

## 前提知識
・**First**
```First.C#
First
シーケンス.First();　//シーケンスの最初の要素を返す
シーケンス.First((要素) => 評価式);　//条件に当てはまるシーケンスの最初の要素を返す
```
＊**見つからなかった場合は、例外を吐く**

https://learn.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.first?view=net-7.0

・FirstOrDefault
```FirstOrDefault.C#
「シーケンス.FirstOrDefault();」：シーケンスの最初の要素を返す
「シーケンス.FirstOrDefault((要素) => 評価式);」：条件に当てはまるシーケンスの最初の要素を返す
```
＊**見つからなかった場合は、初期値を返す（nullなど）**

https://learn.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.firstordefault?view=net-7.0


## 記事の主張
　「Firstで要素が見つからなければ、エラーを吐いて止まるので、FirstOrDefaultを使う方が正解」

➡ **（反論）FirstOrDefaultを使いまくることは危険である**
　例えば、自分が値を入れているつもりの配列に値が入っていないバグがあるコードを書いちゃったとき…
　　①Firstを使う
　　　→エラーを吐くので、その場でバグに気付ける
　　②FirstOrDefaultを使う
　　　→nullでコードが進むので、バグに気付くのが遅くなる

### （結論）適切なところで、例外を投げるほうが安全性が高い！！

## ついでに
・同記事で、「Castは変換できないときに例外を吐くけど、OfTypeはnull以外の例外を出さないから安全」と主張されていたので

・**想定例**：Formアプリケーションで、コントロールを配置して、Button型だけほしいとき

・**OfType**
```OfType.C#
Controls.OfType<Button>()～
//Controlsの中で、Button型のControlのみを抽出してEnumerableを返す
//（色んな型が入ってるものを取ってきて、特定の型を抽出する）
```

https://learn.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.oftype?view=net-7.0

・**Cast**
```Cast.C#
Controls.Cast<Button>()～
//Control型で取ってきたControlsをEnumerable<Button>にする
//（特定の型の配列を型変換する）
```

https://learn.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.cast?view=net-7.0


### （結論）用途が違う
・**Control型で取ってきたシーケンスの全ての要素がButtonであるときはCast**
・**コントロールの抽出がしたいときはOfType**

　が基本だが、コントロール配置は変更される可能性があるため、上記の想定例ではOfTypeを使うことが普通だと思います。
Azure Functions の local.settings.json なくしがち問題

リポジトリからソースコードをクローンして Azure Functions をデバッグ実行してみたところ、ユーザーシークレットが取得できない。何もせずとも読み込まれるはずなのに。

> ASP.NET Core シークレット マネージャーによって作成されたシークレットは、Azure Functions Core Tools (バージョン 3.0.3233 以降) によって自動的に読み取られます。

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-dotnet-dependency-injection#using-aspnet-core-user-secrets

また、コンソールには怪しいメッセージ。
```console
Can't determine project language from files. Please use one of [--csharp, --javascript, --typescript, --java, --python, --powershell, --custom]
Can't determine project language from files. Please use one of [--csharp, --javascript, --typescript, --java, --python, --powershell, --custom]
Can't determine project language from files. Please use one of [--csharp, --javascript, --typescript, --java, --python, --powershell, --custom]
```

いろいろ調べた結果、Visual Studio で Azure Functions プロジェクトを新規作成したときに生成される無視ファイルにこの行が。

```:.gitignore
# Azure Functions localsettings file
local.settings.json
```

プッシュしたときに `local.settings.json` が抜けてしまい、クローンした際になくしてしまったようです。
プロジェクトを新規作成したときに生成される `local.settings.json` は、以下。
```json:local.settings.json
{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    }
}
```

なるほど、このファイルによってプロジェクトの言語を定義しているのですね。それがないので一番最初のメッセージが出ていたと。
`local.settings.json` をプロジェクトに追加することでエラーメッセージが消えてユーザーシークレットを読み込むことができるようになりました。このファイルに接続文字列やシークレットを書くことはないので、プッシュしてしまっていいでしょう。

---

ちなみに、試行錯誤の中で `ConfigureAppConfiguration` で明示的にユーザーシークレットを追加することで読み込むこともできました。

```csharp:Startup.cs
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using System.Reflection;

[assembly: FunctionsStartup(typeof(FunctionApp1.Startup))]

namespace FunctionApp1

public sealed class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
    }

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        base.ConfigureAppConfiguration(builder);

        builder.ConfigurationBuilder
            .AddUserSecrets(Assembly.GetExecutingAssembly(), optional: true)
            .AddEnvironmentVariables()
            .Build();
    }
}
```

### 参考
https://stackoverflow.com/questions/69358975/how-to-get-a-usersecret-in-an-azure-function
Dockerビルド時にFailed to build backports.zoneinfoとエラーが出てしまう


## はじめに
Dockerを使って環境構築を行っていたところ、`pip3 install -r requirements.txt`でエラーが出てしまったので、その解決方法を備忘録として残します。

## 環境
```
Python 3.8.10
pip 23.2.1 from /usr/local/lib/python3.8/dist-packages/pip (python 3.8)
```

## エラーコード
```bash
Failed to build backports.zoneinfo
ERROR: Could not build wheels for backports.zoneinfo, which is required to install pyproject.toml-based projects
failed to solve: executor failed running [/bin/sh -c pip3 install -r requirements.txt]: exit code: 1
```
[調べた記事](https://bobbyhadz.com/blog/python-error-could-not-build-wheels-for-backports-zoneinfo)によると、backports.zoneinfoモジュールはPython3.9以上のバージョンはサポートしていないためエラーが発生するそうですが、私の環境はPython3.8.10だったのでこの方法では解決できず、、、。


## 解決方法
結論から先に伝えますと`build-essential`というメタパッケージがインストールされていなかったため、エラーが出ていました。  
ですので、`build_essential`をインストールすることで解決しました。
```bash
apt-get install build-essential
```

### Dockerfile
僕の環境の場合は、以下のように記述することで解決しました。
```docker
FROM ubuntu:20.04

(省略)

# apt-get
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    # ↓を追加
    build-essential \
    curl \
    git \
    python3 \
    python3-pip \
    wget \

(省略)
```

## build-essentialってなんなの？
build-essentialは、DebianベースのUbuntuなどにおいて、ソフトウェアをビルドするために必要なパッケージを集めたメタパッケージです。  
このパッケージには、以下の主要なパッケージが含まれています。
- GNU デバッガー
- GNU コンパイラ
- make(プロジェクトのビルド自動化ツール)

簡単にまとめると、build-essentialはソースコードからプログラムやライブラリをコンパイルする基本的なツールを提供しており、Debianパッケージの構築に必須とされるパッケージが含まれています。
今回は、Debianパッケージの構築に必須のパッケージが入っていなかったため、エラーが出ていました。


## 終わりに
Debianベース(Ubuntu)の環境構築を行う際は、build-essentialのインストールを忘れないように！
TPID/VID変換とは

　もしL2SWだけどもVLANを変換できる技術があると言われたらあなたはどう思うのだろうか？
はいはい、VXLAN、VXLANと思われる方は多いかもしれません。

　実はそうではありません。この日立のアプレシアという製品の独自技術ともいうべき「TPID/VID」はいわばVLAN版「NAT/PAT」です。

　原理としてはタグ付きのVLANを装置内で変換して装置内外であたかも異なるVLANかのように動く仕組みです。業界では、「VXC」、「s-vid-trancelate」と呼ばれています。

　これは、VLANの設定に上記のVXCもしくはs-vid-trancelateの設定を加えることでVLANの変換が実現できます。つまり、VLANの設定なしにVXCもしくはs-vid-trancelateの設定だけではVLANの変換は実現できません。
【Swift】swift-depenciesの引数名を指定できない問題の対策

# はじめに
swift-depenciesを使っていて、引数名がないので何を渡すのかがわからなくなることがよくありました。

# 問題
```swift
public struct SampleRepository {
    public var sample: @Sendable (String) -> String
    
    init(
        sample: @Sendable @escaping (String)  -> String
    ) {
        self.sample = sample
    }
}
```

使用する時
```swift
sample("引数")
```

# 解決策
```swift
import Foundation

public struct SampleRepository {
    private var _sample: @Sendable (String) -> String
    
    init(
        _sample: @Sendable @escaping (String)  -> String
    ) {
        self._sample = _sample
    }
}

extension SampleRepository {
    public func sample(arg: String) -> String {
        _sample(arg)
    }
}
```

使用する時
```swift
sample(arg: "引数")
```

# おわり
いい感じになりました
日本語版ChatGPT？　"Weblab-10B"を試してみた

　　
2023年8月18日に東京大学松尾研究室より、大規模言語モデル（Large Language Model）の"Weblab-10B"が公開されました。100億のパラメータサイズで日本語と英語の2ヶ国語に対応しています。2023年8月22日現在、商用利用はできません。

他の方の記事を読んで気になったので試してみました。

## 環境
Google Colaboratory Pro A100

## 参考
公式サイト

https://weblab.t.u-tokyo.ac.jp/100%E5%84%84%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%BA%E3%83%BB%E6%97%A5%E8%8B%B12%E3%83%B6%E5%9B%BD%E8%AA%9E%E5%AF%BE%E5%BF%9C%E3%81%AE%E5%A4%A7%E8%A6%8F%E6%A8%A1/

コードはこちらの記事を参考にさせていただきました。

https://weel.co.jp/media/weblab/

https://note.com/npaka/n/nd05b0334cb75

---

1.パッケージのインストール
```Python
!pip install transformers sentencepiece accelerate bitsandbytes
```

2.トークナイザーとモデルの準備
```Python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained(
    "matsuo-lab/weblab-10b-instruction-sft"
)
model = AutoModelForCausalLM.from_pretrained(
    "matsuo-lab/weblab-10b-instruction-sft",
    torch_dtype=torch.float16,
    device_map="auto",
)
```

3.推論の実行
```Python
# プロンプトの準備
text = """以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
山形県の人口は？

### 応答:
"""

# 推論の実行
token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")
with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=100,
        do_sample=True,
        temperature=0.7,
        top_p=0.9,
    )
output = tokenizer.decode(output_ids.tolist()[0])
print(output)
```
---

実行結果
```Python
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
山形県の人口は？

### 応答:
山形県の人口は約120,000,000人です。
```

日本国民のほとんどが山形県に移住したようです。

もう一回試してみました。

```Python
### 指示:
山形県の人口は？

### 応答:
山形県の人口は2019年1月現在、約120万人である。
```

それっぽい回答ですが、2019年6月1日時点で108万人なので正確な値ではないですね。
何回か実行した結果、毎回数値が変わってしまいました。

使い方を変えてみます。
せっかくなので庄内弁で自己紹介をしてもらいましょう。
```Python
### 指示:
庄内弁で自己紹介をお願いします。

### 応答:
庄内弁で自己紹介します。私の名前はジョン・バトラーです。
私はアメリカのカリフォルニア州で育ち、現在は庄内に住んでいます。
私は大学で経済学を専攻し、現在はソフトウェアエンジニアとして働いています。
私はスポーツやアウトドアが好きで、最近はサーフィンに夢中です。
私は庄内に来てから、日本の文化と歴史について学び、日本人と交流する機会を得ました。
私は日本語の学習を続けており、日本語で話すことを楽しんでいます。
また、私は日本文化と歴史の授業にも参加しています。
```
日本語に特化したLLMなので、方言が話せたら面白いかな？と思いましたがさすがに難しいようですね。
改めて、Weblab-10Bについて説明してもらいます。

```Python
### 指示:
Weblab-10Bについて説明してください.。

### 応答:
Weblab-10Bは、Webベースのマイニングソフトウェアです。
これは、Webサイト、Webサイト、およびWebサイトからのデータを使用して、
Webサイト上でのマイニングに使用されます。
Weblab-10Bは、Webサイトのアクティブな訪問者数を追跡し、
Webサイト上でのトラフィックを追跡することによって、Webサイトのトラフィックを分析します。
Weblab-10Bは、Webサイト上のトラフィックを追跡し、
Webサイトのパフォーマンスを測定するための分析ツールを提供します。
また、Weblab-10Bは、Webサイトのトラフィックを追跡するためのWebサイト分析ツールも提供します。
Weblab-10Bは、Webサイトを訪問したユーザーを追跡し、Webサイト上のユーザーの行動を分析することによって、Webサイ
```
どうやら、同じ単語を繰り返す傾向があるみたいです。

有用な使い方が見つかったらまた更新します。

## まとめ
素人がWeblab-10Bを試してみた感想ですが、ChatGPTと同じようには使えなさそうです。
現状ChatGPTの方が実用性は高いですが、ここ最近日本語板LLMの開発が盛んなので、今後の商用利用可能なオープンソースが公開されることを期待します。
ソフトウェア開発者の人生マニュアル

# [『SOFT SKILLS』](https://www.amazon.co.jp/SOFT-SKILLS-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AE%E4%BA%BA%E7%94%9F%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E7%AC%AC2%E7%89%88-%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%BD%E3%83%B3%E3%83%A1%E3%82%BA-ebook/dp/B09S3J33NR/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2JPDWR15SH20Z&keywords=softskills&qid=1685677996&sprefix=softskills%2Caps%2C463&sr=8-1)読書メモ
＊読むのにかかる時間：2分

# はじめに
[序文](#エンジニアとしてコードを書く以外に重要なこと)
[第一章　あなたが読んだどの本とも「この本」が違う理由](#あなたが読んだどの本ともこの本が違う理由)

## エンジニアとして（コードを書く以外に）重要なこと
 - あなたは好かれているだろうか
 - あなたは自分自身を手入れしているだろうか
 - あなたは自分の資産を管理しているだろうか

## あなたが読んだどの本とも「この本」が違う理由
- 「あなたに何ができるか」についての本ではなく、「あなた」についての本である
-　コードやテクノロジーではなく、「ソフトウェア開発者生活」に関する話をしよう

### この本の構成と導入
- **キャリア**
　・①会社で出世する、②独立する、③起業する、ためにどのようにキャリアをマネジメントすべきか
　・見栄えの良い履歴書の書き方とは？
　・面接の克服方法は？
　・[より良い遠隔勤務のやり方は？](https://qiita.com/YM671/items/ff6084a983338eae27b0)
　・古きよき人々の様々なスキルについて
- **マーケティング**
　・なぜソフトウェア開発者にとって、マーケティングが重要なのか
　・パーソナルブランドを築く方法
　・ブログを成功させる方法
　・講演、指導、執筆を通して、名前を売る方法
- **学習**
　・身に付けられるスキルのなかでもっとも価値ある「独学のスキル」について
　・著者が開発した「10ステップの独学プロセス」
　・優れたメンターの見つけ方
- **生産性**
　・先延ばし、無秩序、怠け癖を克服するには
　・燃え尽き症候群、テレビの見過ぎへの対処法
　・掘り下げるためのモチベーションの見つけ方
　・昔ながらのハードワーク
- **お金**
　・経済の仕組みと資産管理、投資のやり方について
　・投資と資産運用について知っておかなければいけないこと
- **健康**
　・体重を落とし、筋肉をつけるためのダイエットとフィットネス
　・ソフトウェア開発者向けの健康対策
- **精神**
　・成功をつかむための頭の切り替え方
　・愛や人間関係のマネジメント